Skip to content

Commit ee10d2f

Browse files
authored
[web] Change --web-renderer default from auto to canvaskit (#149773)
- When `--web-renderer` is omitted, keep the value `null` until it later materializes to either `canvaskit` or `skwasm`. - No more hardcoded defaults anywhere. We use `WebRendererMode.defaultForJs/defaultForWasm` instead. - When in `--wasm` mode, the JS fallback is now `canvaskit` instead of `auto`. - Add test for defaulting to `skwasm` when `--wasm` is enabled. Fixes flutter/flutter#149826
1 parent 4e6e61d commit ee10d2f

File tree

9 files changed

+111
-62
lines changed

9 files changed

+111
-62
lines changed

packages/flutter_tools/lib/src/commands/build_web.dart

+8-9
Original file line numberDiff line numberDiff line change
@@ -142,9 +142,14 @@ class BuildWebCommand extends BuildSubCommand {
142142
? int.parse(dart2jsOptimizationLevelValue.substring(1))
143143
: optimizationLevel;
144144

145+
final String? webRendererString = stringArg(FlutterOptions.kWebRendererFlag);
146+
final WebRendererMode? webRenderer = webRendererString == null
147+
? null
148+
: WebRendererMode.values.byName(webRendererString);
149+
145150
final List<WebCompilerConfig> compilerConfigs;
146-
if (boolArg('wasm')) {
147-
if (stringArg(FlutterOptions.kWebRendererFlag) != argParser.defaultFor(FlutterOptions.kWebRendererFlag)) {
151+
if (boolArg(FlutterOptions.kWebWasmFlag)) {
152+
if (webRenderer != null) {
148153
throwToolExit('"--${FlutterOptions.kWebRendererFlag}" cannot be combined with "--${FlutterOptions.kWebWasmFlag}"');
149154
}
150155
globals.logger.printBox(
@@ -158,7 +163,6 @@ class BuildWebCommand extends BuildSubCommand {
158163
WasmCompilerConfig(
159164
optimizationLevel: optimizationLevel,
160165
stripWasm: boolArg('strip-wasm'),
161-
renderer: WebRendererMode.skwasm,
162166
),
163167
JsCompilerConfig(
164168
csp: boolArg('csp'),
@@ -167,21 +171,16 @@ class BuildWebCommand extends BuildSubCommand {
167171
nativeNullAssertions: boolArg('native-null-assertions'),
168172
noFrequencyBasedMinification: boolArg('no-frequency-based-minification'),
169173
sourceMaps: boolArg('source-maps'),
170-
renderer: WebRendererMode.canvaskit,
171174
)];
172175
} else {
173-
WebRendererMode webRenderer = WebRendererMode.auto;
174-
if (argParser.options.containsKey(FlutterOptions.kWebRendererFlag)) {
175-
webRenderer = WebRendererMode.values.byName(stringArg(FlutterOptions.kWebRendererFlag)!);
176-
}
177176
compilerConfigs = <WebCompilerConfig>[JsCompilerConfig(
178177
csp: boolArg('csp'),
179178
optimizationLevel: jsOptimizationLevel,
180179
dumpInfo: boolArg('dump-info'),
181180
nativeNullAssertions: boolArg('native-null-assertions'),
182181
noFrequencyBasedMinification: boolArg('no-frequency-based-minification'),
183182
sourceMaps: boolArg('source-maps'),
184-
renderer: webRenderer,
183+
renderer: webRenderer ?? WebRendererMode.defaultForJs,
185184
)];
186185
}
187186

packages/flutter_tools/lib/src/device.dart

+6-4
Original file line numberDiff line numberDiff line change
@@ -992,7 +992,7 @@ class DebuggingOptions {
992992
this.webEnableExpressionEvaluation = false,
993993
this.webHeaders = const <String, String>{},
994994
this.webLaunchUrl,
995-
this.webRenderer = WebRendererMode.auto,
995+
WebRendererMode? webRenderer,
996996
this.webUseWasm = false,
997997
this.vmserviceOutFile,
998998
this.fastStart = false,
@@ -1006,7 +1006,8 @@ class DebuggingOptions {
10061006
this.enableEmbedderApi = false,
10071007
this.usingCISystem = false,
10081008
this.debugLogsDirectoryPath,
1009-
}) : debuggingEnabled = true;
1009+
}) : debuggingEnabled = true,
1010+
webRenderer = webRenderer ?? WebRendererMode.getDefault(useWasm: webUseWasm);
10101011

10111012
DebuggingOptions.disabled(this.buildInfo, {
10121013
this.dartEntrypointArgs = const <String>[],
@@ -1023,7 +1024,7 @@ class DebuggingOptions {
10231024
this.webBrowserFlags = const <String>[],
10241025
this.webLaunchUrl,
10251026
this.webHeaders = const <String, String>{},
1026-
this.webRenderer = WebRendererMode.auto,
1027+
WebRendererMode? webRenderer,
10271028
this.webUseWasm = false,
10281029
this.cacheSkSL = false,
10291030
this.traceAllowlist,
@@ -1061,7 +1062,8 @@ class DebuggingOptions {
10611062
webEnableExpressionEvaluation = false,
10621063
nullAssertions = false,
10631064
nativeNullAssertions = false,
1064-
serveObservatory = false;
1065+
serveObservatory = false,
1066+
webRenderer = webRenderer ?? WebRendererMode.getDefault(useWasm: webUseWasm);
10651067

10661068
DebuggingOptions._({
10671069
required this.buildInfo,

packages/flutter_tools/lib/src/runner/flutter_command.dart

-1
Original file line numberDiff line numberDiff line change
@@ -711,7 +711,6 @@ abstract class FlutterCommand extends Command<void> {
711711
void usesWebRendererOption() {
712712
argParser.addOption(
713713
FlutterOptions.kWebRendererFlag,
714-
defaultsTo: WebRendererMode.auto.name,
715714
allowed: WebRendererMode.values.map((WebRendererMode e) => e.name),
716715
help: 'The renderer implementation to use when building for the web.',
717716
allowedHelp: CliEnum.allowedHelp(WebRendererMode.values)

packages/flutter_tools/lib/src/web/compile.dart

+15-12
Original file line numberDiff line numberDiff line change
@@ -185,16 +185,19 @@ enum WebRendererMode implements CliEnum {
185185
skwasm;
186186

187187
factory WebRendererMode.fromCliOption(String? webRendererString, {required bool useWasm}) {
188-
final WebRendererMode mode = webRendererString != null
189-
? WebRendererMode.values.byName(webRendererString)
190-
: WebRendererMode.auto;
191-
if (mode == WebRendererMode.auto && useWasm) {
192-
// Wasm defaults to skwasm
193-
return WebRendererMode.skwasm;
188+
if (webRendererString == null) {
189+
return getDefault(useWasm: useWasm);
194190
}
195-
return mode;
191+
return WebRendererMode.values.byName(webRendererString);
196192
}
197193

194+
static WebRendererMode getDefault({required bool useWasm}) {
195+
return useWasm ? defaultForWasm : defaultForJs;
196+
}
197+
198+
static const WebRendererMode defaultForJs = WebRendererMode.canvaskit;
199+
static const WebRendererMode defaultForWasm = WebRendererMode.skwasm;
200+
198201
@override
199202
String get cliName => kebabCase(name);
200203

@@ -210,22 +213,22 @@ enum WebRendererMode implements CliEnum {
210213
};
211214

212215
Iterable<String> get dartDefines => switch (this) {
213-
WebRendererMode.auto => <String>[
216+
auto => <String>[
214217
'FLUTTER_WEB_AUTO_DETECT=true',
215218
],
216-
WebRendererMode.canvaskit => <String>[
219+
canvaskit => <String>[
217220
'FLUTTER_WEB_AUTO_DETECT=false',
218221
'FLUTTER_WEB_USE_SKIA=true',
219222
],
220-
WebRendererMode.html => <String>[
223+
html => <String>[
221224
'FLUTTER_WEB_AUTO_DETECT=false',
222225
'FLUTTER_WEB_USE_SKIA=false',
223226
],
224-
WebRendererMode.skwasm => <String>[
227+
skwasm => <String>[
225228
'FLUTTER_WEB_AUTO_DETECT=false',
226229
'FLUTTER_WEB_USE_SKIA=false',
227230
'FLUTTER_WEB_USE_SKWASM=true',
228-
]
231+
],
229232
};
230233

231234
List<String> updateDartDefines(List<String> inputDefines) {

packages/flutter_tools/lib/src/web/compiler_config.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ class JsCompilerConfig extends WebCompilerConfig {
5151
super.optimizationLevel = WebCompilerConfig.kDefaultOptimizationLevel,
5252
this.noFrequencyBasedMinification = false,
5353
this.sourceMaps = true,
54-
super.renderer = WebRendererMode.auto,
54+
super.renderer = WebRendererMode.defaultForJs,
5555
});
5656

5757
/// Instantiates [JsCompilerConfig] suitable for the `flutter run` command.
@@ -136,7 +136,7 @@ class WasmCompilerConfig extends WebCompilerConfig {
136136
const WasmCompilerConfig({
137137
super.optimizationLevel = WebCompilerConfig.kDefaultOptimizationLevel,
138138
this.stripWasm = true,
139-
super.renderer = WebRendererMode.auto,
139+
super.renderer = WebRendererMode.defaultForWasm,
140140
});
141141

142142
/// Build environment for [stripWasm].

packages/flutter_tools/test/commands.shard/hermetic/build_web_test.dart

+23-2
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ void main() {
274274
ProcessManager: () => processManager,
275275
});
276276

277-
testUsingContext('Defaults to web renderer auto mode when no option is specified', () async {
277+
testUsingContext('Defaults to web renderer canvaskit mode when no option is specified', () async {
278278
final TestWebBuildCommand buildCommand = TestWebBuildCommand(fileSystem: fileSystem);
279279
final CommandRunner<void> runner = createTestCommandRunner(buildCommand);
280280
setupFileSystemForEndToEndTest(fileSystem);
@@ -288,7 +288,28 @@ void main() {
288288
expect(target, isA<WebServiceWorker>());
289289
final List<WebCompilerConfig> configs = (target as WebServiceWorker).compileConfigs;
290290
expect(configs.length, 1);
291-
expect(configs.first.renderer, WebRendererMode.auto);
291+
expect(configs.first.renderer, WebRendererMode.canvaskit);
292+
}),
293+
});
294+
295+
testUsingContext('Defaults to web renderer skwasm mode for wasm when no option is specified', () async {
296+
final TestWebBuildCommand buildCommand = TestWebBuildCommand(fileSystem: fileSystem);
297+
final CommandRunner<void> runner = createTestCommandRunner(buildCommand);
298+
setupFileSystemForEndToEndTest(fileSystem);
299+
await runner.run(<String>['build', 'web', '--no-pub', '--wasm']);
300+
}, overrides: <Type, Generator>{
301+
Platform: () => fakePlatform,
302+
FileSystem: () => fileSystem,
303+
FeatureFlags: () => TestFeatureFlags(isWebEnabled: true),
304+
ProcessManager: () => processManager,
305+
BuildSystem: () => TestBuildSystem.all(BuildResult(success: true), (Target target, Environment environment) {
306+
expect(target, isA<WebServiceWorker>());
307+
final List<WebCompilerConfig> configs = (target as WebServiceWorker).compileConfigs;
308+
expect(configs.length, 2);
309+
expect(configs[0].renderer, WebRendererMode.skwasm);
310+
expect(configs[0].compileTarget, CompileTarget.wasm);
311+
expect(configs[1].renderer, WebRendererMode.canvaskit);
312+
expect(configs[1].compileTarget, CompileTarget.js);
292313
}),
293314
});
294315

packages/flutter_tools/test/general.shard/build_system/targets/web_defines_test.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,13 @@ void main() {
3535
expect(dartDefines, <String>['FLUTTER_WEB_AUTO_DETECT=true']);
3636
});
3737

38-
test('canvaskit web-renderer with no dart-defines', () {
38+
test('canvaskit web-renderer with existing dart-defines', () {
3939
dartDefines = <String>['FLUTTER_WEB_USE_SKIA=false'];
4040
dartDefines = WebRendererMode.canvaskit.updateDartDefines(dartDefines);
4141
expect(dartDefines, <String>['FLUTTER_WEB_AUTO_DETECT=false','FLUTTER_WEB_USE_SKIA=true']);
4242
});
4343

44-
test('html web-renderer with no dart-defines', () {
44+
test('html web-renderer with existing dart-defines', () {
4545
dartDefines = <String>['FLUTTER_WEB_USE_SKIA=true'];
4646
dartDefines = WebRendererMode.html.updateDartDefines(dartDefines);
4747
expect(dartDefines, <String>['FLUTTER_WEB_AUTO_DETECT=false','FLUTTER_WEB_USE_SKIA=false']);

0 commit comments

Comments
 (0)