IPCResult WindowGlobalChild::RecvAsyncMessage(const nsString& aActorName, const nsString& aMessageName, const ClonedMessageData& aData) { StructuredCloneData data; data.BorrowFromClonedMessageDataForChild(aData); HandleAsyncMessage(aActorName, aMessageName, data); return IPC_OK(); }
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(); }
bool StructuredCloneData::Copy(const StructuredCloneData& aData) { if (!aData.mData) { return true; } uint64_t* data = static_cast<uint64_t*>(js_malloc(aData.mDataLength)); if (!data) { return false; } memcpy(data, aData.mData, aData.mDataLength); mData = data; mDataLength = aData.mDataLength; mDataOwned = eJSAllocated; MOZ_ASSERT(BlobImpls().IsEmpty()); BlobImpls().AppendElements(aData.BlobImpls()); MOZ_ASSERT(GetImages().IsEmpty()); return true; }
bool StructuredCloneData::Copy(const StructuredCloneData& aData) { if (!aData.Data()) { return true; } if (aData.SharedData()) { mSharedData = aData.SharedData(); } else { mSharedData = SharedJSAllocatedData::CreateFromExternalData(aData.Data(), aData.DataLength()); NS_ENSURE_TRUE(mSharedData, false); } PortIdentifiers().AppendElements(aData.PortIdentifiers()); MOZ_ASSERT(BlobImpls().IsEmpty()); BlobImpls().AppendElements(aData.BlobImpls()); MOZ_ASSERT(GetSurfaces().IsEmpty()); return true; }
void WritableSharedMap::Set(JSContext* aCx, const nsACString& aName, JS::HandleValue aValue, ErrorResult& aRv) { StructuredCloneData holder; holder.Write(aCx, aValue, aRv); if (aRv.Failed()) { return; } if (!holder.InputStreams().IsEmpty()) { aRv.Throw(NS_ERROR_INVALID_ARG); return; } Entry* entry = mEntries.LookupOrAdd(aName, *this, aName); entry->TakeData(std::move(holder)); KeyChanged(aName); }