tor-browser

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

commit 3cab1a6f1a73d28bed2e4da3d8508dbc54493b2e
parent cde6c638b3e927a517a03436d354e54401a8a368
Author: Tooru Fujisawa <arai_a@mac.com>
Date:   Wed, 22 Oct 2025 11:17:17 +0000

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

In contrast to other fields, mBaseURL is not populated in the constructors.
Thus we just need to remove the ScriptLoadRequest::mBaseURL field and
use the LoadedScript::mBaseURL instead.

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

Diffstat:
Mdom/script/ModuleLoader.cpp | 2+-
Mdom/script/ScriptLoader.cpp | 16+---------------
Mdom/workers/ScriptLoader.cpp | 2+-
Mdom/workers/loader/CacheLoadHandler.cpp | 4++--
Mdom/worklet/WorkletFetchHandler.cpp | 2+-
Mjs/loader/LoadedScript.cpp | 17+++++++++++++++++
Mjs/loader/LoadedScript.h | 22++++++++++++++++++----
Mjs/loader/ModuleLoaderBase.cpp | 17++---------------
Mjs/loader/ScriptLoadRequest.cpp | 22+++-------------------
Mjs/loader/ScriptLoadRequest.h | 10----------
Mjs/xpconnect/loader/SyncModuleLoader.cpp | 2+-
11 files changed, 47 insertions(+), 69 deletions(-)

