Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

flutter_tools: Flutter Web CLI cleanup #124564

Merged
merged 3 commits into from
Apr 12, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/flutter_tools/lib/src/build_info.dart
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ class BuildInfo {
List<String>? dartDefines,
this.bundleSkSLPath,
List<String>? dartExperiments,
this.webRenderer = WebRendererMode.autoDetect,
this.webRenderer = WebRendererMode.auto,
required this.treeShakeIcons,
this.performanceMeasurementFile,
this.dartDefineConfigJsonMap,
Expand Down
2 changes: 1 addition & 1 deletion packages/flutter_tools/lib/src/isolated/devfs_web.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
74 changes: 27 additions & 47 deletions packages/flutter_tools/lib/src/runner/flutter_command.dart
Original file line number Diff line number Diff line change
Expand Up @@ -157,36 +157,6 @@ abstract class FlutterCommand extends Command<void> {
/// 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<String, WebRendererMode> _webRendererModeMap =
<String, WebRendererMode> {
'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<WebRendererMode, Iterable<String>> _webRendererDartDefines =
<WebRendererMode, Iterable<String>> {
WebRendererMode.autoDetect: <String>[
'FLUTTER_WEB_AUTO_DETECT=true',
],
WebRendererMode.canvaskit: <String>[
'FLUTTER_WEB_AUTO_DETECT=false',
'FLUTTER_WEB_USE_SKIA=true',
],
WebRendererMode.html: <String>[
'FLUTTER_WEB_AUTO_DETECT=false',
'FLUTTER_WEB_USE_SKIA=false',
],
WebRendererMode.skwasm: <String>[
'FLUTTER_WEB_AUTO_DETECT=false',
'FLUTTER_WEB_USE_SKIA=false',
'FLUTTER_WEB_USE_SKWASM=true',
]
};

@override
ArgParser get argParser => _argParser;
final ArgParser _argParser = ArgParser(
Expand Down Expand Up @@ -668,15 +638,10 @@ abstract class FlutterCommand extends Command<void> {
void usesWebRendererOption() {
argParser.addOption(
FlutterOptions.kWebRendererFlag,
defaultsTo: 'auto',
allowed: <String>['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: <String, String>{
'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<String, String>.fromEntries(WebRendererMode.values.map((WebRendererMode e) => MapEntry<String, String>(e.name, e.helpText)))
);
}

Expand Down Expand Up @@ -1236,12 +1201,9 @@ abstract class FlutterCommand extends Command<void> {
final Map<String, Object>? defineConfigJsonMap = extractDartDefineConfigJsonMap();
List<String> 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);
}

Expand Down Expand Up @@ -1427,10 +1389,7 @@ abstract class FlutterCommand extends Command<void> {
&& dartDefines.any((String d) => d.startsWith('FLUTTER_WEB_USE_SKIA='))) {
dartDefinesSet.removeWhere((String d) => d.startsWith('FLUTTER_WEB_USE_SKIA='));
}
final Iterable<String>? webRendererDefine = _webRendererDartDefines[webRenderer];
if (webRendererDefine != null) {
dartDefinesSet.addAll(webRendererDefine);
}
dartDefinesSet.addAll(webRenderer.dartDefines);
return dartDefinesSet.toList();
}

Expand Down Expand Up @@ -1778,3 +1737,24 @@ enum NonNullSafeBuilds {
allowed,
notAllowed,
}

extension on WebRendererMode {
Iterable<String> get dartDefines => switch (this) {
kevmoo marked this conversation as resolved.
Show resolved Hide resolved
WebRendererMode.auto => <String>[
'FLUTTER_WEB_AUTO_DETECT=true',
],
WebRendererMode.canvaskit => <String>[
'FLUTTER_WEB_AUTO_DETECT=false',
'FLUTTER_WEB_USE_SKIA=true',
],
WebRendererMode.html => <String>[
'FLUTTER_WEB_AUTO_DETECT=false',
'FLUTTER_WEB_USE_SKIA=false',
],
WebRendererMode.skwasm => <String>[
'FLUTTER_WEB_AUTO_DETECT=false',
'FLUTTER_WEB_USE_SKIA=false',
'FLUTTER_WEB_USE_SKWASM=true',
]
};
}
16 changes: 10 additions & 6 deletions packages/flutter_tools/lib/src/web/compile.dart
Original file line number Diff line number Diff line change
Expand Up @@ -135,18 +135,22 @@ class WebBuilder {
/// Web rendering backend mode.
enum WebRendererMode {
/// Auto detects which rendering backend to use.
autoDetect,
auto(helpText: 'Use the HTML renderer on mobile devices, and CanvasKit on desktop devices.'),
/// Always uses canvaskit.
canvaskit,
canvaskit(helpText: 'Always use the CanvasKit renderer. This renderer uses WebGL and WebAssembly to render graphics.'),
/// Always uses html.
html,
html(helpText: 'Always use the HTML renderer. This renderer uses a combination of HTML, CSS, SVG, 2D Canvas, and WebGL.'),
/// Always use skwasm.
skwasm,
skwasm(helpText: 'Always use the experimental skwasm renderer.');

const WebRendererMode({required this.helpText});

final String helpText;
kevmoo marked this conversation as resolved.
Show resolved Hide resolved
}

/// The correct precompiled artifact to use for each build and render mode.
const Map<WebRendererMode, Map<NullSafetyMode, HostArtifact>> kDartSdkJsArtifactMap = <WebRendererMode, Map<NullSafetyMode, HostArtifact>>{
WebRendererMode.autoDetect: <NullSafetyMode, HostArtifact> {
WebRendererMode.auto: <NullSafetyMode, HostArtifact> {
NullSafetyMode.sound: HostArtifact.webPrecompiledCanvaskitAndHtmlSoundSdk,
NullSafetyMode.unsound: HostArtifact.webPrecompiledCanvaskitAndHtmlSdk,
},
Expand All @@ -162,7 +166,7 @@ const Map<WebRendererMode, Map<NullSafetyMode, HostArtifact>> kDartSdkJsArtifact

/// The correct source map artifact to use for each build and render mode.
const Map<WebRendererMode, Map<NullSafetyMode, HostArtifact>> kDartSdkJsMapArtifactMap = <WebRendererMode, Map<NullSafetyMode, HostArtifact>>{
WebRendererMode.autoDetect: <NullSafetyMode, HostArtifact> {
WebRendererMode.auto: <NullSafetyMode, HostArtifact> {
NullSafetyMode.sound: HostArtifact.webPrecompiledCanvaskitAndHtmlSoundSdkSourcemaps,
NullSafetyMode.unsound: HostArtifact.webPrecompiledCanvaskitAndHtmlSdkSourcemaps,
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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, <String>['FLUTTER_WEB_AUTO_DETECT=true']);
});

Expand All @@ -945,7 +945,7 @@ void main() {

test('auto web-renderer with existing dart-defines', () {
dartDefines = <String>['FLUTTER_WEB_USE_SKIA=false'];
dartDefines = FlutterCommand.updateDartDefines(dartDefines, WebRendererMode.autoDetect);
dartDefines = FlutterCommand.updateDartDefines(dartDefines, WebRendererMode.auto);
expect(dartDefines, <String>['FLUTTER_WEB_AUTO_DETECT=true']);
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}));
Expand All @@ -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')
Expand All @@ -131,7 +131,7 @@ void main() {
<!DOCTYPE html><html><base href="$kBaseHrefPlaceholder"><head></head></html>
''');
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/'));
}));
Expand All @@ -144,7 +144,7 @@ void main() {
<!DOCTYPE html><html><head><base href='/basehreftest/'></head></html>
''');
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/'));
}));
Expand All @@ -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');
Expand All @@ -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');
Expand Down Expand Up @@ -361,7 +361,7 @@ void main() {
]
));

await Dart2JSTarget(WebRendererMode.autoDetect).build(environment);
await Dart2JSTarget(WebRendererMode.auto).build(environment);
}, overrides: <Type, Generator>{
ProcessManager: () => processManager,
}));
Expand Down Expand Up @@ -401,7 +401,7 @@ void main() {
]
));

