RemoteWorkerControllerChild.cpp (3903B)
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 "RemoteWorkerControllerChild.h" 8 9 #include <utility> 10 11 #include "MainThreadUtils.h" 12 #include "ServiceWorkerPrivate.h" 13 #include "mozilla/Assertions.h" 14 #include "mozilla/RefPtr.h" 15 #include "mozilla/dom/PFetchEventOpChild.h" 16 #include "nsError.h" 17 #include "nsThreadUtils.h" 18 19 namespace mozilla { 20 21 using ipc::IPCResult; 22 23 namespace dom { 24 25 RemoteWorkerControllerChild::RemoteWorkerControllerChild( 26 RefPtr<RemoteWorkerObserver> aObserver) 27 : mObserver(std::move(aObserver)) { 28 AssertIsOnMainThread(); 29 mRemoteWorkerLaunchStart = TimeStamp::Now(); 30 MOZ_ASSERT(mObserver); 31 } 32 33 PFetchEventOpChild* RemoteWorkerControllerChild::AllocPFetchEventOpChild( 34 const ParentToParentServiceWorkerFetchEventOpArgs& aArgs) { 35 MOZ_CRASH("PFetchEventOpChild actors must be manually constructed!"); 36 return nullptr; 37 } 38 39 TimeStamp RemoteWorkerControllerChild::GetRemoteWorkerLaunchStart() { 40 MOZ_ASSERT(mRemoteWorkerLaunchStart); 41 return mRemoteWorkerLaunchStart; 42 } 43 44 TimeStamp RemoteWorkerControllerChild::GetRemoteWorkerLaunchEnd() { 45 MOZ_ASSERT(mRemoteWorkerLaunchEnd); 46 return mRemoteWorkerLaunchEnd; 47 } 48 49 bool RemoteWorkerControllerChild::DeallocPFetchEventOpChild( 50 PFetchEventOpChild* aActor) { 51 AssertIsOnMainThread(); 52 MOZ_ASSERT(aActor); 53 54 delete aActor; 55 return true; 56 } 57 58 void RemoteWorkerControllerChild::ActorDestroy(ActorDestroyReason aReason) { 59 AssertIsOnMainThread(); 60 61 mIPCActive = false; 62 63 if (NS_WARN_IF(mObserver)) { 64 mObserver->ErrorReceived(NS_ERROR_DOM_ABORT_ERR); 65 } 66 } 67 68 IPCResult RemoteWorkerControllerChild::RecvCreationFailed() { 69 AssertIsOnMainThread(); 70 71 if (mObserver) { 72 mObserver->CreationFailed(); 73 } 74 75 return IPC_OK(); 76 } 77 78 IPCResult RemoteWorkerControllerChild::RecvCreationSucceeded() { 79 AssertIsOnMainThread(); 80 mRemoteWorkerLaunchEnd = TimeStamp::Now(); 81 82 if (mObserver) { 83 mObserver->CreationSucceeded(); 84 } 85 86 return IPC_OK(); 87 } 88 89 IPCResult RemoteWorkerControllerChild::RecvErrorReceived( 90 const ErrorValue& aError) { 91 AssertIsOnMainThread(); 92 mRemoteWorkerLaunchEnd = TimeStamp::Now(); 93 94 if (mObserver) { 95 mObserver->ErrorReceived(aError); 96 } 97 98 return IPC_OK(); 99 } 100 101 IPCResult RemoteWorkerControllerChild::RecvTerminated() { 102 AssertIsOnMainThread(); 103 104 if (mObserver) { 105 mObserver->Terminated(); 106 } 107 108 return IPC_OK(); 109 } 110 111 IPCResult RemoteWorkerControllerChild::RecvSetServiceWorkerSkipWaitingFlag( 112 SetServiceWorkerSkipWaitingFlagResolver&& aResolve) { 113 AssertIsOnMainThread(); 114 115 if (mObserver) { 116 static_cast<ServiceWorkerPrivate*>(mObserver.get()) 117 ->SetSkipWaitingFlag() 118 ->Then(GetCurrentSerialEventTarget(), __func__, 119 [resolve = std::move(aResolve)]( 120 const GenericPromise::ResolveOrRejectValue& aResult) { 121 resolve(aResult.IsResolve() ? aResult.ResolveValue() : false); 122 }); 123 124 return IPC_OK(); 125 } 126 127 aResolve(false); 128 129 return IPC_OK(); 130 } 131 132 void RemoteWorkerControllerChild::RevokeObserver( 133 RemoteWorkerObserver* aObserver) { 134 AssertIsOnMainThread(); 135 MOZ_ASSERT(aObserver); 136 MOZ_ASSERT(aObserver == mObserver); 137 138 mObserver = nullptr; 139 } 140 141 void RemoteWorkerControllerChild::MaybeSendDelete() { 142 AssertIsOnMainThread(); 143 144 if (!mIPCActive) { 145 return; 146 } 147 148 RefPtr<RemoteWorkerControllerChild> self = this; 149 150 SendShutdown()->Then( 151 GetCurrentSerialEventTarget(), __func__, 152 [self = std::move(self)](const ShutdownPromise::ResolveOrRejectValue&) { 153 if (self->mIPCActive) { 154 (void)self->Send__delete__(self); 155 } 156 }); 157 } 158 159 } // namespace dom 160 } // namespace mozilla