Bug 1434701 P11 Make ServiceWorkerDescriptor use an Inner class with main and worker thread implementations. r=asuth

This commit is contained in:
Ben Kelly 2018-02-14 14:23:17 -05:00
parent 4d62353a57
commit 10ffbe18cd
4 changed files with 264 additions and 133 deletions

View File

@ -7,6 +7,8 @@
#include "ServiceWorkerRegistration.h"
#include "mozilla/dom/Promise.h"
#include "mozilla/dom/PushManager.h"
#include "mozilla/dom/ServiceWorker.h"
#include "mozilla/dom/ServiceWorkerRegistrationBinding.h"
#include "mozilla/dom/WorkerPrivate.h"
#include "nsCycleCollectionParticipant.h"
@ -17,17 +19,36 @@
namespace mozilla {
namespace dom {
NS_IMPL_CYCLE_COLLECTION_INHERITED(ServiceWorkerRegistration,
DOMEventTargetHelper,
mInstallingWorker,
mWaitingWorker,
mActiveWorker,
mPushManager);
NS_IMPL_ADDREF_INHERITED(ServiceWorkerRegistration, DOMEventTargetHelper)
NS_IMPL_RELEASE_INHERITED(ServiceWorkerRegistration, DOMEventTargetHelper)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(ServiceWorkerRegistration)
NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
ServiceWorkerRegistration::ServiceWorkerRegistration(nsPIDOMWindowInner* aWindow,
const ServiceWorkerRegistrationDescriptor& aDescriptor)
: DOMEventTargetHelper(aWindow)
ServiceWorkerRegistration::ServiceWorkerRegistration(nsIGlobalObject* aGlobal,
const ServiceWorkerRegistrationDescriptor& aDescriptor,
ServiceWorkerRegistration::Inner* aInner)
: DOMEventTargetHelper(aGlobal)
, mDescriptor(aDescriptor)
, mInner(aInner)
{
MOZ_DIAGNOSTIC_ASSERT(mInner);
UpdateState(mDescriptor);
mInner->SetServiceWorkerRegistration(this);
}
ServiceWorkerRegistration::~ServiceWorkerRegistration()
{
if (mInner) {
mInner->ClearServiceWorkerRegistration(this);
}
}
JSObject*
@ -44,8 +65,12 @@ ServiceWorkerRegistration::CreateForMainThread(nsPIDOMWindowInner* aWindow,
MOZ_ASSERT(aWindow);
MOZ_ASSERT(NS_IsMainThread());
nsCOMPtr<nsIGlobalObject> global(do_QueryInterface(aWindow));
RefPtr<Inner> inner = new ServiceWorkerRegistrationMainThread(aDescriptor);
RefPtr<ServiceWorkerRegistration> registration =
new ServiceWorkerRegistrationMainThread(aWindow, aDescriptor);
new ServiceWorkerRegistration(global, aDescriptor, inner);
return registration.forget();
}
@ -57,14 +82,24 @@ ServiceWorkerRegistration::CreateForWorker(WorkerPrivate* aWorkerPrivate,
MOZ_ASSERT(aWorkerPrivate);
aWorkerPrivate->AssertIsOnWorkerThread();
NS_ConvertUTF8toUTF16 scope(aDescriptor.Scope());
RefPtr<ServiceWorkerRegistration> registration =
RefPtr<Inner> inner =
new ServiceWorkerRegistrationWorkerThread(aWorkerPrivate, aDescriptor);
RefPtr<ServiceWorkerRegistration> registration =
new ServiceWorkerRegistration(aWorkerPrivate->GlobalScope(), aDescriptor,
inner);
return registration.forget();
}
void
ServiceWorkerRegistration::DisconnectFromOwner()
{
mInner->ClearServiceWorkerRegistration(this);
mInner = nullptr;
DOMEventTargetHelper::DisconnectFromOwner();
}
already_AddRefed<ServiceWorker>
ServiceWorkerRegistration::GetInstalling() const
{
@ -142,5 +177,66 @@ ServiceWorkerRegistration::GetUpdateViaCache(ErrorResult& aRv) const
return mDescriptor.UpdateViaCache();
}
already_AddRefed<Promise>
ServiceWorkerRegistration::Update(ErrorResult& aRv)
{
if (!mInner) {
aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
return nullptr;
}
return mInner->Update(aRv);
}
already_AddRefed<Promise>
ServiceWorkerRegistration::Unregister(ErrorResult& aRv)
{
if (!mInner) {
aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
return nullptr;
}
return mInner->Unregister(aRv);
}
already_AddRefed<PushManager>
ServiceWorkerRegistration::GetPushManager(JSContext* aCx, ErrorResult& aRv)
{
if (!mInner) {
aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
return nullptr;
}
if (!mPushManager) {
mPushManager = mInner->GetPushManager(aCx, aRv);
if (aRv.Failed()) {
return nullptr;
}
}
RefPtr<PushManager> ret = mPushManager;
return ret.forget();
}
already_AddRefed<Promise>
ServiceWorkerRegistration::ShowNotification(JSContext* aCx,
const nsAString& aTitle,
const NotificationOptions& aOptions,
ErrorResult& aRv)
{
if (!mInner) {
aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
return nullptr;
}
return mInner->ShowNotification(aCx, aTitle, aOptions, aRv);
}
already_AddRefed<Promise>
ServiceWorkerRegistration::GetNotifications(const GetNotificationOptions& aOptions,
ErrorResult& aRv)
{
if (!mInner) {
aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
return nullptr;
}
return mInner->GetNotifications(aOptions, aRv);
}
} // dom namespace
} // mozilla namespace

