static bool SendAsyncMessageToParent(void* aCallbackData, const nsAString& aMessage, const StructuredCloneData& aData) { TabChild* tabChild = static_cast<TabChild*>(aCallbackData); ContentChild* cc = static_cast<ContentChild*>(tabChild->Manager()); ClonedMessageData data; SerializedStructuredCloneBuffer& buffer = data.data(); buffer.data = aData.mData; buffer.dataLength = aData.mDataLength; const nsTArray<nsCOMPtr<nsIDOMBlob> >& blobs = aData.mClosure.mBlobs; if (!blobs.IsEmpty()) { InfallibleTArray<PBlobChild*>& blobChildList = data.blobsChild(); PRUint32 length = blobs.Length(); blobChildList.SetCapacity(length); for (PRUint32 i = 0; i < length; ++i) { BlobChild* blobChild = cc->GetOrCreateActorForBlob(blobs[i]); if (!blobChild) { return false; } blobChildList.AppendElement(blobChild); } } return tabChild->SendAsyncMessage(nsString(aMessage), data); }
nsresult nsDragServiceProxy::InvokeDragSessionImpl(nsIArray* aArrayTransferables, nsIScriptableRegion* aRegion, uint32_t aActionType) { nsCOMPtr<nsIDocument> doc = do_QueryInterface(mSourceDocument); NS_ENSURE_STATE(doc->GetDocShell()); TabChild* child = TabChild::GetFrom(doc->GetDocShell()); NS_ENSURE_STATE(child); nsTArray<mozilla::dom::IPCDataTransfer> dataTransfers; nsContentUtils::TransferablesToIPCTransferables(aArrayTransferables, dataTransfers, false, child->Manager(), nullptr); LayoutDeviceIntRect dragRect; if (mHasImage || mSelection) { nsPresContext* pc; RefPtr<mozilla::gfx::SourceSurface> surface; DrawDrag(mSourceNode, aRegion, mScreenPosition, &dragRect, &surface, &pc); if (surface) { RefPtr<mozilla::gfx::DataSourceSurface> dataSurface = surface->GetDataSurface(); if (dataSurface) { size_t length; int32_t stride; Shmem surfaceData; nsContentUtils::GetSurfaceData(dataSurface, &length, &stride, child, &surfaceData); // Save the surface data to shared memory. if (!surfaceData.IsReadable() || !surfaceData.get<char>()) { NS_WARNING("Failed to create shared memory for drag session."); return NS_ERROR_FAILURE; } mozilla::Unused << child->SendInvokeDragSession(dataTransfers, aActionType, surfaceData, stride, static_cast<uint8_t>(dataSurface->GetFormat()), dragRect); StartDragSession(); return NS_OK; } } } mozilla::Unused << child->SendInvokeDragSession(dataTransfers, aActionType, mozilla::void_t(), 0, 0, dragRect); StartDragSession(); return NS_OK; }