Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit d5db9e2

Browse files
authored
Merge branch 'main' into single-glarea
2 parents 4cde4d5 + a749820 commit d5db9e2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+2985
-233
lines changed

ci/licenses_golden/licenses_flutter

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1937,7 +1937,24 @@ ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/services/message_codecs.dart
19371937
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/services/serialization.dart + ../../../flutter/LICENSE
19381938
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/shadow.dart + ../../../flutter/LICENSE
19391939
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl.dart + ../../../flutter/LICENSE
1940+
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/canvas.dart + ../../../flutter/LICENSE
1941+
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/image.dart + ../../../flutter/LICENSE
1942+
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paint.dart + ../../../flutter/LICENSE
1943+
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paragraph.dart + ../../../flutter/LICENSE
1944+
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/path.dart + ../../../flutter/LICENSE
1945+
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/path_metrics.dart + ../../../flutter/LICENSE
1946+
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/picture.dart + ../../../flutter/LICENSE
1947+
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_canvas.dart + ../../../flutter/LICENSE
1948+
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_geometry.dart + ../../../flutter/LICENSE
1949+
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_memory.dart + ../../../flutter/LICENSE
1950+
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_paint.dart + ../../../flutter/LICENSE
1951+
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_path.dart + ../../../flutter/LICENSE
1952+
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_path_metrics.dart + ../../../flutter/LICENSE
1953+
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_picture.dart + ../../../flutter/LICENSE
1954+
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_surface.dart + ../../../flutter/LICENSE
19401955
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/renderer.dart + ../../../flutter/LICENSE
1956+
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/surface.dart + ../../../flutter/LICENSE
1957+
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/vertices.dart + ../../../flutter/LICENSE
19411958
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_stub.dart + ../../../flutter/LICENSE
19421959
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_stub/renderer.dart + ../../../flutter/LICENSE
19431960
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/svg.dart + ../../../flutter/LICENSE
@@ -1978,6 +1995,15 @@ ORIGIN: ../../../flutter/lib/web_ui/lib/text.dart + ../../../flutter/LICENSE
19781995
ORIGIN: ../../../flutter/lib/web_ui/lib/tile_mode.dart + ../../../flutter/LICENSE
19791996
ORIGIN: ../../../flutter/lib/web_ui/lib/ui.dart + ../../../flutter/LICENSE
19801997
ORIGIN: ../../../flutter/lib/web_ui/lib/window.dart + ../../../flutter/LICENSE
1998+
ORIGIN: ../../../flutter/lib/web_ui/skwasm/canvas.cpp + ../../../flutter/LICENSE
1999+
ORIGIN: ../../../flutter/lib/web_ui/skwasm/contour_measure.cpp + ../../../flutter/LICENSE
2000+
ORIGIN: ../../../flutter/lib/web_ui/skwasm/export.h + ../../../flutter/LICENSE
2001+
ORIGIN: ../../../flutter/lib/web_ui/skwasm/helpers.h + ../../../flutter/LICENSE
2002+
ORIGIN: ../../../flutter/lib/web_ui/skwasm/paint.cpp + ../../../flutter/LICENSE
2003+
ORIGIN: ../../../flutter/lib/web_ui/skwasm/path.cpp + ../../../flutter/LICENSE
2004+
ORIGIN: ../../../flutter/lib/web_ui/skwasm/picture.cpp + ../../../flutter/LICENSE
2005+
ORIGIN: ../../../flutter/lib/web_ui/skwasm/surface.cpp + ../../../flutter/LICENSE
2006+
ORIGIN: ../../../flutter/lib/web_ui/skwasm/wrappers.h + ../../../flutter/LICENSE
19812007
ORIGIN: ../../../flutter/runtime/dart_isolate.cc + ../../../flutter/LICENSE
19822008
ORIGIN: ../../../flutter/runtime/dart_isolate.h + ../../../flutter/LICENSE
19832009
ORIGIN: ../../../flutter/runtime/dart_isolate_group_data.cc + ../../../flutter/LICENSE
@@ -4436,7 +4462,24 @@ FILE: ../../../flutter/lib/web_ui/lib/src/engine/services/message_codecs.dart
44364462
FILE: ../../../flutter/lib/web_ui/lib/src/engine/services/serialization.dart
44374463
FILE: ../../../flutter/lib/web_ui/lib/src/engine/shadow.dart
44384464
FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl.dart
4465+
FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/canvas.dart
4466+
FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/image.dart
4467+
FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paint.dart
4468+
FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paragraph.dart
4469+
FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/path.dart
4470+
FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/path_metrics.dart
4471+
FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/picture.dart
4472+
FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_canvas.dart
4473+
FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_geometry.dart
4474+
FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_memory.dart
4475+
FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_paint.dart
4476+
FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_path.dart
4477+
FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_path_metrics.dart
4478+
FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_picture.dart
4479+
FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_surface.dart
44394480
FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/renderer.dart
4481+
FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/surface.dart
4482+
FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/vertices.dart
44404483
FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_stub.dart
44414484
FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_stub/renderer.dart
44424485
FILE: ../../../flutter/lib/web_ui/lib/src/engine/svg.dart
@@ -4477,6 +4520,15 @@ FILE: ../../../flutter/lib/web_ui/lib/text.dart
44774520
FILE: ../../../flutter/lib/web_ui/lib/tile_mode.dart
44784521
FILE: ../../../flutter/lib/web_ui/lib/ui.dart
44794522
FILE: ../../../flutter/lib/web_ui/lib/window.dart
4523+
FILE: ../../../flutter/lib/web_ui/skwasm/canvas.cpp
4524+
FILE: ../../../flutter/lib/web_ui/skwasm/contour_measure.cpp
4525+
FILE: ../../../flutter/lib/web_ui/skwasm/export.h
4526+
FILE: ../../../flutter/lib/web_ui/skwasm/helpers.h
4527+
FILE: ../../../flutter/lib/web_ui/skwasm/paint.cpp
4528+
FILE: ../../../flutter/lib/web_ui/skwasm/path.cpp
4529+
FILE: ../../../flutter/lib/web_ui/skwasm/picture.cpp
4530+
FILE: ../../../flutter/lib/web_ui/skwasm/surface.cpp
4531+
FILE: ../../../flutter/lib/web_ui/skwasm/wrappers.h
44804532
FILE: ../../../flutter/runtime/dart_isolate.cc
44814533
FILE: ../../../flutter/runtime/dart_isolate.h
44824534
FILE: ../../../flutter/runtime/dart_isolate_group_data.cc

