diff --git a/caps/BasePrincipal.cpp b/caps/BasePrincipal.cpp index 0847a45d8843..a0684ecec2e8 100644 --- a/caps/BasePrincipal.cpp +++ b/caps/BasePrincipal.cpp @@ -30,7 +30,8 @@ namespace mozilla { BasePrincipal::BasePrincipal(PrincipalKind aKind) : mKind(aKind) - , mDomainSet(false) + , mHasExplicitDomain(false) + , mInitialized(false) {} BasePrincipal::~BasePrincipal() @@ -39,6 +40,8 @@ BasePrincipal::~BasePrincipal() NS_IMETHODIMP BasePrincipal::GetOrigin(nsACString& aOrigin) { + MOZ_ASSERT(mInitialized); + nsresult rv = GetOriginNoSuffix(aOrigin); NS_ENSURE_SUCCESS(rv, rv); @@ -52,6 +55,8 @@ BasePrincipal::GetOrigin(nsACString& aOrigin) NS_IMETHODIMP BasePrincipal::GetOriginNoSuffix(nsACString& aOrigin) { + MOZ_ASSERT(mInitialized); + if (mOriginNoSuffix) { return mOriginNoSuffix->ToUTF8String(aOrigin); } @@ -456,8 +461,11 @@ BasePrincipal::AddonAllowsLoad(nsIURI* aURI, bool aExplicit /* = false */) } void -BasePrincipal::FinishInit() +BasePrincipal::FinishInit(const OriginAttributes& aOriginAttributes) { + mInitialized = true; + mOriginAttributes = aOriginAttributes; + // First compute the origin suffix since it's infallible. nsAutoCString originSuffix; mOriginAttributes.CreateSuffix(originSuffix); diff --git a/caps/BasePrincipal.h b/caps/BasePrincipal.h index 2108e4490c3f..2c756521354e 100644 --- a/caps/BasePrincipal.h +++ b/caps/BasePrincipal.h @@ -115,18 +115,27 @@ protected: virtual bool MayLoadInternal(nsIURI* aURI) = 0; friend class ::ExpandedPrincipal; + void + SetHasExplicitDomain() + { + mHasExplicitDomain = true; + } + // This function should be called as the last step of the initialization of the // principal objects. It's typically called as the last step from the Init() // method of the child classes. - void FinishInit(); + void FinishInit(const OriginAttributes& aOriginAttributes); nsCOMPtr mCSP; nsCOMPtr mPreloadCSP; nsCOMPtr mOriginNoSuffix; nsCOMPtr mOriginSuffix; + +private: OriginAttributes mOriginAttributes; PrincipalKind mKind; - bool mDomainSet; + bool mHasExplicitDomain; + bool mInitialized; }; inline bool @@ -169,7 +178,7 @@ BasePrincipal::FastEqualsConsideringDomain(nsIPrincipal* aOther) // If neither of the principals have document.domain set, we use the fast path // in Equals(). Otherwise, we fall back to the slow path below. auto other = Cast(aOther); - if (!mDomainSet && !other->mDomainSet) { + if (!mHasExplicitDomain && !other->mHasExplicitDomain) { return FastEquals(aOther); } @@ -205,7 +214,7 @@ BasePrincipal::FastSubsumesConsideringDomain(nsIPrincipal* aOther) // If neither of the principals have document.domain set, we hand off to // FastSubsumes() which has fast paths for some special cases. Otherwise, we fall // back to the slow path below. - if (!mDomainSet && !Cast(aOther)->mDomainSet) { + if (!mHasExplicitDomain && !Cast(aOther)->mHasExplicitDomain) { return FastSubsumes(aOther); } diff --git a/caps/ContentPrincipal.cpp b/caps/ContentPrincipal.cpp index 51447d46c85a..bd2cca8b7c9e 100644 --- a/caps/ContentPrincipal.cpp +++ b/caps/ContentPrincipal.cpp @@ -82,7 +82,6 @@ ContentPrincipal::ContentPrincipal() : BasePrincipal(eCodebasePrincipal) , mCodebaseImmutable(false) , mDomainImmutable(false) - , mInitialized(false) { } @@ -98,11 +97,8 @@ nsresult ContentPrincipal::Init(nsIURI *aCodebase, const OriginAttributes& aOriginAttributes) { - NS_ENSURE_STATE(!mInitialized); NS_ENSURE_ARG(aCodebase); - mInitialized = true; - // Assert that the URI we get here isn't any of the schemes that we know we // should not get here. These schemes always either inherit their principal // or fall back to a null principal. These are schemes which return @@ -118,9 +114,8 @@ ContentPrincipal::Init(nsIURI *aCodebase, mCodebase = NS_TryToMakeImmutable(aCodebase); mCodebaseImmutable = URIIsImmutable(mCodebase); - mOriginAttributes = aOriginAttributes; - FinishInit(); + FinishInit(aOriginAttributes); return NS_OK; } @@ -372,7 +367,7 @@ ContentPrincipal::SetDomain(nsIURI* aDomain) { mDomain = NS_TryToMakeImmutable(aDomain); mDomainImmutable = URIIsImmutable(mDomain); - mDomainSet = true; + SetHasExplicitDomain(); // Recompute all wrappers between compartments using this principal and other // non-chrome compartments. diff --git a/caps/ContentPrincipal.h b/caps/ContentPrincipal.h index 2e3be1cf7e94..a52445fa8567 100644 --- a/caps/ContentPrincipal.h +++ b/caps/ContentPrincipal.h @@ -47,7 +47,6 @@ public: // If mCodebaseImmutable is true, mCodebase is non-null and immutable bool mCodebaseImmutable; bool mDomainImmutable; - bool mInitialized; protected: virtual ~ContentPrincipal(); diff --git a/caps/ExpandedPrincipal.cpp b/caps/ExpandedPrincipal.cpp index 5b186684ee6d..3257b5f23359 100644 --- a/caps/ExpandedPrincipal.cpp +++ b/caps/ExpandedPrincipal.cpp @@ -43,8 +43,7 @@ struct OriginComparator } }; -ExpandedPrincipal::ExpandedPrincipal(nsTArray> &aWhiteList, - const OriginAttributes& aAttrs) +ExpandedPrincipal::ExpandedPrincipal(nsTArray> &aWhiteList) : BasePrincipal(eExpandedPrincipal) { // We force the principals to be sorted by origin so that ExpandedPrincipal @@ -53,7 +52,6 @@ ExpandedPrincipal::ExpandedPrincipal(nsTArray> &aWhiteLis for (size_t i = 0; i < aWhiteList.Length(); ++i) { mPrincipals.InsertElementSorted(aWhiteList[i], c); } - mOriginAttributes = aAttrs; } ExpandedPrincipal::~ExpandedPrincipal() @@ -63,8 +61,8 @@ already_AddRefed ExpandedPrincipal::Create(nsTArray>& aWhiteList, const OriginAttributes& aAttrs) { - RefPtr ep = new ExpandedPrincipal(aWhiteList, aAttrs); - ep->FinishInit(); + RefPtr ep = new ExpandedPrincipal(aWhiteList); + ep->FinishInit(aAttrs); return ep.forget(); } diff --git a/caps/ExpandedPrincipal.h b/caps/ExpandedPrincipal.h index 416f0ea80f45..c296326224fc 100644 --- a/caps/ExpandedPrincipal.h +++ b/caps/ExpandedPrincipal.h @@ -15,9 +15,6 @@ class ExpandedPrincipal : public nsIExpandedPrincipal , public mozilla::BasePrincipal { - ExpandedPrincipal(nsTArray> &aWhiteList, - const mozilla::OriginAttributes& aAttrs); - public: static already_AddRefed Create(nsTArray>& aWhiteList, @@ -40,6 +37,8 @@ public: nsresult GetOriginNoSuffixInternal(nsACString& aOrigin) override; protected: + explicit ExpandedPrincipal(nsTArray> &aWhiteList); + virtual ~ExpandedPrincipal(); bool SubsumesInternal(nsIPrincipal* aOther, diff --git a/caps/NullPrincipal.cpp b/caps/NullPrincipal.cpp index 4db8fd7110a0..4b1395c4e9bf 100644 --- a/caps/NullPrincipal.cpp +++ b/caps/NullPrincipal.cpp @@ -70,8 +70,6 @@ NullPrincipal::Create(const OriginAttributes& aOriginAttributes, nsIURI* aURI) nsresult NullPrincipal::Init(const OriginAttributes& aOriginAttributes, nsIURI* aURI) { - mOriginAttributes = aOriginAttributes; - if (aURI) { nsAutoCString scheme; nsresult rv = aURI->GetScheme(scheme); @@ -86,7 +84,7 @@ NullPrincipal::Init(const OriginAttributes& aOriginAttributes, nsIURI* aURI) NS_ENSURE_TRUE(mURI, NS_ERROR_NOT_AVAILABLE); } - FinishInit(); + FinishInit(aOriginAttributes); return NS_OK; } diff --git a/caps/SystemPrincipal.cpp b/caps/SystemPrincipal.cpp index 72aff5306f52..8bd14fd890e7 100644 --- a/caps/SystemPrincipal.cpp +++ b/caps/SystemPrincipal.cpp @@ -35,7 +35,7 @@ already_AddRefed SystemPrincipal::Create() { RefPtr sp = new SystemPrincipal(); - sp->FinishInit(); + sp->FinishInit(OriginAttributes()); return sp.forget(); }