already_AddRefed<nsISupportsArray> DataTransfer::GetTransferables(nsIDOMNode* aDragTarget) { MOZ_ASSERT(aDragTarget); nsCOMPtr<nsISupportsArray> transArray = do_CreateInstance("@mozilla.org/supports-array;1"); if (!transArray) { return nullptr; } nsCOMPtr<nsINode> dragNode = do_QueryInterface(aDragTarget); if (!dragNode) { return nullptr; } nsIDocument* doc = dragNode->GetCurrentDoc(); if (!doc) { return nullptr; } nsILoadContext* loadContext = doc->GetLoadContext(); uint32_t count = mItems.Length(); for (uint32_t i = 0; i < count; i++) { nsCOMPtr<nsITransferable> transferable = GetTransferable(i, loadContext); if (transferable) { transArray->AppendElement(transferable); } } return transArray.forget(); }
already_AddRefed<nsIArray> DataTransfer::GetTransferables(nsILoadContext* aLoadContext) { nsCOMPtr<nsIMutableArray> transArray = nsArray::Create(); if (!transArray) { return nullptr; } uint32_t count = MozItemCount(); for (uint32_t i = 0; i < count; i++) { nsCOMPtr<nsITransferable> transferable = GetTransferable(i, aLoadContext); if (transferable) { transArray->AppendElement(transferable, /*weak =*/ false); } } return transArray.forget(); }
already_AddRefed<nsISupportsArray> DataTransfer::GetTransferables(nsILoadContext* aLoadContext) { nsCOMPtr<nsISupportsArray> transArray = do_CreateInstance("@mozilla.org/supports-array;1"); if (!transArray) { return nullptr; } uint32_t count = mItems.Length(); for (uint32_t i = 0; i < count; i++) { nsCOMPtr<nsITransferable> transferable = GetTransferable(i, aLoadContext); if (transferable) { transArray->AppendElement(transferable); } } return transArray.forget(); }
void nsClipboard::SelectionGetEvent (GtkWidget *aWidget, GtkSelectionData *aSelectionData, guint aTime) { // Someone has asked us to hand them something. The first thing // that we want to do is see if that something includes text. If // it does, try to give it text/unicode after converting it to // utf-8. PRInt32 whichClipboard; // which clipboard? if (aSelectionData->selection == GDK_SELECTION_PRIMARY) whichClipboard = kSelectionClipboard; else if (aSelectionData->selection == GDK_SELECTION_CLIPBOARD) whichClipboard = kGlobalClipboard; else return; // THAT AINT NO CLIPBOARD I EVER HEARD OF nsCOMPtr<nsITransferable> trans = GetTransferable(whichClipboard); nsresult rv; nsCOMPtr<nsISupports> item; PRUint32 len; // Check to see if the selection data includes any of the string // types that we support. if (aSelectionData->target == gdk_atom_intern ("STRING", FALSE) || aSelectionData->target == gdk_atom_intern ("TEXT", FALSE) || aSelectionData->target == gdk_atom_intern ("COMPOUND_TEXT", FALSE) || aSelectionData->target == gdk_atom_intern ("UTF8_STRING", FALSE)) { // Try to convert our internal type into a text string. Get // the transferable for this clipboard and try to get the // text/unicode type for it. rv = trans->GetTransferData("text/unicode", getter_AddRefs(item), &len); if (!item || NS_FAILED(rv)) return; nsCOMPtr<nsISupportsString> wideString; wideString = do_QueryInterface(item); if (!wideString) return; nsAutoString ucs2string; wideString->GetData(ucs2string); char *utf8string = ToNewUTF8String(ucs2string); if (!utf8string) return; gtk_selection_data_set_text (aSelectionData, utf8string, strlen(utf8string)); nsMemory::Free(utf8string); return; } // Try to match up the selection data target to something our // transferable provides. gchar *target_name = gdk_atom_name(aSelectionData->target); if (!target_name) return; rv = trans->GetTransferData(target_name, getter_AddRefs(item), &len); // nothing found? if (!item || NS_FAILED(rv)) { g_free(target_name); return; } void *primitive_data = nsnull; nsPrimitiveHelpers::CreateDataFromPrimitive(target_name, item, &primitive_data, len); if (primitive_data) { // Check to see if the selection data is text/html if (aSelectionData->target == gdk_atom_intern (kHTMLMime, FALSE)) { /* * "text/html" can be encoded UCS2. It is recommended that * documents transmitted as UCS2 always begin with a ZERO-WIDTH * NON-BREAKING SPACE character (hexadecimal FEFF, also called * Byte Order Mark (BOM)). Adding BOM can help other app to * detect mozilla use UCS2 encoding when copy-paste. */ guchar *buffer = (guchar *) nsMemory::Alloc((len * sizeof(guchar)) + sizeof(PRUnichar)); if (!buffer) return; PRUnichar prefix = 0xFEFF; memcpy(buffer, &prefix, sizeof(prefix)); memcpy(buffer + sizeof(prefix), primitive_data, len); nsMemory::Free((guchar *)primitive_data); primitive_data = (guchar *)buffer; len += sizeof(prefix); } gtk_selection_data_set(aSelectionData, aSelectionData->target, 8, /* 8 bits in a unit */ (const guchar *)primitive_data, len); nsMemory::Free(primitive_data); } g_free(target_name); }
void nsClipboard::SelectionGetEvent(GtkClipboard *aClipboard, GtkSelectionData *aSelectionData) { // Someone has asked us to hand them something. The first thing // that we want to do is see if that something includes text. If // it does, try to give it text/unicode after converting it to // utf-8. PRInt32 whichClipboard; // which clipboard? if (aSelectionData->selection == GDK_SELECTION_PRIMARY) whichClipboard = kSelectionClipboard; else if (aSelectionData->selection == GDK_SELECTION_CLIPBOARD) whichClipboard = kGlobalClipboard; else return; // THAT AIN'T NO CLIPBOARD I EVER HEARD OF nsCOMPtr<nsITransferable> trans = GetTransferable(whichClipboard); if (!trans) { // We have nothing to serve #ifdef DEBUG_CLIPBOARD printf("nsClipboard::SelectionGetEvent() - %s clipboard is empty!\n", whichClipboard == kSelectionClipboard ? "Selection" : "Global"); #endif return; } nsresult rv; nsCOMPtr<nsISupports> item; PRUint32 len; // Check to see if the selection data includes any of the string // types that we support. if (aSelectionData->target == gdk_atom_intern ("STRING", FALSE) || aSelectionData->target == gdk_atom_intern ("TEXT", FALSE) || aSelectionData->target == gdk_atom_intern ("COMPOUND_TEXT", FALSE) || aSelectionData->target == gdk_atom_intern ("UTF8_STRING", FALSE)) { // Try to convert our internal type into a text string. Get // the transferable for this clipboard and try to get the // text/unicode type for it. rv = trans->GetTransferData("text/unicode", getter_AddRefs(item), &len); if (!item || NS_FAILED(rv)) return; nsCOMPtr<nsISupportsString> wideString; wideString = do_QueryInterface(item); if (!wideString) return; nsAutoString ucs2string; wideString->GetData(ucs2string); char *utf8string = ToNewUTF8String(ucs2string); if (!utf8string) return; gtk_selection_data_set_text (aSelectionData, utf8string, strlen(utf8string)); nsMemory::Free(utf8string); return; } // Check to see if the selection data is an image type if (gtk_targets_include_image(&aSelectionData->target, 1, TRUE)) { // Look through our transfer data for the image static const char* const imageMimeTypes[] = { kNativeImageMime, kPNGImageMime, kJPEGImageMime, kGIFImageMime }; nsCOMPtr<nsISupports> item; PRUint32 len; nsCOMPtr<nsISupportsInterfacePointer> ptrPrimitive; for (PRUint32 i = 0; !ptrPrimitive && i < NS_ARRAY_LENGTH(imageMimeTypes); i++) { rv = trans->GetTransferData(imageMimeTypes[i], getter_AddRefs(item), &len); ptrPrimitive = do_QueryInterface(item); } if (!ptrPrimitive) return; nsCOMPtr<nsISupports> primitiveData; ptrPrimitive->GetData(getter_AddRefs(primitiveData)); nsCOMPtr<imgIContainer> image(do_QueryInterface(primitiveData)); if (!image) // Not getting an image for an image mime type!? return; GdkPixbuf* pixbuf = nsImageToPixbuf::ImageToPixbuf(image); if (!pixbuf) return; gtk_selection_data_set_pixbuf(aSelectionData, pixbuf); g_object_unref(pixbuf); return; } // Try to match up the selection data target to something our // transferable provides. gchar *target_name = gdk_atom_name(aSelectionData->target); if (!target_name) return; rv = trans->GetTransferData(target_name, getter_AddRefs(item), &len); // nothing found? if (!item || NS_FAILED(rv)) { g_free(target_name); return; } void *primitive_data = nsnull; nsPrimitiveHelpers::CreateDataFromPrimitive(target_name, item, &primitive_data, len); if (primitive_data) { // Check to see if the selection data is text/html if (aSelectionData->target == gdk_atom_intern (kHTMLMime, FALSE)) { /* * "text/html" can be encoded UCS2. It is recommended that * documents transmitted as UCS2 always begin with a ZERO-WIDTH * NON-BREAKING SPACE character (hexadecimal FEFF, also called * Byte Order Mark (BOM)). Adding BOM can help other app to * detect mozilla use UCS2 encoding when copy-paste. */ guchar *buffer = (guchar *) nsMemory::Alloc((len * sizeof(guchar)) + sizeof(PRUnichar)); if (!buffer) return; PRUnichar prefix = 0xFEFF; memcpy(buffer, &prefix, sizeof(prefix)); memcpy(buffer + sizeof(prefix), primitive_data, len); nsMemory::Free((guchar *)primitive_data); primitive_data = (guchar *)buffer; len += sizeof(prefix); } gtk_selection_data_set(aSelectionData, aSelectionData->target, 8, /* 8 bits in a unit */ (const guchar *)primitive_data, len); nsMemory::Free(primitive_data); } g_free(target_name); }