Bug 1931513 - QM: Change group initialization related methods to take PrincipalMetadata instead of PrincipalInfo; r=dom-storage-reviewers,jari

Differential Revision: https://phabricator.services.mozilla.com/D229645
This commit is contained in:
Jan Varga
2024-12-07 06:59:18 +00:00
parent bcd1ef4277
commit bbe6b61b43
6 changed files with 51 additions and 119 deletions

View File

@@ -5379,12 +5379,6 @@ RefPtr<ClientDirectoryLockPromise> QuotaManager::OpenClientDirectory(
const auto persistenceType = aClientMetadata.mPersistenceType;
QM_TRY_UNWRAP(
auto principalInfo, PrincipalMetadataToPrincipalInfo(aClientMetadata),
[](StaticString aFunc, const nsresult aRv) {
return ClientDirectoryLockPromise::CreateAndReject(aRv, aFunc);
});
nsTArray<RefPtr<BoolPromise>> promises;
// Directory locks for specific initializations can be null, indicating that
@@ -5410,7 +5404,7 @@ RefPtr<ClientDirectoryLockPromise> QuotaManager::OpenClientDirectory(
IsDirectoryLockBlockedByUninitStorageOperation,
MakeBackInserter(promises));
const bool groupInitialized = IsTemporaryGroupInitialized(principalInfo);
const bool groupInitialized = IsTemporaryGroupInitialized(aClientMetadata);
groupDirectoryLock = CreateDirectoryLockForInitialization(
*this,
@@ -5463,11 +5457,11 @@ RefPtr<ClientDirectoryLockPromise> QuotaManager::OpenClientDirectory(
&QuotaManager::InitializeTemporaryStorage))
->Then(GetCurrentSerialEventTarget(), __func__,
MaybeInitialize(std::move(groupDirectoryLock),
[self = RefPtr(this), principalInfo](
[self = RefPtr(this), aClientMetadata](
RefPtr<UniversalDirectoryLock>
groupDirectoryLock) mutable {
return self->InitializeTemporaryGroup(
principalInfo,
aClientMetadata,
std::move(groupDirectoryLock));
}))
->Then(GetCurrentSerialEventTarget(), __func__,
@@ -5656,17 +5650,13 @@ nsresult QuotaManager::EnsurePersistentStorageIsInitializedInternal() {
}
RefPtr<BoolPromise> QuotaManager::InitializeTemporaryGroup(
const PrincipalInfo& aPrincipalInfo) {
const PrincipalMetadata& aPrincipalMetadata) {
AssertIsOnOwningThread();
QM_TRY_UNWRAP(PrincipalMetadata principalMetadata,
GetInfoFromValidatedPrincipalInfo(*this, aPrincipalInfo),
CreateAndRejectBoolPromise);
RefPtr<UniversalDirectoryLock> directoryLock = CreateDirectoryLockInternal(
PersistenceScope::CreateFromSet(PERSISTENCE_TYPE_TEMPORARY,
PERSISTENCE_TYPE_DEFAULT),
OriginScope::FromGroup(principalMetadata.mGroup),
OriginScope::FromGroup(aPrincipalMetadata.mGroup),
Nullable<Client::Type>(),
/* aExclusive */ false);
@@ -5676,27 +5666,27 @@ RefPtr<BoolPromise> QuotaManager::InitializeTemporaryGroup(
// storage operation already scheduled, we can't immediately resolve the
// promise and return from the function because the clear and shutdown
// storage operation uninitializes storage.
if (IsTemporaryGroupInitialized(aPrincipalInfo) &&
if (IsTemporaryGroupInitialized(aPrincipalMetadata) &&
!IsDirectoryLockBlockedByUninitStorageOperation(prepareInfo)) {
return BoolPromise::CreateAndResolve(true, __func__);
}
return directoryLock->Acquire(std::move(prepareInfo))
->Then(GetCurrentSerialEventTarget(), __func__,
[self = RefPtr(this), aPrincipalInfo, directoryLock](
[self = RefPtr(this), aPrincipalMetadata, directoryLock](
const BoolPromise::ResolveOrRejectValue& aValue) mutable {
if (aValue.IsReject()) {
return BoolPromise::CreateAndReject(aValue.RejectValue(),
__func__);
}
return self->InitializeTemporaryGroup(aPrincipalInfo,
return self->InitializeTemporaryGroup(aPrincipalMetadata,
std::move(directoryLock));
});
}
RefPtr<BoolPromise> QuotaManager::InitializeTemporaryGroup(
const PrincipalInfo& aPrincipalInfo,
const PrincipalMetadata& aPrincipalMetadata,
RefPtr<UniversalDirectoryLock> aDirectoryLock) {
AssertIsOnOwningThread();
MOZ_ASSERT(aDirectoryLock);
@@ -5707,14 +5697,14 @@ RefPtr<BoolPromise> QuotaManager::InitializeTemporaryGroup(
// resolve the promise and return from the function because there can't be a
// clear storage or shutdown storage operation which would uninitialize
// temporary storage.
if (IsTemporaryGroupInitialized(aPrincipalInfo)) {
if (IsTemporaryGroupInitialized(aPrincipalMetadata)) {
DropDirectoryLock(aDirectoryLock);
return BoolPromise::CreateAndResolve(true, __func__);
}
auto initializeTemporaryGroupOp = CreateInitializeTemporaryGroupOp(
WrapMovingNotNullUnchecked(this), aPrincipalInfo,
WrapMovingNotNullUnchecked(this), aPrincipalMetadata,
std::move(aDirectoryLock));
RegisterNormalOriginOp(*initializeTemporaryGroupOp);
@@ -5723,8 +5713,7 @@ RefPtr<BoolPromise> QuotaManager::InitializeTemporaryGroup(
return Map<BoolPromise>(
initializeTemporaryGroupOp->OnResults(),
[self = RefPtr(this),
group = GetGroupFromValidatedPrincipalInfo(aPrincipalInfo)](
[self = RefPtr(this), group = aPrincipalMetadata.mGroup](
const BoolPromise::ResolveOrRejectValue& aValue) {
self->mBackgroundThreadAccessible.Access()->mInitializedGroups.Insert(
group);
@@ -5748,13 +5737,11 @@ RefPtr<BoolPromise> QuotaManager::TemporaryGroupInitialized(
}
bool QuotaManager::IsTemporaryGroupInitialized(
const PrincipalInfo& aPrincipalInfo) {
const PrincipalMetadata& aPrincipalMetadata) {
AssertIsOnOwningThread();
auto group = GetGroupFromValidatedPrincipalInfo(aPrincipalInfo);
return mBackgroundThreadAccessible.Access()->mInitializedGroups.Contains(
group);
aPrincipalMetadata.mGroup);
}
bool QuotaManager::IsTemporaryGroupInitializedInternal(
@@ -6417,28 +6404,7 @@ RefPtr<BoolPromise> QuotaManager::InitializeAllTemporaryOrigins() {
auto principalMetadata =
backgroundThreadData->mUninitializedGroups.PopLastElement();
// XXX Set a context to see QM_TRY failures in telemetry ?
QM_WARNONLY_TRY_UNWRAP(
auto maybePrincipalInfo,
PrincipalMetadataToPrincipalInfo(principalMetadata));
if (!maybePrincipalInfo) {
// In the error case, processing of next group needs to be invoked
// asynchronously as well to not spam the event queue with group
// initialization too much.
InvokeAsync(GetCurrentSerialEventTarget(), __func__,
[processNextGroupCallback]() {
processNextGroupCallback(processNextGroupCallback);
return BoolPromise::CreateAndResolve(true, __func__);
});
return;
}
self->InitializeTemporaryGroup(*maybePrincipalInfo)
self->InitializeTemporaryGroup(principalMetadata)
->Then(GetCurrentSerialEventTarget(), __func__,
[processNextGroupCallback](
const BoolPromise::ResolveOrRejectValue& aValue) {

View File

@@ -503,20 +503,17 @@ class InitTemporaryStorageOp final
};
class InitializeTemporaryGroupOp final : public ResolvableNormalOriginOp<bool> {
const PrincipalInfo mPrincipalInfo;
PrincipalMetadata mPrincipalMetadata;
const PrincipalMetadata mPrincipalMetadata;
RefPtr<UniversalDirectoryLock> mDirectoryLock;
public:
InitializeTemporaryGroupOp(MovingNotNull<RefPtr<QuotaManager>> aQuotaManager,
const PrincipalInfo& aPrincipalInfo,
const PrincipalMetadata& aPrincipalMetadata,
RefPtr<UniversalDirectoryLock> aDirectoryLock);
private:
~InitializeTemporaryGroupOp() = default;
nsresult DoInit(QuotaManager& aQuotaManager) override;
RefPtr<BoolPromise> OpenDirectory() override;
nsresult DoDirectoryWork(QuotaManager& aQuotaManager) override;
@@ -1102,10 +1099,10 @@ CreateInitTemporaryStorageOp(MovingNotNull<RefPtr<QuotaManager>> aQuotaManager,
RefPtr<ResolvableNormalOriginOp<bool>> CreateInitializeTemporaryGroupOp(
MovingNotNull<RefPtr<QuotaManager>> aQuotaManager,
const PrincipalInfo& aPrincipalInfo,
const PrincipalMetadata& aPrincipalMetadata,
RefPtr<UniversalDirectoryLock> aDirectoryLock) {
return MakeRefPtr<InitializeTemporaryGroupOp>(
std::move(aQuotaManager), aPrincipalInfo, std::move(aDirectoryLock));
std::move(aQuotaManager), aPrincipalMetadata, std::move(aDirectoryLock));
}
RefPtr<ResolvableNormalOriginOp<bool>> CreateInitializePersistentOriginOp(
@@ -2155,26 +2152,15 @@ void InitTemporaryStorageOp::CloseDirectory() {
InitializeTemporaryGroupOp::InitializeTemporaryGroupOp(
MovingNotNull<RefPtr<QuotaManager>> aQuotaManager,
const PrincipalInfo& aPrincipalInfo,
const PrincipalMetadata& aPrincipalMetadata,
RefPtr<UniversalDirectoryLock> aDirectoryLock)
: ResolvableNormalOriginOp(std::move(aQuotaManager),
"dom::quota::InitializeTemporaryGroupOp"),
mPrincipalInfo(aPrincipalInfo),
mPrincipalMetadata(aPrincipalMetadata),
mDirectoryLock(std::move(aDirectoryLock)) {
AssertIsOnOwningThread();
}
nsresult InitializeTemporaryGroupOp::DoInit(QuotaManager& aQuotaManager) {
AssertIsOnOwningThread();
QM_TRY_UNWRAP(mPrincipalMetadata, GetInfoFromValidatedPrincipalInfo(
aQuotaManager, mPrincipalInfo));
mPrincipalMetadata.AssertInvariants();
return NS_OK;
}
RefPtr<BoolPromise> InitializeTemporaryGroupOp::OpenDirectory() {
AssertIsOnOwningThread();
MOZ_ASSERT(mDirectoryLock);

View File

@@ -101,7 +101,7 @@ CreateInitTemporaryStorageOp(MovingNotNull<RefPtr<QuotaManager>> aQuotaManager,
RefPtr<ResolvableNormalOriginOp<bool>> CreateInitializeTemporaryGroupOp(
MovingNotNull<RefPtr<QuotaManager>> aQuotaManager,
const mozilla::ipc::PrincipalInfo& aPrincipalInfo,
const PrincipalMetadata& aPrincipalMetadata,
RefPtr<UniversalDirectoryLock> aDirectoryLock);
RefPtr<ResolvableNormalOriginOp<bool>> CreateInitializePersistentOriginOp(

View File

@@ -398,16 +398,16 @@ class QuotaManager final : public BackgroundThreadObject {
public:
RefPtr<BoolPromise> InitializeTemporaryGroup(
const PrincipalInfo& aPrincipalInfo);
const PrincipalMetadata& aPrincipalMetadata);
RefPtr<BoolPromise> InitializeTemporaryGroup(
const PrincipalInfo& aPrincipalInfo,
const PrincipalMetadata& aPrincipalMetadata,
RefPtr<UniversalDirectoryLock> aDirectoryLock);
RefPtr<BoolPromise> TemporaryGroupInitialized(
const PrincipalInfo& aPrincipalInfo);
bool IsTemporaryGroupInitialized(const PrincipalInfo& aPrincipalInfo);
bool IsTemporaryGroupInitialized(const PrincipalMetadata& aPrincipalMetadata);
bool IsTemporaryGroupInitializedInternal(
const PrincipalMetadata& aPrincipalMetadata) const;

View File

@@ -505,7 +505,12 @@ mozilla::ipc::IPCResult Quota::RecvInitializeTemporaryGroup(
QuotaManager::GetOrCreate(),
ResolveBoolResponseAndReturn(aResolve));
quotaManager->InitializeTemporaryGroup(aPrincipalInfo)
QM_TRY_UNWRAP(
PrincipalMetadata principalMetadata,
GetInfoFromValidatedPrincipalInfo(*quotaManager, aPrincipalInfo),
ResolveBoolResponseAndReturn(aResolve));
quotaManager->InitializeTemporaryGroup(principalMetadata)
->Then(GetCurrentSerialEventTarget(), __func__,
BoolPromiseResolveOrRejectCallback(this, std::move(aResolve)));

View File

@@ -1624,14 +1624,6 @@ TEST_F(TestQuotaManager,
PerformOnBackgroundThread([]() {
auto testOriginMetadata = GetTestOriginMetadata();
nsCOMPtr<nsIPrincipal> principal =
BasePrincipal::CreateContentPrincipal(testOriginMetadata.mOrigin);
QM_TRY(MOZ_TO_RESULT(principal), QM_TEST_FAIL);
mozilla::ipc::PrincipalInfo principalInfo;
QM_TRY(MOZ_TO_RESULT(PrincipalToPrincipalInfo(principal, &principalInfo)),
QM_TEST_FAIL);
QuotaManager* quotaManager = QuotaManager::Get();
ASSERT_TRUE(quotaManager);
@@ -1662,10 +1654,12 @@ TEST_F(TestQuotaManager,
}
{
auto value = Await(quotaManager->InitializeTemporaryGroup(principalInfo));
auto value =
Await(quotaManager->InitializeTemporaryGroup(testOriginMetadata));
ASSERT_TRUE(value.IsResolve());
ASSERT_TRUE(quotaManager->IsTemporaryGroupInitialized(principalInfo));
ASSERT_TRUE(
quotaManager->IsTemporaryGroupInitialized(testOriginMetadata));
}
DropDirectoryLock(directoryLock);
@@ -1687,14 +1681,6 @@ TEST_F(TestQuotaManager,
PerformOnBackgroundThread([]() {
auto testOriginMetadata = GetTestOriginMetadata();
nsCOMPtr<nsIPrincipal> principal =
BasePrincipal::CreateContentPrincipal(testOriginMetadata.mOrigin);
QM_TRY(MOZ_TO_RESULT(principal), QM_TEST_FAIL);
mozilla::ipc::PrincipalInfo principalInfo;
QM_TRY(MOZ_TO_RESULT(PrincipalToPrincipalInfo(principal, &principalInfo)),
QM_TEST_FAIL);
QuotaManager* quotaManager = QuotaManager::Get();
ASSERT_TRUE(quotaManager);
@@ -1711,7 +1697,7 @@ TEST_F(TestQuotaManager,
promises.AppendElement(quotaManager->InitializeStorage());
promises.AppendElement(quotaManager->InitializeTemporaryStorage());
promises.AppendElement(
quotaManager->InitializeTemporaryGroup(principalInfo)
quotaManager->InitializeTemporaryGroup(testOriginMetadata)
->Then(GetCurrentSerialEventTarget(), __func__,
[&directoryLock](
const BoolPromise::ResolveOrRejectValue& aValue) {
@@ -1732,7 +1718,7 @@ TEST_F(TestQuotaManager,
promises.AppendElement(quotaManager->InitializeStorage());
promises.AppendElement(quotaManager->InitializeTemporaryStorage());
promises.AppendElement(
quotaManager->InitializeTemporaryGroup(principalInfo));
quotaManager->InitializeTemporaryGroup(testOriginMetadata));
{
auto value =
@@ -1741,7 +1727,8 @@ TEST_F(TestQuotaManager,
ASSERT_TRUE(quotaManager->IsStorageInitialized());
ASSERT_TRUE(quotaManager->IsTemporaryStorageInitialized());
ASSERT_TRUE(quotaManager->IsTemporaryGroupInitialized(principalInfo));
ASSERT_TRUE(
quotaManager->IsTemporaryGroupInitialized(testOriginMetadata));
}
});
@@ -1760,14 +1747,6 @@ TEST_F(TestQuotaManager, InitializeTemporaryGroup_Finished) {
PerformOnBackgroundThread([]() {
auto testOriginMetadata = GetTestOriginMetadata();
nsCOMPtr<nsIPrincipal> principal =
BasePrincipal::CreateContentPrincipal(testOriginMetadata.mOrigin);
QM_TRY(MOZ_TO_RESULT(principal), QM_TEST_FAIL);
mozilla::ipc::PrincipalInfo principalInfo;
QM_TRY(MOZ_TO_RESULT(PrincipalToPrincipalInfo(principal, &principalInfo)),
QM_TEST_FAIL);
nsTArray<RefPtr<BoolPromise>> promises;
QuotaManager* quotaManager = QuotaManager::Get();
@@ -1776,7 +1755,7 @@ TEST_F(TestQuotaManager, InitializeTemporaryGroup_Finished) {
promises.AppendElement(quotaManager->InitializeStorage());
promises.AppendElement(quotaManager->InitializeTemporaryStorage());
promises.AppendElement(
quotaManager->InitializeTemporaryGroup(principalInfo));
quotaManager->InitializeTemporaryGroup(testOriginMetadata));
{
auto value =
@@ -1785,7 +1764,8 @@ TEST_F(TestQuotaManager, InitializeTemporaryGroup_Finished) {
ASSERT_TRUE(quotaManager->IsStorageInitialized());
ASSERT_TRUE(quotaManager->IsTemporaryStorageInitialized());
ASSERT_TRUE(quotaManager->IsTemporaryGroupInitialized(principalInfo));
ASSERT_TRUE(
quotaManager->IsTemporaryGroupInitialized(testOriginMetadata));
}
promises.Clear();
@@ -1793,7 +1773,7 @@ TEST_F(TestQuotaManager, InitializeTemporaryGroup_Finished) {
promises.AppendElement(quotaManager->InitializeStorage());
promises.AppendElement(quotaManager->InitializeTemporaryStorage());
promises.AppendElement(
quotaManager->InitializeTemporaryGroup(principalInfo));
quotaManager->InitializeTemporaryGroup(testOriginMetadata));
{
auto value =
@@ -1802,7 +1782,8 @@ TEST_F(TestQuotaManager, InitializeTemporaryGroup_Finished) {
ASSERT_TRUE(quotaManager->IsStorageInitialized());
ASSERT_TRUE(quotaManager->IsTemporaryStorageInitialized());
ASSERT_TRUE(quotaManager->IsTemporaryGroupInitialized(principalInfo));
ASSERT_TRUE(
quotaManager->IsTemporaryGroupInitialized(testOriginMetadata));
}
});
@@ -1820,14 +1801,6 @@ TEST_F(TestQuotaManager,
PerformOnBackgroundThread([]() {
auto testOriginMetadata = GetTestOriginMetadata();
nsCOMPtr<nsIPrincipal> principal =
BasePrincipal::CreateContentPrincipal(testOriginMetadata.mOrigin);
QM_TRY(MOZ_TO_RESULT(principal), QM_TEST_FAIL);
mozilla::ipc::PrincipalInfo principalInfo;
QM_TRY(MOZ_TO_RESULT(PrincipalToPrincipalInfo(principal, &principalInfo)),
QM_TEST_FAIL);
nsTArray<RefPtr<BoolPromise>> promises;
QuotaManager* quotaManager = QuotaManager::Get();
@@ -1836,7 +1809,7 @@ TEST_F(TestQuotaManager,
promises.AppendElement(quotaManager->InitializeStorage());
promises.AppendElement(quotaManager->InitializeTemporaryStorage());
promises.AppendElement(
quotaManager->InitializeTemporaryGroup(principalInfo));
quotaManager->InitializeTemporaryGroup(testOriginMetadata));
{
auto value =
@@ -1845,7 +1818,8 @@ TEST_F(TestQuotaManager,
ASSERT_TRUE(quotaManager->IsStorageInitialized());
ASSERT_TRUE(quotaManager->IsTemporaryStorageInitialized());
ASSERT_TRUE(quotaManager->IsTemporaryGroupInitialized(principalInfo));
ASSERT_TRUE(
quotaManager->IsTemporaryGroupInitialized(testOriginMetadata));
}
promises.Clear();
@@ -1854,7 +1828,7 @@ TEST_F(TestQuotaManager,
promises.AppendElement(quotaManager->InitializeStorage());
promises.AppendElement(quotaManager->InitializeTemporaryStorage());
promises.AppendElement(
quotaManager->InitializeTemporaryGroup(principalInfo));
quotaManager->InitializeTemporaryGroup(testOriginMetadata));
{
auto value =
@@ -1863,7 +1837,8 @@ TEST_F(TestQuotaManager,
ASSERT_TRUE(quotaManager->IsStorageInitialized());
ASSERT_TRUE(quotaManager->IsTemporaryStorageInitialized());
ASSERT_TRUE(quotaManager->IsTemporaryGroupInitialized(principalInfo));
ASSERT_TRUE(
quotaManager->IsTemporaryGroupInitialized(testOriginMetadata));
}
});