Bug 1858494 - Return permission action rather than boolean when fetching the storage access permission from the parent process - r=timhuang,anti-tracking-reviewers

Differential Revision: https://phabricator.services.mozilla.com/D190722
This commit is contained in:
Benjamin VanderSloot 2023-10-12 16:58:22 +00:00
parent d9dc6c946f
commit 094d813e4c
7 changed files with 30 additions and 24 deletions

View file

@ -17372,22 +17372,26 @@ Document::CreatePermissionGrantPromise(
p = new StorageAccessAPIHelper::StorageAccessPermissionGrantPromise:: p = new StorageAccessAPIHelper::StorageAccessPermissionGrantPromise::
Private(__func__); Private(__func__);
RefPtr<PWindowGlobalChild::HasStorageAccessPermissionPromise> promise; RefPtr<PWindowGlobalChild::GetStorageAccessPermissionPromise> promise;
// Test the permission // Test the permission
MOZ_ASSERT(XRE_IsContentProcess()); MOZ_ASSERT(XRE_IsContentProcess());
WindowGlobalChild* wgc = inner->GetWindowGlobalChild(); WindowGlobalChild* wgc = inner->GetWindowGlobalChild();
MOZ_ASSERT(wgc); MOZ_ASSERT(wgc);
promise = wgc->SendHasStorageAccessPermission(); promise = wgc->SendGetStorageAccessPermission();
MOZ_ASSERT(promise); MOZ_ASSERT(promise);
promise->Then( promise->Then(
GetCurrentSerialEventTarget(), __func__, GetCurrentSerialEventTarget(), __func__,
[self, p, inner, principal, aHasUserInteraction, [self, p, inner, principal, aHasUserInteraction,
aRequireUserInteraction, aTopLevelBaseDomain, aRequireUserInteraction, aTopLevelBaseDomain,
aFrameOnly](bool aGranted) { aFrameOnly](uint32_t aAction) {
if (aGranted) { if (aAction == nsIPermissionManager::ALLOW_ACTION) {
p->Resolve(true, __func__); p->Resolve(StorageAccessAPIHelper::eAllow, __func__);
return;
}
if (aAction == nsIPermissionManager::DENY_ACTION) {
p->Reject(false, __func__);
return; return;
} }

View file

@ -210,7 +210,7 @@ parent:
async DiscoverIdentityCredentialFromExternalSource(IdentityCredentialRequestOptions aOptions) async DiscoverIdentityCredentialFromExternalSource(IdentityCredentialRequestOptions aOptions)
returns (IPCIdentityCredential? identityCredential); returns (IPCIdentityCredential? identityCredential);
async HasStorageAccessPermission() returns(bool granted); async GetStorageAccessPermission() returns(uint32_t permission_action);
async SetCookies(nsCString baseDomain, async SetCookies(nsCString baseDomain,

View file

@ -1396,21 +1396,21 @@ IPCResult WindowGlobalParent::RecvDiscoverIdentityCredentialFromExternalSource(
return IPC_OK(); return IPC_OK();
} }
IPCResult WindowGlobalParent::RecvHasStorageAccessPermission( IPCResult WindowGlobalParent::RecvGetStorageAccessPermission(
HasStorageAccessPermissionResolver&& aResolve) { GetStorageAccessPermissionResolver&& aResolve) {
WindowGlobalParent* top = TopWindowContext(); WindowGlobalParent* top = TopWindowContext();
if (!top) { if (!top) {
return IPC_FAIL_NO_REASON(this); return IPC_FAIL_NO_REASON(this);
} }
nsIPrincipal* topPrincipal = top->DocumentPrincipal(); nsIPrincipal* topPrincipal = top->DocumentPrincipal();
nsIPrincipal* principal = DocumentPrincipal(); nsIPrincipal* principal = DocumentPrincipal();
bool result; uint32_t result;
nsresult rv = AntiTrackingUtils::TestStoragePermissionInParent( nsresult rv = AntiTrackingUtils::TestStoragePermissionInParent(
topPrincipal, principal, &result); topPrincipal, principal, &result);
NS_ENSURE_SUCCESS( if (NS_WARN_IF(NS_FAILED(rv))) {
rv, IPC_FAIL( aResolve(nsIPermissionManager::UNKNOWN_ACTION);
this, return IPC_OK();
"Storage Access Permission: Failed to test storage permission.")); }
aResolve(result); aResolve(result);
return IPC_OK(); return IPC_OK();

View file

@ -310,8 +310,8 @@ class WindowGlobalParent final : public WindowContext,
const IdentityCredentialRequestOptions& aOptions, const IdentityCredentialRequestOptions& aOptions,
const DiscoverIdentityCredentialFromExternalSourceResolver& aResolver); const DiscoverIdentityCredentialFromExternalSourceResolver& aResolver);
mozilla::ipc::IPCResult RecvHasStorageAccessPermission( mozilla::ipc::IPCResult RecvGetStorageAccessPermission(
HasStorageAccessPermissionResolver&& aResolve); GetStorageAccessPermissionResolver&& aResolve);
mozilla::ipc::IPCResult RecvSetCookies( mozilla::ipc::IPCResult RecvSetCookies(
const nsCString& aBaseDomain, const OriginAttributes& aOriginAttributes, const nsCString& aBaseDomain, const OriginAttributes& aOriginAttributes,

View file

@ -12,6 +12,7 @@
#include "mozilla/dom/FeaturePolicyUtils.h" #include "mozilla/dom/FeaturePolicyUtils.h"
#include "mozilla/dom/PermissionStatus.h" #include "mozilla/dom/PermissionStatus.h"
#include "mozilla/dom/PermissionStatusBinding.h" #include "mozilla/dom/PermissionStatusBinding.h"
#include "nsIPermissionManager.h"
namespace mozilla::dom { namespace mozilla::dom {
@ -57,12 +58,13 @@ StorageAccessPermissionStatus::UpdateState() {
} }
RefPtr<StorageAccessPermissionStatus> self(this); RefPtr<StorageAccessPermissionStatus> self(this);
return wgc->SendHasStorageAccessPermission()->Then( return wgc->SendGetStorageAccessPermission()->Then(
GetMainThreadSerialEventTarget(), __func__, GetMainThreadSerialEventTarget(), __func__,
[self](bool aGranted) { [self](uint32_t aAction) {
if (aGranted) { if (aAction == nsIPermissionManager::ALLOW_ACTION) {
self->mState = PermissionState::Granted; self->mState = PermissionState::Granted;
} else { } else {
// We never reveal PermissionState::Denied here
self->mState = PermissionState::Prompt; self->mState = PermissionState::Prompt;
} }
return SimplePromise::CreateAndResolve(NS_OK, __func__); return SimplePromise::CreateAndResolve(NS_OK, __func__);

View file

@ -386,9 +386,9 @@ bool AntiTrackingUtils::CheckStoragePermission(nsIPrincipal* aPrincipal,
/* static */ /* static */
nsresult AntiTrackingUtils::TestStoragePermissionInParent( nsresult AntiTrackingUtils::TestStoragePermissionInParent(
nsIPrincipal* aTopPrincipal, nsIPrincipal* aPrincipal, bool* aResult) { nsIPrincipal* aTopPrincipal, nsIPrincipal* aPrincipal, uint32_t* aResult) {
NS_ENSURE_ARG(aResult); NS_ENSURE_ARG(aResult);
*aResult = false; *aResult = nsIPermissionManager::UNKNOWN_ACTION;
NS_ENSURE_ARG(aTopPrincipal); NS_ENSURE_ARG(aTopPrincipal);
NS_ENSURE_ARG(aPrincipal); NS_ENSURE_ARG(aPrincipal);
@ -413,8 +413,8 @@ nsresult AntiTrackingUtils::TestStoragePermissionInParent(
aTopPrincipal, requestPermissionKey, &access); aTopPrincipal, requestPermissionKey, &access);
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
if (access == nsIPermissionManager::ALLOW_ACTION) { if (access != nsIPermissionManager::UNKNOWN_ACTION) {
*aResult = true; *aResult = access;
return NS_OK; return NS_OK;
} }
@ -423,7 +423,7 @@ nsresult AntiTrackingUtils::TestStoragePermissionInParent(
aTopPrincipal, requestFramePermissionKey, &frameAccess); aTopPrincipal, requestFramePermissionKey, &frameAccess);
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
*aResult = frameAccess == nsIPermissionManager::ALLOW_ACTION; *aResult = frameAccess;
return NS_OK; return NS_OK;
} }

View file

@ -85,7 +85,7 @@ class AntiTrackingUtils final {
// with secondary key for embedee aPrincipal. // with secondary key for embedee aPrincipal.
static nsresult TestStoragePermissionInParent(nsIPrincipal* aTopPrincipal, static nsresult TestStoragePermissionInParent(nsIPrincipal* aTopPrincipal,
nsIPrincipal* aPrincipal, nsIPrincipal* aPrincipal,
bool* aResult); uint32_t* aResult);
// Returns the storage permission state for the given channel. And this is // Returns the storage permission state for the given channel. And this is
// meant to be called in the parent process. This only reflects the fact that // meant to be called in the parent process. This only reflects the fact that