Bug 1867997 - Add nsIQuotaManagerService::TemporaryGroupInitialized and nsIQuotaManagerService::InitializeTemporaryGroup methods; r=dom-storage-reviewers,jari

Google tests can use quota manager methods directly on the PBackground thread,
but xpcshell tests can only access quota manager via quota manager service, so
this patch adds support for writting xpcshell tests involving temporary group
initialization.

Differential Revision: https://phabricator.services.mozilla.com/D198355
This commit is contained in:
Jan Varga
2024-10-18 13:14:02 +00:00
parent f38521a63a
commit d5c7897c55
5 changed files with 153 additions and 0 deletions

View File

@@ -131,6 +131,9 @@ parent:
async TemporaryStorageInitialized()
returns(BoolResponse response);
async TemporaryGroupInitialized(PrincipalInfo principalInfo)
returns(BoolResponse response);
async PersistentOriginInitialized(PrincipalInfo principalInfo)
returns(BoolResponse response);
@@ -144,6 +147,9 @@ parent:
async InitializePersistentStorage()
returns(BoolResponse response);
async InitializeTemporaryGroup(PrincipalInfo principalInfo)
returns(BoolResponse response);
async InitializePersistentOrigin(PrincipalInfo principalInfo)
returns(BoolResponse response);

View File

