mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-22 10:27:03 +00:00
Bug 1105827 - Part 8: Move permission checking into PermissionStatus. r=baku
This commit is contained in:
parent
1d9d861e76
commit
9b37a607e3
@ -5,17 +5,38 @@
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
#include "mozilla/dom/PermissionStatus.h"
|
||||
#include "mozilla/Services.h"
|
||||
|
||||
#include "mozilla/Services.h"
|
||||
#include "mozilla/UniquePtr.h"
|
||||
#include "nsIPermissionManager.h"
|
||||
#include "PermissionUtils.h"
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
|
||||
/* static */ nsresult
|
||||
PermissionStatus::Create(nsPIDOMWindow* aWindow,
|
||||
PermissionName aName,
|
||||
PermissionStatus** aStatus)
|
||||
{
|
||||
MOZ_ASSERT(aStatus);
|
||||
*aStatus = nullptr;
|
||||
|
||||
UniquePtr<PermissionStatus> status(new PermissionStatus(aWindow, aName));
|
||||
nsresult rv = status->UpdateState();
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
*aStatus = status.release();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
PermissionStatus::PermissionStatus(nsPIDOMWindow* aWindow,
|
||||
PermissionState aState)
|
||||
PermissionName aName)
|
||||
: DOMEventTargetHelper(aWindow)
|
||||
, mState(aState)
|
||||
, mName(aName)
|
||||
, mState(PermissionState::Denied)
|
||||
{
|
||||
}
|
||||
|
||||
@ -29,5 +50,30 @@ PermissionStatus::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
|
||||
return PermissionStatusBinding::Wrap(aCx, this, aGivenProto);
|
||||
}
|
||||
|
||||
nsresult
|
||||
PermissionStatus::UpdateState()
|
||||
{
|
||||
nsCOMPtr<nsIPermissionManager> permMgr = services::GetPermissionManager();
|
||||
if (NS_WARN_IF(!permMgr)) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
nsCOMPtr<nsPIDOMWindow> window = do_QueryInterface(GetOwner());
|
||||
if (NS_WARN_IF(!window)) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
uint32_t action = nsIPermissionManager::DENY_ACTION;
|
||||
nsresult rv = permMgr->TestPermissionFromWindow(window,
|
||||
PermissionNameToType(mName),
|
||||
&action);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
mState = ActionToPermissionState(action);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
} // namespace dom
|
||||
} // namespace mozilla
|
||||
|
@ -7,6 +7,7 @@
|
||||
#ifndef mozilla_dom_PermissionStatus_h_
|
||||
#define mozilla_dom_PermissionStatus_h_
|
||||
|
||||
#include "mozilla/dom/PermissionsBinding.h"
|
||||
#include "mozilla/dom/PermissionStatusBinding.h"
|
||||
#include "mozilla/DOMEventTargetHelper.h"
|
||||
|
||||
@ -17,7 +18,11 @@ class PermissionStatus final
|
||||
: public DOMEventTargetHelper
|
||||
{
|
||||
public:
|
||||
explicit PermissionStatus(nsPIDOMWindow* aWindow, PermissionState aState);
|
||||
~PermissionStatus();
|
||||
|
||||
static nsresult Create(nsPIDOMWindow* aWindow,
|
||||
PermissionName aName,
|
||||
PermissionStatus** aStatus);
|
||||
|
||||
JSObject* WrapObject(JSContext* aCx,
|
||||
JS::Handle<JSObject*> aGivenProto) override;
|
||||
@ -27,8 +32,11 @@ public:
|
||||
IMPL_EVENT_HANDLER(change)
|
||||
|
||||
private:
|
||||
~PermissionStatus();
|
||||
PermissionStatus(nsPIDOMWindow* aWindow, PermissionName aName);
|
||||
|
||||
nsresult UpdateState();
|
||||
|
||||
PermissionName mName;
|
||||
PermissionState mState;
|
||||
};
|
||||
|
||||
|
@ -43,34 +43,10 @@ Permissions::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
|
||||
namespace {
|
||||
|
||||
nsresult
|
||||
CheckPermission(PermissionName aName,
|
||||
nsPIDOMWindow* aWindow,
|
||||
PermissionState& aResult)
|
||||
{
|
||||
MOZ_ASSERT(aWindow);
|
||||
|
||||
nsCOMPtr<nsIPermissionManager> permMgr = services::GetPermissionManager();
|
||||
if (NS_WARN_IF(!permMgr)) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
uint32_t action = nsIPermissionManager::DENY_ACTION;
|
||||
nsresult rv = permMgr->TestPermissionFromWindow(aWindow,
|
||||
PermissionNameToType(aName),
|
||||
&action);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
aResult = ActionToPermissionState(action);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
CheckPushPermission(JSContext* aCx,
|
||||
JS::Handle<JSObject*> aPermission,
|
||||
nsPIDOMWindow* aWindow,
|
||||
PermissionState& aResult)
|
||||
CreatePushPermissionStatus(JSContext* aCx,
|
||||
JS::Handle<JSObject*> aPermission,
|
||||
nsPIDOMWindow* aWindow,
|
||||
PermissionStatus** aResult)
|
||||
{
|
||||
PushPermissionDescriptor permission;
|
||||
JS::Rooted<JS::Value> value(aCx, JS::ObjectOrNullValue(aPermission));
|
||||
@ -82,14 +58,14 @@ CheckPushPermission(JSContext* aCx,
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
return CheckPermission(permission.mName, aWindow, aResult);
|
||||
return PermissionStatus::Create(aWindow, permission.mName, aResult);
|
||||
}
|
||||
|
||||
nsresult
|
||||
CheckPermission(JSContext* aCx,
|
||||
JS::Handle<JSObject*> aPermission,
|
||||
nsPIDOMWindow* aWindow,
|
||||
PermissionState& aResult)
|
||||
CreatePermissionStatus(JSContext* aCx,
|
||||
JS::Handle<JSObject*> aPermission,
|
||||
nsPIDOMWindow* aWindow,
|
||||
PermissionStatus** aResult)
|
||||
{
|
||||
PermissionDescriptor permission;
|
||||
JS::Rooted<JS::Value> value(aCx, JS::ObjectOrNullValue(aPermission));
|
||||
@ -100,10 +76,10 @@ CheckPermission(JSContext* aCx,
|
||||
switch (permission.mName) {
|
||||
case PermissionName::Geolocation:
|
||||
case PermissionName::Notifications:
|
||||
return CheckPermission(permission.mName, aWindow, aResult);
|
||||
return PermissionStatus::Create(aWindow, permission.mName, aResult);
|
||||
|
||||
case PermissionName::Push:
|
||||
return CheckPushPermission(aCx, aPermission, aWindow, aResult);
|
||||
return CreatePushPermissionStatus(aCx, aPermission, aWindow, aResult);
|
||||
|
||||
case PermissionName::Midi:
|
||||
default:
|
||||
@ -129,12 +105,14 @@ Permissions::Query(JSContext* aCx,
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
PermissionState state = PermissionState::Denied;
|
||||
nsresult rv = CheckPermission(aCx, aPermission, mWindow, state);
|
||||
PermissionStatus* status = nullptr;
|
||||
nsresult rv = CreatePermissionStatus(aCx, aPermission, mWindow, &status);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
MOZ_ASSERT(!status);
|
||||
promise->MaybeReject(rv);
|
||||
} else {
|
||||
promise->MaybeResolve(new PermissionStatus(mWindow, state));
|
||||
MOZ_ASSERT(status);
|
||||
promise->MaybeResolve(status);
|
||||
}
|
||||
return promise.forget();
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user