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:
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,