tor-browser

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

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:
Mdom/script/SharedScriptCache.cpp | 35+++++++++++++++++++----------------
Mdom/script/SharedScriptCache.h | 31++++++++++++++++++++++---------
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;