mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-16 06:45:42 +00:00
Bug 1434701
P11 Make ServiceWorkerDescriptor use an Inner class with main and worker thread implementations. r=asuth
This commit is contained in:
parent
4d62353a57
commit
10ffbe18cd
@ -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
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user