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(); }