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() async TemporaryStorageInitialized()
returns(BoolResponse response); returns(BoolResponse response);
async TemporaryGroupInitialized(PrincipalInfo principalInfo)
returns(BoolResponse response);
async PersistentOriginInitialized(PrincipalInfo principalInfo) async PersistentOriginInitialized(PrincipalInfo principalInfo)
returns(BoolResponse response); returns(BoolResponse response);
@@ -144,6 +147,9 @@ parent:
async InitializePersistentStorage() async InitializePersistentStorage()
returns(BoolResponse response); returns(BoolResponse response);
async InitializeTemporaryGroup(PrincipalInfo principalInfo)
returns(BoolResponse response);
async InitializePersistentOrigin(PrincipalInfo principalInfo) async InitializePersistentOrigin(PrincipalInfo principalInfo)
returns(BoolResponse response); returns(BoolResponse response);

View File

@@ -566,6 +566,40 @@ QuotaManagerService::TemporaryStorageInitialized(nsIQuotaRequest** _retval) {
return NS_OK; 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 NS_IMETHODIMP
QuotaManagerService::PersistentOriginInitialized(nsIPrincipal* aPrincipal, QuotaManagerService::PersistentOriginInitialized(nsIPrincipal* aPrincipal,
nsIQuotaRequest** _retval) { nsIQuotaRequest** _retval) {
@@ -714,6 +748,40 @@ QuotaManagerService::InitTemporaryStorage(nsIQuotaRequest** _retval) {
return NS_OK; 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 NS_IMETHODIMP
QuotaManagerService::InitializePersistentOrigin(nsIPrincipal* aPrincipal, QuotaManagerService::InitializePersistentOrigin(nsIPrincipal* aPrincipal,
nsIQuotaRequest** _retval) { nsIQuotaRequest** _retval) {

View File

@@ -359,6 +359,30 @@ mozilla::ipc::IPCResult Quota::RecvTemporaryStorageInitialized(
return IPC_OK(); 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( mozilla::ipc::IPCResult Quota::RecvPersistentOriginInitialized(
const PrincipalInfo& aPrincipalInfo, const PrincipalInfo& aPrincipalInfo,
PersistentOriginInitializedResolver&& aResolve) { PersistentOriginInitializedResolver&& aResolve) {
@@ -447,6 +471,30 @@ mozilla::ipc::IPCResult Quota::RecvInitializePersistentStorage(
return IPC_OK(); 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( mozilla::ipc::IPCResult Quota::RecvInitializePersistentOrigin(
const PrincipalInfo& aPrincipalInfo, const PrincipalInfo& aPrincipalInfo,
InitializePersistentOriginResolver&& aResolve) { InitializePersistentOriginResolver&& aResolve) {

View File

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

View File

@@ -51,6 +51,15 @@ interface nsIQuotaManagerService : nsISupports
[must_use] nsIQuotaRequest [must_use] nsIQuotaRequest
temporaryStorageInitialized(); 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. * Check if persistent origin is initialized.
* *
@@ -109,6 +118,20 @@ interface nsIQuotaManagerService : nsISupports
[must_use] nsIQuotaRequest [must_use] nsIQuotaRequest
initTemporaryStorage(); 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 * Initializes persistent origin directory for the given origin. This can be
* used in tests to verify origin initialization. * used in tests to verify origin initialization.