diff --git a/caps/BasePrincipal.cpp b/caps/BasePrincipal.cpp index be82137413d7..6e3683087fab 100644 --- a/caps/BasePrincipal.cpp +++ b/caps/BasePrincipal.cpp @@ -1618,3 +1618,9 @@ void BasePrincipal::WriteJSONProperty(JSONWriter& aWriter, } } // namespace mozilla + +uint32_t nsIPrincipal::GetHashValue() const { + auto* bp = mozilla::BasePrincipal::Cast(this); + return mozilla::HashGeneric(bp->GetOriginNoSuffixHash(), + bp->GetOriginSuffixHash()); +} diff --git a/caps/ContentPrincipal.cpp b/caps/ContentPrincipal.cpp index e62eedf5de81..cbd5868bcc4d 100644 --- a/caps/ContentPrincipal.cpp +++ b/caps/ContentPrincipal.cpp @@ -308,17 +308,6 @@ bool ContentPrincipal::MayLoadInternal(nsIURI* aURI) { return false; } -uint32_t ContentPrincipal::GetHashValue() { - MOZ_ASSERT(mURI, "Need a principal URI"); - - nsCOMPtr uri; - GetDomain(getter_AddRefs(uri)); - if (!uri) { - GetURI(getter_AddRefs(uri)); - }; - return NS_SecurityHashURI(uri); -} - NS_IMETHODIMP ContentPrincipal::GetDomain(nsIURI** aDomain) { if (!GetHasExplicitDomain()) { diff --git a/caps/ContentPrincipal.h b/caps/ContentPrincipal.h index c87aedce8579..a17fe45aefa2 100644 --- a/caps/ContentPrincipal.h +++ b/caps/ContentPrincipal.h @@ -22,7 +22,6 @@ class JSONWriter; class ContentPrincipal final : public BasePrincipal { public: NS_IMETHOD QueryInterface(REFNSIID aIID, void** aInstancePtr) override; - uint32_t GetHashValue() override; NS_IMETHOD GetURI(nsIURI** aURI) override; NS_IMETHOD GetDomain(nsIURI** aDomain) override; NS_IMETHOD SetDomain(nsIURI* aDomain) override; diff --git a/caps/ExpandedPrincipal.cpp b/caps/ExpandedPrincipal.cpp index 7d65fec61472..c9bcb1278433 100644 --- a/caps/ExpandedPrincipal.cpp +++ b/caps/ExpandedPrincipal.cpp @@ -106,10 +106,6 @@ bool ExpandedPrincipal::MayLoadInternal(nsIURI* uri) { return false; } -uint32_t ExpandedPrincipal::GetHashValue() { - MOZ_CRASH("extended principal should never be used as key in a hash map"); -} - NS_IMETHODIMP ExpandedPrincipal::GetURI(nsIURI** aURI) { *aURI = nullptr; diff --git a/caps/ExpandedPrincipal.h b/caps/ExpandedPrincipal.h index 0981f9df70e9..bee6eaaed046 100644 --- a/caps/ExpandedPrincipal.h +++ b/caps/ExpandedPrincipal.h @@ -37,7 +37,6 @@ class ExpandedPrincipal : public nsIExpandedPrincipal, return nsJSPrincipals::Release(); }; NS_IMETHOD QueryInterface(REFNSIID aIID, void** aInstancePtr) override; - uint32_t GetHashValue() override; NS_IMETHOD GetURI(nsIURI** aURI) override; NS_IMETHOD GetDomain(nsIURI** aDomain) override; NS_IMETHOD SetDomain(nsIURI* aDomain) override; diff --git a/caps/NullPrincipal.cpp b/caps/NullPrincipal.cpp index 1742413d1089..895dc6b9d35c 100644 --- a/caps/NullPrincipal.cpp +++ b/caps/NullPrincipal.cpp @@ -157,8 +157,6 @@ nsresult NullPrincipal::GetScriptLocation(nsACString& aStr) { * nsIPrincipal implementation */ -uint32_t NullPrincipal::GetHashValue() { return (NS_PTR_TO_INT32(this) >> 2); } - NS_IMETHODIMP NullPrincipal::GetURI(nsIURI** aURI) { nsCOMPtr uri = mURI; diff --git a/caps/NullPrincipal.h b/caps/NullPrincipal.h index 170a4e141cc7..e049837042a0 100644 --- a/caps/NullPrincipal.h +++ b/caps/NullPrincipal.h @@ -40,7 +40,6 @@ class NullPrincipal final : public BasePrincipal { static PrincipalKind Kind() { return eNullPrincipal; } NS_IMETHOD QueryInterface(REFNSIID aIID, void** aInstancePtr) override; - uint32_t GetHashValue() override; NS_IMETHOD GetURI(nsIURI** aURI) override; NS_IMETHOD GetIsOriginPotentiallyTrustworthy(bool* aResult) override; NS_IMETHOD GetDomain(nsIURI** aDomain) override; diff --git a/caps/PrincipalHashKey.h b/caps/PrincipalHashKey.h index b5167aa11b98..59ec68f022dc 100644 --- a/caps/PrincipalHashKey.h +++ b/caps/PrincipalHashKey.h @@ -43,8 +43,7 @@ class PrincipalHashKey : public PLDHashEntryHdr { return aKey; } static PLDHashNumber HashKey(const nsIPrincipal* aKey) { - const auto* bp = BasePrincipal::Cast(aKey); - return HashGeneric(bp->GetOriginNoSuffixHash(), bp->GetOriginSuffixHash()); + return aKey->GetHashValue(); } enum { ALLOW_MEMMOVE = true }; diff --git a/caps/SystemPrincipal.cpp b/caps/SystemPrincipal.cpp index 5c2ed63a9aa2..14900410b0df 100644 --- a/caps/SystemPrincipal.cpp +++ b/caps/SystemPrincipal.cpp @@ -65,8 +65,6 @@ nsresult SystemPrincipal::GetScriptLocation(nsACString& aStr) { // Methods implementing nsIPrincipal // /////////////////////////////////////// -uint32_t SystemPrincipal::GetHashValue() { return NS_PTR_TO_INT32(this); } - NS_IMETHODIMP SystemPrincipal::GetURI(nsIURI** aURI) { *aURI = nullptr; diff --git a/caps/SystemPrincipal.h b/caps/SystemPrincipal.h index 25f917ad2498..a5a3f42d2b63 100644 --- a/caps/SystemPrincipal.h +++ b/caps/SystemPrincipal.h @@ -43,7 +43,6 @@ class SystemPrincipal final : public BasePrincipal, public nsISerializable { NS_DECL_NSISERIALIZABLE NS_IMETHOD QueryInterface(REFNSIID aIID, void** aInstancePtr) override; - uint32_t GetHashValue() override; NS_IMETHOD GetURI(nsIURI** aURI) override; NS_IMETHOD GetDomain(nsIURI** aDomain) override; NS_IMETHOD SetDomain(nsIURI* aDomain) override; diff --git a/caps/nsIPrincipal.idl b/caps/nsIPrincipal.idl index b1470a4839cf..c65fcff743f6 100644 --- a/caps/nsIPrincipal.idl +++ b/caps/nsIPrincipal.idl @@ -95,11 +95,16 @@ interface nsIPrincipal : nsISupports boolean equalsURI(in nsIURI aOtherURI); /** - * Returns a hash value for the principal. + * Returns a hash value for the principal. Guaranteed to be equal + * for two principals which are Equals(...). + * + * Implemented in BasePrincipal.cpp. * * May be called from any thread. */ - [notxpcom, nostdcall] readonly attribute unsigned long hashValue; + %{C++ + uint32_t GetHashValue() const; + %} /** * The principal URI to which this principal pertains. This is diff --git a/caps/tests/gtest/TestPrincipalHash.cpp b/caps/tests/gtest/TestPrincipalHash.cpp new file mode 100644 index 000000000000..1ec39705d5cb --- /dev/null +++ b/caps/tests/gtest/TestPrincipalHash.cpp @@ -0,0 +1,27 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#include "gtest/gtest.h" +#include "mozilla/gtest/MozAssertions.h" +#include "nsIPrincipal.h" +#include "nsScriptSecurityManager.h" +#include "nsNetUtil.h" + +TEST(PrincipalHash, DocumentDomain) +{ + nsCOMPtr ssm = + nsScriptSecurityManager::GetScriptSecurityManager(); + nsCOMPtr principal; + nsresult rv = + ssm->CreateContentPrincipalFromOrigin("https://sub.mozilla.org"_ns, getter_AddRefs(principal)); + EXPECT_NS_SUCCEEDED(rv); + + const auto hash = principal->GetHashValue(); + + nsCOMPtr domain; + rv = NS_NewURI(getter_AddRefs(domain), "https://mozilla.org"_ns); + EXPECT_NS_SUCCEEDED(rv); + principal->SetDomain(domain); + + ASSERT_EQ(principal->GetHashValue(), hash) << "Principal hash shouldn't change"; +} diff --git a/caps/tests/gtest/moz.build b/caps/tests/gtest/moz.build index c0e2087fc299..3af30b081751 100644 --- a/caps/tests/gtest/moz.build +++ b/caps/tests/gtest/moz.build @@ -9,6 +9,7 @@ UNIFIED_SOURCES += [ "TestNullPrincipalPrecursor.cpp", "TestOriginAttributes.cpp", "TestPrincipalAttributes.cpp", + "TestPrincipalHash.cpp", "TestPrincipalSerialization.cpp", "TestRedirectChainURITruncation.cpp", "TestScriptSecurityManager.cpp", diff --git a/gfx/thebes/gfxFontSrcPrincipal.cpp b/gfx/thebes/gfxFontSrcPrincipal.cpp index 97ddc5ffe7fd..701ce72722a0 100644 --- a/gfx/thebes/gfxFontSrcPrincipal.cpp +++ b/gfx/thebes/gfxFontSrcPrincipal.cpp @@ -20,12 +20,7 @@ gfxFontSrcPrincipal::gfxFontSrcPrincipal(nsIPrincipal* aNodePrincipal, MOZ_ASSERT(NS_IsMainThread()); MOZ_ASSERT(aNodePrincipal); MOZ_ASSERT(aStoragePrincipal); - - nsAutoCString suffix; - mStoragePrincipal->GetOriginSuffix(suffix); - - mHash = mozilla::AddToHash(mStoragePrincipal->GetHashValue(), - mozilla::HashString(suffix)); + mHash = mStoragePrincipal->GetHashValue(); } gfxFontSrcPrincipal::~gfxFontSrcPrincipal() = default;