From fee7b4c5f0618b0d8e5c11c8684a7ec3bf25f251 Mon Sep 17 00:00:00 2001 From: Birunthan Mohanathas Date: Fri, 31 Jul 2015 15:53:10 -0700 Subject: [PATCH] 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. --- dom/permission/PermissionStatus.cpp | 52 +++++++++++++++++++++++++-- dom/permission/PermissionStatus.h | 12 +++++-- dom/permission/Permissions.cpp | 54 +++++++++-------------------- 3 files changed, 75 insertions(+), 43 deletions(-) diff --git a/dom/permission/PermissionStatus.cpp b/dom/permission/PermissionStatus.cpp index 862e9be5b5f..efce7d8ac65 100644 --- a/dom/permission/PermissionStatus.cpp +++ b/dom/permission/PermissionStatus.cpp @@ -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 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 aGivenProto) return PermissionStatusBinding::Wrap(aCx, this, aGivenProto); } +nsresult +PermissionStatus::UpdateState() +{ + nsCOMPtr permMgr = services::GetPermissionManager(); + if (NS_WARN_IF(!permMgr)) { + return NS_ERROR_FAILURE; + } + + nsCOMPtr 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 diff --git a/dom/permission/PermissionStatus.h b/dom/permission/PermissionStatus.h index b4c0e1a73e7..ca15d562cd2 100644 --- a/dom/permission/PermissionStatus.h +++ b/dom/permission/PermissionStatus.h @@ -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 aGivenProto) override; @@ -27,8 +32,11 @@ public: IMPL_EVENT_HANDLER(change) private: - ~PermissionStatus(); + PermissionStatus(nsPIDOMWindow* aWindow, PermissionName aName); + nsresult UpdateState(); + + PermissionName mName; PermissionState mState; }; diff --git a/dom/permission/Permissions.cpp b/dom/permission/Permissions.cpp index acb7be81abc..cec3fe9c590 100644 --- a/dom/permission/Permissions.cpp +++ b/dom/permission/Permissions.cpp @@ -43,34 +43,10 @@ Permissions::WrapObject(JSContext* aCx, JS::Handle aGivenProto) namespace { nsresult -CheckPermission(PermissionName aName, - nsPIDOMWindow* aWindow, - PermissionState& aResult) -{ - MOZ_ASSERT(aWindow); - - nsCOMPtr 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 aPermission, - nsPIDOMWindow* aWindow, - PermissionState& aResult) +CreatePushPermissionStatus(JSContext* aCx, + JS::Handle aPermission, + nsPIDOMWindow* aWindow, + PermissionStatus** aResult) { PushPermissionDescriptor permission; JS::Rooted 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 aPermission, - nsPIDOMWindow* aWindow, - PermissionState& aResult) +CreatePermissionStatus(JSContext* aCx, + JS::Handle aPermission, + nsPIDOMWindow* aWindow, + PermissionStatus** aResult) { PermissionDescriptor permission; JS::Rooted 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(); }