tor-browser

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

commit 13ff5f1bada52dccf5951f3873dc815bfcf3895e
parent b8c19c83ae706c6c53304e9c0f557db6c5b06700
Author: Atila Butkovits <abutkovits@mozilla.com>
Date:   Wed, 22 Oct 2025 08:37:56 +0300

Revert "Bug 1991607 - Part 12: Reorder ScriptLoadRequest/ModuleLoadRequest fields. r=bthrall" for causing bustages at LoadedScript.cpp.

This reverts commit 30499d5cdcb99af41b410b0970e1f74c4f2b34bc.

Revert "Bug 1991607 - Part 11: Remove ScriptLoadRequest::mBaseURL. r=bthrall,dom-worker-reviewers,edenchuang"

This reverts commit 85324622ab5f4b2443e92b29b247d293b75c55e0.

Revert "Bug 1991607 - Part 10: Remove ScriptLoadRequest::mURI. r=bthrall,dom-worker-reviewers,edenchuang"

This reverts commit 3b1afd5ca0a2cc02581ee863977de7c143706d42.

Revert "Bug 1991607 - Part 9: Pass URI to LoadedScript ctor from ScriptLoadRequest ctor callsites. r=bthrall,dom-worker-reviewers,edenchuang"

This reverts commit 10dc4e2bc0cfecaa995c6653c50f7e7f8f13e6dc.

Revert "Bug 1991607 - Part 8: Remove ScriptLoadRequest::mFetchOptions. r=bthrall,dom-worker-reviewers,edenchuang"

This reverts commit b4c09eb6e19fe3aae6d283f359cfd85d529fc275.

Revert "Bug 1991607 - Part 7: Pass FetchOptions to LoadedScript ctor from ScriptLoadRequest ctor callsites. r=bthrall,dom-worker-reviewers,edenchuang"

This reverts commit f48d2160e1bf8364350954fb28d5a8559d0356de.

Revert "Bug 1991607 - Part 6: Remove ScriptLoadRequest::mReferrerPolicy. r=bthrall,dom-worker-reviewers,edenchuang"

This reverts commit a6901c3f1d520a3893be49cea4da6ee031f72a72.

Revert "Bug 1991607 - Part 5: Pass ReferrerPolicy to LoadedScript ctor from ScriptLoadRequest ctor callsites. r=bthrall,dom-worker-reviewers,edenchuang"

This reverts commit c2b5cb885aaa3a83843c8f8e983efe63f8cf4068.

Revert "Bug 1991607 - Part 4: Add ImportMapScript subclass for LoadedScript. r=bthrall"

This reverts commit 09b8ae44b8709f29ce02f69a7b181f4c2e576a20.

Revert "Bug 1991607 - Part 3: Make LoadedScript::mKind field const. r=bthrall"

This reverts commit 3eebccc479c4a13bd12dc9be33a4956d5f1bf53b.

Revert "Bug 1991607 - Part 2: Let ScriptLoader::CheckContentPolicy receive LoadedScript-related parameters separately. r=bthrall"

This reverts commit dd8530cb712421183ae28572cad60551445be0bb.

Revert "Bug 1991607 - Part 1: Let ScriptHashKey and ScriptLoadData receive LoadedScript-related parameters separately. r=bthrall"

This reverts commit b4a4f94096c14d0602a2c4007046e84559e169cb.

Diffstat:
Mdom/script/ModuleLoader.cpp | 24+++++++++++++-----------
Mdom/script/ScriptLoadContext.cpp | 4++--
Mdom/script/ScriptLoadHandler.cpp | 6+++---
Mdom/script/ScriptLoader.cpp | 141+++++++++++++++++++++++++++++++++++++++++--------------------------------------
Mdom/script/ScriptLoader.h | 8+++-----
Mdom/script/SharedScriptCache.cpp | 25++++++++-----------------
Mdom/script/SharedScriptCache.h | 12+++---------
Mdom/workers/ScriptLoader.cpp | 20++++++++++++--------
Mdom/workers/loader/CacheLoadHandler.cpp | 4++--
Mdom/workers/loader/WorkerModuleLoader.cpp | 7++++---
Mdom/worklet/WorkletFetchHandler.cpp | 11++++++-----
Mdom/worklet/loader/WorkletModuleLoader.cpp | 14+++++++-------
Mjs/loader/LoadedScript.cpp | 41++---------------------------------------
Mjs/loader/LoadedScript.h | 52++++++----------------------------------------------
Mjs/loader/ModuleLoadRequest.cpp | 15+++++++++------
Mjs/loader/ModuleLoadRequest.h | 20+++++++++++---------
Mjs/loader/ModuleLoaderBase.cpp | 49++++++++++++++++++++++++++++++++++++-------------
Mjs/loader/ScriptLoadRequest.cpp | 72++++++++++++++++++++++++++++++++++++++++++++++++------------------------
Mjs/loader/ScriptLoadRequest.h | 75++++++++++++++++++++++++++++++++++++++++++++++-----------------------------
Mjs/xpconnect/loader/SyncModuleLoader.cpp | 11++++++-----
Mjs/xpconnect/loader/mozJSModuleLoader.cpp | 15++++++++-------
21 files changed, 308 insertions(+), 318 deletions(-)

