<!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&lt;WebContextMenuItemData&gt;&amp;.
(webkitContextMenuCreate): Change it to receive a const
Vector&lt;WebContextMenuItemData&gt;&amp; instead of a API::Array* and also
add a another version that receives const Vector&lt;ContextMenuItem&gt;&amp;.
* 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&amp; and added another version that receives a
const ContextMenuItem&amp;.
* 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&amp; instead of const InjectedBundleHitTestResult&amp;.
* 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  &lt;cgarcia@igalia.com&gt;
+
+        [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&lt;WebContextMenuItemData&gt;&amp;.
+        (webkitContextMenuCreate): Change it to receive a const
+        Vector&lt;WebContextMenuItemData&gt;&amp; instead of a API::Array* and also
+        add a another version that receives const Vector&lt;ContextMenuItem&gt;&amp;.
+        * 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&amp; and added another version that receives a
+        const ContextMenuItem&amp;.
+        * 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&amp; instead of const InjectedBundleHitTestResult&amp;.
+        * 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  &lt;cgarcia@igalia.com&gt;
</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&lt;WebContextMenuItemData&gt;&amp; contextMenuItems)
</ins><span class="cx"> {
</span><ins>+    for (GList* item = menu-&gt;priv-&gt;items; item; item = g_list_next(item)) {
+        WebKitContextMenuItem* menuItem = WEBKIT_CONTEXT_MENU_ITEM(item-&gt;data);
+        contextMenuItems.append(WebContextMenuItemData(ContextMenuItem(webkitContextMenuItemRelease(menuItem))));
+    }
+}
+
+WebKitContextMenu* webkitContextMenuCreate(const Vector&lt;WebContextMenuItemData&gt;&amp; items)
+{
</ins><span class="cx">     WebKitContextMenu* menu = webkit_context_menu_new();
</span><del>-    for (size_t i = 0; i &lt; items-&gt;size(); ++i) {
-        WebContextMenuItem* item = static_cast&lt;WebContextMenuItem*&gt;(items-&gt;at(i));
</del><ins>+    for (const auto&amp; item : items)
</ins><span class="cx">         webkit_context_menu_prepend(menu, webkitContextMenuItemCreate(item));
</span><del>-    }
</del><span class="cx">     menu-&gt;priv-&gt;items = g_list_reverse(menu-&gt;priv-&gt;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&lt;ContextMenuItem&gt;&amp; items)
+{
+    WebKitContextMenu* menu = webkit_context_menu_new();
+    for (const auto&amp; item : items)
+        webkit_context_menu_prepend(menu, webkitContextMenuItemCreate(item));
+    menu-&gt;priv-&gt;items = g_list_reverse(menu-&gt;priv-&gt;items);
+
+    return menu;
+}
+
</ins><span class="cx"> void webkitContextMenuSetParentItem(WebKitContextMenu* menu, WebKitContextMenuItem* item)
</span><span class="cx"> {
</span><span class="cx">     menu-&gt;priv-&gt;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 &quot;config.h&quot;
</span><span class="cx"> #include &quot;WebKitContextMenuClient.h&quot;
</span><span class="cx"> 
</span><del>-#include &quot;WebKitPrivate.h&quot;
</del><ins>+#include &quot;APIContextMenuClient.h&quot;
</ins><span class="cx"> #include &quot;WebKitWebViewBasePrivate.h&quot;
</span><span class="cx"> #include &quot;WebKitWebViewPrivate.h&quot;
</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&lt;GVariant&gt; variant;
-    if (userData) {
-        ASSERT(WKGetTypeID(userData) == WKStringGetTypeID());
-        CString userDataString = toImpl(static_cast&lt;WKStringRef&gt;(userData))-&gt;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&amp;, const Vector&lt;WebContextMenuItemData&gt;&amp; proposedMenu, Vector&lt;WebContextMenuItemData&gt;&amp;, const WebHitTestResult::Data&amp; hitTestResultData, API::Object* userData) override
+    {
+        GRefPtr&lt;GVariant&gt; variant;
+        if (userData) {
+            ASSERT(userData-&gt;type() == API::Object::Type::String);
+            CString userDataString = static_cast&lt;API::String*&gt;(userData)-&gt;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, &amp;wkContextMenuClient.base);
</del><ins>+    WebPageProxy* page = webkitWebViewBaseGetPage(WEBKIT_WEB_VIEW_BASE(webView));
+    page-&gt;setContextMenuClient(std::make_unique&lt;ContextMenuClient&gt;(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&amp; 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-&gt;data();
-    item-&gt;priv-&gt;menuItem = std::make_unique&lt;ContextMenuItem&gt;(itemData-&gt;type(), itemData-&gt;action(), itemData-&gt;title(), itemData-&gt;enabled(), itemData-&gt;checked());
-    const Vector&lt;WebContextMenuItemData&gt;&amp; subMenu = itemData-&gt;submenu();
-    if (!subMenu.size())
-        return item;
</del><span class="cx"> 
</span><del>-    Vector&lt;RefPtr&lt;API::Object&gt;&gt; subMenuItems;
-    subMenuItems.reserveInitialCapacity(subMenu.size());
-    for (size_t i = 0; i &lt; subMenu.size(); ++i)
-        subMenuItems.uncheckedAppend(WebContextMenuItem::create(subMenu[i]).get());
-    webkitContextMenuItemSetSubMenu(item, adoptGRef(webkitContextMenuCreate(API::Array::create(WTF::move(subMenuItems)).get())));
</del><ins>+    item-&gt;priv-&gt;menuItem = std::make_unique&lt;ContextMenuItem&gt;(itemData.type(), itemData.action(), itemData.title(), itemData.enabled(), itemData.checked());
+    const Vector&lt;WebContextMenuItemData&gt;&amp; 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&amp; coreItem)
+{
+    WebKitContextMenuItem* item = WEBKIT_CONTEXT_MENU_ITEM(g_object_new(WEBKIT_TYPE_CONTEXT_MENU_ITEM, NULL));
+
+    item-&gt;priv-&gt;menuItem = std::make_unique&lt;ContextMenuItem&gt;(coreItem.type(), coreItem.action(), coreItem.title(), coreItem.enabled(), coreItem.checked());
+    if (coreItem.type() == WebCore::SubmenuType) {
+        Vector&lt;ContextMenuItem&gt; 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 &quot;WebContextMenuItemData.h&quot;
</ins><span class="cx"> #include &quot;WebKitContextMenuItem.h&quot;
</span><span class="cx"> #include &quot;WebKitPrivate.h&quot;
</span><span class="cx"> 
</span><del>-WebKitContextMenuItem* webkitContextMenuItemCreate(WebKit::WebContextMenuItem*);
</del><ins>+WebKitContextMenuItem* webkitContextMenuItemCreate(const WebKit::WebContextMenuItemData&amp;);
+WebKitContextMenuItem* webkitContextMenuItemCreate(const WebCore::ContextMenuItem&amp;);
</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 &quot;WebContextMenuItemData.h&quot;
</ins><span class="cx"> #include &quot;WebKitContextMenu.h&quot;
</span><span class="cx"> #include &quot;WebKitPrivate.h&quot;
</span><span class="cx"> 
</span><del>-WebKitContextMenu* webkitContextMenuCreate(API::Array* items);
</del><ins>+WebKitContextMenu* webkitContextMenuCreate(const Vector&lt;WebKit::WebContextMenuItemData&gt;&amp;);
+WebKitContextMenu* webkitContextMenuCreate(const Vector&lt;WebCore::ContextMenuItem&gt;&amp;);
</ins><span class="cx"> void webkitContextMenuPopulate(WebKitContextMenu*, Vector&lt;WebCore::ContextMenuItem&gt;&amp;);
</span><ins>+void webkitContextMenuPopulate(WebKitContextMenu*, Vector&lt;WebKit::WebContextMenuItemData&gt;&amp;);
</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&lt;WebContextMenuItemData&gt;&amp; proposedMenu, const WebHitTestResult::Data&amp; 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&lt;WebKitContextMenu&gt; contextMenu = adoptGRef(webkitContextMenuCreate(proposedMenu));
</span><del>-    if (webHitTestResult-&gt;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&amp; that we can use directly here.
-    WebHitTestResult::Data data;
-    data.absoluteImageURL = webHitTestResult-&gt;absoluteImageURL();
-    data.absoluteLinkURL = webHitTestResult-&gt;absoluteLinkURL();
-    data.absoluteMediaURL = webHitTestResult-&gt;absoluteMediaURL();
-    data.linkLabel = webHitTestResult-&gt;linkLabel();
-    data.linkTitle = webHitTestResult-&gt;linkTitle();
-    data.isContentEditable = webHitTestResult-&gt;isContentEditable();
-    data.elementBoundingBox = webHitTestResult-&gt;elementBoundingBox();
-    data.isScrollbar = webHitTestResult-&gt;isScrollbar();
-    data.isSelected = webHitTestResult-&gt;isSelected();
-
-    GRefPtr&lt;WebKitHitTestResult&gt; hitTestResult = adoptGRef(webkitHitTestResultCreate(data));
</del><ins>+    GRefPtr&lt;WebKitHitTestResult&gt; hitTestResult = adoptGRef(webkitHitTestResultCreate(hitTestResultData));
</ins><span class="cx">     GUniquePtr&lt;GdkEvent&gt; 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 &quot;WebContextMenuItemData.h&quot;
</ins><span class="cx"> #include &quot;WebHitTestResult.h&quot;
</span><span class="cx"> #include &quot;WebImage.h&quot;
</span><span class="cx"> #include &quot;WebKitWebView.h&quot;
</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&lt;WebKit::WebContextMenuItemData&gt;&amp; proposedMenu, const WebKit::WebHitTestResult::Data&amp;, 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&lt;GParamFlags&gt;(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-WebKitWebHitTestResult* webkitWebHitTestResultCreate(const InjectedBundleHitTestResult&amp; hitTestResult)
</del><ins>+WebKitWebHitTestResult* webkitWebHitTestResultCreate(const HitTestResult&amp; 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">         &quot;context&quot;, context,
</span><del>-        &quot;link-uri&quot;, context &amp; WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK ? hitTestResult.absoluteLinkURL().utf8().data() : nullptr,
-        &quot;image-uri&quot;, context &amp; WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE ? hitTestResult.absoluteImageURL().utf8().data() : nullptr,
-        &quot;media-uri&quot;, context &amp; WEBKIT_HIT_TEST_RESULT_CONTEXT_MEDIA ? hitTestResult.absoluteMediaURL().utf8().data() : nullptr,
-        &quot;link-title&quot;, !hitTestResult.linkTitle().isEmpty() ? hitTestResult.linkTitle().utf8().data() : nullptr,
-        &quot;link-label&quot;, !hitTestResult.linkLabel().isEmpty() ? hitTestResult.linkLabel().utf8().data() : nullptr,
-        &quot;node&quot;, kit(hitTestResult.coreHitTestResult().innerNonSharedNode()),
</del><ins>+        &quot;link-uri&quot;, context &amp; WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK ? absoluteLinkURL.utf8().data() : nullptr,
+        &quot;image-uri&quot;, context &amp; WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE ? absoluteImageURL.utf8().data() : nullptr,
+        &quot;media-uri&quot;, context &amp; WEBKIT_HIT_TEST_RESULT_CONTEXT_MEDIA ? absoluteMediaURL.utf8().data() : nullptr,
+        &quot;link-title&quot;, !linkTitle.isEmpty() ? linkTitle.utf8().data() : nullptr,
+        &quot;link-label&quot;, !linkLabel.isEmpty() ? linkLabel.utf8().data() : nullptr,
+        &quot;node&quot;, 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 &quot;InjectedBundleHitTestResult.h&quot;
</del><span class="cx"> #include &quot;WebKitWebHitTestResult.h&quot;
</span><ins>+#include &lt;WebCore/HitTestResult.h&gt;
</ins><span class="cx"> 
</span><del>-WebKitWebHitTestResult* webkitWebHitTestResultCreate(const WebKit::InjectedBundleHitTestResult&amp;);
</del><ins>+WebKitWebHitTestResult* webkitWebHitTestResultCreate(const WebCore::HitTestResult&amp;);
</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()-&gt;postMessage(String::fromUTF8(&quot;WebPage.DidFailLoadForResource&quot;), 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&lt;WebKitContextMenu&gt; contextMenu = adoptGRef(webkitContextMenuCreate(toImpl(wkDefaultMenu)));
-    GRefPtr&lt;WebKitWebHitTestResult&gt; webHitTestResult = adoptGRef(webkitWebHitTestResultCreate(*toImpl(wkHitTestResult)));
-    gboolean returnValue;
-    g_signal_emit(WEBKIT_WEB_PAGE(clientInfo), signals[CONTEXT_MENU], 0, contextMenu.get(), webHitTestResult.get(), &amp;returnValue);
-    if (GVariant* userData = webkit_context_menu_get_user_data(contextMenu.get())) {
-        GUniquePtr&lt;gchar&gt; dataString(g_variant_print(userData, TRUE));
-        *wkUserData = static_cast&lt;WKTypeRef&gt;(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&amp;, const WebCore::HitTestResult&amp; hitTestResult, const Vector&lt;WebCore::ContextMenuItem&gt;&amp; defaultMenu, Vector&lt;WebContextMenuItemData&gt;&amp; newMenu, RefPtr&lt;API::Object&gt;&amp; userData) override
+    {
+        GRefPtr&lt;WebKitContextMenu&gt; contextMenu = adoptGRef(webkitContextMenuCreate(defaultMenu));
+        GRefPtr&lt;WebKitWebHitTestResult&gt; webHitTestResult = adoptGRef(webkitWebHitTestResultCreate(hitTestResult));
+        gboolean returnValue;
+        g_signal_emit(m_webPage, signals[CONTEXT_MENU], 0, contextMenu.get(), webHitTestResult.get(), &amp;returnValue);
+        if (GVariant* variant = webkit_context_menu_get_user_data(contextMenu.get())) {
+            GUniquePtr&lt;gchar&gt; dataString(g_variant_print(variant, TRUE));
+            userData = API::String::create(String::fromUTF8(dataString.get()));
+        }
</ins><span class="cx"> 
</span><del>-    Vector&lt;ContextMenuItem&gt; contextMenuItems;
-    webkitContextMenuPopulate(contextMenu.get(), contextMenuItems);
</del><ins>+        if (!returnValue)
+            return false;
</ins><span class="cx"> 
</span><del>-    Vector&lt;RefPtr&lt;API::Object&gt;&gt; newMenuItems;
-    newMenuItems.reserveInitialCapacity(contextMenuItems.size());
-    for (const auto&amp; item : contextMenuItems)
-        newMenuItems.uncheckedAppend(WebContextMenuItem::create(item));
</del><ins>+        webkitContextMenuPopulate(contextMenu.get(), newMenu);
+        return true;
+    }
</ins><span class="cx"> 
</span><del>-    RefPtr&lt;API::Array&gt; 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), &amp;resourceLoadClient.base);
</span><span class="cx"> 
</span><del>-    WKBundlePageContextMenuClientV0 contextMenuClient = {
-        {
-            0, // version
-            page, // clientInfo
-        },
-        getContextMenuFromDefaultMenu,
-    };
-    WKBundlePageSetContextMenuClient(toAPI(webPage), &amp;contextMenuClient.base);
</del><ins>+    webPage-&gt;setInjectedBundleContextMenuClient(std::make_unique&lt;PageContextMenuClient&gt;(page));
</ins><span class="cx"> 
</span><span class="cx">     return page;
</span><span class="cx"> }
</span></span></pre>
</div>
</div>

</body>
</html>