diff --git a/dom/script/ModuleLoader.cpp b/dom/script/ModuleLoader.cpp @@ -402,7 +402,7 @@ nsresult ModuleLoader::CompileCssModule( // https://github.com/whatwg/html/issues/11629). dom::CSSStyleSheetInit options; RefPtr<StyleSheet> sheet = StyleSheet::CreateConstructedSheet( - *constructorDocument, aRequest->mBaseURL, options, error); + *constructorDocument, aRequest->BaseURL(), options, error); if (error.Failed()) { return; } diff --git a/dom/script/ScriptLoader.cpp b/dom/script/ScriptLoader.cpp @@ -1669,7 +1669,7 @@ bool ScriptLoader::ProcessInlineScript(nsIScriptElement* aElement, LOG(("ScriptLoadRequest (%p): Created request for inline script", request.get())); - request->mBaseURL = mDocument->GetDocBaseURI(); + request->SetBaseURL(mDocument->GetDocBaseURI()); if (request->IsModuleRequest()) { // https://html.spec.whatwg.org/multipage/webappapis.html#fetch-an-inline-module-script-graph @@ -3393,20 +3393,6 @@ nsresult ScriptLoader::EvaluateScript(nsIGlobalObject* aGlobalObject, // Create a ClassicScript object and associate it with the JSScript. MOZ_ASSERT(aRequest->mLoadedScript->IsClassicScript()); - 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(); JS::Rooted<JS::Value> classicScriptValue(cx, JS::PrivateValue(classicScript)); diff --git a/dom/workers/ScriptLoader.cpp b/dom/workers/ScriptLoader.cpp @@ -1257,7 +1257,7 @@ bool WorkerScriptLoader::EvaluateScript(JSContext* aCx, if (loadContext->mMutedErrorFlag.valueOr(false)) { NS_NewURI(getter_AddRefs(requestBaseURI), "about:blank"_ns); } else { - requestBaseURI = aRequest->mBaseURL; + requestBaseURI = aRequest->BaseURL(); } MOZ_ASSERT(aRequest->mLoadedScript->IsClassicScript()); aRequest->mLoadedScript->SetBaseURL(requestBaseURI); 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->mBaseURL) { - loadContext->mRequest->mBaseURL = finalURI; + if (!loadContext->mRequest->BaseURL()) { + loadContext->mRequest->SetBaseURL(finalURI); } if (loadContext->IsTopLevel()) { if (NS_SUCCEEDED(rv)) { diff --git a/dom/worklet/WorkletFetchHandler.cpp b/dom/worklet/WorkletFetchHandler.cpp @@ -217,7 +217,7 @@ NS_IMETHODIMP FetchCompleteRunnable::RunOnWorkletThread() { NS_ENSURE_SUCCESS(rv, rv); } - request->mBaseURL = mURI; + request->SetBaseURL(mURI); request->OnFetchComplete(mResult); moduleLoader->RemoveRequest(mURI); return NS_OK; diff --git a/js/loader/LoadedScript.cpp b/js/loader/LoadedScript.cpp @@ -15,6 +15,7 @@ #include "jsfriendapi.h" #include "js/Modules.h" // JS::{Get,Set}ModulePrivate #include "LoadContextBase.h" // LoadContextBase +#include "nsIChannel.h" // nsIChannel namespace JS::loader { @@ -210,6 +211,22 @@ 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 diff --git a/js/loader/LoadedScript.h b/js/loader/LoadedScript.h @@ -97,10 +97,7 @@ class LoadedScript : public nsIMemoryReporter { } nsIURI* GetURI() const { return mURI; } - void SetBaseURL(nsIURI* aBaseURL) { - MOZ_ASSERT(!mBaseURL); - mBaseURL = aBaseURL; - } + void SetBaseURL(nsIURI* aBaseURL) { mBaseURL = aBaseURL; } nsIURI* BaseURL() const { return mBaseURL; } void AssociateWithScript(JSScript* aScript); @@ -278,6 +275,13 @@ 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. @@ -306,6 +310,8 @@ class LoadedScript : public nsIMemoryReporter { private: RefPtr<ScriptFetchOptions> mFetchOptions; nsCOMPtr<nsIURI> mURI; + + // The base URL used for resolving relative module imports. nsCOMPtr<nsIURI> mBaseURL; public: @@ -377,6 +383,14 @@ class LoadedScriptDelegate { 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(); } diff --git a/js/loader/ModuleLoaderBase.cpp b/js/loader/ModuleLoaderBase.cpp @@ -962,7 +962,7 @@ void ModuleLoaderBase::DispatchModuleErrored(ModuleLoadRequest* aRequest) { nsresult ModuleLoaderBase::CreateModuleScript(ModuleLoadRequest* aRequest) { MOZ_ASSERT(!aRequest->mModuleScript); - MOZ_ASSERT(aRequest->mBaseURL); + MOZ_ASSERT(aRequest->BaseURL()); LOG(("ScriptLoadRequest (%p): Create module script", aRequest)); @@ -1002,19 +1002,6 @@ nsresult ModuleLoaderBase::CreateModuleScript(ModuleLoadRequest* aRequest) { } MOZ_ASSERT(aRequest->mLoadedScript->IsModuleScript()); - 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(); @@ -1698,7 +1685,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->mBaseURL, warning); + return ImportMap::ParseString(jsapi.cx(), text, aRequest->BaseURL(), warning); } void ModuleLoaderBase::RegisterImportMap(UniquePtr<ImportMap> aImportMap) { diff --git a/js/loader/ScriptLoadRequest.cpp b/js/loader/ScriptLoadRequest.cpp @@ -193,7 +193,6 @@ void ScriptLoadRequest::CacheEntryFound(LoadedScript* aLoadedScript) { MOZ_ASSERT(aLoadedScript->IsModuleScript()); mLoadedScript = ModuleScript::FromCache(*aLoadedScript); - mBaseURL = mLoadedScript->BaseURL(); // Modules need to wait for fetching dependencies before setting to // Ready. @@ -209,10 +208,11 @@ void ScriptLoadRequest::NoCacheEntryFound( mozilla::dom::ReferrerPolicy aReferrerPolicy, ScriptFetchOptions* aFetchOptions, nsIURI* aURI) { MOZ_ASSERT(IsCheckingCache()); - // At the time where we check in the cache, the mBaseURL is not set, as this + // 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 mBaseURL using what the Channel->GetURI will provide. + // and later replace the BaseURL() using what the Channel->GetURI will + // provide. switch (mKind) { case ScriptKind::eClassic: mLoadedScript = new ClassicScript(aReferrerPolicy, aFetchOptions, aURI); @@ -230,20 +230,4 @@ 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 @@ -231,13 +231,6 @@ class ScriptLoadRequest : public nsISupports, const LoadedScript* getLoadedScript() const { return mLoadedScript.get(); } LoadedScript* getLoadedScript() { return mLoadedScript.get(); } - /* - * Set the request's mBaseURL, based on aChannel. - * aOriginalURI is the result of aChannel->GetOriginalURI. - */ - void SetBaseURLFromChannelAndOriginalURI(nsIChannel* aChannel, - nsIURI* aOriginalURI); - const ScriptKind mKind; // Whether this is a classic script or a module // script. @@ -293,9 +286,6 @@ 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 @@ -131,7 +131,7 @@ bool SyncModuleLoader::CanStartLoad(ModuleLoadRequest* aRequest, nsresult SyncModuleLoader::StartFetch(ModuleLoadRequest* aRequest) { MOZ_ASSERT(aRequest->HasLoadContext()); - aRequest->mBaseURL = aRequest->URI(); + aRequest->SetBaseURL(aRequest->URI()); // Loading script source and compilation are intertwined in // mozJSModuleLoader. Perform both operations here but only report load