Bug 1340710 - Part 6: Store BasePrincipal::{mOriginNoSuffix,mOriginSuffix} as a pair of atoms; r=bholley

This has the nice side effect of making nsIPrincipal::GetOrigin() a bit faster
by avoiding computing the origin each time.
This commit is contained in:
Ehsan Akhgari 2017-02-24 17:02:24 -05:00
Родитель 5a95757626
Коммит 3169d6c35c
12 изменённых файлов: 80 добавлений и 18 удалений

Просмотреть файл

@ -297,11 +297,12 @@ BasePrincipal::~BasePrincipal()
NS_IMETHODIMP
BasePrincipal::GetOrigin(nsACString& aOrigin)
{
nsresult rv = GetOriginInternal(aOrigin);
nsresult rv = GetOriginNoSuffix(aOrigin);
NS_ENSURE_SUCCESS(rv, rv);
nsAutoCString suffix;
mOriginAttributes.CreateSuffix(suffix);
rv = GetOriginSuffix(suffix);
NS_ENSURE_SUCCESS(rv, rv);
aOrigin.Append(suffix);
return NS_OK;
}
@ -309,6 +310,9 @@ BasePrincipal::GetOrigin(nsACString& aOrigin)
NS_IMETHODIMP
BasePrincipal::GetOriginNoSuffix(nsACString& aOrigin)
{
if (mOriginNoSuffix) {
return mOriginNoSuffix->ToUTF8String(aOrigin);
}
return GetOriginInternal(aOrigin);
}
@ -532,8 +536,8 @@ BasePrincipal::GetOriginAttributes(JSContext* aCx, JS::MutableHandle<JS::Value>
NS_IMETHODIMP
BasePrincipal::GetOriginSuffix(nsACString& aOriginAttributes)
{
mOriginAttributes.CreateSuffix(aOriginAttributes);
return NS_OK;
MOZ_ASSERT(mOriginSuffix);
return mOriginSuffix->ToUTF8String(aOriginAttributes);
}
NS_IMETHODIMP
@ -694,4 +698,25 @@ BasePrincipal::AddonAllowsLoad(nsIURI* aURI, bool aExplicit /* = false */)
return NS_SUCCEEDED(rv) && allowed;
}
void
BasePrincipal::FinishInit()
{
// First compute the origin suffix since it's infallible.
nsAutoCString originSuffix;
mOriginAttributes.CreateSuffix(originSuffix);
mOriginSuffix = NS_Atomize(originSuffix);
// Then compute the origin without the suffix.
nsAutoCString originNoSuffix;
nsresult rv = GetOriginInternal(originNoSuffix);
if (NS_FAILED(rv)) {
// If GetOriginInternal fails, we will get a null atom for mOriginNoSuffix,
// which we deal with anywhere mOriginNoSuffix is used.
// Once this is made infallible we can remove those null checks.
mOriginNoSuffix = nullptr;
return;
}
mOriginNoSuffix = NS_Atomize(originNoSuffix);
}
} // namespace mozilla

Просмотреть файл

@ -279,8 +279,15 @@ protected:
virtual bool MayLoadInternal(nsIURI* aURI) = 0;
friend class ::nsExpandedPrincipal;
// 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();
nsCOMPtr<nsIContentSecurityPolicy> mCSP;
nsCOMPtr<nsIContentSecurityPolicy> mPreloadCSP;
nsCOMPtr<nsIAtom> mOriginNoSuffix;
nsCOMPtr<nsIAtom> mOriginSuffix;
OriginAttributes mOriginAttributes;
PrincipalKind mKind;
};

Просмотреть файл

@ -59,6 +59,15 @@ nsExpandedPrincipal::nsExpandedPrincipal(nsTArray<nsCOMPtr<nsIPrincipal>> &aWhit
nsExpandedPrincipal::~nsExpandedPrincipal()
{ }
already_AddRefed<nsExpandedPrincipal>
nsExpandedPrincipal::Create(nsTArray<nsCOMPtr<nsIPrincipal>>& aWhiteList,
const OriginAttributes& aAttrs)
{
RefPtr<nsExpandedPrincipal> ep = new nsExpandedPrincipal(aWhiteList, aAttrs);
ep->FinishInit();
return ep.forget();
}
NS_IMETHODIMP
nsExpandedPrincipal::GetDomain(nsIURI** aDomain)
{

Просмотреть файл

@ -15,10 +15,14 @@
class nsExpandedPrincipal : public nsIExpandedPrincipal
, public mozilla::BasePrincipal
{
public:
nsExpandedPrincipal(nsTArray<nsCOMPtr<nsIPrincipal>> &aWhiteList,
const mozilla::OriginAttributes& aAttrs);
public:
static already_AddRefed<nsExpandedPrincipal>
Create(nsTArray<nsCOMPtr<nsIPrincipal>>& aWhiteList,
const mozilla::OriginAttributes& aAttrs);
NS_DECL_NSIEXPANDEDPRINCIPAL
NS_DECL_NSISERIALIZABLE
NS_IMETHOD_(MozExternalRefCountType) AddRef() override { return nsJSPrincipals::AddRef(); };

Просмотреть файл

@ -86,6 +86,8 @@ nsNullPrincipal::Init(const OriginAttributes& aOriginAttributes, nsIURI* aURI)
NS_ENSURE_TRUE(mURI, NS_ERROR_NOT_AVAILABLE);
}
FinishInit();
return NS_OK;
}

Просмотреть файл

@ -117,6 +117,8 @@ nsPrincipal::Init(nsIURI *aCodebase, const OriginAttributes& aOriginAttributes)
mCodebaseImmutable = URIIsImmutable(mCodebase);
mOriginAttributes = aOriginAttributes;
FinishInit();
return NS_OK;
}

