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:
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);