tor-browser

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

commit 3b1afd5ca0a2cc02581ee863977de7c143706d42
parent 10dc4e2bc0cfecaa995c6653c50f7e7f8f13e6dc
Author: Tooru Fujisawa <arai_a@mac.com>
Date:   Wed, 22 Oct 2025 04:35:35 +0000

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

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

Diffstat:
Mdom/script/ModuleLoader.cpp | 8++++----
Mdom/script/ScriptLoadContext.cpp | 4++--
Mdom/script/ScriptLoadHandler.cpp | 6+++---
Mdom/script/ScriptLoader.cpp | 72+++++++++++++++++++++++++++++++++---------------------------------------
Mdom/script/SharedScriptCache.cpp | 2+-
Mdom/workers/ScriptLoader.cpp | 10+++++-----
Mdom/workers/loader/WorkerModuleLoader.cpp | 4++--
Mdom/worklet/WorkletFetchHandler.cpp | 4++--
Mdom/worklet/loader/WorkletModuleLoader.cpp | 12++++++------
Mjs/loader/LoadedScript.cpp | 15+++++++++++++--
Mjs/loader/LoadedScript.h | 2++
Mjs/loader/ModuleLoadRequest.cpp | 12+++++-------
Mjs/loader/ModuleLoadRequest.h | 5++---
Mjs/loader/ModuleLoaderBase.cpp | 30+++++++++++-------------------
Mjs/loader/ScriptLoadRequest.cpp | 23++++++-----------------
Mjs/loader/ScriptLoadRequest.h | 6++----
Mjs/xpconnect/loader/SyncModuleLoader.cpp | 11+++++------
Mjs/xpconnect/loader/mozJSModuleLoader.cpp | 12++++++------
18 files changed, 110 insertions(+), 128 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->mURI->SchemeIs("moz-extension")) { + if (!aRequest->URI()->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->mURI->GetAsciiSpec(url); + aRequest->URI()->GetAsciiSpec(url); LOG(("ScriptLoadRequest (%p): Start Module Load (url = %s)", aRequest, url.get())); } @@ -451,7 +451,7 @@ already_AddRefed<ModuleLoadRequest> ModuleLoader::CreateTopLevel( nsIURI* aReferrer, ScriptLoadContext* aContext, ScriptLoadRequestType aRequestType) { RefPtr<ModuleLoadRequest> request = new ModuleLoadRequest( - aURI, JS::ModuleType::JavaScript, aIntegrity, aReferrer, aContext, + JS::ModuleType::JavaScript, aIntegrity, aReferrer, aContext, ModuleLoadRequest::Kind::TopLevel, this, nullptr); GetScriptLoader()->TryUseCache(aReferrerPolicy, aFetchOptions, aURI, request, @@ -484,7 +484,7 @@ already_AddRefed<ModuleLoadRequest> ModuleLoader::CreateRequest( JS::ModuleType moduleType = GetModuleRequestType(aCx, aModuleRequest); RefPtr<ModuleLoadRequest> request = new ModuleLoadRequest( - aURI, moduleType, aSriMetadata, aBaseURL, context, kind, this, root); + moduleType, aSriMetadata, aBaseURL, context, kind, this, root); GetScriptLoader()->TryUseCache(aReferrerPolicy, aOptions, aURI, request); 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->mURI) { - mRequest->mURI->GetAsciiSpec(url); + if (mRequest->URI()) { + mRequest->URI()->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->mURI)); + mRequest->URI())); return NS_OK; } @@ -368,7 +368,7 @@ ScriptLoadHandler::OnStreamComplete(nsIIncrementalStreamLoader* aLoader, nsresult rv = NS_OK; if (LOG_ENABLED()) { nsAutoCString url; - mRequest->mURI->GetAsciiSpec(url); + mRequest->URI()->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->mURI)); + nsContentUtils::GetSubresourceCacheExpirationTime(aOld, mRequest->URI())); aCallback->OnRedirectVerifyCallback(NS_OK); diff --git a/dom/script/ScriptLoader.cpp b/dom/script/ScriptLoader.cpp @@ -524,7 +524,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->mURI->SchemeIs("chrome")) { + if (!aRequest->URI()->SchemeIs("chrome")) { return false; } @@ -655,7 +655,7 @@ nsresult ScriptLoader::StartClassicLoad( if (LOG_ENABLED()) { nsAutoCString url; - aRequest->mURI->GetAsciiSpec(url); + aRequest->URI()->GetAsciiSpec(url); LOG(("ScriptLoadRequest (%p): Start Classic Load (url = %s)", aRequest, url.get())); } @@ -709,7 +709,7 @@ static nsresult CreateChannelForScriptLoading(nsIChannel** aOutChannel, context = aDocument; } - return CreateChannelForScriptLoading(aOutChannel, aDocument, aRequest->mURI, + return CreateChannelForScriptLoading(aOutChannel, aDocument, aRequest->URI(), context, aRequest->TriggeringPrincipal(), aSecurityFlags, contentPolicyType); } @@ -1003,7 +1003,7 @@ nsresult ScriptLoader::StartLoadInternal( NS_ENSURE_SUCCESS(rv, rv); mozilla::net::PredictorLearn( - aRequest->mURI, mDocument->GetDocumentURI(), + aRequest->URI(), mDocument->GetDocumentURI(), nsINetworkPredictor::LEARN_LOAD_SUBRESOURCE, mDocument->NodePrincipal()->OriginAttributesRef()); @@ -1013,7 +1013,7 @@ nsresult ScriptLoader::StartLoadInternal( NS_ENSURE_SUCCESS(rv, rv); auto key = PreloadHashKey::CreateAsScript( - aRequest->mURI, aRequest->CORSMode(), aRequest->mKind); + aRequest->URI(), aRequest->CORSMode(), aRequest->mKind); aRequest->GetScriptLoadContext()->NotifyOpen( key, channel, mDocument, aRequest->GetScriptLoadContext()->IsLinkPreloadScript(), @@ -1036,7 +1036,7 @@ nsresult ScriptLoader::StartLoadInternal( bool ScriptLoader::PreloadURIComparator::Equals(const PreloadInfo& aPi, nsIURI* const& aURI) const { bool same; - return NS_SUCCEEDED(aPi.mRequest->mURI->Equals(aURI, &same)) && same; + return NS_SUCCEEDED(aPi.mRequest->URI()->Equals(aURI, &same)) && same; } static bool CSPAllowsInlineScript(nsIScriptElement* aElement, @@ -1142,7 +1142,7 @@ already_AddRefed<ScriptLoadRequest> ScriptLoader::CreateLoadRequest( MOZ_ASSERT(aKind == ScriptKind::eClassic || aKind == ScriptKind::eImportMap); RefPtr<ScriptLoadRequest> request = - new ScriptLoadRequest(aKind, aURI, aIntegrity, referrer, context); + new ScriptLoadRequest(aKind, aIntegrity, referrer, context); TryUseCache(aReferrerPolicy, fetchOptions, aURI, request, aElement, aNonce, aRequestType); @@ -1162,7 +1162,7 @@ void ScriptLoader::TryUseCache(ReferrerPolicy aReferrerPolicy, ("ScriptLoader (%p): Created LoadedScript (%p) for " "ScriptLoadRequest(%p) %s.", this, aRequest->getLoadedScript(), aRequest, - aRequest->mURI->GetSpecOrDefault().get())); + aRequest->URI()->GetSpecOrDefault().get())); return; } @@ -1172,16 +1172,16 @@ void ScriptLoader::TryUseCache(ReferrerPolicy aReferrerPolicy, ("ScriptLoader (%p): Created LoadedScript (%p) for " "ScriptLoadRequest(%p) %s.", this, aRequest->getLoadedScript(), aRequest, - aRequest->mURI->GetSpecOrDefault().get())); + aRequest->URI()->GetSpecOrDefault().get())); return; } // NOTE: Some ScriptLoadRequest fields aren't yet accessible until // either NoCacheEntryFound or CacheEntryFound is called, // which constructs LoadedScript. - // aRequest->FetchOptions() is backed by LoadedScript, and we cannot - // use it here. - ScriptHashKey key(this, aRequest, aFetchOptions, aRequest->mURI); + // aRequest->FetchOptions() and aRequest->URI() are backed by + // LoadedScript, and we cannot use them here. + ScriptHashKey key(this, aRequest, aFetchOptions, aURI); auto cacheResult = mCache->Lookup(*this, key, /* aSyncLoad = */ true); if (cacheResult.mState != CachedSubResourceState::Complete) { aRequest->NoCacheEntryFound(aReferrerPolicy, aFetchOptions, aURI); @@ -1189,7 +1189,7 @@ void ScriptLoader::TryUseCache(ReferrerPolicy aReferrerPolicy, ("ScriptLoader (%p): Created LoadedScript (%p) for " "ScriptLoadRequest(%p) %s.", this, aRequest->getLoadedScript(), aRequest, - aRequest->mURI->GetSpecOrDefault().get())); + aRequest->URI()->GetSpecOrDefault().get())); return; } @@ -1197,13 +1197,13 @@ void ScriptLoader::TryUseCache(ReferrerPolicy aReferrerPolicy, // NOTE: The preload case checks the same after the // LookupPreloadRequest call. if (NS_FAILED(CheckContentPolicy(aElement, aNonce, aRequest, aFetchOptions, - aRequest->mURI))) { + aURI))) { aRequest->NoCacheEntryFound(aReferrerPolicy, aFetchOptions, aURI); LOG( ("ScriptLoader (%p): Created LoadedScript (%p) for " "ScriptLoadRequest(%p) %s.", this, aRequest->getLoadedScript(), aRequest, - aRequest->mURI->GetSpecOrDefault().get())); + aRequest->URI()->GetSpecOrDefault().get())); return; } } @@ -1219,7 +1219,7 @@ void ScriptLoader::TryUseCache(ReferrerPolicy aReferrerPolicy, ("ScriptLoader (%p): Found in-memory cache LoadedScript (%p) for " "ScriptLoadRequest(%p) %s.", this, aRequest->getLoadedScript(), aRequest, - aRequest->mURI->GetSpecOrDefault().get())); + aRequest->URI()->GetSpecOrDefault().get())); if (cacheResult.mCompleteValue->mFetchCount < UINT8_MAX) { cacheResult.mCompleteValue->mFetchCount++; @@ -1241,14 +1241,14 @@ void ScriptLoader::EmulateNetworkEvents(ScriptLoadRequest* aRequest) { } NotifyObserversForCachedScript( - aRequest->mURI, context, aRequest->FetchOptions()->mTriggeringPrincipal, + aRequest->URI(), context, aRequest->FetchOptions()->mTriggeringPrincipal, CORSModeToSecurityFlags(aRequest->FetchOptions()->mCORSMode), nsIContentPolicy::TYPE_INTERNAL_SCRIPT, aRequest->mNetworkMetadata); { nsAutoCString name; nsString entryName; - aRequest->mURI->GetSpec(name); + aRequest->URI()->GetSpec(name); CopyUTF8toUTF16(name, entryName); auto now = TimeStamp::Now(); @@ -1362,7 +1362,8 @@ bool ScriptLoader::ProcessExternalScript(nsIScriptElement* aElement, LookupPreloadRequest(aElement, aScriptKind, sriMetadata); if (request) { if (NS_FAILED(CheckContentPolicy(aElement, nonce, request, - request->FetchOptions(), request->mURI))) { + request->FetchOptions(), + request->URI()))) { LOG(("ScriptLoader (%p): content policy check failed for preload", this)); // Probably plans have changed; even though the preload was allowed seems @@ -2340,7 +2341,7 @@ nsresult ScriptLoader::CreateOffThreadTask( LOG( ("ScriptLoadRequest (%p): non-on-demand-only (omt) Parsing Enabled " "for url=%s mTotalFullParseSize=%u", - aRequest, aRequest->mURI->GetSpecOrDefault().get(), + aRequest, aRequest->URI()->GetSpecOrDefault().get(), mTotalFullParseSize)); } @@ -2530,7 +2531,7 @@ void ScriptLoader::FireScriptAvailable(nsresult aResult, obs->ScriptAvailable( aResult, aRequest->GetScriptLoadContext()->GetScriptElementForObserver(), - aRequest->GetScriptLoadContext()->mIsInline, aRequest->mURI, + aRequest->GetScriptLoadContext()->mIsInline, aRequest->URI(), aRequest->GetScriptLoadContext()->mLineNo); } @@ -2539,7 +2540,7 @@ void ScriptLoader::FireScriptAvailable(nsresult aResult, RefPtr<nsIScriptElement> scriptElement = aRequest->GetScriptLoadContext()->GetScriptElementForObserver(); scriptElement->ScriptAvailable(aResult, scriptElement, isInlineClassicScript, - aRequest->mURI, + aRequest->URI(), aRequest->GetScriptLoadContext()->mLineNo); } @@ -2623,9 +2624,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->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); + // 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); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } @@ -3226,7 +3227,8 @@ ScriptLoader::CacheBehavior ScriptLoader::GetCacheBehavior( return CacheBehavior::DoNothing; } - if (!aRequest->mURI->SchemeIs("http") && !aRequest->mURI->SchemeIs("https")) { + if (!aRequest->URI()->SchemeIs("http") && + !aRequest->URI()->SchemeIs("https")) { // Internal resources can be exposed to the web content, but they don't // have to be cached. return CacheBehavior::DoNothing; @@ -3285,13 +3287,13 @@ void ScriptLoader::TryCacheRequest(ScriptLoadRequest* aRequest) { MakeRefPtr<ScriptLoadData>(this, aRequest, aRequest->getLoadedScript()); mCache->Insert(*loadData); LOG(("ScriptLoader (%p): Inserting in-memory cache for %s.", this, - aRequest->mURI->GetSpecOrDefault().get())); + aRequest->URI()->GetSpecOrDefault().get())); } else { MOZ_ASSERT(cacheBehavior == CacheBehavior::Evict); ScriptHashKey key(this, aRequest, aRequest->getLoadedScript()); mCache->Evict(key); LOG(("ScriptLoader (%p): Evicting in-memory cache for %s.", this, - aRequest->mURI->GetSpecOrDefault().get())); + aRequest->URI()->GetSpecOrDefault().get())); if (!aRequest->PassedConditionForEitherCache()) { aRequest->ClearStencil(); @@ -3391,14 +3393,6 @@ nsresult ScriptLoader::EvaluateScript(nsIGlobalObject* aGlobalObject, // Create a ClassicScript object and associate it with the JSScript. MOZ_ASSERT(aRequest->mLoadedScript->IsClassicScript()); -#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. @@ -3439,7 +3433,7 @@ nsresult ScriptLoader::EvaluateScript(nsIGlobalObject* aGlobalObject, LOG( ("ScriptLoadRequest (%p): non-on-demand-only (non-omt) Parsing Enabled " "for url=%s mTotalFullParseSize=%u", - aRequest, aRequest->mURI->GetSpecOrDefault().get(), + aRequest, aRequest->URI()->GetSpecOrDefault().get(), mTotalFullParseSize)); } @@ -4146,7 +4140,7 @@ void ScriptLoader::ReportErrorToConsole(ScriptLoadRequest* aRequest, } AutoTArray<nsString, 1> params; - CopyUTF8toUTF16(aRequest->mURI->GetSpecOrDefault(), *params.AppendElement()); + CopyUTF8toUTF16(aRequest->URI()->GetSpecOrDefault(), *params.AppendElement()); Maybe<SourceLocation> loc; if (!isScript && !aRequest->IsTopLevel()) { @@ -4344,7 +4338,7 @@ bool ScriptLoader::ShouldApplyDelazifyStrategy(ScriptLoadRequest* aRequest) { } if (LOG_ENABLED()) { - nsCString url = aRequest->mURI->GetSpecOrDefault(); + nsCString url = aRequest->URI()->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/SharedScriptCache.cpp b/dom/script/SharedScriptCache.cpp @@ -45,7 +45,7 @@ ScriptHashKey::ScriptHashKey(ScriptLoader* aLoader, const JS::loader::ScriptLoadRequest* aRequest, const JS::loader::LoadedScript* aLoadedScript) : ScriptHashKey(aLoader, aRequest, aLoadedScript->GetFetchOptions(), - aRequest->mURI) {} + aLoadedScript->GetURI()) {} ScriptHashKey::ScriptHashKey(const ScriptLoadData& aLoadData) : ScriptHashKey(aLoadData.CacheKey()) {} diff --git a/dom/workers/ScriptLoader.cpp b/dom/workers/ScriptLoader.cpp @@ -699,7 +699,7 @@ 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, uri, SRIMetadata(), + request = new ScriptLoadRequest(ScriptKind::eClassic, SRIMetadata(), nullptr, // mReferrer loadContext); } else { @@ -728,7 +728,7 @@ already_AddRefed<ScriptLoadRequest> WorkerScriptLoader::CreateScriptLoadRequest( // Part of Step 2. This sets the Top-level flag to true request = new ModuleLoadRequest( - uri, JS::ModuleType::JavaScript, SRIMetadata(), referrer, loadContext, + JS::ModuleType::JavaScript, SRIMetadata(), referrer, loadContext, ModuleLoadRequest::Kind::TopLevel, moduleLoader, nullptr); } @@ -989,7 +989,7 @@ nsresult WorkerScriptLoader::LoadScript( : mWorkerRef->Private()->WorkerCredentials(); rv = GetModuleSecFlags(loadContext->IsTopLevel(), principal, - mWorkerScriptType, request->mURI, credentials, + mWorkerScriptType, request->URI(), credentials, secFlags); } else { referrerInfo = ReferrerInfo::CreateForFetch(principal, nullptr); @@ -998,7 +998,7 @@ nsresult WorkerScriptLoader::LoadScript( static_cast<ReferrerInfo*>(referrerInfo.get()) ->CloneWithNewPolicy(parentWorker->GetReferrerPolicy()); } - rv = GetClassicSecFlags(loadContext->IsTopLevel(), request->mURI, + rv = GetClassicSecFlags(loadContext->IsTopLevel(), request->URI(), principal, mWorkerScriptType, secFlags); } @@ -1010,7 +1010,7 @@ nsresult WorkerScriptLoader::LoadScript( rv = ChannelFromScriptURL( principal, parentDoc, mWorkerRef->Private(), loadGroup, ios, secMan, - request->mURI, loadContext->mClientInfo, mController, + request->URI(), loadContext->mClientInfo, mController, loadContext->IsTopLevel(), mWorkerScriptType, contentPolicyType, loadFlags, secFlags, mWorkerRef->Private()->CookieJarSettings(), referrerInfo, getter_AddRefs(channel)); diff --git a/dom/workers/loader/WorkerModuleLoader.cpp b/dom/workers/loader/WorkerModuleLoader.cpp @@ -97,9 +97,9 @@ already_AddRefed<ModuleLoadRequest> WorkerModuleLoader::CreateRequest( JS::ModuleType moduleType = JS::GetModuleRequestType(aCx, aModuleRequest); RefPtr<ModuleLoadRequest> request = new ModuleLoadRequest( - aURI, moduleType, SRIMetadata(), aBaseURL, loadContext, kind, this, root); + moduleType, SRIMetadata(), aBaseURL, loadContext, kind, this, root); - request->mURL = request->mURI->GetSpecOrDefault(); + request->mURL = aURI->GetSpecOrDefault(); request->NoCacheEntryFound(aReferrerPolicy, aOptions, aURI); return request.forget(); } diff --git a/dom/worklet/WorkletFetchHandler.cpp b/dom/worklet/WorkletFetchHandler.cpp @@ -114,10 +114,10 @@ NS_IMETHODIMP StartModuleLoadRunnable::RunOnWorkletThread() { // Part of Step 2. This sets the Top-level flag to true RefPtr<ModuleLoadRequest> request = new ModuleLoadRequest( - mURI, JS::ModuleType::JavaScript, SRIMetadata(), mReferrer, loadContext, + JS::ModuleType::JavaScript, SRIMetadata(), mReferrer, loadContext, ModuleLoadRequest::Kind::TopLevel, moduleLoader, nullptr); - request->mURL = request->mURI->GetSpecOrDefault(); + request->mURL = mURI->GetSpecOrDefault(); request->NoCacheEntryFound(ReferrerPolicy::_empty, fetchOptions, mURI); return request->StartModuleLoad(); diff --git a/dom/worklet/loader/WorkletModuleLoader.cpp b/dom/worklet/loader/WorkletModuleLoader.cpp @@ -78,11 +78,11 @@ already_AddRefed<ModuleLoadRequest> WorkletModuleLoader::CreateRequest( const nsMainThreadPtrHandle<WorkletFetchHandler>& handlerRef = context->GetHandlerRef(); RefPtr<WorkletLoadContext> loadContext = new WorkletLoadContext(handlerRef); - RefPtr<ModuleLoadRequest> request = new ModuleLoadRequest( - aURI, moduleType, SRIMetadata(), aBaseURL, loadContext, - ModuleLoadRequest::Kind::StaticImport, this, root); + RefPtr<ModuleLoadRequest> request = + new ModuleLoadRequest(moduleType, SRIMetadata(), aBaseURL, loadContext, + ModuleLoadRequest::Kind::StaticImport, this, root); - request->mURL = request->mURI->GetSpecOrDefault(); + request->mURL = aURI->GetSpecOrDefault(); request->NoCacheEntryFound(aReferrerPolicy, aOptions, aURI); return request.forget(); } @@ -93,11 +93,11 @@ bool WorkletModuleLoader::CanStartLoad(ModuleLoadRequest* aRequest, } nsresult WorkletModuleLoader::StartFetch(ModuleLoadRequest* aRequest) { - InsertRequest(aRequest->mURI, aRequest); + InsertRequest(aRequest->URI(), aRequest); RefPtr<StartFetchRunnable> runnable = new StartFetchRunnable(aRequest->GetWorkletLoadContext()->GetHandlerRef(), - aRequest->mURI, aRequest->mReferrer); + aRequest->URI(), aRequest->mReferrer); NS_DispatchToMainThread(runnable.forget()); return NS_OK; } diff --git a/js/loader/LoadedScript.cpp b/js/loader/LoadedScript.cpp @@ -28,8 +28,19 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(LoadedScript) NS_INTERFACE_MAP_ENTRY(nsISupports) NS_INTERFACE_MAP_END -NS_IMPL_CYCLE_COLLECTION(LoadedScript, mFetchOptions, mURI, mBaseURL, - mCacheInfo) +// 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_COLLECTING_ADDREF(LoadedScript) NS_IMPL_CYCLE_COLLECTING_RELEASE(LoadedScript) diff --git a/js/loader/LoadedScript.h b/js/loader/LoadedScript.h @@ -375,6 +375,8 @@ class LoadedScriptDelegate { return GetLoadedScript()->GetFetchOptions(); } + nsIURI* URI() const { return GetLoadedScript()->GetURI(); } + bool IsUnknownDataType() const { return GetLoadedScript()->IsUnknownDataType(); } diff --git a/js/loader/ModuleLoadRequest.cpp b/js/loader/ModuleLoadRequest.cpp @@ -45,12 +45,10 @@ NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED(ModuleLoadRequest, NS_IMPL_CYCLE_COLLECTION_TRACE_END ModuleLoadRequest::ModuleLoadRequest( - nsIURI* aURI, ModuleType aModuleType, - const mozilla::dom::SRIMetadata& aIntegrity, nsIURI* aReferrer, - LoadContextBase* aContext, Kind aKind, ModuleLoaderBase* aLoader, - ModuleLoadRequest* aRootModule) - : ScriptLoadRequest(ScriptKind::eModule, aURI, aIntegrity, aReferrer, - aContext), + ModuleType aModuleType, const mozilla::dom::SRIMetadata& aIntegrity, + nsIURI* aReferrer, LoadContextBase* aContext, Kind aKind, + ModuleLoaderBase* aLoader, ModuleLoadRequest* aRootModule) + : ScriptLoadRequest(ScriptKind::eModule, aIntegrity, aReferrer, aContext), mKind(aKind), mModuleType(aModuleType), mErroredLoadingImports(false), @@ -97,7 +95,7 @@ void ModuleLoadRequest::ModuleLoaded() { MOZ_ASSERT(IsFetching()); - mModuleScript = mLoader->GetFetchedModule(ModuleMapKey(mURI, mModuleType)); + mModuleScript = mLoader->GetFetchedModule(ModuleMapKey(URI(), mModuleType)); } void ModuleLoadRequest::LoadFailed() { diff --git a/js/loader/ModuleLoadRequest.h b/js/loader/ModuleLoadRequest.h @@ -50,9 +50,8 @@ class ModuleLoadRequest final : public ScriptLoadRequest { DynamicImport, }; - ModuleLoadRequest(nsIURI* aURI, ModuleType aModuleType, - const SRIMetadata& aIntegrity, nsIURI* aReferrer, - LoadContextBase* aContext, Kind aKind, + ModuleLoadRequest(ModuleType aModuleType, const SRIMetadata& aIntegrity, + nsIURI* aReferrer, LoadContextBase* aContext, Kind aKind, ModuleLoaderBase* aLoader, ModuleLoadRequest* aRootModule); bool IsTopLevel() const override { return mKind == Kind::TopLevel; } 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->mURI->GetAsciiSpec(url); + aRequest->URI()->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->mURI, aRequest->mModuleType))); + IsModuleFetching(ModuleMapKey(aRequest->URI(), 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->mURI, aRequest->mModuleType))) { + ModuleMapKey(aRequest->URI(), 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->mURI, aRequest->mModuleType))); + IsModuleFetched(ModuleMapKey(aRequest->URI(), 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->mURI, aRequest->mModuleType); + ModuleMapKey moduleMapKey(aRequest->URI(), 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->mURI, aRequest->mModuleType); + ModuleMapKey moduleMapKey(aRequest->URI(), 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->mURI, aRequest->mModuleType); + ModuleMapKey moduleMapKey(aRequest->URI(), 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->mURI->GetSpec(url); + aRequest->URI()->GetSpec(url); JS_ReportErrorNumberASCII(cx, js::GetErrorMessage, nullptr, JSMSG_DYNAMIC_IMPORT_FAILED, url.get()); FinishLoadingImportedModuleFailedWithPendingException(cx, payload); @@ -1002,14 +1002,6 @@ nsresult ModuleLoaderBase::CreateModuleScript(ModuleLoadRequest* aRequest) { } MOZ_ASSERT(aRequest->mLoadedScript->IsModuleScript()); -#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. @@ -1240,8 +1232,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->mURI->SchemeIs("chrome") || - aRequest->mURI->SchemeIs("resource"); + bool isSync = aRequest->URI()->SchemeIs("chrome") || + aRequest->URI()->SchemeIs("resource"); // TODO: Bug1973660: Use Promise version of LoadRequestedModules on Workers. if (aRequest->HasScriptLoadContext() && !isSync) { @@ -1363,7 +1355,7 @@ bool ModuleLoaderBase::OnLoadRequestedModulesRejected( FinishLoadingImportedModuleFailed(aCx, payload, error); } else { nsAutoCString url; - aRequest->mURI->GetSpec(url); + aRequest->URI()->GetSpec(url); JS_ReportErrorNumberASCII(aCx, js::GetErrorMessage, nullptr, JSMSG_DYNAMIC_IMPORT_FAILED, url.get()); FinishLoadingImportedModuleFailedWithPendingException(aCx, payload); diff --git a/js/loader/ScriptLoadRequest.cpp b/js/loader/ScriptLoadRequest.cpp @@ -85,7 +85,7 @@ NS_IMPL_CYCLE_COLLECTION(ScriptLoadRequest, mLoadedScript, mLoadContext) NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(ScriptLoadRequest) NS_IMPL_CYCLE_COLLECTION_TRACE_END -ScriptLoadRequest::ScriptLoadRequest(ScriptKind aKind, nsIURI* aURI, +ScriptLoadRequest::ScriptLoadRequest(ScriptKind aKind, const SRIMetadata& aIntegrity, nsIURI* aReferrer, LoadContextBase* aContext) @@ -95,7 +95,6 @@ ScriptLoadRequest::ScriptLoadRequest(ScriptKind aKind, nsIURI* aURI, mHasSourceMapURL_(false), mIntegrity(aIntegrity), mReferrer(aReferrer), - mURI(aURI), mLoadContext(aContext), mEarlyHintPreloaderId(0) { if (mLoadContext) { @@ -171,7 +170,6 @@ bool ScriptLoadRequest::IsCacheable() const { void ScriptLoadRequest::CacheEntryFound(LoadedScript* aLoadedScript) { MOZ_ASSERT(IsCheckingCache()); - MOZ_ASSERT(mURI); switch (mKind) { case ScriptKind::eClassic: @@ -195,15 +193,6 @@ void ScriptLoadRequest::CacheEntryFound(LoadedScript* aLoadedScript) { MOZ_ASSERT(aLoadedScript->IsModuleScript()); 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 @@ -220,19 +209,19 @@ void ScriptLoadRequest::NoCacheEntryFound( mozilla::dom::ReferrerPolicy aReferrerPolicy, ScriptFetchOptions* aFetchOptions, nsIURI* aURI) { MOZ_ASSERT(IsCheckingCache()); - 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 + // 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 mBaseURL using what the Channel->GetURI will provide. switch (mKind) { case ScriptKind::eClassic: - mLoadedScript = new ClassicScript(aReferrerPolicy, aFetchOptions, mURI); + mLoadedScript = new ClassicScript(aReferrerPolicy, aFetchOptions, aURI); break; case ScriptKind::eImportMap: - mLoadedScript = new ImportMapScript(aReferrerPolicy, aFetchOptions, mURI); + mLoadedScript = new ImportMapScript(aReferrerPolicy, aFetchOptions, aURI); break; case ScriptKind::eModule: - mLoadedScript = new ModuleScript(aReferrerPolicy, aFetchOptions, mURI); + mLoadedScript = new ModuleScript(aReferrerPolicy, aFetchOptions, aURI); break; case ScriptKind::eEvent: MOZ_ASSERT_UNREACHABLE("EventScripts are not using ScriptLoadRequest"); diff --git a/js/loader/ScriptLoadRequest.h b/js/loader/ScriptLoadRequest.h @@ -91,9 +91,8 @@ class ScriptLoadRequest : public nsISupports, public: using SRIMetadata = mozilla::dom::SRIMetadata; - ScriptLoadRequest(ScriptKind aKind, nsIURI* aURI, - const SRIMetadata& aIntegrity, nsIURI* aReferrer, - LoadContextBase* aContext); + ScriptLoadRequest(ScriptKind aKind, const SRIMetadata& aIntegrity, + nsIURI* aReferrer, LoadContextBase* aContext); NS_DECL_CYCLE_COLLECTING_ISUPPORTS NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(ScriptLoadRequest) @@ -287,7 +286,6 @@ class ScriptLoadRequest : public nsISupports, mHasSourceMapURL_ = true; } - const nsCOMPtr<nsIURI> mURI; nsCOMPtr<nsIPrincipal> mOriginPrincipal; // Keep the URI's filename alive during off thread parsing. diff --git a/js/xpconnect/loader/SyncModuleLoader.cpp b/js/xpconnect/loader/SyncModuleLoader.cpp @@ -80,9 +80,8 @@ already_AddRefed<ModuleLoadRequest> SyncModuleLoader::CreateRequest( kind = ModuleLoadRequest::Kind::StaticImport; } - RefPtr<ModuleLoadRequest> request = - new ModuleLoadRequest(aURI, moduleType, dom::SRIMetadata(), aBaseURL, - context, kind, this, root); + RefPtr<ModuleLoadRequest> request = new ModuleLoadRequest( + moduleType, dom::SRIMetadata(), aBaseURL, context, kind, this, root); request->NoCacheEntryFound(aReferrerPolicy, aOptions, aURI); return request.forget(); } @@ -126,13 +125,13 @@ void SyncModuleLoader::OnDynamicImportStarted(ModuleLoadRequest* aRequest) { bool SyncModuleLoader::CanStartLoad(ModuleLoadRequest* aRequest, nsresult* aRvOut) { - return nsContentSecurityUtils::IsTrustedScheme(aRequest->mURI); + return nsContentSecurityUtils::IsTrustedScheme(aRequest->URI()); } nsresult SyncModuleLoader::StartFetch(ModuleLoadRequest* aRequest) { MOZ_ASSERT(aRequest->HasLoadContext()); - aRequest->mBaseURL = aRequest->mURI; + aRequest->mBaseURL = aRequest->URI(); // Loading script source and compilation are intertwined in // mozJSModuleLoader. Perform both operations here but only report load @@ -154,7 +153,7 @@ nsresult SyncModuleLoader::StartFetch(ModuleLoadRequest* aRequest) { bool threwException = jsapi.HasException(); if (NS_FAILED(rv) && !threwException) { nsAutoCString uri; - nsresult rv2 = aRequest->mURI->GetSpec(uri); + nsresult rv2 = aRequest->URI()->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->mURI) {} + : mLocation(nullptr), mURI(aRequest->URI()) {} 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->mURI->GetSpec(location); + nsresult rv = aRequest->URI()->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->mURI)); + nsContentUtils::TruncatedURLForDisplay(aRequest->URI())); 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->mURI); + bool realFile = LocationIsRealFile(aRequest->URI()); RootedScript script(aCx); rv = GetScriptForLocation(aCx, info, sourceFile, realFile, aScriptOut); @@ -971,7 +971,7 @@ void mozJSModuleLoader::RecordImportStack( } nsAutoCString location; - nsresult rv = aRequest->mURI->GetSpec(location); + nsresult rv = aRequest->URI()->GetSpec(location); if (NS_FAILED(rv)) { return; } @@ -1085,7 +1085,7 @@ nsresult mozJSModuleLoader::ImportESModule( RefPtr<SyncLoadContext> context = new SyncLoadContext(); RefPtr<ModuleLoadRequest> request = new ModuleLoadRequest( - uri, JS::ModuleType::JavaScript, dom::SRIMetadata(), + JS::ModuleType::JavaScript, dom::SRIMetadata(), /* aReferrer = */ nullptr, context, ModuleLoadRequest::Kind::TopLevel, mModuleLoader, nullptr);