diff --git a/dom/script/ModuleLoader.cpp b/dom/script/ModuleLoader.cpp index 53d112b3e741..e6343c18217a 100644 --- a/dom/script/ModuleLoader.cpp +++ b/dom/script/ModuleLoader.cpp @@ -304,8 +304,7 @@ already_AddRefed ModuleLoader::CreateStaticImport( already_AddRefed ModuleLoader::CreateDynamicImport( JSContext* aCx, nsIURI* aURI, LoadedScript* aMaybeActiveScript, - JS::Handle aReferencingPrivate, JS::Handle aSpecifier, - JS::Handle aPromise) { + JS::Handle aSpecifier, JS::Handle aPromise) { MOZ_ASSERT(aSpecifier); MOZ_ASSERT(aPromise); @@ -357,7 +356,7 @@ already_AddRefed ModuleLoader::CreateDynamicImport( /* is top level */ true, /* is dynamic import */ this, ModuleLoadRequest::NewVisitedSetForTopLevelImport(aURI), nullptr); - request->mDynamicReferencingPrivate = aReferencingPrivate; + request->mDynamicReferencingScript = aMaybeActiveScript; request->mDynamicSpecifier = aSpecifier; request->mDynamicPromise = aPromise; diff --git a/dom/script/ModuleLoader.h b/dom/script/ModuleLoader.h index df74aa478df1..4f3f270f0bf8 100644 --- a/dom/script/ModuleLoader.h +++ b/dom/script/ModuleLoader.h @@ -72,7 +72,6 @@ class ModuleLoader final : public JS::loader::ModuleLoaderBase { // Create a module load request for a dynamic module import. already_AddRefed CreateDynamicImport( JSContext* aCx, nsIURI* aURI, LoadedScript* aMaybeActiveScript, - JS::Handle aReferencingPrivate, JS::Handle aSpecifier, JS::Handle aPromise) override; diff --git a/dom/workers/loader/WorkerModuleLoader.cpp b/dom/workers/loader/WorkerModuleLoader.cpp index 306a48ebe72c..7a1b3288bdbf 100644 --- a/dom/workers/loader/WorkerModuleLoader.cpp +++ b/dom/workers/loader/WorkerModuleLoader.cpp @@ -83,8 +83,7 @@ bool WorkerModuleLoader::CreateDynamicImportLoader() { already_AddRefed WorkerModuleLoader::CreateDynamicImport( JSContext* aCx, nsIURI* aURI, LoadedScript* aMaybeActiveScript, - JS::Handle aReferencingPrivate, JS::Handle aSpecifier, - JS::Handle aPromise) { + JS::Handle aSpecifier, JS::Handle aPromise) { WorkerPrivate* workerPrivate = GetCurrentThreadWorkerPrivate(); if (!CreateDynamicImportLoader()) { @@ -143,7 +142,7 @@ already_AddRefed WorkerModuleLoader::CreateDynamicImport( /* is top level */ true, /* is dynamic import */ this, ModuleLoadRequest::NewVisitedSetForTopLevelImport(aURI), nullptr); - request->mDynamicReferencingPrivate = aReferencingPrivate; + request->mDynamicReferencingScript = aMaybeActiveScript; request->mDynamicSpecifier = aSpecifier; request->mDynamicPromise = aPromise; diff --git a/dom/workers/loader/WorkerModuleLoader.h b/dom/workers/loader/WorkerModuleLoader.h index 2fcd3125a41e..c8cef92f2927 100644 --- a/dom/workers/loader/WorkerModuleLoader.h +++ b/dom/workers/loader/WorkerModuleLoader.h @@ -63,7 +63,6 @@ class WorkerModuleLoader : public JS::loader::ModuleLoaderBase { already_AddRefed CreateDynamicImport( JSContext* aCx, nsIURI* aURI, LoadedScript* aMaybeActiveScript, - JS::Handle aReferencingPrivate, JS::Handle aSpecifier, JS::Handle aPromise) override; diff --git a/dom/worklet/loader/WorkletModuleLoader.cpp b/dom/worklet/loader/WorkletModuleLoader.cpp index 66fb1eb4eea3..ec8409377588 100644 --- a/dom/worklet/loader/WorkletModuleLoader.cpp +++ b/dom/worklet/loader/WorkletModuleLoader.cpp @@ -79,8 +79,7 @@ already_AddRefed WorkletModuleLoader::CreateStaticImport( already_AddRefed WorkletModuleLoader::CreateDynamicImport( JSContext* aCx, nsIURI* aURI, LoadedScript* aMaybeActiveScript, - JS::Handle aReferencingPrivate, JS::Handle aSpecifier, - JS::Handle aPromise) { + JS::Handle aSpecifier, JS::Handle aPromise) { return nullptr; } diff --git a/dom/worklet/loader/WorkletModuleLoader.h b/dom/worklet/loader/WorkletModuleLoader.h index 818720ced841..3fb2a592312b 100644 --- a/dom/worklet/loader/WorkletModuleLoader.h +++ b/dom/worklet/loader/WorkletModuleLoader.h @@ -68,7 +68,6 @@ class WorkletModuleLoader : public JS::loader::ModuleLoaderBase { already_AddRefed CreateDynamicImport( JSContext* aCx, nsIURI* aURI, LoadedScript* aMaybeActiveScript, - JS::Handle aReferencingPrivate, JS::Handle aSpecifier, JS::Handle aPromise) override; diff --git a/js/loader/ImportMap.cpp b/js/loader/ImportMap.cpp index bf9eafe8e6e9..51543511a731 100644 --- a/js/loader/ImportMap.cpp +++ b/js/loader/ImportMap.cpp @@ -601,7 +601,7 @@ ResolveResult ImportMap::ResolveModuleSpecifier(ImportMap* aImportMap, LOG(("ImportMap::ResolveModuleSpecifier specifier: %s", NS_ConvertUTF16toUTF8(aSpecifier).get())); nsCOMPtr baseURL; - if (aScript) { + if (aScript && !aScript->IsEventScript()) { baseURL = aScript->BaseURL(); } else { baseURL = aLoader->GetBaseURI(); diff --git a/js/loader/ModuleLoadRequest.cpp b/js/loader/ModuleLoadRequest.cpp index 818481a7f30d..c91403123d08 100644 --- a/js/loader/ModuleLoadRequest.cpp +++ b/js/loader/ModuleLoadRequest.cpp @@ -28,19 +28,20 @@ NS_IMPL_CYCLE_COLLECTION_CLASS(ModuleLoadRequest) NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(ModuleLoadRequest, ScriptLoadRequest) NS_IMPL_CYCLE_COLLECTION_UNLINK(mLoader, mRootModule, mModuleScript, mImports, - mWaitingParentRequest) + mWaitingParentRequest, + mDynamicReferencingScript) tmp->ClearDynamicImport(); NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(ModuleLoadRequest, ScriptLoadRequest) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mLoader, mRootModule, mModuleScript, - mImports, mWaitingParentRequest) + mImports, mWaitingParentRequest, + mDynamicReferencingScript) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED(ModuleLoadRequest, ScriptLoadRequest) - NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mDynamicReferencingPrivate) NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mDynamicSpecifier) NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mDynamicPromise) NS_IMPL_CYCLE_COLLECTION_TRACE_END @@ -230,7 +231,7 @@ void ModuleLoadRequest::LoadFinished() { } void ModuleLoadRequest::ClearDynamicImport() { - mDynamicReferencingPrivate = JS::UndefinedValue(); + mDynamicReferencingScript = nullptr; mDynamicSpecifier = nullptr; mDynamicPromise = nullptr; } diff --git a/js/loader/ModuleLoadRequest.h b/js/loader/ModuleLoadRequest.h index ab557f15272d..4413c5f00d41 100644 --- a/js/loader/ModuleLoadRequest.h +++ b/js/loader/ModuleLoadRequest.h @@ -18,6 +18,7 @@ namespace JS::loader { +class LoadedScript; class ModuleScript; class ModuleLoaderBase; @@ -163,7 +164,7 @@ class ModuleLoadRequest final : public ScriptLoadRequest { RefPtr mVisitedSet; // For dynamic imports, the details to pass to FinishDynamicImport. - JS::Heap mDynamicReferencingPrivate; + RefPtr mDynamicReferencingScript; JS::Heap mDynamicSpecifier; JS::Heap mDynamicPromise; }; diff --git a/js/loader/ModuleLoaderBase.cpp b/js/loader/ModuleLoaderBase.cpp index 34ad3a0f6158..73f2cc6ba5a7 100644 --- a/js/loader/ModuleLoaderBase.cpp +++ b/js/loader/ModuleLoaderBase.cpp @@ -331,8 +331,8 @@ bool ModuleLoaderBase::HostImportModuleDynamically( // Create a new top-level load request. nsCOMPtr uri = result.unwrap(); - RefPtr request = loader->CreateDynamicImport( - aCx, uri, script, aReferencingPrivate, specifierString, aPromise); + RefPtr request = + loader->CreateDynamicImport(aCx, uri, script, specifierString, aPromise); if (!request) { // Throws TypeError if CreateDynamicImport returns nullptr. @@ -381,9 +381,6 @@ LoadedScript* ModuleLoaderBase::GetLoadedScriptOrNull( } auto* script = static_cast(aReferencingPrivate.toPrivate()); - if (script->IsEventScript()) { - return nullptr; - } MOZ_ASSERT_IF( script->IsModuleScript(), @@ -393,6 +390,14 @@ LoadedScript* ModuleLoaderBase::GetLoadedScriptOrNull( return script; } +JS::Value PrivateFromLoadedScript(LoadedScript* aScript) { + if (!aScript) { + return JS::UndefinedValue(); + } + + return JS::PrivateValue(aScript); +} + nsresult ModuleLoaderBase::StartModuleLoad(ModuleLoadRequest* aRequest) { return StartOrRestartModuleLoad(aRequest, RestartRequest::No); } @@ -769,7 +774,7 @@ ResolveResult ModuleLoaderBase::ResolveModuleSpecifier( // Get the document's base URL if we don't have a referencing script here. nsCOMPtr baseURL; - if (aScript) { + if (aScript && !aScript->IsEventScript()) { baseURL = aScript->BaseURL(); } else { baseURL = GetBaseURI(); @@ -1000,8 +1005,8 @@ void ModuleLoaderBase::FinishDynamicImport( JSMSG_DYNAMIC_IMPORT_FAILED, url.get()); } - JS::Rooted referencingScript(aCx, - aRequest->mDynamicReferencingPrivate); + JS::Rooted referencingScript( + aCx, PrivateFromLoadedScript(aRequest->mDynamicReferencingScript)); JS::Rooted specifier(aCx, aRequest->mDynamicSpecifier); JS::Rooted promise(aCx, aRequest->mDynamicPromise); diff --git a/js/loader/ModuleLoaderBase.h b/js/loader/ModuleLoaderBase.h index 8215472aa96f..6341de3030b0 100644 --- a/js/loader/ModuleLoaderBase.h +++ b/js/loader/ModuleLoaderBase.h @@ -232,7 +232,6 @@ class ModuleLoaderBase : public nsISupports { // Called by HostImportModuleDynamically hook. virtual already_AddRefed CreateDynamicImport( JSContext* aCx, nsIURI* aURI, LoadedScript* aMaybeActiveScript, - JS::Handle aReferencingPrivate, JS::Handle aSpecifier, JS::Handle aPromise) = 0; // Check whether we can load a module. May return false with |aRvOut| set to diff --git a/js/xpconnect/loader/ComponentModuleLoader.cpp b/js/xpconnect/loader/ComponentModuleLoader.cpp index c8a8207c6dcf..082f6aa0c0fd 100644 --- a/js/xpconnect/loader/ComponentModuleLoader.cpp +++ b/js/xpconnect/loader/ComponentModuleLoader.cpp @@ -74,8 +74,7 @@ already_AddRefed ComponentModuleLoader::CreateStaticImport( already_AddRefed ComponentModuleLoader::CreateDynamicImport( JSContext* aCx, nsIURI* aURI, LoadedScript* aMaybeActiveScript, - JS::Handle aReferencingPrivate, JS::Handle aSpecifier, - JS::Handle aPromise) { + JS::Handle aSpecifier, JS::Handle aPromise) { return nullptr; // Not yet implemented. } diff --git a/js/xpconnect/loader/ComponentModuleLoader.h b/js/xpconnect/loader/ComponentModuleLoader.h index 7dd39dd34235..157ec226cae5 100644 --- a/js/xpconnect/loader/ComponentModuleLoader.h +++ b/js/xpconnect/loader/ComponentModuleLoader.h @@ -70,7 +70,6 @@ class ComponentModuleLoader : public JS::loader::ModuleLoaderBase { already_AddRefed CreateDynamicImport( JSContext* aCx, nsIURI* aURI, LoadedScript* aMaybeActiveScript, - JS::Handle aReferencingPrivate, JS::Handle aSpecifier, JS::Handle aPromise) override;