Bug 1105827 - Part 11: Use nsRefPtr to store PermissionStatus. r=baku

This commit is contained in:
Birunthan Mohanathas 2015-07-31 14:56:59 -07:00
Родитель e08489fa66
Коммит e53e26f42e
3 изменённых файлов: 31 добавлений и 32 удалений

Просмотреть файл

@ -8,7 +8,6 @@
#include "mozilla/AsyncEventDispatcher.h"
#include "mozilla/Services.h"
#include "mozilla/UniquePtr.h"
#include "nsIPermissionManager.h"
#include "PermissionObserver.h"
#include "PermissionUtils.h"
@ -16,22 +15,18 @@
namespace mozilla {
namespace dom {
/* static */ nsresult
/* static */ already_AddRefed<PermissionStatus>
PermissionStatus::Create(nsPIDOMWindow* aWindow,
PermissionName aName,
PermissionStatus** aStatus)
ErrorResult& aRv)
{
MOZ_ASSERT(aStatus);
*aStatus = nullptr;
UniquePtr<PermissionStatus> status(new PermissionStatus(aWindow, aName));
nsresult rv = status->Init();
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
nsRefPtr<PermissionStatus> status = new PermissionStatus(aWindow, aName);
aRv = status->Init();
if (NS_WARN_IF(aRv.Failed())) {
return nullptr;
}
*aStatus = status.release();
return NS_OK;
return status.forget();
}
PermissionStatus::PermissionStatus(nsPIDOMWindow* aWindow,

Просмотреть файл

@ -22,11 +22,9 @@ class PermissionStatus final
friend class PermissionObserver;
public:
~PermissionStatus();
static nsresult Create(nsPIDOMWindow* aWindow,
PermissionName aName,
PermissionStatus** aStatus);
static already_AddRefed<PermissionStatus> Create(nsPIDOMWindow* aWindow,
PermissionName aName,
ErrorResult& aRv);
JSObject* WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aGivenProto) override;
@ -36,6 +34,8 @@ public:
IMPL_EVENT_HANDLER(change)
private:
~PermissionStatus();
PermissionStatus(nsPIDOMWindow* aWindow, PermissionName aName);
nsresult Init();

Просмотреть файл

@ -42,48 +42,52 @@ Permissions::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
namespace {
nsresult
already_AddRefed<PermissionStatus>
CreatePushPermissionStatus(JSContext* aCx,
JS::Handle<JSObject*> aPermission,
nsPIDOMWindow* aWindow,
PermissionStatus** aResult)
ErrorResult& aRv)
{
PushPermissionDescriptor permission;
JS::Rooted<JS::Value> value(aCx, JS::ObjectOrNullValue(aPermission));
if (NS_WARN_IF(!permission.Init(aCx, value))) {
return NS_ERROR_UNEXPECTED;
aRv.Throw(NS_ERROR_UNEXPECTED);
return nullptr;
}
if (permission.mUserVisible) {
return NS_ERROR_NOT_IMPLEMENTED;
aRv.Throw(NS_ERROR_UNEXPECTED);
return nullptr;
}
return PermissionStatus::Create(aWindow, permission.mName, aResult);
return PermissionStatus::Create(aWindow, permission.mName, aRv);
}
nsresult
already_AddRefed<PermissionStatus>
CreatePermissionStatus(JSContext* aCx,
JS::Handle<JSObject*> aPermission,
nsPIDOMWindow* aWindow,
PermissionStatus** aResult)
ErrorResult& aRv)
{
PermissionDescriptor permission;
JS::Rooted<JS::Value> value(aCx, JS::ObjectOrNullValue(aPermission));
if (NS_WARN_IF(!permission.Init(aCx, value))) {
return NS_ERROR_UNEXPECTED;
aRv.Throw(NS_ERROR_UNEXPECTED);
return nullptr;
}
switch (permission.mName) {
case PermissionName::Geolocation:
case PermissionName::Notifications:
return PermissionStatus::Create(aWindow, permission.mName, aResult);
return PermissionStatus::Create(aWindow, permission.mName, aRv);
case PermissionName::Push:
return CreatePushPermissionStatus(aCx, aPermission, aWindow, aResult);
return CreatePushPermissionStatus(aCx, aPermission, aWindow, aRv);
case PermissionName::Midi:
default:
return NS_ERROR_NOT_IMPLEMENTED;
aRv.Throw(NS_ERROR_NOT_IMPLEMENTED);
return nullptr;
}
}
@ -105,11 +109,11 @@ Permissions::Query(JSContext* aCx,
return nullptr;
}
PermissionStatus* status = nullptr;
nsresult rv = CreatePermissionStatus(aCx, aPermission, mWindow, &status);
if (NS_WARN_IF(NS_FAILED(rv))) {
nsRefPtr<PermissionStatus> status =
CreatePermissionStatus(aCx, aPermission, mWindow, aRv);
if (NS_WARN_IF(aRv.Failed())) {
MOZ_ASSERT(!status);
promise->MaybeReject(rv);
promise->MaybeReject(aRv);
} else {
MOZ_ASSERT(status);
promise->MaybeResolve(status);