@@ -104,6 +104,19 @@ abstract class Dart2WebTarget extends Target {
104104 Iterable <File > buildFiles (Environment environment);
105105 Iterable <String > get buildPatternStems;
106106
107+ List <String > computeDartDefines (Environment environment) {
108+ final List <String > dartDefines = compilerConfig.renderer.updateDartDefines (
109+ decodeDartDefines (environment.defines, kDartDefines),
110+ );
111+ if (environment.defines[kUseLocalCanvasKitFlag] != 'true' ) {
112+ final bool canvasKitUrlAlreadySet = dartDefines.any ((String define) => define.startsWith ('FLUTTER_WEB_CANVASKIT_URL=' ));
113+ if (! canvasKitUrlAlreadySet) {
114+ dartDefines.add ('FLUTTER_WEB_CANVASKIT_URL=https://www.gstatic.com/flutter-canvaskit/${globals .flutterVersion .engineRevision }/' );
115+ }
116+ }
117+ return dartDefines;
118+ }
119+
107120 @override
108121 List <Target > get dependencies => const < Target > [
109122 WebEntrypointTarget (),
@@ -155,9 +168,6 @@ class Dart2JSTarget extends Dart2WebTarget {
155168 final BuildMode buildMode = BuildMode .fromCliName (buildModeEnvironment);
156169 final Artifacts artifacts = environment.artifacts;
157170 final String platformBinariesPath = artifacts.getHostArtifact (HostArtifact .webPlatformKernelFolder).path;
158- final List <String > dartDefines = compilerConfig.renderer.updateDartDefines (
159- decodeDartDefines (environment.defines, kDartDefines),
160- );
161171 final List <String > sharedCommandOptions = < String > [
162172 artifacts.getArtifactPath (Artifact .engineDartBinary, platform: TargetPlatform .web_javascript),
163173 '--disable-dart-dev' ,
@@ -169,7 +179,7 @@ class Dart2JSTarget extends Dart2WebTarget {
169179 '-Ddart.vm.profile=true'
170180 else
171181 '-Ddart.vm.product=true' ,
172- for (final String dartDefine in dartDefines )
182+ for (final String dartDefine in computeDartDefines (environment) )
173183 '-D$dartDefine ' ,
174184 ];
175185
@@ -287,9 +297,6 @@ class Dart2WasmTarget extends Dart2WebTarget {
287297 final File depFile = environment.buildDir.childFile ('dart2wasm.d' );
288298 final String platformBinariesPath = artifacts.getHostArtifact (HostArtifact .webPlatformKernelFolder).path;
289299 final String platformFilePath = environment.fileSystem.path.join (platformBinariesPath, 'dart2wasm_platform.dill' );
290- final List <String > dartDefines = compilerConfig.renderer.updateDartDefines (
291- decodeDartDefines (environment.defines, kDartDefines),
292- );
293300
294301 assert (buildMode == BuildMode .release || buildMode == BuildMode .profile);
295302 final List <String > compilationArgs = < String > [
@@ -309,7 +316,7 @@ class Dart2WasmTarget extends Dart2WebTarget {
309316 else
310317 '-Ddart.vm.product=true' ,
311318 ...decodeCommaSeparated (environment.defines, kExtraFrontEndOptions),
312- for (final String dartDefine in dartDefines )
319+ for (final String dartDefine in computeDartDefines (environment) )
313320 '-D$dartDefine ' ,
314321 '--extra-compiler-option=--depfile=${depFile .path }' ,
315322
@@ -380,23 +387,9 @@ class WebReleaseBundle extends Target {
380387
381388 WebReleaseBundle ._({
382389 required this .compileTargets,
383- }) : templatedFilesTarget = WebTemplatedFiles (generateBuildConfigString (compileTargets));
384-
385- static String generateBuildConfigString (List <Dart2WebTarget > compileTargets) {
386- final List <Map <String , Object ?>> buildDescriptions = compileTargets.map (
387- (Dart2WebTarget target) => target.buildConfig
388- ).toList ();
389- final Map <String , Object ?> buildConfig = < String , Object ? > {
390- 'engineRevision' : globals.flutterVersion.engineRevision,
391- 'builds' : buildDescriptions,
392- };
393- return '''
394- if (!window._flutter) {
395- window._flutter = {};
396- }
397- _flutter.buildConfig = ${jsonEncode (buildConfig )};
398- ''' ;
399- }
390+ }) : templatedFilesTarget = WebTemplatedFiles (
391+ compileTargets.map ((Dart2WebTarget target) => target.buildConfig).toList ()
392+ );
400393
401394 final List <Dart2WebTarget > compileTargets;
402395 final WebTemplatedFiles templatedFilesTarget;
@@ -516,12 +509,12 @@ _flutter.buildConfig = ${jsonEncode(buildConfig)};
516509}
517510
518511class WebTemplatedFiles extends Target {
519- WebTemplatedFiles (this .buildConfigString );
512+ WebTemplatedFiles (this .buildDescriptions );
520513
521- final String buildConfigString ;
514+ final List < Map < String , Object ?>> buildDescriptions ;
522515
523516 @override
524- String get buildKey => buildConfigString ;
517+ String get buildKey => jsonEncode (buildDescriptions) ;
525518
526519 void _emitWebTemplateWarning (
527520 Environment environment,
@@ -533,6 +526,21 @@ class WebTemplatedFiles extends Target {
533526 );
534527 }
535528
529+ String buildConfigString (Environment environment) {
530+ final Map <String , Object > buildConfig = < String , Object > {
531+ 'engineRevision' : globals.flutterVersion.engineRevision,
532+ 'builds' : buildDescriptions,
533+ if (environment.defines[kUseLocalCanvasKitFlag] == 'true' )
534+ 'useLocalCanvasKit' : true ,
535+ };
536+ return '''
537+ if (!window._flutter) {
538+ window._flutter = {};
539+ }
540+ _flutter.buildConfig = ${jsonEncode (buildConfig )};
541+ ''' ;
542+ }
543+
536544 @override
537545 Future <void > build (Environment environment) async {
538546 final Directory webResources = environment.projectDir
@@ -555,6 +563,8 @@ class WebTemplatedFiles extends Target {
555563 'flutter.js' ,
556564 ));
557565
566+ final String buildConfig = buildConfigString (environment);
567+
558568 // Insert a random hash into the requests for service_worker.js. This is not a content hash,
559569 // because it would need to be the hash for the entire bundle and not just the resource
560570 // in question.
@@ -563,7 +573,7 @@ class WebTemplatedFiles extends Target {
563573 baseHref: '' ,
564574 serviceWorkerVersion: serviceWorkerVersion,
565575 flutterJsFile: flutterJsFile,
566- buildConfig: buildConfigString ,
576+ buildConfig: buildConfig ,
567577 );
568578
569579 final File outputFlutterBootstrapJs = fileSystem.file (fileSystem.path.join (
@@ -585,7 +595,7 @@ class WebTemplatedFiles extends Target {
585595 baseHref: environment.defines[kBaseHref] ?? '/' ,
586596 serviceWorkerVersion: serviceWorkerVersion,
587597 flutterJsFile: flutterJsFile,
588- buildConfig: buildConfigString ,
598+ buildConfig: buildConfig ,
589599 flutterBootstrapJs: bootstrapTemplate.content,
590600 );
591601 final File outputIndexHtml = fileSystem.file (fileSystem.path.join (
0 commit comments