<!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>[192247] trunk</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/192247">192247</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2015-11-10 08:08:32 -0800 (Tue, 10 Nov 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>[GTK] Use CROSS_PLATFORM_CONTEXT_MENUS
https://bugs.webkit.org/show_bug.cgi?id=150642

Reviewed by Martin Robinson.

Source/WebCore:

Remove GTK+ implementations of old context menu classes.

* PlatformGTK.cmake:
* platform/ContextMenuItem.h:
* platform/gtk/ContextMenuGtk.cpp: Removed.
* platform/gtk/ContextMenuItemGtk.cpp: Removed.

Source/WebKit2:

Use CROSS_PLATFORM_CONTEXT_MENUS. Since we can't just use
WebContextMenuItemData, because we need to bind a GtkAction to the
menu items, this patch adds WebContextMenuItemGtk that derives
from WebContextMenuItemData and adds the GtkAction and its own
handling of submenu items. WebKitContextMenu and
WebKitContextMenuItem no longer deal with the widgets (GtkMenu and
GtkMenuItem), that are now created by WebContextMenuProxy when
building the popup menu.
This patch also removes the support for input methods submenu,
since it has been deprecated (and disabled by default) in GTK+ for
long time, it has never actually worked (because the menu items
don't have a GtkAction associated) and it makes the code more
complicated for no benefit.

* PlatformGTK.cmake:
* Shared/gtk/WebContextMenuItemGtk.cpp: Added.
(WebKit::gtkStockIDFromContextMenuAction):
(WebKit::WebContextMenuItemGtk::WebContextMenuItemGtk):
(WebKit::WebContextMenuItemGtk::~WebContextMenuItemGtk):
(WebKit::WebContextMenuItemGtk::createGtkActionIfNeeded):
* Shared/gtk/WebContextMenuItemGtk.h: Copied from Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.h.
(WebKit::WebContextMenuItemGtk::gtkAction):
(WebKit::WebContextMenuItemGtk::submenuItems):
* UIProcess/API/gtk/WebKitContextMenu.cpp:
(webkitContextMenuPopulate):
(webkitContextMenuCreate): Deleted.
(webkitContextMenuSetParentItem): Deleted.
* UIProcess/API/gtk/WebKitContextMenuActions.cpp:
(webkitContextMenuActionGetForContextMenuItem):
* UIProcess/API/gtk/WebKitContextMenuActionsPrivate.h:
* UIProcess/API/gtk/WebKitContextMenuItem.cpp:
(webkitContextMenuItemSetSubMenu):
(webkitContextMenuItemCreate):
(webkitContextMenuItemToWebContextMenuItemGtk):
(webkitContextMenuItemToWebContextMenuItemData):
(webkit_context_menu_item_new):
(webkit_context_menu_item_new_from_stock_action):
(webkit_context_menu_item_new_from_stock_action_with_label):
(webkit_context_menu_item_new_with_submenu):
(webkit_context_menu_item_new_separator):
(webkit_context_menu_item_get_action):
(webkit_context_menu_item_get_stock_action):
(webkit_context_menu_item_is_separator): Deleted.
* UIProcess/API/gtk/WebKitContextMenuItemPrivate.h:
* UIProcess/API/gtk/WebKitContextMenuPrivate.h:
* UIProcess/API/gtk/WebKitWebView.cpp:
(webkitWebViewPopulateContextMenu):
(contextMenuDismissed): Deleted.
(webkitWebViewSubmitFormRequest): Deleted.
(webkitWebViewHandleAuthenticationChallenge): Deleted.
(webkitWebViewInsecureContentDetected): Deleted.
(webkitWebViewEmitRunColorChooser): Deleted.
(webkitWebViewRequestInstallMissingMediaPlugins): Deleted.
* UIProcess/gtk/WebContextMenuProxyGtk.cpp:
(WebKit::contextMenuItemActivatedCallback):
(WebKit::WebContextMenuProxyGtk::append):
(WebKit::WebContextMenuProxyGtk::populate):
(WebKit::WebContextMenuProxyGtk::show):
(WebKit::WebContextMenuProxyGtk::WebContextMenuProxyGtk):
(WebKit::WebContextMenuProxyGtk::~WebContextMenuProxyGtk):
* UIProcess/gtk/WebContextMenuProxyGtk.h:
(WebKit::WebContextMenuProxyGtk::gtkMenu):
* WebProcess/InjectedBundle/API/gtk/WebKitWebPage.cpp:

Source/WTF:

Enable CROSS_PLATFORM_CONTEXT_MENUS for GTK+ port.

* wtf/Platform.h:

Tools:

Remove test for input methods submenu.

* TestWebKitAPI/Tests/WebKit2Gtk/TestContextMenu.cpp:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWTFChangeLog">trunk/Source/WTF/ChangeLog</a></li>
<li><a href="#trunkSourceWTFwtfPlatformh">trunk/Source/WTF/wtf/Platform.h</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorePlatformGTKcmake">trunk/Source/WebCore/PlatformGTK.cmake</a></li>
<li><a href="#trunkSourceWebCoreplatformContextMenuItemh">trunk/Source/WebCore/platform/ContextMenuItem.h</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2PlatformGTKcmake">trunk/Source/WebKit2/PlatformGTK.cmake</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitContextMenucpp">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenu.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitContextMenuActionscpp">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuActions.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitContextMenuActionsPrivateh">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuActionsPrivate.h</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="#trunkSourceWebKit2UIProcessgtkWebContextMenuProxyGtkcpp">trunk/Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessgtkWebContextMenuProxyGtkh">trunk/Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessInjectedBundleAPIgtkWebKitWebPagecpp">trunk/Source/WebKit2/WebProcess/InjectedBundle/API/gtk/WebKitWebPage.cpp</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsTestWebKitAPITestsWebKit2GtkTestContextMenucpp">trunk/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestContextMenu.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2SharedgtkWebContextMenuItemGtkcpp">trunk/Source/WebKit2/Shared/gtk/WebContextMenuItemGtk.cpp</a></li>
<li><a href="#trunkSourceWebKit2SharedgtkWebContextMenuItemGtkh">trunk/Source/WebKit2/Shared/gtk/WebContextMenuItemGtk.h</a></li>
</ul>

<h3>Removed Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreplatformgtkContextMenuGtkcpp">trunk/Source/WebCore/platform/gtk/ContextMenuGtk.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgtkContextMenuItemGtkcpp">trunk/Source/WebCore/platform/gtk/ContextMenuItemGtk.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWTFChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/ChangeLog (192246 => 192247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/ChangeLog        2015-11-10 15:45:21 UTC (rev 192246)
+++ trunk/Source/WTF/ChangeLog        2015-11-10 16:08:32 UTC (rev 192247)
</span><span class="lines">@@ -1,3 +1,14 @@
</span><ins>+2015-11-10  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
+
+        [GTK] Use CROSS_PLATFORM_CONTEXT_MENUS
+        https://bugs.webkit.org/show_bug.cgi?id=150642
+
+        Reviewed by Martin Robinson.
+
+        Enable CROSS_PLATFORM_CONTEXT_MENUS for GTK+ port.
+
+        * wtf/Platform.h:
+
</ins><span class="cx"> 2015-11-09  Anders Carlsson  &lt;andersca@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Introspect reply block types as well
</span></span></pre></div>
<a id="trunkSourceWTFwtfPlatformh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/Platform.h (192246 => 192247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/Platform.h        2015-11-10 15:45:21 UTC (rev 192246)
+++ trunk/Source/WTF/wtf/Platform.h        2015-11-10 16:08:32 UTC (rev 192247)
</span><span class="lines">@@ -930,7 +930,7 @@
</span><span class="cx"> /* Set up a define for a common error that is intended to cause a build error -- thus the space after Error. */
</span><span class="cx"> #define WTF_PLATFORM_CFNETWORK Error USE_macro_should_be_used_with_CFNETWORK
</span><span class="cx"> 
</span><del>-#if PLATFORM(WIN)
</del><ins>+#if PLATFORM(WIN) || PLATFORM(GTK)
</ins><span class="cx"> #define USE_CROSS_PLATFORM_CONTEXT_MENUS 1
</span><span class="cx"> #endif
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (192246 => 192247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-11-10 15:45:21 UTC (rev 192246)
+++ trunk/Source/WebCore/ChangeLog        2015-11-10 16:08:32 UTC (rev 192247)
</span><span class="lines">@@ -1,3 +1,17 @@
</span><ins>+2015-11-10  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
+
+        [GTK] Use CROSS_PLATFORM_CONTEXT_MENUS
+        https://bugs.webkit.org/show_bug.cgi?id=150642
+
+        Reviewed by Martin Robinson.
+
+        Remove GTK+ implementations of old context menu classes.
+
+        * PlatformGTK.cmake:
+        * platform/ContextMenuItem.h:
+        * platform/gtk/ContextMenuGtk.cpp: Removed.
+        * platform/gtk/ContextMenuItemGtk.cpp: Removed.
+
</ins><span class="cx"> 2015-11-10  Xabier Rodriguez Calvar  &lt;calvaris@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [Streams API] Fix style issues
</span></span></pre></div>
<a id="trunkSourceWebCorePlatformGTKcmake"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/PlatformGTK.cmake (192246 => 192247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/PlatformGTK.cmake        2015-11-10 15:45:21 UTC (rev 192246)
+++ trunk/Source/WebCore/PlatformGTK.cmake        2015-11-10 16:08:32 UTC (rev 192247)
</span><span class="lines">@@ -241,8 +241,6 @@
</span><span class="cx">     platform/graphics/gtk/ImageBufferGtk.cpp
</span><span class="cx">     platform/graphics/gtk/ImageGtk.cpp
</span><span class="cx"> 
</span><del>-    platform/gtk/ContextMenuGtk.cpp
-    platform/gtk/ContextMenuItemGtk.cpp
</del><span class="cx">     platform/gtk/CursorGtk.cpp
</span><span class="cx">     platform/gtk/DataObjectGtk.cpp
</span><span class="cx">     platform/gtk/DragDataGtk.cpp
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformContextMenuItemh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/ContextMenuItem.h (192246 => 192247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/ContextMenuItem.h        2015-11-10 15:45:21 UTC (rev 192246)
+++ trunk/Source/WebCore/platform/ContextMenuItem.h        2015-11-10 16:08:32 UTC (rev 192247)
</span><span class="lines">@@ -36,9 +36,6 @@
</span><span class="cx"> #include &lt;wtf/RetainPtr.h&gt;
</span><span class="cx"> OBJC_CLASS NSImage;
</span><span class="cx"> OBJC_CLASS NSMenuItem;
</span><del>-#elif PLATFORM(GTK)
-typedef struct _GtkMenuItem GtkMenuItem;
-typedef struct _GtkAction GtkAction;
</del><span class="cx"> #endif
</span><span class="cx"> #endif // ENABLE(CONTEXT_MENUS)
</span><span class="cx"> 
</span><span class="lines">@@ -180,8 +177,6 @@
</span><span class="cx"> #if ENABLE(CONTEXT_MENUS)
</span><span class="cx"> #if PLATFORM(COCOA)
</span><span class="cx">     typedef NSMenuItem* PlatformMenuItemDescription;
</span><del>-#elif PLATFORM(GTK)
-    typedef GtkMenuItem* PlatformMenuItemDescription;
</del><span class="cx"> #else
</span><span class="cx">     typedef void* PlatformMenuItemDescription;
</span><span class="cx"> #endif
</span><span class="lines">@@ -212,10 +207,6 @@
</span><span class="cx">         WEBCORE_EXPORT static ContextMenuItem shareMenuItem(const URL&amp; absoluteLinkURL, const URL&amp; downloadableMediaURL, NSImage *, const String&amp; selectedText);
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-#if PLATFORM(GTK)
-        GtkAction* gtkAction() const;
-#endif
-
</del><span class="cx"> #if USE(CROSS_PLATFORM_CONTEXT_MENUS)
</span><span class="cx">         ContextMenuItem(ContextMenuAction, const String&amp;, bool enabled, bool checked, const Vector&lt;ContextMenuItem&gt;&amp; subMenuItems);
</span><span class="cx">         explicit ContextMenuItem(const PlatformContextMenuItem&amp;);
</span><span class="lines">@@ -240,10 +231,6 @@
</span><span class="cx"> 
</span><span class="cx">         bool isNull() const { return !m_platformDescription; }
</span><span class="cx"> 
</span><del>-#if PLATFORM(GTK)
-        WEBCORE_EXPORT PlatformMenuItemDescription releasePlatformDescription();
-#endif
-
</del><span class="cx">         WEBCORE_EXPORT PlatformMenuItemDescription platformDescription() const;
</span><span class="cx"> 
</span><span class="cx">         WEBCORE_EXPORT String title() const;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgtkContextMenuGtkcpp"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebCore/platform/gtk/ContextMenuGtk.cpp (192246 => 192247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/gtk/ContextMenuGtk.cpp        2015-11-10 15:45:21 UTC (rev 192246)
+++ trunk/Source/WebCore/platform/gtk/ContextMenuGtk.cpp        2015-11-10 16:08:32 UTC (rev 192247)
</span><span class="lines">@@ -1,124 +0,0 @@
</span><del>-/*
- *  Copyright (C) 2007 Holger Hans Peter Freyther
- * Portions Copyright (c) 2010 Motorola Mobility, Inc.  All rights reserved.
- *
- *  This library is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public
- *  License as published by the Free Software Foundation; either
- *  version 2 of the License, or (at your option) any later version.
- *
- *  This library is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this library; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- */
-
-#include &quot;config.h&quot;
-
-#if ENABLE(CONTEXT_MENUS)
-
-#include &quot;ContextMenu.h&quot;
-
-#include &lt;gtk/gtk.h&gt;
-#include &lt;wtf/glib/GRefPtr.h&gt;
-#include &lt;wtf/glib/GUniquePtr.h&gt;
-
-namespace WebCore {
-
-ContextMenu::ContextMenu()
-{
-    m_platformDescription = GTK_MENU(gtk_menu_new());
-}
-
-ContextMenu::ContextMenu(const PlatformMenuDescription menu)
-    : m_platformDescription(menu)
-{
-}
-
-ContextMenu::~ContextMenu()
-{
-    if (m_platformDescription)
-        gtk_widget_destroy(GTK_WIDGET(m_platformDescription));
-}
-
-void ContextMenu::appendItem(ContextMenuItem&amp; item)
-{
-    ASSERT(m_platformDescription);
-
-    GRefPtr&lt;GtkWidget&gt; platformItem = GTK_WIDGET(item.releasePlatformDescription());
-    ASSERT(platformItem);
-
-    if (GtkWidget* parent = gtk_widget_get_parent(platformItem.get()))
-        gtk_container_remove(GTK_CONTAINER(parent), platformItem.get());
-
-    gtk_menu_shell_append(GTK_MENU_SHELL(m_platformDescription), platformItem.get());
-    gtk_widget_show(platformItem.get());
-}
-
-void ContextMenu::setPlatformDescription(PlatformMenuDescription menu)
-{
-    if (m_platformDescription == menu)
-        return;
-    if (m_platformDescription)
-        gtk_widget_destroy(GTK_WIDGET(m_platformDescription));
-
-    m_platformDescription = menu;
-}
-
-PlatformMenuDescription ContextMenu::platformDescription() const
-{
-    return m_platformDescription;
-}
-
-PlatformMenuDescription ContextMenu::releasePlatformDescription()
-{
-    PlatformMenuDescription description = m_platformDescription;
-    m_platformDescription = 0;
-
-    return description;
-}
-
-unsigned ContextMenu::itemCount() const
-{
-    ASSERT(m_platformDescription);
-
-    GUniquePtr&lt;GList&gt; children(gtk_container_get_children(GTK_CONTAINER(m_platformDescription)));
-    return g_list_length(children.get());
-}
-
-Vector&lt;ContextMenuItem&gt; contextMenuItemVector(const PlatformMenuDescription menu)
-{
-    Vector&lt;ContextMenuItem&gt; menuItemVector;
-
-    GUniquePtr&lt;GList&gt; children(gtk_container_get_children(GTK_CONTAINER(menu)));
-    int itemCount = g_list_length(children.get());
-    menuItemVector.reserveCapacity(itemCount);
-
-    for (GList* item = children.get(); item; item = g_list_next(item)) {
-        GtkWidget* widget = static_cast&lt;GtkWidget*&gt;(item-&gt;data);
-        if (!GTK_IS_MENU_ITEM(widget))
-            continue;
-        menuItemVector.append(GTK_MENU_ITEM(widget));
-    }
-
-    return menuItemVector;
-}
-
-PlatformMenuDescription platformMenuDescription(Vector&lt;ContextMenuItem&gt;&amp; subMenuItems)
-{
-    GtkMenu* menu = GTK_MENU(gtk_menu_new());
-    for (size_t i = 0; i &lt; subMenuItems.size(); i++) {
-        GtkWidget* platformItem = GTK_WIDGET(subMenuItems[i].releasePlatformDescription());
-        gtk_menu_shell_append(GTK_MENU_SHELL(menu), platformItem);
-        gtk_widget_show(platformItem);
-    }
-    return menu;
-}
-
-}
-
-#endif // ENABLE(CONTEXT_MENUS)
</del></span></pre></div>
<a id="trunkSourceWebCoreplatformgtkContextMenuItemGtkcpp"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebCore/platform/gtk/ContextMenuItemGtk.cpp (192246 => 192247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/gtk/ContextMenuItemGtk.cpp        2015-11-10 15:45:21 UTC (rev 192246)
+++ trunk/Source/WebCore/platform/gtk/ContextMenuItemGtk.cpp        2015-11-10 16:08:32 UTC (rev 192247)
</span><span class="lines">@@ -1,293 +0,0 @@
</span><del>-/*
- *  Copyright (C) 2007 Holger Hans Peter Freyther
- *  Copyright (C) 2010 Igalia S.L
- * Portions Copyright (c) 2010 Motorola Mobility, Inc.  All rights reserved.
- *
- *  This library is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public
- *  License as published by the Free Software Foundation; either
- *  version 2 of the License, or (at your option) any later version.
- *
- *  This library is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this library; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- */
-
-#include &quot;config.h&quot;
-
-#if ENABLE(CONTEXT_MENUS)
-
-#include &quot;ContextMenuItem.h&quot;
-
-#include &quot;ContextMenu.h&quot;
-#include &lt;gtk/gtk.h&gt;
-#include &lt;wtf/glib/GRefPtr.h&gt;
-#include &lt;wtf/glib/GUniquePtr.h&gt;
-#include &lt;wtf/text/CString.h&gt;
-
-#define WEBKIT_CONTEXT_MENU_ACTION &quot;webkit-context-menu&quot;
-
-namespace WebCore {
-
-static const char* gtkStockIDFromContextMenuAction(const ContextMenuAction&amp; action)
-{
-    switch (action) {
-    case ContextMenuItemTagCopyLinkToClipboard:
-    case ContextMenuItemTagCopyImageToClipboard:
-    case ContextMenuItemTagCopyMediaLinkToClipboard:
-    case ContextMenuItemTagCopy:
-        return GTK_STOCK_COPY;
-    case ContextMenuItemTagOpenLinkInNewWindow:
-    case ContextMenuItemTagOpenImageInNewWindow:
-    case ContextMenuItemTagOpenFrameInNewWindow:
-    case ContextMenuItemTagOpenMediaInNewWindow:
-        return GTK_STOCK_OPEN;
-    case ContextMenuItemTagDownloadLinkToDisk:
-    case ContextMenuItemTagDownloadImageToDisk:
-        return GTK_STOCK_SAVE;
-    case ContextMenuItemTagGoBack:
-        return GTK_STOCK_GO_BACK;
-    case ContextMenuItemTagGoForward:
-        return GTK_STOCK_GO_FORWARD;
-    case ContextMenuItemTagStop:
-        return GTK_STOCK_STOP;
-    case ContextMenuItemTagReload:
-        return GTK_STOCK_REFRESH;
-    case ContextMenuItemTagCut:
-        return GTK_STOCK_CUT;
-    case ContextMenuItemTagPaste:
-        return GTK_STOCK_PASTE;
-    case ContextMenuItemTagDelete:
-        return GTK_STOCK_DELETE;
-    case ContextMenuItemTagSelectAll:
-        return GTK_STOCK_SELECT_ALL;
-    case ContextMenuItemTagSpellingGuess:
-        return 0;
-    case ContextMenuItemTagIgnoreSpelling:
-        return GTK_STOCK_NO;
-    case ContextMenuItemTagLearnSpelling:
-        return GTK_STOCK_OK;
-    case ContextMenuItemTagOther:
-        return GTK_STOCK_MISSING_IMAGE;
-    case ContextMenuItemTagSearchInSpotlight:
-        return GTK_STOCK_FIND;
-    case ContextMenuItemTagSearchWeb:
-        return GTK_STOCK_FIND;
-    case ContextMenuItemTagOpenWithDefaultApplication:
-        return GTK_STOCK_OPEN;
-    case ContextMenuItemPDFZoomIn:
-        return GTK_STOCK_ZOOM_IN;
-    case ContextMenuItemPDFZoomOut:
-        return GTK_STOCK_ZOOM_OUT;
-    case ContextMenuItemPDFAutoSize:
-        return GTK_STOCK_ZOOM_FIT;
-    case ContextMenuItemPDFNextPage:
-        return GTK_STOCK_GO_FORWARD;
-    case ContextMenuItemPDFPreviousPage:
-        return GTK_STOCK_GO_BACK;
-    // New tags, not part of API
-    case ContextMenuItemTagOpenLink:
-        return GTK_STOCK_OPEN;
-    case ContextMenuItemTagCheckSpelling:
-        return GTK_STOCK_SPELL_CHECK;
-    case ContextMenuItemTagFontMenu:
-        return GTK_STOCK_SELECT_FONT;
-    case ContextMenuItemTagShowFonts:
-        return GTK_STOCK_SELECT_FONT;
-    case ContextMenuItemTagBold:
-        return GTK_STOCK_BOLD;
-    case ContextMenuItemTagItalic:
-        return GTK_STOCK_ITALIC;
-    case ContextMenuItemTagUnderline:
-        return GTK_STOCK_UNDERLINE;
-    case ContextMenuItemTagShowColors:
-        return GTK_STOCK_SELECT_COLOR;
-    case ContextMenuItemTagToggleMediaControls:
-    case ContextMenuItemTagToggleMediaLoop:
-    case ContextMenuItemTagCopyImageUrlToClipboard:
-        // No icon for this.
-        return 0;
-    case ContextMenuItemTagEnterVideoFullscreen:
-        return GTK_STOCK_FULLSCREEN;
-    default:
-        return 0;
-    }
-}
-
-static PlatformMenuItemDescription createPlatformMenuItemDescription(ContextMenuItemType type, ContextMenuAction action, const String&amp; title, bool enabled, bool checked)
-{
-    if (type == SeparatorType)
-        return GTK_MENU_ITEM(gtk_separator_menu_item_new());
-
-    GUniquePtr&lt;char&gt; actionName(g_strdup_printf(&quot;context-menu-action-%d&quot;, action));
-    GRefPtr&lt;GtkAction&gt; platformAction;
-
-    if (type == CheckableActionType) {
-        platformAction = adoptGRef(GTK_ACTION(gtk_toggle_action_new(actionName.get(), title.utf8().data(), 0, gtkStockIDFromContextMenuAction(action))));
-        gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(platformAction.get()), checked);
-    } else
-        platformAction = adoptGRef(gtk_action_new(actionName.get(), title.utf8().data(), 0, gtkStockIDFromContextMenuAction(action)));
-    gtk_action_set_sensitive(platformAction.get(), enabled);
-
-    GtkMenuItem* item = GTK_MENU_ITEM(gtk_action_create_menu_item(platformAction.get()));
-    g_object_set_data(G_OBJECT(item), WEBKIT_CONTEXT_MENU_ACTION, GINT_TO_POINTER(action));
-
-    return item;
-}
-
-ContextMenuItem::ContextMenuItem()
-    : m_platformDescription(nullptr)
-{
-}
-
-// Extract the ActionType from the menu item
-ContextMenuItem::ContextMenuItem(PlatformMenuItemDescription item)
-    : m_platformDescription(item)
-{
-    // Don't show accel labels in context menu items.
-    GtkAction* action = gtkAction();
-    if (!action)
-        return;
-
-    if (!gtk_action_get_accel_path(action))
-        return;
-
-    GtkWidget* child = gtk_bin_get_child(GTK_BIN(item));
-    if (GTK_IS_ACCEL_LABEL(child))
-        gtk_accel_label_set_accel_closure(GTK_ACCEL_LABEL(child), 0);
-}
-
-ContextMenuItem::ContextMenuItem(ContextMenu* subMenu)
-{
-    m_platformDescription = GTK_MENU_ITEM(gtk_menu_item_new());
-    if (subMenu)
-        setSubMenu(subMenu);
-}
-
-ContextMenuItem::ContextMenuItem(ContextMenuItemType type, ContextMenuAction action, const String&amp; title, ContextMenu* subMenu)
-{
-    m_platformDescription = createPlatformMenuItemDescription(type, action, title, true, false);
-    if (subMenu)
-        setSubMenu(subMenu);
-}
-
-ContextMenuItem::ContextMenuItem(ContextMenuItemType type, ContextMenuAction action, const String&amp; title, bool enabled, bool checked)
-{
-    m_platformDescription = createPlatformMenuItemDescription(type, action, title, enabled, checked);
-}
-
-ContextMenuItem::ContextMenuItem(ContextMenuAction action, const String&amp; title, bool enabled, bool checked, Vector&lt;ContextMenuItem&gt;&amp; subMenuItems)
-{
-    m_platformDescription = createPlatformMenuItemDescription(SubmenuType, action, title, enabled, checked);
-    setSubMenu(subMenuItems);
-}
-
-ContextMenuItem::~ContextMenuItem()
-{
-}
-
-PlatformMenuItemDescription ContextMenuItem::releasePlatformDescription()
-{
-    PlatformMenuItemDescription platformDescription = m_platformDescription;
-    m_platformDescription = 0;
-    return platformDescription;
-}
-
-ContextMenuItemType ContextMenuItem::type() const
-{
-    if (GTK_IS_SEPARATOR_MENU_ITEM(m_platformDescription))
-        return SeparatorType;
-    if (GTK_IS_CHECK_MENU_ITEM(m_platformDescription))
-        return CheckableActionType;
-    if (gtk_menu_item_get_submenu(m_platformDescription))
-        return SubmenuType;
-    return ActionType;
-}
-
-void ContextMenuItem::setType(ContextMenuItemType type)
-{
-    if (type == SeparatorType)
-        m_platformDescription = GTK_MENU_ITEM(gtk_separator_menu_item_new());
-}
-
-ContextMenuAction ContextMenuItem::action() const
-{
-    return static_cast&lt;ContextMenuAction&gt;(GPOINTER_TO_INT(g_object_get_data(G_OBJECT(m_platformDescription), WEBKIT_CONTEXT_MENU_ACTION)));
-}
-
-void ContextMenuItem::setAction(ContextMenuAction action)
-{
-    g_object_set_data(G_OBJECT(m_platformDescription), WEBKIT_CONTEXT_MENU_ACTION, GINT_TO_POINTER(action));
-}
-
-String ContextMenuItem::title() const
-{
-    GtkAction* action = gtkAction();
-    return action ? String::fromUTF8(gtk_action_get_label(action)) : String();
-}
-
-void ContextMenuItem::setTitle(const String&amp; title)
-{
-    GtkAction* action = gtkAction();
-    if (action)
-        gtk_action_set_label(action, title.utf8().data());
-}
-
-PlatformMenuDescription ContextMenuItem::platformSubMenu() const
-{
-    GtkWidget* subMenu = gtk_menu_item_get_submenu(m_platformDescription);
-    return subMenu ? GTK_MENU(subMenu) : 0;
-}
-
-void ContextMenuItem::setSubMenu(ContextMenu* menu)
-{
-    gtk_menu_item_set_submenu(m_platformDescription, GTK_WIDGET(menu-&gt;releasePlatformDescription()));
-}
-
-void ContextMenuItem::setSubMenu(Vector&lt;ContextMenuItem&gt;&amp; subMenuItems)
-{
-    ContextMenu menu(platformMenuDescription(subMenuItems));
-    setSubMenu(&amp;menu);
-}
-
-void ContextMenuItem::setChecked(bool shouldCheck)
-{
-    GtkAction* action = gtkAction();
-    if (action &amp;&amp; GTK_IS_TOGGLE_ACTION(action))
-        gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), shouldCheck);
-}
-
-bool ContextMenuItem::checked() const
-{
-    GtkAction* action = gtkAction();
-    if (action &amp;&amp; GTK_IS_TOGGLE_ACTION(action))
-        return gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(action));
-    return false;
-}
-
-bool ContextMenuItem::enabled() const
-{
-    GtkAction* action = gtkAction();
-    return action ? gtk_action_get_sensitive(action) : false;
-}
-
-void ContextMenuItem::setEnabled(bool shouldEnable)
-{
-    GtkAction* action = gtkAction();
-    if (action)
-        gtk_action_set_sensitive(action, shouldEnable);
-}
-
-GtkAction* ContextMenuItem::gtkAction() const
-{
-    return gtk_activatable_get_related_action(GTK_ACTIVATABLE(m_platformDescription));
-}
-
-}
-
-#endif // ENABLE(CONTEXT_MENUS)
</del></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (192246 => 192247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-11-10 15:45:21 UTC (rev 192246)
+++ trunk/Source/WebKit2/ChangeLog        2015-11-10 16:08:32 UTC (rev 192247)
</span><span class="lines">@@ -1,3 +1,74 @@
</span><ins>+2015-11-10  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
+
+        [GTK] Use CROSS_PLATFORM_CONTEXT_MENUS
+        https://bugs.webkit.org/show_bug.cgi?id=150642
+
+        Reviewed by Martin Robinson.
+
+        Use CROSS_PLATFORM_CONTEXT_MENUS. Since we can't just use
+        WebContextMenuItemData, because we need to bind a GtkAction to the
+        menu items, this patch adds WebContextMenuItemGtk that derives
+        from WebContextMenuItemData and adds the GtkAction and its own
+        handling of submenu items. WebKitContextMenu and
+        WebKitContextMenuItem no longer deal with the widgets (GtkMenu and
+        GtkMenuItem), that are now created by WebContextMenuProxy when
+        building the popup menu.
+        This patch also removes the support for input methods submenu,
+        since it has been deprecated (and disabled by default) in GTK+ for
+        long time, it has never actually worked (because the menu items
+        don't have a GtkAction associated) and it makes the code more
+        complicated for no benefit.
+
+        * PlatformGTK.cmake:
+        * Shared/gtk/WebContextMenuItemGtk.cpp: Added.
+        (WebKit::gtkStockIDFromContextMenuAction):
+        (WebKit::WebContextMenuItemGtk::WebContextMenuItemGtk):
+        (WebKit::WebContextMenuItemGtk::~WebContextMenuItemGtk):
+        (WebKit::WebContextMenuItemGtk::createGtkActionIfNeeded):
+        * Shared/gtk/WebContextMenuItemGtk.h: Copied from Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.h.
+        (WebKit::WebContextMenuItemGtk::gtkAction):
+        (WebKit::WebContextMenuItemGtk::submenuItems):
+        * UIProcess/API/gtk/WebKitContextMenu.cpp:
+        (webkitContextMenuPopulate):
+        (webkitContextMenuCreate): Deleted.
+        (webkitContextMenuSetParentItem): Deleted.
+        * UIProcess/API/gtk/WebKitContextMenuActions.cpp:
+        (webkitContextMenuActionGetForContextMenuItem):
+        * UIProcess/API/gtk/WebKitContextMenuActionsPrivate.h:
+        * UIProcess/API/gtk/WebKitContextMenuItem.cpp:
+        (webkitContextMenuItemSetSubMenu):
+        (webkitContextMenuItemCreate):
+        (webkitContextMenuItemToWebContextMenuItemGtk):
+        (webkitContextMenuItemToWebContextMenuItemData):
+        (webkit_context_menu_item_new):
+        (webkit_context_menu_item_new_from_stock_action):
+        (webkit_context_menu_item_new_from_stock_action_with_label):
+        (webkit_context_menu_item_new_with_submenu):
+        (webkit_context_menu_item_new_separator):
+        (webkit_context_menu_item_get_action):
+        (webkit_context_menu_item_get_stock_action):
+        (webkit_context_menu_item_is_separator): Deleted.
+        * UIProcess/API/gtk/WebKitContextMenuItemPrivate.h:
+        * UIProcess/API/gtk/WebKitContextMenuPrivate.h:
+        * UIProcess/API/gtk/WebKitWebView.cpp:
+        (webkitWebViewPopulateContextMenu):
+        (contextMenuDismissed): Deleted.
+        (webkitWebViewSubmitFormRequest): Deleted.
+        (webkitWebViewHandleAuthenticationChallenge): Deleted.
+        (webkitWebViewInsecureContentDetected): Deleted.
+        (webkitWebViewEmitRunColorChooser): Deleted.
+        (webkitWebViewRequestInstallMissingMediaPlugins): Deleted.
+        * UIProcess/gtk/WebContextMenuProxyGtk.cpp:
+        (WebKit::contextMenuItemActivatedCallback):
+        (WebKit::WebContextMenuProxyGtk::append):
+        (WebKit::WebContextMenuProxyGtk::populate):
+        (WebKit::WebContextMenuProxyGtk::show):
+        (WebKit::WebContextMenuProxyGtk::WebContextMenuProxyGtk):
+        (WebKit::WebContextMenuProxyGtk::~WebContextMenuProxyGtk):
+        * UIProcess/gtk/WebContextMenuProxyGtk.h:
+        (WebKit::WebContextMenuProxyGtk::gtkMenu):
+        * WebProcess/InjectedBundle/API/gtk/WebKitWebPage.cpp:
+
</ins><span class="cx"> 2015-11-09  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed. Fix GTK+ build after r192184.
</span></span></pre></div>
<a id="trunkSourceWebKit2PlatformGTKcmake"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/PlatformGTK.cmake (192246 => 192247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/PlatformGTK.cmake        2015-11-10 15:45:21 UTC (rev 192246)
+++ trunk/Source/WebKit2/PlatformGTK.cmake        2015-11-10 16:08:32 UTC (rev 192247)
</span><span class="lines">@@ -70,6 +70,7 @@
</span><span class="cx">     Shared/gtk/NativeWebWheelEventGtk.cpp
</span><span class="cx">     Shared/gtk/PrintInfoGtk.cpp
</span><span class="cx">     Shared/gtk/ProcessExecutablePathGtk.cpp
</span><ins>+    Shared/gtk/WebContextMenuItemGtk.cpp
</ins><span class="cx">     Shared/gtk/WebEventFactory.cpp
</span><span class="cx"> 
</span><span class="cx">     Shared/linux/WebMemorySamplerLinux.cpp
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedgtkWebContextMenuItemGtkcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/Shared/gtk/WebContextMenuItemGtk.cpp (0 => 192247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/gtk/WebContextMenuItemGtk.cpp                                (rev 0)
+++ trunk/Source/WebKit2/Shared/gtk/WebContextMenuItemGtk.cpp        2015-11-10 16:08:32 UTC (rev 192247)
</span><span class="lines">@@ -0,0 +1,164 @@
</span><ins>+/*
+ * Copyright (C) 2015 Igalia S.L.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;WebContextMenuItemGtk.h&quot;
+
+#include &lt;gtk/gtk.h&gt;
+#include &lt;wtf/glib/GUniquePtr.h&gt;
+
+using namespace WebCore;
+
+namespace WebKit {
+
+static const char* gtkStockIDFromContextMenuAction(ContextMenuAction action)
+{
+    switch (action) {
+    case ContextMenuItemTagCopyLinkToClipboard:
+    case ContextMenuItemTagCopyImageToClipboard:
+    case ContextMenuItemTagCopyMediaLinkToClipboard:
+    case ContextMenuItemTagCopy:
+        return GTK_STOCK_COPY;
+    case ContextMenuItemTagOpenLinkInNewWindow:
+    case ContextMenuItemTagOpenImageInNewWindow:
+    case ContextMenuItemTagOpenFrameInNewWindow:
+    case ContextMenuItemTagOpenMediaInNewWindow:
+        return GTK_STOCK_OPEN;
+    case ContextMenuItemTagDownloadLinkToDisk:
+    case ContextMenuItemTagDownloadImageToDisk:
+        return GTK_STOCK_SAVE;
+    case ContextMenuItemTagGoBack:
+        return GTK_STOCK_GO_BACK;
+    case ContextMenuItemTagGoForward:
+        return GTK_STOCK_GO_FORWARD;
+    case ContextMenuItemTagStop:
+        return GTK_STOCK_STOP;
+    case ContextMenuItemTagReload:
+        return GTK_STOCK_REFRESH;
+    case ContextMenuItemTagCut:
+        return GTK_STOCK_CUT;
+    case ContextMenuItemTagPaste:
+        return GTK_STOCK_PASTE;
+    case ContextMenuItemTagDelete:
+        return GTK_STOCK_DELETE;
+    case ContextMenuItemTagSelectAll:
+        return GTK_STOCK_SELECT_ALL;
+    case ContextMenuItemTagSpellingGuess:
+        return 0;
+    case ContextMenuItemTagIgnoreSpelling:
+        return GTK_STOCK_NO;
+    case ContextMenuItemTagLearnSpelling:
+        return GTK_STOCK_OK;
+    case ContextMenuItemTagOther:
+        return GTK_STOCK_MISSING_IMAGE;
+    case ContextMenuItemTagSearchInSpotlight:
+        return GTK_STOCK_FIND;
+    case ContextMenuItemTagSearchWeb:
+        return GTK_STOCK_FIND;
+    case ContextMenuItemTagOpenWithDefaultApplication:
+        return GTK_STOCK_OPEN;
+    case ContextMenuItemPDFZoomIn:
+        return GTK_STOCK_ZOOM_IN;
+    case ContextMenuItemPDFZoomOut:
+        return GTK_STOCK_ZOOM_OUT;
+    case ContextMenuItemPDFAutoSize:
+        return GTK_STOCK_ZOOM_FIT;
+    case ContextMenuItemPDFNextPage:
+        return GTK_STOCK_GO_FORWARD;
+    case ContextMenuItemPDFPreviousPage:
+        return GTK_STOCK_GO_BACK;
+    // New tags, not part of API
+    case ContextMenuItemTagOpenLink:
+        return GTK_STOCK_OPEN;
+    case ContextMenuItemTagCheckSpelling:
+        return GTK_STOCK_SPELL_CHECK;
+    case ContextMenuItemTagFontMenu:
+        return GTK_STOCK_SELECT_FONT;
+    case ContextMenuItemTagShowFonts:
+        return GTK_STOCK_SELECT_FONT;
+    case ContextMenuItemTagBold:
+        return GTK_STOCK_BOLD;
+    case ContextMenuItemTagItalic:
+        return GTK_STOCK_ITALIC;
+    case ContextMenuItemTagUnderline:
+        return GTK_STOCK_UNDERLINE;
+    case ContextMenuItemTagShowColors:
+        return GTK_STOCK_SELECT_COLOR;
+    case ContextMenuItemTagToggleMediaControls:
+    case ContextMenuItemTagToggleMediaLoop:
+    case ContextMenuItemTagCopyImageUrlToClipboard:
+        // No icon for this.
+        return 0;
+    case ContextMenuItemTagEnterVideoFullscreen:
+        return GTK_STOCK_FULLSCREEN;
+    default:
+        return 0;
+    }
+}
+
+WebContextMenuItemGtk::WebContextMenuItemGtk(ContextMenuItemType type, ContextMenuAction action, const String&amp; title, bool enabled, bool checked)
+    : WebContextMenuItemData(type, action, title, enabled, checked)
+{
+    createGtkActionIfNeeded();
+}
+
+WebContextMenuItemGtk::WebContextMenuItemGtk(const WebContextMenuItemData&amp; data)
+    : WebContextMenuItemData(data.type(), data.action(), data.title(), data.enabled(), data.checked())
+{
+    createGtkActionIfNeeded();
+}
+
+WebContextMenuItemGtk::WebContextMenuItemGtk(const WebContextMenuItemGtk&amp; data, Vector&lt;WebContextMenuItemGtk&gt;&amp;&amp; submenu)
+    : WebContextMenuItemData(SubmenuType, data.action(), data.title(), data.enabled(), false)
+{
+    m_action = data.gtkAction();
+    m_submenuItems = WTF::move(submenu);
+}
+
+WebContextMenuItemGtk::WebContextMenuItemGtk(GtkAction* action)
+    : WebContextMenuItemData(GTK_IS_TOGGLE_ACTION(action) ? CheckableActionType : ActionType, ContextMenuItemBaseApplicationTag, String::fromUTF8(gtk_action_get_label(action)), gtk_action_get_sensitive(action), GTK_IS_TOGGLE_ACTION(action) ? gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(action)) : false)
+{
+    m_action = action;
+}
+
+WebContextMenuItemGtk::~WebContextMenuItemGtk()
+{
+}
+
+void WebContextMenuItemGtk::createGtkActionIfNeeded()
+{
+    if (type() == SeparatorType)
+        return;
+
+    GUniquePtr&lt;char&gt; actionName(g_strdup_printf(&quot;context-menu-action-%d&quot;, action()));
+    if (type() == CheckableActionType) {
+        m_action = adoptGRef(GTK_ACTION(gtk_toggle_action_new(actionName.get(), title().utf8().data(), nullptr, gtkStockIDFromContextMenuAction(action()))));
+        gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(m_action.get()), checked());
+    } else
+        m_action = adoptGRef(gtk_action_new(actionName.get(), title().utf8().data(), 0, gtkStockIDFromContextMenuAction(action())));
+    gtk_action_set_sensitive(m_action.get(), enabled());
+}
+
+} // namespace WebKit
</ins></span></pre></div>
<a id="trunkSourceWebKit2SharedgtkWebContextMenuItemGtkhfromrev192246trunkSourceWebKit2UIProcessgtkWebContextMenuProxyGtkh"></a>
<div class="copfile"><h4>Copied: trunk/Source/WebKit2/Shared/gtk/WebContextMenuItemGtk.h (from rev 192246, trunk/Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.h) (0 => 192247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/gtk/WebContextMenuItemGtk.h                                (rev 0)
+++ trunk/Source/WebKit2/Shared/gtk/WebContextMenuItemGtk.h        2015-11-10 16:08:32 UTC (rev 192247)
</span><span class="lines">@@ -0,0 +1,58 @@
</span><ins>+/*
+ * Copyright (C) 2015 Igalia S.L.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef WebContextMenuItemGtk_h
+#define WebContextMenuItemGtk_h
+
+#include &quot;APIObject.h&quot;
+#include &quot;WebContextMenuItemData.h&quot;
+#include &lt;wtf/glib/GRefPtr.h&gt;
+
+typedef struct _GtkAction GtkAction;
+
+namespace WebKit {
+
+class WebContextMenuItemGtk : public WebContextMenuItemData {
+    WTF_MAKE_FAST_ALLOCATED;
+public:
+    WebContextMenuItemGtk(WebCore::ContextMenuItemType, WebCore::ContextMenuAction, const String&amp; title, bool enabled = true, bool checked = false);
+    WebContextMenuItemGtk(const WebContextMenuItemData&amp;);
+    WebContextMenuItemGtk(const WebContextMenuItemGtk&amp;, Vector&lt;WebContextMenuItemGtk&gt;&amp;&amp; submenu);
+    WebContextMenuItemGtk(GtkAction*);
+    ~WebContextMenuItemGtk();
+
+    GtkAction* gtkAction() const { return m_action.get(); }
+    const Vector&lt;WebContextMenuItemGtk&gt;&amp; submenuItems() const { return m_submenuItems; }
+
+private:
+    void createGtkActionIfNeeded();
+
+    GRefPtr&lt;GtkAction&gt; m_action;
+    Vector&lt;WebContextMenuItemGtk&gt; m_submenuItems;
+};
+
+} // namespace WebKit
+
+#endif // WebContextMenuItemGtk_h
</ins></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitContextMenucpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenu.cpp (192246 => 192247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenu.cpp        2015-11-10 15:45:21 UTC (rev 192246)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenu.cpp        2015-11-10 16:08:32 UTC (rev 192247)
</span><span class="lines">@@ -68,19 +68,19 @@
</span><span class="cx">     gObjectClass-&gt;dispose = webkitContextMenuDispose;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void webkitContextMenuPopulate(WebKitContextMenu* menu, Vector&lt;ContextMenuItem&gt;&amp; contextMenuItems)
</del><ins>+void webkitContextMenuPopulate(WebKitContextMenu* menu, Vector&lt;WebContextMenuItemData&gt;&amp; contextMenuItems)
</ins><span class="cx"> {
</span><span class="cx">     for (GList* item = menu-&gt;priv-&gt;items; item; item = g_list_next(item)) {
</span><span class="cx">         WebKitContextMenuItem* menuItem = WEBKIT_CONTEXT_MENU_ITEM(item-&gt;data);
</span><del>-        contextMenuItems.append(ContextMenuItem(webkitContextMenuItemRelease(menuItem)));
</del><ins>+        contextMenuItems.append(webkitContextMenuItemToWebContextMenuItemData(menuItem));
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void webkitContextMenuPopulate(WebKitContextMenu* menu, Vector&lt;WebContextMenuItemData&gt;&amp; contextMenuItems)
</del><ins>+void webkitContextMenuPopulate(WebKitContextMenu* menu, Vector&lt;WebContextMenuItemGtk&gt;&amp; contextMenuItems)
</ins><span class="cx"> {
</span><span class="cx">     for (GList* item = menu-&gt;priv-&gt;items; item; item = g_list_next(item)) {
</span><span class="cx">         WebKitContextMenuItem* menuItem = WEBKIT_CONTEXT_MENU_ITEM(item-&gt;data);
</span><del>-        contextMenuItems.append(WebContextMenuItemData(ContextMenuItem(webkitContextMenuItemRelease(menuItem))));
</del><ins>+        contextMenuItems.append(webkitContextMenuItemToWebContextMenuItemGtk(menuItem));
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -94,16 +94,6 @@
</span><span class="cx">     return menu;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-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;
-}
-
</del><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="trunkSourceWebKit2UIProcessAPIgtkWebKitContextMenuActionscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuActions.cpp (192246 => 192247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuActions.cpp        2015-11-10 15:45:21 UTC (rev 192246)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuActions.cpp        2015-11-10 16:08:32 UTC (rev 192247)
</span><span class="lines">@@ -135,9 +135,9 @@
</span><span class="cx">     return ContextMenuItemBaseApplicationTag;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-WebKitContextMenuAction webkitContextMenuActionGetForContextMenuItem(ContextMenuItem* menuItem)
</del><ins>+WebKitContextMenuAction webkitContextMenuActionGetForContextMenuItem(const WebKit::WebContextMenuItemGtk&amp; menuItem)
</ins><span class="cx"> {
</span><del>-    switch (menuItem-&gt;action()) {
</del><ins>+    switch (menuItem.action()) {
</ins><span class="cx">     case ContextMenuItemTagNoAction:
</span><span class="cx">         return WEBKIT_CONTEXT_MENU_ACTION_NO_ACTION;
</span><span class="cx">     case ContextMenuItemTagOpenLink:
</span><span class="lines">@@ -203,10 +203,10 @@
</span><span class="cx">     case ContextMenuItemTagInspectElement:
</span><span class="cx">         return WEBKIT_CONTEXT_MENU_ACTION_INSPECT_ELEMENT;
</span><span class="cx">     case ContextMenuItemTagOpenMediaInNewWindow:
</span><del>-        return menuItem-&gt;title() == contextMenuItemTagOpenVideoInNewWindow() ?
</del><ins>+        return menuItem.title() == contextMenuItemTagOpenVideoInNewWindow() ?
</ins><span class="cx">             WEBKIT_CONTEXT_MENU_ACTION_OPEN_VIDEO_IN_NEW_WINDOW : WEBKIT_CONTEXT_MENU_ACTION_OPEN_AUDIO_IN_NEW_WINDOW;
</span><span class="cx">     case ContextMenuItemTagCopyMediaLinkToClipboard:
</span><del>-        return menuItem-&gt;title() == contextMenuItemTagCopyVideoLinkToClipboard() ?
</del><ins>+        return menuItem.title() == contextMenuItemTagCopyVideoLinkToClipboard() ?
</ins><span class="cx">             WEBKIT_CONTEXT_MENU_ACTION_COPY_VIDEO_LINK_TO_CLIPBOARD : WEBKIT_CONTEXT_MENU_ACTION_COPY_AUDIO_LINK_TO_CLIPBOARD;
</span><span class="cx">     case ContextMenuItemTagToggleMediaControls:
</span><span class="cx">         return WEBKIT_CONTEXT_MENU_ACTION_TOGGLE_MEDIA_CONTROLS;
</span><span class="lines">@@ -215,12 +215,12 @@
</span><span class="cx">     case ContextMenuItemTagEnterVideoFullscreen:
</span><span class="cx">         return WEBKIT_CONTEXT_MENU_ACTION_ENTER_VIDEO_FULLSCREEN;
</span><span class="cx">     case ContextMenuItemTagMediaPlayPause:
</span><del>-        return menuItem-&gt;title() == contextMenuItemTagMediaPlay() ?
</del><ins>+        return menuItem.title() == contextMenuItemTagMediaPlay() ?
</ins><span class="cx">             WEBKIT_CONTEXT_MENU_ACTION_MEDIA_PLAY : WEBKIT_CONTEXT_MENU_ACTION_MEDIA_PAUSE;
</span><span class="cx">     case ContextMenuItemTagMediaMute:
</span><span class="cx">         return WEBKIT_CONTEXT_MENU_ACTION_MEDIA_MUTE;
</span><span class="cx">     case ContextMenuItemTagDownloadMediaToDisk:
</span><del>-        return menuItem-&gt;title() == contextMenuItemTagDownloadVideoToDisk() ?
</del><ins>+        return menuItem.title() == contextMenuItemTagDownloadVideoToDisk() ?
</ins><span class="cx">             WEBKIT_CONTEXT_MENU_ACTION_DOWNLOAD_VIDEO_TO_DISK : WEBKIT_CONTEXT_MENU_ACTION_DOWNLOAD_AUDIO_TO_DISK;
</span><span class="cx">     case ContextMenuItemBaseApplicationTag:
</span><span class="cx">         return WEBKIT_CONTEXT_MENU_ACTION_CUSTOM;
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitContextMenuActionsPrivateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuActionsPrivate.h (192246 => 192247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuActionsPrivate.h        2015-11-10 15:45:21 UTC (rev 192246)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuActionsPrivate.h        2015-11-10 16:08:32 UTC (rev 192247)
</span><span class="lines">@@ -20,12 +20,12 @@
</span><span class="cx"> #ifndef WebKitContextMenuActionsPrivate_h
</span><span class="cx"> #define WebKitContextMenuActionsPrivate_h
</span><span class="cx"> 
</span><ins>+#include &quot;WebContextMenuItemGtk.h&quot;
</ins><span class="cx"> #include &quot;WebKitContextMenuActions.h&quot;
</span><del>-#include &lt;WebCore/ContextMenuItem.h&gt;
</del><span class="cx"> 
</span><span class="cx"> bool webkitContextMenuActionIsCheckable(WebKitContextMenuAction);
</span><span class="cx"> WebCore::ContextMenuAction webkitContextMenuActionGetActionTag(WebKitContextMenuAction);
</span><del>-WebKitContextMenuAction webkitContextMenuActionGetForContextMenuItem(WebCore::ContextMenuItem*);
</del><ins>+WebKitContextMenuAction webkitContextMenuActionGetForContextMenuItem(const WebKit::WebContextMenuItemGtk&amp;);
</ins><span class="cx"> String webkitContextMenuActionGetLabel(WebKitContextMenuAction);
</span><span class="cx"> 
</span><span class="cx"> #endif // WebKitPrintOperationPrivate_h
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitContextMenuItemcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuItem.cpp (192246 => 192247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuItem.cpp        2015-11-10 15:45:21 UTC (rev 192246)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuItem.cpp        2015-11-10 16:08:32 UTC (rev 192247)
</span><span class="lines">@@ -22,7 +22,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;APIArray.h&quot;
</span><span class="cx"> #include &quot;WebContextMenuItem.h&quot;
</span><del>-#include &quot;WebContextMenuItemData.h&quot;
</del><ins>+#include &quot;WebContextMenuItemGtk.h&quot;
</ins><span class="cx"> #include &quot;WebKitContextMenuActionsPrivate.h&quot;
</span><span class="cx"> #include &quot;WebKitContextMenuItemPrivate.h&quot;
</span><span class="cx"> #include &quot;WebKitContextMenuPrivate.h&quot;
</span><span class="lines">@@ -56,7 +56,7 @@
</span><span class="cx">             webkitContextMenuSetParentItem(subMenu.get(), 0);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    std::unique_ptr&lt;ContextMenuItem&gt; menuItem;
</del><ins>+    std::unique_ptr&lt;WebContextMenuItemGtk&gt; menuItem;
</ins><span class="cx">     GRefPtr&lt;WebKitContextMenu&gt; subMenu;
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="lines">@@ -84,7 +84,7 @@
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     if (item-&gt;priv-&gt;subMenu)
</span><del>-        webkitContextMenuSetParentItem(item-&gt;priv-&gt;subMenu.get(), 0);
</del><ins>+        webkitContextMenuSetParentItem(item-&gt;priv-&gt;subMenu.get(), nullptr);
</ins><span class="cx">     item-&gt;priv-&gt;subMenu = subMenu;
</span><span class="cx">     if (subMenu)
</span><span class="cx">         webkitContextMenuSetParentItem(subMenu.get(), item);
</span><span class="lines">@@ -94,7 +94,7 @@
</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 class="cx"> 
</span><del>-    item-&gt;priv-&gt;menuItem = std::make_unique&lt;ContextMenuItem&gt;(itemData.type(), itemData.action(), itemData.title(), itemData.enabled(), itemData.checked());
</del><ins>+    item-&gt;priv-&gt;menuItem = std::make_unique&lt;WebContextMenuItemGtk&gt;(itemData);
</ins><span class="cx">     const Vector&lt;WebContextMenuItemData&gt;&amp; subMenu = itemData.submenu();
</span><span class="cx">     if (!subMenu.isEmpty())
</span><span class="cx">         webkitContextMenuItemSetSubMenu(item, adoptGRef(webkitContextMenuCreate(subMenu)));
</span><span class="lines">@@ -102,60 +102,26 @@
</span><span class="cx">     return item;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-WebKitContextMenuItem* webkitContextMenuItemCreate(const ContextMenuItem&amp; coreItem)
</del><ins>+WebContextMenuItemGtk webkitContextMenuItemToWebContextMenuItemGtk(WebKitContextMenuItem* item)
</ins><span class="cx"> {
</span><del>-    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)));
</del><ins>+    if (item-&gt;priv-&gt;subMenu) {
+        Vector&lt;WebContextMenuItemGtk&gt; subMenuItems;
+        webkitContextMenuPopulate(item-&gt;priv-&gt;subMenu.get(), subMenuItems);
+        return WebContextMenuItemGtk(*item-&gt;priv-&gt;menuItem, WTF::move(subMenuItems));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return item;
</del><ins>+    return *item-&gt;priv-&gt;menuItem;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-static WebKitContextMenuItem* webkitContextMenuItemCreateForGtkItem(GtkMenuItem* menuItem)
</del><ins>+WebContextMenuItemData webkitContextMenuItemToWebContextMenuItemData(WebKitContextMenuItem* item)
</ins><span class="cx"> {
</span><del>-    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;(menuItem);
-    webkitContextMenuItemSetSubMenuFromGtkMenu(item, GTK_MENU(gtk_menu_item_get_submenu(menuItem)));
-
-    return item;
-}
-
-void webkitContextMenuItemSetSubMenuFromGtkMenu(WebKitContextMenuItem* item, GtkMenu* subMenu)
-{
-    if (!subMenu)
-        return;
-
-    GUniquePtr&lt;GList&gt; children(gtk_container_get_children(GTK_CONTAINER(subMenu)));
-    if (!g_list_length(children.get()))
-        return;
-
-    webkitContextMenuItemSetSubMenu(item, adoptGRef(webkit_context_menu_new()));
-    for (GList* listItem = children.get(); listItem; listItem = g_list_next(listItem)) {
-        GRefPtr&lt;GtkWidget&gt; widget = GTK_WIDGET(listItem-&gt;data);
-        if (!GTK_IS_MENU_ITEM(widget.get()))
-            continue;
-
-        gtk_container_remove(GTK_CONTAINER(subMenu), widget.get());
-        GtkMenuItem* menuItem = GTK_MENU_ITEM(widget.leakRef());
-        g_object_force_floating(G_OBJECT(menuItem));
-        webkit_context_menu_append(item-&gt;priv-&gt;subMenu.get(), webkitContextMenuItemCreateForGtkItem(menuItem));
-    }
-}
-
-GtkMenuItem* webkitContextMenuItemRelease(WebKitContextMenuItem* item)
-{
</del><span class="cx">     if (item-&gt;priv-&gt;subMenu) {
</span><del>-        Vector&lt;ContextMenuItem&gt; subMenuItems;
</del><ins>+        Vector&lt;WebContextMenuItemData&gt; subMenuItems;
</ins><span class="cx">         webkitContextMenuPopulate(item-&gt;priv-&gt;subMenu.get(), subMenuItems);
</span><del>-        ContextMenu subMenu(platformMenuDescription(subMenuItems));
-        item-&gt;priv-&gt;menuItem-&gt;setSubMenu(&amp;subMenu);
</del><ins>+        return WebContextMenuItemData(item-&gt;priv-&gt;menuItem-&gt;action(), item-&gt;priv-&gt;menuItem-&gt;title(), item-&gt;priv-&gt;menuItem-&gt;enabled(), subMenuItems);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return item-&gt;priv-&gt;menuItem-&gt;releasePlatformDescription();
</del><ins>+    return WebContextMenuItemData(item-&gt;priv-&gt;menuItem-&gt;type(), item-&gt;priv-&gt;menuItem-&gt;action(), item-&gt;priv-&gt;menuItem-&gt;title(), item-&gt;priv-&gt;menuItem-&gt;enabled(), item-&gt;priv-&gt;menuItem-&gt;checked());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> /**
</span><span class="lines">@@ -168,11 +134,10 @@
</span><span class="cx">  */
</span><span class="cx"> WebKitContextMenuItem* webkit_context_menu_item_new(GtkAction* action)
</span><span class="cx"> {
</span><del>-    g_return_val_if_fail(GTK_IS_ACTION(action), 0);
</del><ins>+    g_return_val_if_fail(GTK_IS_ACTION(action), nullptr);
</ins><span class="cx"> 
</span><del>-    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;(GTK_MENU_ITEM(gtk_action_create_menu_item(action)));
-    item-&gt;priv-&gt;menuItem-&gt;setAction(ContextMenuItemBaseApplicationTag);
</del><ins>+    WebKitContextMenuItem* item = WEBKIT_CONTEXT_MENU_ITEM(g_object_new(WEBKIT_TYPE_CONTEXT_MENU_ITEM, nullptr));
+    item-&gt;priv-&gt;menuItem = std::make_unique&lt;WebContextMenuItemGtk&gt;(action);
</ins><span class="cx"> 
</span><span class="cx">     return item;
</span><span class="cx"> }
</span><span class="lines">@@ -195,11 +160,11 @@
</span><span class="cx">  */
</span><span class="cx"> WebKitContextMenuItem* webkit_context_menu_item_new_from_stock_action(WebKitContextMenuAction action)
</span><span class="cx"> {
</span><del>-    g_return_val_if_fail(action &gt; WEBKIT_CONTEXT_MENU_ACTION_NO_ACTION &amp;&amp; action &lt; WEBKIT_CONTEXT_MENU_ACTION_CUSTOM, 0);
</del><ins>+    g_return_val_if_fail(action &gt; WEBKIT_CONTEXT_MENU_ACTION_NO_ACTION &amp;&amp; action &lt; WEBKIT_CONTEXT_MENU_ACTION_CUSTOM, nullptr);
</ins><span class="cx"> 
</span><del>-    WebKitContextMenuItem* item = WEBKIT_CONTEXT_MENU_ITEM(g_object_new(WEBKIT_TYPE_CONTEXT_MENU_ITEM, NULL));
</del><ins>+    WebKitContextMenuItem* item = WEBKIT_CONTEXT_MENU_ITEM(g_object_new(WEBKIT_TYPE_CONTEXT_MENU_ITEM, nullptr));
</ins><span class="cx">     ContextMenuItemType type = webkitContextMenuActionIsCheckable(action) ? CheckableActionType : ActionType;
</span><del>-    item-&gt;priv-&gt;menuItem = std::make_unique&lt;ContextMenuItem&gt;(type, webkitContextMenuActionGetActionTag(action), webkitContextMenuActionGetLabel(action));
</del><ins>+    item-&gt;priv-&gt;menuItem = std::make_unique&lt;WebContextMenuItemGtk&gt;(type, webkitContextMenuActionGetActionTag(action), webkitContextMenuActionGetLabel(action));
</ins><span class="cx"> 
</span><span class="cx">     return item;
</span><span class="cx"> }
</span><span class="lines">@@ -217,11 +182,11 @@
</span><span class="cx">  */
</span><span class="cx"> WebKitContextMenuItem* webkit_context_menu_item_new_from_stock_action_with_label(WebKitContextMenuAction action, const gchar* label)
</span><span class="cx"> {
</span><del>-    g_return_val_if_fail(action &gt; WEBKIT_CONTEXT_MENU_ACTION_NO_ACTION &amp;&amp; action &lt; WEBKIT_CONTEXT_MENU_ACTION_CUSTOM, 0);
</del><ins>+    g_return_val_if_fail(action &gt; WEBKIT_CONTEXT_MENU_ACTION_NO_ACTION &amp;&amp; action &lt; WEBKIT_CONTEXT_MENU_ACTION_CUSTOM, nullptr);
</ins><span class="cx"> 
</span><del>-    WebKitContextMenuItem* item = WEBKIT_CONTEXT_MENU_ITEM(g_object_new(WEBKIT_TYPE_CONTEXT_MENU_ITEM, NULL));
</del><ins>+    WebKitContextMenuItem* item = WEBKIT_CONTEXT_MENU_ITEM(g_object_new(WEBKIT_TYPE_CONTEXT_MENU_ITEM, nullptr));
</ins><span class="cx">     ContextMenuItemType type = webkitContextMenuActionIsCheckable(action) ? CheckableActionType : ActionType;
</span><del>-    item-&gt;priv-&gt;menuItem = std::make_unique&lt;ContextMenuItem&gt;(type, webkitContextMenuActionGetActionTag(action), String::fromUTF8(label));
</del><ins>+    item-&gt;priv-&gt;menuItem = std::make_unique&lt;WebContextMenuItemGtk&gt;(type, webkitContextMenuActionGetActionTag(action), String::fromUTF8(label));
</ins><span class="cx"> 
</span><span class="cx">     return item;
</span><span class="cx"> }
</span><span class="lines">@@ -237,14 +202,14 @@
</span><span class="cx">  */
</span><span class="cx"> WebKitContextMenuItem* webkit_context_menu_item_new_with_submenu(const gchar* label, WebKitContextMenu* submenu)
</span><span class="cx"> {
</span><del>-    g_return_val_if_fail(label, 0);
-    g_return_val_if_fail(WEBKIT_IS_CONTEXT_MENU(submenu), 0);
</del><ins>+    g_return_val_if_fail(label, nullptr);
+    g_return_val_if_fail(WEBKIT_IS_CONTEXT_MENU(submenu), nullptr);
</ins><span class="cx"> 
</span><span class="cx">     if (checkAndWarnIfMenuHasParentItem(submenu))
</span><del>-        return 0;
</del><ins>+        return nullptr;
</ins><span class="cx"> 
</span><del>-    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;(SubmenuType, ContextMenuItemBaseApplicationTag, String::fromUTF8(label));
</del><ins>+    WebKitContextMenuItem* item = WEBKIT_CONTEXT_MENU_ITEM(g_object_new(WEBKIT_TYPE_CONTEXT_MENU_ITEM, nullptr));
+    item-&gt;priv-&gt;menuItem = std::make_unique&lt;WebContextMenuItemGtk&gt;(SubmenuType, ContextMenuItemBaseApplicationTag, String::fromUTF8(label));
</ins><span class="cx">     item-&gt;priv-&gt;subMenu = submenu;
</span><span class="cx">     webkitContextMenuSetParentItem(submenu, item);
</span><span class="cx"> 
</span><span class="lines">@@ -260,8 +225,8 @@
</span><span class="cx">  */
</span><span class="cx"> WebKitContextMenuItem* webkit_context_menu_item_new_separator(void)
</span><span class="cx"> {
</span><del>-    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;(SeparatorType, ContextMenuItemTagNoAction, String());
</del><ins>+    WebKitContextMenuItem* item = WEBKIT_CONTEXT_MENU_ITEM(g_object_new(WEBKIT_TYPE_CONTEXT_MENU_ITEM, nullptr));
+    item-&gt;priv-&gt;menuItem = std::make_unique&lt;WebContextMenuItemGtk&gt;(SeparatorType, ContextMenuItemTagNoAction, String());
</ins><span class="cx"> 
</span><span class="cx">     return item;
</span><span class="cx"> }
</span><span class="lines">@@ -277,7 +242,7 @@
</span><span class="cx">  */
</span><span class="cx"> GtkAction* webkit_context_menu_item_get_action(WebKitContextMenuItem* item)
</span><span class="cx"> {
</span><del>-    g_return_val_if_fail(WEBKIT_IS_CONTEXT_MENU_ITEM(item), 0);
</del><ins>+    g_return_val_if_fail(WEBKIT_IS_CONTEXT_MENU_ITEM(item), nullptr);
</ins><span class="cx"> 
</span><span class="cx">     return item-&gt;priv-&gt;menuItem-&gt;gtkAction();
</span><span class="cx"> }
</span><span class="lines">@@ -297,7 +262,7 @@
</span><span class="cx"> {
</span><span class="cx">     g_return_val_if_fail(WEBKIT_IS_CONTEXT_MENU_ITEM(item), WEBKIT_CONTEXT_MENU_ACTION_NO_ACTION);
</span><span class="cx"> 
</span><del>-    return webkitContextMenuActionGetForContextMenuItem(item-&gt;priv-&gt;menuItem.get());
</del><ins>+    return webkitContextMenuActionGetForContextMenuItem(*item-&gt;priv-&gt;menuItem);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> /**
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitContextMenuItemPrivateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuItemPrivate.h (192246 => 192247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuItemPrivate.h        2015-11-10 15:45:21 UTC (rev 192246)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuItemPrivate.h        2015-11-10 16:08:32 UTC (rev 192247)
</span><span class="lines">@@ -20,13 +20,12 @@
</span><span class="cx"> #ifndef WebKitContextMenuItemPrivate_h
</span><span class="cx"> #define WebKitContextMenuItemPrivate_h
</span><span class="cx"> 
</span><del>-#include &quot;WebContextMenuItemData.h&quot;
</del><ins>+#include &quot;WebContextMenuItemGtk.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><span class="cx"> WebKitContextMenuItem* webkitContextMenuItemCreate(const WebKit::WebContextMenuItemData&amp;);
</span><del>-WebKitContextMenuItem* webkitContextMenuItemCreate(const WebCore::ContextMenuItem&amp;);
-GtkMenuItem* webkitContextMenuItemRelease(WebKitContextMenuItem*);
-void webkitContextMenuItemSetSubMenuFromGtkMenu(WebKitContextMenuItem*, GtkMenu*);
</del><ins>+WebKit::WebContextMenuItemGtk webkitContextMenuItemToWebContextMenuItemGtk(WebKitContextMenuItem*);
+WebKit::WebContextMenuItemData webkitContextMenuItemToWebContextMenuItemData(WebKitContextMenuItem*);
</ins><span class="cx"> 
</span><span class="cx"> #endif // WebKitContextMenuItemPrivate_h
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitContextMenuPrivateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuPrivate.h (192246 => 192247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuPrivate.h        2015-11-10 15:45:21 UTC (rev 192246)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuPrivate.h        2015-11-10 16:08:32 UTC (rev 192247)
</span><span class="lines">@@ -20,13 +20,12 @@
</span><span class="cx"> #ifndef WebKitContextMenuPrivate_h
</span><span class="cx"> #define WebKitContextMenuPrivate_h
</span><span class="cx"> 
</span><del>-#include &quot;WebContextMenuItemData.h&quot;
</del><ins>+#include &quot;WebContextMenuItemGtk.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><span class="cx"> WebKitContextMenu* webkitContextMenuCreate(const Vector&lt;WebKit::WebContextMenuItemData&gt;&amp;);
</span><del>-WebKitContextMenu* webkitContextMenuCreate(const Vector&lt;WebCore::ContextMenuItem&gt;&amp;);
-void webkitContextMenuPopulate(WebKitContextMenu*, Vector&lt;WebCore::ContextMenuItem&gt;&amp;);
</del><ins>+void webkitContextMenuPopulate(WebKitContextMenu*, Vector&lt;WebKit::WebContextMenuItemGtk&gt;&amp;);
</ins><span class="cx"> void webkitContextMenuPopulate(WebKitContextMenu*, Vector&lt;WebKit::WebContextMenuItemData&gt;&amp;);
</span><span class="cx"> void webkitContextMenuSetParentItem(WebKitContextMenu*, WebKitContextMenuItem*);
</span><span class="cx"> WebKitContextMenuItem* webkitContextMenuGetParentItem(WebKitContextMenu*);
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitWebViewcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp (192246 => 192247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp        2015-11-10 15:45:21 UTC (rev 192246)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp        2015-11-10 16:08:32 UTC (rev 192247)
</span><span class="lines">@@ -2027,52 +2027,6 @@
</span><span class="cx">     g_signal_emit(webView, signals[RUN_FILE_CHOOSER], 0, request, &amp;returnValue);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static bool webkitWebViewShouldShowInputMethodsMenu(WebKitWebView* webView)
-{
-    GtkSettings* settings = gtk_widget_get_settings(GTK_WIDGET(webView));
-    if (!settings)
-        return true;
-
-    gboolean showInputMethodMenu;
-    g_object_get(settings, &quot;gtk-show-input-method-menu&quot;, &amp;showInputMethodMenu, NULL);
-    return showInputMethodMenu;
-}
-
-static int getUnicodeMenuItemPosition(WebKitContextMenu* contextMenu)
-{
-    GList* items = webkit_context_menu_get_items(contextMenu);
-    GList* iter;
-    int i = 0;
-    for (iter = items, i = 0; iter; iter = g_list_next(iter), ++i) {
-        WebKitContextMenuItem* item = WEBKIT_CONTEXT_MENU_ITEM(iter-&gt;data);
-
-        if (webkit_context_menu_item_is_separator(item))
-            continue;
-        if (webkit_context_menu_item_get_stock_action(item) == WEBKIT_CONTEXT_MENU_ACTION_UNICODE)
-            return i;
-    }
-    return -1;
-}
-
-static void webkitWebViewCreateAndAppendInputMethodsMenuItem(WebKitWebView* webView, WebKitContextMenu* contextMenu)
-{
-    if (!webkitWebViewShouldShowInputMethodsMenu(webView))
-        return;
-
-    // Place the im context menu item right before the unicode menu item
-    // if it's present.
-    int unicodeMenuItemPosition = getUnicodeMenuItemPosition(contextMenu);
-    if (unicodeMenuItemPosition == -1)
-        webkit_context_menu_append(contextMenu, webkit_context_menu_item_new_separator());
-
-    GtkIMContext* imContext = webkitWebViewBaseGetIMContext(WEBKIT_WEB_VIEW_BASE(webView));
-    GtkMenu* imContextMenu = GTK_MENU(gtk_menu_new());
-    gtk_im_multicontext_append_menuitems(GTK_IM_MULTICONTEXT(imContext), GTK_MENU_SHELL(imContextMenu));
-    WebKitContextMenuItem* menuItem = webkit_context_menu_item_new_from_stock_action(WEBKIT_CONTEXT_MENU_ACTION_INPUT_METHODS);
-    webkitContextMenuItemSetSubMenuFromGtkMenu(menuItem, imContextMenu);
-    webkit_context_menu_insert(contextMenu, menuItem, unicodeMenuItemPosition);
-}
-
</del><span class="cx"> static void contextMenuDismissed(GtkMenuShell*, WebKitWebView* webView)
</span><span class="cx"> {
</span><span class="cx">     g_signal_emit(webView, signals[CONTEXT_MENU_DISMISSED], 0, NULL);
</span><span class="lines">@@ -2085,21 +2039,17 @@
</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 (hitTestResultData.isContentEditable)
-        webkitWebViewCreateAndAppendInputMethodsMenuItem(webView, contextMenu.get());
-
-    GRefPtr&lt;WebKitHitTestResult&gt; hitTestResult = adoptGRef(webkitHitTestResultCreate(hitTestResultData));
-    GUniquePtr&lt;GdkEvent&gt; contextMenuEvent(webkitWebViewBaseTakeContextMenuEvent(webViewBase));
-
</del><span class="cx">     if (userData)
</span><span class="cx">         webkit_context_menu_set_user_data(WEBKIT_CONTEXT_MENU(contextMenu.get()), userData);
</span><span class="cx"> 
</span><ins>+    GRefPtr&lt;WebKitHitTestResult&gt; hitTestResult = adoptGRef(webkitHitTestResultCreate(hitTestResultData));
+    GUniquePtr&lt;GdkEvent&gt; contextMenuEvent(webkitWebViewBaseTakeContextMenuEvent(webViewBase));
</ins><span class="cx">     gboolean returnValue;
</span><span class="cx">     g_signal_emit(webView, signals[CONTEXT_MENU], 0, contextMenu.get(), contextMenuEvent.get(), hitTestResult.get(), &amp;returnValue);
</span><span class="cx">     if (returnValue)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    Vector&lt;ContextMenuItem&gt; contextMenuItems;
</del><ins>+    Vector&lt;WebContextMenuItemGtk&gt; contextMenuItems;
</ins><span class="cx">     webkitContextMenuPopulate(contextMenu.get(), contextMenuItems);
</span><span class="cx">     contextMenuProxy-&gt;populate(contextMenuItems);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessgtkWebContextMenuProxyGtkcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.cpp (192246 => 192247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.cpp        2015-11-10 15:45:21 UTC (rev 192246)
+++ trunk/Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.cpp        2015-11-10 16:08:32 UTC (rev 192247)
</span><span class="lines">@@ -49,8 +49,8 @@
</span><span class="cx"> static void contextMenuItemActivatedCallback(GtkAction* action, WebPageProxy* page)
</span><span class="cx"> {
</span><span class="cx">     gboolean isToggle = GTK_IS_TOGGLE_ACTION(action);
</span><del>-    WebKit::WebContextMenuItemData item(isToggle ? WebCore::CheckableActionType : WebCore::ActionType,
-        static_cast&lt;WebCore::ContextMenuAction&gt;(GPOINTER_TO_INT(g_object_get_data(G_OBJECT(action), gContextMenuActionId))),
</del><ins>+    WebContextMenuItemData item(isToggle ? CheckableActionType : ActionType,
+        static_cast&lt;ContextMenuAction&gt;(GPOINTER_TO_INT(g_object_get_data(G_OBJECT(action), gContextMenuActionId))),
</ins><span class="cx">         String::fromUTF8(gtk_action_get_label(action)), gtk_action_get_sensitive(action),
</span><span class="cx">         isToggle ? gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(action)) : false);
</span><span class="cx">     page-&gt;contextMenuItemSelected(item);
</span><span class="lines">@@ -85,59 +85,73 @@
</span><span class="cx">         gtk_widget_hide(lastItemVisibleSeparator);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebContextMenuProxyGtk::append(ContextMenuItem&amp; menuItem)
</del><ins>+void WebContextMenuProxyGtk::append(GtkMenu* menu, const WebContextMenuItemGtk&amp; menuItem)
</ins><span class="cx"> {
</span><span class="cx">     unsigned long signalHandlerId;
</span><del>-    GtkAction* action = menuItem.gtkAction();
-    if (action) {
</del><ins>+    GtkWidget* gtkMenuItem;
+    if (GtkAction* action = menuItem.gtkAction()) {
+        gtkMenuItem = gtk_action_create_menu_item(action);
+
</ins><span class="cx">         switch (menuItem.type()) {
</span><span class="cx">         case ActionType:
</span><span class="cx">         case CheckableActionType:
</span><span class="cx">             g_object_set_data(G_OBJECT(action), gContextMenuActionId, GINT_TO_POINTER(menuItem.action()));
</span><span class="cx">             signalHandlerId = g_signal_connect(action, &quot;activate&quot;, G_CALLBACK(contextMenuItemActivatedCallback), m_page);
</span><span class="cx">             m_signalHandlers.set(signalHandlerId, action);
</span><del>-            // Fall through.
-        case SubmenuType:
</del><span class="cx">             signalHandlerId = g_signal_connect(action, &quot;notify::visible&quot;, G_CALLBACK(contextMenuItemVisibilityChanged), this);
</span><span class="cx">             m_signalHandlers.set(signalHandlerId, action);
</span><span class="cx">             break;
</span><ins>+        case SubmenuType: {
+            signalHandlerId = g_signal_connect(action, &quot;notify::visible&quot;, G_CALLBACK(contextMenuItemVisibilityChanged), this);
+            m_signalHandlers.set(signalHandlerId, action);
+            GtkMenu* submenu = GTK_MENU(gtk_menu_new());
+            for (const auto&amp; item : menuItem.submenuItems())
+                append(submenu, item);
+            gtk_menu_item_set_submenu(GTK_MENU_ITEM(gtkMenuItem), GTK_WIDGET(submenu));
+            break;
+        }
</ins><span class="cx">         case SeparatorType:
</span><ins>+            ASSERT_NOT_REACHED();
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><ins>+    } else {
+        ASSERT(menuItem.type() == SeparatorType);
+        gtkMenuItem = gtk_separator_menu_item_new();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    m_menu.appendItem(menuItem);
</del><ins>+    gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtkMenuItem);
+    gtk_widget_show(gtkMenuItem);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // Populate the context menu ensuring that:
</span><span class="cx"> //  - There aren't separators next to each other.
</span><span class="cx"> //  - There aren't separators at the beginning of the menu.
</span><span class="cx"> //  - There aren't separators at the end of the menu.
</span><del>-void WebContextMenuProxyGtk::populate(Vector&lt;ContextMenuItem&gt;&amp; items)
</del><ins>+void WebContextMenuProxyGtk::populate(Vector&lt;WebContextMenuItemGtk&gt;&amp; items)
</ins><span class="cx"> {
</span><span class="cx">     bool previousIsSeparator = false;
</span><span class="cx">     bool isEmpty = true;
</span><span class="cx">     for (size_t i = 0; i &lt; items.size(); i++) {
</span><del>-        ContextMenuItem&amp; menuItem = items.at(i);
</del><ins>+        WebContextMenuItemGtk&amp; menuItem = items.at(i);
</ins><span class="cx">         if (menuItem.type() == SeparatorType) {
</span><span class="cx">             previousIsSeparator = true;
</span><span class="cx">             continue;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         if (previousIsSeparator &amp;&amp; !isEmpty)
</span><del>-            append(items.at(i - 1));
</del><ins>+            append(m_menu, items.at(i - 1));
</ins><span class="cx">         previousIsSeparator = false;
</span><span class="cx"> 
</span><del>-        append(menuItem);
</del><ins>+        append(m_menu, menuItem);
</ins><span class="cx">         isEmpty = false;
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebContextMenuProxyGtk::populate(const Vector&lt;RefPtr&lt;WebContextMenuItem&gt;&gt;&amp; items)
</span><span class="cx"> {
</span><del>-    for (size_t i = 0; i &lt; items.size(); i++) {
-        ContextMenuItem menuitem = items.at(i)-&gt;data().core();
-        append(menuitem);
</del><ins>+    for (const auto&amp; item : items) {
+        WebContextMenuItemGtk menuitem(item-&gt;data());
+        append(m_menu, menuitem);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -160,7 +174,9 @@
</span><span class="cx">     if (!items.isEmpty())
</span><span class="cx">         populate(items);
</span><span class="cx"> 
</span><del>-    if (!m_menu.itemCount())
</del><ins>+    unsigned childCount = 0;
+    gtk_container_foreach(GTK_CONTAINER(m_menu), [](GtkWidget*, gpointer data) { (*static_cast&lt;unsigned*&gt;(data))++; }, &amp;childCount);
+    if (!childCount)
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     m_popupPosition = convertWidgetPointToScreenPoint(m_webView, m_context.menuLocation());
</span><span class="lines">@@ -168,8 +184,8 @@
</span><span class="cx">     // Display menu initiated by right click (mouse button pressed = 3).
</span><span class="cx">     NativeWebMouseEvent* mouseEvent = m_page-&gt;currentlyProcessedMouseDownEvent();
</span><span class="cx">     const GdkEvent* event = mouseEvent ? mouseEvent-&gt;nativeEvent() : 0;
</span><del>-    gtk_menu_attach_to_widget(m_menu.platformDescription(), GTK_WIDGET(m_webView), 0);
-    gtk_menu_popup(m_menu.platformDescription(), 0, 0, reinterpret_cast&lt;GtkMenuPositionFunc&gt;(menuPositionFunction), this,
</del><ins>+    gtk_menu_attach_to_widget(m_menu, GTK_WIDGET(m_webView), nullptr);
+    gtk_menu_popup(m_menu, nullptr, nullptr, reinterpret_cast&lt;GtkMenuPositionFunc&gt;(menuPositionFunction), this,
</ins><span class="cx">                    event ? event-&gt;button.button : 3, event ? event-&gt;button.time : GDK_CURRENT_TIME);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -177,19 +193,20 @@
</span><span class="cx">     : WebContextMenuProxy(context, userData)
</span><span class="cx">     , m_webView(webView)
</span><span class="cx">     , m_page(&amp;page)
</span><ins>+    , m_menu(GTK_MENU(gtk_menu_new()))
</ins><span class="cx"> {
</span><span class="cx">     webkitWebViewBaseSetActiveContextMenuProxy(WEBKIT_WEB_VIEW_BASE(m_webView), this);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> WebContextMenuProxyGtk::~WebContextMenuProxyGtk()
</span><span class="cx"> {
</span><del>-    gtk_menu_popdown(m_menu.platformDescription());
</del><ins>+    gtk_menu_popdown(m_menu);
</ins><span class="cx"> 
</span><span class="cx">     for (auto&amp; handler : m_signalHandlers)
</span><span class="cx">         g_signal_handler_disconnect(handler.value, handler.key);
</span><span class="cx">     m_signalHandlers.clear();
</span><span class="cx"> 
</span><del>-    m_menu.setPlatformDescription(nullptr);
</del><ins>+    gtk_widget_destroy(GTK_WIDGET(m_menu));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebContextMenuProxyGtk::menuPositionFunction(GtkMenu* menu, gint* x, gint* y, gboolean* pushIn, WebContextMenuProxyGtk* popupMenu)
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessgtkWebContextMenuProxyGtkh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.h (192246 => 192247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.h        2015-11-10 15:45:21 UTC (rev 192246)
+++ trunk/Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.h        2015-11-10 16:08:32 UTC (rev 192247)
</span><span class="lines">@@ -28,8 +28,8 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(CONTEXT_MENUS)
</span><span class="cx"> 
</span><ins>+#include &quot;WebContextMenuItemGtk.h&quot;
</ins><span class="cx"> #include &quot;WebContextMenuProxy.h&quot;
</span><del>-#include &lt;WebCore/ContextMenu.h&gt;
</del><span class="cx"> #include &lt;WebCore/IntPoint.h&gt;
</span><span class="cx"> #include &lt;wtf/HashMap.h&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -44,18 +44,18 @@
</span><span class="cx">     WebContextMenuProxyGtk(GtkWidget*, WebPageProxy&amp;, const ContextMenuContextData&amp;, const UserData&amp;);
</span><span class="cx">     ~WebContextMenuProxyGtk();
</span><span class="cx"> 
</span><del>-    void populate(Vector&lt;WebCore::ContextMenuItem&gt;&amp;);
-    GtkMenu* gtkMenu() const { return m_menu.platformDescription(); }
</del><ins>+    void populate(Vector&lt;WebContextMenuItemGtk&gt;&amp;);
+    GtkMenu* gtkMenu() const { return m_menu; }
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     virtual void show() override;
</span><del>-    void append(WebCore::ContextMenuItem&amp;);
</del><ins>+    void append(GtkMenu*, const WebContextMenuItemGtk&amp;);
</ins><span class="cx">     void populate(const Vector&lt;RefPtr&lt;WebContextMenuItem&gt;&gt;&amp;);
</span><span class="cx">     static void menuPositionFunction(GtkMenu*, gint*, gint*, gboolean*, WebContextMenuProxyGtk*);
</span><span class="cx"> 
</span><span class="cx">     GtkWidget* m_webView;
</span><span class="cx">     WebPageProxy* m_page;
</span><del>-    WebCore::ContextMenu m_menu;
</del><ins>+    GtkMenu* m_menu;
</ins><span class="cx">     WebCore::IntPoint m_popupPosition;
</span><span class="cx">     HashMap&lt;unsigned long, GtkAction*&gt; m_signalHandlers;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessInjectedBundleAPIgtkWebKitWebPagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/InjectedBundle/API/gtk/WebKitWebPage.cpp (192246 => 192247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/InjectedBundle/API/gtk/WebKitWebPage.cpp        2015-11-10 15:45:21 UTC (rev 192246)
+++ trunk/Source/WebKit2/WebProcess/InjectedBundle/API/gtk/WebKitWebPage.cpp        2015-11-10 16:08:32 UTC (rev 192247)
</span><span class="lines">@@ -264,7 +264,7 @@
</span><span class="cx"> private:
</span><span class="cx">     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
</span><span class="cx">     {
</span><del>-        GRefPtr&lt;WebKitContextMenu&gt; contextMenu = adoptGRef(webkitContextMenuCreate(defaultMenu));
</del><ins>+        GRefPtr&lt;WebKitContextMenu&gt; contextMenu = adoptGRef(webkitContextMenuCreate(kitItems(defaultMenu)));
</ins><span class="cx">         GRefPtr&lt;WebKitWebHitTestResult&gt; webHitTestResult = adoptGRef(webkitWebHitTestResultCreate(hitTestResult));
</span><span class="cx">         gboolean returnValue;
</span><span class="cx">         g_signal_emit(m_webPage, signals[CONTEXT_MENU], 0, contextMenu.get(), webHitTestResult.get(), &amp;returnValue);
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (192246 => 192247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2015-11-10 15:45:21 UTC (rev 192246)
+++ trunk/Tools/ChangeLog        2015-11-10 16:08:32 UTC (rev 192247)
</span><span class="lines">@@ -1,3 +1,14 @@
</span><ins>+2015-11-10  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
+
+        [GTK] Use CROSS_PLATFORM_CONTEXT_MENUS
+        https://bugs.webkit.org/show_bug.cgi?id=150642
+
+        Reviewed by Martin Robinson.
+
+        Remove test for input methods submenu.
+
+        * TestWebKitAPI/Tests/WebKit2Gtk/TestContextMenu.cpp:
+
</ins><span class="cx"> 2015-11-09  Joonghun Park  &lt;jh718.park@samsung.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed, add myself to the committers list.
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestsWebKit2GtkTestContextMenucpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestContextMenu.cpp (192246 => 192247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestContextMenu.cpp        2015-11-10 15:45:21 UTC (rev 192246)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestContextMenu.cpp        2015-11-10 16:08:32 UTC (rev 192247)
</span><span class="lines">@@ -93,17 +93,6 @@
</span><span class="cx">         return 0;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    bool shouldShowInputMethodsMenu()
-    {
-        GtkSettings* settings = gtk_widget_get_settings(GTK_WIDGET(m_webView));
-        if (!settings)
-            return true;
-
-        gboolean showInputMethodMenu;
-        g_object_get(settings, &quot;gtk-show-input-method-menu&quot;, &amp;showInputMethodMenu, NULL);
-        return showInputMethodMenu;
-    }
-
</del><span class="cx">     void checkActionState(GtkAction* action, unsigned state)
</span><span class="cx">     {
</span><span class="cx">         if (state &amp; Visible)
</span><span class="lines">@@ -348,8 +337,6 @@
</span><span class="cx">             iter = checkCurrentItemIsSeparatorAndGetNext(iter);
</span><span class="cx">             iter = checkCurrentItemIsStockActionAndGetNext(iter, WEBKIT_CONTEXT_MENU_ACTION_SELECT_ALL, Visible | Enabled);
</span><span class="cx">             iter = checkCurrentItemIsSeparatorAndGetNext(iter);
</span><del>-            if (shouldShowInputMethodsMenu())
-                iter = checkCurrentItemIsStockActionAndGetNext(iter, WEBKIT_CONTEXT_MENU_ACTION_INPUT_METHODS, Visible | Enabled);
</del><span class="cx">             iter = checkCurrentItemIsStockActionAndGetNext(iter, WEBKIT_CONTEXT_MENU_ACTION_UNICODE, Visible | Enabled);
</span><span class="cx">             break;
</span><span class="cx">         case Selection:
</span></span></pre>
</div>
</div>

</body>
</html>