ServiceWorkerContainerChild.cpp (2086B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #include "ServiceWorkerContainerChild.h" 8 9 #include "ServiceWorkerContainer.h" 10 #include "mozilla/dom/PServiceWorkerContainerChild.h" 11 #include "mozilla/dom/WorkerCommon.h" 12 #include "mozilla/dom/WorkerRef.h" 13 14 namespace mozilla::dom { 15 16 void ServiceWorkerContainerChild::ActorDestroy(ActorDestroyReason aReason) { 17 mIPCWorkerRef = nullptr; 18 19 if (mOwner) { 20 mOwner->RevokeActor(this); 21 MOZ_DIAGNOSTIC_ASSERT(!mOwner); 22 } 23 } 24 25 // static 26 already_AddRefed<ServiceWorkerContainerChild> 27 ServiceWorkerContainerChild::Create() { 28 RefPtr actor = new ServiceWorkerContainerChild; 29 30 if (!NS_IsMainThread()) { 31 WorkerPrivate* workerPrivate = GetCurrentThreadWorkerPrivate(); 32 MOZ_DIAGNOSTIC_ASSERT(workerPrivate); 33 34 RefPtr<IPCWorkerRefHelper<ServiceWorkerContainerChild>> helper = 35 new IPCWorkerRefHelper<ServiceWorkerContainerChild>(actor); 36 37 actor->mIPCWorkerRef = IPCWorkerRef::Create( 38 workerPrivate, "ServiceWorkerContainerChild", 39 [helper] { helper->Actor()->MaybeStartTeardown(); }); 40 if (NS_WARN_IF(!actor->mIPCWorkerRef)) { 41 return nullptr; 42 } 43 } 44 45 return actor.forget(); 46 } 47 48 ServiceWorkerContainerChild::ServiceWorkerContainerChild() 49 : mOwner(nullptr), mTeardownStarted(false) {} 50 51 void ServiceWorkerContainerChild::SetOwner(ServiceWorkerContainer* aOwner) { 52 MOZ_DIAGNOSTIC_ASSERT(!mOwner); 53 MOZ_DIAGNOSTIC_ASSERT(aOwner); 54 mOwner = aOwner; 55 } 56 57 void ServiceWorkerContainerChild::RevokeOwner(ServiceWorkerContainer* aOwner) { 58 MOZ_DIAGNOSTIC_ASSERT(mOwner); 59 MOZ_DIAGNOSTIC_ASSERT(aOwner == mOwner); 60 mOwner = nullptr; 61 } 62 63 void ServiceWorkerContainerChild::MaybeStartTeardown() { 64 if (mTeardownStarted) { 65 return; 66 } 67 mTeardownStarted = true; 68 Send__delete__(this); 69 } 70 71 } // namespace mozilla::dom