@@ -566,6 +566,40 @@ QuotaManagerService::TemporaryStorageInitialized(nsIQuotaRequest** _retval) {
return NS_OK;
}
NS_IMETHODIMP
QuotaManagerService::TemporaryGroupInitialized(nsIPrincipal* aPrincipal,
nsIQuotaRequest** _retval) {
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(aPrincipal);
MOZ_ASSERT(nsContentUtils::IsCallerChrome());
QM_TRY(MOZ_TO_RESULT(StaticPrefs::dom_quotaManager_testing()),
NS_ERROR_UNEXPECTED);
QM_TRY(MOZ_TO_RESULT(EnsureBackgroundActor()));
QM_TRY_INSPECT(const auto& principalInfo,
([&aPrincipal]() -> Result<PrincipalInfo, nsresult> {
PrincipalInfo principalInfo;
QM_TRY(MOZ_TO_RESULT(
PrincipalToPrincipalInfo(aPrincipal, &principalInfo)));
QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(principalInfo)),
Err(NS_ERROR_INVALID_ARG));
return principalInfo;
}()));
RefPtr<Request> request = new Request();
mBackgroundActor->SendTemporaryGroupInitialized(principalInfo)
->Then(GetCurrentSerialEventTarget(), __func__,
BoolResponsePromiseResolveOrRejectCallback(request));
request.forget(_retval);
return NS_OK;
}
NS_IMETHODIMP
QuotaManagerService::PersistentOriginInitialized(nsIPrincipal* aPrincipal,
nsIQuotaRequest** _retval) {
@@ -714,6 +748,40 @@ QuotaManagerService::InitTemporaryStorage(nsIQuotaRequest** _retval) {
return NS_OK;
}
NS_IMETHODIMP
QuotaManagerService::InitializeTemporaryGroup(nsIPrincipal* aPrincipal,
nsIQuotaRequest** _retval) {
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(aPrincipal);
MOZ_ASSERT(nsContentUtils::IsCallerChrome());
QM_TRY(MOZ_TO_RESULT(StaticPrefs::dom_quotaManager_testing()),
NS_ERROR_UNEXPECTED);
QM_TRY(MOZ_TO_RESULT(EnsureBackgroundActor()));
QM_TRY_INSPECT(const auto& principalInfo,
([&aPrincipal]() -> Result<PrincipalInfo, nsresult> {
PrincipalInfo principalInfo;
QM_TRY(MOZ_TO_RESULT(
PrincipalToPrincipalInfo(aPrincipal, &principalInfo)));
QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(principalInfo)),
Err(NS_ERROR_INVALID_ARG));
return principalInfo;
}()));
RefPtr<Request> request = new Request();
mBackgroundActor->SendInitializeTemporaryGroup(principalInfo)
->Then(GetCurrentSerialEventTarget(), __func__,
BoolResponsePromiseResolveOrRejectCallback(request));
request.forget(_retval);
return NS_OK;
}
NS_IMETHODIMP
QuotaManagerService::InitializePersistentOrigin(nsIPrincipal* aPrincipal,
nsIQuotaRequest** _retval) {

View File

@@ -359,6 +359,30 @@ mozilla::ipc::IPCResult Quota::RecvTemporaryStorageInitialized(
return IPC_OK();
}
mozilla::ipc::IPCResult Quota::RecvTemporaryGroupInitialized(
const PrincipalInfo& aPrincipalInfo,
TemporaryOriginInitializedResolver&& aResolve) {
AssertIsOnBackgroundThread();
QM_TRY(MOZ_TO_RESULT(!QuotaManager::IsShuttingDown()),
ResolveBoolResponseAndReturn(aResolve));
if (!TrustParams()) {
QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(aPrincipalInfo)),
QM_CUF_AND_IPC_FAIL(this));
}
QM_TRY_UNWRAP(const NotNull<RefPtr<QuotaManager>> quotaManager,
QuotaManager::GetOrCreate(),
ResolveBoolResponseAndReturn(aResolve));
quotaManager->TemporaryGroupInitialized(aPrincipalInfo)
->Then(GetCurrentSerialEventTarget(), __func__,
BoolPromiseResolveOrRejectCallback(this, std::move(aResolve)));
return IPC_OK();
}
mozilla::ipc::IPCResult Quota::RecvPersistentOriginInitialized(
const PrincipalInfo& aPrincipalInfo,
PersistentOriginInitializedResolver&& aResolve) {
@@ -447,6 +471,30 @@ mozilla::ipc::IPCResult Quota::RecvInitializePersistentStorage(
return IPC_OK();
}
mozilla::ipc::IPCResult Quota::RecvInitializeTemporaryGroup(
const PrincipalInfo& aPrincipalInfo,
InitializeTemporaryOriginResolver&& aResolve) {
AssertIsOnBackgroundThread();
QM_TRY(MOZ_TO_RESULT(!QuotaManager::IsShuttingDown()),
ResolveBoolResponseAndReturn(aResolve));
if (!TrustParams()) {
QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(aPrincipalInfo)),
QM_CUF_AND_IPC_FAIL(this));
}
QM_TRY_UNWRAP(const NotNull<RefPtr<QuotaManager>> quotaManager,
QuotaManager::GetOrCreate(),
ResolveBoolResponseAndReturn(aResolve));
quotaManager->InitializeTemporaryGroup(aPrincipalInfo)
->Then(GetCurrentSerialEventTarget(), __func__,
BoolPromiseResolveOrRejectCallback(this, std::move(aResolve)));
return IPC_OK();
}
mozilla::ipc::IPCResult Quota::RecvInitializePersistentOrigin(
const PrincipalInfo& aPrincipalInfo,
InitializePersistentOriginResolver&& aResolve) {

View File

@@ -49,6 +49,10 @@ class Quota final : public PQuotaParent {
virtual mozilla::ipc::IPCResult RecvTemporaryStorageInitialized(
TemporaryStorageInitializedResolver&& aResolver) override;
virtual mozilla::ipc::IPCResult RecvTemporaryGroupInitialized(
const PrincipalInfo& aPrincipalInfo,
TemporaryGroupInitializedResolver&& aResolve) override;
virtual mozilla::ipc::IPCResult RecvPersistentOriginInitialized(
const PrincipalInfo& aPrincipalInfo,
PersistentOriginInitializedResolver&& aResolve) override;
@@ -64,6 +68,10 @@ class Quota final : public PQuotaParent {
virtual mozilla::ipc::IPCResult RecvInitializePersistentStorage(
InitializePersistentStorageResolver&& aResolver) override;
virtual mozilla::ipc::IPCResult RecvInitializeTemporaryGroup(
const PrincipalInfo& aPrincipalInfo,
InitializeTemporaryGroupResolver&& aResolve) override;
virtual mozilla::ipc::IPCResult RecvInitializePersistentOrigin(
const PrincipalInfo& aPrincipalInfo,
InitializePersistentOriginResolver&& aResolve) override;

View File

@@ -51,6 +51,15 @@ interface nsIQuotaManagerService : nsISupports
[must_use] nsIQuotaRequest
temporaryStorageInitialized();
/**
* Check if temporary group is initialized.
*
* If the dom.quotaManager.testing preference is not true the call will be
* a no-op.
*/
[must_use] nsIQuotaRequest
temporaryGroupInitialized(in nsIPrincipal aPrincipal);
/**
* Check if persistent origin is initialized.
*
@@ -109,6 +118,20 @@ interface nsIQuotaManagerService : nsISupports
[must_use] nsIQuotaRequest
initTemporaryStorage();
/**
* Initializes temporary origin directories for the given group. This can be
* used in tests to verify group initialization.
*
* If the dom.quotaManager.testing preference is not true the call will be
* a no-op.
*
* @param aPrincipal
* A principal for the group whose origin directories are to be
* initialized.
*/
[must_use] nsIQuotaRequest
initializeTemporaryGroup(in nsIPrincipal aPrincipal);
/**
* Initializes persistent origin directory for the given origin. This can be
* used in tests to verify origin initialization.