/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "RemoteWorkerNonLifeCycleOpControllerChild.h" #include "mozilla/dom/ServiceWorkerOp.h" #include "mozilla/dom/SharedWorkerOp.h" #include "mozilla/dom/WorkerCommon.h" #include "mozilla/dom/WorkerPrivate.h" #include "mozilla/dom/WorkerRef.h" namespace mozilla::dom { using remoteworker::Canceled; using remoteworker::Killed; using remoteworker::Running; /* static */ RefPtr RemoteWorkerNonLifeCycleOpControllerChild::Create() { MOZ_ASSERT(!NS_IsMainThread()); MOZ_ASSERT(GetCurrentThreadWorkerPrivate()); RefPtr actor = MakeAndAddRef(); return actor; } RemoteWorkerNonLifeCycleOpControllerChild:: RemoteWorkerNonLifeCycleOpControllerChild() : mState(VariantType(), "RemoteWorkerNonLifeCycleOpControllerChild") {} RemoteWorkerNonLifeCycleOpControllerChild:: ~RemoteWorkerNonLifeCycleOpControllerChild() = default; void RemoteWorkerNonLifeCycleOpControllerChild::TransistionStateToCanceled() { auto lock = mState.Lock(); MOZ_ASSERT(lock->is()); *lock = VariantType(); } void RemoteWorkerNonLifeCycleOpControllerChild::TransistionStateToKilled() { auto lock = mState.Lock(); MOZ_ASSERT(lock->is()); *lock = VariantType(); if (!CanSend()) { return; } Unused << SendTerminated(); if (GetIPCChannel()) { GetIPCChannel()->Close(); } } void RemoteWorkerNonLifeCycleOpControllerChild::ErrorPropagation( nsresult aError) { if (!CanSend()) { return; } Unused << SendError(aError); } void RemoteWorkerNonLifeCycleOpControllerChild::StartOp( RefPtr&& aOp) { MOZ_ASSERT(aOp); auto lock = mState.Lock(); // ServiceWorkerOp/SharedWorkerOp handles the Canceled/Killed state cases. aOp->Start(this, lock.ref()); } IPCResult RemoteWorkerNonLifeCycleOpControllerChild::RecvExecOp( SharedWorkerOpArgs&& aOpArgs) { MOZ_ASSERT(aOpArgs.type() == SharedWorkerOpArgs::TSharedWorkerPortIdentifierOpArgs); StartOp(new SharedWorkerOp(std::move(aOpArgs))); return IPC_OK(); } IPCResult RemoteWorkerNonLifeCycleOpControllerChild::RecvExecServiceWorkerOp( ServiceWorkerOpArgs&& aOpArgs, ExecServiceWorkerOpResolver&& aResolve) { MOZ_ASSERT( aOpArgs.type() != ServiceWorkerOpArgs::TParentToChildServiceWorkerFetchEventOpArgs, "FetchEvent operations should be sent via PFetchEventOp(Proxy) actors!"); MOZ_ASSERT(aOpArgs.type() != ServiceWorkerOpArgs::TServiceWorkerTerminateWorkerOpArgs, "Terminate operations should be sent via PRemoteWorker actros!"); StartOp(ServiceWorkerOp::Create(std::move(aOpArgs), std::move(aResolve))); return IPC_OK(); } IPCResult RemoteWorkerNonLifeCycleOpControllerChild::RecvShutdown() { if (GetIPCChannel()) { GetIPCChannel()->Close(); } return IPC_OK(); } } // namespace mozilla::dom