Bug 1105827 - Part 8: Move permission checking into PermissionStatus. r=baku

This is in prepartion of a subsequent change where we will update the state
within PermissionStatus.
This commit is contained in:
Birunthan Mohanathas 2015-07-31 15:53:10 -07:00
parent bda42e3a3c
commit fee7b4c5f0
3 changed files with 75 additions and 43 deletions

View File

@ -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

View File

@ -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;
};

View File

@ -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();
}