tor-browser

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

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

Bug 1991607 - Part 1: Let ScriptHashKey and ScriptLoadData receive LoadedScript-related parameters separately. r=bthrall

This is a preparation for the later patches.

ScriptFetchOptions and URI fields are duplicated between ScriptLoadRequest and
LoadedScript, and this patch stack is going to remove them from
ScriptLoadRequest.

At the point of ScriptLoader::TryUseCache, LoadedScript is not yet created,
and ScriptHashKey needs to receive ScriptFetchOptions and URI in addition to
ScriptLoadRequest.

In order to avoid misuse, ScriptHashKey constructor is split into two variants.
One receives ScriptLoadRequest+ScriptFetchOptions+nsIURI, which is for
the case LoadedScript is not yet created,
and the other receives ScriptLoadRequest+LoadedScript, which is for the case
LoadedScript is already created.

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

Diffstat:
Mdom/script/ScriptLoader.cpp | 9+++++----
Mdom/script/SharedScriptCache.cpp | 25+++++++++++++++++--------
Mdom/script/SharedScriptCache.h | 12+++++++++---
3 files changed, 31 insertions(+), 15 deletions(-)

diff --git a/dom/script/ScriptLoader.cpp b/dom/script/ScriptLoader.cpp @@ -1171,7 +1171,7 @@ void ScriptLoader::TryUseCache(ScriptLoadRequest* aRequest, return; } - ScriptHashKey key(this, aRequest); + ScriptHashKey key(this, aRequest, aRequest->mFetchOptions, aRequest->mURI); auto cacheResult = mCache->Lookup(*this, key, /* aSyncLoad = */ true); if (cacheResult.mState != CachedSubResourceState::Complete) { aRequest->NoCacheEntryFound(); @@ -3233,7 +3233,7 @@ ScriptLoader::CacheBehavior ScriptLoader::GetCacheBehavior( return CacheBehavior::Insert; } - ScriptHashKey key(this, aRequest); + ScriptHashKey key(this, aRequest, aRequest->getLoadedScript()); auto cacheResult = mCache->Lookup(*this, key, /* aSyncLoad = */ true); if (cacheResult.mState == CachedSubResourceState::Complete) { @@ -3265,13 +3265,14 @@ void ScriptLoader::TryCacheRequest(ScriptLoadRequest* aRequest) { aRequest->ConvertToCachedStencil(); if (cacheBehavior == CacheBehavior::Insert) { - auto loadData = MakeRefPtr<ScriptLoadData>(this, aRequest); + auto loadData = + MakeRefPtr<ScriptLoadData>(this, aRequest, aRequest->getLoadedScript()); mCache->Insert(*loadData); LOG(("ScriptLoader (%p): Inserting in-memory cache for %s.", this, aRequest->mURI->GetSpecOrDefault().get())); } else { MOZ_ASSERT(cacheBehavior == CacheBehavior::Evict); - ScriptHashKey key(this, aRequest); + ScriptHashKey key(this, aRequest, aRequest->getLoadedScript()); mCache->Evict(key); LOG(("ScriptLoader (%p): Evicting in-memory cache for %s.", this, aRequest->mURI->GetSpecOrDefault().get())); diff --git a/dom/script/SharedScriptCache.cpp b/dom/script/SharedScriptCache.cpp @@ -19,16 +19,18 @@ namespace mozilla::dom { -ScriptHashKey::ScriptHashKey(ScriptLoader* aLoader, - const JS::loader::ScriptLoadRequest* aRequest) +ScriptHashKey::ScriptHashKey( + ScriptLoader* aLoader, const JS::loader::ScriptLoadRequest* aRequest, + const JS::loader::ScriptFetchOptions* aFetchOptions, + const nsCOMPtr<nsIURI> aURI) : PLDHashEntryHdr(), - mURI(aRequest->mURI), + mURI(aURI), mLoaderPrincipal(aLoader->LoaderPrincipal()), mPartitionPrincipal(aLoader->PartitionedPrincipal()), - mCORSMode(aRequest->CORSMode()), + mCORSMode(aFetchOptions->mCORSMode), mSRIMetadata(aRequest->mIntegrity), mKind(aRequest->mKind), - mNonce(aRequest->Nonce()), + mNonce(aFetchOptions->mNonce), mIsLinkRelPreload(aRequest->GetScriptLoadContext()->IsPreload()) { if (mKind == JS::loader::ScriptKind::eClassic) { if (aRequest->GetScriptLoadContext()->HasScriptElement()) { @@ -39,6 +41,12 @@ ScriptHashKey::ScriptHashKey(ScriptLoader* aLoader, MOZ_COUNT_CTOR(ScriptHashKey); } +ScriptHashKey::ScriptHashKey(ScriptLoader* aLoader, + const JS::loader::ScriptLoadRequest* aRequest, + const JS::loader::LoadedScript* aLoadedScript) + : ScriptHashKey(aLoader, aRequest, aRequest->mFetchOptions, + aRequest->mURI) {} + ScriptHashKey::ScriptHashKey(const ScriptLoadData& aLoadData) : ScriptHashKey(aLoadData.CacheKey()) {} @@ -84,11 +92,12 @@ bool ScriptHashKey::KeyEquals(const ScriptHashKey& aKey) const { NS_IMPL_ISUPPORTS(ScriptLoadData, nsISupports) ScriptLoadData::ScriptLoadData(ScriptLoader* aLoader, - JS::loader::ScriptLoadRequest* aRequest) + JS::loader::ScriptLoadRequest* aRequest, + JS::loader::LoadedScript* aLoadedScript) : mExpirationTime(aRequest->ExpirationTime()), mLoader(aLoader), - mKey(aLoader, aRequest), - mLoadedScript(aRequest->getLoadedScript()), + mKey(aLoader, aRequest, aLoadedScript), + mLoadedScript(aLoadedScript), mNetworkMetadata(aRequest->mNetworkMetadata) {} NS_IMPL_ISUPPORTS(SharedScriptCache, nsIMemoryReporter) diff --git a/dom/script/SharedScriptCache.h b/dom/script/SharedScriptCache.h @@ -9,6 +9,7 @@ #include "PLDHashTable.h" // PLDHashEntryHdr #include "js/loader/LoadedScript.h" // JS::loader::LoadedScript +#include "js/loader/ScriptFetchOptions.h" // JS::loader::ScriptFetchOptions #include "js/loader/ScriptKind.h" // JS::loader::ScriptKind #include "js/loader/ScriptLoadRequest.h" // JS::loader::ScriptLoadRequest #include "mozilla/CORSMode.h" // mozilla::CORSMode @@ -65,7 +66,12 @@ class ScriptHashKey : public PLDHashEntryHdr { } ScriptHashKey(ScriptLoader* aLoader, - const JS::loader::ScriptLoadRequest* aRequest); + const JS::loader::ScriptLoadRequest* aRequest, + const JS::loader::LoadedScript* aLoadedScript); + ScriptHashKey(ScriptLoader* aLoader, + const JS::loader::ScriptLoadRequest* aRequest, + const JS::loader::ScriptFetchOptions* aFetchOptions, + const nsCOMPtr<nsIURI> aURI); explicit ScriptHashKey(const ScriptLoadData& aLoadData); MOZ_COUNTED_DTOR(ScriptHashKey) @@ -122,8 +128,8 @@ class ScriptLoadData final ~ScriptLoadData() {} public: - ScriptLoadData(ScriptLoader* aLoader, - JS::loader::ScriptLoadRequest* aRequest); + ScriptLoadData(ScriptLoader* aLoader, JS::loader::ScriptLoadRequest* aRequest, + JS::loader::LoadedScript* aLoadedScript); NS_DECL_ISUPPORTS