[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
This commit is contained in:
David Iglesias 2024-10-07 18:39:06 -07:00 committed by GitHub
parent 4c3cd70e33
commit d744da18e5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 121 additions and 0 deletions

View File

@ -149,6 +149,9 @@ class BuildWebCommand extends BuildSubCommand {
final bool sourceMaps = boolArg('source-maps'); final bool sourceMaps = boolArg('source-maps');
final List<WebCompilerConfig> compilerConfigs; final List<WebCompilerConfig> compilerConfigs;
if (webRenderer != null && webRenderer.isDeprecated) {
globals.logger.printWarning(webRenderer.deprecationWarning);
}
if (boolArg(FlutterOptions.kWebWasmFlag)) { if (boolArg(FlutterOptions.kWebWasmFlag)) {
if (webRenderer != null) { if (webRenderer != null) {
throwToolExit('"--${FlutterOptions.kWebRendererFlag}" cannot be combined with "--${FlutterOptions.kWebWasmFlag}"'); throwToolExit('"--${FlutterOptions.kWebRendererFlag}" cannot be combined with "--${FlutterOptions.kWebWasmFlag}"');

View File

@ -655,6 +655,10 @@ class RunCommand extends RunCommandBase {
throwToolExit('--wasm is only supported on the web platform'); throwToolExit('--wasm is only supported on the web platform');
} }
if (webRenderer.isDeprecated) {
globals.logger.printWarning(webRenderer.deprecationWarning);
}
if (webRenderer == WebRendererMode.skwasm && !useWasm) { if (webRenderer == WebRendererMode.skwasm && !useWasm) {
throwToolExit('Skwasm renderer requires --wasm'); throwToolExit('Skwasm renderer requires --wasm');
} }

View File

@ -532,6 +532,10 @@ class TestCommand extends FlutterCommand with DeviceBasedDevelopmentArtifacts {
throwToolExit('Skwasm renderer requires --wasm'); throwToolExit('Skwasm renderer requires --wasm');
} }
if (webRenderer.isDeprecated) {
globals.logger.printWarning(webRenderer.deprecationWarning);
}
Device? integrationTestDevice; Device? integrationTestDevice;
if (_isIntegrationTest) { if (_isIntegrationTest) {
integrationTestDevice = await findTargetDevice(); integrationTestDevice = await findTargetDevice();

View File

@ -199,6 +199,21 @@ enum WebRendererMode implements CliEnum {
static const WebRendererMode defaultForJs = WebRendererMode.canvaskit; static const WebRendererMode defaultForJs = WebRendererMode.canvaskit;
static const WebRendererMode defaultForWasm = WebRendererMode.skwasm; 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 @override
String get cliName => kebabCase(name); String get cliName => kebabCase(name);

View File

@ -5,6 +5,7 @@
import 'package:args/command_runner.dart'; import 'package:args/command_runner.dart';
import 'package:file/memory.dart'; import 'package:file/memory.dart';
import 'package:flutter_tools/src/artifacts.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/file_system.dart';
import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/base/platform.dart'; import 'package:flutter_tools/src/base/platform.dart';
@ -378,6 +379,37 @@ void main() {
ProcessManager: () => processManager, ProcessManager: () => processManager,
}); });
// Tests whether using a deprecated webRenderer toggles a warningText.
Future<void> 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(<String>[
'build',
'web',
'--no-pub',
'--web-renderer=${webRenderer.name}',
]);
} on ToolExit catch (error) {
expect(error, isA<ToolExit>());
}
expect(logger.warningText, contains(
'See: https://docs.flutter.dev/to/web-html-renderer-deprecation'
));
}, overrides: <Type, Generator>{
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 { testUsingContext('flutter build web option visibility', () async {
final TestWebBuildCommand buildCommand = TestWebBuildCommand(fileSystem: fileSystem); final TestWebBuildCommand buildCommand = TestWebBuildCommand(fileSystem: fileSystem);
createTestCommandRunner(buildCommand); createTestCommandRunner(buildCommand);

View File

@ -1023,6 +1023,35 @@ void main() {
DeviceManager: () => testDeviceManager, DeviceManager: () => testDeviceManager,
}); });
// Tests whether using a deprecated webRenderer toggles a warningText.
Future<void> 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(<String>[
'run',
'--no-pub',
'--web-renderer=${webRenderer.name}',
]);
} on ToolExit catch (error) {
expect(error, isA<ToolExit>());
}
expect(logger.warningText, contains(
'See: https://docs.flutter.dev/to/web-html-renderer-deprecation'
));
}, overrides: <Type, Generator>{
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 { testUsingContext('accepts headers with commas in them', () async {
final RunCommand command = RunCommand(); final RunCommand command = RunCommand();
await expectLater( await expectLater(

View File

@ -1426,6 +1426,40 @@ dev_dependencies:
}); });
}); });
// Tests whether using a deprecated webRenderer toggles a warningText.
Future<void> 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(<String>[
'test',
'web',
'--no-pub',
'--platform=chrome',
'--web-renderer=${webRenderer.name}',
]);
} on ToolExit catch (error) {
expect(error, isA<ToolExit>());
}
expect(logger.warningText, contains(
'See: https://docs.flutter.dev/to/web-html-renderer-deprecation'
));
}, overrides: <Type, Generator>{
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', testUsingContext('Can test in a pub workspace',
() async { () async {
final String root = fs.path.rootPrefix(fs.currentDirectory.absolute.path); final String root = fs.path.rootPrefix(fs.currentDirectory.absolute.path);