commit a2e5b3c8875e4047719d19e86b314efa12dcdf35
parent 2c345632297cc39da2b2c3ae36caa93bf5bc1673
Author: Tooru Fujisawa <arai_a@mac.com>
Date: Wed, 19 Nov 2025 01:45:54 +0000
Bug 1999649 - Part 3: Reorder ScriptHashKey fields and the KeyEquals logic to match the order between them. r=bthrall
Differential Revision: https://phabricator.services.mozilla.com/D272506
Diffstat:
2 files changed, 41 insertions(+), 25 deletions(-)
diff --git a/dom/script/SharedScriptCache.cpp b/dom/script/SharedScriptCache.cpp
@@ -28,12 +28,12 @@ ScriptHashKey::ScriptHashKey(
const JS::loader::ScriptFetchOptions* aFetchOptions,
const nsCOMPtr<nsIURI> aURI)
: PLDHashEntryHdr(),
+ mURI(aURI),
+ mPartitionPrincipal(aLoader->PartitionedPrincipal()),
+ mLoaderPrincipal(aLoader->LoaderPrincipal()),
mKind(aRequest->mKind),
mCORSMode(aFetchOptions->mCORSMode),
mReferrerPolicy(aReferrerPolicy),
- mURI(aURI),
- mLoaderPrincipal(aLoader->LoaderPrincipal()),
- mPartitionPrincipal(aLoader->PartitionedPrincipal()),
mSRIMetadata(aRequest->mIntegrity),
mNonce(aFetchOptions->mNonce) {
if (mKind == JS::loader::ScriptKind::eClassic) {
@@ -56,14 +56,6 @@ ScriptHashKey::ScriptHashKey(const ScriptLoadData& aLoadData)
: ScriptHashKey(aLoadData.CacheKey()) {}
bool ScriptHashKey::KeyEquals(const ScriptHashKey& aKey) const {
- if (mKind != aKey.mKind) {
- return false;
- }
-
- if (mReferrerPolicy != aKey.mReferrerPolicy) {
- return false;
- }
-
{
bool eq;
if (NS_FAILED(mURI->Equals(aKey.mURI, &eq)) || !eq) {
@@ -75,10 +67,26 @@ bool ScriptHashKey::KeyEquals(const ScriptHashKey& aKey) const {
return false;
}
+ // NOTE: mLoaderPrincipal is only for the SharedSubResourceCache logic,
+ // not for comparison here.
+
+ if (mKind != aKey.mKind) {
+ return false;
+ }
+
if (mCORSMode != aKey.mCORSMode) {
return false;
}
+ if (mReferrerPolicy != aKey.mReferrerPolicy) {
+ return false;
+ }
+
+ if (!mSRIMetadata.CanTrustBeDelegatedTo(aKey.mSRIMetadata) ||
+ !aKey.mSRIMetadata.CanTrustBeDelegatedTo(mSRIMetadata)) {
+ return false;
+ }
+
if (mNonce != aKey.mNonce) {
return false;
}
@@ -90,11 +98,6 @@ bool ScriptHashKey::KeyEquals(const ScriptHashKey& aKey) const {
}
}
- if (!mSRIMetadata.CanTrustBeDelegatedTo(aKey.mSRIMetadata) ||
- !aKey.mSRIMetadata.CanTrustBeDelegatedTo(mSRIMetadata)) {
- return false;
- }
-
return true;
}
diff --git a/dom/script/SharedScriptCache.h b/dom/script/SharedScriptCache.h
@@ -39,12 +39,12 @@ class ScriptHashKey : public PLDHashEntryHdr {
explicit ScriptHashKey(const ScriptHashKey& aKey)
: PLDHashEntryHdr(),
+ mURI(aKey.mURI),
+ mPartitionPrincipal(aKey.mPartitionPrincipal),
+ mLoaderPrincipal(aKey.mLoaderPrincipal),
mKind(aKey.mKind),
mCORSMode(aKey.mCORSMode),
mReferrerPolicy(aKey.mReferrerPolicy),
- mURI(aKey.mURI),
- mLoaderPrincipal(aKey.mLoaderPrincipal),
- mPartitionPrincipal(aKey.mPartitionPrincipal),
mSRIMetadata(aKey.mSRIMetadata),
mNonce(aKey.mNonce),
mHintCharset(aKey.mHintCharset) {
@@ -55,12 +55,12 @@ class ScriptHashKey : public PLDHashEntryHdr {
ScriptHashKey(ScriptHashKey&& aKey)
: PLDHashEntryHdr(),
+ mURI(std::move(aKey.mURI)),
+ mPartitionPrincipal(std::move(aKey.mPartitionPrincipal)),
+ mLoaderPrincipal(std::move(aKey.mLoaderPrincipal)),
mKind(std::move(aKey.mKind)),
mCORSMode(std::move(aKey.mCORSMode)),
mReferrerPolicy(std::move(aKey.mReferrerPolicy)),
- mURI(std::move(aKey.mURI)),
- mLoaderPrincipal(std::move(aKey.mLoaderPrincipal)),
- mPartitionPrincipal(std::move(aKey.mPartitionPrincipal)),
mSRIMetadata(std::move(aKey.mSRIMetadata)),
mNonce(std::move(aKey.mNonce)),
mHintCharset(std::move(aKey.mHintCharset)) {
@@ -101,13 +101,26 @@ class ScriptHashKey : public PLDHashEntryHdr {
enum { ALLOW_MEMMOVE = true };
protected:
+ // Order the fields from the most important one as much as possible, while
+ // packing them, in order to use the same order between the definition and
+ // the KeyEquals implementation.
+
+ // The script's URI. This should distinguish the cache entry in most case.
+ const nsCOMPtr<nsIURI> mURI;
+
+ // If single content process has multiple principals, mPartitionPrincipal
+ // should distinguish them.
+ const nsCOMPtr<nsIPrincipal> mPartitionPrincipal;
+
+ // NOTE: mLoaderPrincipal is only for SharedSubResourceCache logic,
+ // and not part of KeyEquals.
+ const nsCOMPtr<nsIPrincipal> mLoaderPrincipal;
+
+ // Other fields should be unique per each script in general.
const JS::loader::ScriptKind mKind;
const CORSMode mCORSMode;
const mozilla::dom::ReferrerPolicy mReferrerPolicy;
- const nsCOMPtr<nsIURI> mURI;
- const nsCOMPtr<nsIPrincipal> mLoaderPrincipal;
- const nsCOMPtr<nsIPrincipal> mPartitionPrincipal;
const SRIMetadata mSRIMetadata;
const nsString mNonce;