From a0a8805592ed4c29397a08816988521c58f06577 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=96mer=20Sinan=20A=C4=9Facan?= Date: Mon, 18 Mar 2024 12:18:53 +0100 Subject: [PATCH 1/6] Update dart2wasm module compilation to use Wasm string builtins --- .../flutter_js/src/entrypoint_loader.js | 36 ++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/lib/web_ui/flutter_js/src/entrypoint_loader.js b/lib/web_ui/flutter_js/src/entrypoint_loader.js index db8b33159dc48..8c93822f554ac 100644 --- a/lib/web_ui/flutter_js/src/entrypoint_loader.js +++ b/lib/web_ui/flutter_js/src/entrypoint_loader.js @@ -151,7 +151,13 @@ export class FlutterEntrypointLoader { if (this._ttPolicy != null) { jsSupportRuntimeUri = this._ttPolicy.createScriptURL(jsSupportRuntimeUri); } - const dartModulePromise = WebAssembly.compileStreaming(fetch(moduleUri)); + + const stringBuiltinSupported = _detectWasmStringBuiltin(); + + const dartModulePromise = WebAssembly.compileStreaming( + fetch(moduleUri), + stringBuiltinSupported ? {builtins: 'js-string'} : {} + ); const jsSupportRuntime = await import(jsSupportRuntimeUri); @@ -171,6 +177,23 @@ export class FlutterEntrypointLoader { } else { imports = {}; } + + if (!stringBuiltinSupported) { + imports['wasm:js-string'] = { + "charCodeAt": (s, i) => s.charCodeAt(i), + "compare": (s1, s2) => { + if (s1 < s2) return -1; + if (s1 > s2) return 1; + return 0; + }, + "concat": (s1, s2) => s1 + s2, + "equals": (s1, s2) => s1 === s2, + "fromCharCode": (i) => String.fromCharCode(i), + "length": (s) => s.length, + "substring": (s, a, b) => s.substring(a, b), + }; + } + const moduleInstance = await jsSupportRuntime.instantiate(dartModulePromise, imports); await jsSupportRuntime.invoke(moduleInstance); } @@ -195,4 +218,15 @@ export class FlutterEntrypointLoader { scriptTag.src = trustedUrl; return scriptTag; } + + /// Returns whether the `js-string` Wasm built-in is supported. + _detectWasmStringBuiltin() { + let bytes = [ + 0, 97, 115, 109, 1, 0, 0, 0, 1, 4, 1, 96, 0, + 0, 2, 23, 1, 14, 119, 97, 115, 109, 58, 106, 115, 45, + 115, 116, 114, 105, 110, 103, 4, 99, 97, 115, 116, 0, 0 + ]; + return !WebAssembly.validate( + new Uint8Array(bytes), {builtins: ['js-string']}); + } } From 5ecec4af44cd49344a12518e90b2a4479db36551 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=96mer=20Sinan=20A=C4=9Facan?= Date: Mon, 18 Mar 2024 14:06:30 +0100 Subject: [PATCH 2/6] Fix detectWasmStringBuiltin call --- lib/web_ui/flutter_js/src/entrypoint_loader.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/web_ui/flutter_js/src/entrypoint_loader.js b/lib/web_ui/flutter_js/src/entrypoint_loader.js index 8c93822f554ac..e934a245abde4 100644 --- a/lib/web_ui/flutter_js/src/entrypoint_loader.js +++ b/lib/web_ui/flutter_js/src/entrypoint_loader.js @@ -152,7 +152,7 @@ export class FlutterEntrypointLoader { jsSupportRuntimeUri = this._ttPolicy.createScriptURL(jsSupportRuntimeUri); } - const stringBuiltinSupported = _detectWasmStringBuiltin(); + const stringBuiltinSupported = this._detectWasmStringBuiltin(); const dartModulePromise = WebAssembly.compileStreaming( fetch(moduleUri), From 8232d85409fb626a4ec714bb93eb8b5346c781cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=96mer=20Sinan=20A=C4=9Facan?= Date: Tue, 19 Mar 2024 09:22:20 +0100 Subject: [PATCH 3/6] Remove polyfill, dart2wasm mjs file provides it --- lib/web_ui/flutter_js/src/entrypoint_loader.js | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/lib/web_ui/flutter_js/src/entrypoint_loader.js b/lib/web_ui/flutter_js/src/entrypoint_loader.js index e934a245abde4..1b178c67d566b 100644 --- a/lib/web_ui/flutter_js/src/entrypoint_loader.js +++ b/lib/web_ui/flutter_js/src/entrypoint_loader.js @@ -178,22 +178,6 @@ export class FlutterEntrypointLoader { imports = {}; } - if (!stringBuiltinSupported) { - imports['wasm:js-string'] = { - "charCodeAt": (s, i) => s.charCodeAt(i), - "compare": (s1, s2) => { - if (s1 < s2) return -1; - if (s1 > s2) return 1; - return 0; - }, - "concat": (s1, s2) => s1 + s2, - "equals": (s1, s2) => s1 === s2, - "fromCharCode": (i) => String.fromCharCode(i), - "length": (s) => s.length, - "substring": (s, a, b) => s.substring(a, b), - }; - } - const moduleInstance = await jsSupportRuntime.instantiate(dartModulePromise, imports); await jsSupportRuntime.invoke(moduleInstance); } From 0789214bcd52b29393e2182bab9b88a31b9613b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=96mer=20Sinan=20A=C4=9Facan?= Date: Tue, 19 Mar 2024 09:22:51 +0100 Subject: [PATCH 4/6] Revert whitespace --- lib/web_ui/flutter_js/src/entrypoint_loader.js | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/web_ui/flutter_js/src/entrypoint_loader.js b/lib/web_ui/flutter_js/src/entrypoint_loader.js index 1b178c67d566b..ff8ac4ced2041 100644 --- a/lib/web_ui/flutter_js/src/entrypoint_loader.js +++ b/lib/web_ui/flutter_js/src/entrypoint_loader.js @@ -177,7 +177,6 @@ export class FlutterEntrypointLoader { } else { imports = {}; } - const moduleInstance = await jsSupportRuntime.instantiate(dartModulePromise, imports); await jsSupportRuntime.invoke(moduleInstance); } From 4d70159da20f6b8aeaa0cbd5918ae3805077dc7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=96mer=20Sinan=20A=C4=9Facan?= Date: Mon, 26 Aug 2024 13:11:38 +0200 Subject: [PATCH 5/6] Use compileStreaming from JS shim --- .../flutter_js/src/entrypoint_loader.js | 22 +++---------------- 1 file changed, 3 insertions(+), 19 deletions(-) diff --git a/lib/web_ui/flutter_js/src/entrypoint_loader.js b/lib/web_ui/flutter_js/src/entrypoint_loader.js index ad6fd26aac674..6883748611b8f 100644 --- a/lib/web_ui/flutter_js/src/entrypoint_loader.js +++ b/lib/web_ui/flutter_js/src/entrypoint_loader.js @@ -153,16 +153,11 @@ export class FlutterEntrypointLoader { if (this._ttPolicy != null) { jsSupportRuntimeUri = this._ttPolicy.createScriptURL(jsSupportRuntimeUri); } - - const stringBuiltinSupported = this._detectWasmStringBuiltin(); - - const dartModulePromise = WebAssembly.compileStreaming( - fetch(moduleUri), - stringBuiltinSupported ? {builtins: 'js-string'} : {} - ); - + const jsSupportRuntime = await import(jsSupportRuntimeUri); + const dartModulePromise = jsSupportRuntime.compileStreaming(fetch(moduleUri)); + let imports; if (build.renderer === "skwasm") { imports = (async () => { @@ -203,15 +198,4 @@ export class FlutterEntrypointLoader { scriptTag.src = trustedUrl; return scriptTag; } - - /// Returns whether the `js-string` Wasm built-in is supported. - _detectWasmStringBuiltin() { - let bytes = [ - 0, 97, 115, 109, 1, 0, 0, 0, 1, 4, 1, 96, 0, - 0, 2, 23, 1, 14, 119, 97, 115, 109, 58, 106, 115, 45, - 115, 116, 114, 105, 110, 103, 4, 99, 97, 115, 116, 0, 0 - ]; - return !WebAssembly.validate( - new Uint8Array(bytes), {builtins: ['js-string']}); - } } From 40645816c257b2a21f18ff535bbdb4d49424ee7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=96mer=20Sinan=20A=C4=9Facan?= Date: Mon, 26 Aug 2024 13:12:14 +0200 Subject: [PATCH 6/6] Revert whitespace change --- lib/web_ui/flutter_js/src/entrypoint_loader.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/web_ui/flutter_js/src/entrypoint_loader.js b/lib/web_ui/flutter_js/src/entrypoint_loader.js index 6883748611b8f..2c9fe15619879 100644 --- a/lib/web_ui/flutter_js/src/entrypoint_loader.js +++ b/lib/web_ui/flutter_js/src/entrypoint_loader.js @@ -152,8 +152,7 @@ export class FlutterEntrypointLoader { let jsSupportRuntimeUri = resolveUrlWithSegments(entrypointBaseUrl, jsSupportRuntimePath); if (this._ttPolicy != null) { jsSupportRuntimeUri = this._ttPolicy.createScriptURL(jsSupportRuntimeUri); - } - + } const jsSupportRuntime = await import(jsSupportRuntimeUri); const dartModulePromise = jsSupportRuntime.compileStreaming(fetch(moduleUri));