bool TestTransferObject() { JS::RootedObject obj1(cx, CreateNewObject(8, 12)); CHECK(obj1); JS::RootedValue v1(cx, JS::ObjectValue(*obj1)); // Create an Array of transferable values. JS::AutoValueVector argv(cx); if (!argv.append(v1)) return false; JS::RootedObject obj(cx, JS_NewArrayObject(cx, JS::HandleValueArray::subarray(argv, 0, 1))); CHECK(obj); JS::RootedValue transferable(cx, JS::ObjectValue(*obj)); JSAutoStructuredCloneBuffer cloned_buffer(JS::StructuredCloneScope::SameProcessSameThread, nullptr, nullptr); CHECK(cloned_buffer.write(cx, v1, transferable, nullptr, nullptr)); JS::RootedValue v2(cx); CHECK(cloned_buffer.read(cx, &v2, nullptr, nullptr)); JS::RootedObject obj2(cx, v2.toObjectOrNull()); CHECK(VerifyObject(obj2, 8, 12, true)); CHECK(JS_IsDetachedArrayBufferObject(obj1)); return true; }
void Worker::PostMessage(JSContext* aCx, JS::Handle<JS::Value> aMessage, const Sequence<JSObject*>& aTransferable, ErrorResult& aRv) { NS_ASSERT_OWNINGTHREAD(Worker); if (!mWorkerPrivate || mWorkerPrivate->ParentStatusProtected() > Running) { return; } JS::Rooted<JS::Value> transferable(aCx, JS::UndefinedValue()); aRv = nsContentUtils::CreateJSValueFromSequenceOfObject(aCx, aTransferable, &transferable); if (NS_WARN_IF(aRv.Failed())) { return; } RefPtr<MessageEventRunnable> runnable = new MessageEventRunnable( mWorkerPrivate, WorkerRunnable::WorkerThreadModifyBusyCount); UniquePtr<AbstractTimelineMarker> start; UniquePtr<AbstractTimelineMarker> end; RefPtr<TimelineConsumers> timelines = TimelineConsumers::Get(); bool isTimelineRecording = timelines && !timelines->IsEmpty(); if (isTimelineRecording) { start = MakeUnique<WorkerTimelineMarker>( NS_IsMainThread() ? ProfileTimelineWorkerOperationType::SerializeDataOnMainThread : ProfileTimelineWorkerOperationType::SerializeDataOffMainThread, MarkerTracingType::START); } runnable->Write(aCx, aMessage, transferable, JS::CloneDataPolicy(), aRv); if (isTimelineRecording) { end = MakeUnique<WorkerTimelineMarker>( NS_IsMainThread() ? ProfileTimelineWorkerOperationType::SerializeDataOnMainThread : ProfileTimelineWorkerOperationType::SerializeDataOffMainThread, MarkerTracingType::END); timelines->AddMarkerForAllObservedDocShells(start); timelines->AddMarkerForAllObservedDocShells(end); } if (NS_WARN_IF(aRv.Failed())) { return; } if (!runnable->Dispatch()) { aRv.Throw(NS_ERROR_FAILURE); } }
NS_IMETHODIMP nsDragService::SetupDragSession( nsISupportsArray *aTransferables, PRUint32 aActionType) { PRUint32 itemCount = 0; aTransferables->Count(&itemCount); if (0 == itemCount) { qDebug("No items to drag?"); return NS_ERROR_FAILURE; } if (1 != itemCount) { qDebug("Dragging more than one item, cannot do (yet?)"); return NS_ERROR_NOT_IMPLEMENTED; } SetDropActionType(aActionType); QMimeData *mimeData = new QMimeData; nsCOMPtr<nsISupports> genericItem; aTransferables->GetElementAt(0, getter_AddRefs(genericItem)); nsCOMPtr<nsITransferable> transferable(do_QueryInterface(genericItem)); if (transferable) { nsCOMPtr <nsISupportsArray> flavorList; transferable->FlavorsTransferableCanExport(getter_AddRefs(flavorList)); if (flavorList) { PRUint32 flavorCount; flavorList->Count( &flavorCount ); for (PRUint32 flavor=0; flavor < flavorCount; flavor++) { nsCOMPtr<nsISupports> genericWrapper; flavorList->GetElementAt(flavor, getter_AddRefs(genericWrapper)); nsCOMPtr<nsISupportsCString> currentFlavor; currentFlavor = do_QueryInterface(genericWrapper); if (currentFlavor) { nsCOMPtr<nsISupports> data; PRUint32 dataLen = 0; nsXPIDLCString flavorStr; currentFlavor->ToString(getter_Copies(flavorStr)); // Is it some flavor we think we could support? if (!strcmp(kURLMime, flavorStr.get()) || !strcmp(kURLDataMime, flavorStr.get()) || !strcmp(kURLDescriptionMime, flavorStr.get()) || !strcmp(kHTMLMime, flavorStr.get()) || !strcmp(kUnicodeMime, flavorStr.get()) ) { transferable->GetTransferData(flavorStr,getter_AddRefs(data),&dataLen); nsCOMPtr<nsISupportsString> wideString; wideString = do_QueryInterface(data); if (!wideString) { return NS_ERROR_FAILURE; } nsAutoString utf16string; wideString->GetData(utf16string); QByteArray ba((const char*) utf16string.get(), dataLen); mimeData->setData(flavorStr.get(), ba); } } } } } mDrag = new QDrag( mHiddenWidget ); // TODO: Better drag source here? mDrag->setMimeData(mimeData); // mDrag and mimeData SHOULD NOT be destroyed. They are destroyed by QT. return NS_OK; }