await Dart2JSTarget(WebRendererMode.autoDetect).build(environment);
await Dart2JSTarget(WebRendererMode.auto).build(environment);
}, overrides: <Type, Generator>{
ProcessManager: () => processManager,
}));
Expand Down Expand Up @@ -437,7 +437,7 @@ void main() {
]
));

await Dart2JSTarget(WebRendererMode.autoDetect).build(environment);
await Dart2JSTarget(WebRendererMode.auto).build(environment);
}, overrides: <Type, Generator>{
ProcessManager: () => processManager,
}));
Expand Down Expand Up @@ -472,7 +472,7 @@ void main() {
]
));

await Dart2JSTarget(WebRendererMode.autoDetect).build(environment);
await Dart2JSTarget(WebRendererMode.auto).build(environment);
}, overrides: <Type, Generator>{
ProcessManager: () => processManager,
}));
Expand Down Expand Up @@ -510,7 +510,7 @@ void main() {
]
));

await Dart2JSTarget(WebRendererMode.autoDetect).build(environment);
await Dart2JSTarget(WebRendererMode.auto).build(environment);
}, overrides: <Type, Generator>{
ProcessManager: () => processManager,
}));
Expand Down Expand Up @@ -546,7 +546,7 @@ void main() {
]
));

await Dart2JSTarget(WebRendererMode.autoDetect).build(environment);
await Dart2JSTarget(WebRendererMode.auto).build(environment);
}, overrides: <Type, Generator>{
ProcessManager: () => processManager,
}));
Expand All @@ -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'));
Expand Down Expand Up @@ -617,7 +617,7 @@ void main() {
]
));

await Dart2JSTarget(WebRendererMode.autoDetect).build(environment);
await Dart2JSTarget(WebRendererMode.auto).build(environment);
}, overrides: <Type, Generator>{
ProcessManager: () => processManager,
}));
Expand Down Expand Up @@ -651,7 +651,7 @@ void main() {
]
));

await Dart2JSTarget(WebRendererMode.autoDetect).build(environment);
await Dart2JSTarget(WebRendererMode.auto).build(environment);
}, overrides: <Type, Generator>{
ProcessManager: () => processManager,
}));
Expand Down Expand Up @@ -693,7 +693,7 @@ void main() {
]
));

await Dart2JSTarget(WebRendererMode.autoDetect).build(environment);
await Dart2JSTarget(WebRendererMode.auto).build(environment);
}, overrides: <Type, Generator>{
ProcessManager: () => processManager,
}));
Expand Down Expand Up @@ -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.
Expand All @@ -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.
Expand All @@ -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(),
Expand Down Expand Up @@ -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
Expand All @@ -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')
Expand All @@ -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');
Expand All @@ -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');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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, <String, String>{
'TargetFile': 'target',
Expand Down