Просмотреть файл

@ -1314,7 +1314,7 @@ nsresult nsScriptSecurityManager::Init()
NS_ENSURE_SUCCESS(rv, rv);
// Create our system principal singleton
RefPtr<nsSystemPrincipal> system = new nsSystemPrincipal();
RefPtr<nsSystemPrincipal> system = nsSystemPrincipal::Create();
mSystemPrincipal = system;

Просмотреть файл

@ -31,6 +31,14 @@ NS_IMPL_CI_INTERFACE_GETTER(nsSystemPrincipal,
#define SYSTEM_PRINCIPAL_SPEC "[System Principal]"
already_AddRefed<nsSystemPrincipal>
nsSystemPrincipal::Create()
{
RefPtr<nsSystemPrincipal> sp = new nsSystemPrincipal();
sp->FinishInit();
return sp.forget();
}
nsresult
nsSystemPrincipal::GetScriptLocation(nsACString &aStr)
{

Просмотреть файл

@ -22,7 +22,14 @@
class nsSystemPrincipal final : public mozilla::BasePrincipal
{
nsSystemPrincipal()
: BasePrincipal(eSystemPrincipal)
{
}
public:
static already_AddRefed<nsSystemPrincipal> Create();
NS_DECL_NSISERIALIZABLE
NS_IMETHOD QueryInterface(REFNSIID aIID, void** aInstancePtr) override;
NS_IMETHOD GetHashValue(uint32_t* aHashValue) override;
@ -37,11 +44,6 @@ public:
NS_IMETHOD GetAddonId(nsAString& aAddonId) override;
nsresult GetOriginInternal(nsACString& aOrigin) override;
nsSystemPrincipal()
: BasePrincipal(eSystemPrincipal)
{
}
virtual nsresult GetScriptLocation(nsACString &aStr) override;
protected:

Просмотреть файл

@ -112,7 +112,8 @@ PrincipalInfoToPrincipal(const PrincipalInfo& aPrincipalInfo,
whitelist.AppendElement(wlPrincipal);
}
RefPtr<nsExpandedPrincipal> expandedPrincipal = new nsExpandedPrincipal(whitelist, info.attrs());
RefPtr<nsExpandedPrincipal> expandedPrincipal =
nsExpandedPrincipal::Create(whitelist, info.attrs());
if (!expandedPrincipal) {
NS_WARNING("could not instantiate expanded principal");
return nullptr;

Просмотреть файл

@ -1439,8 +1439,8 @@ GetExpandedPrincipal(JSContext* cx, HandleObject arrayObj,
}
}
nsCOMPtr<nsIExpandedPrincipal> result =
new nsExpandedPrincipal(allowedDomains, attrs.ref());
RefPtr<nsExpandedPrincipal> result =
nsExpandedPrincipal::Create(allowedDomains, attrs.ref());
result.forget(out);
return true;
}

Просмотреть файл

@ -295,13 +295,15 @@ XPCWrappedNativeScope::EnsureContentXBLScope(JSContext* cx)
MOZ_ASSERT(!nsContentUtils::IsExpandedPrincipal(principal));
nsTArray<nsCOMPtr<nsIPrincipal>> principalAsArray(1);
principalAsArray.AppendElement(principal);
nsCOMPtr<nsIExpandedPrincipal> ep =
new nsExpandedPrincipal(principalAsArray,
principal->OriginAttributesRef());
RefPtr<nsExpandedPrincipal> ep =
nsExpandedPrincipal::Create(principalAsArray,
principal->OriginAttributesRef());
// Create the sandbox.
RootedValue v(cx);
nsresult rv = CreateSandboxObject(cx, &v, ep, options);
nsresult rv = CreateSandboxObject(cx, &v,
static_cast<nsIExpandedPrincipal*>(ep),
options);
NS_ENSURE_SUCCESS(rv, nullptr);
mContentXBLScope = &v.toObject();