Skip to content

Commit d744da1

Browse files
authored
[tool] Emit a deprecation warning for some values of --web-renderer. (#156376)
This PR emits a blue warning text when using `flutter ... --web-renderer=html|auto`. (The message is similar to the one that we emit at run-time) ## Issues Fixes flutter/flutter#154878 See also: flutter/engine#55709
1 parent 4c3cd70 commit d744da1

File tree

7 files changed

+121
-0
lines changed

7 files changed

+121
-0
lines changed

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,9 @@ class BuildWebCommand extends BuildSubCommand {
149149
final bool sourceMaps = boolArg('source-maps');
150150

151151
final List<WebCompilerConfig> compilerConfigs;
152+
if (webRenderer != null && webRenderer.isDeprecated) {
153+
globals.logger.printWarning(webRenderer.deprecationWarning);
154+
}
152155
if (boolArg(FlutterOptions.kWebWasmFlag)) {
153156
if (webRenderer != null) {
154157
throwToolExit('"--${FlutterOptions.kWebRendererFlag}" cannot be combined with "--${FlutterOptions.kWebWasmFlag}"');

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -655,6 +655,10 @@ class RunCommand extends RunCommandBase {
655655
throwToolExit('--wasm is only supported on the web platform');
656656
}
657657

658+
if (webRenderer.isDeprecated) {
659+
globals.logger.printWarning(webRenderer.deprecationWarning);
660+
}
661+
658662
if (webRenderer == WebRendererMode.skwasm && !useWasm) {
659663
throwToolExit('Skwasm renderer requires --wasm');
660664
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -532,6 +532,10 @@ class TestCommand extends FlutterCommand with DeviceBasedDevelopmentArtifacts {
532532
throwToolExit('Skwasm renderer requires --wasm');
533533
}
534534

535+
if (webRenderer.isDeprecated) {
536+
globals.logger.printWarning(webRenderer.deprecationWarning);
537+
}
538+
535539
Device? integrationTestDevice;
536540
if (_isIntegrationTest) {
537541
integrationTestDevice = await findTargetDevice();

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,21 @@ enum WebRendererMode implements CliEnum {
199199
static const WebRendererMode defaultForJs = WebRendererMode.canvaskit;
200200
static const WebRendererMode defaultForWasm = WebRendererMode.skwasm;
201201

202+
/// Returns whether the WebRendererMode is considered deprecated or not.
203+
///
204+
/// Deprecated modes: auto, html.
205+
bool get isDeprecated => switch (this) {
206+
auto => true,
207+
canvaskit => false,
208+
html => true,
209+
skwasm => false
210+
};
211+
212+
/// Returns a consistent deprecation warning for the WebRendererMode.
213+
String get deprecationWarning =>
214+
'The HTML Renderer is deprecated. Do not use "--web-renderer=$name".'
215+
'\nSee: https://docs.flutter.dev/to/web-html-renderer-deprecation';
216+
202217
@override
203218
String get cliName => kebabCase(name);
204219

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import 'package:args/command_runner.dart';
66
import 'package:file/memory.dart';
77
import 'package:flutter_tools/src/artifacts.dart';
8+
import 'package:flutter_tools/src/base/common.dart';
89
import 'package:flutter_tools/src/base/file_system.dart';
910
import 'package:flutter_tools/src/base/logger.dart';
1011
import 'package:flutter_tools/src/base/platform.dart';
@@ -378,6 +379,37 @@ void main() {
378379
ProcessManager: () => processManager,
379380
});
380381

382+
// Tests whether using a deprecated webRenderer toggles a warningText.
383+
Future<void> testWebRendererDeprecationMessage(WebRendererMode webRenderer) async {
384+
testUsingContext('Using --web-renderer=${webRenderer.name} triggers a warningText.', () async {
385+
// Run the command so it parses --web-renderer, but ignore all errors.
386+
// We only care about the logger.
387+
try {
388+
final TestWebBuildCommand buildCommand = TestWebBuildCommand(fileSystem: fileSystem);
389+
await createTestCommandRunner(buildCommand).run(<String>[
390+
'build',
391+
'web',
392+
'--no-pub',
393+
'--web-renderer=${webRenderer.name}',
394+
]);
395+
} on ToolExit catch (error) {
396+
expect(error, isA<ToolExit>());
397+
}
398+
expect(logger.warningText, contains(
399+
'See: https://docs.flutter.dev/to/web-html-renderer-deprecation'
400+
));
401+
}, overrides: <Type, Generator>{
402+
Platform: () => fakePlatform,
403+
FileSystem: () => fileSystem,
404+
ProcessManager: () => processManager,
405+
Logger: () => logger,
406+
});
407+
}
408+
/// Do test all the deprecated WebRendererModes
409+
WebRendererMode.values
410+
.where((WebRendererMode mode) => mode.isDeprecated)
411+
.forEach(testWebRendererDeprecationMessage);
412+
381413
testUsingContext('flutter build web option visibility', () async {
382414
final TestWebBuildCommand buildCommand = TestWebBuildCommand(fileSystem: fileSystem);
383415
createTestCommandRunner(buildCommand);

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

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1023,6 +1023,35 @@ void main() {
10231023
DeviceManager: () => testDeviceManager,
10241024
});
10251025

1026+
// Tests whether using a deprecated webRenderer toggles a warningText.
1027+
Future<void> testWebRendererDeprecationMessage(WebRendererMode webRenderer) async {
1028+
testUsingContext('Using --web-renderer=${webRenderer.name} triggers a warningText.', () async {
1029+
// Run the command so it parses --web-renderer, but ignore all errors.
1030+
// We only care about the logger.
1031+
try {
1032+
await createTestCommandRunner(RunCommand()).run(<String>[
1033+
'run',
1034+
'--no-pub',
1035+
'--web-renderer=${webRenderer.name}',
1036+
]);
1037+
} on ToolExit catch (error) {
1038+
expect(error, isA<ToolExit>());
1039+
}
1040+
expect(logger.warningText, contains(
1041+
'See: https://docs.flutter.dev/to/web-html-renderer-deprecation'
1042+
));
1043+
}, overrides: <Type, Generator>{
1044+
FileSystem: () => fileSystem,
1045+
ProcessManager: () => FakeProcessManager.any(),
1046+
Logger: () => logger,
1047+
DeviceManager: () => testDeviceManager,
1048+
});
1049+
}
1050+
/// Do test all the deprecated WebRendererModes
1051+
WebRendererMode.values
1052+
.where((WebRendererMode mode) => mode.isDeprecated)
1053+
.forEach(testWebRendererDeprecationMessage);
1054+
10261055
testUsingContext('accepts headers with commas in them', () async {
10271056
final RunCommand command = RunCommand();
10281057
await expectLater(

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

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1426,6 +1426,40 @@ dev_dependencies:
14261426
});
14271427
});
14281428

1429+
// Tests whether using a deprecated webRenderer toggles a warningText.
1430+
Future<void> testWebRendererDeprecationMessage(WebRendererMode webRenderer) async {
1431+
testUsingContext('Using --web-renderer=${webRenderer.name} triggers a warningText.', () async {
1432+
// Run the command so it parses --web-renderer, but ignore all errors.
1433+
// We only care about the logger.
1434+
try {
1435+
final FakeFlutterTestRunner testRunner = FakeFlutterTestRunner(0);
1436+
1437+
final TestCommand testCommand = TestCommand(testRunner: testRunner);
1438+
await createTestCommandRunner(testCommand).run(<String>[
1439+
'test',
1440+
'web',
1441+
'--no-pub',
1442+
'--platform=chrome',
1443+
'--web-renderer=${webRenderer.name}',
1444+
]);
1445+
} on ToolExit catch (error) {
1446+
expect(error, isA<ToolExit>());
1447+
}
1448+
expect(logger.warningText, contains(
1449+
'See: https://docs.flutter.dev/to/web-html-renderer-deprecation'
1450+
));
1451+
}, overrides: <Type, Generator>{
1452+
FileSystem: () => fs,
1453+
ProcessManager: () => FakeProcessManager.any(),
1454+
Logger: () => logger,
1455+
});
1456+
}
1457+
/// Do test all the deprecated WebRendererModes
1458+
WebRendererMode.values
1459+
.where((WebRendererMode mode) => mode.isDeprecated)
1460+
.forEach(testWebRendererDeprecationMessage);
1461+
1462+
14291463
testUsingContext('Can test in a pub workspace',
14301464
() async {
14311465
final String root = fs.path.rootPrefix(fs.currentDirectory.absolute.path);

0 commit comments

Comments
 (0)