Bug 1804093 - Part 2: Remove some values cached from nsIPrincipal from WorkerLoadInfo, r=asuth
Differential Revision: https://phabricator.services.mozilla.com/D163853
This commit is contained in:
@@ -157,9 +157,7 @@ already_AddRefed<BroadcastChannel> BroadcastChannel::Constructor(
|
||||
RefPtr<BroadcastChannel> bc =
|
||||
new BroadcastChannel(global, aChannel, portUUID);
|
||||
|
||||
nsAutoCString origin;
|
||||
nsAutoString originNoSuffix;
|
||||
PrincipalInfo storagePrincipalInfo;
|
||||
nsCOMPtr<nsIPrincipal> storagePrincipal;
|
||||
|
||||
StorageAccess storageAccess;
|
||||
|
||||
@@ -184,29 +182,11 @@ already_AddRefed<BroadcastChannel> BroadcastChannel::Constructor(
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
nsIPrincipal* storagePrincipal = sop->GetEffectiveStoragePrincipal();
|
||||
storagePrincipal = sop->GetEffectiveStoragePrincipal();
|
||||
if (!storagePrincipal) {
|
||||
aRv.Throw(NS_ERROR_UNEXPECTED);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
aRv = storagePrincipal->GetOrigin(origin);
|
||||
if (NS_WARN_IF(aRv.Failed())) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
nsAutoCString originNoSuffix8;
|
||||
aRv = storagePrincipal->GetAsciiOrigin(originNoSuffix8);
|
||||
if (NS_WARN_IF(aRv.Failed())) {
|
||||
return nullptr;
|
||||
}
|
||||
CopyUTF8toUTF16(originNoSuffix8, originNoSuffix);
|
||||
|
||||
aRv = PrincipalToPrincipalInfo(storagePrincipal, &storagePrincipalInfo);
|
||||
if (NS_WARN_IF(aRv.Failed())) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
storageAccess = StorageAllowedForWindow(window);
|
||||
|
||||
Document* doc = window->GetExtantDoc();
|
||||
@@ -229,10 +209,8 @@ already_AddRefed<BroadcastChannel> BroadcastChannel::Constructor(
|
||||
}
|
||||
|
||||
storageAccess = workerPrivate->StorageAccess();
|
||||
storagePrincipalInfo = workerPrivate->GetEffectiveStoragePrincipalInfo();
|
||||
origin = workerPrivate->EffectiveStoragePrincipalOrigin();
|
||||
|
||||
originNoSuffix = workerPrivate->GetLocationInfo().mOrigin;
|
||||
storagePrincipal = workerPrivate->GetEffectiveStoragePrincipal();
|
||||
|
||||
bc->mWorkerRef = workerRef;
|
||||
|
||||
@@ -240,7 +218,7 @@ already_AddRefed<BroadcastChannel> BroadcastChannel::Constructor(
|
||||
}
|
||||
|
||||
// We want to allow opaque origins.
|
||||
if (storagePrincipalInfo.type() != PrincipalInfo::TNullPrincipalInfo &&
|
||||
if (!storagePrincipal->GetIsNullPrincipal() &&
|
||||
(storageAccess == StorageAccess::eDeny ||
|
||||
(ShouldPartitionStorage(storageAccess) &&
|
||||
!StoragePartitioningEnabled(storageAccess, cjs)))) {
|
||||
@@ -256,6 +234,24 @@ already_AddRefed<BroadcastChannel> BroadcastChannel::Constructor(
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
nsAutoCString origin;
|
||||
aRv = storagePrincipal->GetOrigin(origin);
|
||||
if (NS_WARN_IF(aRv.Failed())) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
nsString originForEvents;
|
||||
aRv = nsContentUtils::GetUTFOrigin(storagePrincipal, originForEvents);
|
||||
if (NS_WARN_IF(aRv.Failed())) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
PrincipalInfo storagePrincipalInfo;
|
||||
aRv = PrincipalToPrincipalInfo(storagePrincipal, &storagePrincipalInfo);
|
||||
if (NS_WARN_IF(aRv.Failed())) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
PBroadcastChannelChild* actor = actorChild->SendPBroadcastChannelConstructor(
|
||||
storagePrincipalInfo, origin, nsString(aChannel));
|
||||
|
||||
@@ -263,7 +259,7 @@ already_AddRefed<BroadcastChannel> BroadcastChannel::Constructor(
|
||||
MOZ_ASSERT(bc->mActor);
|
||||
|
||||
bc->mActor->SetParent(bc);
|
||||
bc->mOriginForEvents = originNoSuffix;
|
||||
bc->mOriginForEvents = std::move(originForEvents);
|
||||
|
||||
return bc.forget();
|
||||
}
|
||||
|
||||
@@ -88,15 +88,12 @@ WorkerLoadInfoData::WorkerLoadInfoData()
|
||||
: mLoadFlags(nsIRequest::LOAD_NORMAL),
|
||||
mWindowID(UINT64_MAX),
|
||||
mReferrerInfo(new ReferrerInfo(nullptr)),
|
||||
mPrincipalHashValue(0),
|
||||
mFromWindow(false),
|
||||
mEvalAllowed(false),
|
||||
mReportEvalCSPViolations(false),
|
||||
mWasmEvalAllowed(false),
|
||||
mReportWasmEvalCSPViolations(false),
|
||||
mXHRParamsAllowed(false),
|
||||
mPrincipalIsSystem(false),
|
||||
mPrincipalIsAddonOrExpandedAddon(false),
|
||||
mWatchedByDevTools(false),
|
||||
mStorageAccess(StorageAccess::eDeny),
|
||||
mUseRegularPrincipal(false),
|
||||
@@ -114,9 +111,6 @@ nsresult WorkerLoadInfo::SetPrincipalsAndCSPOnMainThread(
|
||||
|
||||
mPrincipal = aPrincipal;
|
||||
mPartitionedPrincipal = aPartitionedPrincipal;
|
||||
mPrincipalIsSystem = aPrincipal->IsSystemPrincipal();
|
||||
mPrincipalIsAddonOrExpandedAddon =
|
||||
aPrincipal->GetIsAddonOrExpandedAddonPrincipal();
|
||||
|
||||
mCSP = aCsp;
|
||||
|
||||
@@ -145,26 +139,14 @@ nsresult WorkerLoadInfo::SetPrincipalsAndCSPOnMainThread(
|
||||
nsresult rv = PrincipalToPrincipalInfo(aPrincipal, mPrincipalInfo.get());
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
rv = nsContentUtils::GetUTFOrigin(aPrincipal, mOriginNoSuffix);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
rv = aPrincipal->GetOrigin(mOrigin);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
if (aPrincipal->Equals(aPartitionedPrincipal)) {
|
||||
*mPartitionedPrincipalInfo = *mPrincipalInfo;
|
||||
mPartitionedOrigin = mOrigin;
|
||||
} else {
|
||||
mPartitionedPrincipalInfo = MakeUnique<PrincipalInfo>();
|
||||
rv = PrincipalToPrincipalInfo(aPartitionedPrincipal,
|
||||
mPartitionedPrincipalInfo.get());
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
rv = aPartitionedPrincipal->GetOrigin(mPartitionedOrigin);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
}
|
||||
|
||||
mPrincipalHashValue = aPrincipal->GetHashValue();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
@@ -109,11 +109,6 @@ struct WorkerLoadInfoData {
|
||||
UniquePtr<mozilla::ipc::PrincipalInfo> mPrincipalInfo;
|
||||
UniquePtr<mozilla::ipc::PrincipalInfo> mPartitionedPrincipalInfo;
|
||||
nsCString mDomain;
|
||||
nsString mOriginNoSuffix; // Derived from mPrincipal; can be used on worker
|
||||
// thread.
|
||||
nsCString mOrigin; // Derived from mPrincipal; can be used on worker thread.
|
||||
nsCString mPartitionedOrigin; // Derived from mPartitionedPrincipal; can be
|
||||
// used on worker thread.
|
||||
|
||||
nsString mServiceWorkerCacheName;
|
||||
Maybe<ServiceWorkerDescriptor> mServiceWorkerDescriptor;
|
||||
@@ -130,7 +125,6 @@ struct WorkerLoadInfoData {
|
||||
uint64_t mWindowID;
|
||||
|
||||
nsCOMPtr<nsIReferrerInfo> mReferrerInfo;
|
||||
uint32_t mPrincipalHashValue;
|
||||
OriginTrials mTrials;
|
||||
bool mFromWindow;
|
||||
bool mEvalAllowed;
|
||||
@@ -138,8 +132,6 @@ struct WorkerLoadInfoData {
|
||||
bool mWasmEvalAllowed;
|
||||
bool mReportWasmEvalCSPViolations;
|
||||
bool mXHRParamsAllowed;
|
||||
bool mPrincipalIsSystem;
|
||||
bool mPrincipalIsAddonOrExpandedAddon;
|
||||
bool mWatchedByDevTools;
|
||||
StorageAccess mStorageAccess;
|
||||
bool mUseRegularPrincipal;
|
||||
|
||||
@@ -2259,7 +2259,7 @@ bool IsNewWorkerSecureContext(const WorkerPrivate* const aParent,
|
||||
|
||||
// Our secure context state depends on the kind of worker we have.
|
||||
|
||||
if (aLoadInfo.mPrincipalIsSystem) {
|
||||
if (aLoadInfo.mPrincipal && aLoadInfo.mPrincipal->IsSystemPrincipal()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -2774,8 +2774,6 @@ nsresult WorkerPrivate::GetLoadInfo(JSContext* aCx, nsPIDOMWindowInner* aWindow,
|
||||
if (isChrome) {
|
||||
rv = ssm->GetSystemPrincipal(getter_AddRefs(loadInfo.mLoadingPrincipal));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
loadInfo.mPrincipalIsSystem = true;
|
||||
}
|
||||
|
||||
// See if we're being called from a window.
|
||||
@@ -5711,6 +5709,16 @@ void WorkerPrivate::EnsureOwnerEmbedderPolicy() {
|
||||
}
|
||||
}
|
||||
|
||||
nsIPrincipal* WorkerPrivate::GetEffectiveStoragePrincipal() const {
|
||||
AssertIsOnWorkerThread();
|
||||
|
||||
if (mLoadInfo.mUseRegularPrincipal) {
|
||||
return mLoadInfo.mPrincipal;
|
||||
}
|
||||
|
||||
return mLoadInfo.mPartitionedPrincipal;
|
||||
}
|
||||
|
||||
const mozilla::ipc::PrincipalInfo&
|
||||
WorkerPrivate::GetEffectiveStoragePrincipalInfo() const {
|
||||
AssertIsOnWorkerThread();
|
||||
@@ -5722,16 +5730,6 @@ WorkerPrivate::GetEffectiveStoragePrincipalInfo() const {
|
||||
return *mLoadInfo.mPartitionedPrincipalInfo;
|
||||
}
|
||||
|
||||
const nsACString& WorkerPrivate::EffectiveStoragePrincipalOrigin() const {
|
||||
AssertIsOnWorkerThread();
|
||||
|
||||
if (mLoadInfo.mUseRegularPrincipal) {
|
||||
return mLoadInfo.mOrigin;
|
||||
}
|
||||
|
||||
return mLoadInfo.mPartitionedOrigin;
|
||||
}
|
||||
|
||||
NS_IMPL_ADDREF(WorkerPrivate::EventTarget)
|
||||
NS_IMPL_RELEASE(WorkerPrivate::EventTarget)
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
#include "js/ContextOptions.h"
|
||||
#include "mozilla/Attributes.h"
|
||||
#include "mozilla/AutoRestore.h"
|
||||
#include "mozilla/BasePrincipal.h"
|
||||
#include "mozilla/CondVar.h"
|
||||
#include "mozilla/DOMEventTargetHelper.h"
|
||||
#include "mozilla/Maybe.h"
|
||||
@@ -747,20 +748,18 @@ class WorkerPrivate final
|
||||
return mLoadInfo.mPartitionedPrincipal;
|
||||
}
|
||||
|
||||
const nsAString& OriginNoSuffix() const { return mLoadInfo.mOriginNoSuffix; }
|
||||
|
||||
const nsACString& Origin() const { return mLoadInfo.mOrigin; }
|
||||
|
||||
const nsACString& EffectiveStoragePrincipalOrigin() const;
|
||||
nsIPrincipal* GetEffectiveStoragePrincipal() const;
|
||||
|
||||
nsILoadGroup* GetLoadGroup() const {
|
||||
AssertIsOnMainThread();
|
||||
return mLoadInfo.mLoadGroup;
|
||||
}
|
||||
|
||||
bool UsesSystemPrincipal() const { return mLoadInfo.mPrincipalIsSystem; }
|
||||
bool UsesSystemPrincipal() const {
|
||||
return GetPrincipal()->IsSystemPrincipal();
|
||||
}
|
||||
bool UsesAddonOrExpandedAddonPrincipal() const {
|
||||
return mLoadInfo.mPrincipalIsAddonOrExpandedAddon;
|
||||
return GetPrincipal()->GetIsAddonOrExpandedAddonPrincipal();
|
||||
}
|
||||
|
||||
const mozilla::ipc::PrincipalInfo& GetPrincipalInfo() const {
|
||||
@@ -772,7 +771,7 @@ class WorkerPrivate final
|
||||
}
|
||||
|
||||
uint32_t GetPrincipalHashValue() const {
|
||||
return mLoadInfo.mPrincipalHashValue;
|
||||
return GetPrincipal()->GetHashValue();
|
||||
}
|
||||
|
||||
const mozilla::ipc::PrincipalInfo& GetEffectiveStoragePrincipalInfo() const;
|
||||
|
||||
@@ -664,7 +664,7 @@ int32_t WorkerGlobalScope::SetTimeoutOrInterval(JSContext* aCx,
|
||||
|
||||
void WorkerGlobalScope::GetOrigin(nsAString& aOrigin) const {
|
||||
AssertIsOnWorkerThread();
|
||||
aOrigin = mWorkerPrivate->OriginNoSuffix();
|
||||
nsContentUtils::GetUTFOrigin(mWorkerPrivate->GetPrincipal(), aOrigin);
|
||||
}
|
||||
|
||||
bool WorkerGlobalScope::CrossOriginIsolated() const {
|
||||
|
||||
Reference in New Issue
Block a user