RESOLVED FIXED Bug 27028
[gtk] Pasteboard/GtkClipboard can't handle the "text/html" target.
https://bugs.webkit.org/show_bug.cgi?id=27028
Summary [gtk] Pasteboard/GtkClipboard can't handle the "text/html" target.
Jiahua Huang
Reported 2009-07-07 06:46:16 PDT
when I select some html content, and Copy them use Ctrl-C, the Pasteboard/GtkClipboard can't handle the "text/html" target. I found that the "text/html" target only in X clipboard (GDK_SELECTION_CLIPBOARD), but not gtk Desktop clipboard (GDK_SELECTION_PRIMARY). So we can't use Ctrl-C to Copy rich text from WebkitGtk.
Attachments
Fix improper set of enum WebKitWebViewTargetInfo (2.69 KB, patch)
2009-07-07 06:54 PDT, Jiahua Huang
no flags
grabbing the WEBKIT_WEB_VIEW_TARGET_INFO_HTML via m_helper (5.52 KB, patch)
2009-07-10 07:33 PDT, Jiahua Huang
no flags
update patch to svn r45707 (5.51 KB, patch)
2009-07-10 07:51 PDT, Jiahua Huang
no flags
cleanup. update patch to svn r45707 (6.36 KB, patch)
2009-07-10 08:04 PDT, Jiahua Huang
jmalonzo: review+
use the enum in webkitwebview.h (3.87 KB, patch)
2009-07-19 06:16 PDT, Jiahua Huang
jmalonzo: review-
Jiahua Huang
Comment 1 2009-07-07 06:54:36 PDT
Created attachment 32376 [details] Fix improper set of enum WebKitWebViewTargetInfo I use this Change: > Index: WebCore/platform/gtk/PasteboardGtk.cpp > =================================================================== > --- WebCore/platform/gtk/PasteboardGtk.cpp (revision 45546) > +++ WebCore/platform/gtk/PasteboardGtk.cpp (working copy) > @@ -37,8 +38,8 @@ namespace WebCore { > /* FIXME: we must get rid of this and use the enum in webkitwebview.h someway */ > typedef enum > { > - WEBKIT_WEB_VIEW_TARGET_INFO_HTML = - 1, > - WEBKIT_WEB_VIEW_TARGET_INFO_TEXT = - 2 > + WEBKIT_WEB_VIEW_TARGET_INFO_HTML, > + WEBKIT_WEB_VIEW_TARGET_INFO_TEXT > } WebKitWebViewTargetInfo; > it works. it can use Ctrl-C to Copy rich text from WebkitGtk page now.
Jiahua Huang
Comment 2 2009-07-07 06:59:34 PDT
(In reply to comment #1) > it works. a manual-test WebCore/manual-tests/gtk/copy-htmltext.html has been added.
Jan Alonzo
Comment 3 2009-07-07 08:41:49 PDT
(In reply to comment #1) > Created an attachment (id=32376) [details] > Fix improper set of enum WebKitWebViewTargetInfo > > I use this Change: > > Index: WebCore/platform/gtk/PasteboardGtk.cpp > > =================================================================== > > --- WebCore/platform/gtk/PasteboardGtk.cpp (revision 45546) > > +++ WebCore/platform/gtk/PasteboardGtk.cpp (working copy) > > @@ -37,8 +38,8 @@ namespace WebCore { > > /* FIXME: we must get rid of this and use the enum in webkitwebview.h someway */ > > typedef enum > > { > > - WEBKIT_WEB_VIEW_TARGET_INFO_HTML = - 1, > > - WEBKIT_WEB_VIEW_TARGET_INFO_TEXT = - 2 > > + WEBKIT_WEB_VIEW_TARGET_INFO_HTML, > > + WEBKIT_WEB_VIEW_TARGET_INFO_TEXT > > } WebKitWebViewTargetInfo; Maybe we can remove this altogether by grabbing the target infos via m_helper?
Jiahua Huang
Comment 4 2009-07-07 09:15:28 PDT
(In reply to comment #3) > Maybe we can remove this altogether by grabbing the target infos via m_helper? How about it: > Index: WebKit/gtk/WebCoreSupport/PasteboardHelperGtk.cpp > =================================================================== > --- WebKit/gtk/WebCoreSupport/PasteboardHelperGtk.cpp (revision 45595) > +++ WebKit/gtk/WebCoreSupport/PasteboardHelperGtk.cpp (working copy) > @@ -57,8 +57,10 @@ GtkClipboard* PasteboardHelperGtk::getPr > > GtkTargetList* PasteboardHelperGtk::getCopyTargetList(Frame* frame) const > { > - WebKitWebView* webView = webkit_web_frame_get_web_view(kit(frame)); > - return webkit_web_view_get_copy_target_list(webView); > + GtkTargetList* target_list = gtk_target_list_new(NULL, 0); > + gtk_target_list_add(target_list, gdk_atom_intern_static_string("text/html"), 0, WEBKIT_WEB_VIEW_TARGET_INFO_HTML); > + gtk_target_list_add_text_targets(target_list, WEBKIT_WEB_VIEW_TARGET_INFO_TEXT); > + return target_list; > } > > GtkTargetList* PasteboardHelperGtk::getPasteTargetList(Frame* frame) const
Jiahua Huang
Comment 5 2009-07-07 09:34:03 PDT
(In reply to comment #4) > How about it: err, no, that is it: > Index: WebCore/platform/gtk/PasteboardGtk.cpp > =================================================================== > --- WebCore/platform/gtk/PasteboardGtk.cpp (revision 45595) > +++ WebCore/platform/gtk/PasteboardGtk.cpp (working copy) > @@ -108,7 +108,10 @@ void Pasteboard::writeSelection(Range* s > PasteboardSelectionData* data = new PasteboardSelectionData(text, markup); > > gint n_targets; > - GtkTargetEntry* targets = gtk_target_table_new_from_list(m_helper->getCopyTargetList(frame), &n_targets); > + GtkTargetList* target_list = gtk_target_list_new(NULL, 0); > + gtk_target_list_add(target_list, gdk_atom_intern_static_string("text/html"), 0, WEBKIT_WEB_VIEW_TARGET_INFO_HTML); > + gtk_target_list_add_text_targets(target_list, WEBKIT_WEB_VIEW_TARGET_INFO_TEXT); > + GtkTargetEntry* targets = gtk_target_table_new_from_list(target_list, &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);
Jan Alonzo
Comment 6 2009-07-10 01:47:21 PDT
(In reply to comment #5) > (In reply to comment #4) > > How about it: > > err, no, that is it: > > > - GtkTargetEntry* targets = gtk_target_table_new_from_list(m_helper->getCopyTargetList(frame), &n_targets); > > + GtkTargetList* target_list = gtk_target_list_new(NULL, 0); > > + gtk_target_list_add(target_list, gdk_atom_intern_static_string("text/html"), 0, WEBKIT_WEB_VIEW_TARGET_INFO_HTML); > > + gtk_target_list_add_text_targets(target_list, WEBKIT_WEB_VIEW_TARGET_INFO_TEXT); > > + GtkTargetEntry* targets = gtk_target_table_new_from_list(target_list, &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); I think a proper fix for this is to add a function in WebKit/gtk/WebCoreSuppoer/PasteboardHelperGtk.cpp that will return the value of WEBKIT_WEB_VIEW_TARGET_INFO_HTML, and use that in clipboard_get_contents_cb.
Jiahua Huang
Comment 7 2009-07-10 02:07:39 PDT
(In reply to comment #6) > I think a proper fix for this is to add a function in > WebKit/gtk/WebCoreSuppoer/PasteboardHelperGtk.cpp that will return the value of > WEBKIT_WEB_VIEW_TARGET_INFO_HTML, and use that in clipboard_get_contents_cb. well, I see. I'm trying to do it like that.
Jiahua Huang
Comment 8 2009-07-10 05:56:30 PDT
(In reply to comment #6) > I think a proper fix for this is to add a function in > WebKit/gtk/WebCoreSuppoer/PasteboardHelperGtk.cpp that will return the value of > WEBKIT_WEB_VIEW_TARGET_INFO_HTML, and use that in clipboard_get_contents_cb. I agree. How about it: > Index: WebCore/platform/gtk/PasteboardGtk.cpp > =================================================================== > --- WebCore/platform/gtk/PasteboardGtk.cpp (revision 45658) > +++ WebCore/platform/gtk/PasteboardGtk.cpp (working copy) > @@ -35,13 +35,6 @@ > > namespace WebCore { > > -/* FIXME: we must get rid of this and use the enum in webkitwebview.h someway */ > -typedef enum > -{ > - WEBKIT_WEB_VIEW_TARGET_INFO_HTML = - 1, > - WEBKIT_WEB_VIEW_TARGET_INFO_TEXT = - 2 > -} WebKitWebViewTargetInfo; > - > class PasteboardSelectionData { > public: > PasteboardSelectionData(gchar* text, gchar* markup) > @@ -65,7 +58,7 @@ static void clipboard_get_contents_cb(Gt > guint info, gpointer data) { > PasteboardSelectionData* clipboardData = reinterpret_cast<PasteboardSelectionData*>(data); > ASSERT(clipboardData); > - if ((gint)info == WEBKIT_WEB_VIEW_TARGET_INFO_HTML) { > + if ((gint)info == m_helper->PasteboardHelperGtk()) { > gtk_selection_data_set(selection_data, selection_data->target, 8, > reinterpret_cast<const guchar*>(clipboardData->markup()), > g_utf8_strlen(clipboardData->markup(), -1)); > Index: WebKit/gtk/WebCoreSupport/PasteboardHelperGtk.cpp > =================================================================== > --- WebKit/gtk/WebCoreSupport/PasteboardHelperGtk.cpp (revision 45658) > +++ WebKit/gtk/WebCoreSupport/PasteboardHelperGtk.cpp (working copy) > @@ -67,4 +67,14 @@ GtkTargetList* PasteboardHelperGtk::getP > return webkit_web_view_get_paste_target_list(webView); > } > > +gint PasteboardHelperGtk::getWebViewTargetInfoHtml() const > +{ > + return WEBKIT_WEB_VIEW_TARGET_INFO_HTML; > +} > + > +gint PasteboardHelperGtk::getWebViewTargetInfoText() const > +{ > + return WEBKIT_WEB_VIEW_TARGET_INFO_TEXT; > +} > + > } I'm waiting for the rebuild process to complete.
Jiahua Huang
Comment 9 2009-07-10 07:33:46 PDT
Created attachment 32558 [details] grabbing the WEBKIT_WEB_VIEW_TARGET_INFO_HTML via m_helper (In reply to comment #6) > I think a proper fix for this is to add a function in > WebKit/gtk/WebCoreSuppoer/PasteboardHelperGtk.cpp that will return the value of > WEBKIT_WEB_VIEW_TARGET_INFO_HTML, and use that in clipboard_get_contents_cb. Done, it works =)
Jiahua Huang
Comment 10 2009-07-10 07:51:33 PDT
Created attachment 32559 [details] update patch to svn r45707
Jiahua Huang
Comment 11 2009-07-10 08:04:06 PDT
Created attachment 32560 [details] cleanup. update patch to svn r45707
Jan Alonzo
Comment 12 2009-07-10 17:04:47 PDT
Comment on attachment 32560 [details] cleanup. update patch to svn r45707 > Index: WebCore/platform/Pasteboard.h > =================================================================== > --- WebCore/platform/Pasteboard.h (revision 45707) > +++ WebCore/platform/Pasteboard.h (working copy) > @@ -102,6 +102,7 @@ public: > > #if PLATFORM(GTK) > void setHelper(PasteboardHelper*); > + PasteboardHelper* m_helper; > #endif Is there any reason for this change? > - if ((gint)info == WEBKIT_WEB_VIEW_TARGET_INFO_HTML) { > + if ((gint)info == Pasteboard::generalPasteboard()->m_helper->getWebViewTargetInfoHtml()) { I think calling generalPasteboard() is unnecessary here. > + virtual gint getWebViewTargetInfoHtml() const = 0; What's this for? Looks fine otherwise. r- for now as the patch needs to be revised.
Jiahua Huang
Comment 13 2009-07-11 11:29:36 PDT
(In reply to comment #12) > Looks fine otherwise. r- for now as the patch needs to be revised. use the enum in webkitwebview.h > Index: GNUmakefile.am > =================================================================== > --- GNUmakefile.am (revision 45707) > +++ GNUmakefile.am (working copy) > @@ -193,6 +193,9 @@ libWebCore_la_SOURCES = \ > $(webcore_sources) \ > $(webcoregtk_sources) > > +webcore_cppflags += \ > + -I$(srcdir)/WebKit/gtk/ > + > libWebCore_la_CXXFLAGS = \ > $(global_cxxflags) \ > $(corekit_cflags) > Index: WebCore/platform/gtk/PasteboardGtk.cpp > =================================================================== > --- WebCore/platform/gtk/PasteboardGtk.cpp (revision 45707) > +++ WebCore/platform/gtk/PasteboardGtk.cpp (working copy) > @@ -30,18 +30,12 @@ > #include "RenderImage.h" > #include "KURL.h" > #include "markup.h" > +#include "webkit/webkitwebview.h" > > #include <gtk/gtk.h> > > namespace WebCore { > > -/* FIXME: we must get rid of this and use the enum in webkitwebview.h someway */ > -typedef enum > -{ > - WEBKIT_WEB_VIEW_TARGET_INFO_HTML = - 1, > - WEBKIT_WEB_VIEW_TARGET_INFO_TEXT = - 2 > -} WebKitWebViewTargetInfo; > - > class PasteboardSelectionData { > public: > PasteboardSelectionData(gchar* text, gchar* markup)
Jiahua Huang
Comment 14 2009-07-19 06:16:54 PDT
Created attachment 33043 [details] use the enum in webkitwebview.h (In reply to comment #12) > Looks fine otherwise. r- for now as the patch needs to be revised. Remove the improper set of enum WebKitWebViewTargetInfo in platform/gtk/PasteboardGtk.cpp, and use the enum in webkitwebview.h
Jan Alonzo
Comment 15 2009-07-19 13:00:38 PDT
Comment on attachment 33043 [details] use the enum in webkitwebview.h > +webcore_cppflags += \ > + -I$(srcdir)/WebKit/gtk/ > + This is a layering violation. WebCore should not depend on WebKit. It should go through the *Client interface, or in the case of Pasteboard, should go through PasteboardHelper. The previous patch was already doing that. Why the change? r- because of the layering violation.
Jiahua Huang
Comment 16 2009-08-09 05:02:40 PDT
(In reply to comment #15) Dear Alonzo , I'm sorry, I'm so busy these days. Cound you mend it for me, please? Thank you very much. Best regards.
Jan Alonzo
Comment 17 2009-08-14 23:04:53 PDT
Comment on attachment 32560 [details] cleanup. update patch to svn r45707 > - if ((gint)info == WEBKIT_WEB_VIEW_TARGET_INFO_HTML) { > + if ((gint)info == Pasteboard::generalPasteboard()->m_helper->getWebViewTargetInfoHtml()) { > gtk_selection_data_set(selection_data, selection_data->target, 8, > reinterpret_cast<const guchar*>(clipboardData->markup()), > g_utf8_strlen(clipboardData->markup(), -1)); The braces should be removed as there's only one statement here. I've looked into this again and seems I overlooked a few things in my review. This patch is fine. r=me.
Jan Alonzo
Comment 18 2009-08-14 23:09:10 PDT
Jiahua Huang
Comment 19 2009-08-14 23:17:31 PDT
(In reply to comment #18) Hi Alonzo, Many thanks for your review and Landing~ Best regards.
Note You need to log in before you can comment on or make changes to this bug.