summaryrefslogtreecommitdiffstats
path: root/WebCore/platform/gtk/PasteboardHelper.cpp
diff options
context:
space:
mode:
authorBen Murdoch <benm@google.com>2010-05-11 18:35:50 +0100
committerBen Murdoch <benm@google.com>2010-05-14 10:23:05 +0100
commit21939df44de1705786c545cd1bf519d47250322d (patch)
treeef56c310f5c0cdc379c2abb2e212308a3281ce20 /WebCore/platform/gtk/PasteboardHelper.cpp
parent4ff1d8891d520763f17675827154340c7c740f90 (diff)
downloadexternal_webkit-21939df44de1705786c545cd1bf519d47250322d.zip
external_webkit-21939df44de1705786c545cd1bf519d47250322d.tar.gz
external_webkit-21939df44de1705786c545cd1bf519d47250322d.tar.bz2
Merge Webkit at r58956: Initial merge by Git.
Change-Id: I1d9fb60ea2c3f2ddc04c17a871acdb39353be228
Diffstat (limited to 'WebCore/platform/gtk/PasteboardHelper.cpp')
-rw-r--r--WebCore/platform/gtk/PasteboardHelper.cpp89
1 files changed, 86 insertions, 3 deletions
diff --git a/WebCore/platform/gtk/PasteboardHelper.cpp b/WebCore/platform/gtk/PasteboardHelper.cpp
index be32ea5..3dc4cc0 100644
--- a/WebCore/platform/gtk/PasteboardHelper.cpp
+++ b/WebCore/platform/gtk/PasteboardHelper.cpp
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2010 Martin Robinson <mrobinson@webkit.org>
+ * Copyright (C) Igalia S.L.
* All rights reserved.
*
* This library is free software; you can redistribute it and/or
@@ -26,12 +27,15 @@
#include "Frame.h"
#include "Page.h"
#include "Pasteboard.h"
+#include "TextResourceDecoder.h"
#include <gtk/gtk.h>
#include <wtf/gobject/GOwnPtr.h>
namespace WebCore {
static GdkAtom gdkMarkupAtom = 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);
PasteboardHelper::PasteboardHelper()
: m_targetList(gtk_target_list_new(0, 0))
@@ -48,6 +52,8 @@ 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_uri_targets(m_targetList, getIdForTargetType(TargetTypeURIList));
+ gtk_target_list_add(m_targetList, netscapeURLAtom, 0, getIdForTargetType(TargetTypeNetscapeURL));
}
static inline GtkWidget* widgetFromFrame(Frame* frame)
@@ -84,16 +90,85 @@ GtkTargetList* PasteboardHelper::targetList() const
return m_targetList;
}
+static Vector<KURL> urisToKURLVector(gchar** uris)
+{
+ ASSERT(uris);
+
+ Vector<KURL> uriList;
+ for (int i = 0; *(uris + i); i++)
+ uriList.append(KURL(KURL(), *(uris + i)));
+
+ return uriList;
+}
+
+void PasteboardHelper::getClipboardContents(GtkClipboard* clipboard)
+{
+ DataObjectGtk* dataObject = DataObjectGtk::forClipboard(clipboard);
+ ASSERT(dataObject);
+
+ if (gtk_clipboard_wait_is_text_available(clipboard)) {
+ GOwnPtr<gchar> textData(gtk_clipboard_wait_for_text(clipboard));
+ if (textData)
+ 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)) {
+ RefPtr<TextResourceDecoder> decoder(TextResourceDecoder::create("text/plain", "UTF-8", true));
+ String markup(decoder->decode(reinterpret_cast<char*>(data->data), data->length));
+ markup += decoder->flush();
+ dataObject->setMarkup(markup);
+ gtk_selection_data_free(data);
+ }
+ }
+
+ if (gtk_clipboard_wait_is_target_available(clipboard, uriListAtom)) {
+ if (GtkSelectionData* data = gtk_clipboard_wait_for_contents(clipboard, uriListAtom)) {
+ gchar** uris = gtk_selection_data_get_uris(data);
+ if (uris) {
+ dataObject->setURIList(urisToKURLVector(uris));
+ g_strfreev(uris);
+ }
+ gtk_selection_data_free(data);
+ }
+ }
+}
+
void PasteboardHelper::fillSelectionData(GtkSelectionData* selectionData, guint info, DataObjectGtk* dataObject)
{
if (info == getIdForTargetType(TargetTypeText))
gtk_selection_data_set_text(selectionData, dataObject->text().utf8().data(), -1);
+
else if (info == getIdForTargetType(TargetTypeMarkup)) {
GOwnPtr<gchar> markup(g_strdup(dataObject->markup().utf8().data()));
gtk_selection_data_set(selectionData, selectionData->target, 8,
- reinterpret_cast<const guchar*>(markup.get()),
- strlen(markup.get()));
- }
+ reinterpret_cast<const guchar*>(markup.get()), strlen(markup.get()));
+
+ } else if (info == getIdForTargetType(TargetTypeURIList)) {
+ Vector<KURL> uriList(dataObject->uriList());
+ gchar** uris = g_new0(gchar*, uriList.size() + 1);
+ for (size_t i = 0; i < uriList.size(); i++)
+ uris[i] = g_strdup(uriList[i].string().utf8().data());
+
+ gtk_selection_data_set_uris(selectionData, uris);
+ g_strfreev(uris);
+
+ } else if (info == getIdForTargetType(TargetTypeNetscapeURL) && dataObject->hasURL()) {
+ String url(dataObject->url());
+ String result(url);
+ result.append("\n");
+
+ if (dataObject->hasText())
+ result.append(dataObject->text());
+ else
+ result.append(url);
+
+ GOwnPtr<gchar> resultData(g_strdup(result.utf8().data()));
+ gtk_selection_data_set(selectionData, selectionData->target, 8,
+ reinterpret_cast<const guchar*>(resultData.get()), strlen(resultData.get()));
+
+ } else if (info == getIdForTargetType(TargetTypeImage))
+ gtk_selection_data_set_pixbuf(selectionData, dataObject->image());
}
GtkTargetList* PasteboardHelper::targetListForDataObject(DataObjectGtk* dataObject)
@@ -106,6 +181,14 @@ GtkTargetList* PasteboardHelper::targetListForDataObject(DataObjectGtk* dataObje
if (dataObject->hasMarkup())
gtk_target_list_add(list, gdkMarkupAtom, 0, getIdForTargetType(TargetTypeMarkup));
+ if (dataObject->hasURIList()) {
+ gtk_target_list_add_uri_targets(list, getIdForTargetType(TargetTypeURIList));
+ gtk_target_list_add(list, netscapeURLAtom, 0, getIdForTargetType(TargetTypeNetscapeURL));
+ }
+
+ if (dataObject->hasImage())
+ gtk_target_list_add_image_targets(list, getIdForTargetType(TargetTypeImage), TRUE);
+
return list;
}