diff options
author | Steve Block <steveblock@google.com> | 2009-10-08 17:19:54 +0100 |
---|---|---|
committer | Steve Block <steveblock@google.com> | 2009-10-20 00:41:58 +0100 |
commit | 231d4e3152a9c27a73b6ac7badbe6be673aa3ddf (patch) | |
tree | a6c7e2d6cd7bfa7011cc39abbb436142d7a4a7c8 /WebCore/platform/gtk/ClipboardGtk.cpp | |
parent | e196732677050bd463301566a68a643b6d14b907 (diff) | |
download | external_webkit-231d4e3152a9c27a73b6ac7badbe6be673aa3ddf.zip external_webkit-231d4e3152a9c27a73b6ac7badbe6be673aa3ddf.tar.gz external_webkit-231d4e3152a9c27a73b6ac7badbe6be673aa3ddf.tar.bz2 |
Merge webkit.org at R49305 : Automatic merge by git.
Change-Id: I8968561bc1bfd72b8923b7118d3728579c6dbcc7
Diffstat (limited to 'WebCore/platform/gtk/ClipboardGtk.cpp')
-rw-r--r-- | WebCore/platform/gtk/ClipboardGtk.cpp | 69 |
1 files changed, 60 insertions, 9 deletions
diff --git a/WebCore/platform/gtk/ClipboardGtk.cpp b/WebCore/platform/gtk/ClipboardGtk.cpp index 8cbf590..450966e 100644 --- a/WebCore/platform/gtk/ClipboardGtk.cpp +++ b/WebCore/platform/gtk/ClipboardGtk.cpp @@ -17,11 +17,18 @@ #include "config.h" #include "ClipboardGtk.h" +#include "CachedImage.h" +#include "CString.h" +#include "Editor.h" +#include "Element.h" #include "FileList.h" +#include "Frame.h" +#include "markup.h" #include "NotImplemented.h" +#include "RenderImage.h" #include "StringHash.h" -#include "Editor.h" +#include <gtk/gtk.h> namespace WebCore { @@ -33,12 +40,10 @@ PassRefPtr<Clipboard> Editor::newGeneralClipboard(ClipboardAccessPolicy policy) ClipboardGtk::ClipboardGtk(ClipboardAccessPolicy policy, bool forDragging) : Clipboard(policy, forDragging) { - notImplemented(); } ClipboardGtk::~ClipboardGtk() { - notImplemented(); } void ClipboardGtk::clearData(const String&) @@ -110,19 +115,65 @@ DragImageRef ClipboardGtk::createDragImage(IntPoint&) const return 0; } -void ClipboardGtk::declareAndWriteDragImage(Element*, const KURL&, const String&, Frame*) +static CachedImage* getCachedImage(Element* element) { - notImplemented(); + // Attempt to pull CachedImage from element + ASSERT(element); + RenderObject* renderer = element->renderer(); + if (!renderer || !renderer->isImage()) + return 0; + + RenderImage* image = static_cast<RenderImage*>(renderer); + if (image->cachedImage() && !image->cachedImage()->errorOccurred()) + return image->cachedImage(); + + return 0; } -void ClipboardGtk::writeURL(const KURL&, const String&, Frame*) +void ClipboardGtk::declareAndWriteDragImage(Element* element, const KURL& url, const String& label, Frame*) { - notImplemented(); + CachedImage* cachedImage = getCachedImage(element); + if (!cachedImage || !cachedImage->isLoaded()) + return; + + GdkPixbuf* pixbuf = cachedImage->image()->getGdkPixbuf(); + if (!pixbuf) + return; + + GtkClipboard* imageClipboard = gtk_clipboard_get(gdk_atom_intern_static_string("WebKitClipboardImage")); + gtk_clipboard_clear(imageClipboard); + + gtk_clipboard_set_image(imageClipboard, pixbuf); + g_object_unref(pixbuf); + + writeURL(url, label, 0); } -void ClipboardGtk::writeRange(Range*, Frame*) +void ClipboardGtk::writeURL(const KURL& url, const String& label, Frame*) { - notImplemented(); + GtkClipboard* textClipboard = gtk_clipboard_get(gdk_atom_intern_static_string("WebKitClipboardText")); + GtkClipboard* urlClipboard = gtk_clipboard_get(gdk_atom_intern_static_string("WebKitClipboardUrl")); + GtkClipboard* urlLabelClipboard = gtk_clipboard_get(gdk_atom_intern_static_string("WebKitClipboardUrlLabel")); + + gtk_clipboard_clear(textClipboard); + gtk_clipboard_clear(urlClipboard); + gtk_clipboard_clear(urlLabelClipboard); + + gtk_clipboard_set_text(textClipboard, url.string().utf8().data(), -1); + gtk_clipboard_set_text(urlClipboard, url.string().utf8().data(), -1); + gtk_clipboard_set_text(urlLabelClipboard, label.utf8().data(), -1); +} + +void ClipboardGtk::writeRange(Range* range, Frame* frame) +{ + GtkClipboard* textClipboard = gtk_clipboard_get(gdk_atom_intern_static_string("WebKitClipboardText")); + GtkClipboard* htmlClipboard = gtk_clipboard_get(gdk_atom_intern_static_string("WebKitClipboardHtml")); + + gtk_clipboard_clear(textClipboard); + gtk_clipboard_clear(htmlClipboard); + + gtk_clipboard_set_text(textClipboard, frame->selectedText().utf8().data(), -1); + gtk_clipboard_set_text(htmlClipboard, createMarkup(range, 0, AnnotateForInterchange).utf8().data(), -1); } bool ClipboardGtk::hasData() |