diff --git a/dom/script/LoadedScript.cpp b/dom/script/LoadedScript.cpp index ea7f78cfee70..9cb7843643e1 100644 --- a/dom/script/LoadedScript.cpp +++ b/dom/script/LoadedScript.cpp @@ -53,6 +53,33 @@ LoadedScript::LoadedScript(ScriptKind aKind, ScriptLoader* aLoader, LoadedScript::~LoadedScript() { DropJSObjects(this); } +void LoadedScript::AssociateWithScript(JSScript* aScript) { + // Set a JSScript's private value to point to this object and + // increment our reference count. This is decremented by + // HostFinalizeTopLevelScript() below when the JSScript dies. + + MOZ_ASSERT(JS::GetScriptPrivate(aScript).isUndefined()); + JS::SetScriptPrivate(aScript, JS::PrivateValue(this)); + AddRef(); +} + +void HostFinalizeTopLevelScript(JSFreeOp* aFop, const JS::Value& aPrivate) { + // Decrement the reference count of a LoadedScript object that is + // pointed to by a dying JSScript. The reference count was + // originally incremented by AssociateWithScript() above. + + auto script = static_cast(aPrivate.toPrivate()); + +#ifdef DEBUG + if (script->IsModuleScript()) { + JSObject* module = script->AsModuleScript()->mModuleRecord.unbarrieredGet(); + MOZ_ASSERT(JS::GetModulePrivate(module) == aPrivate); + } +#endif + + script->Release(); +} + ////////////////////////////////////////////////////////////// // ClassicScript ////////////////////////////////////////////////////////////// @@ -132,15 +159,6 @@ void ModuleScript::SetModuleRecord(JS::Handle aModuleRecord) { AddRef(); } -void HostFinalizeTopLevelScript(JSFreeOp* aFop, const JS::Value& aPrivate) { - auto script = static_cast(aPrivate.toPrivate()); - if (script) { - MOZ_ASSERT(JS::GetModulePrivate(script->mModuleRecord.unbarrieredGet()) == - aPrivate); - script->UnlinkModuleRecord(); - } -} - void ModuleScript::SetParseError(const JS::Value& aError) { MOZ_ASSERT(!aError.isUndefined()); MOZ_ASSERT(!HasParseError()); diff --git a/dom/script/LoadedScript.h b/dom/script/LoadedScript.h index b94cc39ce5ff..4b12f3bd36be 100644 --- a/dom/script/LoadedScript.h +++ b/dom/script/LoadedScript.h @@ -48,6 +48,8 @@ class LoadedScript : public nsISupports { ScriptLoader* Loader() const { return mLoader; } ScriptFetchOptions* FetchOptions() const { return mFetchOptions; } nsIURI* BaseURL() const { return mBaseURL; } + + void AssociateWithScript(JSScript* aScript); }; class ClassicScript final : public LoadedScript { diff --git a/dom/script/ModuleLoadRequest.cpp b/dom/script/ModuleLoadRequest.cpp index aadf3c6fd191..070c0ef127d5 100644 --- a/dom/script/ModuleLoadRequest.cpp +++ b/dom/script/ModuleLoadRequest.cpp @@ -25,13 +25,13 @@ NS_IMPL_CYCLE_COLLECTION_CLASS(ModuleLoadRequest) NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(ModuleLoadRequest, ScriptLoadRequest) - NS_IMPL_CYCLE_COLLECTION_UNLINK(mBaseURL, mLoader, mModuleScript, mImports) + NS_IMPL_CYCLE_COLLECTION_UNLINK(mLoader, mModuleScript, mImports) tmp->ClearDynamicImport(); NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(ModuleLoadRequest, ScriptLoadRequest) - NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mBaseURL, mLoader, mModuleScript, mImports) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mLoader, mModuleScript, mImports) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED(ModuleLoadRequest, @@ -74,7 +74,7 @@ static VisitedURLSet* NewVisitedSetForTopLevelImport(nsIURI* aURI) { } /* static */ ModuleLoadRequest* ModuleLoadRequest::CreateDynamicImport( - nsIURI* aURI, ModuleScript* aScript, + nsIURI* aURI, LoadedScript* aScript, JS::Handle aReferencingPrivate, JS::Handle aSpecifier, JS::Handle aPromise) { MOZ_ASSERT(aSpecifier); diff --git a/dom/script/ModuleLoadRequest.h b/dom/script/ModuleLoadRequest.h index b45a95d3795c..fbb764429370 100644 --- a/dom/script/ModuleLoadRequest.h +++ b/dom/script/ModuleLoadRequest.h @@ -59,7 +59,7 @@ class ModuleLoadRequest final : public ScriptLoadRequest { // Create a module load request for dynamic module import. static ModuleLoadRequest* CreateDynamicImport( - nsIURI* aURI, ModuleScript* aScript, + nsIURI* aURI, LoadedScript* aScript, JS::Handle aReferencingPrivate, JS::Handle aSpecifier, JS::Handle aPromise); @@ -87,9 +87,6 @@ class ModuleLoadRequest final : public ScriptLoadRequest { // Is this the top level request for a dynamic module import? const bool mIsDynamicImport; - // The base URL used for resolving relative module imports. - nsCOMPtr mBaseURL; - // Pointer to the script loader, used to trigger actions when the module load // finishes. RefPtr mLoader; diff --git a/dom/script/ScriptLoadRequest.cpp b/dom/script/ScriptLoadRequest.cpp index ff4c6538287d..b6e2ac2b6204 100644 --- a/dom/script/ScriptLoadRequest.cpp +++ b/dom/script/ScriptLoadRequest.cpp @@ -50,15 +50,13 @@ NS_IMPL_CYCLE_COLLECTING_RELEASE(ScriptLoadRequest) NS_IMPL_CYCLE_COLLECTION_CLASS(ScriptLoadRequest) NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(ScriptLoadRequest) - NS_IMPL_CYCLE_COLLECTION_UNLINK(mFetchOptions) - NS_IMPL_CYCLE_COLLECTION_UNLINK(mCacheInfo) + NS_IMPL_CYCLE_COLLECTION_UNLINK(mFetchOptions, mCacheInfo) tmp->mScript = nullptr; tmp->DropBytecodeCacheReferences(); NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(ScriptLoadRequest) - NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mFetchOptions) - NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mCacheInfo) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mFetchOptions, mCacheInfo) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(ScriptLoadRequest) diff --git a/dom/script/ScriptLoadRequest.h b/dom/script/ScriptLoadRequest.h index 20672e77bd61..3fd566846404 100644 --- a/dom/script/ScriptLoadRequest.h +++ b/dom/script/ScriptLoadRequest.h @@ -273,6 +273,9 @@ class ScriptLoadRequest // Holds the Cache information, which is used to register the bytecode // on the cache entry, such that we can load it the next time. nsCOMPtr mCacheInfo; + + // The base URL used for resolving relative module imports. + nsCOMPtr mBaseURL; }; class ScriptLoadRequestList : private mozilla::LinkedList { diff --git a/dom/script/ScriptLoader.cpp b/dom/script/ScriptLoader.cpp index 0a51a01231a5..5fcbc4a31af7 100644 --- a/dom/script/ScriptLoader.cpp +++ b/dom/script/ScriptLoader.cpp @@ -547,7 +547,7 @@ static nsresult HandleResolveFailure(JSContext* aCx, ModuleScript* aScript, } static already_AddRefed ResolveModuleSpecifier( - ModuleScript* aScript, const nsAString& aSpecifier) { + LoadedScript* aScript, const nsAString& aSpecifier) { // The following module specifiers are allowed by the spec: // - a valid absolute URL // - a valid relative URL that starts with "/", "./" or "../" @@ -738,9 +738,12 @@ JSObject* HostResolveImportedModule(JSContext* aCx, return nullptr; } - auto script = static_cast(aReferencingPrivate.toPrivate()); - MOZ_ASSERT(JS::GetModulePrivate(script->ModuleRecord()) == - aReferencingPrivate); + RefPtr script = + static_cast(aReferencingPrivate.toPrivate()); + MOZ_ASSERT_IF( + script->IsModuleScript(), + JS::GetModulePrivate(script->AsModuleScript()->ModuleRecord()) == + aReferencingPrivate); // Let url be the result of resolving a module specifier given referencing // module script and specifier. @@ -769,7 +772,9 @@ JSObject* HostResolveImportedModule(JSContext* aCx, bool HostPopulateImportMeta(JSContext* aCx, JS::Handle aReferencingPrivate, JS::Handle aMetaObject) { - auto script = static_cast(aReferencingPrivate.toPrivate()); + RefPtr script = + static_cast(aReferencingPrivate.toPrivate()); + MOZ_ASSERT(script->IsModuleScript()); MOZ_ASSERT(JS::GetModulePrivate(script->ModuleRecord()) == aReferencingPrivate); @@ -797,9 +802,11 @@ bool HostImportModuleDynamically(JSContext* aCx, return false; } - auto script = static_cast(aReferencingPrivate.toPrivate()); - MOZ_ASSERT(JS::GetModulePrivate(script->ModuleRecord()) == - aReferencingPrivate); + auto script = static_cast(aReferencingPrivate.toPrivate()); + MOZ_ASSERT_IF( + script->IsModuleScript(), + JS::GetModulePrivate(script->AsModuleScript()->ModuleRecord()) == + aReferencingPrivate); // Attempt to resolve the module specifier. nsAutoJSString string; @@ -1633,10 +1640,10 @@ bool ScriptLoader::ProcessInlineScript(nsIScriptElement* aElement, LOG(("ScriptLoadRequest (%p): Created request for inline script", request.get())); + request->mBaseURL = mDocument->GetDocBaseURI(); + if (request->IsModuleRequest()) { ModuleLoadRequest* modReq = request->AsModuleRequest(); - modReq->mBaseURL = mDocument->GetDocBaseURI(); - if (aElement->GetParserCreated() != NOT_FROM_PARSER) { if (aElement->GetScriptAsync()) { AddAsyncRequest(modReq); @@ -2523,6 +2530,13 @@ nsresult ScriptLoader::EvaluateScript(ScriptLoadRequest* aRequest) { if (rv == NS_OK) { script = exec.GetScript(); + + // Create a ClassicScript object and associate it with the + // JSScript. + RefPtr classicScript = new ClassicScript( + this, aRequest->mFetchOptions, aRequest->mBaseURL); + classicScript->AssociateWithScript(script); + rv = exec.ExecScript(); } } @@ -3301,6 +3315,18 @@ nsresult ScriptLoader::PrepareLoadedRequest(ScriptLoadRequest* aRequest, mParserBlockingRequest == aRequest, "aRequest should be pending!"); + nsCOMPtr uri; + rv = channel->GetOriginalURI(getter_AddRefs(uri)); + NS_ENSURE_SUCCESS(rv, rv); + + // Fixup moz-extension: and resource: URIs, because the channel URI will + // point to file:, which won't be allowed to load. + if (uri && IsInternalURIScheme(uri)) { + aRequest->mBaseURL = uri; + } else { + channel->GetURI(getter_AddRefs(aRequest->mBaseURL)); + } + if (aRequest->IsModuleRequest()) { MOZ_ASSERT(aRequest->IsSource()); ModuleLoadRequest* request = aRequest->AsModuleRequest(); @@ -3314,18 +3340,6 @@ nsresult ScriptLoader::PrepareLoadedRequest(ScriptLoadRequest* aRequest, return NS_ERROR_FAILURE; } - nsCOMPtr uri; - rv = channel->GetOriginalURI(getter_AddRefs(uri)); - NS_ENSURE_SUCCESS(rv, rv); - - // Fixup moz-extension: and resource: URIs, because the channel URI will - // point to file:, which won't be allowed to load. - if (uri && IsInternalURIScheme(uri)) { - request->mBaseURL = uri; - } else { - channel->GetURI(getter_AddRefs(request->mBaseURL)); - } - // Attempt to compile off main thread. bool couldCompile = false; rv = AttemptAsyncScriptCompile(request, &couldCompile); diff --git a/testing/web-platform/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-classic.html.ini b/testing/web-platform/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-classic.html.ini index 827b9986fd16..89fb96dec92a 100644 --- a/testing/web-platform/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-classic.html.ini +++ b/testing/web-platform/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-classic.html.ini @@ -5,6 +5,3 @@ [propagate-nonce-external-classic] expected: FAIL - [Dynamically imported module should eval when imported from script w/ a valid nonce.] - expected: FAIL - diff --git a/testing/web-platform/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-classic.html.ini b/testing/web-platform/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-classic.html.ini index 302a413503a9..6f6f2c3602c3 100644 --- a/testing/web-platform/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-classic.html.ini +++ b/testing/web-platform/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-classic.html.ini @@ -5,6 +5,3 @@ [propagate-nonce-inline-classic] expected: FAIL - [Dynamically imported module should eval when imported from script w/ a valid nonce.] - expected: FAIL - diff --git a/testing/web-platform/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-external-classic.html.ini b/testing/web-platform/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-external-classic.html.ini index 8e4b5e1742a5..45185824b234 100644 --- a/testing/web-platform/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-external-classic.html.ini +++ b/testing/web-platform/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-external-classic.html.ini @@ -2,12 +2,6 @@ [setTimeout should successfully import] expected: FAIL - [eval should successfully import] - expected: FAIL - - [Function should successfully import] - expected: FAIL - [reflected-inline-event-handlers should successfully import] expected: FAIL diff --git a/testing/web-platform/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-inline-classic.html.ini b/testing/web-platform/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-inline-classic.html.ini index 940a7b9ebef7..d3d048996519 100644 --- a/testing/web-platform/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-inline-classic.html.ini +++ b/testing/web-platform/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-inline-classic.html.ini @@ -2,12 +2,6 @@ [setTimeout should successfully import] expected: FAIL - [eval should successfully import] - expected: FAIL - - [the Function constructor should successfully import] - expected: FAIL - [reflected inline event handlers should successfully import] expected: FAIL diff --git a/testing/web-platform/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-classic.html.ini b/testing/web-platform/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-classic.html.ini index 0fe906742db6..d4d74bf69418 100644 --- a/testing/web-platform/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-classic.html.ini +++ b/testing/web-platform/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-classic.html.ini @@ -1,13 +1,7 @@ [string-compilation-classic.html] - [eval should successfully import] - expected: FAIL - [setTimeout should successfully import] expected: FAIL - [the Function constructor should successfully import] - expected: FAIL - [reflected inline event handlers should successfully import] expected: FAIL diff --git a/testing/web-platform/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic.html.ini b/testing/web-platform/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic.html.ini index a95f8c1be910..c855a8e62183 100644 --- a/testing/web-platform/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic.html.ini +++ b/testing/web-platform/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic.html.ini @@ -2,15 +2,6 @@ [setTimeout must inherit the nonce from the triggering script, thus execute] expected: FAIL - [direct eval must inherit the nonce from the triggering script, thus execute] - expected: FAIL - - [indirect eval must inherit the nonce from the triggering script, thus execute] - expected: FAIL - - [the Function constructor must inherit the nonce from the triggering script, thus execute] - expected: FAIL - [reflected inline event handlers must inherit the nonce from the triggering script, thus execute] expected: FAIL