View File

@ -9,7 +9,6 @@
#include "mozilla/DOMEventTargetHelper.h"
#include "mozilla/dom/DOMPrefs.h"
#include "mozilla/dom/ServiceWorker.h"
#include "mozilla/dom/ServiceWorkerBinding.h"
#include "mozilla/dom/ServiceWorkerRegistrationBinding.h"
#include "mozilla/dom/ServiceWorkerRegistrationDescriptor.h"
@ -17,7 +16,7 @@
// Support for Notification API extension.
#include "mozilla/dom/NotificationBinding.h"
class nsPIDOMWindowInner;
class nsIGlobalObject;
namespace mozilla {
namespace dom {
@ -25,11 +24,44 @@ namespace dom {
class Promise;
class PushManager;
class WorkerPrivate;
class ServiceWorker;
class ServiceWorkerRegistration : public DOMEventTargetHelper
class ServiceWorkerRegistration final : public DOMEventTargetHelper
{
public:
class Inner
{
public:
NS_INLINE_DECL_PURE_VIRTUAL_REFCOUNTING
virtual void
SetServiceWorkerRegistration(ServiceWorkerRegistration* aReg) = 0;
virtual void
ClearServiceWorkerRegistration(ServiceWorkerRegistration* aReg) = 0;
virtual already_AddRefed<Promise>
Update(ErrorResult& aRv) = 0;
virtual already_AddRefed<Promise>
Unregister(ErrorResult& aRv) = 0;
virtual already_AddRefed<Promise>
ShowNotification(JSContext* aCx,
const nsAString& aTitle,
const NotificationOptions& aOptions,
ErrorResult& aRv) = 0;
virtual already_AddRefed<Promise>
GetNotifications(const GetNotificationOptions& aOptions,
ErrorResult& aRv) = 0;
virtual already_AddRefed<PushManager>
GetPushManager(JSContext* aCx, ErrorResult& aRv) = 0;
};
NS_DECL_ISUPPORTS_INHERITED
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(ServiceWorkerRegistration, DOMEventTargetHelper)
IMPL_EVENT_HANDLER(updatefound)
@ -44,6 +76,8 @@ public:
JSObject*
WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
void DisconnectFromOwner() override;
already_AddRefed<ServiceWorker>
GetInstalling() const;
@ -65,36 +99,38 @@ public:
ServiceWorkerUpdateViaCache
GetUpdateViaCache(ErrorResult& aRv) const;
virtual already_AddRefed<Promise>
Update(ErrorResult& aRv) = 0;
already_AddRefed<Promise>
Update(ErrorResult& aRv);
virtual already_AddRefed<Promise>
Unregister(ErrorResult& aRv) = 0;
already_AddRefed<Promise>
Unregister(ErrorResult& aRv);
virtual already_AddRefed<PushManager>
GetPushManager(JSContext* aCx, ErrorResult& aRv) = 0;
already_AddRefed<PushManager>
GetPushManager(JSContext* aCx, ErrorResult& aRv);
virtual already_AddRefed<Promise>
already_AddRefed<Promise>
ShowNotification(JSContext* aCx,
const nsAString& aTitle,
const NotificationOptions& aOptions,
ErrorResult& aRv) = 0;
ErrorResult& aRv);
virtual already_AddRefed<Promise>
already_AddRefed<Promise>
GetNotifications(const GetNotificationOptions& aOptions,
ErrorResult& aRv) = 0;
ErrorResult& aRv);
protected:
ServiceWorkerRegistration(nsPIDOMWindowInner* aWindow,
const ServiceWorkerRegistrationDescriptor& aDescriptor);
private:
ServiceWorkerRegistration(nsIGlobalObject* aGlobal,
const ServiceWorkerRegistrationDescriptor& aDescriptor,
Inner* aInner);
virtual ~ServiceWorkerRegistration()
{ }
~ServiceWorkerRegistration();
ServiceWorkerRegistrationDescriptor mDescriptor;
RefPtr<Inner> mInner;
RefPtr<ServiceWorker> mInstallingWorker;
RefPtr<ServiceWorker> mWaitingWorker;
RefPtr<ServiceWorker> mActiveWorker;
RefPtr<PushManager> mPushManager;
};

View File

@ -39,33 +39,18 @@ namespace dom {
////////////////////////////////////////////////////
// Main Thread implementation
NS_IMPL_ADDREF_INHERITED(ServiceWorkerRegistrationMainThread, ServiceWorkerRegistration)
NS_IMPL_RELEASE_INHERITED(ServiceWorkerRegistrationMainThread, ServiceWorkerRegistration)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(ServiceWorkerRegistrationMainThread)
NS_INTERFACE_MAP_END_INHERITING(ServiceWorkerRegistration)
NS_IMPL_CYCLE_COLLECTION_INHERITED(ServiceWorkerRegistrationMainThread,
ServiceWorkerRegistration,
mPushManager,
mInstallingWorker, mWaitingWorker, mActiveWorker);
ServiceWorkerRegistrationMainThread::ServiceWorkerRegistrationMainThread(nsPIDOMWindowInner* aWindow,
const ServiceWorkerRegistrationDescriptor& aDescriptor)
: ServiceWorkerRegistration(aWindow, aDescriptor)
ServiceWorkerRegistrationMainThread::ServiceWorkerRegistrationMainThread(const ServiceWorkerRegistrationDescriptor& aDescriptor)
: mOuter(nullptr)
, mScope(NS_ConvertUTF8toUTF16(aDescriptor.Scope()))
, mListeningForEvents(false)
{
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(aWindow);
UpdateState(aDescriptor);
StartListeningForEvents();
}
ServiceWorkerRegistrationMainThread::~ServiceWorkerRegistrationMainThread()
{
StopListeningForEvents();
MOZ_ASSERT(!mListeningForEvents);
MOZ_DIAGNOSTIC_ASSERT(!mListeningForEvents);
MOZ_DIAGNOSTIC_ASSERT(!mOuter);
}
// XXXnsm, maybe this can be optimized to only add when a event handler is
@ -100,13 +85,13 @@ ServiceWorkerRegistrationMainThread::StopListeningForEvents()
void
ServiceWorkerRegistrationMainThread::UpdateFound()
{
DispatchTrustedEvent(NS_LITERAL_STRING("updatefound"));
mOuter->DispatchTrustedEvent(NS_LITERAL_STRING("updatefound"));
}
void
ServiceWorkerRegistrationMainThread::UpdateState(const ServiceWorkerRegistrationDescriptor& aDescriptor)
{
ServiceWorkerRegistration::UpdateState(aDescriptor);
mOuter->UpdateState(aDescriptor);
}
void
@ -115,7 +100,7 @@ ServiceWorkerRegistrationMainThread::RegistrationRemoved()
// If the registration is being removed completely, remove it from the
// window registration hash table so that a new registration would get a new
// wrapper JS object.
if (nsCOMPtr<nsPIDOMWindowInner> window = GetOwner()) {
if (nsCOMPtr<nsPIDOMWindowInner> window = mOuter->GetOwner()) {
window->InvalidateServiceWorkerRegistration(mScope);
}
}
@ -123,7 +108,25 @@ ServiceWorkerRegistrationMainThread::RegistrationRemoved()
bool
ServiceWorkerRegistrationMainThread::MatchesDescriptor(const ServiceWorkerRegistrationDescriptor& aDescriptor)
{
return ServiceWorkerRegistration::MatchesDescriptor(aDescriptor);
return mOuter->MatchesDescriptor(aDescriptor);
}
void
ServiceWorkerRegistrationMainThread::SetServiceWorkerRegistration(ServiceWorkerRegistration* aReg)
{
MOZ_DIAGNOSTIC_ASSERT(aReg);
MOZ_DIAGNOSTIC_ASSERT(!mOuter);
mOuter = aReg;
StartListeningForEvents();
}
void
ServiceWorkerRegistrationMainThread::ClearServiceWorkerRegistration(ServiceWorkerRegistration* aReg)
{
MOZ_DIAGNOSTIC_ASSERT(mOuter);
MOZ_DIAGNOSTIC_ASSERT(mOuter == aReg);
StopListeningForEvents();
mOuter = nullptr;
}
namespace {
@ -514,7 +517,7 @@ already_AddRefed<Promise>
ServiceWorkerRegistrationMainThread::Update(ErrorResult& aRv)
{
MOZ_ASSERT(NS_IsMainThread());
nsCOMPtr<nsIGlobalObject> go = do_QueryInterface(GetOwner());
nsCOMPtr<nsIGlobalObject> go = do_QueryInterface(mOuter->GetOwner());
if (!go) {
aRv.Throw(NS_ERROR_FAILURE);
return nullptr;
@ -525,11 +528,11 @@ ServiceWorkerRegistrationMainThread::Update(ErrorResult& aRv)
return nullptr;
}
nsCOMPtr<nsIDocument> doc = GetOwner()->GetExtantDoc();
nsCOMPtr<nsIDocument> doc = mOuter->GetOwner()->GetExtantDoc();
MOZ_ASSERT(doc);
RefPtr<MainThreadUpdateCallback> cb =
new MainThreadUpdateCallback(GetOwner(), promise);
new MainThreadUpdateCallback(mOuter->GetOwner(), promise);
UpdateInternal(doc->NodePrincipal(), mScope, cb);
return promise.forget();
@ -539,7 +542,7 @@ already_AddRefed<Promise>
ServiceWorkerRegistrationMainThread::Unregister(ErrorResult& aRv)
{
MOZ_ASSERT(NS_IsMainThread());
nsCOMPtr<nsIGlobalObject> go = do_QueryInterface(GetOwner());
nsCOMPtr<nsIGlobalObject> go = do_QueryInterface(mOuter->GetOwner());
if (!go) {
aRv.Throw(NS_ERROR_FAILURE);
return nullptr;
@ -550,7 +553,7 @@ ServiceWorkerRegistrationMainThread::Unregister(ErrorResult& aRv)
// WebIDL infrastructure due to a returned error will be resolved
// asynchronously. We aren't making any internal state changes in these
// checks, so ordering of multiple calls is not affected.
nsCOMPtr<nsIDocument> document = GetOwner()->GetExtantDoc();
nsCOMPtr<nsIDocument> document = mOuter->GetOwner()->GetExtantDoc();
if (!document) {
aRv.Throw(NS_ERROR_FAILURE);
return nullptr;
@ -587,7 +590,7 @@ ServiceWorkerRegistrationMainThread::Unregister(ErrorResult& aRv)
return nullptr;
}
RefPtr<UnregisterCallback> cb = new UnregisterCallback(GetOwner(), promise);
RefPtr<UnregisterCallback> cb = new UnregisterCallback(mOuter->GetOwner(), promise);
NS_ConvertUTF8toUTF16 scope(uriSpec);
aRv = swm->Unregister(documentPrincipal, cb, scope);
@ -606,7 +609,7 @@ ServiceWorkerRegistrationMainThread::ShowNotification(JSContext* aCx,
ErrorResult& aRv)
{
MOZ_ASSERT(NS_IsMainThread());
nsCOMPtr<nsPIDOMWindowInner> window = GetOwner();
nsCOMPtr<nsPIDOMWindowInner> window = mOuter->GetOwner();
if (NS_WARN_IF(!window)) {
aRv.Throw(NS_ERROR_FAILURE);
return nullptr;
@ -618,7 +621,7 @@ ServiceWorkerRegistrationMainThread::ShowNotification(JSContext* aCx,
return nullptr;
}
RefPtr<ServiceWorker> worker = GetActive();
RefPtr<ServiceWorker> worker = mOuter->GetActive();
if (!worker) {
aRv.ThrowTypeError<MSG_NO_ACTIVE_WORKER>(mScope);
return nullptr;
@ -639,7 +642,7 @@ already_AddRefed<Promise>
ServiceWorkerRegistrationMainThread::GetNotifications(const GetNotificationOptions& aOptions, ErrorResult& aRv)
{
MOZ_ASSERT(NS_IsMainThread());
nsCOMPtr<nsPIDOMWindowInner> window = GetOwner();
nsCOMPtr<nsPIDOMWindowInner> window = mOuter->GetOwner();
if (NS_WARN_IF(!window)) {
aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
return nullptr;
@ -653,22 +656,19 @@ ServiceWorkerRegistrationMainThread::GetPushManager(JSContext* aCx,
{
MOZ_ASSERT(NS_IsMainThread());
if (!mPushManager) {
nsCOMPtr<nsIGlobalObject> globalObject = do_QueryInterface(GetOwner());
nsCOMPtr<nsIGlobalObject> globalObject = do_QueryInterface(mOuter->GetOwner());
if (!globalObject) {
aRv.Throw(NS_ERROR_FAILURE);
return nullptr;
}
GlobalObject global(aCx, globalObject->GetGlobalJSObject());
mPushManager = PushManager::Constructor(global, mScope, aRv);
if (aRv.Failed()) {
return nullptr;
}
if (!globalObject) {
aRv.Throw(NS_ERROR_FAILURE);
return nullptr;
}
GlobalObject global(aCx, globalObject->GetGlobalJSObject());
RefPtr<PushManager> ret = PushManager::Constructor(global, mScope, aRv);
if (aRv.Failed()) {
return nullptr;
}
RefPtr<PushManager> ret = mPushManager;
return ret.forget();
}
@ -679,7 +679,7 @@ class WorkerListener final : public ServiceWorkerRegistrationListener
{
// Accessed on the main thread.
WorkerPrivate* mWorkerPrivate;
nsString mScope;
const nsString mScope;
bool mListeningForEvents;
// Accessed on the worker thread.
@ -689,16 +689,16 @@ public:
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(WorkerListener, override)
WorkerListener(WorkerPrivate* aWorkerPrivate,
ServiceWorkerRegistrationWorkerThread* aReg)
ServiceWorkerRegistrationWorkerThread* aReg,
const nsAString& aScope)
: mWorkerPrivate(aWorkerPrivate)
, mScope(aScope)
, mListeningForEvents(false)
, mRegistration(aReg)
{
MOZ_ASSERT(mWorkerPrivate);
mWorkerPrivate->AssertIsOnWorkerThread();
MOZ_ASSERT(mRegistration);
// Copy scope so we can return it on the main thread.
mRegistration->GetScope(mScope);
}
void
@ -790,41 +790,37 @@ private:
}
};
NS_IMPL_ADDREF_INHERITED(ServiceWorkerRegistrationWorkerThread, ServiceWorkerRegistration)
NS_IMPL_RELEASE_INHERITED(ServiceWorkerRegistrationWorkerThread, ServiceWorkerRegistration)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(ServiceWorkerRegistrationWorkerThread)
NS_INTERFACE_MAP_END_INHERITING(ServiceWorkerRegistration)
// Expanded macros since we need special behaviour to release the proxy.
NS_IMPL_CYCLE_COLLECTION_CLASS(ServiceWorkerRegistrationWorkerThread)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(ServiceWorkerRegistrationWorkerThread,
ServiceWorkerRegistration)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mPushManager)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(ServiceWorkerRegistrationWorkerThread,
ServiceWorkerRegistration)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mPushManager)
tmp->ReleaseListener();
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
ServiceWorkerRegistrationWorkerThread::ServiceWorkerRegistrationWorkerThread(WorkerPrivate* aWorkerPrivate,
const ServiceWorkerRegistrationDescriptor& aDescriptor)
: ServiceWorkerRegistration(nullptr, aDescriptor)
, WorkerHolder("ServiceWorkerRegistrationWorkerThread")
: WorkerHolder("ServiceWorkerRegistrationWorkerThread")
, mOuter(nullptr)
, mWorkerPrivate(aWorkerPrivate)
, mScope(NS_ConvertUTF8toUTF16(aDescriptor.Scope()))
{
InitListener();
}
ServiceWorkerRegistrationWorkerThread::~ServiceWorkerRegistrationWorkerThread()
{
MOZ_DIAGNOSTIC_ASSERT(!mListener);
MOZ_DIAGNOSTIC_ASSERT(!mOuter);
}
void
ServiceWorkerRegistrationWorkerThread::SetServiceWorkerRegistration(ServiceWorkerRegistration* aReg)
{
MOZ_DIAGNOSTIC_ASSERT(aReg);
MOZ_DIAGNOSTIC_ASSERT(!mOuter);
mOuter = aReg;
InitListener();
}
void
ServiceWorkerRegistrationWorkerThread::ClearServiceWorkerRegistration(ServiceWorkerRegistration* aReg)
{
MOZ_DIAGNOSTIC_ASSERT(mOuter);
MOZ_DIAGNOSTIC_ASSERT(mOuter == aReg);
ReleaseListener();
MOZ_ASSERT(!mListener);
mOuter = nullptr;
}
already_AddRefed<Promise>
@ -899,7 +895,7 @@ ServiceWorkerRegistrationWorkerThread::InitListener()
MOZ_ASSERT(worker);
worker->AssertIsOnWorkerThread();
mListener = new WorkerListener(worker, this);
mListener = new WorkerListener(worker, this, mScope);
if (!HoldWorker(worker, Closing)) {
mListener = nullptr;
NS_WARNING("Could not add feature");
@ -970,7 +966,7 @@ public:
ServiceWorkerRegistrationWorkerThread* reg = mListener->GetRegistration();
if (reg) {
reg->DispatchTrustedEvent(NS_LITERAL_STRING("updatefound"));
reg->UpdateFound();
}
return true;
}
@ -1019,13 +1015,15 @@ ServiceWorkerRegistrationWorkerThread::GetNotifications(const GetNotificationOpt
already_AddRefed<PushManager>
ServiceWorkerRegistrationWorkerThread::GetPushManager(JSContext* aCx, ErrorResult& aRv)
{
if (!mPushManager) {
mPushManager = new PushManager(mScope);
}
RefPtr<PushManager> ret = mPushManager;
RefPtr<PushManager> ret = new PushManager(mScope);
return ret.forget();
}
void
ServiceWorkerRegistrationWorkerThread::UpdateFound()
{
mOuter->DispatchTrustedEvent(NS_LITERAL_STRING("updatefound"));
}
} // dom namespace
} // mozilla namespace

View File

@ -23,17 +23,20 @@ class ServiceWorker;
////////////////////////////////////////////////////
// Main Thread implementation
class ServiceWorkerRegistrationMainThread final : public ServiceWorkerRegistration,
public ServiceWorkerRegistrationListener
class ServiceWorkerRegistrationMainThread final : public ServiceWorkerRegistration::Inner
, public ServiceWorkerRegistrationListener
{
friend nsPIDOMWindowInner;
public:
NS_DECL_ISUPPORTS_INHERITED
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(ServiceWorkerRegistrationMainThread,
ServiceWorkerRegistration)
NS_INLINE_DECL_REFCOUNTING(ServiceWorkerRegistrationMainThread, override)
ServiceWorkerRegistrationMainThread(nsPIDOMWindowInner* aWindow,
const ServiceWorkerRegistrationDescriptor& aDescriptor);
explicit ServiceWorkerRegistrationMainThread(const ServiceWorkerRegistrationDescriptor& aDescriptor);
// ServiceWorkerRegistration::Inner
void
SetServiceWorkerRegistration(ServiceWorkerRegistration* aReg) override;
void
ClearServiceWorkerRegistration(ServiceWorkerRegistration* aReg) override;
already_AddRefed<Promise>
Update(ErrorResult& aRv) override;
@ -41,7 +44,6 @@ public:
already_AddRefed<Promise>
Unregister(ErrorResult& aRv) override;
// Partial interface from Notification API.
already_AddRefed<Promise>
ShowNotification(JSContext* aCx,
const nsAString& aTitle,
@ -55,13 +57,6 @@ public:
already_AddRefed<PushManager>
GetPushManager(JSContext* aCx, ErrorResult& aRv) override;
// DOMEventTargethelper
void DisconnectFromOwner() override
{
StopListeningForEvents();
ServiceWorkerRegistration::DisconnectFromOwner();
}
// ServiceWorkerRegistrationListener
void
UpdateFound() override;
@ -90,10 +85,9 @@ private:
void
StopListeningForEvents();
ServiceWorkerRegistration* mOuter;
const nsString mScope;
bool mListeningForEvents;
RefPtr<PushManager> mPushManager;
};
////////////////////////////////////////////////////
@ -101,24 +95,28 @@ private:
class WorkerListener;
class ServiceWorkerRegistrationWorkerThread final : public ServiceWorkerRegistration
class ServiceWorkerRegistrationWorkerThread final : public ServiceWorkerRegistration::Inner
, public WorkerHolder
{
public:
NS_DECL_ISUPPORTS_INHERITED
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(ServiceWorkerRegistrationWorkerThread,
ServiceWorkerRegistration)
NS_INLINE_DECL_REFCOUNTING(ServiceWorkerRegistrationWorkerThread, override)
ServiceWorkerRegistrationWorkerThread(WorkerPrivate* aWorkerPrivate,
const ServiceWorkerRegistrationDescriptor& aDescriptor);
// ServiceWorkerRegistration::Inner
void
SetServiceWorkerRegistration(ServiceWorkerRegistration* aReg) override;
void
ClearServiceWorkerRegistration(ServiceWorkerRegistration* aReg) override;
already_AddRefed<Promise>
Update(ErrorResult& aRv) override;
already_AddRefed<Promise>
Unregister(ErrorResult& aRv) override;
// Partial interface from Notification API.
already_AddRefed<Promise>
ShowNotification(JSContext* aCx,
const nsAString& aTitle,
@ -129,11 +127,15 @@ public:
GetNotifications(const GetNotificationOptions& aOptions,
ErrorResult& aRv) override;
already_AddRefed<PushManager>
GetPushManager(JSContext* aCx, ErrorResult& aRv) override;
// WorkerHolder
bool
Notify(WorkerStatus aStatus) override;
already_AddRefed<PushManager>
GetPushManager(JSContext* aCx, ErrorResult& aRv) override;
void
UpdateFound();
private:
~ServiceWorkerRegistrationWorkerThread();
@ -144,11 +146,10 @@ private:
void
ReleaseListener();
ServiceWorkerRegistration* mOuter;
WorkerPrivate* mWorkerPrivate;
const nsString mScope;
RefPtr<WorkerListener> mListener;
RefPtr<PushManager> mPushManager;
};
} // dom namespace