commit 9cd82d3aa1c438b4dd19e21b901275580119a5b9
parent 1e6cf884b04b7737dfd67b4411e5a5e6fa24e9c2
Author: Tooru Fujisawa <arai_a@mac.com>
Date: Wed, 22 Oct 2025 11:17:16 +0000
Bug 1991607 - Part 8: Remove ScriptLoadRequest::mFetchOptions. r=bthrall,dom-worker-reviewers,edenchuang
Differential Revision: https://phabricator.services.mozilla.com/D267357
Diffstat:
15 files changed, 44 insertions(+), 53 deletions(-)
diff --git a/dom/script/ModuleLoader.cpp b/dom/script/ModuleLoader.cpp
@@ -451,8 +451,8 @@ already_AddRefed<ModuleLoadRequest> ModuleLoader::CreateTopLevel(
nsIURI* aReferrer, ScriptLoadContext* aContext,
ScriptLoadRequestType aRequestType) {
RefPtr<ModuleLoadRequest> request = new ModuleLoadRequest(
- aURI, JS::ModuleType::JavaScript, aFetchOptions, aIntegrity, aReferrer,
- aContext, ModuleLoadRequest::Kind::TopLevel, this, nullptr);
+ aURI, JS::ModuleType::JavaScript, aIntegrity, aReferrer, aContext,
+ ModuleLoadRequest::Kind::TopLevel, this, nullptr);
GetScriptLoader()->TryUseCache(aReferrerPolicy, aFetchOptions, request,
aElement, aFetchOptions->mNonce, aRequestType);
@@ -483,9 +483,8 @@ already_AddRefed<ModuleLoadRequest> ModuleLoader::CreateRequest(
}
JS::ModuleType moduleType = GetModuleRequestType(aCx, aModuleRequest);
- RefPtr<ModuleLoadRequest> request =
- new ModuleLoadRequest(aURI, moduleType, aOptions, aSriMetadata, aBaseURL,
- context, kind, this, root);
+ RefPtr<ModuleLoadRequest> request = new ModuleLoadRequest(
+ aURI, moduleType, aSriMetadata, aBaseURL, context, kind, this, root);
GetScriptLoader()->TryUseCache(aReferrerPolicy, aOptions, request);
diff --git a/dom/script/ScriptLoader.cpp b/dom/script/ScriptLoader.cpp
@@ -1141,8 +1141,8 @@ already_AddRefed<ScriptLoadRequest> ScriptLoader::CreateLoadRequest(
MOZ_ASSERT(aKind == ScriptKind::eClassic || aKind == ScriptKind::eImportMap);
- RefPtr<ScriptLoadRequest> request = new ScriptLoadRequest(
- aKind, aURI, fetchOptions, aIntegrity, referrer, context);
+ RefPtr<ScriptLoadRequest> request =
+ new ScriptLoadRequest(aKind, aURI, aIntegrity, referrer, context);
TryUseCache(aReferrerPolicy, fetchOptions, request, aElement, aNonce,
aRequestType);
@@ -1176,7 +1176,12 @@ void ScriptLoader::TryUseCache(ReferrerPolicy aReferrerPolicy,
return;
}
- ScriptHashKey key(this, aRequest, aRequest->mFetchOptions, aRequest->mURI);
+ // 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);
auto cacheResult = mCache->Lookup(*this, key, /* aSyncLoad = */ true);
if (cacheResult.mState != CachedSubResourceState::Complete) {
aRequest->NoCacheEntryFound(aReferrerPolicy, aFetchOptions);
@@ -1191,8 +1196,7 @@ void ScriptLoader::TryUseCache(ReferrerPolicy aReferrerPolicy,
if (aRequestType == ScriptLoadRequestType::External) {
// NOTE: The preload case checks the same after the
// LookupPreloadRequest call.
- if (NS_FAILED(CheckContentPolicy(aElement, aNonce, aRequest,
- aRequest->mFetchOptions,
+ if (NS_FAILED(CheckContentPolicy(aElement, aNonce, aRequest, aFetchOptions,
aRequest->mURI))) {
aRequest->NoCacheEntryFound(aReferrerPolicy, aFetchOptions);
LOG(
@@ -1237,8 +1241,8 @@ void ScriptLoader::EmulateNetworkEvents(ScriptLoadRequest* aRequest) {
}
NotifyObserversForCachedScript(
- aRequest->mURI, context, aRequest->mFetchOptions->mTriggeringPrincipal,
- CORSModeToSecurityFlags(aRequest->mFetchOptions->mCORSMode),
+ aRequest->mURI, context, aRequest->FetchOptions()->mTriggeringPrincipal,
+ CORSModeToSecurityFlags(aRequest->FetchOptions()->mCORSMode),
nsIContentPolicy::TYPE_INTERNAL_SCRIPT, aRequest->mNetworkMetadata);
{
@@ -1358,7 +1362,7 @@ bool ScriptLoader::ProcessExternalScript(nsIScriptElement* aElement,
LookupPreloadRequest(aElement, aScriptKind, sriMetadata);
if (request) {
if (NS_FAILED(CheckContentPolicy(aElement, nonce, request,
- request->mFetchOptions, request->mURI))) {
+ request->FetchOptions(), request->mURI))) {
LOG(("ScriptLoader (%p): content policy check failed for preload", this));
// Probably plans have changed; even though the preload was allowed seems
@@ -3386,8 +3390,6 @@ 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
{
diff --git a/dom/script/SharedScriptCache.cpp b/dom/script/SharedScriptCache.cpp
@@ -44,7 +44,7 @@ ScriptHashKey::ScriptHashKey(
ScriptHashKey::ScriptHashKey(ScriptLoader* aLoader,
const JS::loader::ScriptLoadRequest* aRequest,
const JS::loader::LoadedScript* aLoadedScript)
- : ScriptHashKey(aLoader, aRequest, aRequest->mFetchOptions,
+ : ScriptHashKey(aLoader, aRequest, aLoadedScript->GetFetchOptions(),
aRequest->mURI) {}
ScriptHashKey::ScriptHashKey(const ScriptLoadData& aLoadData)
diff --git a/dom/workers/ScriptLoader.cpp b/dom/workers/ScriptLoader.cpp
@@ -699,8 +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, fetchOptions,
- SRIMetadata(),
+ request = new ScriptLoadRequest(ScriptKind::eClassic, uri, SRIMetadata(),
nullptr, // mReferrer
loadContext);
} else {
@@ -729,8 +728,8 @@ already_AddRefed<ScriptLoadRequest> WorkerScriptLoader::CreateScriptLoadRequest(
// Part of Step 2. This sets the Top-level flag to true
request = new ModuleLoadRequest(
- uri, JS::ModuleType::JavaScript, fetchOptions, SRIMetadata(), referrer,
- loadContext, ModuleLoadRequest::Kind::TopLevel, moduleLoader, nullptr);
+ uri, JS::ModuleType::JavaScript, SRIMetadata(), referrer, loadContext,
+ ModuleLoadRequest::Kind::TopLevel, moduleLoader, nullptr);
}
// Set the mURL, it will be used for error handling and debugging.
@@ -1261,8 +1260,6 @@ bool WorkerScriptLoader::EvaluateScript(JSContext* aCx,
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/WorkerModuleLoader.cpp b/dom/workers/loader/WorkerModuleLoader.cpp
@@ -96,9 +96,8 @@ already_AddRefed<ModuleLoadRequest> WorkerModuleLoader::CreateRequest(
}
JS::ModuleType moduleType = JS::GetModuleRequestType(aCx, aModuleRequest);
- RefPtr<ModuleLoadRequest> request =
- new ModuleLoadRequest(aURI, moduleType, aOptions, SRIMetadata(), aBaseURL,
- loadContext, kind, this, root);
+ RefPtr<ModuleLoadRequest> request = new ModuleLoadRequest(
+ aURI, moduleType, SRIMetadata(), aBaseURL, loadContext, kind, this, root);
request->mURL = request->mURI->GetSpecOrDefault();
request->NoCacheEntryFound(aReferrerPolicy, aOptions);
diff --git a/dom/worklet/WorkletFetchHandler.cpp b/dom/worklet/WorkletFetchHandler.cpp
@@ -114,8 +114,8 @@ 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, fetchOptions, SRIMetadata(), mReferrer,
- loadContext, ModuleLoadRequest::Kind::TopLevel, moduleLoader, nullptr);
+ mURI, JS::ModuleType::JavaScript, SRIMetadata(), mReferrer, loadContext,
+ ModuleLoadRequest::Kind::TopLevel, moduleLoader, nullptr);
request->mURL = request->mURI->GetSpecOrDefault();
request->NoCacheEntryFound(ReferrerPolicy::_empty, fetchOptions);
diff --git a/dom/worklet/loader/WorkletModuleLoader.cpp b/dom/worklet/loader/WorkletModuleLoader.cpp
@@ -79,7 +79,7 @@ already_AddRefed<ModuleLoadRequest> WorkletModuleLoader::CreateRequest(
context->GetHandlerRef();
RefPtr<WorkletLoadContext> loadContext = new WorkletLoadContext(handlerRef);
RefPtr<ModuleLoadRequest> request = new ModuleLoadRequest(
- aURI, moduleType, aOptions, SRIMetadata(), aBaseURL, loadContext,
+ aURI, moduleType, SRIMetadata(), aBaseURL, loadContext,
ModuleLoadRequest::Kind::StaticImport, this, root);
request->mURL = request->mURI->GetSpecOrDefault();
diff --git a/js/loader/LoadedScript.h b/js/loader/LoadedScript.h
@@ -371,6 +371,10 @@ class LoadedScriptDelegate {
GetLoadedScript()->AsModuleScript()->UpdateReferrerPolicy(aReferrerPolicy);
}
+ ScriptFetchOptions* FetchOptions() const {
+ return GetLoadedScript()->GetFetchOptions();
+ }
+
bool IsUnknownDataType() const {
return GetLoadedScript()->IsUnknownDataType();
}
diff --git a/js/loader/ModuleLoadRequest.cpp b/js/loader/ModuleLoadRequest.cpp
@@ -45,12 +45,12 @@ NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED(ModuleLoadRequest,
NS_IMPL_CYCLE_COLLECTION_TRACE_END
ModuleLoadRequest::ModuleLoadRequest(
- nsIURI* aURI, ModuleType aModuleType, ScriptFetchOptions* aFetchOptions,
+ nsIURI* aURI, ModuleType aModuleType,
const mozilla::dom::SRIMetadata& aIntegrity, nsIURI* aReferrer,
LoadContextBase* aContext, Kind aKind, ModuleLoaderBase* aLoader,
ModuleLoadRequest* aRootModule)
- : ScriptLoadRequest(ScriptKind::eModule, aURI, aFetchOptions, aIntegrity,
- aReferrer, aContext),
+ : ScriptLoadRequest(ScriptKind::eModule, aURI, aIntegrity, aReferrer,
+ aContext),
mKind(aKind),
mModuleType(aModuleType),
mErroredLoadingImports(false),
diff --git a/js/loader/ModuleLoadRequest.h b/js/loader/ModuleLoadRequest.h
@@ -51,7 +51,6 @@ class ModuleLoadRequest final : public ScriptLoadRequest {
};
ModuleLoadRequest(nsIURI* aURI, ModuleType aModuleType,
- ScriptFetchOptions* aFetchOptions,
const SRIMetadata& aIntegrity, nsIURI* aReferrer,
LoadContextBase* aContext, Kind aKind,
ModuleLoaderBase* aLoader, ModuleLoadRequest* aRootModule);
diff --git a/js/loader/ModuleLoaderBase.cpp b/js/loader/ModuleLoaderBase.cpp
@@ -1002,8 +1002,6 @@ nsresult ModuleLoaderBase::CreateModuleScript(ModuleLoadRequest* aRequest) {
}
MOZ_ASSERT(aRequest->mLoadedScript->IsModuleScript());
- MOZ_ASSERT(aRequest->mFetchOptions->IsCompatible(
- aRequest->mLoadedScript->GetFetchOptions()));
#ifdef DEBUG
{
bool equals = false;
diff --git a/js/loader/ScriptLoadRequest.cpp b/js/loader/ScriptLoadRequest.cpp
@@ -80,14 +80,12 @@ 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, mFetchOptions, mLoadedScript,
- mLoadContext)
+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,
- ScriptFetchOptions* aFetchOptions,
const SRIMetadata& aIntegrity,
nsIURI* aReferrer,
LoadContextBase* aContext)
@@ -95,13 +93,11 @@ ScriptLoadRequest::ScriptLoadRequest(ScriptKind aKind, nsIURI* aURI,
mState(State::CheckingCache),
mFetchSourceOnly(false),
mHasSourceMapURL_(false),
- mFetchOptions(aFetchOptions),
mIntegrity(aIntegrity),
mReferrer(aReferrer),
mURI(aURI),
mLoadContext(aContext),
mEarlyHintPreloaderId(0) {
- MOZ_ASSERT(mFetchOptions);
if (mLoadContext) {
mLoadContext->SetRequest(this);
}
@@ -228,16 +224,15 @@ void ScriptLoadRequest::NoCacheEntryFound(
// 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.
- MOZ_ASSERT(mFetchOptions == aFetchOptions);
switch (mKind) {
case ScriptKind::eClassic:
- mLoadedScript = new ClassicScript(aReferrerPolicy, mFetchOptions, mURI);
+ mLoadedScript = new ClassicScript(aReferrerPolicy, aFetchOptions, mURI);
break;
case ScriptKind::eImportMap:
- mLoadedScript = new ImportMapScript(aReferrerPolicy, mFetchOptions, mURI);
+ mLoadedScript = new ImportMapScript(aReferrerPolicy, aFetchOptions, mURI);
break;
case ScriptKind::eModule:
- mLoadedScript = new ModuleScript(aReferrerPolicy, mFetchOptions, mURI);
+ mLoadedScript = new ModuleScript(aReferrerPolicy, aFetchOptions, mURI);
break;
case ScriptKind::eEvent:
MOZ_ASSERT_UNREACHABLE("EventScripts are not using ScriptLoadRequest");
diff --git a/js/loader/ScriptLoadRequest.h b/js/loader/ScriptLoadRequest.h
@@ -92,7 +92,6 @@ class ScriptLoadRequest : public nsISupports,
public:
using SRIMetadata = mozilla::dom::SRIMetadata;
ScriptLoadRequest(ScriptKind aKind, nsIURI* aURI,
- ScriptFetchOptions* aFetchOptions,
const SRIMetadata& aIntegrity, nsIURI* aReferrer,
LoadContextBase* aContext);
@@ -152,17 +151,17 @@ class ScriptLoadRequest : public nsISupports,
}
mozilla::dom::RequestPriority FetchPriority() const {
- return mFetchOptions->mFetchPriority;
+ return FetchOptions()->mFetchPriority;
}
enum ParserMetadata ParserMetadata() const {
- return mFetchOptions->mParserMetadata;
+ return FetchOptions()->mParserMetadata;
}
- const nsString& Nonce() const { return mFetchOptions->mNonce; }
+ const nsString& Nonce() const { return FetchOptions()->mNonce; }
nsIPrincipal* TriggeringPrincipal() const {
- return mFetchOptions->mTriggeringPrincipal;
+ return FetchOptions()->mTriggeringPrincipal;
}
// Convert a CheckingCache ScriptLoadRequest into a Ready one, by populating
@@ -215,7 +214,7 @@ class ScriptLoadRequest : public nsISupports,
}
public:
- mozilla::CORSMode CORSMode() const { return mFetchOptions->mCORSMode; }
+ mozilla::CORSMode CORSMode() const { return FetchOptions()->mCORSMode; }
bool HasLoadContext() const { return mLoadContext; }
bool HasScriptLoadContext() const;
@@ -267,7 +266,6 @@ class ScriptLoadRequest : public nsISupports,
CacheExpirationTime mExpirationTime = CacheExpirationTime::Never();
- RefPtr<ScriptFetchOptions> mFetchOptions;
RefPtr<mozilla::SubResourceNetworkMetadataHolder> mNetworkMetadata;
const SRIMetadata mIntegrity;
const nsCOMPtr<nsIURI> mReferrer;
diff --git a/js/xpconnect/loader/SyncModuleLoader.cpp b/js/xpconnect/loader/SyncModuleLoader.cpp
@@ -81,8 +81,8 @@ already_AddRefed<ModuleLoadRequest> SyncModuleLoader::CreateRequest(
}
RefPtr<ModuleLoadRequest> request =
- new ModuleLoadRequest(aURI, moduleType, aOptions, dom::SRIMetadata(),
- aBaseURL, context, kind, this, root);
+ new ModuleLoadRequest(aURI, moduleType, dom::SRIMetadata(), aBaseURL,
+ context, kind, this, root);
request->NoCacheEntryFound(aReferrerPolicy, aOptions);
return request.forget();
}
diff --git a/js/xpconnect/loader/mozJSModuleLoader.cpp b/js/xpconnect/loader/mozJSModuleLoader.cpp
@@ -1085,7 +1085,7 @@ nsresult mozJSModuleLoader::ImportESModule(
RefPtr<SyncLoadContext> context = new SyncLoadContext();
RefPtr<ModuleLoadRequest> request = new ModuleLoadRequest(
- uri, JS::ModuleType::JavaScript, options, dom::SRIMetadata(),
+ uri, JS::ModuleType::JavaScript, dom::SRIMetadata(),
/* aReferrer = */ nullptr, context, ModuleLoadRequest::Kind::TopLevel,
mModuleLoader, nullptr);