common/config.gni

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,6 @@ declare_args() {
1616

1717
# Whether to use a prebuilt Dart SDK instead of building one.
1818
flutter_prebuilt_dart_sdk = false
19-
20-
# Whether to build the flutter web sdk outline/DDC artifacts.
21-
flutter_build_web_sdk = false
2219
}
2320

2421
# feature_defines_list ---------------------------------------------------------

lib/web_ui/dev/build.dart

Lines changed: 21 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,14 @@ import 'environment.dart';
1313
import 'pipeline.dart';
1414
import 'utils.dart';
1515

16+
const Map<String, String> targetAliases = <String, String>{
17+
'sdk': 'flutter/web_sdk',
18+
'web_sdk': 'flutter/web_sdk',
19+
'canvaskit': 'flutter/third_party/canvaskit:canvaskit_group',
20+
'canvaskit_chromium': 'flutter/third_party/canvaskit:canvaskit_chromium_group',
21+
'skwasm': 'flutter/lib/web_ui/skwasm',
22+
};
23+
1624
class BuildCommand extends Command<bool> with ArgUtils<bool> {
1725
BuildCommand() {
1826
argParser.addFlag(
@@ -21,16 +29,6 @@ class BuildCommand extends Command<bool> with ArgUtils<bool> {
2129
help: 'Run the build in watch mode so it rebuilds whenever a change is '
2230
'made. Disabled by default.',
2331
);
24-
argParser.addFlag(
25-
'build-canvaskit',
26-
help: 'Build CanvasKit locally instead of getting it from CIPD. Enabled '
27-
'by default.',
28-
defaultsTo: true
29-
);
30-
argParser.addFlag(
31-
'build-canvaskit-chromium',
32-
help: 'Build the Chromium variant of CanvasKit. Disabled by default.',
33-
);
3432
argParser.addFlag(
3533
'host',
3634
help: 'Build the host build instead of the wasm build, which is '
@@ -46,22 +44,19 @@ class BuildCommand extends Command<bool> with ArgUtils<bool> {
4644

4745
bool get isWatchMode => boolArg('watch');
4846

49-
bool get buildCanvasKit => boolArg('build-canvaskit');
50-
51-
bool get buildCanvasKitChromium => boolArg('build-canvaskit-chromium');
52-
5347
bool get host => boolArg('host');
5448

49+
List<String> get targets => argResults?.rest ?? <String>[];
50+
5551
@override
5652
FutureOr<bool> run() async {
5753
final FilePath libPath = FilePath.fromWebUi('lib');
5854
final List<PipelineStep> steps = <PipelineStep>[
59-
GnPipelineStep(
60-
buildCanvasKit: buildCanvasKit,
61-
buildCanvasKitChromium: buildCanvasKitChromium,
62-
host: host,
55+
GnPipelineStep(host: host),
56+
NinjaPipelineStep(
57+
buildDirectory: host ? environment.hostDebugUnoptDir : environment.wasmReleaseOutDir,
58+
targets: targets.map((String target) => targetAliases[target] ?? target),
6359
),
64-
NinjaPipelineStep(target: host ? environment.hostDebugUnoptDir : environment.wasmReleaseOutDir),
6560
];
6661
final Pipeline buildPipeline = Pipeline(steps: steps);
6762
await buildPipeline.run();
@@ -86,13 +81,9 @@ class BuildCommand extends Command<bool> with ArgUtils<bool> {
8681
/// state. GN is pretty quick though, so it's OK to not support interruption.
8782
class GnPipelineStep extends ProcessStep {
8883
GnPipelineStep({
89-
required this.buildCanvasKit,
90-
required this.buildCanvasKitChromium,
9184
required this.host,
9285
});
9386

94-
final bool buildCanvasKit;
95-
final bool buildCanvasKitChromium;
9687
final bool host;
9788

9889
@override
@@ -111,8 +102,6 @@ class GnPipelineStep extends ProcessStep {
111102
return <String>[
112103
'--web',
113104
'--runtime-mode=release',
114-
if (buildCanvasKit) '--build-canvaskit',
115-
if (buildCanvasKitChromium) '--build-canvaskit-chromium',
116105
];
117106
}
118107
}
@@ -131,16 +120,18 @@ class GnPipelineStep extends ProcessStep {
131120
///
132121
/// Can be safely interrupted.
133122
class NinjaPipelineStep extends ProcessStep {
134-
NinjaPipelineStep({required this.target});
123+
NinjaPipelineStep({required this.buildDirectory, required this.targets});
135124

136125
@override
137126
String get description => 'ninja';
138127

139128
@override
140129
bool get isSafeToInterrupt => true;
141130

142-
/// The target directory to build.
143-
final Directory target;
131+
/// The directory to build.
132+
final Directory buildDirectory;
133+
134+
final Iterable<String> targets;
144135

145136
@override
146137
Future<ProcessManager> createProcess() {
@@ -149,7 +140,8 @@ class NinjaPipelineStep extends ProcessStep {
149140
'autoninja',
150141
<String>[
151142
'-C',
152-
target.path,
143+
buildDirectory.path,
144+
...targets,
153145
],
154146
);
155147
}

lib/web_ui/dev/steps/compile_tests_step.dart

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,11 @@ import '../utils.dart';
2323
/// * test/ - compiled test code
2424
/// * test_images/ - test images copied from Skis sources.
2525
class CompileTestsStep implements PipelineStep {
26-
CompileTestsStep({this.testFiles, this.useLocalCanvasKit = false, this.isWasm = false});
26+
CompileTestsStep({
27+
this.testFiles,
28+
this.useLocalCanvasKit = false,
29+
this.isWasm = false
30+
});
2731

2832
final List<FilePath>? testFiles;
2933
final bool isWasm;
@@ -46,6 +50,7 @@ class CompileTestsStep implements PipelineStep {
4650
await environment.webUiBuildDir.create();
4751
if (isWasm) {
4852
await copyDart2WasmTestScript();
53+
await copySkwasm();
4954
}
5055
await copyCanvasKitFiles(useLocalCanvasKit: useLocalCanvasKit);
5156
await buildHostPage();
@@ -133,11 +138,36 @@ Future<void> copyDart2WasmTestScript() async {
133138
environment.webUiDevDir.path,
134139
'test_dart2wasm.js',
135140
));
136-
final io.Directory targetDir = io.Directory(pathlib.join(
141+
final io.File targetFile = io.File(pathlib.join(
137142
environment.webUiBuildDir.path,
138143
'test_dart2wasm.js',
139144
));
140-
await sourceFile.copy(targetDir.path);
145+
await sourceFile.copy(targetFile.path);
146+
}
147+
148+
Future<void> copySkwasm() async {
149+
final io.Directory targetDir = io.Directory(pathlib.join(
150+
environment.webUiBuildDir.path,
151+
'skwasm',
152+
));
153+
154+
await targetDir.create(recursive: true);
155+
156+
for (final String fileName in <String>[
157+
'skwasm.wasm',
158+
'skwasm.js',
159+
'skwasm.worker.js',
160+
]) {
161+
final io.File sourceFile = io.File(pathlib.join(
162+
environment.wasmReleaseOutDir.path,
163+
fileName,
164+
));
165+
final io.File targetFile = io.File(pathlib.join(
166+
targetDir.path,
167+
fileName,
168+
));
169+
await sourceFile.copy(targetFile.path);
170+
}
141171
}
142172

143173
final io.Directory _localCanvasKitDir = io.Directory(pathlib.join(
@@ -207,7 +237,7 @@ Future<void> copyCanvasKitFiles({bool useLocalCanvasKit = false}) async {
207237
Future<void> compileTests(List<FilePath> testFiles, bool isWasm) async {
208238
final Stopwatch stopwatch = Stopwatch()..start();
209239

210-
final TestsByRenderer sortedTests = sortTestsByRenderer(testFiles);
240+
final TestsByRenderer sortedTests = sortTestsByRenderer(testFiles, isWasm);
211241

212242
await Future.wait(<Future<void>>[
213243
if (sortedTests.htmlTests.isNotEmpty)
@@ -327,11 +357,13 @@ Future<bool> compileUnitTestToJS(FilePath input, {required Renderer renderer}) a
327357
Future<bool> compileUnitTestToWasm(FilePath input, {required Renderer renderer}) async {
328358
final String targetFileName = pathlib.join(
329359
environment.webUiBuildDir.path,
360+
getBuildDirForRenderer(renderer),
330361
'${input.relativeToWebUi}.browser_test.dart.wasm',
331362
);
332363

333364
final io.Directory directoryToTarget = io.Directory(pathlib.join(
334365
environment.webUiBuildDir.path,
366+
getBuildDirForRenderer(renderer),
335367
pathlib.dirname(input.relativeToWebUi)));
336368

337369
if (!directoryToTarget.existsSync()) {
@@ -350,6 +382,13 @@ Future<bool> compileUnitTestToWasm(FilePath input, {required Renderer renderer})
350382
'-DFLUTTER_WEB_AUTO_DETECT=false',
351383
'-DFLUTTER_WEB_USE_SKIA=${renderer == Renderer.canvasKit}',
352384
'-DFLUTTER_WEB_USE_SKWASM=${renderer == Renderer.skwasm}',
385+
386+
if (renderer == Renderer.skwasm)
387+
...<String>[
388+
'--import-shared-memory',
389+
'--shared-memory-max-pages=32768',
390+
],
391+
353392
input.relativeToWebUi, // current path.
354393
targetFileName, // target path.
355394
];

lib/web_ui/dev/steps/run_tests_step.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ class RunTestsStep implements PipelineStep {
7070
final SkiaGoldClient? skiaClient = await _createSkiaClient();
7171
final List<FilePath> testFiles = this.testFiles ?? findAllTests();
7272

73-
final TestsByRenderer sortedTests = sortTestsByRenderer(testFiles);
73+
final TestsByRenderer sortedTests = sortTestsByRenderer(testFiles, isWasm);
7474

7575
bool testsPassed = true;
7676

lib/web_ui/dev/test_dart2wasm.js

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,27 @@ window.onload = async function () {
5454
let dart2wasm_runtime;
5555
let moduleInstance;
5656
try {
57+
const isSkwasm = link.hasAttribute('skwasm');
58+
const imports = isSkwasm ? new Promise((resolve) => {
59+
const skwasmScript = document.createElement('script');
60+
skwasmScript.src = '/skwasm/skwasm.js';
61+
62+
document.body.appendChild(skwasmScript);
63+
skwasmScript.addEventListener('load', async () => {
64+
const skwasmInstance = await skwasm();
65+
resolve({
66+
"skwasm": skwasmInstance.asm,
67+
"ffi": {
68+
"memory": skwasmInstance.wasmMemory,
69+
}
70+
});
71+
});
72+
}) : {};
73+
5774
let baseName = link.href + '.browser_test.dart';
5875
dart2wasm_runtime = await import(baseName + '.mjs');
5976
const dartModulePromise = WebAssembly.compileStreaming(fetch(baseName + '.wasm'));
60-
moduleInstance = await dart2wasm_runtime.instantiate(dartModulePromise, {});
77+
moduleInstance = await dart2wasm_runtime.instantiate(dartModulePromise, imports);
6178
} catch (exception) {
6279
const message = `Failed to fetch and instantiate wasm module: ${exception}`;
6380
sendLoadException(message);

lib/web_ui/dev/test_platform.dart

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,11 @@ import 'browser.dart';
4040
import 'environment.dart' as env;
4141
import 'utils.dart';
4242

43+
const Map<String, String> coopCoepHeaders = <String, String>{
44+
'Cross-Origin-Opener-Policy': 'same-origin',
45+
'Cross-Origin-Embedder-Policy': 'require-corp',
46+
};
47+
4348
/// Custom test platform that serves web engine unit tests.
4449
class BrowserPlatform extends PlatformPlugin {
4550
BrowserPlatform._({
@@ -472,10 +477,16 @@ class BrowserPlatform extends PlatformPlugin {
472477
return shelf.Response.internalServerError(body: error);
473478
}
474479

480+
final bool needsCoopCoep =
481+
extension == '.js' ||
482+
extension == '.mjs' ||
483+
extension == '.html';
475484
return shelf.Response.ok(
476485
fileInBuild.readAsBytesSync(),
477486
headers: <String, Object>{
478487
HttpHeaders.contentTypeHeader: contentType,
488+
if (needsCoopCoep && isWasm && renderer == Renderer.skwasm)
489+
...coopCoepHeaders,
479490
},
480491
);
481492
}
@@ -489,7 +500,7 @@ class BrowserPlatform extends PlatformPlugin {
489500

490501
// Link to the Dart wrapper.
491502
final String scriptBase = htmlEscape.convert(p.basename(test));
492-
final String link = '<link rel="x-dart-test" href="$scriptBase">';
503+
final String link = '<link rel="x-dart-test" href="$scriptBase"${renderer == Renderer.skwasm ? " skwasm" : ""}>';
493504

494505
final String testRunner = isWasm ? '/test_dart2wasm.js' : 'packages/test/dart.js';
495506

@@ -508,7 +519,11 @@ class BrowserPlatform extends PlatformPlugin {
508519
<script src="$testRunner"></script>
509520
</head>
510521
</html>
511-
''', headers: <String, String>{'Content-Type': 'text/html'});
522+
''', headers: <String, String>{
523+
'Content-Type': 'text/html',
524+
if (isWasm && renderer == Renderer.skwasm)
525+
...coopCoepHeaders
526+
});
512527
}
513528

514529
return shelf.Response.notFound('Not found.');

0 commit comments

Comments
 (0)