void BroadcastChannel::ActorCreated(PBackgroundChild* aActor) { MOZ_ASSERT(aActor); if (mState == StateClosed) { return; } PBroadcastChannelChild* actor = aActor->SendPBroadcastChannelConstructor(*mPrincipalInfo, mOrigin, mChannel, mPrivateBrowsing); mActor = static_cast<BroadcastChannelChild*>(actor); MOZ_ASSERT(mActor); mActor->SetParent(this); // Flush pending messages. for (uint32_t i = 0; i < mPendingMessages.Length(); ++i) { PostMessageData(mPendingMessages[i]); } mPendingMessages.Clear(); if (mState == StateClosing) { Shutdown(); } }
void BroadcastChannel::PostMessageInternal(JSContext* aCx, JS::Handle<JS::Value> aMessage, ErrorResult& aRv) { RefPtr<BroadcastChannelMessage> data = new BroadcastChannelMessage(); data->Write(aCx, aMessage, aRv); if (NS_WARN_IF(aRv.Failed())) { return; } PostMessageData(data); }
void BroadcastChannel::PostMessageInternal(JSContext* aCx, JS::Handle<JS::Value> aMessage, ErrorResult& aRv) { nsRefPtr<BroadcastChannelMessage> data = new BroadcastChannelMessage(); if (!WriteStructuredClone(aCx, aMessage, data->mBuffer, data->mClosure)) { aRv.Throw(NS_ERROR_DOM_DATA_CLONE_ERR); return; } const nsTArray<nsRefPtr<File>>& blobs = data->mClosure.mBlobs; for (uint32_t i = 0, len = blobs.Length(); i < len; ++i) { if (!blobs[i]->Impl()->MayBeClonedToOtherThreads()) { aRv.Throw(NS_ERROR_DOM_DATA_CLONE_ERR); return; } } PostMessageData(data); }