From 895879c195e8010fdaa5caa629eee580dc920403 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Tue, 11 Apr 2023 17:01:15 -0700 Subject: [PATCH] flutter_tools: Flutter Web CLI cleanup (#124564) flutter_tools: Flutter Web CLI cleanup --- .../flutter_tools/lib/src/build_info.dart | 2 +- .../lib/src/isolated/devfs_web.dart | 2 +- .../lib/src/runner/flutter_command.dart | 53 +++---------------- .../flutter_tools/lib/src/web/compile.dart | 40 ++++++++++++-- .../commands.shard/hermetic/run_test.dart | 4 +- .../build_system/targets/web_test.dart | 46 ++++++++-------- .../general.shard/web/compile_web_test.dart | 2 +- .../general.shard/web/devfs_web_test.dart | 2 +- 8 files changed, 71 insertions(+), 80 deletions(-) diff --git a/packages/flutter_tools/lib/src/build_info.dart b/packages/flutter_tools/lib/src/build_info.dart index 1df9fba756d..95d0e35314c 100644 --- a/packages/flutter_tools/lib/src/build_info.dart +++ b/packages/flutter_tools/lib/src/build_info.dart @@ -35,7 +35,7 @@ class BuildInfo { List? dartDefines, this.bundleSkSLPath, List? dartExperiments, - this.webRenderer = WebRendererMode.autoDetect, + this.webRenderer = WebRendererMode.auto, required this.treeShakeIcons, this.performanceMeasurementFile, this.dartDefineConfigJsonMap, diff --git a/packages/flutter_tools/lib/src/isolated/devfs_web.dart b/packages/flutter_tools/lib/src/isolated/devfs_web.dart index 7809c3a1ba1..f4d4f706e71 100644 --- a/packages/flutter_tools/lib/src/isolated/devfs_web.dart +++ b/packages/flutter_tools/lib/src/isolated/devfs_web.dart @@ -778,7 +778,7 @@ class WebDevFS implements DevFS { final int selectedPort = webAssetServer.selectedPort; if (buildInfo.dartDefines.contains('FLUTTER_WEB_AUTO_DETECT=true')) { - webAssetServer.webRenderer = WebRendererMode.autoDetect; + webAssetServer.webRenderer = WebRendererMode.auto; } else if (buildInfo.dartDefines.contains('FLUTTER_WEB_USE_SKIA=true')) { webAssetServer.webRenderer = WebRendererMode.canvaskit; } diff --git a/packages/flutter_tools/lib/src/runner/flutter_command.dart b/packages/flutter_tools/lib/src/runner/flutter_command.dart index 130c7a71184..f2bb23f29ad 100644 --- a/packages/flutter_tools/lib/src/runner/flutter_command.dart +++ b/packages/flutter_tools/lib/src/runner/flutter_command.dart @@ -157,36 +157,6 @@ abstract class FlutterCommand extends Command { /// The flag name for whether or not to use ipv6. static const String ipv6Flag = 'ipv6'; - /// Maps command line web renderer strings to the corresponding web renderer mode - static const Map _webRendererModeMap = - { - 'auto': WebRendererMode.autoDetect, - 'canvaskit': WebRendererMode.canvaskit, - 'html': WebRendererMode.html, - 'skwasm': WebRendererMode.skwasm, - }; - - /// The map used to convert web renderer mode to a List of dart-defines. - static const Map> _webRendererDartDefines = - > { - WebRendererMode.autoDetect: [ - 'FLUTTER_WEB_AUTO_DETECT=true', - ], - WebRendererMode.canvaskit: [ - 'FLUTTER_WEB_AUTO_DETECT=false', - 'FLUTTER_WEB_USE_SKIA=true', - ], - WebRendererMode.html: [ - 'FLUTTER_WEB_AUTO_DETECT=false', - 'FLUTTER_WEB_USE_SKIA=false', - ], - WebRendererMode.skwasm: [ - 'FLUTTER_WEB_AUTO_DETECT=false', - 'FLUTTER_WEB_USE_SKIA=false', - 'FLUTTER_WEB_USE_SKWASM=true', - ] - }; - @override ArgParser get argParser => _argParser; final ArgParser _argParser = ArgParser( @@ -668,15 +638,10 @@ abstract class FlutterCommand extends Command { void usesWebRendererOption() { argParser.addOption( FlutterOptions.kWebRendererFlag, - defaultsTo: 'auto', - allowed: ['auto', 'canvaskit', 'html', 'skwasm'], + defaultsTo: WebRendererMode.auto.name, + allowed: WebRendererMode.values.map((WebRendererMode e) => e.name), help: 'The renderer implementation to use when building for the web.', - allowedHelp: { - 'html': 'Always use the HTML renderer. This renderer uses a combination of HTML, CSS, SVG, 2D Canvas, and WebGL.', - 'canvaskit': 'Always use the CanvasKit renderer. This renderer uses WebGL and WebAssembly to render graphics.', - 'auto': 'Use the HTML renderer on mobile devices, and CanvasKit on desktop devices.', - 'skwasm': 'Always use the experimental skwasm renderer.', - } + allowedHelp: Map.fromEntries(WebRendererMode.values.map((WebRendererMode e) => MapEntry(e.name, e.helpText))) ); } @@ -1236,12 +1201,9 @@ abstract class FlutterCommand extends Command { final Map? defineConfigJsonMap = extractDartDefineConfigJsonMap(); List dartDefines = extractDartDefines(defineConfigJsonMap: defineConfigJsonMap); - WebRendererMode webRenderer = WebRendererMode.autoDetect; + WebRendererMode webRenderer = WebRendererMode.auto; if (argParser.options.containsKey(FlutterOptions.kWebRendererFlag)) { - final WebRendererMode? mappedMode = _webRendererModeMap[stringArg(FlutterOptions.kWebRendererFlag)!]; - if (mappedMode != null) { - webRenderer = mappedMode; - } + webRenderer = WebRendererMode.values.byName(stringArg(FlutterOptions.kWebRendererFlag)!); dartDefines = updateDartDefines(dartDefines, webRenderer); } @@ -1427,10 +1389,7 @@ abstract class FlutterCommand extends Command { && dartDefines.any((String d) => d.startsWith('FLUTTER_WEB_USE_SKIA='))) { dartDefinesSet.removeWhere((String d) => d.startsWith('FLUTTER_WEB_USE_SKIA=')); } - final Iterable? webRendererDefine = _webRendererDartDefines[webRenderer]; - if (webRendererDefine != null) { - dartDefinesSet.addAll(webRendererDefine); - } + dartDefinesSet.addAll(webRenderer.dartDefines); return dartDefinesSet.toList(); } diff --git a/packages/flutter_tools/lib/src/web/compile.dart b/packages/flutter_tools/lib/src/web/compile.dart index 259f260ab47..2b09648b1a4 100644 --- a/packages/flutter_tools/lib/src/web/compile.dart +++ b/packages/flutter_tools/lib/src/web/compile.dart @@ -135,18 +135,50 @@ class WebBuilder { /// Web rendering backend mode. enum WebRendererMode { /// Auto detects which rendering backend to use. - autoDetect, + auto, + /// Always uses canvaskit. canvaskit, + /// Always uses html. html, + /// Always use skwasm. - skwasm, + skwasm; + + String get helpText => switch (this) { + auto => + 'Use the HTML renderer on mobile devices, and CanvasKit on desktop devices.', + canvaskit => + 'Always use the CanvasKit renderer. This renderer uses WebGL and WebAssembly to render graphics.', + html => + 'Always use the HTML renderer. This renderer uses a combination of HTML, CSS, SVG, 2D Canvas, and WebGL.', + skwasm => 'Always use the experimental skwasm renderer.' + }; + + Iterable get dartDefines => switch (this) { + WebRendererMode.auto => [ + 'FLUTTER_WEB_AUTO_DETECT=true', + ], + WebRendererMode.canvaskit => [ + 'FLUTTER_WEB_AUTO_DETECT=false', + 'FLUTTER_WEB_USE_SKIA=true', + ], + WebRendererMode.html => [ + 'FLUTTER_WEB_AUTO_DETECT=false', + 'FLUTTER_WEB_USE_SKIA=false', + ], + WebRendererMode.skwasm => [ + 'FLUTTER_WEB_AUTO_DETECT=false', + 'FLUTTER_WEB_USE_SKIA=false', + 'FLUTTER_WEB_USE_SKWASM=true', + ] + }; } /// The correct precompiled artifact to use for each build and render mode. const Map> kDartSdkJsArtifactMap = >{ - WebRendererMode.autoDetect: { + WebRendererMode.auto: { NullSafetyMode.sound: HostArtifact.webPrecompiledCanvaskitAndHtmlSoundSdk, NullSafetyMode.unsound: HostArtifact.webPrecompiledCanvaskitAndHtmlSdk, }, @@ -162,7 +194,7 @@ const Map> kDartSdkJsArtifact /// The correct source map artifact to use for each build and render mode. const Map> kDartSdkJsMapArtifactMap = >{ - WebRendererMode.autoDetect: { + WebRendererMode.auto: { NullSafetyMode.sound: HostArtifact.webPrecompiledCanvaskitAndHtmlSoundSdkSourcemaps, NullSafetyMode.unsound: HostArtifact.webPrecompiledCanvaskitAndHtmlSdkSourcemaps, }, diff --git a/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart index 7cf108eabdf..afe7c50404f 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart @@ -929,7 +929,7 @@ void main() { }); test('auto web-renderer with no dart-defines', () { - dartDefines = FlutterCommand.updateDartDefines(dartDefines, WebRendererMode.autoDetect); + dartDefines = FlutterCommand.updateDartDefines(dartDefines, WebRendererMode.auto); expect(dartDefines, ['FLUTTER_WEB_AUTO_DETECT=true']); }); @@ -945,7 +945,7 @@ void main() { test('auto web-renderer with existing dart-defines', () { dartDefines = ['FLUTTER_WEB_USE_SKIA=false']; - dartDefines = FlutterCommand.updateDartDefines(dartDefines, WebRendererMode.autoDetect); + dartDefines = FlutterCommand.updateDartDefines(dartDefines, WebRendererMode.auto); expect(dartDefines, ['FLUTTER_WEB_AUTO_DETECT=true']); }); diff --git a/packages/flutter_tools/test/general.shard/build_system/targets/web_test.dart b/packages/flutter_tools/test/general.shard/build_system/targets/web_test.dart index fcfd25c6db1..be0299b5b19 100644 --- a/packages/flutter_tools/test/general.shard/build_system/targets/web_test.dart +++ b/packages/flutter_tools/test/general.shard/build_system/targets/web_test.dart @@ -101,7 +101,7 @@ void main() { webResources.childFile('index.html') .createSync(recursive: true); environment.buildDir.childFile('main.dart.js').createSync(); - await const WebReleaseBundle(WebRendererMode.autoDetect, isWasm: false).build(environment); + await const WebReleaseBundle(WebRendererMode.auto, isWasm: false).build(environment); expect(environment.outputDir.childFile('version.json'), exists); })); @@ -113,7 +113,7 @@ void main() { final Directory webResources = environment.projectDir.childDirectory('web'); webResources.childFile('index.html').createSync(recursive: true); environment.buildDir.childFile('main.dart.js').createSync(); - await const WebReleaseBundle(WebRendererMode.autoDetect, isWasm: false).build(environment); + await const WebReleaseBundle(WebRendererMode.auto, isWasm: false).build(environment); final String versionFile = environment.outputDir .childFile('version.json') @@ -131,7 +131,7 @@ void main() { '''); environment.buildDir.childFile('main.dart.js').createSync(); - await const WebReleaseBundle(WebRendererMode.autoDetect, isWasm: false).build(environment); + await const WebReleaseBundle(WebRendererMode.auto, isWasm: false).build(environment); expect(environment.outputDir.childFile('index.html').readAsStringSync(), contains('/basehreftest/')); })); @@ -144,7 +144,7 @@ void main() { '''); environment.buildDir.childFile('main.dart.js').createSync(); - await const WebReleaseBundle(WebRendererMode.autoDetect, isWasm: false).build(environment); + await const WebReleaseBundle(WebRendererMode.auto, isWasm: false).build(environment); expect(environment.outputDir.childFile('index.html').readAsStringSync(), contains('/basehreftest/')); })); @@ -166,7 +166,7 @@ void main() { .writeAsStringSync('A'); environment.buildDir.childFile('main.dart.js').createSync(); - await const WebReleaseBundle(WebRendererMode.autoDetect, isWasm: false).build(environment); + await const WebReleaseBundle(WebRendererMode.auto, isWasm: false).build(environment); expect(environment.outputDir.childFile('foo.txt') .readAsStringSync(), 'A'); @@ -178,7 +178,7 @@ void main() { // Update to arbitrary resource file triggers rebuild. webResources.childFile('foo.txt').writeAsStringSync('B'); - await const WebReleaseBundle(WebRendererMode.autoDetect, isWasm: false).build(environment); + await const WebReleaseBundle(WebRendererMode.auto, isWasm: false).build(environment); expect(environment.outputDir.childFile('foo.txt') .readAsStringSync(), 'B'); @@ -361,7 +361,7 @@ void main() { ] )); - await Dart2JSTarget(WebRendererMode.autoDetect).build(environment); + await Dart2JSTarget(WebRendererMode.auto).build(environment); }, overrides: { ProcessManager: () => processManager, })); @@ -401,7 +401,7 @@ void main() { ] )); - await Dart2JSTarget(WebRendererMode.autoDetect).build(environment); + await Dart2JSTarget(WebRendererMode.auto).build(environment); }, overrides: { ProcessManager: () => processManager, })); @@ -437,7 +437,7 @@ void main() { ] )); - await Dart2JSTarget(WebRendererMode.autoDetect).build(environment); + await Dart2JSTarget(WebRendererMode.auto).build(environment); }, overrides: { ProcessManager: () => processManager, })); @@ -472,7 +472,7 @@ void main() { ] )); - await Dart2JSTarget(WebRendererMode.autoDetect).build(environment); + await Dart2JSTarget(WebRendererMode.auto).build(environment); }, overrides: { ProcessManager: () => processManager, })); @@ -510,7 +510,7 @@ void main() { ] )); - await Dart2JSTarget(WebRendererMode.autoDetect).build(environment); + await Dart2JSTarget(WebRendererMode.auto).build(environment); }, overrides: { ProcessManager: () => processManager, })); @@ -546,7 +546,7 @@ void main() { ] )); - await Dart2JSTarget(WebRendererMode.autoDetect).build(environment); + await Dart2JSTarget(WebRendererMode.auto).build(environment); }, overrides: { ProcessManager: () => processManager, })); @@ -570,7 +570,7 @@ void main() { .writeAsStringSync('file:///a.dart'); }, )); - await Dart2JSTarget(WebRendererMode.autoDetect).build(environment); + await Dart2JSTarget(WebRendererMode.auto).build(environment); expect(environment.buildDir.childFile('dart2js.d'), exists); final Depfile depfile = depfileService.parse(environment.buildDir.childFile('dart2js.d')); @@ -617,7 +617,7 @@ void main() { ] )); - await Dart2JSTarget(WebRendererMode.autoDetect).build(environment); + await Dart2JSTarget(WebRendererMode.auto).build(environment); }, overrides: { ProcessManager: () => processManager, })); @@ -651,7 +651,7 @@ void main() { ] )); - await Dart2JSTarget(WebRendererMode.autoDetect).build(environment); + await Dart2JSTarget(WebRendererMode.auto).build(environment); }, overrides: { ProcessManager: () => processManager, })); @@ -693,7 +693,7 @@ void main() { ] )); - await Dart2JSTarget(WebRendererMode.autoDetect).build(environment); + await Dart2JSTarget(WebRendererMode.auto).build(environment); }, overrides: { ProcessManager: () => processManager, })); @@ -922,7 +922,7 @@ void main() { environment.outputDir.childDirectory('a').childFile('a.txt') ..createSync(recursive: true) ..writeAsStringSync('A'); - await WebServiceWorker(globals.fs, WebRendererMode.autoDetect, isWasm: false).build(environment); + await WebServiceWorker(globals.fs, WebRendererMode.auto, isWasm: false).build(environment); expect(environment.outputDir.childFile('flutter_service_worker.js'), exists); // Contains file hash. @@ -941,7 +941,7 @@ void main() { environment.outputDir .childFile('index.html') .createSync(recursive: true); - await WebServiceWorker(globals.fs, WebRendererMode.autoDetect, isWasm: false).build(environment); + await WebServiceWorker(globals.fs, WebRendererMode.auto, isWasm: false).build(environment); expect(environment.outputDir.childFile('flutter_service_worker.js'), exists); // Contains file hash for both `/` and index.html. @@ -959,7 +959,7 @@ void main() { environment.outputDir .childFile('main.dart.js.map') .createSync(recursive: true); - await WebServiceWorker(globals.fs, WebRendererMode.autoDetect, isWasm: false).build(environment); + await WebServiceWorker(globals.fs, WebRendererMode.auto, isWasm: false).build(environment); // No caching of source maps. expect(environment.outputDir.childFile('flutter_service_worker.js').readAsStringSync(), @@ -991,7 +991,7 @@ void main() { ..createSync(recursive: true) ..writeAsStringSync('OL'); - await WebBuiltInAssets(globals.fs, WebRendererMode.autoDetect, isWasm: false).build(environment); + await WebBuiltInAssets(globals.fs, WebRendererMode.auto, isWasm: false).build(environment); // No caching of source maps. final String fileGeneratorsPath = environment.artifacts @@ -1008,7 +1008,7 @@ void main() { globals.fs.file('bin/cache/flutter_web_sdk/canvaskit/canvaskit.wasm') .createSync(recursive: true); - await WebBuiltInAssets(globals.fs, WebRendererMode.autoDetect, isWasm: true).build(environment); + await WebBuiltInAssets(globals.fs, WebRendererMode.auto, isWasm: true).build(environment); expect(environment.outputDir.childFile('main.dart.js').existsSync(), true); expect(environment.outputDir.childDirectory('canvaskit') @@ -1021,7 +1021,7 @@ void main() { ..createSync(recursive: true); canvasKitInput.writeAsStringSync('foo', flush: true); - await WebBuiltInAssets(globals.fs, WebRendererMode.autoDetect, isWasm: true).build(environment); + await WebBuiltInAssets(globals.fs, WebRendererMode.auto, isWasm: true).build(environment); final File canvasKitOutputBefore = environment.outputDir.childDirectory('canvaskit') .childFile('canvaskit.wasm'); @@ -1030,7 +1030,7 @@ void main() { canvasKitInput.writeAsStringSync('bar', flush: true); - await WebBuiltInAssets(globals.fs, WebRendererMode.autoDetect, isWasm: true).build(environment); + await WebBuiltInAssets(globals.fs, WebRendererMode.auto, isWasm: true).build(environment); final File canvasKitOutputAfter = environment.outputDir.childDirectory('canvaskit') .childFile('canvaskit.wasm'); diff --git a/packages/flutter_tools/test/general.shard/web/compile_web_test.dart b/packages/flutter_tools/test/general.shard/web/compile_web_test.dart index 3b13e7154b3..8e8fb227f92 100644 --- a/packages/flutter_tools/test/general.shard/web/compile_web_test.dart +++ b/packages/flutter_tools/test/general.shard/web/compile_web_test.dart @@ -39,7 +39,7 @@ void main() { TestBuildSystem.all(BuildResult(success: true), (Target target, Environment environment) { final WebServiceWorker webServiceWorker = target as WebServiceWorker; expect(webServiceWorker.isWasm, isTrue, reason: 'should be wasm'); - expect(webServiceWorker.webRenderer, WebRendererMode.autoDetect); + expect(webServiceWorker.webRenderer, WebRendererMode.auto); expect(environment.defines, { 'TargetFile': 'target', diff --git a/packages/flutter_tools/test/general.shard/web/devfs_web_test.dart b/packages/flutter_tools/test/general.shard/web/devfs_web_test.dart index 86ad8802e86..f65db99ee40 100644 --- a/packages/flutter_tools/test/general.shard/web/devfs_web_test.dart +++ b/packages/flutter_tools/test/general.shard/web/devfs_web_test.dart @@ -1052,7 +1052,7 @@ void main() { await webDevFS.create(); - expect(webDevFS.webAssetServer.webRenderer, WebRendererMode.autoDetect); + expect(webDevFS.webAssetServer.webRenderer, WebRendererMode.auto); await webDevFS.destroy(); }));