tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit 5c2dc323f00d29171fa7b1afbd075d906898b35b
parent 26107c4f63741a94b958b19cb54be1c5c01c075e
Author: Daniel Minor <dminor@mozilla.com>
Date:   Fri, 12 Dec 2025 14:12:36 +0000

Bug 1994828 - Add support for wasm modules in module loaders; r=allstarschh,dom-core,smaug

Differential Revision: https://phabricator.services.mozilla.com/D270154

Diffstat:
Mdom/script/ModuleLoader.cpp | 29++++++++++++++++++++++++++---
Mdom/script/ModuleLoader.h | 6+++---
Mdom/workers/loader/WorkerModuleLoader.cpp | 23++++++++++++++++++++---
Mdom/workers/loader/WorkerModuleLoader.h | 6+++---
Mdom/worklet/loader/WorkletModuleLoader.cpp | 24+++++++++++++++++++++---
Mdom/worklet/loader/WorkletModuleLoader.h | 6+++---
6 files changed, 76 insertions(+), 18 deletions(-)

diff --git a/dom/script/ModuleLoader.cpp b/dom/script/ModuleLoader.cpp @@ -220,8 +220,8 @@ nsresult ModuleLoader::CompileFetchedModule( switch (aRequest->mModuleType) { case JS::ModuleType::Unknown: MOZ_CRASH("Unexpected module type"); - case JS::ModuleType::JavaScript: - return CompileJavaScriptModule(aCx, aOptions, aRequest, aModuleOut); + case JS::ModuleType::JavaScriptOrWasm: + return CompileJavaScriptOrWasmModule(aCx, aOptions, aRequest, aModuleOut); case JS::ModuleType::JSON: return CompileJsonModule(aCx, aOptions, aRequest, aModuleOut); case JS::ModuleType::CSS: @@ -233,11 +233,34 @@ nsresult ModuleLoader::CompileFetchedModule( MOZ_CRASH("Unhandled module type"); } -nsresult ModuleLoader::CompileJavaScriptModule( +nsresult ModuleLoader::CompileJavaScriptOrWasmModule( JSContext* aCx, JS::CompileOptions& aOptions, ModuleLoadRequest* aRequest, JS::MutableHandle<JSObject*> aModuleOut) { GetScriptLoader()->CalculateCacheFlag(aRequest); +#ifdef NIGHTLY_BUILD + if (aRequest->HasWasmMimeTypeEssence()) { + MOZ_ASSERT(aRequest->IsTextSource()); + + ModuleLoader::MaybeSourceText maybeSource; + nsresult rv = aRequest->GetScriptSource(aCx, &maybeSource, + aRequest->mLoadContext.get()); + NS_ENSURE_SUCCESS(rv, rv); + + auto compile = [&](auto& source) { + return JS::CompileWasmModule(aCx, aOptions, source); + }; + + auto* wasmModule = maybeSource.mapNonEmpty(compile); + if (!wasmModule) { + return NS_ERROR_FAILURE; + } + + aModuleOut.set(wasmModule); + return NS_OK; + } +#endif + if (aRequest->IsCachedStencil()) { JS::InstantiateOptions instantiateOptions(aOptions); RefPtr<JS::Stencil> stencil = aRequest->GetStencil(); diff --git a/dom/script/ModuleLoader.h b/dom/script/ModuleLoader.h @@ -86,9 +86,9 @@ class ModuleLoader final : public JS::loader::ModuleLoaderBase { void ExecuteInlineModule(ModuleLoadRequest* aRequest); private: - nsresult CompileJavaScriptModule(JSContext* aCx, JS::CompileOptions& aOptions, - ModuleLoadRequest* aRequest, - JS::MutableHandle<JSObject*> aModuleOut); + nsresult CompileJavaScriptOrWasmModule( + JSContext* aCx, JS::CompileOptions& aOptions, ModuleLoadRequest* aRequest, + JS::MutableHandle<JSObject*> aModuleOut); nsresult CompileJsonModule(JSContext* aCx, JS::CompileOptions& aOptions, ModuleLoadRequest* aRequest, JS::MutableHandle<JSObject*> aModuleOut); diff --git a/dom/workers/loader/WorkerModuleLoader.cpp b/dom/workers/loader/WorkerModuleLoader.cpp @@ -152,8 +152,9 @@ nsresult WorkerModuleLoader::CompileFetchedModule( case JS::ModuleType::Unknown: case JS::ModuleType::Bytes: MOZ_CRASH("Unexpected module type"); - case JS::ModuleType::JavaScript: - return CompileJavaScriptModule(aCx, aOptions, aRequest, aModuleScript); + case JS::ModuleType::JavaScriptOrWasm: + return CompileJavaScriptOrWasmModule(aCx, aOptions, aRequest, + aModuleScript); case JS::ModuleType::JSON: return CompileJsonModule(aCx, aOptions, aRequest, aModuleScript); case JS::ModuleType::CSS: @@ -163,7 +164,7 @@ nsresult WorkerModuleLoader::CompileFetchedModule( MOZ_CRASH("Unhandled module type"); } -nsresult WorkerModuleLoader::CompileJavaScriptModule( +nsresult WorkerModuleLoader::CompileJavaScriptOrWasmModule( JSContext* aCx, JS::CompileOptions& aOptions, ModuleLoadRequest* aRequest, JS::MutableHandle<JSObject*> aModuleScript) { MOZ_ASSERT(aRequest->IsTextSource()); @@ -172,6 +173,22 @@ nsresult WorkerModuleLoader::CompileJavaScriptModule( aRequest->mLoadContext.get()); NS_ENSURE_SUCCESS(rv, rv); +#ifdef NIGHTLY_BUILD + if (aRequest->HasWasmMimeTypeEssence()) { + auto compile = [&](auto& source) { + return JS::CompileWasmModule(aCx, aOptions, source); + }; + + auto* wasmModule = maybeSource.mapNonEmpty(compile); + if (!wasmModule) { + return NS_ERROR_FAILURE; + } + + aModuleScript.set(wasmModule); + return NS_OK; + } +#endif + RefPtr<JS::Stencil> stencil; auto compile = [&](auto& source) { diff --git a/dom/workers/loader/WorkerModuleLoader.h b/dom/workers/loader/WorkerModuleLoader.h @@ -79,9 +79,9 @@ class WorkerModuleLoader : public JS::loader::ModuleLoaderBase { JS::CompileOptions& aOptions, ModuleLoadRequest* aRequest, JS::MutableHandle<JSObject*> aModuleScript) override; - nsresult CompileJavaScriptModule(JSContext* aCx, JS::CompileOptions& aOptions, - ModuleLoadRequest* aRequest, - JS::MutableHandle<JSObject*> aModuleScript); + nsresult CompileJavaScriptOrWasmModule( + JSContext* aCx, JS::CompileOptions& aOptions, ModuleLoadRequest* aRequest, + JS::MutableHandle<JSObject*> aModuleScript); nsresult CompileJsonModule(JSContext* aCx, JS::CompileOptions& aOptions, ModuleLoadRequest* aRequest, diff --git a/dom/worklet/loader/WorkletModuleLoader.cpp b/dom/worklet/loader/WorkletModuleLoader.cpp @@ -11,6 +11,7 @@ #include "js/friend/ErrorMessages.h" // js::GetErrorMessage, JSMSG_* #include "js/loader/ModuleLoadRequest.h" #include "mozilla/ScopeExit.h" +#include "mozilla/StaticPrefs_javascript.h" #include "mozilla/dom/StructuredCloneHolder.h" #include "mozilla/dom/Worklet.h" #include "mozilla/dom/WorkletFetchHandler.h" @@ -109,8 +110,9 @@ nsresult WorkletModuleLoader::CompileFetchedModule( case JS::ModuleType::Unknown: case JS::ModuleType::Bytes: MOZ_CRASH("Unexpected module type"); - case JS::ModuleType::JavaScript: - return CompileJavaScriptModule(aCx, aOptions, aRequest, aModuleScript); + case JS::ModuleType::JavaScriptOrWasm: + return CompileJavaScriptOrWasmModule(aCx, aOptions, aRequest, + aModuleScript); case JS::ModuleType::JSON: return CompileJsonModule(aCx, aOptions, aRequest, aModuleScript); case JS::ModuleType::CSS: @@ -120,7 +122,7 @@ nsresult WorkletModuleLoader::CompileFetchedModule( MOZ_CRASH("Unhandled module type"); } -nsresult WorkletModuleLoader::CompileJavaScriptModule( +nsresult WorkletModuleLoader::CompileJavaScriptOrWasmModule( JSContext* aCx, JS::CompileOptions& aOptions, ModuleLoadRequest* aRequest, JS::MutableHandle<JSObject*> aModuleScript) { MOZ_ASSERT(aRequest->IsTextSource()); @@ -130,6 +132,22 @@ nsresult WorkletModuleLoader::CompileJavaScriptModule( aRequest->mLoadContext.get()); NS_ENSURE_SUCCESS(rv, rv); +#ifdef NIGHTLY_BUILD + if (aRequest->HasWasmMimeTypeEssence()) { + auto compile = [&](auto& source) { + return JS::CompileWasmModule(aCx, aOptions, source); + }; + + auto* wasmModule = maybeSource.mapNonEmpty(compile); + if (!wasmModule) { + return NS_ERROR_FAILURE; + } + + aModuleScript.set(wasmModule); + return NS_OK; + } +#endif + RefPtr<JS::Stencil> stencil; auto compile = [&](auto& source) { diff --git a/dom/worklet/loader/WorkletModuleLoader.h b/dom/worklet/loader/WorkletModuleLoader.h @@ -76,9 +76,9 @@ class WorkletModuleLoader : public JS::loader::ModuleLoaderBase { JS::CompileOptions& aOptions, JS::loader::ModuleLoadRequest* aRequest, JS::MutableHandle<JSObject*> aModuleScript) override; - nsresult CompileJavaScriptModule(JSContext* aCx, JS::CompileOptions& aOptions, - ModuleLoadRequest* aRequest, - JS::MutableHandle<JSObject*> aModuleScript); + nsresult CompileJavaScriptOrWasmModule( + JSContext* aCx, JS::CompileOptions& aOptions, ModuleLoadRequest* aRequest, + JS::MutableHandle<JSObject*> aModuleScript); nsresult CompileJsonModule(JSContext* aCx, JS::CompileOptions& aOptions, ModuleLoadRequest* aRequest,