commit b4a4f94096c14d0602a2c4007046e84559e169cb
parent f5f1764e76f59751227a8bfcd9f4f138a4784682
Author: Tooru Fujisawa <arai_a@mac.com>
Date: Wed, 22 Oct 2025 04:35:32 +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:
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