From d744da18e5a4efc4a0437476bbcb2f9233d85b50 Mon Sep 17 00:00:00 2001 From: David Iglesias Date: Mon, 7 Oct 2024 18:39:06 -0700 Subject: [PATCH] [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 https://github.com/flutter/flutter/issues/154878 See also: https://github.com/flutter/engine/pull/55709 --- .../lib/src/commands/build_web.dart | 3 ++ .../flutter_tools/lib/src/commands/run.dart | 4 +++ .../flutter_tools/lib/src/commands/test.dart | 4 +++ .../flutter_tools/lib/src/web/compile.dart | 15 ++++++++ .../hermetic/build_web_test.dart | 32 +++++++++++++++++ .../commands.shard/hermetic/run_test.dart | 29 ++++++++++++++++ .../commands.shard/hermetic/test_test.dart | 34 +++++++++++++++++++ 7 files changed, 121 insertions(+) diff --git a/packages/flutter_tools/lib/src/commands/build_web.dart b/packages/flutter_tools/lib/src/commands/build_web.dart index 24ed7e57db..5aa0266327 100644 --- a/packages/flutter_tools/lib/src/commands/build_web.dart +++ b/packages/flutter_tools/lib/src/commands/build_web.dart @@ -149,6 +149,9 @@ class BuildWebCommand extends BuildSubCommand { final bool sourceMaps = boolArg('source-maps'); final List compilerConfigs; + if (webRenderer != null && webRenderer.isDeprecated) { + globals.logger.printWarning(webRenderer.deprecationWarning); + } if (boolArg(FlutterOptions.kWebWasmFlag)) { if (webRenderer != null) { throwToolExit('"--${FlutterOptions.kWebRendererFlag}" cannot be combined with "--${FlutterOptions.kWebWasmFlag}"'); diff --git a/packages/flutter_tools/lib/src/commands/run.dart b/packages/flutter_tools/lib/src/commands/run.dart index 57a8643b2f..2548b68b01 100644 --- a/packages/flutter_tools/lib/src/commands/run.dart +++ b/packages/flutter_tools/lib/src/commands/run.dart @@ -655,6 +655,10 @@ class RunCommand extends RunCommandBase { throwToolExit('--wasm is only supported on the web platform'); } + if (webRenderer.isDeprecated) { + globals.logger.printWarning(webRenderer.deprecationWarning); + } + if (webRenderer == WebRendererMode.skwasm && !useWasm) { throwToolExit('Skwasm renderer requires --wasm'); } diff --git a/packages/flutter_tools/lib/src/commands/test.dart b/packages/flutter_tools/lib/src/commands/test.dart index 8db5cb5b59..0183f843bb 100644 --- a/packages/flutter_tools/lib/src/commands/test.dart +++ b/packages/flutter_tools/lib/src/commands/test.dart @@ -532,6 +532,10 @@ class TestCommand extends FlutterCommand with DeviceBasedDevelopmentArtifacts { throwToolExit('Skwasm renderer requires --wasm'); } + if (webRenderer.isDeprecated) { + globals.logger.printWarning(webRenderer.deprecationWarning); + } + Device? integrationTestDevice; if (_isIntegrationTest) { integrationTestDevice = await findTargetDevice(); diff --git a/packages/flutter_tools/lib/src/web/compile.dart b/packages/flutter_tools/lib/src/web/compile.dart index aa0fec8030..c7082cd66a 100644 --- a/packages/flutter_tools/lib/src/web/compile.dart +++ b/packages/flutter_tools/lib/src/web/compile.dart @@ -199,6 +199,21 @@ enum WebRendererMode implements CliEnum { static const WebRendererMode defaultForJs = WebRendererMode.canvaskit; static const WebRendererMode defaultForWasm = WebRendererMode.skwasm; + /// Returns whether the WebRendererMode is considered deprecated or not. + /// + /// Deprecated modes: auto, html. + bool get isDeprecated => switch (this) { + auto => true, + canvaskit => false, + html => true, + skwasm => false + }; + + /// Returns a consistent deprecation warning for the WebRendererMode. + String get deprecationWarning => + 'The HTML Renderer is deprecated. Do not use "--web-renderer=$name".' + '\nSee: https://docs.flutter.dev/to/web-html-renderer-deprecation'; + @override String get cliName => kebabCase(name); diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_web_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_web_test.dart index 0afbb2a738..a22823c183 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/build_web_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/build_web_test.dart @@ -5,6 +5,7 @@ import 'package:args/command_runner.dart'; import 'package:file/memory.dart'; import 'package:flutter_tools/src/artifacts.dart'; +import 'package:flutter_tools/src/base/common.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/platform.dart'; @@ -378,6 +379,37 @@ void main() { ProcessManager: () => processManager, }); + // Tests whether using a deprecated webRenderer toggles a warningText. + Future testWebRendererDeprecationMessage(WebRendererMode webRenderer) async { + testUsingContext('Using --web-renderer=${webRenderer.name} triggers a warningText.', () async { + // Run the command so it parses --web-renderer, but ignore all errors. + // We only care about the logger. + try { + final TestWebBuildCommand buildCommand = TestWebBuildCommand(fileSystem: fileSystem); + await createTestCommandRunner(buildCommand).run([ + 'build', + 'web', + '--no-pub', + '--web-renderer=${webRenderer.name}', + ]); + } on ToolExit catch (error) { + expect(error, isA()); + } + expect(logger.warningText, contains( + 'See: https://docs.flutter.dev/to/web-html-renderer-deprecation' + )); + }, overrides: { + Platform: () => fakePlatform, + FileSystem: () => fileSystem, + ProcessManager: () => processManager, + Logger: () => logger, + }); + } + /// Do test all the deprecated WebRendererModes + WebRendererMode.values + .where((WebRendererMode mode) => mode.isDeprecated) + .forEach(testWebRendererDeprecationMessage); + testUsingContext('flutter build web option visibility', () async { final TestWebBuildCommand buildCommand = TestWebBuildCommand(fileSystem: fileSystem); createTestCommandRunner(buildCommand); 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 6e74270b3d..c49ceba6d5 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart @@ -1023,6 +1023,35 @@ void main() { DeviceManager: () => testDeviceManager, }); + // Tests whether using a deprecated webRenderer toggles a warningText. + Future testWebRendererDeprecationMessage(WebRendererMode webRenderer) async { + testUsingContext('Using --web-renderer=${webRenderer.name} triggers a warningText.', () async { + // Run the command so it parses --web-renderer, but ignore all errors. + // We only care about the logger. + try { + await createTestCommandRunner(RunCommand()).run([ + 'run', + '--no-pub', + '--web-renderer=${webRenderer.name}', + ]); + } on ToolExit catch (error) { + expect(error, isA()); + } + expect(logger.warningText, contains( + 'See: https://docs.flutter.dev/to/web-html-renderer-deprecation' + )); + }, overrides: { + FileSystem: () => fileSystem, + ProcessManager: () => FakeProcessManager.any(), + Logger: () => logger, + DeviceManager: () => testDeviceManager, + }); + } + /// Do test all the deprecated WebRendererModes + WebRendererMode.values + .where((WebRendererMode mode) => mode.isDeprecated) + .forEach(testWebRendererDeprecationMessage); + testUsingContext('accepts headers with commas in them', () async { final RunCommand command = RunCommand(); await expectLater( diff --git a/packages/flutter_tools/test/commands.shard/hermetic/test_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/test_test.dart index e7072af09e..ed8b362fb3 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/test_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/test_test.dart @@ -1426,6 +1426,40 @@ dev_dependencies: }); }); + // Tests whether using a deprecated webRenderer toggles a warningText. + Future testWebRendererDeprecationMessage(WebRendererMode webRenderer) async { + testUsingContext('Using --web-renderer=${webRenderer.name} triggers a warningText.', () async { + // Run the command so it parses --web-renderer, but ignore all errors. + // We only care about the logger. + try { + final FakeFlutterTestRunner testRunner = FakeFlutterTestRunner(0); + + final TestCommand testCommand = TestCommand(testRunner: testRunner); + await createTestCommandRunner(testCommand).run([ + 'test', + 'web', + '--no-pub', + '--platform=chrome', + '--web-renderer=${webRenderer.name}', + ]); + } on ToolExit catch (error) { + expect(error, isA()); + } + expect(logger.warningText, contains( + 'See: https://docs.flutter.dev/to/web-html-renderer-deprecation' + )); + }, overrides: { + FileSystem: () => fs, + ProcessManager: () => FakeProcessManager.any(), + Logger: () => logger, + }); + } + /// Do test all the deprecated WebRendererModes + WebRendererMode.values + .where((WebRendererMode mode) => mode.isDeprecated) + .forEach(testWebRendererDeprecationMessage); + + testUsingContext('Can test in a pub workspace', () async { final String root = fs.path.rootPrefix(fs.currentDirectory.absolute.path);