diff --git a/engine/src/flutter/lib/web_ui/analysis_options.yaml b/engine/src/flutter/lib/web_ui/analysis_options.yaml index 7c46e201fff..5b40ea7c85c 100644 --- a/engine/src/flutter/lib/web_ui/analysis_options.yaml +++ b/engine/src/flutter/lib/web_ui/analysis_options.yaml @@ -3,9 +3,9 @@ # uncommented, we'll delete this file and simply inherit the root options. analyzer: - # TODO(uncomment) strong-mode: + strong-mode: # TODO(uncomment) implicit-casts: false - # TODO(uncomment) implicit-dynamic: false + implicit-dynamic: false errors: missing_required_param: warning missing_return: warning @@ -15,7 +15,7 @@ analyzer: linter: rules: - always_declare_return_types - # TODO(uncomment) - always_put_control_body_on_new_line + - always_put_control_body_on_new_line # TODO(uncomment) - always_specify_types # TODO(uncomment) - annotate_overrides # TODO(uncomment) - avoid_classes_with_only_static_members diff --git a/engine/src/flutter/lib/web_ui/dev/analysis_options.yaml b/engine/src/flutter/lib/web_ui/dev/analysis_options.yaml new file mode 100644 index 00000000000..ac1dc7ce40a --- /dev/null +++ b/engine/src/flutter/lib/web_ui/dev/analysis_options.yaml @@ -0,0 +1,7 @@ +# This is a temporary file used to clean up dev/ before other directories +include: ../analysis_options.yaml + +analyzer: + strong-mode: + implicit-casts: false + implicit-dynamic: false diff --git a/engine/src/flutter/lib/web_ui/dev/browser.dart b/engine/src/flutter/lib/web_ui/dev/browser.dart index 989609cd8a5..71d7de547a6 100644 --- a/engine/src/flutter/lib/web_ui/dev/browser.dart +++ b/engine/src/flutter/lib/web_ui/dev/browser.dart @@ -51,8 +51,8 @@ abstract class Browser { /// /// If there's a problem starting or running the browser, this will complete /// with an error. - Future get onExit => _onExitCompleter.future; - final _onExitCompleter = Completer(); + Future get onExit => _onExitCompleter.future; + final _onExitCompleter = Completer(); /// Standard IO streams for the underlying browser process. final _ioSubscriptions = []; @@ -96,7 +96,7 @@ abstract class Browser { // resolve the ambiguity is to wait a brief amount of time and see if this // browser is actually closed. if (!_closed && exitCode < 0) { - await Future.delayed(Duration(milliseconds: 200)); + await Future.delayed(Duration(milliseconds: 200)); } if (!_closed && exitCode != 0) { @@ -110,15 +110,21 @@ abstract class Browser { } _onExitCompleter.complete(); - }, onError: (error, StackTrace stackTrace) { + }, onError: (dynamic error, StackTrace stackTrace) { // Ignore any errors after the browser has been closed. - if (_closed) return; + if (_closed) { + return; + } // Make sure the process dies even if the error wasn't fatal. _process.then((process) => process.kill()); - if (stackTrace == null) stackTrace = Trace.current(); - if (_onExitCompleter.isCompleted) return; + if (stackTrace == null) { + stackTrace = Trace.current(); + } + if (_onExitCompleter.isCompleted) { + return; + } _onExitCompleter.completeError( Exception('Failed to run $name: ${getErrorMessage(error)}.'), stackTrace); @@ -142,6 +148,6 @@ abstract class Browser { (await _process).kill(); // Swallow exceptions. The user should explicitly use [onExit] for these. - return onExit.catchError((_) {}); + return onExit.catchError((dynamic _) {}); } } diff --git a/engine/src/flutter/lib/web_ui/dev/build.dart b/engine/src/flutter/lib/web_ui/dev/build.dart index a6c70405964..7e31a3fdb23 100644 --- a/engine/src/flutter/lib/web_ui/dev/build.dart +++ b/engine/src/flutter/lib/web_ui/dev/build.dart @@ -13,7 +13,7 @@ import 'package:watcher/watcher.dart'; import 'environment.dart'; import 'utils.dart'; -class BuildCommand extends Command { +class BuildCommand extends Command with ArgUtils { BuildCommand() { argParser ..addFlag( @@ -35,15 +35,9 @@ class BuildCommand extends Command { @override String get description => 'Build the Flutter web engine.'; - bool get isWatchMode => argResults['watch']; + bool get isWatchMode => boolArg('watch'); - int getNinjaJobCount() { - final String ninjaJobsArg = argResults['ninja-jobs']; - if (ninjaJobsArg != null) { - return int.tryParse(ninjaJobsArg); - } - return null; - } + int getNinjaJobCount() => intArg('ninja-jobs'); @override FutureOr run() async { diff --git a/engine/src/flutter/lib/web_ui/dev/chrome_installer.dart b/engine/src/flutter/lib/web_ui/dev/chrome_installer.dart index 95a3892581b..b6345ea3798 100644 --- a/engine/src/flutter/lib/web_ui/dev/chrome_installer.dart +++ b/engine/src/flutter/lib/web_ui/dev/chrome_installer.dart @@ -45,7 +45,7 @@ class ChromeArgParser extends BrowserArgParser { @override void parseOptions(ArgResults argResults) { - _version = argResults['chrome-version']; + _version = argResults['chrome-version'] as String; } @override @@ -108,7 +108,7 @@ Future _findSystemChromeExecutable() async { 'Failed to locate system Chrome installation.'); } - return which.stdout; + return which.stdout as String; } /// Manages the installation of a particular [version] of Chrome. diff --git a/engine/src/flutter/lib/web_ui/dev/clean.dart b/engine/src/flutter/lib/web_ui/dev/clean.dart index 712e4c28e2a..ba2da00c857 100644 --- a/engine/src/flutter/lib/web_ui/dev/clean.dart +++ b/engine/src/flutter/lib/web_ui/dev/clean.dart @@ -10,8 +10,9 @@ import 'package:args/command_runner.dart'; import 'package:path/path.dart' as path; import 'environment.dart'; +import 'utils.dart'; -class CleanCommand extends Command { +class CleanCommand extends Command with ArgUtils { CleanCommand() { argParser ..addFlag( @@ -24,7 +25,7 @@ class CleanCommand extends Command { @override String get name => 'clean'; - bool get _alsoCleanNinja => argResults['ninja']; + bool get _alsoCleanNinja => boolArg('ninja'); @override String get description => 'Deletes build caches and artifacts.'; diff --git a/engine/src/flutter/lib/web_ui/dev/common.dart b/engine/src/flutter/lib/web_ui/dev/common.dart index 37b8e2bf934..3939bf2e9b6 100644 --- a/engine/src/flutter/lib/web_ui/dev/common.dart +++ b/engine/src/flutter/lib/web_ui/dev/common.dart @@ -71,8 +71,8 @@ const String _kBaseDownloadUrl = class _WindowsBinding implements PlatformBinding { @override int getChromeBuild(YamlMap browserLock) { - final YamlMap chromeMap = browserLock['chrome']; - return chromeMap['Win']; + final YamlMap chromeMap = browserLock['chrome'] as YamlMap; + return chromeMap['Win'] as int; } @override @@ -110,8 +110,8 @@ class _WindowsBinding implements PlatformBinding { class _LinuxBinding implements PlatformBinding { @override int getChromeBuild(YamlMap browserLock) { - final YamlMap chromeMap = browserLock['chrome']; - return chromeMap['Linux']; + final YamlMap chromeMap = browserLock['chrome'] as YamlMap; + return chromeMap['Linux'] as int; } @override @@ -151,8 +151,8 @@ class _LinuxBinding implements PlatformBinding { class _MacBinding implements PlatformBinding { @override int getChromeBuild(YamlMap browserLock) { - final YamlMap chromeMap = browserLock['chrome']; - return chromeMap['Mac']; + final YamlMap chromeMap = browserLock['chrome'] as YamlMap; + return chromeMap['Mac'] as int; } @override @@ -192,10 +192,10 @@ class _MacBinding implements PlatformBinding { } class BrowserInstallation { - const BrowserInstallation( - {@required this.version, - @required this.executable, - fetchLatestChromeVersion}); + const BrowserInstallation({ + @required this.version, + @required this.executable, + }); /// Browser version. final String version; @@ -230,7 +230,7 @@ class BrowserLock { BrowserLock._() { final io.File lockFile = io.File( path.join(environment.webUiRootDir.path, 'dev', 'browser_lock.yaml')); - this._configuration = loadYaml(lockFile.readAsStringSync()); + this._configuration = loadYaml(lockFile.readAsStringSync()) as YamlMap; } } diff --git a/engine/src/flutter/lib/web_ui/dev/edge_installation.dart b/engine/src/flutter/lib/web_ui/dev/edge_installation.dart index 3190474164d..efdf03f30b1 100644 --- a/engine/src/flutter/lib/web_ui/dev/edge_installation.dart +++ b/engine/src/flutter/lib/web_ui/dev/edge_installation.dart @@ -36,7 +36,7 @@ class EdgeArgParser extends BrowserArgParser { @override void parseOptions(ArgResults argResults) { - _version = argResults['edge-version']; + _version = argResults['edge-version'] as String; assert(_version == 'system'); } @@ -124,7 +124,7 @@ class EdgeLauncher { EdgeLauncher() : version = - BrowserLock.instance.configuration['edge']['launcher_version']; + BrowserLock.instance.configuration['edge']['launcher_version'] as String; /// Install the launcher if it does not exist in this system. void install() async { diff --git a/engine/src/flutter/lib/web_ui/dev/felt.dart b/engine/src/flutter/lib/web_ui/dev/felt.dart index 9b860872f33..3ba2984777d 100644 --- a/engine/src/flutter/lib/web_ui/dev/felt.dart +++ b/engine/src/flutter/lib/web_ui/dev/felt.dart @@ -32,7 +32,7 @@ void main(List args) async { _listenToShutdownSignals(); try { - final bool result = await runner.run(args); + final bool result = (await runner.run(args)) as bool; if (result == false) { print('Sub-command returned false: `${args.join(' ')}`'); _cleanup(); diff --git a/engine/src/flutter/lib/web_ui/dev/firefox_installer.dart b/engine/src/flutter/lib/web_ui/dev/firefox_installer.dart index d3043e9f683..5a5c951c719 100644 --- a/engine/src/flutter/lib/web_ui/dev/firefox_installer.dart +++ b/engine/src/flutter/lib/web_ui/dev/firefox_installer.dart @@ -26,7 +26,7 @@ class FirefoxArgParser extends BrowserArgParser { @override void populateOptions(ArgParser argParser) { final YamlMap browserLock = BrowserLock.instance.configuration; - String firefoxVersion = browserLock['firefox']['version']; + String firefoxVersion = browserLock['firefox']['version'] as String; argParser ..addOption( @@ -42,7 +42,7 @@ class FirefoxArgParser extends BrowserArgParser { @override void parseOptions(ArgResults argResults) { - _version = argResults['firefox-version']; + _version = argResults['firefox-version'] as String; } @override @@ -260,7 +260,7 @@ class FirefoxInstaller { 'Exit code ${mountResult.exitCode}.\n${mountResult.stderr}'); } - List processOutput = mountResult.stdout.split('\n'); + List processOutput = (mountResult.stdout as String).split('\n'); String volumePath = _volumeFromMountResult(processOutput); if (volumePath == null) { throw BrowserInstallerException( @@ -313,7 +313,7 @@ Future _findSystemFirefoxExecutable() async { throw BrowserInstallerException( 'Failed to locate system Firefox installation.'); } - return which.stdout; + return which.stdout as String; } /// Fetches the latest available Firefox build version on Linux. diff --git a/engine/src/flutter/lib/web_ui/dev/goldens.dart b/engine/src/flutter/lib/web_ui/dev/goldens.dart index 4e61ecb8057..fef621c7243 100644 --- a/engine/src/flutter/lib/web_ui/dev/goldens.dart +++ b/engine/src/flutter/lib/web_ui/dev/goldens.dart @@ -72,10 +72,10 @@ class ImageDiff { /// That would be the distance between black and white. static final double _maxTheoreticalColorDistance = Color.distance( - [255, 255, 255], // white - [0, 0, 0], // black + [255, 255, 255], // white + [0, 0, 0], // black false, - ); + ).toDouble(); // If the normalized color difference of a pixel is greater than this number, // we consider it a wrong pixel. @@ -203,9 +203,9 @@ class _GoldensRepoFetcher { final io.File lockFile = io.File( path.join(environment.webUiDevDir.path, 'goldens_lock.yaml') ); - final YamlMap lock = loadYaml(lockFile.readAsStringSync()); - _repository = lock['repository']; - _revision = lock['revision']; + final YamlMap lock = loadYaml(lockFile.readAsStringSync()) as YamlMap; + _repository = lock['repository'] as String; + _revision = lock['revision'] as String; final String localRevision = await _getLocalRevision(); if (localRevision == _revision) { diff --git a/engine/src/flutter/lib/web_ui/dev/integration_tests_manager.dart b/engine/src/flutter/lib/web_ui/dev/integration_tests_manager.dart index 8a7967784c9..811e8766645 100644 --- a/engine/src/flutter/lib/web_ui/dev/integration_tests_manager.dart +++ b/engine/src/flutter/lib/web_ui/dev/integration_tests_manager.dart @@ -133,7 +133,7 @@ class IntegrationTestsManager { Future _runTestsInDirectory(io.Directory directory) async { final io.Directory testDirectory = io.Directory(pathlib.join(directory.path, 'test_driver')); - final List entities = testDirectory + final List entities = testDirectory .listSync(followLinks: false) .whereType() .toList(); diff --git a/engine/src/flutter/lib/web_ui/dev/safari_installation.dart b/engine/src/flutter/lib/web_ui/dev/safari_installation.dart index 05b0065d05f..95c7dc2332e 100644 --- a/engine/src/flutter/lib/web_ui/dev/safari_installation.dart +++ b/engine/src/flutter/lib/web_ui/dev/safari_installation.dart @@ -35,7 +35,7 @@ class SafariArgParser extends BrowserArgParser { @override void parseOptions(ArgResults argResults) { - _version = argResults['safari-version']; + _version = argResults['safari-version'] as String; assert(_version == 'system'); } diff --git a/engine/src/flutter/lib/web_ui/dev/test_platform.dart b/engine/src/flutter/lib/web_ui/dev/test_platform.dart index 1e5aa3c79b7..922b432cabe 100644 --- a/engine/src/flutter/lib/web_ui/dev/test_platform.dart +++ b/engine/src/flutter/lib/web_ui/dev/test_platform.dart @@ -152,21 +152,29 @@ class BrowserPlatform extends PlatformPlugin { } final String payload = await request.readAsString(); - final Map requestData = json.decode(payload); - final String filename = requestData['filename']; - final bool write = requestData['write']; + final Map requestData = + json.decode(payload) as Map; + final String filename = requestData['filename'] as String; + final bool write = requestData['write'] as bool; final double maxDiffRate = requestData.containsKey('maxdiffrate') - ? requestData['maxdiffrate'].toDouble() // can be parsed as either int or double - : kMaxDiffRateFailure; - final Map region = requestData['region']; - final PixelComparison pixelComparison = PixelComparison.values.firstWhere((value) => value.toString() == requestData['pixelComparison']); - final String result = await _diffScreenshot(filename, write, maxDiffRate, region, pixelComparison); + ? (requestData['maxdiffrate'] as num) + .toDouble() // can be parsed as either int or double + : kMaxDiffRateFailure; + final Map region = + requestData['region'] as Map; + final PixelComparison pixelComparison = PixelComparison.values.firstWhere( + (value) => value.toString() == requestData['pixelComparison']); + final String result = await _diffScreenshot( + filename, write, maxDiffRate, region, pixelComparison); return shelf.Response.ok(json.encode(result)); } Future _diffScreenshot( - String filename, bool write, double maxDiffRateFailure, - Map region, PixelComparison pixelComparison) async { + String filename, + bool write, + double maxDiffRateFailure, + Map region, + PixelComparison pixelComparison) async { if (doUpdateScreenshotGoldens) { write = true; } @@ -209,9 +217,9 @@ To automatically create this file call matchGoldenFile('$filename', write: true) Map captureScreenshotParameters = null; if (region != null) { - captureScreenshotParameters = { + captureScreenshotParameters = { 'format': 'png', - 'clip': { + 'clip': { 'x': region['x'], 'y': region['y'], 'width': region['width'], @@ -224,7 +232,8 @@ To automatically create this file call matchGoldenFile('$filename', write: true) // Setting hardware-independent screen parameters: // https://chromedevtools.github.io/devtools-protocol/tot/Emulation - await wipConnection.sendCommand('Emulation.setDeviceMetricsOverride', { + await wipConnection + .sendCommand('Emulation.setDeviceMetricsOverride', { 'width': kMaxScreenshotWidth, 'height': kMaxScreenshotHeight, 'deviceScaleFactor': 1, @@ -234,7 +243,8 @@ To automatically create this file call matchGoldenFile('$filename', write: true) 'Page.captureScreenshot', captureScreenshotParameters); // Compare screenshots - final Image screenshot = decodePng(base64.decode(response.result['data'])); + final Image screenshot = + decodePng(base64.decode(response.result['data'] as String)); if (write) { // Don't even bother with the comparison, just write and return @@ -406,17 +416,25 @@ Golden file $filename did not match the image generated by the test. '.'); } - if (_closed) return null; + if (_closed) { + return null; + } Uri suiteUrl = url.resolveUri( p.toUri(p.withoutExtension(p.relative(path, from: _root)) + '.html')); - if (_closed) return null; + if (_closed) { + return null; + } var browserManager = await _browserManagerFor(browser); - if (_closed || browserManager == null) return null; + if (_closed || browserManager == null) { + return null; + } var suite = await browserManager.load(path, suiteUrl, suiteConfig, message); - if (_closed) return null; + if (_closed) { + return null; + } return suite; } @@ -429,14 +447,16 @@ Golden file $filename did not match the image generated by the test. /// /// If no browser manager is running yet, starts one. Future _browserManagerFor(Runtime browser) { - if (_browserManager != null) return _browserManager; + if (_browserManager != null) { + return _browserManager; + } var completer = Completer.sync(); var path = _webSocketHandler.create(webSocketHandler(completer.complete)); var webSocketUrl = url.replace(scheme: 'ws').resolve(path); var hostUrl = (_config.pubServeUrl == null ? url : _config.pubServeUrl) .resolve('packages/web_engine_tester/static/index.html') - .replace(queryParameters: { + .replace(queryParameters: { 'managerUrl': webSocketUrl.toString(), 'debug': _config.pauseAfterLoad.toString() }); @@ -446,7 +466,7 @@ Golden file $filename did not match the image generated by the test. // Store null values for browsers that error out so we know not to load them // again. - _browserManager = future.catchError((_) => null); + _browserManager = future.catchError((dynamic _) => null); return future; } @@ -485,7 +505,7 @@ Golden file $filename did not match the image generated by the test. }); } - final _closeMemo = AsyncMemoizer(); + final AsyncMemoizer _closeMemo = AsyncMemoizer(); } /// A Shelf handler that provides support for one-time handlers. @@ -518,11 +538,15 @@ class OneOffHandler { /// Dispatches [request] to the appropriate handler. FutureOr _onRequest(shelf.Request request) { var components = p.url.split(request.url.path); - if (components.isEmpty) return shelf.Response.notFound(null); + if (components.isEmpty) { + return shelf.Response.notFound(null); + } var path = components.removeAt(0); var handler = _handlers.remove(path); - if (handler == null) return shelf.Response.notFound(null); + if (handler == null) { + return shelf.Response.notFound(null); + } return handler(request.change(path: path)); } } @@ -563,13 +587,19 @@ class PathHandler { var components = p.url.split(request.url.path); for (var i = 0; i < components.length; i++) { node = node.children[components[i]]; - if (node == null) break; - if (node.handler == null) continue; + if (node == null) { + break; + } + if (node.handler == null) { + continue; + } handler = node.handler; handlerIndex = i; } - if (handler == null) return shelf.Response.notFound('Not found.'); + if (handler == null) { + return shelf.Response.notFound('Not found.'); + } return handler( request.change(path: p.url.joinAll(components.take(handlerIndex + 1)))); @@ -623,7 +653,7 @@ class BrowserManager { CancelableCompleter _pauseCompleter; /// The controller for [_BrowserEnvironment.onRestart]. - final _onRestartController = StreamController.broadcast(); + final _onRestartController = StreamController.broadcast(); /// The environment to attach to each suite. Future<_BrowserEnvironment> _environment; @@ -660,17 +690,23 @@ class BrowserManager { browser.onExit.then((_) { throw Exception('${runtime.name} exited before connecting.'); - }).catchError((error, StackTrace stackTrace) { - if (completer.isCompleted) return; + }).catchError((dynamic error, StackTrace stackTrace) { + if (completer.isCompleted) { + return; + } completer.completeError(error, stackTrace); }); future.then((webSocket) { - if (completer.isCompleted) return; + if (completer.isCompleted) { + return; + } completer.complete(BrowserManager._(browser, runtime, webSocket)); - }).catchError((error, StackTrace stackTrace) { + }).catchError((dynamic error, StackTrace stackTrace) { browser.close(); - if (completer.isCompleted) return; + if (completer.isCompleted) { + return; + } completer.completeError(error, stackTrace); }); @@ -683,8 +719,7 @@ class BrowserManager { /// Starts the browser identified by [browser] using [settings] and has it load [url]. /// /// If [debug] is true, starts the browser in debug mode. - static Browser _newBrowser(Uri url, Runtime browser, - {bool debug = false}) { + static Browser _newBrowser(Uri url, Runtime browser, {bool debug = false}) { return SupportedBrowsers.instance.getBrowser(browser, url, debug: debug); } @@ -706,10 +741,12 @@ class BrowserManager { // Whenever we get a message, no matter which child channel it's for, we the // know browser is still running code which means the user isn't debugging. - _channel = MultiChannel( + _channel = MultiChannel( webSocket.cast().transform(jsonDocument).changeStream((stream) { return stream.map((message) { - if (!_closed) _timer.reset(); + if (!_closed) { + _timer.reset(); + } for (var controller in _controllers) { controller.setDebugging(false); } @@ -720,7 +757,7 @@ class BrowserManager { _environment = _loadBrowserEnvironment(); _channel.stream - .listen((message) => _onMessage(message as Map), onDone: close); + .listen((dynamic message) => _onMessage(message as Map), onDone: close); } /// Loads [_BrowserEnvironment]. @@ -737,7 +774,7 @@ class BrowserManager { Future load(String path, Uri url, SuiteConfiguration suiteConfig, Object message) async { url = url.replace( - fragment: Uri.encodeFull(jsonEncode({ + fragment: Uri.encodeFull(jsonEncode({ 'metadata': suiteConfig.metadata.serialize(), 'browser': _runtime.identifier }))); @@ -745,7 +782,9 @@ class BrowserManager { var suiteID = _suiteID++; RunnerSuiteController controller; void closeIframe() { - if (_closed) return; + if (_closed) { + return; + } _controllers.remove(controller); _channel.sink.add({'command': 'closeSuite', 'id': suiteID}); } @@ -754,8 +793,8 @@ class BrowserManager { // case we should unload the iframe. var virtualChannel = _channel.virtualChannel(); var suiteChannelID = virtualChannel.id; - var suiteChannel = virtualChannel - .transformStream(StreamTransformer.fromHandlers(handleDone: (sink) { + var suiteChannel = virtualChannel.transformStream( + StreamTransformer.fromHandlers(handleDone: (sink) { closeIframe(); sink.close(); })); @@ -797,9 +836,11 @@ class BrowserManager { /// An implementation of [Environment.displayPause]. CancelableOperation _displayPause() { - if (_pauseCompleter != null) return _pauseCompleter.operation; + if (_pauseCompleter != null) { + return _pauseCompleter.operation; + } - _pauseCompleter = CancelableCompleter(onCancel: () { + _pauseCompleter = CancelableCompleter(onCancel: () { _channel.sink.add({'command': 'resume'}); _pauseCompleter = null; }); @@ -824,7 +865,9 @@ class BrowserManager { break; case 'resume': - if (_pauseCompleter != null) _pauseCompleter.complete(); + if (_pauseCompleter != null) { + _pauseCompleter.complete(); + } break; default: @@ -839,12 +882,14 @@ class BrowserManager { Future close() => _closeMemoizer.runOnce(() { _closed = true; _timer.cancel(); - if (_pauseCompleter != null) _pauseCompleter.complete(); + if (_pauseCompleter != null) { + _pauseCompleter.complete(); + } _pauseCompleter = null; _controllers.clear(); return _browser.close(); }); - final _closeMemoizer = AsyncMemoizer(); + final AsyncMemoizer _closeMemoizer = AsyncMemoizer(); } /// An implementation of [Environment] for the browser. diff --git a/engine/src/flutter/lib/web_ui/dev/test_runner.dart b/engine/src/flutter/lib/web_ui/dev/test_runner.dart index 8ca3fa13e35..5f5995c3d64 100644 --- a/engine/src/flutter/lib/web_ui/dev/test_runner.dart +++ b/engine/src/flutter/lib/web_ui/dev/test_runner.dart @@ -33,7 +33,7 @@ enum TestTypesRequested { all, } -class TestCommand extends Command { +class TestCommand extends Command with ArgUtils { TestCommand() { argParser ..addFlag( @@ -84,13 +84,13 @@ class TestCommand extends Command { /// Check the flags to see what type of tests are requested. TestTypesRequested findTestType() { - if (argResults['unit-tests-only'] && argResults['integration-tests-only']) { + if (boolArg('unit-tests-only') && boolArg('integration-tests-only')) { throw ArgumentError('Conflicting arguments: unit-tests-only and ' 'integration-tests-only are both set'); - } else if (argResults['unit-tests-only']) { + } else if (boolArg('unit-tests-only')) { print('Running the unit tests only'); return TestTypesRequested.unit; - } else if (argResults['integration-tests-only']) { + } else if (boolArg('integration-tests-only')) { if (!isChrome) { throw UnimplementedError( 'Integration tests are only available on Chrome Desktop for now'); @@ -163,7 +163,7 @@ class TestCommand extends Command { /// /// In this mode the browser pauses before running the test to allow /// you set breakpoints or inspect the code. - bool get isDebug => argResults['debug']; + bool get isDebug => boolArg('debug'); /// Paths to targets to run, e.g. a single test. List get targets => argResults.rest; @@ -178,13 +178,15 @@ class TestCommand extends Command { /// Whether all tests should run. bool get runAllTests => targets.isEmpty; - String get browser => argResults['browser']; + /// The name of the browser to run tests in. + String get browser => stringArg('browser'); - bool get isChrome => argResults['browser'] == 'chrome'; + /// Whether [browser] is set to "chrome". + bool get isChrome => browser == 'chrome'; /// When running screenshot tests writes them to the file system into /// ".dart_tool/goldens". - bool get doUpdateScreenshotGoldens => argResults['update-screenshot-goldens']; + bool get doUpdateScreenshotGoldens => boolArg('update-screenshot-goldens'); Future _runTargetTests(List targets) async { await _runTestBatch(targets, concurrency: 1, expectFailure: false); diff --git a/engine/src/flutter/lib/web_ui/dev/utils.dart b/engine/src/flutter/lib/web_ui/dev/utils.dart index 5b7e6f306d9..4cf53b6651a 100644 --- a/engine/src/flutter/lib/web_ui/dev/utils.dart +++ b/engine/src/flutter/lib/web_ui/dev/utils.dart @@ -6,6 +6,7 @@ import 'dart:async'; import 'dart:io' as io; +import 'package:args/command_runner.dart'; import 'package:meta/meta.dart'; import 'package:path/path.dart' as path; @@ -97,14 +98,14 @@ Future evalProcess( ); if (result.exitCode != 0) { throw ProcessException( - description: result.stderr, + description: result.stderr as String, executable: executable, arguments: arguments, workingDirectory: workingDirectory, exitCode: result.exitCode, ); } - return result.stdout; + return result.stdout as String; } @immutable @@ -134,3 +135,29 @@ class ProcessException implements Exception { return '$message'; } } + +/// Adds utility methods +mixin ArgUtils on Command { + /// Extracts a boolean argument from [argResults]. + bool boolArg(String name) => argResults[name] as bool; + + /// Extracts a string argument from [argResults]. + String stringArg(String name) => argResults[name] as String; + + /// Extracts a integer argument from [argResults]. + /// + /// If the argument value cannot be parsed as [int] throws an [ArgumentError]. + int intArg(String name) { + final String rawValue = stringArg(name); + if (rawValue == null) { + return null; + } + final int value = int.tryParse(rawValue); + if (value == null) { + throw ArgumentError( + 'Argument $name should be an integer value but was "$rawValue"', + ); + } + return value; + } +} diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/bitmap_canvas.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/bitmap_canvas.dart index c9fdb211b96..f14fedb652a 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/bitmap_canvas.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/bitmap_canvas.dart @@ -768,6 +768,8 @@ List _clipContent(List<_SaveClipEntry> clipStack, } String _maskFilterToCss(ui.MaskFilter maskFilter) { - if (maskFilter == null) return 'none'; + if (maskFilter == null) { + return 'none'; + } return 'blur(${maskFilter.webOnlySigma}px)'; } diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/clipboard.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/clipboard.dart index fb82e4a566a..de119a2842e 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/clipboard.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/clipboard.dart @@ -27,7 +27,7 @@ class ClipboardMessageHandler { callback(codec.encodeErrorEnvelope( code: 'copy_fail', message: 'Clipboard.setData failed')); } - }).catchError((_) { + }).catchError((dynamic _) { callback(codec.encodeErrorEnvelope( code: 'copy_fail', message: 'Clipboard.setData failed')); }); @@ -37,9 +37,9 @@ class ClipboardMessageHandler { void getDataMethodCall(ui.PlatformMessageResponseCallback callback) { const MethodCodec codec = JSONMethodCodec(); _pasteFromClipboardStrategy.getData().then((String data) { - final Map map = {'text': data}; + final Map map = {'text': data}; callback(codec.encodeSuccessEnvelope(map)); - }).catchError((error) { + }).catchError((dynamic error) { print('Could not get text from clipboard: $error'); callback(codec.encodeErrorEnvelope( code: 'paste_fail', message: 'Clipboard.getData failed')); diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/compositor/canvas_kit_canvas.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/compositor/canvas_kit_canvas.dart index f58ed7e76df..0aca26c381f 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/compositor/canvas_kit_canvas.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/compositor/canvas_kit_canvas.dart @@ -145,7 +145,7 @@ class CanvasKitCanvas implements ui.Canvas { _drawLine(p1, p2, paint); } - void _drawLine(ui.Offset p1, ui.Offset p2, paint) { + void _drawLine(ui.Offset p1, ui.Offset p2, ui.Paint paint) { _canvas.drawLine(p1, p2, paint); } diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/compositor/color_filter.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/compositor/color_filter.dart index 8a585706694..38aecfee0ca 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/compositor/color_filter.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/compositor/color_filter.dart @@ -19,7 +19,7 @@ class SkColorFilter { SkColorFilter.matrix(EngineColorFilter filter) { // TODO(het): Find a way to remove these array conversions. - final js.JsArray colorMatrix = js.JsArray(); + final js.JsArray colorMatrix = js.JsArray(); colorMatrix.length = 20; for (int i = 0; i < 20; i++) { colorMatrix[i] = filter._matrix[i]; diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/compositor/embedded_views.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/compositor/embedded_views.dart index 9deee4f7b60..4cb6e64b7a7 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/compositor/embedded_views.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/compositor/embedded_views.dart @@ -316,7 +316,9 @@ class HtmlViewEmbedder { /// Ensures we add a container of SVG path defs to the DOM so they can /// be referred to in clip-path: url(#blah). void _ensureSvgPathDefs() { - if (_svgPathDefs != null) return; + if (_svgPathDefs != null) { + return; + } _svgPathDefs = html.Element.html( '', treeSanitizer: _NullTreeSanitizer(), @@ -399,8 +401,12 @@ class EmbeddedViewParams { final MutatorsStack mutators; bool operator ==(dynamic other) { - if (identical(this, other)) return true; - if (other is! EmbeddedViewParams) return false; + if (identical(this, other)) { + return true; + } + if (other is! EmbeddedViewParams) { + return false; + } EmbeddedViewParams typedOther = other; return offset == typedOther.offset && @@ -456,8 +462,12 @@ class Mutator { double get alphaFloat => alpha / 255.0; bool operator ==(dynamic other) { - if (identical(this, other)) return true; - if (other is! Mutator) return false; + if (identical(this, other)) { + return true; + } + if (other is! Mutator) { + return false; + } final Mutator typedOther = other; if (type != typedOther.type) { @@ -517,8 +527,12 @@ class MutatorsStack extends Iterable { } bool operator ==(dynamic other) { - if (identical(other, this)) return true; - if (other is! MutatorsStack) return false; + if (identical(other, this)) { + return true; + } + if (other is! MutatorsStack) { + return false; + } final MutatorsStack typedOther = other; if (_mutators.length != typedOther._mutators.length) { diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/compositor/fonts.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/compositor/fonts.dart index f6d23be754c..99c62fa9e91 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/compositor/fonts.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/compositor/fonts.dart @@ -47,7 +47,9 @@ class SkiaFontCollection { /// Loads all of the unloaded fonts in [_unloadedFonts] and adds them /// to [_registeredFonts]. Future _loadFonts() async { - if (_unloadedFonts.isEmpty) return; + if (_unloadedFonts.isEmpty) { + return; + } final List<_RegisteredFont> loadedFonts = await Future.wait(_unloadedFonts); _registeredFonts.addAll(loadedFonts.where((x) => x != null)); @@ -174,7 +176,8 @@ class SkiaFontCollection { } Future _getArrayBuffer(dynamic fetchResult) { - return fetchResult.arrayBuffer().then((x) => x as ByteBuffer); + // TODO(yjbanov): fetchResult.arrayBuffer is a dynamic invocation. Clean it up. + return fetchResult.arrayBuffer().then((dynamic x) => x as ByteBuffer); } js.JsObject skFontMgr; diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/compositor/surface.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/compositor/surface.dart index 3e5afed3fe6..20f6bfe5532 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/compositor/surface.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/compositor/surface.dart @@ -50,7 +50,9 @@ class Surface { final SkSurface surface = acquireRenderSurface(size); canvasKit.callMethod('setCurrentContext', [surface.context]); - if (surface == null) return null; + if (surface == null) { + return null; + } SubmitCallback submitCallback = (SurfaceFrame surfaceFrame, SkCanvas canvas) { @@ -115,7 +117,7 @@ class Surface { final int glContext = canvasKit .callMethod('GetWebGLContext', [htmlCanvas]); final js.JsObject grContext = - canvasKit.callMethod('MakeGrContext', [glContext]); + canvasKit.callMethod('MakeGrContext', [glContext]); final js.JsObject skSurface = canvasKit.callMethod('MakeOnScreenGLSurface', [ grContext, @@ -137,7 +139,7 @@ class Surface { return false; } - canvasKit.callMethod('setCurrentContext', [_surface.context]); + canvasKit.callMethod('setCurrentContext', [_surface.context]); _surface.getCanvas().flush(); return true; } diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/compositor/vertices.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/compositor/vertices.dart index b9d43ba6d26..6cde7a8ec83 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/compositor/vertices.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/compositor/vertices.dart @@ -8,7 +8,9 @@ part of engine; Int32List _encodeColorList(List colors) { final int colorCount = colors.length; final Int32List result = Int32List(colorCount); - for (int i = 0; i < colorCount; ++i) result[i] = colors[i].value; + for (int i = 0; i < colorCount; ++i) { + result[i] = colors[i].value; + } return result; } @@ -117,7 +119,9 @@ class SkVertices implements ui.Vertices { } static js.JsArray> _encodePoints(List points) { - if (points == null) return null; + if (points == null) { + return null; + } js.JsArray> encodedPoints = js.JsArray>(); diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/dom_renderer.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/dom_renderer.dart index 5990ad2f49d..b6f1cd06c43 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/dom_renderer.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/dom_renderer.dart @@ -71,7 +71,7 @@ class DomRenderer { /// This getter calls the `hasFocus` method of the `Document` interface. /// See for more details: /// https://developer.mozilla.org/en-US/docs/Web/API/Document/hasFocus - bool get windowHasFocus => js_util.callMethod(html.document, 'hasFocus', []); + bool get windowHasFocus => js_util.callMethod(html.document, 'hasFocus', []); void _setupHotRestart() { // This persists across hot restarts to clear stale DOM. diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/html_image_codec.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/html_image_codec.dart index 28d3107fec2..c380258d904 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/html_image_codec.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/html_image_codec.dart @@ -49,7 +49,7 @@ class HtmlCodec implements ui.Codec { imgElement.naturalHeight, ); completer.complete(SingleFrameInfo(image)); - }).catchError((e) { + }).catchError((dynamic e) { // This code path is hit on Chrome 80.0.3987.16 when too many // images are on the page (~1000). // Fallback here is to load using onLoad instead. diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/render_vertices.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/render_vertices.dart index d39ccd469d1..89849fe4630 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/render_vertices.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/render_vertices.dart @@ -145,7 +145,7 @@ class _WebGlRenderer implements _GlRenderer { gl.bindArrayBuffer(positionsBuffer); gl.bufferData(positions, gl.kStaticDraw); js_util.callMethod( - gl.glContext, 'vertexAttribPointer', [0, 2, gl.kFloat, false, 0, 0]); + gl.glContext, 'vertexAttribPointer', [0, 2, gl.kFloat, false, 0, 0]); gl.enableVertexAttribArray(0); // Setup color buffer. @@ -155,7 +155,7 @@ class _WebGlRenderer implements _GlRenderer { gl.bufferData(vertices.colors, gl.kStaticDraw); js_util.callMethod(gl.glContext, 'vertexAttribPointer', - [1, 4, gl.kUnsignedByte, true, 0, 0]); + [1, 4, gl.kUnsignedByte, true, 0, 0]); gl.enableVertexAttribArray(1); gl.clear(); final int vertexCount = positions.length ~/ 2; @@ -317,7 +317,7 @@ class _GlContext { static Map _programCache; _GlContext.fromOffscreenCanvas(html.OffscreenCanvas canvas) - : glContext = canvas.getContext('webgl2', {'premultipliedAlpha': false}), + : glContext = canvas.getContext('webgl2', {'premultipliedAlpha': false}), isOffscreen = true { _programCache = {}; _canvas = canvas; @@ -325,7 +325,7 @@ class _GlContext { _GlContext.fromCanvas(html.CanvasElement canvas, bool useWebGl1) : glContext = canvas.getContext(useWebGl1 ? 'webgl' : 'webgl2', - {'premultipliedAlpha': false}), + {'premultipliedAlpha': false}), isOffscreen = false { _programCache = {}; _canvas = canvas; @@ -342,7 +342,7 @@ class _GlContext { // Actual size of canvas may be larger than viewport size. Use // source/destination to draw part of the image data. js_util.callMethod(context, 'drawImage', - [_canvas, 0, 0, _widthInPixels, _heightInPixels, + [_canvas, 0, 0, _widthInPixels, _heightInPixels, left, top, _widthInPixels, _heightInPixels]); } @@ -372,10 +372,10 @@ class _GlContext { if (shader == null) { throw Exception(error); } - js_util.callMethod(glContext, 'shaderSource', [shader, source]); - js_util.callMethod(glContext, 'compileShader', [shader]); + js_util.callMethod(glContext, 'shaderSource', [shader, source]); + js_util.callMethod(glContext, 'compileShader', [shader]); bool shaderStatus = js_util - .callMethod(glContext, 'getShaderParameter', [shader, compileStatus]); + .callMethod(glContext, 'getShaderParameter', [shader, compileStatus]); if (!shaderStatus) { throw Exception('Shader compilation failed: ${getShaderInfoLog(shader)}'); } @@ -383,73 +383,73 @@ class _GlContext { } Object createProgram() => - js_util.callMethod(glContext, 'createProgram', const []); + js_util.callMethod(glContext, 'createProgram', const []); void attachShader(Object program, Object shader) { - js_util.callMethod(glContext, 'attachShader', [program, shader]); + js_util.callMethod(glContext, 'attachShader', [program, shader]); } void linkProgram(Object program) { - js_util.callMethod(glContext, 'linkProgram', [program]); + js_util.callMethod(glContext, 'linkProgram', [program]); if (!js_util - .callMethod(glContext, 'getProgramParameter', [program, kLinkStatus])) { + .callMethod(glContext, 'getProgramParameter', [program, kLinkStatus])) { throw Exception(getProgramInfoLog(program)); } } void useProgram(Object program) { - js_util.callMethod(glContext, 'useProgram', [program]); + js_util.callMethod(glContext, 'useProgram', [program]); } Object createBuffer() => - js_util.callMethod(glContext, 'createBuffer', const []); + js_util.callMethod(glContext, 'createBuffer', const []); void bindArrayBuffer(Object buffer) { - js_util.callMethod(glContext, 'bindBuffer', [kArrayBuffer, buffer]); + js_util.callMethod(glContext, 'bindBuffer', [kArrayBuffer, buffer]); } void deleteBuffer(Object buffer) { - js_util.callMethod(glContext, 'deleteBuffer', [buffer]); + js_util.callMethod(glContext, 'deleteBuffer', [buffer]); } void bufferData(TypedData data, dynamic type) { - js_util.callMethod(glContext, 'bufferData', [kArrayBuffer, data, type]); + js_util.callMethod(glContext, 'bufferData', [kArrayBuffer, data, type]); } void enableVertexAttribArray(int index) { - js_util.callMethod(glContext, 'enableVertexAttribArray', [index]); + js_util.callMethod(glContext, 'enableVertexAttribArray', [index]); } /// Clear background. void clear() { - js_util.callMethod(glContext, 'clear', [kColorBufferBit]); + js_util.callMethod(glContext, 'clear', [kColorBufferBit]); } /// Destroys gl context. void dispose() { - js_util.callMethod(_getExtension('WEBGL_lose_context'), 'loseContext', []); + js_util.callMethod(_getExtension('WEBGL_lose_context'), 'loseContext', const []); } void deleteProgram(Object program) { - js_util.callMethod(glContext, 'deleteProgram', [program]); + js_util.callMethod(glContext, 'deleteProgram', [program]); } void deleteShader(Object shader) { - js_util.callMethod(glContext, 'deleteShader', [shader]); + js_util.callMethod(glContext, 'deleteShader', [shader]); } dynamic _getExtension(String extensionName) => - js_util.callMethod(glContext, 'getExtension', [extensionName]); + js_util.callMethod(glContext, 'getExtension', [extensionName]); void drawTriangles(int triangleCount, ui.VertexMode vertexMode) { dynamic mode = _triangleTypeFromMode(vertexMode); - js_util.callMethod(glContext, 'drawArrays', [mode, 0, triangleCount]); + js_util.callMethod(glContext, 'drawArrays', [mode, 0, triangleCount]); } /// Sets affine transformation from normalized device coordinates /// to window coordinates void viewport(double x, double y, double width, double height) { - js_util.callMethod(glContext, 'viewport', [x, y, width, height]); + js_util.callMethod(glContext, 'viewport', [x, y, width, height]); } dynamic _triangleTypeFromMode(ui.VertexMode mode) { @@ -467,10 +467,10 @@ class _GlContext { } Object _createShader(String shaderType) => js_util.callMethod( - glContext, 'createShader', [js_util.getProperty(glContext, shaderType)]); + glContext, 'createShader', [js_util.getProperty(glContext, shaderType)]); /// Error state of gl context. - dynamic get error => js_util.callMethod(glContext, 'getError', const []); + dynamic get error => js_util.callMethod(glContext, 'getError', const []); /// Shader compiler error, if this returns [kFalse], to get details use /// [getShaderInfoLog]. @@ -508,37 +508,37 @@ class _GlContext { /// Returns reference to uniform in program. Object getUniformLocation(Object program, String uniformName) { return js_util - .callMethod(glContext, 'getUniformLocation', [program, uniformName]); + .callMethod(glContext, 'getUniformLocation', [program, uniformName]); } /// Sets vec2 uniform values. void setUniform2f(Object uniform, double value1, double value2) { return js_util - .callMethod(glContext, 'uniform2f', [uniform, value1, value2]); + .callMethod(glContext, 'uniform2f', [uniform, value1, value2]); } /// Sets vec4 uniform values. void setUniform4f(Object uniform, double value1, double value2, double value3, double value4) { return js_util.callMethod( - glContext, 'uniform4f', [uniform, value1, value2, value3, value4]); + glContext, 'uniform4f', [uniform, value1, value2, value3, value4]); } /// Sets mat4 uniform values. void setUniformMatrix4fv(Object uniform, bool transpose, Float64List value) { return js_util.callMethod( - glContext, 'uniformMatrix4fv', [uniform, transpose, value]); + glContext, 'uniformMatrix4fv', [uniform, transpose, value]); } /// Shader compile error log. dynamic getShaderInfoLog(Object glShader) { - return js_util.callMethod(glContext, 'getShaderInfoLog', [glShader]); + return js_util.callMethod(glContext, 'getShaderInfoLog', [glShader]); } /// Errors that occurred during failed linking or validation of program /// objects. Typically called after [linkProgram]. String getProgramInfoLog(Object glProgram) { - return js_util.callMethod(glContext, 'getProgramInfoLog', [glProgram]); + return js_util.callMethod(glContext, 'getProgramInfoLog', [glProgram]); } int get drawingBufferWidth => @@ -555,7 +555,7 @@ class _GlContext { final Uint8List pixels = Uint8List(bufferWidth * bufferHeight * kBytesPerPixel); js_util.callMethod(glContext, 'readPixels', - [0, 0, bufferWidth, bufferHeight, kRGBA, kUnsignedByte, pixels]); + [0, 0, bufferWidth, bufferHeight, kRGBA, kUnsignedByte, pixels]); return html.ImageData( Uint8ClampedList.fromList(pixels), bufferWidth, bufferHeight); } else { @@ -565,7 +565,7 @@ class _GlContext { final Uint8ClampedList pixels = Uint8ClampedList(bufferWidth * bufferHeight * kBytesPerPixel); js_util.callMethod(glContext, 'readPixels', - [0, 0, bufferWidth, bufferHeight, kRGBA, kUnsignedByte, pixels]); + [0, 0, bufferWidth, bufferHeight, kRGBA, kUnsignedByte, pixels]); return html.ImageData(pixels, bufferWidth, bufferHeight); } } diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/shadow.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/shadow.dart index 62806e029b5..cd6abe34f9a 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/shadow.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/shadow.dart @@ -45,7 +45,7 @@ const double kLightOffsetY = -400.0; /// This is not a complete physical model. For example, this does not take into /// account the size of the shape (this function doesn't even take the shape as /// a parameter). It's just a good enough approximation. -ui.Offset computeShadowOffset(elevation) { +ui.Offset computeShadowOffset(double elevation) { if (elevation == 0.0) { return ui.Offset.zero; } diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/text/ruler.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/text/ruler.dart index b2e317d27f5..38655a528d8 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/text/ruler.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/text/ruler.dart @@ -924,8 +924,8 @@ class MeasurementResult { @required this.alphabeticBaseline, @required this.ideographicBaseline, @required this.lines, - @required textAlign, - @required textDirection, + @required ui.TextAlign textAlign, + @required ui.TextDirection textDirection, }) : assert(constraintWidth != null), assert(isSingleLine != null), assert(width != null), diff --git a/engine/src/flutter/lib/web_ui/lib/src/ui/canvas.dart b/engine/src/flutter/lib/web_ui/lib/src/ui/canvas.dart index 9359f0487e0..c27e513fc4b 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/ui/canvas.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/ui/canvas.dart @@ -963,7 +963,9 @@ class Canvas { } void drawVertices(Vertices vertices, BlendMode blendMode, Paint paint) { - if (vertices == null) return; + if (vertices == null) { + return; + } //assert(vertices != null); // vertices is checked on the engine side assert(paint != null); assert(blendMode != null); diff --git a/engine/src/flutter/lib/web_ui/lib/src/ui/text.dart b/engine/src/flutter/lib/web_ui/lib/src/ui/text.dart index a55779537e1..18aec485487 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/ui/text.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/ui/text.dart @@ -1105,8 +1105,12 @@ class TextRange { @override bool operator ==(dynamic other) { - if (identical(this, other)) return true; - if (other is! TextRange) return false; + if (identical(this, other)) { + return true; + } + if (other is! TextRange) { + return false; + } final TextRange typedOther = other; return typedOther.start == start && typedOther.end == end; } diff --git a/engine/src/flutter/lib/web_ui/lib/src/ui/window.dart b/engine/src/flutter/lib/web_ui/lib/src/ui/window.dart index d58cc5f8590..58c2d672a13 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/ui/window.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/ui/window.dart @@ -485,8 +485,12 @@ class Locale { String _rawToString(String separator) { final StringBuffer out = StringBuffer(languageCode); - if (scriptCode != null) out.write('$separator$scriptCode'); - if (_countryCode != null) out.write('$separator$countryCode'); + if (scriptCode != null) { + out.write('$separator$scriptCode'); + } + if (_countryCode != null) { + out.write('$separator$countryCode'); + } return out.toString(); } } diff --git a/engine/src/flutter/lib/web_ui/test/engine/history_test.dart b/engine/src/flutter/lib/web_ui/test/engine/history_test.dart index 01e67c388e9..c7c31b2cbd1 100644 --- a/engine/src/flutter/lib/web_ui/test/engine/history_test.dart +++ b/engine/src/flutter/lib/web_ui/test/engine/history_test.dart @@ -171,7 +171,7 @@ void main() { await _strategy.simulateUserTypingUrl('/page3'); // This delay is necessary to wait for [BrowserHistory] because it // performs a `back` operation which results in a new event loop. - await Future.delayed(Duration.zero); + await Future.delayed(Duration.zero); // 1. The engine sends a `pushRoute` platform message. expect(spy.messages, hasLength(1)); expect(spy.messages[0].channel, 'flutter/navigation'); @@ -212,7 +212,7 @@ void main() { await _strategy.simulateUserTypingUrl('/unknown'); // This delay is necessary to wait for [BrowserHistory] because it // performs a `back` operation which results in a new event loop. - await Future.delayed(Duration.zero); + await Future.delayed(Duration.zero); // 1. The engine sends a `pushRoute` platform message. expect(spy.messages, hasLength(1)); expect(spy.messages[0].channel, 'flutter/navigation'); diff --git a/engine/src/flutter/lib/web_ui/test/engine/pointer_binding_test.dart b/engine/src/flutter/lib/web_ui/test/engine/pointer_binding_test.dart index a23d559bb54..caa345b2385 100644 --- a/engine/src/flutter/lib/web_ui/test/engine/pointer_binding_test.dart +++ b/engine/src/flutter/lib/web_ui/test/engine/pointer_binding_test.dart @@ -1970,7 +1970,7 @@ class _TouchEventContext extends _BasicEventContext with _MultiPointerEventMixin double clientX, double clientY, }) { - return html.Touch({ + return html.Touch({ 'identifier': identifier, 'clientX': clientX, 'clientY': clientY, @@ -1979,7 +1979,7 @@ class _TouchEventContext extends _BasicEventContext with _MultiPointerEventMixin } html.TouchEvent _createTouchEvent(String eventType, List<_TouchDetails> touches) { - return html.TouchEvent(eventType, { + return html.TouchEvent(eventType, { 'changedTouches': touches.map( (_TouchDetails details) => _createTouch( @@ -2138,7 +2138,7 @@ class _PointerEventContext extends _BasicEventContext with _ButtonedEventMixin i } html.Event _downWithFullDetails({double clientX, double clientY, int button, int buttons, int pointer, String pointerType}) { - return html.PointerEvent('pointerdown', { + return html.PointerEvent('pointerdown', { 'pointerId': pointer, 'button': button, 'buttons': buttons, @@ -2173,7 +2173,7 @@ class _PointerEventContext extends _BasicEventContext with _ButtonedEventMixin i } html.Event _moveWithFullDetails({double clientX, double clientY, int button, int buttons, int pointer, String pointerType}) { - return html.PointerEvent('pointermove', { + return html.PointerEvent('pointermove', { 'pointerId': pointer, 'button': button, 'buttons': buttons, @@ -2206,7 +2206,7 @@ class _PointerEventContext extends _BasicEventContext with _ButtonedEventMixin i } html.Event _upWithFullDetails({double clientX, double clientY, int button, int pointer, String pointerType}) { - return html.PointerEvent('pointerup', { + return html.PointerEvent('pointerup', { 'pointerId': pointer, 'button': button, 'buttons': 0, @@ -2218,7 +2218,7 @@ class _PointerEventContext extends _BasicEventContext with _ButtonedEventMixin i @override List multiTouchCancel(List<_TouchDetails> touches) { - return touches.map((_TouchDetails details) => html.PointerEvent('pointercancel', { + return touches.map((_TouchDetails details) => html.PointerEvent('pointercancel', { 'pointerId': details.pointer, 'button': 0, 'buttons': 0, diff --git a/engine/src/flutter/lib/web_ui/test/engine/recording_canvas_test.dart b/engine/src/flutter/lib/web_ui/test/engine/recording_canvas_test.dart index 6e375bfc9ac..2757ba96fd4 100644 --- a/engine/src/flutter/lib/web_ui/test/engine/recording_canvas_test.dart +++ b/engine/src/flutter/lib/web_ui/test/engine/recording_canvas_test.dart @@ -27,7 +27,7 @@ void main() { underTest.drawDRRect(rrect, rrect.deflate(1), somePaint); underTest.apply(mockCanvas); - _expectDrawCall(mockCanvas, { + _expectDrawCall(mockCanvas, { 'outer': rrect, 'inner': rrect.deflate(1), 'paint': somePaint.paintData, @@ -75,7 +75,7 @@ void main() { underTest.apply(mockCanvas); // Expect to draw, even when inner has negative radii (which get ignored by canvas) - _expectDrawCall(mockCanvas, { + _expectDrawCall(mockCanvas, { 'outer': outer, 'inner': inner, 'paint': somePaint.paintData, @@ -91,7 +91,7 @@ void main() { underTest.drawDRRect(outer, inner, somePaint); underTest.apply(mockCanvas); - _expectDrawCall(mockCanvas, { + _expectDrawCall(mockCanvas, { 'outer': outer, 'inner': inner, 'paint': somePaint.paintData, diff --git a/engine/src/flutter/lib/web_ui/test/golden_tests/engine/canvas_blend_golden_test.dart b/engine/src/flutter/lib/web_ui/test/golden_tests/engine/canvas_blend_golden_test.dart index ee05bd37b95..694274bfe51 100644 --- a/engine/src/flutter/lib/web_ui/test/golden_tests/engine/canvas_blend_golden_test.dart +++ b/engine/src/flutter/lib/web_ui/test/golden_tests/engine/canvas_blend_golden_test.dart @@ -135,6 +135,6 @@ HtmlImage createTestImage() { ctx.fillRect(66, 0, 33, 50); ctx.fill(); html.ImageElement imageElement = html.ImageElement(); - imageElement.src = js_util.callMethod(canvas, 'toDataURL', []); + imageElement.src = js_util.callMethod(canvas, 'toDataURL', []); return HtmlImage(imageElement, width, height); } diff --git a/engine/src/flutter/lib/web_ui/test/golden_tests/engine/canvas_clip_path_test.dart b/engine/src/flutter/lib/web_ui/test/golden_tests/engine/canvas_clip_path_test.dart index 81f3fc8b8ea..316b6b3467f 100644 --- a/engine/src/flutter/lib/web_ui/test/golden_tests/engine/canvas_clip_path_test.dart +++ b/engine/src/flutter/lib/web_ui/test/golden_tests/engine/canvas_clip_path_test.dart @@ -101,6 +101,6 @@ engine.HtmlImage createTestImage({int width = 200, int height = 150}) { ctx.fillRect(2 * width / 3, 0, width / 3, height); ctx.fill(); html.ImageElement imageElement = html.ImageElement(); - imageElement.src = js_util.callMethod(canvas, 'toDataURL', []); + imageElement.src = js_util.callMethod(canvas, 'toDataURL', []); return engine.HtmlImage(imageElement, width, height); } diff --git a/engine/src/flutter/lib/web_ui/test/golden_tests/engine/canvas_draw_image_golden_test.dart b/engine/src/flutter/lib/web_ui/test/golden_tests/engine/canvas_draw_image_golden_test.dart index 1e86fefdb4c..762c7b810fc 100644 --- a/engine/src/flutter/lib/web_ui/test/golden_tests/engine/canvas_draw_image_golden_test.dart +++ b/engine/src/flutter/lib/web_ui/test/golden_tests/engine/canvas_draw_image_golden_test.dart @@ -326,6 +326,6 @@ HtmlImage createTestImage({int width = 100, int height = 50}) { ctx.fillRect(66, 0, 33, 50); ctx.fill(); html.ImageElement imageElement = html.ImageElement(); - imageElement.src = js_util.callMethod(canvas, 'toDataURL', []); + imageElement.src = js_util.callMethod(canvas, 'toDataURL', []); return HtmlImage(imageElement, width, height); }