RefPtr<GenericPromise> ClientHandle::PostMessage(StructuredCloneData& aData, const ServiceWorkerDescriptor& aSource) { RefPtr<GenericPromise> ref; if (IsShutdown()) { ref = GenericPromise::CreateAndReject(NS_ERROR_DOM_INVALID_STATE_ERR, __func__); return ref.forget(); } ClientPostMessageArgs args; args.serviceWorker() = aSource.ToIPC(); if (!aData.BuildClonedMessageDataForBackgroundChild(GetActor()->Manager()->Manager(), args.clonedData())) { ref = GenericPromise::CreateAndReject(NS_ERROR_DOM_INVALID_STATE_ERR, __func__); return ref.forget(); } RefPtr<GenericPromise::Private> outerPromise = new GenericPromise::Private(__func__); StartOp(args, [outerPromise](const ClientOpResult& aResult) { outerPromise->Resolve(true, __func__); }, [outerPromise](const ClientOpResult& aResult) { outerPromise->Reject(aResult.get_nsresult(), __func__); }); ref = outerPromise.get(); return ref.forget(); }
RefPtr<GenericPromise> ClientHandle::Control(const ServiceWorkerDescriptor& aServiceWorker) { RefPtr<GenericPromise::Private> outerPromise = new GenericPromise::Private(__func__); // We should never have a cross-origin controller. Since this would be // same-origin policy violation we do a full release assertion here. MOZ_RELEASE_ASSERT(ClientMatchPrincipalInfo(mClientInfo.PrincipalInfo(), aServiceWorker.PrincipalInfo())); StartOp(ClientControlledArgs(aServiceWorker.ToIPC()), [outerPromise](const ClientOpResult& aResult) { outerPromise->Resolve(true, __func__); }, [outerPromise](const ClientOpResult& aResult) { outerPromise->Reject(aResult.get_nsresult(), __func__); }); return outerPromise.forget(); }
RemoteServiceWorkerImpl::RemoteServiceWorkerImpl( const ServiceWorkerDescriptor& aDescriptor) : mActor(nullptr), mWorker(nullptr), mShutdown(false) { PBackgroundChild* parentActor = BackgroundChild::GetOrCreateForCurrentThread(); if (NS_WARN_IF(!parentActor)) { Shutdown(); return; } RefPtr<WorkerHolderToken> workerHolderToken; if (!NS_IsMainThread()) { WorkerPrivate* workerPrivate = GetCurrentThreadWorkerPrivate(); MOZ_DIAGNOSTIC_ASSERT(workerPrivate); workerHolderToken = WorkerHolderToken::Create( workerPrivate, Canceling, WorkerHolderToken::AllowIdleShutdownStart); if (NS_WARN_IF(!workerHolderToken)) { Shutdown(); return; } } ServiceWorkerChild* actor = new ServiceWorkerChild(workerHolderToken); PServiceWorkerChild* sentActor = parentActor->SendPServiceWorkerConstructor(actor, aDescriptor.ToIPC()); if (NS_WARN_IF(!sentActor)) { Shutdown(); return; } MOZ_DIAGNOSTIC_ASSERT(sentActor == actor); mActor = actor; mActor->SetOwner(this); }
bool ServiceWorkerDescriptor::Matches( const ServiceWorkerDescriptor& aDescriptor) const { return Id() == aDescriptor.Id() && Scope() == aDescriptor.Scope() && ScriptURL() == aDescriptor.ScriptURL() && PrincipalInfo() == aDescriptor.PrincipalInfo(); }