[web] more null safety in tests (flutter/engine#26674)

This commit is contained in:
Yegor 2021-06-10 09:25:09 -07:00 committed by GitHub
parent 27fe5830a5
commit e2f1b2dc45
48 changed files with 368 additions and 393 deletions

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.12
export 'navigation/history.dart';
export 'navigation/js_url_strategy.dart';
export 'navigation/url_strategy.dart';

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.12
export 'services/buffers.dart';
export 'services/message_codec.dart';
export 'services/message_codecs.dart';

View File

@ -58,7 +58,7 @@ class WebExperiments {
}
/// Used to enable/disable experimental flags in the web engine.
void updateExperiment(String name, bool enabled) {
void updateExperiment(String name, bool? enabled) {
switch (name) {
case 'useCanvasText':
useCanvasText = enabled;

View File

@ -14,7 +14,6 @@ dev_dependencies:
html: 0.15.0
http: 0.13.0
image: 3.0.1
mockito: 5.0.0
path: 1.8.0
quiver: 3.0.0
test: 1.16.6

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
import 'package:test/bootstrap/browser.dart';
import 'package:test/test.dart';
import 'package:quiver/testing/async.dart';
@ -77,13 +76,13 @@ void _alarmClockTests() {
expect(fakeAsync.nonPeriodicTimerCount, 1);
expect(callCount, 0);
alarm.datetime = alarm.datetime.add(Duration.zero);
alarm.datetime = alarm.datetime!.add(Duration.zero);
expect(fakeAsync.nonPeriodicTimerCount, 1);
expect(callCount, 0);
fakeAsync.elapse(const Duration(seconds: 30));
alarm.datetime = alarm.datetime.add(Duration.zero);
alarm.datetime = alarm.datetime!.add(Duration.zero);
expect(fakeAsync.nonPeriodicTimerCount, 1);
expect(callCount, 0);
@ -117,7 +116,7 @@ void _alarmClockTests() {
expect(callCount, 0);
// Reschedule.
alarm.datetime = alarm.datetime.add(const Duration(minutes: 1));
alarm.datetime = alarm.datetime!.add(const Duration(minutes: 1));
fakeAsync.elapse(const Duration(minutes: 1));
@ -142,7 +141,7 @@ void _alarmClockTests() {
expect(callCount, 0);
// Reschedule to an earlier time that's still in the future.
alarm.datetime = alarm.datetime.subtract(const Duration(seconds: 15));
alarm.datetime = alarm.datetime!.subtract(const Duration(seconds: 15));
fakeAsync.elapse(const Duration(seconds: 45));
expect(callCount, 1);

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
import 'package:ui/src/engine.dart';
import 'package:ui/ui.dart' as ui;
@ -21,20 +20,20 @@ void testMain() {
});
group('EngineCanvas', () {
MockEngineCanvas mockCanvas;
ui.Paragraph paragraph;
late MockEngineCanvas mockCanvas;
late ui.Paragraph paragraph;
void testCanvas(
String description, void Function(EngineCanvas canvas) testFn,
{ui.Rect canvasSize, ui.VoidCallback whenDone}) {
canvasSize ??= const ui.Rect.fromLTWH(0, 0, 100, 100);
String description,
void Function(EngineCanvas canvas) testFn, {
ui.Rect canvasSize = const ui.Rect.fromLTWH(0, 0, 100, 100),
ui.VoidCallback? whenDone,
}) {
test(description, () {
testFn(BitmapCanvas(canvasSize, RenderStrategy()));
testFn(DomCanvas(domRenderer.createElement('flt-picture')));
testFn(mockCanvas = MockEngineCanvas());
if (whenDone != null) {
whenDone();
}
whenDone?.call();
});
}

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
import 'dart:typed_data';
import 'package:test/bootstrap/browser.dart';
@ -286,7 +285,7 @@ void _vertexModeTests() {
void _imageTests() {
test('MakeAnimatedImageFromEncoded makes a non-animated image', () {
final SkAnimatedImage nonAnimated =
canvasKit.MakeAnimatedImageFromEncoded(kTransparentImage);
canvasKit.MakeAnimatedImageFromEncoded(kTransparentImage)!;
expect(nonAnimated.getFrameCount(), 1);
expect(nonAnimated.getRepetitionCount(), 0);
expect(nonAnimated.width(), 1);
@ -311,7 +310,7 @@ void _imageTests() {
test('MakeAnimatedImageFromEncoded makes an animated image', () {
final SkAnimatedImage animated =
canvasKit.MakeAnimatedImageFromEncoded(kAnimatedGif);
canvasKit.MakeAnimatedImageFromEncoded(kAnimatedGif)!;
expect(animated.getFrameCount(), 3);
expect(animated.getRepetitionCount(), -1); // animates forever
expect(animated.width(), 1);
@ -621,7 +620,7 @@ SkPath _testClosedSkPath() {
}
void _pathTests() {
SkPath path;
late SkPath path;
setUp(() {
path = SkPath();
@ -798,7 +797,7 @@ void _pathTests() {
test('SkContourMeasureIter/SkContourMeasure', () {
final SkContourMeasureIter iter =
SkContourMeasureIter(_testClosedSkPath(), false, 1.0);
final SkContourMeasure measure1 = iter.next();
final SkContourMeasure measure1 = iter.next()!;
expect(measure1.length(), 40);
expect(measure1.getPosTan(5), Float32List.fromList(<double>[15, 10, 1, 0]));
expect(
@ -829,7 +828,7 @@ void _pathTests() {
final SkPath segment = measure1.getSegment(5, 15, true);
expect(fromSkRect(segment.getBounds()), ui.Rect.fromLTRB(15, 10, 20, 15));
final SkContourMeasure measure2 = iter.next();
final SkContourMeasure? measure2 = iter.next();
expect(measure2, isNull);
});
@ -867,8 +866,8 @@ void _skVerticesTests() {
}
void _canvasTests() {
SkPictureRecorder recorder;
SkCanvas canvas;
late SkPictureRecorder recorder;
late SkCanvas canvas;
setUp(() {
recorder = SkPictureRecorder();
@ -954,7 +953,7 @@ void _canvasTests() {
test('drawAtlas', () {
final SkAnimatedImage image =
canvasKit.MakeAnimatedImageFromEncoded(kTransparentImage);
canvasKit.MakeAnimatedImageFromEncoded(kTransparentImage)!;
canvas.drawAtlas(
image.makeImageAtCurrentFrame(),
Float32List.fromList([0, 0, 1, 1]),
@ -983,7 +982,7 @@ void _canvasTests() {
test('drawImageOptions', () {
final SkAnimatedImage image =
canvasKit.MakeAnimatedImageFromEncoded(kTransparentImage);
canvasKit.MakeAnimatedImageFromEncoded(kTransparentImage)!;
canvas.drawImageOptions(
image.makeImageAtCurrentFrame(),
10,
@ -996,7 +995,7 @@ void _canvasTests() {
test('drawImageCubic', () {
final SkAnimatedImage image =
canvasKit.MakeAnimatedImageFromEncoded(kTransparentImage);
canvasKit.MakeAnimatedImageFromEncoded(kTransparentImage)!;
canvas.drawImageCubic(
image.makeImageAtCurrentFrame(),
10,
@ -1009,7 +1008,7 @@ void _canvasTests() {
test('drawImageRectOptions', () {
final SkAnimatedImage image =
canvasKit.MakeAnimatedImageFromEncoded(kTransparentImage);
canvasKit.MakeAnimatedImageFromEncoded(kTransparentImage)!;
canvas.drawImageRectOptions(
image.makeImageAtCurrentFrame(),
Float32List.fromList([0, 0, 1, 1]),
@ -1022,7 +1021,7 @@ void _canvasTests() {
test('drawImageRectCubic', () {
final SkAnimatedImage image =
canvasKit.MakeAnimatedImageFromEncoded(kTransparentImage);
canvasKit.MakeAnimatedImageFromEncoded(kTransparentImage)!;
canvas.drawImageRectCubic(
image.makeImageAtCurrentFrame(),
Float32List.fromList([0, 0, 1, 1]),
@ -1035,7 +1034,7 @@ void _canvasTests() {
test('drawImageNine', () {
final SkAnimatedImage image =
canvasKit.MakeAnimatedImageFromEncoded(kTransparentImage);
canvasKit.MakeAnimatedImageFromEncoded(kTransparentImage)!;
canvas.drawImageNine(
image.makeImageAtCurrentFrame(),
Float32List.fromList([0, 0, 1, 1]),
@ -1190,7 +1189,7 @@ void _canvasTests() {
);
final CkPicture picture =
CkPicture(otherRecorder.finishRecordingAsPicture(), null, null);
final CkImage image = await picture.toImage(1, 1);
final CkImage image = (await picture.toImage(1, 1)) as CkImage;
final ByteData rawData =
await image.toByteData(format: ui.ImageByteFormat.rawRgba);
expect(rawData.lengthInBytes, greaterThan(0));

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
import 'dart:typed_data';
import 'package:test/bootstrap/browser.dart';
import 'package:test/test.dart';
@ -84,7 +83,7 @@ void testMain() {
paint.imageFilter = CkImageFilter.blur(sigmaX: 5, sigmaY: 10, tileMode: ui.TileMode.clamp);
final ManagedSkiaObject managedFilter = paint.imageFilter as ManagedSkiaObject;
final Object skiaFilter = managedFilter?.skiaObject;
final Object skiaFilter = managedFilter.skiaObject;
paint.imageFilter = CkImageFilter.blur(sigmaX: 5, sigmaY: 10, tileMode: ui.TileMode.clamp);
expect((paint.imageFilter as ManagedSkiaObject).skiaObject, same(skiaFilter));

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
import 'package:test/bootstrap/browser.dart';
import 'package:test/test.dart';

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
import 'package:test/bootstrap/browser.dart';
import 'package:test/test.dart';
@ -33,11 +32,11 @@ void testMain() {
expect(metric.contourIndex, 0);
expect(metric.extractPath(0, 0.5).computeMetrics().length, 1);
final ui.Tangent tangent1 = metric.getTangentForOffset(5);
final ui.Tangent tangent1 = metric.getTangentForOffset(5)!;
expect(tangent1.position, ui.Offset(5, 0));
expect(tangent1.vector, ui.Offset(1, 0));
final ui.Tangent tangent2 = metric.getTangentForOffset(15);
final ui.Tangent tangent2 = metric.getTangentForOffset(15)!;
expect(tangent2.position, ui.Offset(10, 5));
expect(tangent2.vector, ui.Offset(0, 1));
@ -105,7 +104,7 @@ void testMain() {
path.addRect(ui.Rect.fromLTRB(40, 40, 50, 50));
final ui.PathMetrics metrics = path.computeMetrics();
final CkContourMeasureIter iterator = metrics.iterator;
final CkContourMeasureIter iterator = metrics.iterator as CkContourMeasureIter;
expect(iterator.moveNext(), true);
expect(iterator.current.contourIndex, 0);
@ -131,15 +130,15 @@ void testMain() {
path.addRect(ui.Rect.fromLTRB(40, 40, 50, 50));
final ui.PathMetrics metrics = path.computeMetrics();
final CkContourMeasureIter iterator = metrics.iterator;
final CkContourMeasureIter iterator = metrics.iterator as CkContourMeasureIter;
expect(iterator.moveNext(), true);
final CkContourMeasure measure0 = iterator.current;
final CkContourMeasure measure0 = iterator.current as CkContourMeasure;
expect(measure0.contourIndex, 0);
expect(measure0.extractPath(0, 15).getBounds(), ui.Rect.fromLTRB(0, 0, 10, 5));
expect(iterator.moveNext(), true);
final CkContourMeasure measure1 = iterator.current;
final CkContourMeasure measure1 = iterator.current as CkContourMeasure;
expect(measure1.contourIndex, 1);
expect(measure1.extractPath(0, 15).getBounds(), ui.Rect.fromLTRB(20, 20, 30, 25));

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
import 'package:test/bootstrap/browser.dart';
import 'package:test/test.dart';

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
import 'dart:typed_data';
import 'package:test/bootstrap/browser.dart';
@ -25,7 +24,7 @@ void testMain() {
final CkGradientSweep gradient = ui.Gradient.sweep(
ui.Offset.zero,
testColors,
);
) as CkGradientSweep;
expect(gradient.createDefault(), isNotNull);
});
@ -34,7 +33,7 @@ void testMain() {
ui.Offset.zero,
const ui.Offset(0, 1),
testColors,
);
) as CkGradientLinear;
expect(gradient.createDefault(), isNotNull);
});
@ -43,7 +42,7 @@ void testMain() {
ui.Offset.zero,
10,
testColors,
);
) as CkGradientRadial;
expect(gradient.createDefault(), isNotNull);
});
@ -57,19 +56,19 @@ void testMain() {
null,
const ui.Offset(10, 10),
40,
);
) as CkGradientConical;
expect(gradient.createDefault(), isNotNull);
});
test('Image shader', () {
final SkImage skImage = canvasKit.MakeAnimatedImageFromEncoded(kTransparentImage).makeImageAtCurrentFrame();
final SkImage skImage = canvasKit.MakeAnimatedImageFromEncoded(kTransparentImage)!.makeImageAtCurrentFrame();
final CkImage image = CkImage(skImage);
final CkImageShader imageShader = ui.ImageShader(
image,
ui.TileMode.clamp,
ui.TileMode.repeated,
Float64List.fromList(Matrix4.diagonal3Values(1, 2, 3).storage),
);
) as CkImageShader;
expect(imageShader, isA<CkImageShader>());
});
// TODO: https://github.com/flutter/flutter/issues/60040

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
import 'package:test/bootstrap/browser.dart';
import 'package:test/test.dart';
@ -17,7 +16,7 @@ void main() {
void testMain() {
group('$SkiaFontCollection', () {
List<String> warnings = <String>[];
void Function(String) oldPrintWarning;
late void Function(String) oldPrintWarning;
setUpAll(() async {
await initializeCanvasKit();

View File

@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.12
import 'package:test/bootstrap/browser.dart';
import 'package:test/test.dart';

View File

@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
// This is identical to
// ../../../testing/dart/channel_buffers_test.dart except for:
//
@ -40,16 +38,16 @@ void testMain() {
final ByteData data = _makeByteData('bar');
final ui.ChannelBuffers buffers = ui.ChannelBuffers();
bool called = false;
final ui.PlatformMessageResponseCallback callback = (ByteData responseData) {
final ui.PlatformMessageResponseCallback callback = (ByteData? responseData) {
called = true;
};
buffers.push(channel, data, callback);
await buffers.drain(channel, (ByteData drainedData, ui.PlatformMessageResponseCallback drainedCallback) {
await buffers.drain(channel, (ByteData? drainedData, ui.PlatformMessageResponseCallback drainedCallback) {
expect(drainedData, equals(data));
assert(!called);
drainedCallback(drainedData);
assert(called);
return;
return Future<void>.value();
});
});
@ -57,13 +55,13 @@ void testMain() {
const String channel = 'foo';
final ByteData data = _makeByteData('message');
final ui.ChannelBuffers buffers = ui.ChannelBuffers();
final ui.PlatformMessageResponseCallback callback = (ByteData responseData) {};
final ui.PlatformMessageResponseCallback callback = (ByteData? responseData) {};
buffers.push(channel, data, callback);
final List<String> log = <String>[];
final Completer<void> completer = Completer<void>();
scheduleMicrotask(() { log.add('before drain, microtask'); });
log.add('before drain');
buffers.drain(channel, (ByteData drainedData, ui.PlatformMessageResponseCallback drainedCallback) async {
buffers.drain(channel, (ByteData? drainedData, ui.PlatformMessageResponseCallback drainedCallback) async {
log.add('callback');
completer.complete();
});
@ -84,13 +82,13 @@ void testMain() {
final ByteData data = _makeByteData('bar');
final
ui.ChannelBuffers buffers = ui.ChannelBuffers();
final ui.PlatformMessageResponseCallback callback = (ByteData responseData) {};
final ui.PlatformMessageResponseCallback callback = (ByteData? responseData) {};
_resize(buffers, channel, 0);
buffers.push(channel, data, callback);
bool didCall = false;
await buffers.drain(channel, (ByteData drainedData, ui.PlatformMessageResponseCallback drainedCallback) {
await buffers.drain(channel, (ByteData? drainedData, ui.PlatformMessageResponseCallback drainedCallback) {
didCall = true;
return;
return Future<void>.value();
});
expect(didCall, equals(false));
});
@ -99,9 +97,9 @@ void testMain() {
const String channel = 'foo';
final ui.ChannelBuffers buffers = ui.ChannelBuffers();
bool didCall = false;
await buffers.drain(channel, (ByteData drainedData, ui.PlatformMessageResponseCallback drainedCallback) {
await buffers.drain(channel, (ByteData? drainedData, ui.PlatformMessageResponseCallback drainedCallback) {
didCall = true;
return;
return Future<void>.value();
});
expect(didCall, equals(false));
});
@ -113,14 +111,14 @@ void testMain() {
final ByteData three = _makeByteData('three');
final ByteData four = _makeByteData('four');
final ui.ChannelBuffers buffers = ui.ChannelBuffers();
final ui.PlatformMessageResponseCallback callback = (ByteData responseData) {};
final ui.PlatformMessageResponseCallback callback = (ByteData? responseData) {};
_resize(buffers, channel, 3);
buffers.push(channel, one, callback);
buffers.push(channel, two, callback);
buffers.push(channel, three, callback);
buffers.push(channel, four, callback);
int counter = 0;
await buffers.drain(channel, (ByteData drainedData, ui.PlatformMessageResponseCallback drainedCallback) {
await buffers.drain(channel, (ByteData? drainedData, ui.PlatformMessageResponseCallback drainedCallback) {
switch (counter) {
case 0:
expect(drainedData, equals(two));
@ -133,7 +131,7 @@ void testMain() {
break;
}
counter += 1;
return;
return Future<void>.value();
});
expect(counter, equals(3));
});
@ -144,18 +142,18 @@ void testMain() {
final ByteData two = _makeByteData('two');
final ui.ChannelBuffers buffers = ui.ChannelBuffers();
_resize(buffers, channel, 100);
final ui.PlatformMessageResponseCallback callback = (ByteData responseData) {};
final ui.PlatformMessageResponseCallback callback = (ByteData? responseData) {};
buffers.push(channel, one, callback);
buffers.push(channel, two, callback);
_resize(buffers, channel, 1);
int counter = 0;
await buffers.drain(channel, (ByteData drainedData, ui.PlatformMessageResponseCallback drainedCallback) {
await buffers.drain(channel, (ByteData? drainedData, ui.PlatformMessageResponseCallback drainedCallback) {
switch (counter) {
case 0:
expect(drainedData, equals(two));
}
counter += 1;
return;
return Future<void>.value();
});
expect(counter, equals(1));
});
@ -166,11 +164,11 @@ void testMain() {
final ByteData two = _makeByteData('two');
final ui.ChannelBuffers buffers = ui.ChannelBuffers();
bool didCallCallback = false;
final ui.PlatformMessageResponseCallback oneCallback = (ByteData responseData) {
final ui.PlatformMessageResponseCallback oneCallback = (ByteData? responseData) {
expect(responseData, isNull);
didCallCallback = true;
};
final ui.PlatformMessageResponseCallback twoCallback = (ByteData responseData) {
final ui.PlatformMessageResponseCallback twoCallback = (ByteData? responseData) {
throw TestFailure('wrong callback called');
};
_resize(buffers, channel, 100);
@ -187,11 +185,11 @@ void testMain() {
final ByteData two = _makeByteData('two');
final ui.ChannelBuffers buffers = ui.ChannelBuffers();
bool didCallCallback = false;
final ui.PlatformMessageResponseCallback oneCallback = (ByteData responseData) {
final ui.PlatformMessageResponseCallback oneCallback = (ByteData? responseData) {
expect(responseData, isNull);
didCallCallback = true;
};
final ui.PlatformMessageResponseCallback twoCallback = (ByteData responseData) {
final ui.PlatformMessageResponseCallback twoCallback = (ByteData? responseData) {
throw TestFailure('wrong callback called');
};
_resize(buffers, channel, 1);
@ -222,37 +220,37 @@ void testMain() {
final ByteData five = _makeByteData('five');
final ByteData six = _makeByteData('six');
final ByteData seven = _makeByteData('seven');
buffers.push('a', one, (ByteData data) { });
buffers.push('b', two, (ByteData data) { });
buffers.push('a', three, (ByteData data) { });
buffers.push('a', one, (ByteData? data) { });
buffers.push('b', two, (ByteData? data) { });
buffers.push('a', three, (ByteData? data) { });
log.add('top');
buffers.setListener('a', (ByteData data, ui.PlatformMessageResponseCallback callback) {
log.add('a1: ${utf8.decode(data.buffer.asUint8List())}');
buffers.setListener('a', (ByteData? data, ui.PlatformMessageResponseCallback callback) {
log.add('a1: ${utf8.decode(data!.buffer.asUint8List())}');
});
log.add('-1');
await null;
log.add('-2');
buffers.setListener('a', (ByteData data, ui.PlatformMessageResponseCallback callback) {
log.add('a2: ${utf8.decode(data.buffer.asUint8List())}');
buffers.setListener('a', (ByteData? data, ui.PlatformMessageResponseCallback callback) {
log.add('a2: ${utf8.decode(data!.buffer.asUint8List())}');
});
log.add('-3');
await null;
log.add('-4');
buffers.setListener('b', (ByteData data, ui.PlatformMessageResponseCallback callback) {
log.add('b: ${utf8.decode(data.buffer.asUint8List())}');
buffers.setListener('b', (ByteData? data, ui.PlatformMessageResponseCallback callback) {
log.add('b: ${utf8.decode(data!.buffer.asUint8List())}');
});
log.add('-5');
await null; // first microtask after setting listener drains the first message
await null; // second microtask ends the draining.
log.add('-6');
buffers.push('b', four, (ByteData data) { });
buffers.push('a', five, (ByteData data) { });
buffers.push('b', four, (ByteData? data) { });
buffers.push('a', five, (ByteData? data) { });
log.add('-7');
await null;
log.add('-8');
buffers.clearListener('a');
buffers.push('a', six, (ByteData data) { });
buffers.push('b', seven, (ByteData data) { });
buffers.push('a', six, (ByteData? data) { });
buffers.push('b', seven, (ByteData? data) { });
await null;
log.add('-9');
expect(log, <String>[
@ -282,24 +280,24 @@ void testMain() {
final ByteData three = _makeByteData('three');
final ByteData four = _makeByteData('four');
buffers.handleMessage(_makeByteData('resize\ra\r10'));
buffers.push('a', one, (ByteData data) { });
buffers.push('a', two, (ByteData data) { });
buffers.push('a', three, (ByteData data) { });
buffers.push('a', one, (ByteData? data) { });
buffers.push('a', two, (ByteData? data) { });
buffers.push('a', three, (ByteData? data) { });
log.add('-1');
buffers.setListener('a', (ByteData data, ui.PlatformMessageResponseCallback callback) {
log.add('a1: ${utf8.decode(data.buffer.asUint8List())}');
buffers.setListener('a', (ByteData? data, ui.PlatformMessageResponseCallback callback) {
log.add('a1: ${utf8.decode(data!.buffer.asUint8List())}');
});
await null; // handles one
log.add('-2');
buffers.clearListener('a');
await null;
log.add('-3');
buffers.setListener('a', (ByteData data, ui.PlatformMessageResponseCallback callback) {
log.add('a2: ${utf8.decode(data.buffer.asUint8List())}');
buffers.setListener('a', (ByteData? data, ui.PlatformMessageResponseCallback callback) {
log.add('a2: ${utf8.decode(data!.buffer.asUint8List())}');
});
log.add('-4');
await null;
buffers.push('a', four, (ByteData data) { });
buffers.push('a', four, (ByteData? data) { });
log.add('-5');
await null;
log.add('-6');
@ -348,14 +346,14 @@ void testMain() {
final Zone zone2 = Zone.current.fork();
zone1.run(() {
log.add('first zone run: ${Zone.current == zone1}');
buffers.setListener('a', (ByteData data, ui.PlatformMessageResponseCallback callback) {
buffers.setListener('a', (ByteData? data, ui.PlatformMessageResponseCallback callback) {
log.add('callback1: ${Zone.current == zone1}');
callback(data);
});
});
zone2.run(() {
log.add('second zone run: ${Zone.current == zone2}');
buffers.push('a', ByteData.sublistView(Uint8List.fromList(<int>[]), 0, 0), (ByteData data) {
buffers.push('a', ByteData.sublistView(Uint8List.fromList(<int>[]), 0, 0), (ByteData? data) {
log.add('callback2: ${Zone.current == zone2}');
});
});

View File

@ -2,11 +2,9 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
import 'dart:async';
import 'dart:typed_data';
import 'package:mockito/mockito.dart';
import 'package:test/bootstrap/browser.dart';
import 'package:test/test.dart';
import 'package:ui/ui.dart' as ui;
@ -21,14 +19,10 @@ void testMain() async {
group('message handler', () {
const String testText = 'test text';
final Future<bool> success = Future.value(true);
final Future<bool> failure = Future.value(false);
final Future<String> pasteTest = Future.value(testText);
ClipboardMessageHandler clipboardMessageHandler;
ClipboardAPICopyStrategy clipboardAPICopyStrategy =
late ClipboardMessageHandler clipboardMessageHandler;
MockClipboardAPICopyStrategy clipboardAPICopyStrategy =
MockClipboardAPICopyStrategy();
ClipboardAPIPasteStrategy clipboardAPIPasteStrategy =
MockClipboardAPIPasteStrategy clipboardAPIPasteStrategy =
MockClipboardAPIPasteStrategy();
setUp(() {
@ -42,62 +36,73 @@ void testMain() async {
});
test('set data successful', () async {
when(clipboardAPICopyStrategy.setData(testText))
.thenAnswer((_) => success);
clipboardAPICopyStrategy.testResult = true;
const MethodCodec codec = JSONMethodCodec();
bool result = false;
ui.PlatformMessageResponseCallback callback = (ByteData data) {
result = codec.decodeEnvelope(data);
final Completer<bool> completer = Completer<bool>();
ui.PlatformMessageResponseCallback callback = (ByteData? data) {
completer.complete(codec.decodeEnvelope(data!));
};
await clipboardMessageHandler.setDataMethodCall(
clipboardMessageHandler.setDataMethodCall(
const MethodCall('Clipboard.setData', <String, dynamic>{
'text': testText,
}),
callback);
await expectLater(result, true);
expect(await completer.future, true);
});
test('set data error', () async {
when(clipboardAPICopyStrategy.setData(testText))
.thenAnswer((_) => failure);
clipboardAPICopyStrategy.testResult = false;
const MethodCodec codec = JSONMethodCodec();
ByteData result;
ui.PlatformMessageResponseCallback callback = (ByteData data) {
result = data;
final Completer<ByteData> completer = Completer<ByteData>();
ui.PlatformMessageResponseCallback callback = (ByteData? data) {
completer.complete(data!);
};
await clipboardMessageHandler.setDataMethodCall(
clipboardMessageHandler.setDataMethodCall(
const MethodCall('Clipboard.setData', <String, dynamic>{
'text': testText,
}),
callback);
expect(() async {
codec.decodeEnvelope(result);
}, throwsA(TypeMatcher<PlatformException>()
final ByteData result = await completer.future;
expect(
() =>codec.decodeEnvelope(result),
throwsA(TypeMatcher<PlatformException>()
.having((e) => e.code, 'code', equals('copy_fail'))));
});
test('get data successful', () async {
when(clipboardAPIPasteStrategy.getData())
.thenAnswer((_) => pasteTest);
clipboardAPIPasteStrategy.testResult = testText;
const MethodCodec codec = JSONMethodCodec();
Map<String, dynamic> result;
ui.PlatformMessageResponseCallback callback = (ByteData data) {
result = codec.decodeEnvelope(data);
final Completer<Map<String, dynamic>> completer = Completer<Map<String, dynamic>>();
ui.PlatformMessageResponseCallback callback = (ByteData? data) {
completer.complete(codec.decodeEnvelope(data!));
};
await clipboardMessageHandler.getDataMethodCall(callback);
clipboardMessageHandler.getDataMethodCall(callback);
await expectLater(result['text'], testText);
final Map<String, dynamic> result = await completer.future;
expect(result['text'], testText);
});
});
}
class MockClipboardAPICopyStrategy extends Mock
implements ClipboardAPICopyStrategy {}
class MockClipboardAPICopyStrategy implements ClipboardAPICopyStrategy {
bool testResult = true;
class MockClipboardAPIPasteStrategy extends Mock
implements ClipboardAPIPasteStrategy {}
@override
Future<bool> setData(String? text) {
return Future<bool>.value(testResult);
}
}
class MockClipboardAPIPasteStrategy implements ClipboardAPIPasteStrategy {
String testResult = '';
@override
Future<String> getData() {
return Future<String>.value(testResult);
}
}

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
import 'package:ui/ui.dart';
import 'package:test/bootstrap/browser.dart';
@ -33,23 +32,15 @@ void testMain() {
});
test('color created with out of bounds value', () {
try {
const Color c = Color(0x100 << 24);
final Paint p = Paint();
p.color = c;
} catch (e) {
expect(e != null, equals(true));
}
const Color c = Color(0x100 << 24);
final Paint p = Paint();
p.color = c;
});
test('color created with wildly out of bounds value', () {
try {
const Color c = Color(1 << 1000000);
final Paint p = Paint();
p.color = c;
} catch (e) {
expect(e != null, equals(true));
}
const Color c = Color(1 << 1000000);
final Paint p = Paint();
p.color = c;
});
test('two colors are only == if they have the same runtime type', () {

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
import 'dart:html' as html;
import 'package:test/bootstrap/browser.dart';
@ -16,8 +15,8 @@ void main() {
void testMain() {
test('populates flt-renderer and flt-build-mode', () {
DomRenderer();
expect(html.document.body.attributes['flt-renderer'], 'html (requested explicitly)');
expect(html.document.body.attributes['flt-build-mode'], 'debug');
expect(html.document.body!.attributes['flt-renderer'], 'html (requested explicitly)');
expect(html.document.body!.attributes['flt-build-mode'], 'debug');
});
test('creating elements works', () {
final DomRenderer renderer = DomRenderer();
@ -90,8 +89,8 @@ void testMain() {
test('innerHeight/innerWidth are equal to visualViewport height and width',
() {
if (html.window.visualViewport != null) {
expect(html.window.visualViewport.width, html.window.innerWidth);
expect(html.window.visualViewport.height, html.window.innerHeight);
expect(html.window.visualViewport!.width, html.window.innerWidth);
expect(html.window.visualViewport!.height, html.window.innerHeight);
}
});
@ -99,7 +98,7 @@ void testMain() {
final html.MetaElement existingMeta = html.MetaElement()
..name = 'viewport'
..content = 'foo=bar';
html.document.head.append(existingMeta);
html.document.head!.append(existingMeta);
expect(existingMeta.isConnected, true);
final DomRenderer renderer = DomRenderer();

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
import 'package:ui/src/engine.dart';
import 'package:test/bootstrap/browser.dart';
import 'package:test/test.dart';
@ -16,7 +15,7 @@ void testMain() {
test('Reuse returns no object when cache empty', () {
final CrossFrameCache<TestItem> cache = CrossFrameCache();
cache.commitFrame();
TestItem requestedItem = cache.reuse('item1');
TestItem? requestedItem = cache.reuse('item1');
expect(requestedItem, null);
});
@ -25,7 +24,7 @@ void testMain() {
final TestItem testItem1 = TestItem('item1');
cache.cache(testItem1.label, testItem1);
cache.commitFrame();
TestItem requestedItem = cache.reuse('item1');
TestItem? requestedItem = cache.reuse('item1');
expect(requestedItem, testItem1);
requestedItem = cache.reuse('item1');
expect(requestedItem, null);
@ -40,7 +39,7 @@ void testMain() {
cache.cache(testItemX.label, testItemX);
cache.cache(testItem2.label, testItem2);
cache.commitFrame();
TestItem requestedItem = cache.reuse('sameLabel');
TestItem? requestedItem = cache.reuse('sameLabel');
expect(requestedItem, testItem1);
requestedItem = cache.reuse('sameLabel');
expect(requestedItem, testItem2);
@ -54,7 +53,7 @@ void testMain() {
cache.cache(testItem1.label, testItem1);
cache.commitFrame();
cache.commitFrame();
TestItem requestedItem = cache.reuse('item1');
TestItem? requestedItem = cache.reuse('item1');
expect(requestedItem, null);
});

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
import 'dart:async';
import 'dart:typed_data';
@ -10,8 +9,6 @@ import 'package:test/bootstrap/browser.dart';
import 'package:test/test.dart';
import 'package:ui/src/engine.dart' as engine;
engine.TestUrlStrategy _strategy;
const engine.MethodCodec codec = engine.JSONMethodCodec();
void emptyCallback(ByteData date) {}
@ -21,6 +18,8 @@ void main() {
}
void testMain() {
engine.TestUrlStrategy? _strategy;
setUp(() async {
_strategy = engine.TestUrlStrategy();
await engine.window.debugInitializeHistory(_strategy, useSingle: true);
@ -42,6 +41,6 @@ void testMain() {
(_) => completer.complete(),
);
await completer.future;
expect(_strategy.getPath(), '/foo');
expect(_strategy!.getPath(), '/foo');
});
}

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
import 'dart:html' as html;
import 'dart:js' as js;
import 'dart:js_util' as js_util;

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.12
import 'dart:html' as html;
import 'package:test/bootstrap/browser.dart';

View File

@ -9,7 +9,6 @@ import 'dart:async';
import 'dart:html' as html;
import 'dart:typed_data';
import 'package:mockito/mockito.dart';
import 'package:quiver/testing/async.dart';
import 'package:test/bootstrap/browser.dart';
import 'package:test/test.dart';
@ -239,21 +238,48 @@ void _testEngineSemanticsOwner() {
semantics().receiveGlobalEvent(pointerEvent);
// Verify the interactions.
verify(mockSemanticsEnabler.shouldEnableSemantics(pointerEvent));
expect(
mockSemanticsEnabler.shouldEnableSemanticsEvents,
[pointerEvent],
);
});
test('Forward events to framewors if shouldEnableSemantics', () {
test('forwards events to framework if shouldEnableSemantics returns true', () {
final MockSemanticsEnabler mockSemanticsEnabler = MockSemanticsEnabler();
semantics().semanticsHelper.semanticsEnabler = mockSemanticsEnabler;
final html.Event pointerEvent = html.Event('pointermove');
when(mockSemanticsEnabler.shouldEnableSemantics(pointerEvent))
.thenReturn(true);
mockSemanticsEnabler.shouldEnableSemanticsReturnValue = true;
expect(semantics().receiveGlobalEvent(pointerEvent), isTrue);
});
}
class MockSemanticsEnabler extends Mock implements SemanticsEnabler {}
class MockSemanticsEnabler implements SemanticsEnabler {
@override
void dispose() {
}
@override
bool get isWaitingToEnableSemantics => throw UnimplementedError();
@override
html.Element prepareAccessibilityPlaceholder() {
throw UnimplementedError();
}
bool shouldEnableSemanticsReturnValue = false;
final List<html.Event> shouldEnableSemanticsEvents = <html.Event>[];
@override
bool shouldEnableSemantics(html.Event event) {
shouldEnableSemanticsEvents.add(event);
return shouldEnableSemanticsReturnValue;
}
@override
bool tryEnableSemantics(html.Event event) {
throw UnimplementedError();
}
}
void _testHeader() {
test('renders heading role for headers', () {

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
import 'dart:typed_data';
import 'package:test/bootstrap/browser.dart';

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
import 'dart:html' as html;
import 'dart:js_util' as js_util;
@ -23,71 +22,71 @@ void testMain() {
});
tearDown(() {
WebExperiments.instance.reset();
WebExperiments.instance!.reset();
});
test('default web experiment values', () {
expect(WebExperiments.instance.useCanvasText, _defaultUseCanvasText);
expect(WebExperiments.instance.useCanvasRichText, _defaultUseCanvasRichText);
expect(WebExperiments.instance!.useCanvasText, _defaultUseCanvasText);
expect(WebExperiments.instance!.useCanvasRichText, _defaultUseCanvasRichText);
});
test('can turn on/off web experiments', () {
WebExperiments.instance.updateExperiment('useCanvasText', true);
WebExperiments.instance.updateExperiment('useCanvasRichText', true);
expect(WebExperiments.instance.useCanvasText, true);
expect(WebExperiments.instance.useCanvasRichText, true);
WebExperiments.instance!.updateExperiment('useCanvasText', true);
WebExperiments.instance!.updateExperiment('useCanvasRichText', true);
expect(WebExperiments.instance!.useCanvasText, true);
expect(WebExperiments.instance!.useCanvasRichText, true);
WebExperiments.instance.updateExperiment('useCanvasText', false);
WebExperiments.instance.updateExperiment('useCanvasRichText', false);
expect(WebExperiments.instance.useCanvasText, false);
expect(WebExperiments.instance.useCanvasRichText, false);
WebExperiments.instance!.updateExperiment('useCanvasText', false);
WebExperiments.instance!.updateExperiment('useCanvasRichText', false);
expect(WebExperiments.instance!.useCanvasText, false);
expect(WebExperiments.instance!.useCanvasRichText, false);
WebExperiments.instance.updateExperiment('useCanvasText', null);
WebExperiments.instance.updateExperiment('useCanvasRichText', null);
WebExperiments.instance!.updateExperiment('useCanvasText', null);
WebExperiments.instance!.updateExperiment('useCanvasRichText', null);
// Goes back to default value.
expect(WebExperiments.instance.useCanvasText, _defaultUseCanvasText);
expect(WebExperiments.instance.useCanvasRichText, _defaultUseCanvasRichText);
expect(WebExperiments.instance!.useCanvasText, _defaultUseCanvasText);
expect(WebExperiments.instance!.useCanvasRichText, _defaultUseCanvasRichText);
});
test('ignores unknown experiments', () {
expect(WebExperiments.instance.useCanvasText, _defaultUseCanvasText);
expect(WebExperiments.instance.useCanvasRichText, _defaultUseCanvasRichText);
WebExperiments.instance.updateExperiment('foobarbazqux', true);
expect(WebExperiments.instance.useCanvasText, _defaultUseCanvasText);
expect(WebExperiments.instance.useCanvasRichText, _defaultUseCanvasRichText);
WebExperiments.instance.updateExperiment('foobarbazqux', false);
expect(WebExperiments.instance.useCanvasText, _defaultUseCanvasText);
expect(WebExperiments.instance.useCanvasRichText, _defaultUseCanvasRichText);
expect(WebExperiments.instance!.useCanvasText, _defaultUseCanvasText);
expect(WebExperiments.instance!.useCanvasRichText, _defaultUseCanvasRichText);
WebExperiments.instance!.updateExperiment('foobarbazqux', true);
expect(WebExperiments.instance!.useCanvasText, _defaultUseCanvasText);
expect(WebExperiments.instance!.useCanvasRichText, _defaultUseCanvasRichText);
WebExperiments.instance!.updateExperiment('foobarbazqux', false);
expect(WebExperiments.instance!.useCanvasText, _defaultUseCanvasText);
expect(WebExperiments.instance!.useCanvasRichText, _defaultUseCanvasRichText);
});
test('can reset web experiments', () {
WebExperiments.instance.updateExperiment('useCanvasText', false);
WebExperiments.instance.updateExperiment('useCanvasRichText', false);
WebExperiments.instance.reset();
expect(WebExperiments.instance.useCanvasText, _defaultUseCanvasText);
expect(WebExperiments.instance.useCanvasRichText, _defaultUseCanvasRichText);
WebExperiments.instance!.updateExperiment('useCanvasText', false);
WebExperiments.instance!.updateExperiment('useCanvasRichText', false);
WebExperiments.instance!.reset();
expect(WebExperiments.instance!.useCanvasText, _defaultUseCanvasText);
expect(WebExperiments.instance!.useCanvasRichText, _defaultUseCanvasRichText);
WebExperiments.instance.updateExperiment('useCanvasText', false);
WebExperiments.instance.updateExperiment('useCanvasRichText', false);
WebExperiments.instance.updateExperiment('foobarbazqux', true);
WebExperiments.instance.reset();
expect(WebExperiments.instance.useCanvasText, _defaultUseCanvasText);
expect(WebExperiments.instance.useCanvasRichText, _defaultUseCanvasRichText);
WebExperiments.instance!.updateExperiment('useCanvasText', false);
WebExperiments.instance!.updateExperiment('useCanvasRichText', false);
WebExperiments.instance!.updateExperiment('foobarbazqux', true);
WebExperiments.instance!.reset();
expect(WebExperiments.instance!.useCanvasText, _defaultUseCanvasText);
expect(WebExperiments.instance!.useCanvasRichText, _defaultUseCanvasRichText);
});
test('js interop also works', () {
expect(WebExperiments.instance.useCanvasText, _defaultUseCanvasText);
expect(WebExperiments.instance.useCanvasRichText, _defaultUseCanvasRichText);
expect(WebExperiments.instance!.useCanvasText, _defaultUseCanvasText);
expect(WebExperiments.instance!.useCanvasRichText, _defaultUseCanvasRichText);
expect(() => jsUpdateExperiment('useCanvasText', true), returnsNormally);
expect(() => jsUpdateExperiment('useCanvasRichText', true), returnsNormally);
expect(WebExperiments.instance.useCanvasText, true);
expect(WebExperiments.instance.useCanvasRichText, true);
expect(WebExperiments.instance!.useCanvasText, true);
expect(WebExperiments.instance!.useCanvasRichText, true);
expect(() => jsUpdateExperiment('useCanvasText', null), returnsNormally);
expect(() => jsUpdateExperiment('useCanvasRichText', null), returnsNormally);
expect(WebExperiments.instance.useCanvasText, _defaultUseCanvasText);
expect(WebExperiments.instance.useCanvasRichText, _defaultUseCanvasRichText);
expect(WebExperiments.instance!.useCanvasText, _defaultUseCanvasText);
expect(WebExperiments.instance!.useCanvasRichText, _defaultUseCanvasRichText);
});
test('js interop throws on wrong type', () {

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
import 'dart:async';
import 'package:test/test.dart';
@ -12,7 +11,7 @@ import 'package:ui/ui.dart' as ui;
///
/// See CanvasKit-specific and HTML-specific test files `frame_timings_test.dart`.
Future<void> runFrameTimingsTest() async {
List<ui.FrameTiming> timings;
List<ui.FrameTiming>? timings;
ui.window.onReportTimings = (List<ui.FrameTiming> data) {
timings = data;
};
@ -37,7 +36,7 @@ Future<void> runFrameTimingsTest() async {
ui.window.scheduleFrame();
await frameDone.future;
expect(timings, hasLength(2), reason: '100 ms passed. 2 frames pumped.');
for (final ui.FrameTiming timing in timings) {
for (final ui.FrameTiming timing in timings!) {
expect(timing.vsyncOverhead, greaterThanOrEqualTo(Duration.zero));
expect(timing.buildDuration, greaterThanOrEqualTo(Duration.zero));
expect(timing.rasterDuration, greaterThanOrEqualTo(Duration.zero));

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
import 'dart:math' as math show sqrt;
import 'dart:math' show pi;

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
import 'dart:async';
import 'package:test/bootstrap/browser.dart';
@ -31,7 +30,7 @@ void testMain() async {
final double padding = 20.0;
paragraph = rich(
ParagraphStyle(fontFamily: 'Roboto', fontSize: fontSize, ellipsis: '...'),
EngineParagraphStyle(fontFamily: 'Roboto', fontSize: fontSize, ellipsis: '...'),
(builder) {
builder.pushStyle(EngineTextStyle.only(color: blue));
builder.addText('Lorem ');
@ -43,7 +42,7 @@ void testMain() async {
offset = offset.translate(0, paragraph.height + padding);
paragraph = rich(
ParagraphStyle(fontFamily: 'Roboto', fontSize: fontSize, ellipsis: '...'),
EngineParagraphStyle(fontFamily: 'Roboto', fontSize: fontSize, ellipsis: '...'),
(builder) {
builder.pushStyle(EngineTextStyle.only(color: blue));
builder.addText('Lorem\n');
@ -57,7 +56,7 @@ void testMain() async {
offset = offset.translate(0, paragraph.height + padding);
paragraph = rich(
ParagraphStyle(fontFamily: 'Roboto', fontSize: fontSize, ellipsis: '...'),
EngineParagraphStyle(fontFamily: 'Roboto', fontSize: fontSize, ellipsis: '...'),
(builder) {
builder.pushStyle(EngineTextStyle.only(color: blue));
builder.addText('Lorem\n');
@ -87,7 +86,7 @@ void testMain() async {
offset = offset.translate(0, paragraph.height + padding);
paragraph = rich(
ParagraphStyle(fontFamily: 'Roboto', fontSize: fontSize, maxLines: 2, ellipsis: '...'),
EngineParagraphStyle(fontFamily: 'Roboto', fontSize: fontSize, maxLines: 2, ellipsis: '...'),
(builder) {
builder.pushStyle(EngineTextStyle.only(color: blue));
builder.addText('Lorem');

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
import 'dart:async';
import 'package:test/bootstrap/browser.dart';
@ -30,7 +29,7 @@ void testMain() async {
Offset offset = Offset.zero;
for (PlaceholderAlignment placeholderAlignment in PlaceholderAlignment.values) {
final CanvasParagraph paragraph = rich(
ParagraphStyle(fontFamily: 'Roboto', fontSize: 14.0),
EngineParagraphStyle(fontFamily: 'Roboto', fontSize: 14.0),
(builder) {
builder.pushStyle(TextStyle(color: black));
builder.addText('Lorem ipsum');
@ -70,7 +69,7 @@ void testMain() async {
Offset offset = Offset.zero;
for (TextAlign align in aligns) {
final CanvasParagraph paragraph = rich(
ParagraphStyle(fontFamily: 'Roboto', fontSize: 14.0, textAlign: align),
EngineParagraphStyle(fontFamily: 'Roboto', fontSize: 14.0, textAlign: align),
(builder) {
builder.pushStyle(TextStyle(color: black));
builder.addText('Lorem');
@ -104,7 +103,7 @@ void testMain() async {
Offset offset = Offset.zero;
for (TextAlign align in aligns) {
final CanvasParagraph paragraph = rich(
ParagraphStyle(fontFamily: 'Roboto', fontSize: 14.0, textAlign: align),
EngineParagraphStyle(fontFamily: 'Roboto', fontSize: 14.0, textAlign: align),
(builder) {
builder.pushStyle(TextStyle(color: black));
builder.addText('Lorem');
@ -134,7 +133,7 @@ void testMain() async {
// First paragraph with a placeholder at the beginning.
final CanvasParagraph paragraph1 = rich(
ParagraphStyle(fontFamily: 'Roboto', fontSize: 24.0, textAlign: TextAlign.center),
EngineParagraphStyle(fontFamily: 'Roboto', fontSize: 24.0, textAlign: TextAlign.center),
(builder) {
builder.addPlaceholder(80.0, 50.0, PlaceholderAlignment.baseline, baseline: TextBaseline.alphabetic);
builder.pushStyle(TextStyle(color: black));
@ -151,7 +150,7 @@ void testMain() async {
// Second paragraph with a placeholder at the end.
final CanvasParagraph paragraph2 = rich(
ParagraphStyle(fontFamily: 'Roboto', fontSize: 24.0, textAlign: TextAlign.center),
EngineParagraphStyle(fontFamily: 'Roboto', fontSize: 24.0, textAlign: TextAlign.center),
(builder) {
builder.pushStyle(TextStyle(color: black));
builder.addText('Lorem ipsum ');
@ -168,7 +167,7 @@ void testMain() async {
// Third paragraph with a placeholder alone in the second line.
final CanvasParagraph paragraph3 = rich(
ParagraphStyle(fontFamily: 'Roboto', fontSize: 24.0, textAlign: TextAlign.center),
EngineParagraphStyle(fontFamily: 'Roboto', fontSize: 24.0, textAlign: TextAlign.center),
(builder) {
builder.pushStyle(TextStyle(color: black));
builder.addText('Lorem ipsum ');
@ -191,7 +190,7 @@ void surroundParagraph(
CanvasParagraph paragraph,
) {
final Rect rect = offset & Size(paragraph.width, paragraph.height);
final SurfacePaint paint = Paint()..color = blue..style = PaintingStyle.stroke;
final SurfacePaint paint = SurfacePaint()..color = blue..style = PaintingStyle.stroke;
canvas.drawRect(rect, paint.paintData);
}
@ -201,6 +200,6 @@ void fillPlaceholder(
CanvasParagraph paragraph,
) {
final TextBox placeholderBox = paragraph.getBoxesForPlaceholders().single;
final SurfacePaint paint = Paint()..color = red;
final SurfacePaint paint = SurfacePaint()..color = red;
canvas.drawRect(placeholderBox.toRect().shift(offset), paint.paintData);
}

View File

@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
import 'package:test/bootstrap/browser.dart';
import 'package:test/test.dart';
import 'package:ui/ui.dart' hide window;
@ -25,7 +23,7 @@ void testMain() async {
final canvas = BitmapCanvas(bounds, RenderStrategy());
final CanvasParagraph paragraph = rich(
ParagraphStyle(fontFamily: 'Roboto'),
EngineParagraphStyle(fontFamily: 'Roboto'),
(builder) {
builder.pushStyle(EngineTextStyle.only(
fontSize: 32.0,

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
import 'dart:html' as html;
import 'package:test/bootstrap/browser.dart';
@ -20,7 +19,7 @@ void testMain() async {
const double screenWidth = 600.0;
const double screenHeight = 800.0;
const Rect screenRect = Rect.fromLTWH(0, 0, screenWidth, screenHeight);
final Paint testPaint = Paint()
final SurfacePaint testPaint = SurfacePaint()
..style = PaintingStyle.stroke
..strokeWidth = 2.0
..color = const Color(0xFFFF00FF);
@ -51,9 +50,9 @@ void testMain() async {
html.Element sceneElement = html.Element.tag('flt-scene');
sceneElement.append(engineCanvas.rootElement);
html.document.body.append(sceneElement);
html.document.body!.append(sceneElement);
final html.CanvasElement canvas = html.document.querySelector('canvas');
final html.CanvasElement canvas = html.document.querySelector('canvas') as html.CanvasElement;
// ! Since canvas is first element, it should have zIndex = -1 for correct
// paint order.
expect(canvas.style.zIndex , '-1');
@ -74,16 +73,16 @@ void testMain() async {
final Path path2 = Path()
..moveTo(3, 0)
..quadraticBezierTo(100, 0, 100, 100);
rc2.drawImage(_createRealTestImage(), Offset(0, 0), Paint());
rc2.drawImage(_createRealTestImage(), Offset(0, 0), SurfacePaint());
rc2.drawPath(path2, testPaint);
rc2.endRecording();
rc2.apply(engineCanvas, screenRect);
sceneElement = html.Element.tag('flt-scene');
sceneElement.append(engineCanvas.rootElement);
html.document.body.append(sceneElement);
html.document.body!.append(sceneElement);
final html.CanvasElement canvas2 = html.document.querySelector('canvas');
final html.CanvasElement canvas2 = html.document.querySelector('canvas') as html.CanvasElement;
// ZIndex should have been cleared since we have image element preceding
// canvas.
expect(canvas.style.zIndex != '-1', true);

View File

@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
import 'package:test/bootstrap/browser.dart';
import 'package:test/test.dart';
import 'package:ui/ui.dart' hide TextStyle;
@ -30,7 +28,7 @@ void testMain() async {
final RecordingCanvas rc =
RecordingCanvas(const Rect.fromLTRB(0, 0, 500, 500));
for (int blurSigma = 1; blurSigma < 10; blurSigma += 2) {
final Paint paint = Paint()
final SurfacePaint paint = SurfacePaint()
..color = Color(0xFF2fdfd2)
..maskFilter = MaskFilter.blur(BlurStyle.normal, blurSigma.toDouble());
rc.drawRect(Rect.fromLTWH(15.0, 15.0 + blurSigma * 40, 200, 20), paint);

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
import 'dart:math' as math;
import 'package:test/bootstrap/browser.dart';
@ -31,7 +30,7 @@ void testMain() async {
final RecordingCanvas rc =
RecordingCanvas(const Rect.fromLTRB(0, 0, 500, 500));
Rect shaderRect = const Rect.fromLTRB(50, 50, 300, 300);
final Paint paint = Paint()..shader = Gradient.linear(
final SurfacePaint paint = SurfacePaint()..shader = Gradient.linear(
Offset(shaderRect.left, shaderRect.top),
Offset(shaderRect.right, shaderRect.bottom),
[Color(0xFFcfdfd2), Color(0xFF042a85)]);
@ -56,7 +55,7 @@ void testMain() async {
Matrix4 post = Matrix4.identity();
post.translate(-shaderRect.left, -shaderRect.top);
matrix.multiply(post);
final Paint paint = Paint()
final SurfacePaint paint = SurfacePaint()
..shader = Gradient.linear(
Offset(shaderRect.left, shaderRect.top),
Offset(shaderRect.right, shaderRect.bottom),
@ -64,7 +63,7 @@ void testMain() async {
null,
TileMode.clamp,
matrix.toFloat64());
rc.drawRect(shaderRect, Paint()
rc.drawRect(shaderRect, SurfacePaint()
..color = Color(0xFF000000));
rc.drawOval(shaderRect, paint);
yOffset += 120;
@ -80,7 +79,7 @@ void testMain() async {
final RecordingCanvas rc =
RecordingCanvas(const Rect.fromLTRB(0, 0, 500, 500));
Rect shaderRect = const Rect.fromLTRB(50, 50, 300, 300);
final Paint paint = Paint()..shader = Gradient.linear(
final SurfacePaint paint = SurfacePaint()..shader = Gradient.linear(
Offset(shaderRect.left, shaderRect.top),
Offset(shaderRect.right, shaderRect.bottom),
[Color(0xFFcfdfd2), Color(0xFF042a85)]);
@ -98,7 +97,7 @@ void testMain() async {
double yOffset = 0;
for (double angle in angles) {
final Rect shaderRect = Rect.fromLTWH(50, 50 + yOffset, 100, 100);
final Paint paint = Paint()
final SurfacePaint paint = SurfacePaint()
..shader = Gradient.linear(
Offset(shaderRect.left, shaderRect.top),
Offset(shaderRect.left + shaderRect.width / 2, shaderRect.top),
@ -108,7 +107,7 @@ void testMain() async {
Matrix4
.rotationZ((angle / 180) * math.pi)
.toFloat64());
rc.drawRect(shaderRect, Paint()
rc.drawRect(shaderRect, SurfacePaint()
..color = Color(0xFF000000));
rc.drawOval(shaderRect, paint);
yOffset += 120;
@ -125,7 +124,7 @@ void testMain() async {
double yOffset = 0;
for (double angle in angles) {
final Rect shaderRect = Rect.fromLTWH(50, 50 + yOffset, 100, 100);
final Paint paint = Paint()
final SurfacePaint paint = SurfacePaint()
..shader = Gradient.linear(
Offset(shaderRect.left, shaderRect.top),
Offset(shaderRect.left + shaderRect.width / 2, shaderRect.top),
@ -135,7 +134,7 @@ void testMain() async {
Matrix4
.rotationZ((angle / 180) * math.pi)
.toFloat64());
rc.drawRect(shaderRect, Paint()
rc.drawRect(shaderRect, SurfacePaint()
..color = Color(0xFF000000));
rc.drawOval(shaderRect, paint);
yOffset += 120;

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
import 'dart:html' as html;
import 'package:test/bootstrap/browser.dart';
@ -37,7 +36,7 @@ void testMain() async {
final html.Element sceneElement = html.Element.tag('flt-scene');
try {
sceneElement.append(engineCanvas.rootElement);
html.document.body.append(sceneElement);
html.document.body!.append(sceneElement);
await matchGoldenFile('$fileName.png', region: region);
} finally {
// The page is reused across tests, so remove the element after taking the
@ -59,7 +58,7 @@ void testMain() async {
path.lineTo(150, 20);
PathMetric metric = path.computeMetrics().first;
Tangent t = metric.getTangentForOffset(50.0);
Tangent t = metric.getTangentForOffset(50.0)!;
expect(t.position.dx, within(from: 83.633, distance: 0.01));
expect(t.position.dy, within(from: 93.0, distance: 0.01));
expect(t.vector.dx, within(from: 0.672, distance: 0.01));
@ -75,7 +74,7 @@ void testMain() async {
path.moveTo(150, 20);
path.quadraticBezierTo(p1x, p1y, p2x, p2y);
PathMetric metric = path.computeMetrics().first;
Tangent t = metric.getTangentForOffset(50.0);
Tangent t = metric.getTangentForOffset(50.0)!;
expect(t.position.dx, within(from: 187.25, distance: 0.01));
expect(t.position.dy, within(from: 53.33, distance: 0.01));
expect(t.vector.dx, within(from: 0.82, distance: 0.01));
@ -91,7 +90,7 @@ void testMain() async {
path.moveTo(150, 20);
path.quadraticBezierTo(p0x, p0y, p1x, p1y);
PathMetric metric = path.computeMetrics().first;
Tangent t = metric.getTangentForOffset(50.0);
Tangent t = metric.getTangentForOffset(50.0)!;
expect(t.position.dx, within(from: 199.82, distance: 0.01));
expect(t.position.dy, within(from: 21.46, distance: 0.01));
expect(t.vector.dx, within(from: 0.99, distance: 0.01));
@ -103,16 +102,16 @@ void testMain() async {
final RecordingCanvas rc =
RecordingCanvas(const Rect.fromLTRB(0, 0, 500, 500));
final Paint paint = Paint()
final SurfacePaint paint = SurfacePaint()
..style = PaintingStyle.stroke
..strokeWidth = 3
..color = black12Color;
final Paint redPaint = Paint()
final SurfacePaint redPaint = SurfacePaint()
..style = PaintingStyle.stroke
..strokeWidth = 1
..color = redAccentColor;
final Path path = Path();
final SurfacePath path = SurfacePath();
path.moveTo(50, 130);
path.lineTo(150, 20);
double p1x = 240;
@ -155,11 +154,11 @@ void testMain() async {
final RecordingCanvas rc =
RecordingCanvas(const Rect.fromLTRB(0, 0, 500, 500));
final Paint paint = Paint()
final SurfacePaint paint = SurfacePaint()
..style = PaintingStyle.stroke
..strokeWidth = 3
..color = black12Color;
final Paint redPaint = Paint()
final SurfacePaint redPaint = SurfacePaint()
..style = PaintingStyle.stroke
..strokeWidth = 1
..color = redAccentColor;

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
import 'dart:html' as html;
import 'dart:math' as math;
@ -25,7 +24,7 @@ void testMain() async {
// Commit a recording canvas to a bitmap, and compare with the expected
Future<void> _checkScreenshot(RecordingCanvas rc, String fileName,
{Rect region = const Rect.fromLTWH(0, 0, 500, 500),
double maxDiffRatePercent = null}) async {
double? maxDiffRatePercent = null}) async {
final EngineCanvas engineCanvas = BitmapCanvas(screenRect,
RenderStrategy());
rc.endRecording();
@ -35,7 +34,7 @@ void testMain() async {
final html.Element sceneElement = html.Element.tag('flt-scene');
try {
sceneElement.append(engineCanvas.rootElement);
html.document.body.append(sceneElement);
html.document.body!.append(sceneElement);
await matchGoldenFile('$fileName.png', region: region, maxDiffRatePercent: maxDiffRatePercent);
} finally {
// The page is reused across tests, so remove the element after taking the
@ -59,7 +58,7 @@ void testMain() async {
path.lineTo(300, 200);
rc.drawPath(
path,
Paint()
SurfacePaint()
..style = PaintingStyle.stroke
..strokeWidth = 2.0
..color = const Color(0xFF404000));
@ -70,7 +69,7 @@ void testMain() async {
matrix4: testMatrixTranslateRotate.toFloat64());
rc.drawPath(
transformedPath,
Paint()
SurfacePaint()
..style = PaintingStyle.stroke
..strokeWidth = 2.0
..color = const Color.fromRGBO(0, 128, 255, 1.0));
@ -84,7 +83,7 @@ void testMain() async {
path.addRect(Rect.fromLTRB(50, 40, 300, 100));
rc.drawPath(
path,
Paint()
SurfacePaint()
..style = PaintingStyle.stroke
..strokeWidth = 2.0
..color = const Color(0xFF404000));
@ -95,7 +94,7 @@ void testMain() async {
matrix4: testMatrixTranslateRotate.toFloat64());
rc.drawPath(
transformedPath,
Paint()
SurfacePaint()
..style = PaintingStyle.stroke
..strokeWidth = 2.0
..color = const Color.fromRGBO(0, 128, 255, 1.0));
@ -110,7 +109,7 @@ void testMain() async {
path.quadraticBezierTo(100, 300, 400, 300);
rc.drawPath(
path,
Paint()
SurfacePaint()
..style = PaintingStyle.stroke
..strokeWidth = 2.0
..color = const Color(0xFF404000));
@ -121,7 +120,7 @@ void testMain() async {
matrix4: testMatrixTranslateRotate.toFloat64());
rc.drawPath(
transformedPath,
Paint()
SurfacePaint()
..style = PaintingStyle.stroke
..strokeWidth = 2.0
..color = const Color.fromRGBO(0, 128, 255, 1.0));
@ -147,7 +146,7 @@ void testMain() async {
rc.drawPath(
path,
Paint()
SurfacePaint()
..style = PaintingStyle.stroke
..strokeWidth = 2.0
..color = const Color(0xFF404000));
@ -158,7 +157,7 @@ void testMain() async {
matrix4: testMatrixTranslateRotate.toFloat64());
rc.drawPath(
transformedPath,
Paint()
SurfacePaint()
..style = PaintingStyle.stroke
..strokeWidth = 2.0
..color = const Color.fromRGBO(0, 128, 255, 1.0));
@ -180,7 +179,7 @@ void testMain() async {
rc.drawPath(
path,
Paint()
SurfacePaint()
..style = PaintingStyle.stroke
..strokeWidth = 2.0
..color = const Color(0xFF404000));
@ -192,7 +191,7 @@ void testMain() async {
matrix4: testMatrixTranslateRotate.toFloat64());
rc.drawPath(
transformedPath,
Paint()
SurfacePaint()
..style = PaintingStyle.stroke
..strokeWidth = 2.0
..color = const Color.fromRGBO(0, 128, 255, 1.0));
@ -209,7 +208,7 @@ void testMain() async {
rc.drawPath(
path,
Paint()
SurfacePaint()
..style = PaintingStyle.stroke
..strokeWidth = 2.0
..color = const Color(0xFF404000));
@ -221,7 +220,7 @@ void testMain() async {
matrix4: testMatrixTranslateRotate.toFloat64());
rc.drawPath(
transformedPath,
Paint()
SurfacePaint()
..style = PaintingStyle.stroke
..strokeWidth = 2.0
..color = const Color.fromRGBO(0, 128, 255, 1.0));

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
import 'dart:html' as html;
import 'package:test/bootstrap/browser.dart';
@ -19,18 +18,18 @@ void main() {
void testMain() {
group('Picture', () {
test('toImage produces an image', () async {
final EnginePictureRecorder recorder = ui.PictureRecorder();
final EnginePictureRecorder recorder = EnginePictureRecorder();
final RecordingCanvas canvas = recorder.beginRecording(ui.Rect.fromLTRB(0, 0, 200, 100));
canvas.drawCircle(
const ui.Offset(100, 50),
40,
ui.Paint()
SurfacePaint()
..color = ui.Color.fromARGB(255, 255, 100, 100),
);
final ui.Picture picture = recorder.endRecording();
final HtmlImage image = await picture.toImage(200, 100);
final HtmlImage image = (await picture.toImage(200, 100)) as HtmlImage;
expect(image, isNotNull);
html.document.body
html.document.body!
..style.margin = '0'
..append(image.imgElement);
try {

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
import 'package:test/bootstrap/browser.dart';
import 'package:test/test.dart';
import 'package:ui/ui.dart' hide TextStyle;
@ -29,7 +28,7 @@ void testMain() async {
double maxDiffRatePercent = 0,
Rect region = const Rect.fromLTWH(0, 0, 500, 500)}) async {
final RecordingCanvas rc = RecordingCanvas(region);
final Paint paint = Paint()..shader = shader;
final SurfacePaint paint = SurfacePaint()..shader = shader;
final Path path = Path();
path.addRect(paintRect);
rc.drawPath(path, paint);

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
import 'dart:html' as html;
import 'package:test/bootstrap/browser.dart';
@ -97,26 +96,26 @@ void testMain() async {
Picture _drawTestPictureWithCircles(
Rect region, double offsetX, double offsetY) {
final EnginePictureRecorder recorder = PictureRecorder();
final EnginePictureRecorder recorder = EnginePictureRecorder();
final RecordingCanvas canvas = recorder.beginRecording(region);
canvas.drawCircle(Offset(offsetX + 30, offsetY + 30), 30,
Paint()..style = PaintingStyle.fill);
SurfacePaint()..style = PaintingStyle.fill);
canvas.drawCircle(
Offset(offsetX + 110, offsetY + 30),
30,
Paint()
SurfacePaint()
..style = PaintingStyle.fill
..color = const Color(0xFFFF0000));
canvas.drawCircle(
Offset(offsetX + 30, offsetY + 110),
30,
Paint()
SurfacePaint()
..style = PaintingStyle.fill
..color = const Color(0xFF00FF00));
canvas.drawCircle(
Offset(offsetX + 110, offsetY + 110),
30,
Paint()
SurfacePaint()
..style = PaintingStyle.fill
..color = const Color(0xFF0000FF));
return recorder.endRecording();
@ -148,5 +147,5 @@ void _renderScene(BlendMode blendMode) {
builder.addPicture(Offset.zero, circles2);
builder.pop();
html.document.body.append(builder.build().webOnlyRootElement);
html.document.body!.append(builder.build().webOnlyRootElement!);
}

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
import 'package:test/bootstrap/browser.dart';
import 'package:ui/src/engine.dart';
import 'package:ui/ui.dart';
@ -94,8 +93,8 @@ const Size placeholderSize = Size(80.0, 50.0);
void _paintTextWithPlaceholder(
RecordingCanvas canvas,
Offset offset, {
String before,
String after,
required String before,
required String after,
PlaceholderAlignment placeholderAlignment = PlaceholderAlignment.baseline,
TextAlign textAlignment = TextAlign.left,
}) {
@ -112,7 +111,7 @@ void _paintTextWithPlaceholder(
final TextBox placeholderBox = paragraph.getBoxesForPlaceholders().single;
canvas.drawRect(
placeholderBox.toRect().shift(offset),
Paint()..color = red,
SurfacePaint()..color = red,
);
}

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
import 'package:test/bootstrap/browser.dart';
import 'package:test/test.dart';
@ -17,7 +16,7 @@ void testMain() {
expect(
Gradient.radial(
Offset.zero,
null,
5.0,
<Color>[const Color(0xFFFFFFFF), const Color(0xFFFFFFFF)],
<double>[0.0, 1.0],
TileMode.mirror),

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
import 'package:test/bootstrap/browser.dart';
import 'package:test/test.dart';
import 'package:ui/ui.dart';

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
import 'dart:html' as html;
import 'dart:js_util' as js_util;
import 'dart:typed_data';
@ -20,7 +19,7 @@ void main() {
void testMain() {
group('Keyboard', () {
/// Used to save and restore [ui.window.onPlatformMessage] after each test.
ui.PlatformMessageCallback savedCallback;
ui.PlatformMessageCallback? savedCallback;
setUp(() {
savedCallback = ui.window.onPlatformMessage;
@ -34,17 +33,17 @@ void testMain() {
expect(Keyboard.instance, isNull);
Keyboard.initialize();
expect(Keyboard.instance, isA<Keyboard>());
Keyboard.instance.dispose();
Keyboard.instance!.dispose();
expect(Keyboard.instance, isNull);
});
test('dispatches keyup to flutter/keyevent channel', () {
Keyboard.initialize();
String channelReceived;
Map<String, dynamic> dataReceived;
ui.window.onPlatformMessage = (String channel, ByteData data,
ui.PlatformMessageResponseCallback callback) {
String? channelReceived;
Map<String, dynamic>? dataReceived;
ui.window.onPlatformMessage = (String channel, ByteData? data,
ui.PlatformMessageResponseCallback? callback) {
channelReceived = channel;
dataReceived = const JSONMessageCodec().decodeMessage(data);
};
@ -63,7 +62,7 @@ void testMain() {
'metaState': 0x0,
});
Keyboard.instance.dispose();
Keyboard.instance!.dispose();
},
// TODO(nurhan): https://github.com/flutter/flutter/issues/50815
skip: browserEngine == BrowserEngine.edge);
@ -71,10 +70,10 @@ void testMain() {
test('dispatches keydown to flutter/keyevent channel', () {
Keyboard.initialize();
String channelReceived;
Map<String, dynamic> dataReceived;
ui.window.onPlatformMessage = (String channel, ByteData data,
ui.PlatformMessageResponseCallback callback) {
String? channelReceived;
Map<String, dynamic>? dataReceived;
ui.window.onPlatformMessage = (String channel, ByteData? data,
ui.PlatformMessageResponseCallback? callback) {
channelReceived = channel;
dataReceived = const JSONMessageCodec().decodeMessage(data);
};
@ -94,7 +93,7 @@ void testMain() {
});
expect(event.defaultPrevented, isFalse);
Keyboard.instance.dispose();
Keyboard.instance!.dispose();
},
// TODO(nurhan): https://github.com/flutter/flutter/issues/50815
skip: browserEngine == BrowserEngine.edge);
@ -102,9 +101,9 @@ void testMain() {
test('dispatches correct meta state', () {
Keyboard.initialize();
Map<String, dynamic> dataReceived;
ui.window.onPlatformMessage = (String channel, ByteData data,
ui.PlatformMessageResponseCallback callback) {
Map<String, dynamic>? dataReceived;
ui.window.onPlatformMessage = (String channel, ByteData? data,
ui.PlatformMessageResponseCallback? callback) {
dataReceived = const JSONMessageCodec().decodeMessage(data);
};
@ -144,7 +143,7 @@ void testMain() {
'metaState': 0x1 | 0x2 | 0x8,
});
Keyboard.instance.dispose();
Keyboard.instance!.dispose();
},
// TODO(nurhan): https://github.com/flutter/flutter/issues/50815
skip: browserEngine == BrowserEngine.edge);
@ -153,8 +152,8 @@ void testMain() {
Keyboard.initialize();
List<Map<String, dynamic>> messages = <Map<String, dynamic>>[];
ui.window.onPlatformMessage = (String channel, ByteData data,
ui.PlatformMessageResponseCallback callback) {
ui.window.onPlatformMessage = (String channel, ByteData? data,
ui.PlatformMessageResponseCallback? callback) {
messages.add(const JSONMessageCodec().decodeMessage(data));
};
@ -197,7 +196,7 @@ void testMain() {
expectedMessage,
]);
Keyboard.instance.dispose();
Keyboard.instance!.dispose();
},
// TODO(nurhan): https://github.com/flutter/flutter/issues/50815
skip: browserEngine == BrowserEngine.edge);
@ -206,8 +205,8 @@ void testMain() {
Keyboard.initialize();
int count = 0;
ui.window.onPlatformMessage = (String channel, ByteData data,
ui.PlatformMessageResponseCallback callback) {
ui.window.onPlatformMessage = (String channel, ByteData? data,
ui.PlatformMessageResponseCallback? callback) {
count += 1;
};
@ -216,7 +215,7 @@ void testMain() {
dispatchKeyboardEvent('keyup');
expect(count, 2);
Keyboard.instance.dispose();
Keyboard.instance!.dispose();
expect(Keyboard.instance, isNull);
// No more event dispatching.
@ -230,11 +229,11 @@ void testMain() {
Keyboard.initialize();
int count = 0;
ui.window.onPlatformMessage = (String channel, ByteData data,
ui.PlatformMessageResponseCallback callback) {
ui.window.onPlatformMessage = (String channel, ByteData? data,
ui.PlatformMessageResponseCallback? callback) {
count += 1;
ByteData response = const JSONMessageCodec().encodeMessage(<String, dynamic>{'handled': true});
callback(response);
final ByteData response = const JSONMessageCodec().encodeMessage(<String, dynamic>{'handled': true})!;
callback!(response);
};
final html.KeyboardEvent event = dispatchKeyboardEvent(
@ -246,18 +245,18 @@ void testMain() {
expect(event.defaultPrevented, isTrue);
expect(count, 1);
Keyboard.instance.dispose();
Keyboard.instance!.dispose();
});
test("Doesn't prevent default when key is not handled by the framework", () {
Keyboard.initialize();
int count = 0;
ui.window.onPlatformMessage = (String channel, ByteData data,
ui.PlatformMessageResponseCallback callback) {
ui.window.onPlatformMessage = (String channel, ByteData? data,
ui.PlatformMessageResponseCallback? callback) {
count += 1;
ByteData response = const JSONMessageCodec().encodeMessage(<String, dynamic>{'handled': false});
callback(response);
ByteData response = const JSONMessageCodec().encodeMessage(<String, dynamic>{'handled': false})!;
callback!(response);
};
final html.KeyboardEvent event = dispatchKeyboardEvent(
@ -269,15 +268,15 @@ void testMain() {
expect(event.defaultPrevented, isFalse);
expect(count, 1);
Keyboard.instance.dispose();
Keyboard.instance!.dispose();
});
test('keyboard events should be triggered on text fields', () {
Keyboard.initialize();
int count = 0;
ui.window.onPlatformMessage = (String channel, ByteData data,
ui.PlatformMessageResponseCallback callback) {
ui.window.onPlatformMessage = (String channel, ByteData? data,
ui.PlatformMessageResponseCallback? callback) {
count += 1;
};
@ -293,18 +292,18 @@ void testMain() {
expect(count, 1);
});
Keyboard.instance.dispose();
Keyboard.instance!.dispose();
});
test('the "Tab" key should never be ignored', () {
Keyboard.initialize();
int count = 0;
ui.window.onPlatformMessage = (String channel, ByteData data,
ui.PlatformMessageResponseCallback callback) {
ui.window.onPlatformMessage = (String channel, ByteData? data,
ui.PlatformMessageResponseCallback? callback) {
count += 1;
ByteData response = const JSONMessageCodec().encodeMessage(<String, dynamic>{'handled': true});
callback(response);
ByteData response = const JSONMessageCodec().encodeMessage(<String, dynamic>{'handled': true})!;
callback!(response);
};
useTextEditingElement((html.Element element) {
@ -319,7 +318,7 @@ void testMain() {
expect(count, 1);
});
Keyboard.instance.dispose();
Keyboard.instance!.dispose();
});
testFakeAsync(
@ -335,8 +334,8 @@ void testMain() {
Keyboard.initialize();
List<Map<String, dynamic>> messages = <Map<String, dynamic>>[];
ui.window.onPlatformMessage = (String channel, ByteData data,
ui.PlatformMessageResponseCallback callback) {
ui.window.onPlatformMessage = (String channel, ByteData? data,
ui.PlatformMessageResponseCallback? callback) {
messages.add(const JSONMessageCodec().decodeMessage(data));
};
@ -428,7 +427,7 @@ void testMain() {
}
]);
Keyboard.instance.dispose();
Keyboard.instance!.dispose();
},
);
@ -438,8 +437,8 @@ void testMain() {
Keyboard.initialize();
List<Map<String, dynamic>> messages = <Map<String, dynamic>>[];
ui.window.onPlatformMessage = (String channel, ByteData data,
ui.PlatformMessageResponseCallback callback) {
ui.window.onPlatformMessage = (String channel, ByteData? data,
ui.PlatformMessageResponseCallback? callback) {
messages.add(const JSONMessageCodec().decodeMessage(data));
};
@ -500,7 +499,7 @@ void testMain() {
}
messages.clear();
Keyboard.instance.dispose();
Keyboard.instance!.dispose();
},
);
@ -510,8 +509,8 @@ void testMain() {
Keyboard.initialize();
List<Map<String, dynamic>> messages = <Map<String, dynamic>>[];
ui.window.onPlatformMessage = (String channel, ByteData data,
ui.PlatformMessageResponseCallback callback) {
ui.window.onPlatformMessage = (String channel, ByteData? data,
ui.PlatformMessageResponseCallback? callback) {
messages.add(const JSONMessageCodec().decodeMessage(data));
};
@ -532,7 +531,7 @@ void testMain() {
async.elapse(Duration(seconds: 3));
expect(messages, hasLength(0));
Keyboard.instance.dispose();
Keyboard.instance!.dispose();
},
);
@ -540,8 +539,8 @@ void testMain() {
Keyboard.initialize();
List<Map<String, dynamic>> messages = <Map<String, dynamic>>[];
ui.window.onPlatformMessage = (String channel, ByteData data,
ui.PlatformMessageResponseCallback callback) {
ui.window.onPlatformMessage = (String channel, ByteData? data,
ui.PlatformMessageResponseCallback? callback) {
messages.add(const JSONMessageCodec().decodeMessage(data));
};
@ -590,7 +589,7 @@ void testMain() {
}
]);
Keyboard.instance.dispose();
Keyboard.instance!.dispose();
});
});
}
@ -602,7 +601,7 @@ void useTextEditingElement(ElementCallback callback) {
input.classes.add(HybridTextEditing.textEditingClass);
try {
html.document.body.append(input);
html.document.body!.append(input);
callback(input);
} finally {
input.remove();
@ -611,9 +610,9 @@ void useTextEditingElement(ElementCallback callback) {
html.KeyboardEvent dispatchKeyboardEvent(
String type, {
html.EventTarget target,
String key,
String code,
html.EventTarget? target,
String? key,
String? code,
bool repeat = false,
bool isShiftPressed = false,
bool isAltPressed = false,

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
import 'package:test/bootstrap/browser.dart';
import 'package:test/test.dart';
import 'package:ui/ui.dart';

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
import 'dart:html' as html;
import 'dart:typed_data';
@ -13,7 +12,7 @@ import 'package:ui/ui.dart';
/// that were passed.
class MockCanvasCall {
MockCanvasCall._({
this.methodName,
required this.methodName,
this.arguments,
});
@ -35,7 +34,8 @@ class MockEngineCanvas implements EngineCanvas {
final List<MockCanvasCall> methodCallLog = <MockCanvasCall>[];
@override
html.Element get rootElement => null;
html.Element get rootElement => _rootElement;
html.Element _rootElement = html.DivElement();
void _called(String methodName, {dynamic arguments}) {
methodCallLog.add(MockCanvasCall._(

View File

@ -2,35 +2,34 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
import 'package:test/bootstrap/browser.dart';
import 'package:test/test.dart';
import 'package:ui/src/engine.dart';
import 'package:ui/ui.dart' hide window;
void testEachMeasurement(String description, VoidCallback body, {bool skip}) {
void testEachMeasurement(String description, VoidCallback body, {bool? skip}) {
test('$description (dom measurement)', () async {
try {
TextMeasurementService.initialize(rulerCacheCapacity: 2);
WebExperiments.instance.useCanvasText = false;
WebExperiments.instance.useCanvasRichText = false;
WebExperiments.instance!.useCanvasText = false;
WebExperiments.instance!.useCanvasRichText = false;
return body();
} finally {
WebExperiments.instance.useCanvasText = null;
WebExperiments.instance.useCanvasRichText = null;
WebExperiments.instance!.useCanvasText = null;
WebExperiments.instance!.useCanvasRichText = null;
TextMeasurementService.clearCache();
}
}, skip: skip);
test('$description (canvas measurement)', () async {
try {
TextMeasurementService.initialize(rulerCacheCapacity: 2);
WebExperiments.instance.useCanvasText = true;
WebExperiments.instance.useCanvasRichText = false;
WebExperiments.instance!.useCanvasText = true;
WebExperiments.instance!.useCanvasRichText = false;
return body();
} finally {
WebExperiments.instance.useCanvasText = null;
WebExperiments.instance.useCanvasRichText = null;
WebExperiments.instance!.useCanvasText = null;
WebExperiments.instance!.useCanvasRichText = null;
TextMeasurementService.clearCache();
}
}, skip: skip);
@ -195,8 +194,8 @@ void testMain() async {
test('getPositionForOffset multi-line', () {
// [Paragraph.getPositionForOffset] for multi-line text doesn't work well
// with dom-based measurement.
WebExperiments.instance.useCanvasText = true;
WebExperiments.instance.useCanvasRichText = false;
WebExperiments.instance!.useCanvasText = true;
WebExperiments.instance!.useCanvasRichText = false;
TextMeasurementService.initialize(rulerCacheCapacity: 2);
final ParagraphBuilder builder = ParagraphBuilder(ParagraphStyle(
@ -292,13 +291,13 @@ void testMain() async {
);
TextMeasurementService.clearCache();
WebExperiments.instance.useCanvasText = null;
WebExperiments.instance.useCanvasRichText = null;
WebExperiments.instance!.useCanvasText = null;
WebExperiments.instance!.useCanvasRichText = null;
});
test('getPositionForOffset multi-line centered', () {
WebExperiments.instance.useCanvasText = true;
WebExperiments.instance.useCanvasRichText = false;
WebExperiments.instance!.useCanvasText = true;
WebExperiments.instance!.useCanvasRichText = false;
TextMeasurementService.initialize(rulerCacheCapacity: 2);
final ParagraphBuilder builder = ParagraphBuilder(ParagraphStyle(
@ -401,8 +400,8 @@ void testMain() async {
);
TextMeasurementService.clearCache();
WebExperiments.instance.useCanvasText = null;
WebExperiments.instance.useCanvasRichText = null;
WebExperiments.instance!.useCanvasText = null;
WebExperiments.instance!.useCanvasRichText = null;
});
test('getWordBoundary', () {
@ -892,8 +891,8 @@ void testMain() async {
test('longestLine', () {
// [Paragraph.longestLine] is only supported by canvas-based measurement.
WebExperiments.instance.useCanvasText = true;
WebExperiments.instance.useCanvasRichText = false;
WebExperiments.instance!.useCanvasText = true;
WebExperiments.instance!.useCanvasRichText = false;
TextMeasurementService.initialize(rulerCacheCapacity: 2);
final ParagraphBuilder builder = ParagraphBuilder(ParagraphStyle(
@ -908,8 +907,8 @@ void testMain() async {
expect(paragraph.longestLine, 50.0);
TextMeasurementService.clearCache();
WebExperiments.instance.useCanvasText = null;
WebExperiments.instance.useCanvasRichText = null;
WebExperiments.instance!.useCanvasText = null;
WebExperiments.instance!.useCanvasRichText = null;
});
testEachMeasurement('getLineBoundary (single-line)', () {
@ -936,8 +935,8 @@ void testMain() async {
test('getLineBoundary (multi-line)', () {
// [Paragraph.getLineBoundary] for multi-line paragraphs is only supported
// by canvas-based measurement.
WebExperiments.instance.useCanvasText = true;
WebExperiments.instance.useCanvasRichText = false;
WebExperiments.instance!.useCanvasText = true;
WebExperiments.instance!.useCanvasRichText = false;
TextMeasurementService.initialize(rulerCacheCapacity: 2);
final ParagraphBuilder builder = ParagraphBuilder(ParagraphStyle(
@ -980,8 +979,8 @@ void testMain() async {
}
TextMeasurementService.clearCache();
WebExperiments.instance.useCanvasText = null;
WebExperiments.instance.useCanvasRichText = null;
WebExperiments.instance!.useCanvasText = null;
WebExperiments.instance!.useCanvasRichText = null;
});
testEachMeasurement('width should be a whole integer', () {

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
import 'package:test/bootstrap/browser.dart';
import 'package:test/test.dart';
import 'package:ui/ui.dart';

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
import 'package:test/bootstrap/browser.dart';
import 'package:test/test.dart' hide TypeMatcher, isInstanceOf;
import 'package:ui/ui.dart';

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
import 'dart:html';
import 'package:test/bootstrap/browser.dart';