commit 85324622ab5f4b2443e92b29b247d293b75c55e0
parent 3b1afd5ca0a2cc02581ee863977de7c143706d42
Author: Tooru Fujisawa <arai_a@mac.com>
Date: Wed, 22 Oct 2025 04:35:35 +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:
11 files changed, 46 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
@@ -210,6 +210,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