diff options
author | Leon Clarke <leonclarke@google.com> | 2010-07-15 12:03:35 +0100 |
---|---|---|
committer | Leon Clarke <leonclarke@google.com> | 2010-07-20 16:57:23 +0100 |
commit | e458d70a0d18538346f41b503114c9ebe6b2ce12 (patch) | |
tree | 86f1637deca2c524432a822e5fcedd4bef221091 /WebCore/platform/gtk/PasteboardHelper.cpp | |
parent | f43eabc081f7ce6af24b9df4953498a3cd6ca24d (diff) | |
download | external_webkit-e458d70a0d18538346f41b503114c9ebe6b2ce12.zip external_webkit-e458d70a0d18538346f41b503114c9ebe6b2ce12.tar.gz external_webkit-e458d70a0d18538346f41b503114c9ebe6b2ce12.tar.bz2 |
Merge WebKit at r63173 : Initial merge by git.
Change-Id: Ife5af0c7c6261fbbc8ae6bc08c390efa9ef10b44
Diffstat (limited to 'WebCore/platform/gtk/PasteboardHelper.cpp')
-rw-r--r-- | WebCore/platform/gtk/PasteboardHelper.cpp | 82 |
1 files changed, 72 insertions, 10 deletions
diff --git a/WebCore/platform/gtk/PasteboardHelper.cpp b/WebCore/platform/gtk/PasteboardHelper.cpp index 98cbe42..111fb4e 100644 --- a/WebCore/platform/gtk/PasteboardHelper.cpp +++ b/WebCore/platform/gtk/PasteboardHelper.cpp @@ -34,7 +34,8 @@ namespace WebCore { -static GdkAtom gdkMarkupAtom = gdk_atom_intern("text/html", FALSE); +static GdkAtom textPlainAtom = gdk_atom_intern("text/plain;charset=utf-8", FALSE); +static GdkAtom markupAtom = gdk_atom_intern("text/html", FALSE); static GdkAtom netscapeURLAtom = gdk_atom_intern("_NETSCAPE_URL", FALSE); static GdkAtom uriListAtom = gdk_atom_intern("text/uri-list", FALSE); @@ -48,13 +49,13 @@ PasteboardHelper::~PasteboardHelper() gtk_target_list_unref(m_targetList); } - void PasteboardHelper::initializeTargetList() { gtk_target_list_add_text_targets(m_targetList, getIdForTargetType(TargetTypeText)); - gtk_target_list_add(m_targetList, gdkMarkupAtom, 0, getIdForTargetType(TargetTypeMarkup)); + gtk_target_list_add(m_targetList, markupAtom, 0, getIdForTargetType(TargetTypeMarkup)); gtk_target_list_add_uri_targets(m_targetList, getIdForTargetType(TargetTypeURIList)); gtk_target_list_add(m_targetList, netscapeURLAtom, 0, getIdForTargetType(TargetTypeNetscapeURL)); + gtk_target_list_add_image_targets(m_targetList, getIdForTargetType(TargetTypeImage), TRUE); } static inline GtkWidget* widgetFromFrame(Frame* frame) @@ -102,6 +103,13 @@ static Vector<KURL> urisToKURLVector(gchar** uris) return uriList; } +static String selectionDataToUTF8String(GtkSelectionData* data) +{ + // g_strndup guards against selection data that is not null-terminated. + GOwnPtr<gchar> markupString(g_strndup(reinterpret_cast<const char*>(gtk_selection_data_get_data(data)), gtk_selection_data_get_length(data))); + return String::fromUTF8(markupString.get()); +} + void PasteboardHelper::getClipboardContents(GtkClipboard* clipboard) { DataObjectGtk* dataObject = DataObjectGtk::forClipboard(clipboard); @@ -113,11 +121,9 @@ void PasteboardHelper::getClipboardContents(GtkClipboard* clipboard) dataObject->setText(String::fromUTF8(textData.get())); } - if (gtk_clipboard_wait_is_target_available(clipboard, gdkMarkupAtom)) { - if (GtkSelectionData* data = gtk_clipboard_wait_for_contents(clipboard, gdkMarkupAtom)) { - // g_strndup guards against selection data that is not null-terminated. - GOwnPtr<gchar> markupString(g_strndup(reinterpret_cast<const char*>(gtk_selection_data_get_data(data)), gtk_selection_data_get_length(data))); - dataObject->setMarkup(String::fromUTF8(markupString.get())); + if (gtk_clipboard_wait_is_target_available(clipboard, markupAtom)) { + if (GtkSelectionData* data = gtk_clipboard_wait_for_contents(clipboard, markupAtom)) { + dataObject->setMarkup(selectionDataToUTF8String(data)); gtk_selection_data_free(data); } } @@ -141,7 +147,7 @@ void PasteboardHelper::fillSelectionData(GtkSelectionData* selectionData, guint else if (info == getIdForTargetType(TargetTypeMarkup)) { GOwnPtr<gchar> markup(g_strdup(dataObject->markup().utf8().data())); - gtk_selection_data_set(selectionData, gdkMarkupAtom, 8, + gtk_selection_data_set(selectionData, markupAtom, 8, reinterpret_cast<const guchar*>(markup.get()), strlen(markup.get()) + 1); } else if (info == getIdForTargetType(TargetTypeURIList)) { @@ -179,7 +185,7 @@ GtkTargetList* PasteboardHelper::targetListForDataObject(DataObjectGtk* dataObje gtk_target_list_add_text_targets(list, getIdForTargetType(TargetTypeText)); if (dataObject->hasMarkup()) - gtk_target_list_add(list, gdkMarkupAtom, 0, getIdForTargetType(TargetTypeMarkup)); + gtk_target_list_add(list, markupAtom, 0, getIdForTargetType(TargetTypeMarkup)); if (dataObject->hasURIList()) { gtk_target_list_add_uri_targets(list, getIdForTargetType(TargetTypeURIList)); @@ -192,6 +198,62 @@ GtkTargetList* PasteboardHelper::targetListForDataObject(DataObjectGtk* dataObje return list; } +void PasteboardHelper::fillDataObjectFromDropData(GtkSelectionData* data, guint info, DataObjectGtk* dataObject) +{ + if (!gtk_selection_data_get_data(data)) + return; + + GdkAtom target = gtk_selection_data_get_target(data); + if (target == textPlainAtom) + dataObject->setText(selectionDataToUTF8String(data)); + else if (target == markupAtom) + dataObject->setMarkup(selectionDataToUTF8String(data)); + else if (target == uriListAtom) { + gchar** uris = gtk_selection_data_get_uris(data); + if (!uris) + return; + + Vector<KURL> uriList(urisToKURLVector(uris)); + dataObject->setURIList(uriList); + g_strfreev(uris); + } else if (target == netscapeURLAtom) { + String urlWithLabel(selectionDataToUTF8String(data)); + + Vector<String> pieces; + urlWithLabel.split("\n", pieces); + + // Give preference to text/uri-list here, as it can hold more + // than one URI but still take the label if there is one. + if (!dataObject->hasURL()) { + Vector<KURL> uriList; + uriList.append(KURL(KURL(), pieces[0])); + dataObject->setURIList(uriList); + } + + if (pieces.size() > 1) + dataObject->setText(pieces[1]); + } +} + +Vector<GdkAtom> PasteboardHelper::dropAtomsForContext(GtkWidget* widget, GdkDragContext* context) +{ + // Always search for these common atoms. + Vector<GdkAtom> dropAtoms; + dropAtoms.append(textPlainAtom); + dropAtoms.append(markupAtom); + dropAtoms.append(uriListAtom); + dropAtoms.append(netscapeURLAtom); + + // For images, try to find the most applicable image type. + GRefPtr<GtkTargetList> list(gtk_target_list_new(0, 0)); + gtk_target_list_add_image_targets(list.get(), getIdForTargetType(TargetTypeImage), TRUE); + GdkAtom atom = gtk_drag_dest_find_target(widget, context, list.get()); + if (atom != GDK_NONE) + dropAtoms.append(atom); + + return dropAtoms; +} + static DataObjectGtk* settingClipboardDataObject = 0; static void getClipboardContentsCallback(GtkClipboard* clipboard, GtkSelectionData *selectionData, guint info, gpointer data) |