From d5c7897c55b328f48f6084c572be2b10c2ced95c Mon Sep 17 00:00:00 2001 From: Jan Varga Date: Fri, 18 Oct 2024 13:14:02 +0000 Subject: [PATCH] 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 --- dom/quota/PQuota.ipdl | 6 +++ dom/quota/QuotaManagerService.cpp | 68 ++++++++++++++++++++++++++++ dom/quota/QuotaParent.cpp | 48 ++++++++++++++++++++ dom/quota/QuotaParent.h | 8 ++++ dom/quota/nsIQuotaManagerService.idl | 23 ++++++++++ 5 files changed, 153 insertions(+) diff --git a/dom/quota/PQuota.ipdl b/dom/quota/PQuota.ipdl index d4006363006a..58dd71d7bad7 100644 --- a/dom/quota/PQuota.ipdl +++ b/dom/quota/PQuota.ipdl @@ -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); diff --git a/dom/quota/QuotaManagerService.cpp b/dom/quota/QuotaManagerService.cpp index 64690bec55e8..a8710a8ad4fc 100644 --- a/dom/quota/QuotaManagerService.cpp +++ b/dom/quota/QuotaManagerService.cpp @@ -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 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 = 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 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 = new Request(); + + mBackgroundActor->SendInitializeTemporaryGroup(principalInfo) + ->Then(GetCurrentSerialEventTarget(), __func__, + BoolResponsePromiseResolveOrRejectCallback(request)); + + request.forget(_retval); + return NS_OK; +} + NS_IMETHODIMP QuotaManagerService::InitializePersistentOrigin(nsIPrincipal* aPrincipal, nsIQuotaRequest** _retval) { diff --git a/dom/quota/QuotaParent.cpp b/dom/quota/QuotaParent.cpp index 685628536bac..f0131ec2ca99 100644 --- a/dom/quota/QuotaParent.cpp +++ b/dom/quota/QuotaParent.cpp @@ -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> 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> 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) { diff --git a/dom/quota/QuotaParent.h b/dom/quota/QuotaParent.h index 7789e45f2d65..de0f8fc4f44c 100644 --- a/dom/quota/QuotaParent.h +++ b/dom/quota/QuotaParent.h @@ -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; diff --git a/dom/quota/nsIQuotaManagerService.idl b/dom/quota/nsIQuotaManagerService.idl index 5841bb2d35e6..c759ea94f980 100644 --- a/dom/quota/nsIQuotaManagerService.idl +++ b/dom/quota/nsIQuotaManagerService.idl @@ -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.