diff --git a/dom/script/ModuleLoader.cpp b/dom/script/ModuleLoader.cpp @@ -73,7 +73,7 @@ bool ModuleLoader::CanStartLoad(ModuleLoadRequest* aRequest, nsresult* aRvOut) { if (BasePrincipal::Cast(principal)->ContentScriptAddonPolicy()) { // To prevent dynamic code execution, content scripts can only // load moz-extension URLs. - if (!aRequest->URI()->SchemeIs("moz-extension")) { + if (!aRequest->mURI->SchemeIs("moz-extension")) { *aRvOut = NS_ERROR_DOM_WEBEXT_CONTENT_SCRIPT_URI; return false; } @@ -87,7 +87,7 @@ bool ModuleLoader::CanStartLoad(ModuleLoadRequest* aRequest, nsresult* aRvOut) { if (LOG_ENABLED()) { nsAutoCString url; - aRequest->URI()->GetAsciiSpec(url); + aRequest->mURI->GetAsciiSpec(url); LOG(("ScriptLoadRequest (%p): Start Module Load (url = %s)", aRequest, url.get())); } @@ -402,7 +402,7 @@ nsresult ModuleLoader::CompileCssModule( // https://github.com/whatwg/html/issues/11629). dom::CSSStyleSheetInit options; RefPtr<StyleSheet> sheet = StyleSheet::CreateConstructedSheet( - *constructorDocument, aRequest->BaseURL(), options, error); + *constructorDocument, aRequest->mBaseURL, options, error); if (error.Failed()) { return; } @@ -450,12 +450,13 @@ already_AddRefed<ModuleLoadRequest> ModuleLoader::CreateTopLevel( ScriptFetchOptions* aFetchOptions, const SRIMetadata& aIntegrity, nsIURI* aReferrer, ScriptLoadContext* aContext, ScriptLoadRequestType aRequestType) { - RefPtr<ModuleLoadRequest> request = new ModuleLoadRequest( - JS::ModuleType::JavaScript, aIntegrity, aReferrer, aContext, - ModuleLoadRequest::Kind::TopLevel, this, nullptr); + RefPtr<ModuleLoadRequest> request = + new ModuleLoadRequest(aURI, JS::ModuleType::JavaScript, aReferrerPolicy, + aFetchOptions, aIntegrity, aReferrer, aContext, + ModuleLoadRequest::Kind::TopLevel, this, nullptr); - GetScriptLoader()->TryUseCache(aReferrerPolicy, aFetchOptions, aURI, request, - aElement, aFetchOptions->mNonce, aRequestType); + GetScriptLoader()->TryUseCache(request, aElement, aFetchOptions->mNonce, + aRequestType); return request.forget(); } @@ -483,10 +484,11 @@ already_AddRefed<ModuleLoadRequest> ModuleLoader::CreateRequest( } JS::ModuleType moduleType = GetModuleRequestType(aCx, aModuleRequest); - RefPtr<ModuleLoadRequest> request = new ModuleLoadRequest( - moduleType, aSriMetadata, aBaseURL, context, kind, this, root); + RefPtr<ModuleLoadRequest> request = + new ModuleLoadRequest(aURI, moduleType, aReferrerPolicy, aOptions, + aSriMetadata, aBaseURL, context, kind, this, root); - GetScriptLoader()->TryUseCache(aReferrerPolicy, aOptions, aURI, request); + GetScriptLoader()->TryUseCache(request); return request.forget(); } diff --git a/dom/script/ScriptLoadContext.cpp b/dom/script/ScriptLoadContext.cpp @@ -225,8 +225,8 @@ void ScriptLoadContext::GetProfilerLabel(nsACString& aOutString) { } nsAutoCString url; - if (mRequest->URI()) { - mRequest->URI()->GetAsciiSpec(url); + if (mRequest->mURI) { + mRequest->mURI->GetAsciiSpec(url); } else { url = "<unknown>"; } diff --git a/dom/script/ScriptLoadHandler.cpp b/dom/script/ScriptLoadHandler.cpp @@ -135,7 +135,7 @@ NS_IMETHODIMP ScriptLoadHandler::OnStartRequest(nsIRequest* aRequest) { mRequest->SetMinimumExpirationTime( nsContentUtils::GetSubresourceCacheExpirationTime(aRequest, - mRequest->URI())); + mRequest->mURI)); return NS_OK; } @@ -368,7 +368,7 @@ ScriptLoadHandler::OnStreamComplete(nsIIncrementalStreamLoader* aLoader, nsresult rv = NS_OK; if (LOG_ENABLED()) { nsAutoCString url; - mRequest->URI()->GetAsciiSpec(url); + mRequest->mURI->GetAsciiSpec(url); LOG(("ScriptLoadRequest (%p): Stream complete (url = %s)", mRequest.get(), url.get())); } @@ -499,7 +499,7 @@ nsresult ScriptLoadHandler::AsyncOnChannelRedirect( nsIChannel* aOld, nsIChannel* aNew, uint32_t aFlags, nsIAsyncVerifyRedirectCallback* aCallback) { mRequest->SetMinimumExpirationTime( - nsContentUtils::GetSubresourceCacheExpirationTime(aOld, mRequest->URI())); + nsContentUtils::GetSubresourceCacheExpirationTime(aOld, mRequest->mURI)); aCallback->OnRedirectVerifyCallback(NS_OK); diff --git a/dom/script/ScriptLoader.cpp b/dom/script/ScriptLoader.cpp @@ -463,25 +463,21 @@ nsContentPolicyType ScriptLoadRequestToContentPolicyType( } RequestMode ComputeRequestModeForContentPolicy( - const ScriptLoadRequest* aRequest, ScriptFetchOptions* aFetchOptions) { + const ScriptLoadRequest* aRequest) { auto corsMapping = aRequest->IsModuleRequest() ? nsContentSecurityManager::REQUIRE_CORS_CHECKS : nsContentSecurityManager::CORS_NONE_MAPS_TO_DISABLED_CORS_CHECKS; return nsContentSecurityManager::SecurityModeToRequestMode( nsContentSecurityManager::ComputeSecurityMode( - nsContentSecurityManager::ComputeSecurityFlags( - aFetchOptions->mCORSMode, corsMapping))); + nsContentSecurityManager::ComputeSecurityFlags(aRequest->CORSMode(), + corsMapping))); } nsresult ScriptLoader::CheckContentPolicy(nsIScriptElement* aElement, const nsAString& aNonce, - ScriptLoadRequest* aRequest, - ScriptFetchOptions* aFetchOptions, - nsIURI* aURI) { + ScriptLoadRequest* aRequest) { MOZ_ASSERT(aRequest); - MOZ_ASSERT(aFetchOptions); - MOZ_ASSERT(aURI); nsContentPolicyType contentPolicyType = ScriptLoadRequestToContentPolicyType(aRequest); @@ -499,7 +495,7 @@ nsresult ScriptLoader::CheckContentPolicy(nsIScriptElement* aElement, aElement->GetParserCreated() != mozilla::dom::NOT_FROM_PARSER); Maybe<RequestMode> requestMode = - Some(ComputeRequestModeForContentPolicy(aRequest, aFetchOptions)); + Some(ComputeRequestModeForContentPolicy(aRequest)); secCheckLoadInfo->SetRequestMode(requestMode); // Use nonce of the current element, instead of the preload, because those // are allowed to differ. @@ -508,8 +504,9 @@ nsresult ScriptLoader::CheckContentPolicy(nsIScriptElement* aElement, aRequest->mIntegrity.GetIntegrityString()); int16_t shouldLoad = nsIContentPolicy::ACCEPT; - nsresult rv = NS_CheckContentLoadPolicy(aURI, secCheckLoadInfo, &shouldLoad, - nsContentUtils::GetContentPolicy()); + nsresult rv = + NS_CheckContentLoadPolicy(aRequest->mURI, secCheckLoadInfo, &shouldLoad, + nsContentUtils::GetContentPolicy()); if (NS_FAILED(rv) || NS_CP_REJECTED(shouldLoad)) { if (NS_FAILED(rv) || shouldLoad != nsIContentPolicy::REJECT_TYPE) { return NS_ERROR_CONTENT_BLOCKED; @@ -524,7 +521,7 @@ nsresult ScriptLoader::CheckContentPolicy(nsIScriptElement* aElement, bool ScriptLoader::IsAboutPageLoadingChromeURI(ScriptLoadRequest* aRequest, Document* aDocument) { // if the uri to be loaded is not of scheme chrome:, there is nothing to do. - if (!aRequest->URI()->SchemeIs("chrome")) { + if (!aRequest->mURI->SchemeIs("chrome")) { return false; } @@ -655,7 +652,7 @@ nsresult ScriptLoader::StartClassicLoad( if (LOG_ENABLED()) { nsAutoCString url; - aRequest->URI()->GetAsciiSpec(url); + aRequest->mURI->GetAsciiSpec(url); LOG(("ScriptLoadRequest (%p): Start Classic Load (url = %s)", aRequest, url.get())); } @@ -709,7 +706,7 @@ static nsresult CreateChannelForScriptLoading(nsIChannel** aOutChannel, context = aDocument; } - return CreateChannelForScriptLoading(aOutChannel, aDocument, aRequest->URI(), + return CreateChannelForScriptLoading(aOutChannel, aDocument, aRequest->mURI, context, aRequest->TriggeringPrincipal(), aSecurityFlags, contentPolicyType); } @@ -1003,7 +1000,7 @@ nsresult ScriptLoader::StartLoadInternal( NS_ENSURE_SUCCESS(rv, rv); mozilla::net::PredictorLearn( - aRequest->URI(), mDocument->GetDocumentURI(), + aRequest->mURI, mDocument->GetDocumentURI(), nsINetworkPredictor::LEARN_LOAD_SUBRESOURCE, mDocument->NodePrincipal()->OriginAttributesRef()); @@ -1013,7 +1010,7 @@ nsresult ScriptLoader::StartLoadInternal( NS_ENSURE_SUCCESS(rv, rv); auto key = PreloadHashKey::CreateAsScript( - aRequest->URI(), aRequest->CORSMode(), aRequest->mKind); + aRequest->mURI, aRequest->CORSMode(), aRequest->mKind); aRequest->GetScriptLoadContext()->NotifyOpen( key, channel, mDocument, aRequest->GetScriptLoadContext()->IsLinkPreloadScript(), @@ -1036,7 +1033,7 @@ nsresult ScriptLoader::StartLoadInternal( bool ScriptLoader::PreloadURIComparator::Equals(const PreloadInfo& aPi, nsIURI* const& aURI) const { bool same; - return NS_SUCCEEDED(aPi.mRequest->URI()->Equals(aURI, &same)) && same; + return NS_SUCCEEDED(aPi.mRequest->mURI->Equals(aURI, &same)) && same; } static bool CSPAllowsInlineScript(nsIScriptElement* aElement, @@ -1142,84 +1139,72 @@ already_AddRefed<ScriptLoadRequest> ScriptLoader::CreateLoadRequest( MOZ_ASSERT(aKind == ScriptKind::eClassic || aKind == ScriptKind::eImportMap); RefPtr<ScriptLoadRequest> request = - new ScriptLoadRequest(aKind, aIntegrity, referrer, context); + new ScriptLoadRequest(aKind, aURI, aReferrerPolicy, fetchOptions, + aIntegrity, referrer, context); - TryUseCache(aReferrerPolicy, fetchOptions, aURI, request, aElement, aNonce, - aRequestType); + TryUseCache(request, aElement, aNonce, aRequestType); return request.forget(); } -void ScriptLoader::TryUseCache(ReferrerPolicy aReferrerPolicy, - ScriptFetchOptions* aFetchOptions, nsIURI* aURI, - ScriptLoadRequest* aRequest, +void ScriptLoader::TryUseCache(ScriptLoadRequest* aRequest, nsIScriptElement* aElement, const nsAString& aNonce, ScriptLoadRequestType aRequestType) { if (aRequestType == ScriptLoadRequestType::Inline) { - aRequest->NoCacheEntryFound(aReferrerPolicy, aFetchOptions, aURI); + aRequest->NoCacheEntryFound(); LOG( ("ScriptLoader (%p): Created LoadedScript (%p) for " "ScriptLoadRequest(%p) %s.", this, aRequest->getLoadedScript(), aRequest, - aRequest->URI()->GetSpecOrDefault().get())); + aRequest->mURI->GetSpecOrDefault().get())); return; } if (!mCache) { - aRequest->NoCacheEntryFound(aReferrerPolicy, aFetchOptions, aURI); + aRequest->NoCacheEntryFound(); LOG( ("ScriptLoader (%p): Created LoadedScript (%p) for " "ScriptLoadRequest(%p) %s.", this, aRequest->getLoadedScript(), aRequest, - aRequest->URI()->GetSpecOrDefault().get())); + aRequest->mURI->GetSpecOrDefault().get())); return; } - // NOTE: Some ScriptLoadRequest fields aren't yet accessible until - // either NoCacheEntryFound or CacheEntryFound is called, - // which constructs LoadedScript. - // aRequest->FetchOptions() and aRequest->URI() are backed by - // LoadedScript, and we cannot use them here. - ScriptHashKey key(this, aRequest, aFetchOptions, aURI); + ScriptHashKey key(this, aRequest); auto cacheResult = mCache->Lookup(*this, key, /* aSyncLoad = */ true); if (cacheResult.mState != CachedSubResourceState::Complete) { - aRequest->NoCacheEntryFound(aReferrerPolicy, aFetchOptions, aURI); + aRequest->NoCacheEntryFound(); LOG( ("ScriptLoader (%p): Created LoadedScript (%p) for " "ScriptLoadRequest(%p) %s.", this, aRequest->getLoadedScript(), aRequest, - aRequest->URI()->GetSpecOrDefault().get())); + aRequest->mURI->GetSpecOrDefault().get())); return; } if (aRequestType == ScriptLoadRequestType::External) { // NOTE: The preload case checks the same after the // LookupPreloadRequest call. - if (NS_FAILED(CheckContentPolicy(aElement, aNonce, aRequest, aFetchOptions, - aURI))) { - aRequest->NoCacheEntryFound(aReferrerPolicy, aFetchOptions, aURI); + if (NS_FAILED(CheckContentPolicy(aElement, aNonce, aRequest))) { + aRequest->NoCacheEntryFound(); LOG( ("ScriptLoader (%p): Created LoadedScript (%p) for " "ScriptLoadRequest(%p) %s.", this, aRequest->getLoadedScript(), aRequest, - aRequest->URI()->GetSpecOrDefault().get())); + aRequest->mURI->GetSpecOrDefault().get())); return; } } aRequest->mNetworkMetadata = cacheResult.mNetworkMetadata; - MOZ_ASSERT(cacheResult.mCompleteValue->ReferrerPolicy() == aReferrerPolicy); - MOZ_ASSERT(aFetchOptions->IsCompatible( - cacheResult.mCompleteValue->GetFetchOptions())); - aRequest->CacheEntryFound(cacheResult.mCompleteValue); LOG( ("ScriptLoader (%p): Found in-memory cache LoadedScript (%p) for " "ScriptLoadRequest(%p) %s.", this, aRequest->getLoadedScript(), aRequest, - aRequest->URI()->GetSpecOrDefault().get())); + aRequest->mURI->GetSpecOrDefault().get())); if (cacheResult.mCompleteValue->mFetchCount < UINT8_MAX) { cacheResult.mCompleteValue->mFetchCount++; @@ -1241,14 +1226,14 @@ void ScriptLoader::EmulateNetworkEvents(ScriptLoadRequest* aRequest) { } NotifyObserversForCachedScript( - aRequest->URI(), context, aRequest->FetchOptions()->mTriggeringPrincipal, - CORSModeToSecurityFlags(aRequest->FetchOptions()->mCORSMode), + aRequest->mURI, context, aRequest->mFetchOptions->mTriggeringPrincipal, + CORSModeToSecurityFlags(aRequest->mFetchOptions->mCORSMode), nsIContentPolicy::TYPE_INTERNAL_SCRIPT, aRequest->mNetworkMetadata); { nsAutoCString name; nsString entryName; - aRequest->URI()->GetSpec(name); + aRequest->mURI->GetSpec(name); CopyUTF8toUTF16(name, entryName); auto now = TimeStamp::Now(); @@ -1361,9 +1346,7 @@ bool ScriptLoader::ProcessExternalScript(nsIScriptElement* aElement, RefPtr<ScriptLoadRequest> request = LookupPreloadRequest(aElement, aScriptKind, sriMetadata); if (request) { - if (NS_FAILED(CheckContentPolicy(aElement, nonce, request, - request->FetchOptions(), - request->URI()))) { + if (NS_FAILED(CheckContentPolicy(aElement, nonce, request))) { LOG(("ScriptLoader (%p): content policy check failed for preload", this)); // Probably plans have changed; even though the preload was allowed seems @@ -1669,7 +1652,7 @@ bool ScriptLoader::ProcessInlineScript(nsIScriptElement* aElement, LOG(("ScriptLoadRequest (%p): Created request for inline script", request.get())); - request->SetBaseURL(mDocument->GetDocBaseURI()); + request->mBaseURL = mDocument->GetDocBaseURI(); if (request->IsModuleRequest()) { // https://html.spec.whatwg.org/multipage/webappapis.html#fetch-an-inline-module-script-graph @@ -2341,7 +2324,7 @@ nsresult ScriptLoader::CreateOffThreadTask( LOG( ("ScriptLoadRequest (%p): non-on-demand-only (omt) Parsing Enabled " "for url=%s mTotalFullParseSize=%u", - aRequest, aRequest->URI()->GetSpecOrDefault().get(), + aRequest, aRequest->mURI->GetSpecOrDefault().get(), mTotalFullParseSize)); } @@ -2531,7 +2514,7 @@ void ScriptLoader::FireScriptAvailable(nsresult aResult, obs->ScriptAvailable( aResult, aRequest->GetScriptLoadContext()->GetScriptElementForObserver(), - aRequest->GetScriptLoadContext()->mIsInline, aRequest->URI(), + aRequest->GetScriptLoadContext()->mIsInline, aRequest->mURI, aRequest->GetScriptLoadContext()->mLineNo); } @@ -2540,7 +2523,7 @@ void ScriptLoader::FireScriptAvailable(nsresult aResult, RefPtr<nsIScriptElement> scriptElement = aRequest->GetScriptLoadContext()->GetScriptElementForObserver(); scriptElement->ScriptAvailable(aResult, scriptElement, isInlineClassicScript, - aRequest->URI(), + aRequest->mURI, aRequest->GetScriptLoadContext()->mLineNo); } @@ -2624,9 +2607,9 @@ static void ApplyEagerBaselineStrategy(JS::CompileOptions* aOptions) { nsresult ScriptLoader::FillCompileOptionsForRequest( JSContext* aCx, ScriptLoadRequest* aRequest, JS::CompileOptions* aOptions, JS::MutableHandle<JSScript*> aIntroductionScript) { - // It's very important to use aRequest->URI(), not the final URI of the - // channel aRequest ended up getting script data from, as the script filename. - nsresult rv = aRequest->URI()->GetSpec(aRequest->mURL); + // It's very important to use aRequest->mURI, not the final URI of the channel + // aRequest ended up getting script data from, as the script filename. + nsresult rv = aRequest->mURI->GetSpec(aRequest->mURL); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } @@ -3227,8 +3210,7 @@ ScriptLoader::CacheBehavior ScriptLoader::GetCacheBehavior( return CacheBehavior::DoNothing; } - if (!aRequest->URI()->SchemeIs("http") && - !aRequest->URI()->SchemeIs("https")) { + if (!aRequest->mURI->SchemeIs("http") && !aRequest->mURI->SchemeIs("https")) { // Internal resources can be exposed to the web content, but they don't // have to be cached. return CacheBehavior::DoNothing; @@ -3251,7 +3233,7 @@ ScriptLoader::CacheBehavior ScriptLoader::GetCacheBehavior( return CacheBehavior::Insert; } - ScriptHashKey key(this, aRequest, aRequest->getLoadedScript()); + ScriptHashKey key(this, aRequest); auto cacheResult = mCache->Lookup(*this, key, /* aSyncLoad = */ true); if (cacheResult.mState == CachedSubResourceState::Complete) { @@ -3283,17 +3265,16 @@ void ScriptLoader::TryCacheRequest(ScriptLoadRequest* aRequest) { aRequest->ConvertToCachedStencil(); if (cacheBehavior == CacheBehavior::Insert) { - auto loadData = - MakeRefPtr<ScriptLoadData>(this, aRequest, aRequest->getLoadedScript()); + auto loadData = MakeRefPtr<ScriptLoadData>(this, aRequest); mCache->Insert(*loadData); LOG(("ScriptLoader (%p): Inserting in-memory cache for %s.", this, - aRequest->URI()->GetSpecOrDefault().get())); + aRequest->mURI->GetSpecOrDefault().get())); } else { MOZ_ASSERT(cacheBehavior == CacheBehavior::Evict); - ScriptHashKey key(this, aRequest, aRequest->getLoadedScript()); + ScriptHashKey key(this, aRequest); mCache->Evict(key); LOG(("ScriptLoader (%p): Evicting in-memory cache for %s.", this, - aRequest->URI()->GetSpecOrDefault().get())); + aRequest->mURI->GetSpecOrDefault().get())); if (!aRequest->PassedConditionForEitherCache()) { aRequest->ClearStencil(); @@ -3392,6 +3373,30 @@ nsresult ScriptLoader::EvaluateScript(nsIGlobalObject* aGlobalObject, // Create a ClassicScript object and associate it with the JSScript. MOZ_ASSERT(aRequest->mLoadedScript->IsClassicScript()); + MOZ_ASSERT(aRequest->mLoadedScript->GetFetchOptions()->IsCompatible( + aRequest->mFetchOptions)); + +#ifdef DEBUG + { + bool equals; + (void)aRequest->mLoadedScript->GetURI()->Equals(aRequest->mURI, &equals); + MOZ_ASSERT(equals); + } +#endif + + if (aRequest->IsCachedStencil()) { +#ifdef DEBUG + // A request with cache might not have mBaseURL. + if (aRequest->mBaseURL) { + bool equals; + (void)aRequest->mLoadedScript->BaseURL()->Equals(aRequest->mBaseURL, + &equals); + MOZ_ASSERT(equals); + } +#endif + } else { + aRequest->mLoadedScript->SetBaseURL(aRequest->mBaseURL); + } RefPtr<ClassicScript> classicScript = aRequest->mLoadedScript->AsClassicScript(); @@ -3419,7 +3424,7 @@ nsresult ScriptLoader::EvaluateScript(nsIGlobalObject* aGlobalObject, LOG( ("ScriptLoadRequest (%p): non-on-demand-only (non-omt) Parsing Enabled " "for url=%s mTotalFullParseSize=%u", - aRequest, aRequest->URI()->GetSpecOrDefault().get(), + aRequest, aRequest->mURI->GetSpecOrDefault().get(), mTotalFullParseSize)); } @@ -4126,7 +4131,7 @@ void ScriptLoader::ReportErrorToConsole(ScriptLoadRequest* aRequest, } AutoTArray<nsString, 1> params; - CopyUTF8toUTF16(aRequest->URI()->GetSpecOrDefault(), *params.AppendElement()); + CopyUTF8toUTF16(aRequest->mURI->GetSpecOrDefault(), *params.AppendElement()); Maybe<SourceLocation> loc; if (!isScript && !aRequest->IsTopLevel()) { @@ -4324,7 +4329,7 @@ bool ScriptLoader::ShouldApplyDelazifyStrategy(ScriptLoadRequest* aRequest) { } if (LOG_ENABLED()) { - nsCString url = aRequest->URI()->GetSpecOrDefault(); + nsCString url = aRequest->mURI->GetSpecOrDefault(); LOG( ("ScriptLoadRequest (%p): non-on-demand-only Parsing Disabled for (%s) " "with size=%u because mTotalFullParseSize=%u would exceed max_size=%u", diff --git a/dom/script/ScriptLoader.h b/dom/script/ScriptLoader.h @@ -487,9 +487,8 @@ class ScriptLoader final : public JS::loader::ScriptLoaderInterface { * request if any. */ void TryUseCache( - ReferrerPolicy aReferrerPolicy, ScriptFetchOptions* aFetchOptions, - nsIURI* aURI, ScriptLoadRequest* aRequest, - nsIScriptElement* aElement = nullptr, const nsAString& aNonce = u""_ns, + ScriptLoadRequest* aRequest, nsIScriptElement* aElement = nullptr, + const nsAString& aNonce = u""_ns, ScriptLoadRequestType aRequestType = ScriptLoadRequestType::External); /** @@ -548,8 +547,7 @@ class ScriptLoader final : public JS::loader::ScriptLoaderInterface { */ nsresult CheckContentPolicy(nsIScriptElement* aElement, const nsAString& aNonce, - ScriptLoadRequest* aRequest, - ScriptFetchOptions* aFetchOptions, nsIURI* aURI); + ScriptLoadRequest* aRequest); /** * Helper function to determine whether an about: page loads a chrome: URI. diff --git a/dom/script/SharedScriptCache.cpp b/dom/script/SharedScriptCache.cpp @@ -19,18 +19,16 @@ namespace mozilla::dom { -ScriptHashKey::ScriptHashKey( - ScriptLoader* aLoader, const JS::loader::ScriptLoadRequest* aRequest, - const JS::loader::ScriptFetchOptions* aFetchOptions, - const nsCOMPtr<nsIURI> aURI) +ScriptHashKey::ScriptHashKey(ScriptLoader* aLoader, + const JS::loader::ScriptLoadRequest* aRequest) : PLDHashEntryHdr(), - mURI(aURI), + mURI(aRequest->mURI), mLoaderPrincipal(aLoader->LoaderPrincipal()), mPartitionPrincipal(aLoader->PartitionedPrincipal()), - mCORSMode(aFetchOptions->mCORSMode), + mCORSMode(aRequest->CORSMode()), mSRIMetadata(aRequest->mIntegrity), mKind(aRequest->mKind), - mNonce(aFetchOptions->mNonce), + mNonce(aRequest->Nonce()), mIsLinkRelPreload(aRequest->GetScriptLoadContext()->IsPreload()) { if (mKind == JS::loader::ScriptKind::eClassic) { if (aRequest->GetScriptLoadContext()->HasScriptElement()) { @@ -41,12 +39,6 @@ ScriptHashKey::ScriptHashKey( MOZ_COUNT_CTOR(ScriptHashKey); } -ScriptHashKey::ScriptHashKey(ScriptLoader* aLoader, - const JS::loader::ScriptLoadRequest* aRequest, - const JS::loader::LoadedScript* aLoadedScript) - : ScriptHashKey(aLoader, aRequest, aLoadedScript->GetFetchOptions(), - aLoadedScript->GetURI()) {} - ScriptHashKey::ScriptHashKey(const ScriptLoadData& aLoadData) : ScriptHashKey(aLoadData.CacheKey()) {} @@ -92,12 +84,11 @@ bool ScriptHashKey::KeyEquals(const ScriptHashKey& aKey) const { NS_IMPL_ISUPPORTS(ScriptLoadData, nsISupports) ScriptLoadData::ScriptLoadData(ScriptLoader* aLoader, - JS::loader::ScriptLoadRequest* aRequest, - JS::loader::LoadedScript* aLoadedScript) + JS::loader::ScriptLoadRequest* aRequest) : mExpirationTime(aRequest->ExpirationTime()), mLoader(aLoader), - mKey(aLoader, aRequest, aLoadedScript), - mLoadedScript(aLoadedScript), + mKey(aLoader, aRequest), + mLoadedScript(aRequest->getLoadedScript()), mNetworkMetadata(aRequest->mNetworkMetadata) {} NS_IMPL_ISUPPORTS(SharedScriptCache, nsIMemoryReporter) diff --git a/dom/script/SharedScriptCache.h b/dom/script/SharedScriptCache.h @@ -9,7 +9,6 @@ #include "PLDHashTable.h" // PLDHashEntryHdr #include "js/loader/LoadedScript.h" // JS::loader::LoadedScript -#include "js/loader/ScriptFetchOptions.h" // JS::loader::ScriptFetchOptions #include "js/loader/ScriptKind.h" // JS::loader::ScriptKind #include "js/loader/ScriptLoadRequest.h" // JS::loader::ScriptLoadRequest #include "mozilla/CORSMode.h" // mozilla::CORSMode @@ -66,12 +65,7 @@ class ScriptHashKey : public PLDHashEntryHdr { } ScriptHashKey(ScriptLoader* aLoader, - const JS::loader::ScriptLoadRequest* aRequest, - const JS::loader::LoadedScript* aLoadedScript); - ScriptHashKey(ScriptLoader* aLoader, - const JS::loader::ScriptLoadRequest* aRequest, - const JS::loader::ScriptFetchOptions* aFetchOptions, - const nsCOMPtr<nsIURI> aURI); + const JS::loader::ScriptLoadRequest* aRequest); explicit ScriptHashKey(const ScriptLoadData& aLoadData); MOZ_COUNTED_DTOR(ScriptHashKey) @@ -128,8 +122,8 @@ class ScriptLoadData final ~ScriptLoadData() {} public: - ScriptLoadData(ScriptLoader* aLoader, JS::loader::ScriptLoadRequest* aRequest, - JS::loader::LoadedScript* aLoadedScript); + ScriptLoadData(ScriptLoader* aLoader, + JS::loader::ScriptLoadRequest* aRequest); NS_DECL_ISUPPORTS diff --git a/dom/workers/ScriptLoader.cpp b/dom/workers/ScriptLoader.cpp @@ -699,7 +699,8 @@ already_AddRefed<ScriptLoadRequest> WorkerScriptLoader::CreateScriptLoadRequest( // Bug 1817259 - For now the debugger scripts are always loaded a Classic. if (mWorkerRef->Private()->WorkerType() == WorkerType::Classic || IsDebuggerScript()) { - request = new ScriptLoadRequest(ScriptKind::eClassic, SRIMetadata(), + request = new ScriptLoadRequest(ScriptKind::eClassic, uri, referrerPolicy, + fetchOptions, SRIMetadata(), nullptr, // mReferrer loadContext); } else { @@ -728,14 +729,15 @@ already_AddRefed<ScriptLoadRequest> WorkerScriptLoader::CreateScriptLoadRequest( // Part of Step 2. This sets the Top-level flag to true request = new ModuleLoadRequest( - JS::ModuleType::JavaScript, SRIMetadata(), referrer, loadContext, - ModuleLoadRequest::Kind::TopLevel, moduleLoader, nullptr); + uri, JS::ModuleType::JavaScript, referrerPolicy, fetchOptions, + SRIMetadata(), referrer, loadContext, ModuleLoadRequest::Kind::TopLevel, + moduleLoader, nullptr); } // Set the mURL, it will be used for error handling and debugging. request->mURL = NS_ConvertUTF16toUTF8(aScriptURL); - request->NoCacheEntryFound(referrerPolicy, fetchOptions, uri); + request->NoCacheEntryFound(); return request.forget(); } @@ -989,7 +991,7 @@ nsresult WorkerScriptLoader::LoadScript( : mWorkerRef->Private()->WorkerCredentials(); rv = GetModuleSecFlags(loadContext->IsTopLevel(), principal, - mWorkerScriptType, request->URI(), credentials, + mWorkerScriptType, request->mURI, credentials, secFlags); } else { referrerInfo = ReferrerInfo::CreateForFetch(principal, nullptr); @@ -998,7 +1000,7 @@ nsresult WorkerScriptLoader::LoadScript( static_cast<ReferrerInfo*>(referrerInfo.get()) ->CloneWithNewPolicy(parentWorker->GetReferrerPolicy()); } - rv = GetClassicSecFlags(loadContext->IsTopLevel(), request->URI(), + rv = GetClassicSecFlags(loadContext->IsTopLevel(), request->mURI, principal, mWorkerScriptType, secFlags); } @@ -1010,7 +1012,7 @@ nsresult WorkerScriptLoader::LoadScript( rv = ChannelFromScriptURL( principal, parentDoc, mWorkerRef->Private(), loadGroup, ios, secMan, - request->URI(), loadContext->mClientInfo, mController, + request->mURI, loadContext->mClientInfo, mController, loadContext->IsTopLevel(), mWorkerScriptType, contentPolicyType, loadFlags, secFlags, mWorkerRef->Private()->CookieJarSettings(), referrerInfo, getter_AddRefs(channel)); @@ -1257,9 +1259,11 @@ bool WorkerScriptLoader::EvaluateScript(JSContext* aCx, if (loadContext->mMutedErrorFlag.valueOr(false)) { NS_NewURI(getter_AddRefs(requestBaseURI), "about:blank"_ns); } else { - requestBaseURI = aRequest->BaseURL(); + requestBaseURI = aRequest->mBaseURL; } MOZ_ASSERT(aRequest->mLoadedScript->IsClassicScript()); + MOZ_ASSERT(aRequest->mLoadedScript->GetFetchOptions() == + aRequest->mFetchOptions); aRequest->mLoadedScript->SetBaseURL(requestBaseURI); classicScript = aRequest->mLoadedScript->AsClassicScript(); } diff --git a/dom/workers/loader/CacheLoadHandler.cpp b/dom/workers/loader/CacheLoadHandler.cpp @@ -558,8 +558,8 @@ nsresult CacheLoadHandler::DataReceivedFromCache( nsCOMPtr<nsIURI> finalURI; rv = NS_NewURI(getter_AddRefs(finalURI), loadContext->mFullURL); - if (!loadContext->mRequest->BaseURL()) { - loadContext->mRequest->SetBaseURL(finalURI); + if (!loadContext->mRequest->mBaseURL) { + loadContext->mRequest->mBaseURL = finalURI; } if (loadContext->IsTopLevel()) { if (NS_SUCCEEDED(rv)) { diff --git a/dom/workers/loader/WorkerModuleLoader.cpp b/dom/workers/loader/WorkerModuleLoader.cpp @@ -97,10 +97,11 @@ already_AddRefed<ModuleLoadRequest> WorkerModuleLoader::CreateRequest( JS::ModuleType moduleType = JS::GetModuleRequestType(aCx, aModuleRequest); RefPtr<ModuleLoadRequest> request = new ModuleLoadRequest( - moduleType, SRIMetadata(), aBaseURL, loadContext, kind, this, root); + aURI, moduleType, aReferrerPolicy, aOptions, SRIMetadata(), aBaseURL, + loadContext, kind, this, root); - request->mURL = aURI->GetSpecOrDefault(); - request->NoCacheEntryFound(aReferrerPolicy, aOptions, aURI); + request->mURL = request->mURI->GetSpecOrDefault(); + request->NoCacheEntryFound(); return request.forget(); } diff --git a/dom/worklet/WorkletFetchHandler.cpp b/dom/worklet/WorkletFetchHandler.cpp @@ -114,11 +114,12 @@ NS_IMETHODIMP StartModuleLoadRunnable::RunOnWorkletThread() { // Part of Step 2. This sets the Top-level flag to true RefPtr<ModuleLoadRequest> request = new ModuleLoadRequest( - JS::ModuleType::JavaScript, SRIMetadata(), mReferrer, loadContext, - ModuleLoadRequest::Kind::TopLevel, moduleLoader, nullptr); + mURI, JS::ModuleType::JavaScript, ReferrerPolicy::_empty, fetchOptions, + SRIMetadata(), mReferrer, loadContext, ModuleLoadRequest::Kind::TopLevel, + moduleLoader, nullptr); - request->mURL = mURI->GetSpecOrDefault(); - request->NoCacheEntryFound(ReferrerPolicy::_empty, fetchOptions, mURI); + request->mURL = request->mURI->GetSpecOrDefault(); + request->NoCacheEntryFound(); return request->StartModuleLoad(); } @@ -217,7 +218,7 @@ NS_IMETHODIMP FetchCompleteRunnable::RunOnWorkletThread() { NS_ENSURE_SUCCESS(rv, rv); } - request->SetBaseURL(mURI); + request->mBaseURL = mURI; request->OnFetchComplete(mResult); moduleLoader->RemoveRequest(mURI); return NS_OK; diff --git a/dom/worklet/loader/WorkletModuleLoader.cpp b/dom/worklet/loader/WorkletModuleLoader.cpp @@ -78,12 +78,12 @@ already_AddRefed<ModuleLoadRequest> WorkletModuleLoader::CreateRequest( const nsMainThreadPtrHandle<WorkletFetchHandler>& handlerRef = context->GetHandlerRef(); RefPtr<WorkletLoadContext> loadContext = new WorkletLoadContext(handlerRef); - RefPtr<ModuleLoadRequest> request = - new ModuleLoadRequest(moduleType, SRIMetadata(), aBaseURL, loadContext, - ModuleLoadRequest::Kind::StaticImport, this, root); + RefPtr<ModuleLoadRequest> request = new ModuleLoadRequest( + aURI, moduleType, aReferrerPolicy, aOptions, SRIMetadata(), aBaseURL, + loadContext, ModuleLoadRequest::Kind::StaticImport, this, root); - request->mURL = aURI->GetSpecOrDefault(); - request->NoCacheEntryFound(aReferrerPolicy, aOptions, aURI); + request->mURL = request->mURI->GetSpecOrDefault(); + request->NoCacheEntryFound(); return request.forget(); } @@ -93,11 +93,11 @@ bool WorkletModuleLoader::CanStartLoad(ModuleLoadRequest* aRequest, } nsresult WorkletModuleLoader::StartFetch(ModuleLoadRequest* aRequest) { - InsertRequest(aRequest->URI(), aRequest); + InsertRequest(aRequest->mURI, aRequest); RefPtr<StartFetchRunnable> runnable = new StartFetchRunnable(aRequest->GetWorkletLoadContext()->GetHandlerRef(), - aRequest->URI(), aRequest->mReferrer); + aRequest->mURI, aRequest->mReferrer); NS_DispatchToMainThread(runnable.forget()); return NS_OK; } diff --git a/js/loader/LoadedScript.cpp b/js/loader/LoadedScript.cpp @@ -28,19 +28,8 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(LoadedScript) NS_INTERFACE_MAP_ENTRY(nsISupports) NS_INTERFACE_MAP_END -// LoadedScript can be accessed from multiple threads. -// -// For instance, worker script loader passes the ScriptLoadRequest and -// the associated LoadedScript to the main thread to perform the actual load. -// Even while it's handled by the main thread, the LoadedScript is -// the target of the worker thread's cycle collector. -// -// Fields that can be modified by other threads shouldn't be touched by -// the cycle collection. -// -// NOTE: nsIURI doesn't have to be touched here because it cannot be a part -// of cycle. -NS_IMPL_CYCLE_COLLECTION(LoadedScript, mFetchOptions, mCacheInfo) +NS_IMPL_CYCLE_COLLECTION(LoadedScript, mFetchOptions, mURI, mBaseURL, + mCacheInfo) NS_IMPL_CYCLE_COLLECTING_ADDREF(LoadedScript) NS_IMPL_CYCLE_COLLECTING_RELEASE(LoadedScript) @@ -210,22 +199,6 @@ nsresult LoadedScript::GetScriptSource(JSContext* aCx, return NS_OK; } -static bool IsInternalURIScheme(nsIURI* uri) { - return uri->SchemeIs("moz-extension") || uri->SchemeIs("resource") || - uri->SchemeIs("moz-src") || uri->SchemeIs("chrome"); -} - -void LoadedScript::SetBaseURLFromChannelAndOriginalURI(nsIChannel* aChannel, - nsIURI* aOriginalURI) { - // Fixup moz-extension: and resource: URIs, because the channel URI will - // point to file:, which won't be allowed to load. - if (aOriginalURI && IsInternalURIScheme(aOriginalURI)) { - mBaseURL = aOriginalURI; - } else { - aChannel->GetURI(getter_AddRefs(mBaseURL)); - } -} - inline void CheckModuleScriptPrivate(LoadedScript* script, const Value& aPrivate) { #ifdef DEBUG @@ -278,16 +251,6 @@ ClassicScript::ClassicScript(mozilla::dom::ReferrerPolicy aReferrerPolicy, } ////////////////////////////////////////////////////////////// -// ImportMapScript -////////////////////////////////////////////////////////////// - -ImportMapScript::ImportMapScript(mozilla::dom::ReferrerPolicy aReferrerPolicy, - ScriptFetchOptions* aFetchOptions, - nsIURI* aURI) - : LoadedScript(ScriptKind::eImportMap, aReferrerPolicy, aFetchOptions, - aURI) {} - -////////////////////////////////////////////////////////////// // ModuleScript ////////////////////////////////////////////////////////////// diff --git a/js/loader/LoadedScript.h b/js/loader/LoadedScript.h @@ -84,10 +84,10 @@ class LoadedScript : public nsIMemoryReporter { bool IsClassicScript() const { return mKind == ScriptKind::eClassic; } bool IsModuleScript() const { return mKind == ScriptKind::eModule; } bool IsEventScript() const { return mKind == ScriptKind::eEvent; } - bool IsImportMapScript() const { return mKind == ScriptKind::eImportMap; } inline ClassicScript* AsClassicScript(); inline ModuleScript* AsModuleScript(); + inline EventScript* AsEventScript(); // Used to propagate Fetch Options to child modules ScriptFetchOptions* GetFetchOptions() const { return mFetchOptions; } @@ -97,7 +97,10 @@ class LoadedScript : public nsIMemoryReporter { } nsIURI* GetURI() const { return mURI; } - void SetBaseURL(nsIURI* aBaseURL) { mBaseURL = aBaseURL; } + void SetBaseURL(nsIURI* aBaseURL) { + MOZ_ASSERT(!mBaseURL); + mBaseURL = aBaseURL; + } nsIURI* BaseURL() const { return mBaseURL; } void AssociateWithScript(JSScript* aScript); @@ -275,13 +278,6 @@ class LoadedScript : public nsIMemoryReporter { // Drop the reference to the cache info channel. void DropDiskCacheReference() { mCacheInfo = nullptr; } - /* - * Set the mBaseURL, based on aChannel. - * aOriginalURI is the result of aChannel->GetOriginalURI. - */ - void SetBaseURLFromChannelAndOriginalURI(nsIChannel* aChannel, - nsIURI* aOriginalURI); - public: // Fields. @@ -296,11 +292,9 @@ class LoadedScript : public nsIMemoryReporter { uint8_t mFetchCount = 0; private: - const ScriptKind mKind; + ScriptKind mKind; protected: - // The referrer policy used for the initial fetch and for fetching any - // imported modules mozilla::dom::ReferrerPolicy mReferrerPolicy; public: @@ -310,8 +304,6 @@ class LoadedScript : public nsIMemoryReporter { private: RefPtr<ScriptFetchOptions> mFetchOptions; nsCOMPtr<nsIURI> mURI; - - // The base URL used for resolving relative module imports. nsCOMPtr<nsIURI> mBaseURL; public: @@ -366,30 +358,6 @@ class LoadedScriptDelegate { bool IsModuleScript() const { return GetLoadedScript()->IsModuleScript(); } bool IsEventScript() const { return GetLoadedScript()->IsEventScript(); } - bool IsImportMapScript() const { - return GetLoadedScript()->IsImportMapScript(); - } - - mozilla::dom::ReferrerPolicy ReferrerPolicy() const { - return GetLoadedScript()->ReferrerPolicy(); - } - void UpdateReferrerPolicy(mozilla::dom::ReferrerPolicy aReferrerPolicy) { - GetLoadedScript()->AsModuleScript()->UpdateReferrerPolicy(aReferrerPolicy); - } - - ScriptFetchOptions* FetchOptions() const { - return GetLoadedScript()->GetFetchOptions(); - } - - nsIURI* URI() const { return GetLoadedScript()->GetURI(); } - - nsIURI* BaseURL() const { return GetLoadedScript()->BaseURL(); } - void SetBaseURL(nsIURI* aBaseURL) { GetLoadedScript()->SetBaseURL(aBaseURL); } - void SetBaseURLFromChannelAndOriginalURI(nsIChannel* aChannel, - nsIURI* aOriginalURI) { - GetLoadedScript()->SetBaseURLFromChannelAndOriginalURI(aChannel, - aOriginalURI); - } bool IsUnknownDataType() const { return GetLoadedScript()->IsUnknownDataType(); @@ -485,14 +453,6 @@ class EventScript final : public LoadedScript { ScriptFetchOptions* aFetchOptions, nsIURI* aURI); }; -class ImportMapScript final : public LoadedScript { - ~ImportMapScript() = default; - - public: - ImportMapScript(mozilla::dom::ReferrerPolicy aReferrerPolicy, - ScriptFetchOptions* aFetchOptions, nsIURI* aURI); -}; - // A single module script. May be used to satisfy multiple load requests. class ModuleScript final : public LoadedScript { diff --git a/js/loader/ModuleLoadRequest.cpp b/js/loader/ModuleLoadRequest.cpp @@ -45,13 +45,16 @@ NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED(ModuleLoadRequest, NS_IMPL_CYCLE_COLLECTION_TRACE_END ModuleLoadRequest::ModuleLoadRequest( - ModuleType aModuleType, const mozilla::dom::SRIMetadata& aIntegrity, - nsIURI* aReferrer, LoadContextBase* aContext, Kind aKind, - ModuleLoaderBase* aLoader, ModuleLoadRequest* aRootModule) - : ScriptLoadRequest(ScriptKind::eModule, aIntegrity, aReferrer, aContext), + nsIURI* aURI, ModuleType aModuleType, + mozilla::dom::ReferrerPolicy aReferrerPolicy, + ScriptFetchOptions* aFetchOptions, + const mozilla::dom::SRIMetadata& aIntegrity, nsIURI* aReferrer, + LoadContextBase* aContext, Kind aKind, ModuleLoaderBase* aLoader, + ModuleLoadRequest* aRootModule) + : ScriptLoadRequest(ScriptKind::eModule, aURI, aReferrerPolicy, + aFetchOptions, aIntegrity, aReferrer, aContext), mKind(aKind), mModuleType(aModuleType), - mIsDynamicImport(aKind == Kind::DynamicImport), mErroredLoadingImports(false), mLoader(aLoader), mRootModule(aRootModule) { @@ -96,7 +99,7 @@ void ModuleLoadRequest::ModuleLoaded() { MOZ_ASSERT(IsFetching()); - mModuleScript = mLoader->GetFetchedModule(ModuleMapKey(URI(), mModuleType)); + mModuleScript = mLoader->GetFetchedModule(ModuleMapKey(mURI, mModuleType)); } void ModuleLoadRequest::LoadFailed() { diff --git a/js/loader/ModuleLoadRequest.h b/js/loader/ModuleLoadRequest.h @@ -50,8 +50,11 @@ class ModuleLoadRequest final : public ScriptLoadRequest { DynamicImport, }; - ModuleLoadRequest(ModuleType aModuleType, const SRIMetadata& aIntegrity, - nsIURI* aReferrer, LoadContextBase* aContext, Kind aKind, + ModuleLoadRequest(nsIURI* aURI, ModuleType aModuleType, + mozilla::dom::ReferrerPolicy aReferrerPolicy, + ScriptFetchOptions* aFetchOptions, + const SRIMetadata& aIntegrity, nsIURI* aReferrer, + LoadContextBase* aContext, Kind aKind, ModuleLoaderBase* aLoader, ModuleLoadRequest* aRootModule); bool IsTopLevel() const override { return mKind == Kind::TopLevel; } @@ -104,22 +107,21 @@ class ModuleLoadRequest final : public ScriptLoadRequest { void LoadFinished(); + void UpdateReferrerPolicy(mozilla::dom::ReferrerPolicy aReferrerPolicy) { + mReferrerPolicy = aReferrerPolicy; + } + + const Kind mKind; + void SetErroredLoadingImports() { MOZ_ASSERT(IsDynamicImport()); MOZ_ASSERT(IsFetching() || IsCompiling()); mErroredLoadingImports = true; } - public: - // Fields. - const Kind mKind; - // Type of module (JavaScript, JSON) const ModuleType mModuleType; - // Is this the top level request for a dynamic module import? - const bool mIsDynamicImport; - // A flag (for dynamic import) that indicates the module script is // successfully fetched and compiled, but its dependencies are failed to load. bool mErroredLoadingImports; diff --git a/js/loader/ModuleLoaderBase.cpp b/js/loader/ModuleLoaderBase.cpp @@ -553,7 +553,7 @@ nsresult ModuleLoaderBase::StartOrRestartModuleLoad(ModuleLoadRequest* aRequest, if (LOG_ENABLED()) { nsAutoCString url; - aRequest->URI()->GetAsciiSpec(url); + aRequest->mURI->GetAsciiSpec(url); LOG(("ScriptLoadRequest (%p): Start module load %s", aRequest, url.get())); } @@ -561,7 +561,7 @@ nsresult ModuleLoaderBase::StartOrRestartModuleLoad(ModuleLoadRequest* aRequest, // "fetching" map. MOZ_ASSERT_IF( aRestart == RestartRequest::Yes, - IsModuleFetching(ModuleMapKey(aRequest->URI(), aRequest->mModuleType))); + IsModuleFetching(ModuleMapKey(aRequest->mURI, aRequest->mModuleType))); // Check with the derived class whether we should load this module. nsresult rv = NS_OK; @@ -573,7 +573,7 @@ nsresult ModuleLoaderBase::StartOrRestartModuleLoad(ModuleLoadRequest* aRequest, // and if so wait for it rather than starting a new fetch. if (aRestart == RestartRequest::No && ModuleMapContainsURL( - ModuleMapKey(aRequest->URI(), aRequest->mModuleType))) { + ModuleMapKey(aRequest->mURI, aRequest->mModuleType))) { LOG(("ScriptLoadRequest (%p): Waiting for module fetch", aRequest)); WaitForModuleFetch(aRequest); return NS_OK; @@ -584,7 +584,7 @@ nsresult ModuleLoaderBase::StartOrRestartModuleLoad(ModuleLoadRequest* aRequest, if (isCachedStencil) { MOZ_ASSERT( - IsModuleFetched(ModuleMapKey(aRequest->URI(), aRequest->mModuleType))); + IsModuleFetched(ModuleMapKey(aRequest->mURI, aRequest->mModuleType))); return NS_OK; } @@ -626,7 +626,7 @@ nsresult ModuleLoaderBase::GetFetchedModuleURLs(nsTArray<nsCString>& aURLs) { void ModuleLoaderBase::SetModuleFetchStarted(ModuleLoadRequest* aRequest) { // Update the module map to indicate that a module is currently being fetched. - ModuleMapKey moduleMapKey(aRequest->URI(), aRequest->mModuleType); + ModuleMapKey moduleMapKey(aRequest->mURI, aRequest->mModuleType); MOZ_ASSERT(aRequest->IsFetching()); MOZ_ASSERT(!ModuleMapContainsURL(moduleMapKey)); @@ -651,7 +651,7 @@ ModuleLoaderBase::SetModuleFetchFinishedAndGetWaitingRequests( "%u)", aRequest, aRequest->mModuleScript.get(), unsigned(aResult))); - ModuleMapKey moduleMapKey(aRequest->URI(), aRequest->mModuleType); + ModuleMapKey moduleMapKey(aRequest->mURI, aRequest->mModuleType); auto entry = mFetchingModules.Lookup(moduleMapKey); if (!entry) { @@ -707,7 +707,7 @@ void ModuleLoaderBase::ResumeWaitingRequest(ModuleLoadRequest* aRequest, } void ModuleLoaderBase::WaitForModuleFetch(ModuleLoadRequest* aRequest) { - ModuleMapKey moduleMapKey(aRequest->URI(), aRequest->mModuleType); + ModuleMapKey moduleMapKey(aRequest->mURI, aRequest->mModuleType); MOZ_ASSERT(ModuleMapContainsURL(moduleMapKey)); if (auto entry = mFetchingModules.Lookup(moduleMapKey)) { @@ -866,7 +866,7 @@ void ModuleLoaderBase::OnFetchFailed(ModuleLoadRequest* aRequest) { // cases. if (aRequest->GetRootModule()->IsDynamicImport()) { nsAutoCString url; - aRequest->URI()->GetSpec(url); + aRequest->mURI->GetSpec(url); JS_ReportErrorNumberASCII(cx, js::GetErrorMessage, nullptr, JSMSG_DYNAMIC_IMPORT_FAILED, url.get()); FinishLoadingImportedModuleFailedWithPendingException(cx, payload); @@ -962,7 +962,7 @@ void ModuleLoaderBase::DispatchModuleErrored(ModuleLoadRequest* aRequest) { nsresult ModuleLoaderBase::CreateModuleScript(ModuleLoadRequest* aRequest) { MOZ_ASSERT(!aRequest->mModuleScript); - MOZ_ASSERT(aRequest->BaseURL()); + MOZ_ASSERT(aRequest->mBaseURL); LOG(("ScriptLoadRequest (%p): Create module script", aRequest)); @@ -1002,6 +1002,29 @@ nsresult ModuleLoaderBase::CreateModuleScript(ModuleLoadRequest* aRequest) { } MOZ_ASSERT(aRequest->mLoadedScript->IsModuleScript()); + MOZ_ASSERT(aRequest->mFetchOptions->IsCompatible( + aRequest->mLoadedScript->GetFetchOptions())); +#ifdef DEBUG + { + bool equals = false; + aRequest->mURI->Equals(aRequest->mLoadedScript->GetURI(), &equals); + MOZ_ASSERT(equals); + } +#endif + + if (!aRequest->mLoadedScript->BaseURL()) { + // If this script is not cached, the BaseURL should be copied from + // request to script for later use. + aRequest->mLoadedScript->SetBaseURL(aRequest->mBaseURL); + } else { + // If this script is cached, the BaseURL should match, which is + // checked when looking for the cache. +#ifdef DEBUG + bool equals = false; + aRequest->mBaseURL->Equals(aRequest->mLoadedScript->BaseURL(), &equals); + MOZ_ASSERT(equals); +#endif + } RefPtr<ModuleScript> moduleScript = aRequest->mLoadedScript->AsModuleScript(); @@ -1219,8 +1242,8 @@ void ModuleLoaderBase::StartFetchingModuleDependencies( // destroyed. As a result, the promise returned by LoadRequestedModules may // neither resolve nor reject. To ensure module loading completes reliably in // chrome pages, we use the synchronous variant of LoadRequestedModules. - bool isSync = aRequest->URI()->SchemeIs("chrome") || - aRequest->URI()->SchemeIs("resource"); + bool isSync = aRequest->mURI->SchemeIs("chrome") || + aRequest->mURI->SchemeIs("resource"); // TODO: Bug1973660: Use Promise version of LoadRequestedModules on Workers. if (aRequest->HasScriptLoadContext() && !isSync) { @@ -1342,7 +1365,7 @@ bool ModuleLoaderBase::OnLoadRequestedModulesRejected( FinishLoadingImportedModuleFailed(aCx, payload, error); } else { nsAutoCString url; - aRequest->URI()->GetSpec(url); + aRequest->mURI->GetSpec(url); JS_ReportErrorNumberASCII(aCx, js::GetErrorMessage, nullptr, JSMSG_DYNAMIC_IMPORT_FAILED, url.get()); FinishLoadingImportedModuleFailedWithPendingException(aCx, payload); @@ -1685,7 +1708,7 @@ UniquePtr<ImportMap> ModuleLoaderBase::ParseImportMap( // supported, therefore parsing and registering import-maps will be executed // consecutively. To simplify the implementation, we didn't create the 'error // to rethow' item and report the exception immediately(done in ~AutoJSAPI). - return ImportMap::ParseString(jsapi.cx(), text, aRequest->BaseURL(), warning); + return ImportMap::ParseString(jsapi.cx(), text, aRequest->mBaseURL, warning); } void ModuleLoaderBase::RegisterImportMap(UniquePtr<ImportMap> aImportMap) { diff --git a/js/loader/ScriptLoadRequest.cpp b/js/loader/ScriptLoadRequest.cpp @@ -80,23 +80,29 @@ NS_IMPL_CYCLE_COLLECTING_RELEASE(ScriptLoadRequest) // // NOTE: nsIURI and nsIPrincipal doesn't have to be touched here because // they cannot be a part of cycle. -NS_IMPL_CYCLE_COLLECTION(ScriptLoadRequest, mLoadedScript, mLoadContext) +NS_IMPL_CYCLE_COLLECTION(ScriptLoadRequest, mFetchOptions, mLoadedScript, + mLoadContext) NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(ScriptLoadRequest) NS_IMPL_CYCLE_COLLECTION_TRACE_END -ScriptLoadRequest::ScriptLoadRequest(ScriptKind aKind, - const SRIMetadata& aIntegrity, - nsIURI* aReferrer, - LoadContextBase* aContext) +ScriptLoadRequest::ScriptLoadRequest( + ScriptKind aKind, nsIURI* aURI, + mozilla::dom::ReferrerPolicy aReferrerPolicy, + ScriptFetchOptions* aFetchOptions, const SRIMetadata& aIntegrity, + nsIURI* aReferrer, LoadContextBase* aContext) : mKind(aKind), mState(State::CheckingCache), mFetchSourceOnly(false), mHasSourceMapURL_(false), + mReferrerPolicy(aReferrerPolicy), + mFetchOptions(aFetchOptions), mIntegrity(aIntegrity), mReferrer(aReferrer), + mURI(aURI), mLoadContext(aContext), mEarlyHintPreloaderId(0) { + MOZ_ASSERT(mFetchOptions); if (mLoadContext) { mLoadContext->SetRequest(this); } @@ -170,9 +176,13 @@ bool ScriptLoadRequest::IsCacheable() const { void ScriptLoadRequest::CacheEntryFound(LoadedScript* aLoadedScript) { MOZ_ASSERT(IsCheckingCache()); + MOZ_ASSERT(mURI); + + MOZ_ASSERT(mFetchOptions->IsCompatible(aLoadedScript->GetFetchOptions())); switch (mKind) { case ScriptKind::eClassic: + case ScriptKind::eImportMap: MOZ_ASSERT(aLoadedScript->IsClassicScript()); mLoadedScript = aLoadedScript; @@ -180,13 +190,6 @@ void ScriptLoadRequest::CacheEntryFound(LoadedScript* aLoadedScript) { // Classic scripts can be set ready once the script itself is ready. mState = State::Ready; break; - case ScriptKind::eImportMap: - MOZ_ASSERT(aLoadedScript->IsImportMapScript()); - - mLoadedScript = aLoadedScript; - - mState = State::Ready; - break; case ScriptKind::eModule: // NOTE: The cache entry has "module" kind, but it's not ModuleScript // instance, given ModuleScript has GC pointers. @@ -194,6 +197,16 @@ void ScriptLoadRequest::CacheEntryFound(LoadedScript* aLoadedScript) { mLoadedScript = ModuleScript::FromCache(*aLoadedScript); +#ifdef DEBUG + { + bool equals = false; + mURI->Equals(mLoadedScript->GetURI(), &equals); + MOZ_ASSERT(equals); + } +#endif + + mBaseURL = mLoadedScript->BaseURL(); + // Modules need to wait for fetching dependencies before setting to // Ready. mState = State::Fetching; @@ -204,24 +217,19 @@ void ScriptLoadRequest::CacheEntryFound(LoadedScript* aLoadedScript) { } } -void ScriptLoadRequest::NoCacheEntryFound( - mozilla::dom::ReferrerPolicy aReferrerPolicy, - ScriptFetchOptions* aFetchOptions, nsIURI* aURI) { +void ScriptLoadRequest::NoCacheEntryFound() { MOZ_ASSERT(IsCheckingCache()); - // At the time where we check in the cache, the BaseURL() is not set, as this - // is resolved by the network. Thus we use the aURI passed by the consumer, - // which is the original URI used for the request, for checking the cache - // and later replace the BaseURL() using what the Channel->GetURI will - // provide. + MOZ_ASSERT(mURI); + // At the time where we check in the cache, the mBaseURL is not set, as this + // is resolved by the network. Thus we use the mURI, for checking the cache + // and later replace the mBaseURL using what the Channel->GetURI will provide. switch (mKind) { case ScriptKind::eClassic: - mLoadedScript = new ClassicScript(aReferrerPolicy, aFetchOptions, aURI); - break; case ScriptKind::eImportMap: - mLoadedScript = new ImportMapScript(aReferrerPolicy, aFetchOptions, aURI); + mLoadedScript = new ClassicScript(mReferrerPolicy, mFetchOptions, mURI); break; case ScriptKind::eModule: - mLoadedScript = new ModuleScript(aReferrerPolicy, aFetchOptions, aURI); + mLoadedScript = new ModuleScript(mReferrerPolicy, mFetchOptions, mURI); break; case ScriptKind::eEvent: MOZ_ASSERT_UNREACHABLE("EventScripts are not using ScriptLoadRequest"); @@ -230,4 +238,20 @@ void ScriptLoadRequest::NoCacheEntryFound( mState = State::Fetching; } +static bool IsInternalURIScheme(nsIURI* uri) { + return uri->SchemeIs("moz-extension") || uri->SchemeIs("resource") || + uri->SchemeIs("moz-src") || uri->SchemeIs("chrome"); +} + +void ScriptLoadRequest::SetBaseURLFromChannelAndOriginalURI( + nsIChannel* aChannel, nsIURI* aOriginalURI) { + // Fixup moz-extension: and resource: URIs, because the channel URI will + // point to file:, which won't be allowed to load. + if (aOriginalURI && IsInternalURIScheme(aOriginalURI)) { + mBaseURL = aOriginalURI; + } else { + aChannel->GetURI(getter_AddRefs(mBaseURL)); + } +} + } // namespace JS::loader diff --git a/js/loader/ScriptLoadRequest.h b/js/loader/ScriptLoadRequest.h @@ -91,8 +91,11 @@ class ScriptLoadRequest : public nsISupports, public: using SRIMetadata = mozilla::dom::SRIMetadata; - ScriptLoadRequest(ScriptKind aKind, const SRIMetadata& aIntegrity, - nsIURI* aReferrer, LoadContextBase* aContext); + ScriptLoadRequest(ScriptKind aKind, nsIURI* aURI, + mozilla::dom::ReferrerPolicy aReferrerPolicy, + ScriptFetchOptions* aFetchOptions, + const SRIMetadata& aIntegrity, nsIURI* aReferrer, + LoadContextBase* aContext); NS_DECL_CYCLE_COLLECTING_ISUPPORTS NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(ScriptLoadRequest) @@ -150,17 +153,21 @@ class ScriptLoadRequest : public nsISupports, } mozilla::dom::RequestPriority FetchPriority() const { - return FetchOptions()->mFetchPriority; + return mFetchOptions->mFetchPriority; + } + + enum mozilla::dom::ReferrerPolicy ReferrerPolicy() const { + return mReferrerPolicy; } enum ParserMetadata ParserMetadata() const { - return FetchOptions()->mParserMetadata; + return mFetchOptions->mParserMetadata; } - const nsString& Nonce() const { return FetchOptions()->mNonce; } + const nsString& Nonce() const { return mFetchOptions->mNonce; } nsIPrincipal* TriggeringPrincipal() const { - return FetchOptions()->mTriggeringPrincipal; + return mFetchOptions->mTriggeringPrincipal; } // Convert a CheckingCache ScriptLoadRequest into a Ready one, by populating @@ -170,8 +177,7 @@ class ScriptLoadRequest : public nsISupports, // Convert a CheckingCache ScriptLoadRequest into a Fetching one, by creating // a new LoadedScript which is matching the ScriptKind provided when // constructing this ScriptLoadRequest. - void NoCacheEntryFound(mozilla::dom::ReferrerPolicy aReferrerPolicy, - ScriptFetchOptions* aFetchOptions, nsIURI* aURI); + void NoCacheEntryFound(); bool PassedConditionForDiskCache() const { return mDiskCachingPlan == CachingPlan::PassedCondition; @@ -212,7 +218,8 @@ class ScriptLoadRequest : public nsISupports, mMemoryCachingPlan = CachingPlan::PassedCondition; } - mozilla::CORSMode CORSMode() const { return FetchOptions()->mCORSMode; } + public: + mozilla::CORSMode CORSMode() const { return mFetchOptions->mCORSMode; } bool HasLoadContext() const { return mLoadContext; } bool HasScriptLoadContext() const; @@ -230,28 +237,18 @@ class ScriptLoadRequest : public nsISupports, const LoadedScript* getLoadedScript() const { return mLoadedScript.get(); } LoadedScript* getLoadedScript() { return mLoadedScript.get(); } - bool HasSourceMapURL() const { return mHasSourceMapURL_; } - const nsString& GetSourceMapURL() const { - MOZ_ASSERT(mHasSourceMapURL_); - return mMaybeSourceMapURL_; - } - void SetSourceMapURL(const nsString& aSourceMapURL) { - MOZ_ASSERT(!mHasSourceMapURL_); - mMaybeSourceMapURL_ = aSourceMapURL; - mHasSourceMapURL_ = true; - } - - public: - // Fields. + /* + * Set the request's mBaseURL, based on aChannel. + * aOriginalURI is the result of aChannel->GetOriginalURI. + */ + void SetBaseURLFromChannelAndOriginalURI(nsIChannel* aChannel, + nsIURI* aOriginalURI); - // Whether this is a classic script, a module script, or an import map. - const ScriptKind mKind; + const ScriptKind mKind; // Whether this is a classic script or a module + // script. - // Are we still waiting for a load to complete? - State mState; - - // Request source, not cached bytecode. - bool mFetchSourceOnly; + State mState; // Are we still waiting for a load to complete? + bool mFetchSourceOnly; // Request source, not cached bytecode. // Becomes true if this has source map url. // @@ -272,8 +269,13 @@ class ScriptLoadRequest : public nsISupports, CachingPlan mDiskCachingPlan = CachingPlan::Uninitialized; CachingPlan mMemoryCachingPlan = CachingPlan::Uninitialized; + // The referrer policy used for the initial fetch and for fetching any + // imported modules + enum mozilla::dom::ReferrerPolicy mReferrerPolicy; + CacheExpirationTime mExpirationTime = CacheExpirationTime::Never(); + RefPtr<ScriptFetchOptions> mFetchOptions; RefPtr<mozilla::SubResourceNetworkMetadataHolder> mNetworkMetadata; const SRIMetadata mIntegrity; const nsCOMPtr<nsIURI> mReferrer; @@ -284,6 +286,18 @@ class ScriptLoadRequest : public nsISupports, // Use HasSourceMapURL(), SetSourceMapURL(), and GetSourceMapURL(). nsString mMaybeSourceMapURL_; + bool HasSourceMapURL() const { return mHasSourceMapURL_; } + const nsString& GetSourceMapURL() const { + MOZ_ASSERT(mHasSourceMapURL_); + return mMaybeSourceMapURL_; + } + void SetSourceMapURL(const nsString& aSourceMapURL) { + MOZ_ASSERT(!mHasSourceMapURL_); + mMaybeSourceMapURL_ = aSourceMapURL; + mHasSourceMapURL_ = true; + } + + const nsCOMPtr<nsIURI> mURI; nsCOMPtr<nsIPrincipal> mOriginPrincipal; // Keep the URI's filename alive during off thread parsing. @@ -291,6 +305,9 @@ class ScriptLoadRequest : public nsISupports, // worklets as the file name in compile options. nsAutoCString mURL; + // The base URL used for resolving relative module imports. + nsCOMPtr<nsIURI> mBaseURL; + // The loaded script holds the source / bytecode which is loaded. // // Currently it is used to hold information which are needed by the Debugger. diff --git a/js/xpconnect/loader/SyncModuleLoader.cpp b/js/xpconnect/loader/SyncModuleLoader.cpp @@ -81,8 +81,9 @@ already_AddRefed<ModuleLoadRequest> SyncModuleLoader::CreateRequest( } RefPtr<ModuleLoadRequest> request = new ModuleLoadRequest( - moduleType, dom::SRIMetadata(), aBaseURL, context, kind, this, root); - request->NoCacheEntryFound(aReferrerPolicy, aOptions, aURI); + aURI, moduleType, aReferrerPolicy, aOptions, dom::SRIMetadata(), aBaseURL, + context, kind, this, root); + request->NoCacheEntryFound(); return request.forget(); } @@ -125,13 +126,13 @@ void SyncModuleLoader::OnDynamicImportStarted(ModuleLoadRequest* aRequest) { bool SyncModuleLoader::CanStartLoad(ModuleLoadRequest* aRequest, nsresult* aRvOut) { - return nsContentSecurityUtils::IsTrustedScheme(aRequest->URI()); + return nsContentSecurityUtils::IsTrustedScheme(aRequest->mURI); } nsresult SyncModuleLoader::StartFetch(ModuleLoadRequest* aRequest) { MOZ_ASSERT(aRequest->HasLoadContext()); - aRequest->SetBaseURL(aRequest->URI()); + aRequest->mBaseURL = aRequest->mURI; // Loading script source and compilation are intertwined in // mozJSModuleLoader. Perform both operations here but only report load @@ -153,7 +154,7 @@ nsresult SyncModuleLoader::StartFetch(ModuleLoadRequest* aRequest) { bool threwException = jsapi.HasException(); if (NS_FAILED(rv) && !threwException) { nsAutoCString uri; - nsresult rv2 = aRequest->URI()->GetSpec(uri); + nsresult rv2 = aRequest->mURI->GetSpec(uri); NS_ENSURE_SUCCESS(rv2, rv2); JS_ReportErrorUTF8(cx, "Failed to load %s", PromiseFlatCString(uri).get()); diff --git a/js/xpconnect/loader/mozJSModuleLoader.cpp b/js/xpconnect/loader/mozJSModuleLoader.cpp @@ -169,7 +169,7 @@ class MOZ_STACK_CLASS ModuleLoaderInfo { explicit ModuleLoaderInfo(const nsACString& aLocation) : mLocation(&aLocation) {} explicit ModuleLoaderInfo(JS::loader::ModuleLoadRequest* aRequest) - : mLocation(nullptr), mURI(aRequest->URI()) {} + : mLocation(nullptr), mURI(aRequest->mURI) {} nsIIOService* IOService() { MOZ_ASSERT(mIOService); @@ -603,7 +603,7 @@ nsresult mozJSModuleLoader::LoadSingleModuleScriptOnWorker( SyncModuleLoader* aModuleLoader, JSContext* aCx, JS::loader::ModuleLoadRequest* aRequest, MutableHandleScript aScriptOut) { nsAutoCString location; - nsresult rv = aRequest->URI()->GetSpec(location); + nsresult rv = aRequest->mURI->GetSpec(location); NS_ENSURE_SUCCESS(rv, rv); nsCString data; @@ -650,7 +650,7 @@ nsresult mozJSModuleLoader::LoadSingleModuleScript( "ChromeUtils.importESModule static import", JS, MarkerOptions(MarkerStack::Capture(), MarkerInnerWindowIdFromJSContext(aCx)), - nsContentUtils::TruncatedURLForDisplay(aRequest->URI())); + nsContentUtils::TruncatedURLForDisplay(aRequest->mURI)); if (!NS_IsMainThread()) { return LoadSingleModuleScriptOnWorker(aModuleLoader, aCx, aRequest, @@ -665,7 +665,7 @@ nsresult mozJSModuleLoader::LoadSingleModuleScript( rv = GetSourceFile(info.ResolvedURI(), getter_AddRefs(sourceFile)); NS_ENSURE_SUCCESS(rv, rv); - bool realFile = LocationIsRealFile(aRequest->URI()); + bool realFile = LocationIsRealFile(aRequest->mURI); RootedScript script(aCx); rv = GetScriptForLocation(aCx, info, sourceFile, realFile, aScriptOut); @@ -971,7 +971,7 @@ void mozJSModuleLoader::RecordImportStack( } nsAutoCString location; - nsresult rv = aRequest->URI()->GetSpec(location); + nsresult rv = aRequest->mURI->GetSpec(location); if (NS_FAILED(rv)) { return; } @@ -1085,11 +1085,12 @@ nsresult mozJSModuleLoader::ImportESModule( RefPtr<SyncLoadContext> context = new SyncLoadContext(); RefPtr<ModuleLoadRequest> request = new ModuleLoadRequest( - JS::ModuleType::JavaScript, dom::SRIMetadata(), + uri, JS::ModuleType::JavaScript, dom::ReferrerPolicy::No_referrer, + options, dom::SRIMetadata(), /* aReferrer = */ nullptr, context, ModuleLoadRequest::Kind::TopLevel, mModuleLoader, nullptr); - request->NoCacheEntryFound(dom::ReferrerPolicy::No_referrer, options, uri); + request->NoCacheEntryFound(); rv = request->StartModuleLoad(); if (NS_FAILED(rv)) {