<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[178892] trunk/Source/WebKit2</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/178892">178892</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2015-01-22 00:30:39 -0800 (Thu, 22 Jan 2015)</dd>
</dl>
<h3>Log Message</h3>
<pre>[GTK] Use API::ContextMenuClient and API::InjectedBundle::PageContextMenuClient classes
https://bugs.webkit.org/show_bug.cgi?id=138467
Reviewed by Gustavo Noronha Silva.
* UIProcess/API/gtk/WebKitContextMenu.cpp:
(webkitContextMenuPopulate): Add a version that receives a Vector<WebContextMenuItemData>&.
(webkitContextMenuCreate): Change it to receive a const
Vector<WebContextMenuItemData>& instead of a API::Array* and also
add a another version that receives const Vector<ContextMenuItem>&.
* UIProcess/API/gtk/WebKitContextMenuClient.cpp:
(attachContextMenuClientToView): Use a class derived from
API::ContextMenuClient to implement the context menu client.
(getContextMenuFromProposedMenu): Deleted.
* UIProcess/API/gtk/WebKitContextMenuItem.cpp:
(webkitContextMenuItemCreate): Change it to receive a const
WebContextMenuItemData& and added another version that receives a
const ContextMenuItem&.
* UIProcess/API/gtk/WebKitContextMenuItemPrivate.h:
* UIProcess/API/gtk/WebKitContextMenuPrivate.h:
* UIProcess/API/gtk/WebKitWebView.cpp:
(webkitWebViewPopulateContextMenu): Remove the creation of a
WebHitTestResult::Data, since it receives it now as parameter.
* UIProcess/API/gtk/WebKitWebViewPrivate.h:
* WebProcess/InjectedBundle/API/gtk/WebKitWebHitTestResult.cpp:
(webkitWebHitTestResultCreate): Change it to receive a const
HitTestResult& instead of const InjectedBundleHitTestResult&.
* WebProcess/InjectedBundle/API/gtk/WebKitWebHitTestResultPrivate.h:
* WebProcess/InjectedBundle/API/gtk/WebKitWebPage.cpp:
(webkitWebPageCreate): Use a class derived from
API::InjectedBundle::PageContextMenuClient to implement the
context menu client.
(getContextMenuFromDefaultMenu): Deleted.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitContextMenucpp">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenu.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitContextMenuClientcpp">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuClient.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitContextMenuItemcpp">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuItem.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitContextMenuItemPrivateh">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuItemPrivate.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitContextMenuPrivateh">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuPrivate.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitWebViewcpp">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitWebViewPrivateh">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewPrivate.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessInjectedBundleAPIgtkWebKitWebHitTestResultcpp">trunk/Source/WebKit2/WebProcess/InjectedBundle/API/gtk/WebKitWebHitTestResult.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessInjectedBundleAPIgtkWebKitWebHitTestResultPrivateh">trunk/Source/WebKit2/WebProcess/InjectedBundle/API/gtk/WebKitWebHitTestResultPrivate.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessInjectedBundleAPIgtkWebKitWebPagecpp">trunk/Source/WebKit2/WebProcess/InjectedBundle/API/gtk/WebKitWebPage.cpp</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (178891 => 178892)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-01-22 08:05:45 UTC (rev 178891)
+++ trunk/Source/WebKit2/ChangeLog        2015-01-22 08:30:39 UTC (rev 178892)
</span><span class="lines">@@ -1,3 +1,39 @@
</span><ins>+2014-11-06 Carlos Garcia Campos <cgarcia@igalia.com>
+
+ [GTK] Use API::ContextMenuClient and API::InjectedBundle::PageContextMenuClient classes
+ https://bugs.webkit.org/show_bug.cgi?id=138467
+
+ Reviewed by Gustavo Noronha Silva.
+
+ * UIProcess/API/gtk/WebKitContextMenu.cpp:
+ (webkitContextMenuPopulate): Add a version that receives a Vector<WebContextMenuItemData>&.
+ (webkitContextMenuCreate): Change it to receive a const
+ Vector<WebContextMenuItemData>& instead of a API::Array* and also
+ add a another version that receives const Vector<ContextMenuItem>&.
+ * UIProcess/API/gtk/WebKitContextMenuClient.cpp:
+ (attachContextMenuClientToView): Use a class derived from
+ API::ContextMenuClient to implement the context menu client.
+ (getContextMenuFromProposedMenu): Deleted.
+ * UIProcess/API/gtk/WebKitContextMenuItem.cpp:
+ (webkitContextMenuItemCreate): Change it to receive a const
+ WebContextMenuItemData& and added another version that receives a
+ const ContextMenuItem&.
+ * UIProcess/API/gtk/WebKitContextMenuItemPrivate.h:
+ * UIProcess/API/gtk/WebKitContextMenuPrivate.h:
+ * UIProcess/API/gtk/WebKitWebView.cpp:
+ (webkitWebViewPopulateContextMenu): Remove the creation of a
+ WebHitTestResult::Data, since it receives it now as parameter.
+ * UIProcess/API/gtk/WebKitWebViewPrivate.h:
+ * WebProcess/InjectedBundle/API/gtk/WebKitWebHitTestResult.cpp:
+ (webkitWebHitTestResultCreate): Change it to receive a const
+ HitTestResult& instead of const InjectedBundleHitTestResult&.
+ * WebProcess/InjectedBundle/API/gtk/WebKitWebHitTestResultPrivate.h:
+ * WebProcess/InjectedBundle/API/gtk/WebKitWebPage.cpp:
+ (webkitWebPageCreate): Use a class derived from
+ API::InjectedBundle::PageContextMenuClient to implement the
+ context menu client.
+ (getContextMenuFromDefaultMenu): Deleted.
+
</ins><span class="cx"> 2015-01-22 Carlos Garcia Campos <cgarcia@igalia.com>
</span><span class="cx">
</span><span class="cx"> Unreviewed. Try to fix Debug build after r178889.
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitContextMenucpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenu.cpp (178891 => 178892)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenu.cpp        2015-01-22 08:05:45 UTC (rev 178891)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenu.cpp        2015-01-22 08:30:39 UTC (rev 178892)
</span><span class="lines">@@ -76,18 +76,34 @@
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span><del>-WebKitContextMenu* webkitContextMenuCreate(API::Array* items)
</del><ins>+void webkitContextMenuPopulate(WebKitContextMenu* menu, Vector<WebContextMenuItemData>& contextMenuItems)
</ins><span class="cx"> {
</span><ins>+ for (GList* item = menu->priv->items; item; item = g_list_next(item)) {
+ WebKitContextMenuItem* menuItem = WEBKIT_CONTEXT_MENU_ITEM(item->data);
+ contextMenuItems.append(WebContextMenuItemData(ContextMenuItem(webkitContextMenuItemRelease(menuItem))));
+ }
+}
+
+WebKitContextMenu* webkitContextMenuCreate(const Vector<WebContextMenuItemData>& items)
+{
</ins><span class="cx"> WebKitContextMenu* menu = webkit_context_menu_new();
</span><del>- for (size_t i = 0; i < items->size(); ++i) {
- WebContextMenuItem* item = static_cast<WebContextMenuItem*>(items->at(i));
</del><ins>+ for (const auto& item : items)
</ins><span class="cx"> webkit_context_menu_prepend(menu, webkitContextMenuItemCreate(item));
</span><del>- }
</del><span class="cx"> menu->priv->items = g_list_reverse(menu->priv->items);
</span><span class="cx">
</span><span class="cx"> return menu;
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+WebKitContextMenu* webkitContextMenuCreate(const Vector<ContextMenuItem>& items)
+{
+ WebKitContextMenu* menu = webkit_context_menu_new();
+ for (const auto& item : items)
+ webkit_context_menu_prepend(menu, webkitContextMenuItemCreate(item));
+ menu->priv->items = g_list_reverse(menu->priv->items);
+
+ return menu;
+}
+
</ins><span class="cx"> void webkitContextMenuSetParentItem(WebKitContextMenu* menu, WebKitContextMenuItem* item)
</span><span class="cx"> {
</span><span class="cx"> menu->priv->parentItem = item;
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitContextMenuClientcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuClient.cpp (178891 => 178892)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuClient.cpp        2015-01-22 08:05:45 UTC (rev 178891)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuClient.cpp        2015-01-22 08:30:39 UTC (rev 178892)
</span><span class="lines">@@ -20,38 +20,38 @@
</span><span class="cx"> #include "config.h"
</span><span class="cx"> #include "WebKitContextMenuClient.h"
</span><span class="cx">
</span><del>-#include "WebKitPrivate.h"
</del><ins>+#include "APIContextMenuClient.h"
</ins><span class="cx"> #include "WebKitWebViewBasePrivate.h"
</span><span class="cx"> #include "WebKitWebViewPrivate.h"
</span><span class="cx">
</span><span class="cx"> using namespace WebKit;
</span><span class="cx">
</span><del>-static void getContextMenuFromProposedMenu(WKPageRef, WKArrayRef proposedMenu, WKArrayRef*, WKHitTestResultRef hitTestResult, WKTypeRef userData, const void* clientInfo)
-{
- GRefPtr<GVariant> variant;
- if (userData) {
- ASSERT(WKGetTypeID(userData) == WKStringGetTypeID());
- CString userDataString = toImpl(static_cast<WKStringRef>(userData))->string().utf8();
- variant = adoptGRef(g_variant_parse(nullptr, userDataString.data(), userDataString.data() + userDataString.length(), nullptr, nullptr));
</del><ins>+class ContextMenuClient final: public API::ContextMenuClient {
+public:
+ explicit ContextMenuClient(WebKitWebView* webView)
+ : m_webView(webView)
+ {
</ins><span class="cx"> }
</span><del>- webkitWebViewPopulateContextMenu(WEBKIT_WEB_VIEW(clientInfo), toImpl(proposedMenu), toImpl(hitTestResult), variant.get());
-}
</del><span class="cx">
</span><ins>+private:
+ bool getContextMenuFromProposedMenu(WebPageProxy&, const Vector<WebContextMenuItemData>& proposedMenu, Vector<WebContextMenuItemData>&, const WebHitTestResult::Data& hitTestResultData, API::Object* userData) override
+ {
+ GRefPtr<GVariant> variant;
+ if (userData) {
+ ASSERT(userData->type() == API::Object::Type::String);
+ CString userDataString = static_cast<API::String*>(userData)->string().utf8();
+ variant = adoptGRef(g_variant_parse(nullptr, userDataString.data(), userDataString.data() + userDataString.length(), nullptr, nullptr));
+ }
+ webkitWebViewPopulateContextMenu(m_webView, proposedMenu, hitTestResultData, variant.get());
+ return true;
+ }
+
+ WebKitWebView* m_webView;
+};
+
</ins><span class="cx"> void attachContextMenuClientToView(WebKitWebView* webView)
</span><span class="cx"> {
</span><del>- WKPageContextMenuClientV3 wkContextMenuClient = {
- {
- 3, // version
- webView, // clientInfo
- },
- 0, // getContextMenuFromProposedMenu_deprecatedForUseWithV0
- 0, // customContextMenuItemSelected
- 0, // contextMenuDismissed
- getContextMenuFromProposedMenu,
- 0, // showContextMenu
- 0, // hideContextMenu
- };
- WKPageRef wkPage = toAPI(webkitWebViewBaseGetPage(WEBKIT_WEB_VIEW_BASE(webView)));
- WKPageSetPageContextMenuClient(wkPage, &wkContextMenuClient.base);
</del><ins>+ WebPageProxy* page = webkitWebViewBaseGetPage(WEBKIT_WEB_VIEW_BASE(webView));
+ page->setContextMenuClient(std::make_unique<ContextMenuClient>(webView));
</ins><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitContextMenuItemcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuItem.cpp (178891 => 178892)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuItem.cpp        2015-01-22 08:05:45 UTC (rev 178891)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuItem.cpp        2015-01-22 08:30:39 UTC (rev 178892)
</span><span class="lines">@@ -90,24 +90,31 @@
</span><span class="cx"> webkitContextMenuSetParentItem(subMenu.get(), item);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-WebKitContextMenuItem* webkitContextMenuItemCreate(WebContextMenuItem* webItem)
</del><ins>+WebKitContextMenuItem* webkitContextMenuItemCreate(const WebContextMenuItemData& itemData)
</ins><span class="cx"> {
</span><span class="cx"> WebKitContextMenuItem* item = WEBKIT_CONTEXT_MENU_ITEM(g_object_new(WEBKIT_TYPE_CONTEXT_MENU_ITEM, NULL));
</span><del>- WebContextMenuItemData* itemData = webItem->data();
- item->priv->menuItem = std::make_unique<ContextMenuItem>(itemData->type(), itemData->action(), itemData->title(), itemData->enabled(), itemData->checked());
- const Vector<WebContextMenuItemData>& subMenu = itemData->submenu();
- if (!subMenu.size())
- return item;
</del><span class="cx">
</span><del>- Vector<RefPtr<API::Object>> subMenuItems;
- subMenuItems.reserveInitialCapacity(subMenu.size());
- for (size_t i = 0; i < subMenu.size(); ++i)
- subMenuItems.uncheckedAppend(WebContextMenuItem::create(subMenu[i]).get());
- webkitContextMenuItemSetSubMenu(item, adoptGRef(webkitContextMenuCreate(API::Array::create(WTF::move(subMenuItems)).get())));
</del><ins>+ item->priv->menuItem = std::make_unique<ContextMenuItem>(itemData.type(), itemData.action(), itemData.title(), itemData.enabled(), itemData.checked());
+ const Vector<WebContextMenuItemData>& subMenu = itemData.submenu();
+ if (!subMenu.isEmpty())
+ webkitContextMenuItemSetSubMenu(item, adoptGRef(webkitContextMenuCreate(subMenu)));
</ins><span class="cx">
</span><span class="cx"> return item;
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+WebKitContextMenuItem* webkitContextMenuItemCreate(const ContextMenuItem& coreItem)
+{
+ WebKitContextMenuItem* item = WEBKIT_CONTEXT_MENU_ITEM(g_object_new(WEBKIT_TYPE_CONTEXT_MENU_ITEM, NULL));
+
+ item->priv->menuItem = std::make_unique<ContextMenuItem>(coreItem.type(), coreItem.action(), coreItem.title(), coreItem.enabled(), coreItem.checked());
+ if (coreItem.type() == WebCore::SubmenuType) {
+ Vector<ContextMenuItem> subMenu = contextMenuItemVector(coreItem.platformSubMenu());
+ webkitContextMenuItemSetSubMenu(item, adoptGRef(webkitContextMenuCreate(subMenu)));
+ }
+
+ return item;
+}
+
</ins><span class="cx"> static WebKitContextMenuItem* webkitContextMenuItemCreateForGtkItem(GtkMenuItem* menuItem)
</span><span class="cx"> {
</span><span class="cx"> WebKitContextMenuItem* item = WEBKIT_CONTEXT_MENU_ITEM(g_object_new(WEBKIT_TYPE_CONTEXT_MENU_ITEM, NULL));
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitContextMenuItemPrivateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuItemPrivate.h (178891 => 178892)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuItemPrivate.h        2015-01-22 08:05:45 UTC (rev 178891)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuItemPrivate.h        2015-01-22 08:30:39 UTC (rev 178892)
</span><span class="lines">@@ -20,10 +20,12 @@
</span><span class="cx"> #ifndef WebKitContextMenuItemPrivate_h
</span><span class="cx"> #define WebKitContextMenuItemPrivate_h
</span><span class="cx">
</span><ins>+#include "WebContextMenuItemData.h"
</ins><span class="cx"> #include "WebKitContextMenuItem.h"
</span><span class="cx"> #include "WebKitPrivate.h"
</span><span class="cx">
</span><del>-WebKitContextMenuItem* webkitContextMenuItemCreate(WebKit::WebContextMenuItem*);
</del><ins>+WebKitContextMenuItem* webkitContextMenuItemCreate(const WebKit::WebContextMenuItemData&);
+WebKitContextMenuItem* webkitContextMenuItemCreate(const WebCore::ContextMenuItem&);
</ins><span class="cx"> GtkMenuItem* webkitContextMenuItemRelease(WebKitContextMenuItem*);
</span><span class="cx"> void webkitContextMenuItemSetSubMenuFromGtkMenu(WebKitContextMenuItem*, GtkMenu*);
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitContextMenuPrivateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuPrivate.h (178891 => 178892)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuPrivate.h        2015-01-22 08:05:45 UTC (rev 178891)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuPrivate.h        2015-01-22 08:30:39 UTC (rev 178892)
</span><span class="lines">@@ -20,11 +20,14 @@
</span><span class="cx"> #ifndef WebKitContextMenuPrivate_h
</span><span class="cx"> #define WebKitContextMenuPrivate_h
</span><span class="cx">
</span><ins>+#include "WebContextMenuItemData.h"
</ins><span class="cx"> #include "WebKitContextMenu.h"
</span><span class="cx"> #include "WebKitPrivate.h"
</span><span class="cx">
</span><del>-WebKitContextMenu* webkitContextMenuCreate(API::Array* items);
</del><ins>+WebKitContextMenu* webkitContextMenuCreate(const Vector<WebKit::WebContextMenuItemData>&);
+WebKitContextMenu* webkitContextMenuCreate(const Vector<WebCore::ContextMenuItem>&);
</ins><span class="cx"> void webkitContextMenuPopulate(WebKitContextMenu*, Vector<WebCore::ContextMenuItem>&);
</span><ins>+void webkitContextMenuPopulate(WebKitContextMenu*, Vector<WebKit::WebContextMenuItemData>&);
</ins><span class="cx"> void webkitContextMenuSetParentItem(WebKitContextMenu*, WebKitContextMenuItem*);
</span><span class="cx"> WebKitContextMenuItem* webkitContextMenuGetParentItem(WebKitContextMenu*);
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitWebViewcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp (178891 => 178892)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp        2015-01-22 08:05:45 UTC (rev 178891)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp        2015-01-22 08:30:39 UTC (rev 178892)
</span><span class="lines">@@ -2059,30 +2059,17 @@
</span><span class="cx"> g_signal_emit(webView, signals[CONTEXT_MENU_DISMISSED], 0, NULL);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void webkitWebViewPopulateContextMenu(WebKitWebView* webView, API::Array* proposedMenu, WebHitTestResult* webHitTestResult, GVariant* userData)
</del><ins>+void webkitWebViewPopulateContextMenu(WebKitWebView* webView, const Vector<WebContextMenuItemData>& proposedMenu, const WebHitTestResult::Data& hitTestResultData, GVariant* userData)
</ins><span class="cx"> {
</span><span class="cx"> WebKitWebViewBase* webViewBase = WEBKIT_WEB_VIEW_BASE(webView);
</span><span class="cx"> WebContextMenuProxyGtk* contextMenuProxy = webkitWebViewBaseGetActiveContextMenuProxy(webViewBase);
</span><span class="cx"> ASSERT(contextMenuProxy);
</span><span class="cx">
</span><span class="cx"> GRefPtr<WebKitContextMenu> contextMenu = adoptGRef(webkitContextMenuCreate(proposedMenu));
</span><del>- if (webHitTestResult->isContentEditable())
</del><ins>+ if (hitTestResultData.isContentEditable)
</ins><span class="cx"> webkitWebViewCreateAndAppendInputMethodsMenuItem(webView, contextMenu.get());
</span><span class="cx">
</span><del>- // FIXME: we should use a custom ContextMenuClient at some point, that will receive a
- // const WebHitTestResult::Data& that we can use directly here.
- WebHitTestResult::Data data;
- data.absoluteImageURL = webHitTestResult->absoluteImageURL();
- data.absoluteLinkURL = webHitTestResult->absoluteLinkURL();
- data.absoluteMediaURL = webHitTestResult->absoluteMediaURL();
- data.linkLabel = webHitTestResult->linkLabel();
- data.linkTitle = webHitTestResult->linkTitle();
- data.isContentEditable = webHitTestResult->isContentEditable();
- data.elementBoundingBox = webHitTestResult->elementBoundingBox();
- data.isScrollbar = webHitTestResult->isScrollbar();
- data.isSelected = webHitTestResult->isSelected();
-
- GRefPtr<WebKitHitTestResult> hitTestResult = adoptGRef(webkitHitTestResultCreate(data));
</del><ins>+ GRefPtr<WebKitHitTestResult> hitTestResult = adoptGRef(webkitHitTestResultCreate(hitTestResultData));
</ins><span class="cx"> GUniquePtr<GdkEvent> contextMenuEvent(webkitWebViewBaseTakeContextMenuEvent(webViewBase));
</span><span class="cx">
</span><span class="cx"> if (userData)
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitWebViewPrivateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewPrivate.h (178891 => 178892)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewPrivate.h        2015-01-22 08:05:45 UTC (rev 178891)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewPrivate.h        2015-01-22 08:30:39 UTC (rev 178892)
</span><span class="lines">@@ -27,6 +27,7 @@
</span><span class="cx"> #ifndef WebKitWebViewPrivate_h
</span><span class="cx"> #define WebKitWebViewPrivate_h
</span><span class="cx">
</span><ins>+#include "WebContextMenuItemData.h"
</ins><span class="cx"> #include "WebHitTestResult.h"
</span><span class="cx"> #include "WebImage.h"
</span><span class="cx"> #include "WebKitWebView.h"
</span><span class="lines">@@ -53,7 +54,7 @@
</span><span class="cx"> void webkitWebViewRemoveLoadingWebResource(WebKitWebView*, uint64_t resourceIdentifier);
</span><span class="cx"> bool webkitWebViewEnterFullScreen(WebKitWebView*);
</span><span class="cx"> bool webkitWebViewLeaveFullScreen(WebKitWebView*);
</span><del>-void webkitWebViewPopulateContextMenu(WebKitWebView*, API::Array* proposedMenu, WebKit::WebHitTestResult*, GVariant*);
</del><ins>+void webkitWebViewPopulateContextMenu(WebKitWebView*, const Vector<WebKit::WebContextMenuItemData>& proposedMenu, const WebKit::WebHitTestResult::Data&, GVariant*);
</ins><span class="cx"> void webkitWebViewSubmitFormRequest(WebKitWebView*, WebKitFormSubmissionRequest*);
</span><span class="cx"> void webkitWebViewHandleAuthenticationChallenge(WebKitWebView*, WebKit::AuthenticationChallengeProxy*);
</span><span class="cx"> void webkitWebViewInsecureContentDetected(WebKitWebView*, WebKitInsecureContentEvent);
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessInjectedBundleAPIgtkWebKitWebHitTestResultcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/InjectedBundle/API/gtk/WebKitWebHitTestResult.cpp (178891 => 178892)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/InjectedBundle/API/gtk/WebKitWebHitTestResult.cpp        2015-01-22 08:05:45 UTC (rev 178891)
+++ trunk/Source/WebKit2/WebProcess/InjectedBundle/API/gtk/WebKitWebHitTestResult.cpp        2015-01-22 08:30:39 UTC (rev 178892)
</span><span class="lines">@@ -106,30 +106,36 @@
</span><span class="cx"> static_cast<GParamFlags>(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)));
</span><span class="cx"> }
</span><span class="cx">
</span><del>-WebKitWebHitTestResult* webkitWebHitTestResultCreate(const InjectedBundleHitTestResult& hitTestResult)
</del><ins>+WebKitWebHitTestResult* webkitWebHitTestResultCreate(const HitTestResult& hitTestResult)
</ins><span class="cx"> {
</span><span class="cx"> unsigned context = WEBKIT_HIT_TEST_RESULT_CONTEXT_DOCUMENT;
</span><del>- if (!hitTestResult.absoluteLinkURL().isEmpty())
</del><ins>+ String absoluteLinkURL = hitTestResult.absoluteLinkURL().string();
+ if (!absoluteLinkURL.isEmpty())
</ins><span class="cx"> context |= WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK;
</span><del>- if (!hitTestResult.absoluteImageURL().isEmpty())
</del><ins>+ String absoluteImageURL = hitTestResult.absoluteImageURL().string();
+ if (!absoluteImageURL.isEmpty())
</ins><span class="cx"> context |= WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE;
</span><del>- if (!hitTestResult.absoluteMediaURL().isEmpty())
</del><ins>+ String absoluteMediaURL = hitTestResult.absoluteMediaURL().string();
+ if (!absoluteMediaURL.isEmpty())
</ins><span class="cx"> context |= WEBKIT_HIT_TEST_RESULT_CONTEXT_MEDIA;
</span><del>- if (hitTestResult.coreHitTestResult().isContentEditable())
</del><ins>+ if (hitTestResult.isContentEditable())
</ins><span class="cx"> context |= WEBKIT_HIT_TEST_RESULT_CONTEXT_EDITABLE;
</span><del>- if (hitTestResult.coreHitTestResult().scrollbar())
</del><ins>+ if (hitTestResult.scrollbar())
</ins><span class="cx"> context |= WEBKIT_HIT_TEST_RESULT_CONTEXT_SCROLLBAR;
</span><span class="cx"> if (hitTestResult.isSelected())
</span><span class="cx"> context |= WEBKIT_HIT_TEST_RESULT_CONTEXT_SELECTION;
</span><span class="cx">
</span><ins>+ String linkTitle = hitTestResult.titleDisplayString();
+ String linkLabel = hitTestResult.textContent();
+
</ins><span class="cx"> return WEBKIT_WEB_HIT_TEST_RESULT(g_object_new(WEBKIT_TYPE_WEB_HIT_TEST_RESULT,
</span><span class="cx"> "context", context,
</span><del>- "link-uri", context & WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK ? hitTestResult.absoluteLinkURL().utf8().data() : nullptr,
- "image-uri", context & WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE ? hitTestResult.absoluteImageURL().utf8().data() : nullptr,
- "media-uri", context & WEBKIT_HIT_TEST_RESULT_CONTEXT_MEDIA ? hitTestResult.absoluteMediaURL().utf8().data() : nullptr,
- "link-title", !hitTestResult.linkTitle().isEmpty() ? hitTestResult.linkTitle().utf8().data() : nullptr,
- "link-label", !hitTestResult.linkLabel().isEmpty() ? hitTestResult.linkLabel().utf8().data() : nullptr,
- "node", kit(hitTestResult.coreHitTestResult().innerNonSharedNode()),
</del><ins>+ "link-uri", context & WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK ? absoluteLinkURL.utf8().data() : nullptr,
+ "image-uri", context & WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE ? absoluteImageURL.utf8().data() : nullptr,
+ "media-uri", context & WEBKIT_HIT_TEST_RESULT_CONTEXT_MEDIA ? absoluteMediaURL.utf8().data() : nullptr,
+ "link-title", !linkTitle.isEmpty() ? linkTitle.utf8().data() : nullptr,
+ "link-label", !linkLabel.isEmpty() ? linkLabel.utf8().data() : nullptr,
+ "node", kit(hitTestResult.innerNonSharedNode()),
</ins><span class="cx"> nullptr));
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessInjectedBundleAPIgtkWebKitWebHitTestResultPrivateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/InjectedBundle/API/gtk/WebKitWebHitTestResultPrivate.h (178891 => 178892)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/InjectedBundle/API/gtk/WebKitWebHitTestResultPrivate.h        2015-01-22 08:05:45 UTC (rev 178891)
+++ trunk/Source/WebKit2/WebProcess/InjectedBundle/API/gtk/WebKitWebHitTestResultPrivate.h        2015-01-22 08:30:39 UTC (rev 178892)
</span><span class="lines">@@ -20,9 +20,9 @@
</span><span class="cx"> #ifndef WebKitWebHitTestResultPrivate_h
</span><span class="cx"> #define WebKitWebHitTestResultPrivate_h
</span><span class="cx">
</span><del>-#include "InjectedBundleHitTestResult.h"
</del><span class="cx"> #include "WebKitWebHitTestResult.h"
</span><ins>+#include <WebCore/HitTestResult.h>
</ins><span class="cx">
</span><del>-WebKitWebHitTestResult* webkitWebHitTestResultCreate(const WebKit::InjectedBundleHitTestResult&);
</del><ins>+WebKitWebHitTestResult* webkitWebHitTestResultCreate(const WebCore::HitTestResult&);
</ins><span class="cx">
</span><span class="cx"> #endif // WebKitWebHitTestResultPrivate_h
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessInjectedBundleAPIgtkWebKitWebPagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/InjectedBundle/API/gtk/WebKitWebPage.cpp (178891 => 178892)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/InjectedBundle/API/gtk/WebKitWebPage.cpp        2015-01-22 08:05:45 UTC (rev 178891)
+++ trunk/Source/WebKit2/WebProcess/InjectedBundle/API/gtk/WebKitWebPage.cpp        2015-01-22 08:30:39 UTC (rev 178892)
</span><span class="lines">@@ -228,35 +228,34 @@
</span><span class="cx"> WebProcess::shared().injectedBundle()->postMessage(String::fromUTF8("WebPage.DidFailLoadForResource"), API::Dictionary::create(WTF::move(message)).get());
</span><span class="cx"> }
</span><span class="cx">
</span><del>-static void getContextMenuFromDefaultMenu(WKBundlePageRef, WKBundleHitTestResultRef wkHitTestResult, WKArrayRef wkDefaultMenu, WKArrayRef* wkNewMenu, WKTypeRef* wkUserData, const void* clientInfo)
-{
- GRefPtr<WebKitContextMenu> contextMenu = adoptGRef(webkitContextMenuCreate(toImpl(wkDefaultMenu)));
- GRefPtr<WebKitWebHitTestResult> webHitTestResult = adoptGRef(webkitWebHitTestResultCreate(*toImpl(wkHitTestResult)));
- gboolean returnValue;
- g_signal_emit(WEBKIT_WEB_PAGE(clientInfo), signals[CONTEXT_MENU], 0, contextMenu.get(), webHitTestResult.get(), &returnValue);
- if (GVariant* userData = webkit_context_menu_get_user_data(contextMenu.get())) {
- GUniquePtr<gchar> dataString(g_variant_print(userData, TRUE));
- *wkUserData = static_cast<WKTypeRef>(WKStringCreateWithUTF8CString(dataString.get()));
</del><ins>+class PageContextMenuClient final : public API::InjectedBundle::PageContextMenuClient {
+public:
+ explicit PageContextMenuClient(WebKitWebPage* webPage)
+ : m_webPage(webPage)
+ {
</ins><span class="cx"> }
</span><span class="cx">
</span><del>- if (!returnValue) {
- WKRetain(wkDefaultMenu);
- *wkNewMenu = wkDefaultMenu;
- return;
- }
</del><ins>+private:
+ bool getCustomMenuFromDefaultItems(WebPage&, const WebCore::HitTestResult& hitTestResult, const Vector<WebCore::ContextMenuItem>& defaultMenu, Vector<WebContextMenuItemData>& newMenu, RefPtr<API::Object>& userData) override
+ {
+ GRefPtr<WebKitContextMenu> contextMenu = adoptGRef(webkitContextMenuCreate(defaultMenu));
+ GRefPtr<WebKitWebHitTestResult> webHitTestResult = adoptGRef(webkitWebHitTestResultCreate(hitTestResult));
+ gboolean returnValue;
+ g_signal_emit(m_webPage, signals[CONTEXT_MENU], 0, contextMenu.get(), webHitTestResult.get(), &returnValue);
+ if (GVariant* variant = webkit_context_menu_get_user_data(contextMenu.get())) {
+ GUniquePtr<gchar> dataString(g_variant_print(variant, TRUE));
+ userData = API::String::create(String::fromUTF8(dataString.get()));
+ }
</ins><span class="cx">
</span><del>- Vector<ContextMenuItem> contextMenuItems;
- webkitContextMenuPopulate(contextMenu.get(), contextMenuItems);
</del><ins>+ if (!returnValue)
+ return false;
</ins><span class="cx">
</span><del>- Vector<RefPtr<API::Object>> newMenuItems;
- newMenuItems.reserveInitialCapacity(contextMenuItems.size());
- for (const auto& item : contextMenuItems)
- newMenuItems.uncheckedAppend(WebContextMenuItem::create(item));
</del><ins>+ webkitContextMenuPopulate(contextMenu.get(), newMenu);
+ return true;
+ }
</ins><span class="cx">
</span><del>- RefPtr<API::Array> array = API::Array::create(WTF::move(newMenuItems));
- *wkNewMenu = toAPI(array.get());
- WKRetain(*wkNewMenu);
-}
</del><ins>+ WebKitWebPage* m_webPage;
+};
</ins><span class="cx">
</span><span class="cx"> static void webkitWebPageGetProperty(GObject* object, guint propId, GValue* value, GParamSpec* paramSpec)
</span><span class="cx"> {
</span><span class="lines">@@ -436,14 +435,7 @@
</span><span class="cx"> };
</span><span class="cx"> WKBundlePageSetResourceLoadClient(toAPI(webPage), &resourceLoadClient.base);
</span><span class="cx">
</span><del>- WKBundlePageContextMenuClientV0 contextMenuClient = {
- {
- 0, // version
- page, // clientInfo
- },
- getContextMenuFromDefaultMenu,
- };
- WKBundlePageSetContextMenuClient(toAPI(webPage), &contextMenuClient.base);
</del><ins>+ webPage->setInjectedBundleContextMenuClient(std::make_unique<PageContextMenuClient>(page));
</ins><span class="cx">
</span><span class="cx"> return page;
</span><span class="cx"> }
</span></span></pre>
</div>
</div>
</body>
</html>