diff options
author | Leon Clarke <leonclarke@google.com> | 2010-06-03 14:33:32 +0100 |
---|---|---|
committer | Leon Clarke <leonclarke@google.com> | 2010-06-08 12:24:51 +0100 |
commit | 5af96e2c7b73ebc627c6894727826a7576d31758 (patch) | |
tree | f9d5e6f6175ccd7e3d14de9b290f08937a0d17ba /WebCore/platform/gtk/PasteboardGtk.cpp | |
parent | 8cc4fcf4f6adcbc0e0aebfc24fbad9a4cddf2cfb (diff) | |
download | external_webkit-5af96e2c7b73ebc627c6894727826a7576d31758.zip external_webkit-5af96e2c7b73ebc627c6894727826a7576d31758.tar.gz external_webkit-5af96e2c7b73ebc627c6894727826a7576d31758.tar.bz2 |
Merge webkit.org at r60469 : Initial merge by git.
Change-Id: I66a0047aa2af802f66bb0c7f2a8b02247a596234
Diffstat (limited to 'WebCore/platform/gtk/PasteboardGtk.cpp')
-rw-r--r-- | WebCore/platform/gtk/PasteboardGtk.cpp | 118 |
1 files changed, 32 insertions, 86 deletions
diff --git a/WebCore/platform/gtk/PasteboardGtk.cpp b/WebCore/platform/gtk/PasteboardGtk.cpp index 9e7b23a..599f7da 100644 --- a/WebCore/platform/gtk/PasteboardGtk.cpp +++ b/WebCore/platform/gtk/PasteboardGtk.cpp @@ -20,6 +20,7 @@ #include "config.h" #include "Pasteboard.h" +#include "DataObjectGtk.h" #include "DocumentFragment.h" #include "Frame.h" #include "NotImplemented.h" @@ -29,50 +30,13 @@ #include "RenderImage.h" #include "KURL.h" #include "markup.h" +#include <wtf/gobject/GRefPtr.h> #include <wtf/text/CString.h> #include <gtk/gtk.h> namespace WebCore { -class PasteboardSelectionData { -public: - PasteboardSelectionData(gchar* text, gchar* markup) - : m_text(text) - , m_markup(markup) { } - - ~PasteboardSelectionData() { - g_free(m_text); - g_free(m_markup); - } - - const gchar* text() const { return m_text; } - const gchar* markup() const { return m_markup; } - -private: - gchar* m_text; - gchar* m_markup; -}; - -static void clipboard_get_contents_cb(GtkClipboard *clipboard, GtkSelectionData *selection_data, - guint info, gpointer data) { - PasteboardSelectionData* clipboardData = reinterpret_cast<PasteboardSelectionData*>(data); - ASSERT(clipboardData); - if (info == Pasteboard::generalPasteboard()->helper()->getIdForTargetType(PasteboardHelper::TargetTypeMarkup)) - gtk_selection_data_set(selection_data, selection_data->target, 8, - reinterpret_cast<const guchar*>(clipboardData->markup()), - strlen(clipboardData->markup())); - else - gtk_selection_data_set_text(selection_data, clipboardData->text(), -1); -} - -static void clipboard_clear_contents_cb(GtkClipboard *clipboard, gpointer data) { - PasteboardSelectionData* clipboardData = reinterpret_cast<PasteboardSelectionData*>(data); - ASSERT(clipboardData); - delete clipboardData; -} - - Pasteboard* Pasteboard::generalPasteboard() { static Pasteboard* pasteboard = new Pasteboard(); @@ -102,22 +66,18 @@ void Pasteboard::setHelper(PasteboardHelper* helper) void Pasteboard::writeSelection(Range* selectedRange, bool canSmartCopyOrDelete, Frame* frame) { GtkClipboard* clipboard = m_helper->getClipboard(frame); - gchar* text = g_strdup(frame->selectedText().utf8().data()); - gchar* markup = g_strdup(createMarkup(selectedRange, 0, AnnotateForInterchange).utf8().data()); - PasteboardSelectionData* data = new PasteboardSelectionData(text, markup); - - gint n_targets; - GtkTargetEntry* targets = gtk_target_table_new_from_list(m_helper->targetList(), &n_targets); - gtk_clipboard_set_with_data(clipboard, targets, n_targets, - clipboard_get_contents_cb, clipboard_clear_contents_cb, data); - gtk_target_table_free(targets, n_targets); + DataObjectGtk* dataObject = DataObjectGtk::forClipboard(clipboard); + dataObject->setText(frame->selectedText()); + dataObject->setMarkup(createMarkup(selectedRange, 0, AnnotateForInterchange)); + m_helper->writeClipboardContents(clipboard); } void Pasteboard::writePlainText(const String& text) { - CString utf8 = text.utf8(); GtkClipboard* clipboard = gtk_clipboard_get_for_display(gdk_display_get_default(), GDK_SELECTION_CLIPBOARD); - gtk_clipboard_set_text(clipboard, utf8.data(), utf8.length()); + DataObjectGtk* dataObject = DataObjectGtk::forClipboard(clipboard); + dataObject->setText(text); + m_helper->writeClipboardContents(clipboard); } void Pasteboard::writeURL(const KURL& url, const String&, Frame* frame) @@ -126,10 +86,12 @@ void Pasteboard::writeURL(const KURL& url, const String&, Frame* frame) return; GtkClipboard* clipboard = m_helper->getClipboard(frame); - GtkClipboard* primary = m_helper->getPrimarySelectionClipboard(frame); - CString utf8 = url.string().utf8(); - gtk_clipboard_set_text(clipboard, utf8.data(), utf8.length()); - gtk_clipboard_set_text(primary, utf8.data(), utf8.length()); + DataObjectGtk* dataObject = DataObjectGtk::forClipboard(clipboard); + + Vector<KURL> uriList; + uriList.append(url); + dataObject->setURIList(uriList); + m_helper->writeClipboardContents(clipboard); } void Pasteboard::writeImage(Node* node, const KURL&, const String&) @@ -144,16 +106,15 @@ void Pasteboard::writeImage(Node* node, const KURL&, const String&) Image* image = cachedImage->image(); ASSERT(image); - GdkPixbuf* pixbuf = image->getGdkPixbuf(); - gtk_clipboard_set_image(clipboard, pixbuf); - g_object_unref(pixbuf); + GRefPtr<GdkPixbuf> pixbuf = adoptGRef(image->getGdkPixbuf()); + DataObjectGtk* dataObject = DataObjectGtk::forClipboard(clipboard); + dataObject->setImage(pixbuf.get()); + m_helper->writeClipboardContents(clipboard); } void Pasteboard::clear() { - GtkClipboard* clipboard = gtk_clipboard_get_for_display(gdk_display_get_default(), GDK_SELECTION_CLIPBOARD); - - gtk_clipboard_clear(clipboard); + gtk_clipboard_clear(gtk_clipboard_get_for_display(gdk_display_get_default(), GDK_SELECTION_CLIPBOARD)); } bool Pasteboard::canSmartReplace() @@ -165,33 +126,24 @@ bool Pasteboard::canSmartReplace() PassRefPtr<DocumentFragment> Pasteboard::documentFragment(Frame* frame, PassRefPtr<Range> context, bool allowPlainText, bool& chosePlainText) { - GdkAtom textHtml = gdk_atom_intern_static_string("text/html"); GtkClipboard* clipboard = m_helper->getCurrentClipboard(frame); + DataObjectGtk* dataObject = DataObjectGtk::forClipboard(clipboard); + m_helper->getClipboardContents(clipboard); + chosePlainText = false; - if (GtkSelectionData* data = gtk_clipboard_wait_for_contents(clipboard, textHtml)) { - ASSERT(data->data); - RefPtr<TextResourceDecoder> decoder = TextResourceDecoder::create("text/plain", "UTF-8", true); - String html = decoder->decode(reinterpret_cast<char*>(data->data), data->length); - html += decoder->flush(); - gtk_selection_data_free(data); - - if (!html.isEmpty()) { - RefPtr<DocumentFragment> fragment = createFragmentFromMarkup(frame->document(), html, "", FragmentScriptingNotAllowed); - if (fragment) - return fragment.release(); - } + if (dataObject->hasMarkup()) { + RefPtr<DocumentFragment> fragment = createFragmentFromMarkup(frame->document(), dataObject->markup(), "", FragmentScriptingNotAllowed); + if (fragment) + return fragment.release(); } if (!allowPlainText) return 0; - if (gchar* utf8 = gtk_clipboard_wait_for_text(clipboard)) { - String text = String::fromUTF8(utf8); - g_free(utf8); - + if (dataObject->hasText()) { chosePlainText = true; - RefPtr<DocumentFragment> fragment = createFragmentFromText(context.get(), text); + RefPtr<DocumentFragment> fragment = createFragmentFromText(context.get(), dataObject->text()); if (fragment) return fragment.release(); } @@ -202,16 +154,10 @@ PassRefPtr<DocumentFragment> Pasteboard::documentFragment(Frame* frame, PassRefP String Pasteboard::plainText(Frame* frame) { GtkClipboard* clipboard = m_helper->getCurrentClipboard(frame); + DataObjectGtk* dataObject = DataObjectGtk::forClipboard(clipboard); - gchar* utf8 = gtk_clipboard_wait_for_text(clipboard); - - if (!utf8) - return String(); - - String text = String::fromUTF8(utf8); - g_free(utf8); - - return text; + m_helper->getClipboardContents(clipboard); + return dataObject->text(); } } |