[web] Reland - Switch flutter tool web-renderer default for web to auto (#73595)
diff --git a/packages/flutter_tools/lib/src/runner/flutter_command.dart b/packages/flutter_tools/lib/src/runner/flutter_command.dart index 5c63e61..bf4247a 100644 --- a/packages/flutter_tools/lib/src/runner/flutter_command.dart +++ b/packages/flutter_tools/lib/src/runner/flutter_command.dart
@@ -461,7 +461,7 @@ void usesWebRendererOption() { argParser.addOption('web-renderer', - defaultsTo: 'html', + defaultsTo: 'auto', allowed: <String>['auto', 'canvaskit', 'html'], help: 'The renderer implementation to use when building for the web. Possible values are:\n' 'html - always use the HTML renderer. This renderer uses a combination of HTML, CSS, SVG, 2D Canvas, and WebGL. This is the default.\n' @@ -902,7 +902,7 @@ ? stringsArg(FlutterOptions.kDartDefinesOption) : <String>[]; - if (argParser.options.containsKey('web-renderer') && argResults.wasParsed('web-renderer')) { + if (argParser.options.containsKey('web-renderer')) { dartDefines = updateDartDefines(dartDefines, stringArg('web-renderer')); }
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 ec9a0bf..7f2178f 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
@@ -11,6 +11,7 @@ import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/commands/build.dart'; import 'package:flutter_tools/src/commands/build_web.dart'; +import 'package:flutter_tools/src/runner/flutter_command.dart'; import 'package:flutter_tools/src/dart/pub.dart'; import 'package:flutter_tools/src/features.dart'; import 'package:flutter_tools/src/globals.dart' as globals; @@ -97,59 +98,7 @@ testUsingContext('Builds a web bundle - end to end', () async { final BuildCommand buildCommand = BuildCommand(); final CommandRunner<void> runner = createTestCommandRunner(buildCommand); - final List<String> dependencies = <String>[ - fileSystem.path.join('packages', 'flutter_tools', 'lib', 'src', 'build_system', 'targets', 'web.dart'), - fileSystem.path.join('bin', 'cache', 'flutter_web_sdk'), - fileSystem.path.join('bin', 'cache', 'dart-sdk', 'bin', 'snapshots', 'dart2js.dart.snapshot'), - fileSystem.path.join('bin', 'cache', 'dart-sdk', 'bin', 'dart'), - fileSystem.path.join('bin', 'cache', 'dart-sdk '), - ]; - for (final String dependency in dependencies) { - fileSystem.file(dependency).createSync(recursive: true); - } - - // Project files. - fileSystem.file('.packages') - .writeAsStringSync(''' -foo:lib/ -fizz:bar/lib/ -'''); - fileSystem.file('pubspec.yaml') - .writeAsStringSync(''' -name: foo - -dependencies: - flutter: - sdk: flutter - fizz: - path: - bar/ -'''); - fileSystem.file(fileSystem.path.join('bar', 'pubspec.yaml')) - ..createSync(recursive: true) - ..writeAsStringSync(''' -name: bar - -flutter: - plugin: - platforms: - web: - pluginClass: UrlLauncherPlugin - fileName: url_launcher_web.dart -'''); - fileSystem.file(fileSystem.path.join('bar', 'lib', 'url_launcher_web.dart')) - ..createSync(recursive: true) - ..writeAsStringSync(''' -class UrlLauncherPlugin {} -'''); - fileSystem.file(fileSystem.path.join('lib', 'main.dart')) - .writeAsStringSync('void main() { }'); - - // Process calls. We're not testing that these invocations are correct because - // that is covered in targets/web_test.dart. - when(globals.buildSystem.build(any, any)).thenAnswer((Invocation invocation) async { - return BuildResult(success: true); - }); + setupFileSystemForEndToEndTest(fileSystem); await runner.run(<String>['build', 'web']); expect(fileSystem.file(fileSystem.path.join('lib', 'generated_plugin_registrant.dart')).existsSync(), true); @@ -181,7 +130,98 @@ Pub: () => MockPub(), ProcessManager: () => FakeProcessManager.any(), }); + + testUsingContext('Defaults to web renderer auto mode when no option is specified', () async { + final TestWebBuildCommand buildCommand = TestWebBuildCommand(); + final CommandRunner<void> runner = createTestCommandRunner(buildCommand); + setupFileSystemForEndToEndTest(fileSystem); + await runner.run(<String>['build', 'web']); + final BuildInfo buildInfo = + await buildCommand.webCommand.getBuildInfo(forcedBuildMode: BuildMode.debug); + expect(buildInfo.dartDefines, contains('FLUTTER_WEB_AUTO_DETECT=true')); + }, overrides: <Type, Generator>{ + Platform: () => fakePlatform, + FileSystem: () => fileSystem, + FeatureFlags: () => TestFeatureFlags(isWebEnabled: true), + Pub: () => MockPub(), + ProcessManager: () => FakeProcessManager.any(), + BuildSystem: () => MockBuildSystem(), + }); +} + +void setupFileSystemForEndToEndTest(FileSystem fileSystem) { + final List<String> dependencies = <String>[ + fileSystem.path.join('packages', 'flutter_tools', 'lib', 'src', 'build_system', 'targets', 'web.dart'), + fileSystem.path.join('bin', 'cache', 'flutter_web_sdk'), + fileSystem.path.join('bin', 'cache', 'dart-sdk', 'bin', 'snapshots', 'dart2js.dart.snapshot'), + fileSystem.path.join('bin', 'cache', 'dart-sdk', 'bin', 'dart'), + fileSystem.path.join('bin', 'cache', 'dart-sdk '), + ]; + for (final String dependency in dependencies) { + fileSystem.file(dependency).createSync(recursive: true); + } + + // Project files. + fileSystem.file('.packages') + .writeAsStringSync(''' +foo:lib/ +fizz:bar/lib/ +'''); + fileSystem.file('pubspec.yaml') + .writeAsStringSync(''' +name: foo + +dependencies: + flutter: + sdk: flutter + fizz: + path: + bar/ +'''); + fileSystem.file(fileSystem.path.join('bar', 'pubspec.yaml')) + ..createSync(recursive: true) + ..writeAsStringSync(''' +name: bar + +flutter: + plugin: + platforms: + web: + pluginClass: UrlLauncherPlugin + fileName: url_launcher_web.dart +'''); + fileSystem.file(fileSystem.path.join('bar', 'lib', 'url_launcher_web.dart')) + ..createSync(recursive: true) + ..writeAsStringSync(''' +class UrlLauncherPlugin {} +'''); + fileSystem.file(fileSystem.path.join('lib', 'main.dart')) + .writeAsStringSync('void main() { }'); + + // Process calls. We're not testing that these invocations are correct because + // that is covered in targets/web_test.dart. + when(globals.buildSystem.build(any, any)).thenAnswer((Invocation invocation) async { + return BuildResult(success: true); + }); } class MockBuildSystem extends Mock implements BuildSystem {} class MockPub extends Mock implements Pub {} + +class TestWebBuildCommand extends FlutterCommand { + TestWebBuildCommand({ bool verboseHelp = false }) : + webCommand = BuildWebCommand(verboseHelp: verboseHelp) { + addSubcommand(webCommand); + } + + final BuildWebCommand webCommand; + + @override + final String name = 'build'; + + @override + final String description = 'Build a test executable app.'; + + @override + Future<FlutterCommandResult> runCommand() async => null; +}