Title: [206505] trunk
Revision
206505
Author
[email protected]
Date
2016-09-28 00:49:05 -0700 (Wed, 28 Sep 2016)

Log Message

[GTK] Switch to use GMenu internally in the context menu implementation
https://bugs.webkit.org/show_bug.cgi?id=162603

Reviewed by Michael Catanzaro.

Source/WebKit2:

Switch to use GAction instead of GtkAction internally, but still keeping a GtkAction associated to the GAction,
because our API depends on GtkAction.

* Shared/gtk/WebContextMenuItemGtk.cpp:
(WebKit::WebContextMenuItemGtk::WebContextMenuItemGtk):
(WebKit::WebContextMenuItemGtk::createActionIfNeeded): Create the GAction and the associated GtkAction. Ensure a
unique name for the GAction, since the name now matters.
* Shared/gtk/WebContextMenuItemGtk.h:
(WebKit::WebContextMenuItemGtk::gtkAction):
(WebKit::WebContextMenuItemGtk::gAction):
(WebKit::WebContextMenuItemGtk::submenuItems): Deleted.
* UIProcess/gtk/WebContextMenuProxyGtk.cpp:
(WebKit::contextMenuItemActivatedCallback): Use the GAction.
(WebKit::WebContextMenuProxyGtk::append): Create a new GMenuItem for the GAction.
(WebKit::WebContextMenuProxyGtk::buildMenu): Build a GMenu for the given items.
(WebKit::WebContextMenuProxyGtk::populate): Create a GMenu and bind it ot the GtkMenu.
(WebKit::WebContextMenuProxyGtk::WebContextMenuProxyGtk): Create the GActionGroup for the menu.
(WebKit::WebContextMenuProxyGtk::~WebContextMenuProxyGtk): Remove the action group from the GtkMenu.
* UIProcess/gtk/WebContextMenuProxyGtk.h:

Tools:

Remove smart separators test, since that's now done automatically by GTK+.

* TestWebKitAPI/Tests/WebKit2Gtk/TestContextMenu.cpp:
(beforeAll):
(testContextMenuWebExtensionMenu): Deleted.

Modified Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (206504 => 206505)


--- trunk/Source/WebKit2/ChangeLog	2016-09-28 07:22:11 UTC (rev 206504)
+++ trunk/Source/WebKit2/ChangeLog	2016-09-28 07:49:05 UTC (rev 206505)
@@ -1,3 +1,30 @@
+2016-09-28  Carlos Garcia Campos  <[email protected]>
+
+        [GTK] Switch to use GMenu internally in the context menu implementation
+        https://bugs.webkit.org/show_bug.cgi?id=162603
+
+        Reviewed by Michael Catanzaro.
+
+        Switch to use GAction instead of GtkAction internally, but still keeping a GtkAction associated to the GAction,
+        because our API depends on GtkAction.
+
+        * Shared/gtk/WebContextMenuItemGtk.cpp:
+        (WebKit::WebContextMenuItemGtk::WebContextMenuItemGtk):
+        (WebKit::WebContextMenuItemGtk::createActionIfNeeded): Create the GAction and the associated GtkAction. Ensure a
+        unique name for the GAction, since the name now matters.
+        * Shared/gtk/WebContextMenuItemGtk.h:
+        (WebKit::WebContextMenuItemGtk::gtkAction):
+        (WebKit::WebContextMenuItemGtk::gAction):
+        (WebKit::WebContextMenuItemGtk::submenuItems): Deleted.
+        * UIProcess/gtk/WebContextMenuProxyGtk.cpp:
+        (WebKit::contextMenuItemActivatedCallback): Use the GAction.
+        (WebKit::WebContextMenuProxyGtk::append): Create a new GMenuItem for the GAction.
+        (WebKit::WebContextMenuProxyGtk::buildMenu): Build a GMenu for the given items.
+        (WebKit::WebContextMenuProxyGtk::populate): Create a GMenu and bind it ot the GtkMenu.
+        (WebKit::WebContextMenuProxyGtk::WebContextMenuProxyGtk): Create the GActionGroup for the menu.
+        (WebKit::WebContextMenuProxyGtk::~WebContextMenuProxyGtk): Remove the action group from the GtkMenu.
+        * UIProcess/gtk/WebContextMenuProxyGtk.h:
+
 2016-09-27  Daniel Bates  <[email protected]>
 
         NetworkLoad and PingLoad should use private inheritance

Modified: trunk/Source/WebKit2/Shared/gtk/WebContextMenuItemGtk.cpp (206504 => 206505)


--- trunk/Source/WebKit2/Shared/gtk/WebContextMenuItemGtk.cpp	2016-09-28 07:22:11 UTC (rev 206504)
+++ trunk/Source/WebKit2/Shared/gtk/WebContextMenuItemGtk.cpp	2016-09-28 07:49:05 UTC (rev 206505)
@@ -122,19 +122,20 @@
     : WebContextMenuItemData(type, action, title, enabled, checked)
 {
     ASSERT(type != SubmenuType);
-    createGtkActionIfNeeded();
+    createActionIfNeeded();
 }
 
 WebContextMenuItemGtk::WebContextMenuItemGtk(const WebContextMenuItemData& data)
     : WebContextMenuItemData(data.type() == SubmenuType ? ActionType : data.type(), data.action(), data.title(), data.enabled(), data.checked())
 {
-    createGtkActionIfNeeded();
+    createActionIfNeeded();
 }
 
 WebContextMenuItemGtk::WebContextMenuItemGtk(const WebContextMenuItemGtk& data, Vector<WebContextMenuItemGtk>&& submenu)
     : WebContextMenuItemData(ActionType, data.action(), data.title(), data.enabled(), false)
 {
-    m_action = data.gtkAction();
+    m_gAction = G_SIMPLE_ACTION(data.gAction());
+    m_gtkAction = data.gtkAction();
     m_submenuItems = WTFMove(submenu);
 }
 
@@ -141,7 +142,9 @@
 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;
+    m_gtkAction = action;
+    createActionIfNeeded();
+    g_object_set_data_full(G_OBJECT(m_gAction.get()), "webkit-gtk-action", g_object_ref(m_gtkAction), g_object_unref);
 }
 
 WebContextMenuItemGtk::~WebContextMenuItemGtk()
@@ -148,18 +151,31 @@
 {
 }
 
-void WebContextMenuItemGtk::createGtkActionIfNeeded()
+void WebContextMenuItemGtk::createActionIfNeeded()
 {
     if (type() == SeparatorType)
         return;
 
-    GUniquePtr<char> actionName(g_strdup_printf("context-menu-action-%d", 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());
+    static uint64_t actionID = 0;
+    GUniquePtr<char> actionName(g_strdup_printf("action-%" PRIu64, ++actionID));
+    if (type() == CheckableActionType)
+        m_gAction = adoptGRef(g_simple_action_new_stateful(actionName.get(), nullptr, g_variant_new_boolean(checked())));
+    else
+        m_gAction = adoptGRef(g_simple_action_new(actionName.get(), nullptr));
+    g_simple_action_set_enabled(m_gAction.get(), enabled());
+
+    // Create the GtkAction for backwards compatibility only.
+    if (!m_gtkAction) {
+        if (type() == CheckableActionType) {
+            m_gtkAction = GTK_ACTION(gtk_toggle_action_new(actionName.get(), title().utf8().data(), nullptr, gtkStockIDFromContextMenuAction(action())));
+            gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(m_gtkAction), checked());
+        } else
+            m_gtkAction = gtk_action_new(actionName.get(), title().utf8().data(), 0, gtkStockIDFromContextMenuAction(action()));
+        gtk_action_set_sensitive(m_gtkAction, enabled());
+        g_object_set_data_full(G_OBJECT(m_gAction.get()), "webkit-gtk-action", m_gtkAction, g_object_unref);
+    }
+
+    g_signal_connect_object(m_gAction.get(), "activate", G_CALLBACK(gtk_action_activate), m_gtkAction, G_CONNECT_SWAPPED);
 }
 
 } // namespace WebKit

Modified: trunk/Source/WebKit2/Shared/gtk/WebContextMenuItemGtk.h (206504 => 206505)


--- trunk/Source/WebKit2/Shared/gtk/WebContextMenuItemGtk.h	2016-09-28 07:22:11 UTC (rev 206504)
+++ trunk/Source/WebKit2/Shared/gtk/WebContextMenuItemGtk.h	2016-09-28 07:49:05 UTC (rev 206505)
@@ -31,6 +31,8 @@
 #include <wtf/glib/GRefPtr.h>
 
 typedef struct _GtkAction GtkAction;
+typedef struct _GAction GAction;
+typedef struct _GSimpleAction GSimpleAction;
 
 namespace WebKit {
 
@@ -45,13 +47,15 @@
 
     // We don't use the SubmenuType internally, so check if we have submenu items.
     WebCore::ContextMenuItemType type() const { return m_submenuItems.isEmpty() ? WebContextMenuItemData::type() : WebCore::SubmenuType; }
-    GtkAction* gtkAction() const { return m_action.get(); }
+    GtkAction* gtkAction() const { return m_gtkAction; }
+    GAction* gAction() const { return reinterpret_cast<GAction*>(m_gAction.get()); }
     const Vector<WebContextMenuItemGtk>& submenuItems() const { return m_submenuItems; }
 
 private:
-    void createGtkActionIfNeeded();
+    void createActionIfNeeded();
 
-    GRefPtr<GtkAction> m_action;
+    GRefPtr<GSimpleAction> m_gAction;
+    GtkAction* m_gtkAction { nullptr };
     Vector<WebContextMenuItemGtk> m_submenuItems;
 };
 

Modified: trunk/Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.cpp (206504 => 206505)


--- trunk/Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.cpp	2016-09-28 07:22:11 UTC (rev 206504)
+++ trunk/Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.cpp	2016-09-28 07:49:05 UTC (rev 206505)
@@ -36,123 +36,101 @@
 #include "WebPageProxy.h"
 #include "WebProcessProxy.h"
 #include <WebCore/GtkUtilities.h>
+#include <gio/gio.h>
 #include <gtk/gtk.h>
 #include <wtf/text/CString.h>
 
-
 static const char* gContextMenuActionId = "webkit-context-menu-action";
+static const char* gContextMenuTitle = "webkit-context-menu-title";
+static const char* gContextMenuItemGroup = "webkitContextMenu";
 
 using namespace WebCore;
 
 namespace WebKit {
 
-static void contextMenuItemActivatedCallback(GtkAction* action, WebPageProxy* page)
+static void contextMenuItemActivatedCallback(GAction* action, GVariant*, WebPageProxy* page)
 {
-    gboolean isToggle = GTK_IS_TOGGLE_ACTION(action);
+    auto* stateType = g_action_get_state_type(action);
+    gboolean isToggle = stateType && g_variant_type_equal(stateType, G_VARIANT_TYPE_BOOLEAN);
+    GRefPtr<GVariant> state = isToggle ? adoptGRef(g_action_get_state(action)) : nullptr;
     WebContextMenuItemData item(isToggle ? CheckableActionType : ActionType,
         static_cast<ContextMenuAction>(GPOINTER_TO_INT(g_object_get_data(G_OBJECT(action), gContextMenuActionId))),
-        String::fromUTF8(gtk_action_get_label(action)), gtk_action_get_sensitive(action),
-        isToggle ? gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(action)) : false);
+        String::fromUTF8(static_cast<const char*>(g_object_get_data(G_OBJECT(action), gContextMenuTitle))), g_action_get_enabled(action),
+        state ? g_variant_get_boolean(state.get()) : false);
     page->contextMenuItemSelected(item);
 }
 
-static void contextMenuItemVisibilityChanged(GtkAction*, GParamSpec*, WebContextMenuProxyGtk* contextMenuProxy)
+void WebContextMenuProxyGtk::append(GMenu* menu, const WebContextMenuItemGtk& menuItem)
 {
-    GtkMenu* menu = contextMenuProxy->gtkMenu();
-    if (!menu)
-        return;
+    unsigned long signalHandlerId;
+    GRefPtr<GMenuItem> gMenuItem;
+    GAction* action = ""
+    ASSERT(action);
+    g_action_map_add_action(G_ACTION_MAP(gtk_widget_get_action_group(GTK_WIDGET(m_menu), gContextMenuItemGroup)), action);
 
-    GUniquePtr<GList> items(gtk_container_get_children(GTK_CONTAINER(menu)));
-    bool previousVisibleItemIsNotASeparator = false;
-    GtkWidget* lastItemVisibleSeparator = 0;
-    for (GList* iter = items.get(); iter; iter = g_list_next(iter)) {
-        GtkWidget* widget = GTK_WIDGET(iter->data);
+    switch (menuItem.type()) {
+    case ActionType:
+    case CheckableActionType: {
+        GUniquePtr<char> actionName(g_strdup_printf("%s.%s", gContextMenuItemGroup, g_action_get_name(action)));
+        gMenuItem = adoptGRef(g_menu_item_new(menuItem.title().utf8().data(), nullptr));
+        g_menu_item_set_action_and_target_value(gMenuItem.get(), actionName.get(), nullptr);
 
-        if (GTK_IS_SEPARATOR_MENU_ITEM(widget)) {
-            if (previousVisibleItemIsNotASeparator) {
-                gtk_widget_show(widget);
-                lastItemVisibleSeparator = widget;
-                previousVisibleItemIsNotASeparator = false;
-            } else
-                gtk_widget_hide(widget);
-        } else if (gtk_widget_get_visible(widget)) {
-            lastItemVisibleSeparator = 0;
-            previousVisibleItemIsNotASeparator = true;
-        }
+        g_object_set_data(G_OBJECT(action), gContextMenuActionId, GINT_TO_POINTER(menuItem.action()));
+        g_object_set_data_full(G_OBJECT(action), gContextMenuTitle, g_strdup(menuItem.title().utf8().data()), g_free);
+        signalHandlerId = g_signal_connect(action, "activate", G_CALLBACK(contextMenuItemActivatedCallback), m_page);
+        m_signalHandlers.set(signalHandlerId, action);
+        break;
     }
+    case SubmenuType: {
+        GRefPtr<GMenu> submenu = buildMenu(menuItem.submenuItems());
+        gMenuItem = adoptGRef(g_menu_item_new_submenu(menuItem.title().utf8().data(), G_MENU_MODEL(submenu.get())));
+        break;
+    }
+    case SeparatorType:
+        ASSERT_NOT_REACHED();
+        break;
+    }
 
-    if (lastItemVisibleSeparator)
-        gtk_widget_hide(lastItemVisibleSeparator);
+    g_menu_append_item(menu, gMenuItem.get());
 }
 
-void WebContextMenuProxyGtk::append(GtkMenu* menu, const WebContextMenuItemGtk& menuItem)
+GRefPtr<GMenu> WebContextMenuProxyGtk::buildMenu(const Vector<WebContextMenuItemGtk>& items)
 {
-    unsigned long signalHandlerId;
-    GtkWidget* gtkMenuItem;
-    if (GtkAction* action = "" {
-        gtkMenuItem = gtk_action_create_menu_item(action);
-
-        switch (menuItem.type()) {
-        case ActionType:
-        case CheckableActionType:
-            g_object_set_data(G_OBJECT(action), gContextMenuActionId, GINT_TO_POINTER(menuItem.action()));
-            signalHandlerId = g_signal_connect(action, "activate", G_CALLBACK(contextMenuItemActivatedCallback), m_page);
-            m_signalHandlers.set(signalHandlerId, action);
-            signalHandlerId = g_signal_connect(action, "notify::visible", G_CALLBACK(contextMenuItemVisibilityChanged), this);
-            m_signalHandlers.set(signalHandlerId, action);
-            break;
-        case SubmenuType: {
-            signalHandlerId = g_signal_connect(action, "notify::visible", G_CALLBACK(contextMenuItemVisibilityChanged), this);
-            m_signalHandlers.set(signalHandlerId, action);
-            GtkMenu* submenu = GTK_MENU(gtk_menu_new());
-            for (const auto& item : menuItem.submenuItems())
-                append(submenu, item);
-            gtk_menu_item_set_submenu(GTK_MENU_ITEM(gtkMenuItem), GTK_WIDGET(submenu));
-            break;
-        }
-        case SeparatorType:
-            ASSERT_NOT_REACHED();
-            break;
-        }
-    } else {
-        ASSERT(menuItem.type() == SeparatorType);
-        gtkMenuItem = gtk_separator_menu_item_new();
+    GRefPtr<GMenu> menu = adoptGRef(g_menu_new());
+    GMenu* sectionMenu = menu.get();
+    for (const auto& item : items) {
+        if (item.type() == SeparatorType) {
+            GRefPtr<GMenu> section = adoptGRef(g_menu_new());
+            g_menu_append_section(menu.get(), nullptr, G_MENU_MODEL(section.get()));
+            sectionMenu = section.get();
+        } else
+            append(sectionMenu, item);
     }
 
-    gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtkMenuItem);
-    gtk_widget_show(gtkMenuItem);
+    return menu;
 }
 
-// Populate the context menu ensuring that:
-//  - There aren't separators next to each other.
-//  - There aren't separators at the beginning of the menu.
-//  - There aren't separators at the end of the menu.
-void WebContextMenuProxyGtk::populate(Vector<WebContextMenuItemGtk>& items)
+void WebContextMenuProxyGtk::populate(const Vector<WebContextMenuItemGtk>& items)
 {
-    bool previousIsSeparator = false;
-    bool isEmpty = true;
-    for (size_t i = 0; i < items.size(); i++) {
-        WebContextMenuItemGtk& menuItem = items.at(i);
-        if (menuItem.type() == SeparatorType) {
-            previousIsSeparator = true;
-            continue;
-        }
-
-        if (previousIsSeparator && !isEmpty)
-            append(m_menu, items.at(i - 1));
-        previousIsSeparator = false;
-
-        append(m_menu, menuItem);
-        isEmpty = false;
-    }
+    GRefPtr<GMenu> menu = buildMenu(items);
+    gtk_menu_shell_bind_model(GTK_MENU_SHELL(m_menu), G_MENU_MODEL(menu.get()), nullptr, TRUE);
 }
 
 void WebContextMenuProxyGtk::populate(const Vector<RefPtr<WebContextMenuItem>>& items)
 {
+    GRefPtr<GMenu> menu = adoptGRef(g_menu_new());
+    GMenu* sectionMenu = menu.get();
     for (const auto& item : items) {
-        WebContextMenuItemGtk menuitem(item->data());
-        append(m_menu, menuitem);
+        if (item->data().type() == SeparatorType) {
+            GRefPtr<GMenu> section = adoptGRef(g_menu_new());
+            g_menu_append_section(menu.get(), nullptr, G_MENU_MODEL(section.get()));
+            sectionMenu = section.get();
+        } else {
+            WebContextMenuItemGtk menuitem(item->data());
+            append(sectionMenu, menuitem);
+        }
     }
+    gtk_menu_shell_bind_model(GTK_MENU_SHELL(m_menu), G_MENU_MODEL(menu.get()), nullptr, TRUE);
 }
 
 void WebContextMenuProxyGtk::show()
@@ -195,6 +173,8 @@
     , m_page(&page)
     , m_menu(GTK_MENU(gtk_menu_new()))
 {
+    GRefPtr<GSimpleActionGroup> group = adoptGRef(g_simple_action_group_new());
+    gtk_widget_insert_action_group(GTK_WIDGET(m_menu), gContextMenuItemGroup, G_ACTION_GROUP(group.get()));
     webkitWebViewBaseSetActiveContextMenuProxy(WEBKIT_WEB_VIEW_BASE(m_webView), this);
 }
 
@@ -206,6 +186,7 @@
         g_signal_handler_disconnect(handler.value, handler.key);
     m_signalHandlers.clear();
 
+    gtk_widget_insert_action_group(GTK_WIDGET(m_menu), "webkitContextMenu", nullptr);
     gtk_widget_destroy(GTK_WIDGET(m_menu));
 }
 

Modified: trunk/Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.h (206504 => 206505)


--- trunk/Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.h	2016-09-28 07:22:11 UTC (rev 206504)
+++ trunk/Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.h	2016-09-28 07:49:05 UTC (rev 206505)
@@ -32,7 +32,10 @@
 #include "WebContextMenuProxy.h"
 #include <WebCore/IntPoint.h>
 #include <wtf/HashMap.h>
+#include <wtf/glib/GRefPtr.h>
 
+typedef struct _GMenu GMenu;
+
 namespace WebKit {
 
 class WebContextMenuItem;
@@ -44,12 +47,13 @@
     WebContextMenuProxyGtk(GtkWidget*, WebPageProxy&, const ContextMenuContextData&, const UserData&);
     ~WebContextMenuProxyGtk();
 
-    void populate(Vector<WebContextMenuItemGtk>&);
+    void populate(const Vector<WebContextMenuItemGtk>&);
     GtkMenu* gtkMenu() const { return m_menu; }
 
 private:
     void show() override;
-    void append(GtkMenu*, const WebContextMenuItemGtk&);
+    void append(GMenu*, const WebContextMenuItemGtk&);
+    GRefPtr<GMenu> buildMenu(const Vector<WebContextMenuItemGtk>&);
     void populate(const Vector<RefPtr<WebContextMenuItem>>&);
     static void menuPositionFunction(GtkMenu*, gint*, gint*, gboolean*, WebContextMenuProxyGtk*);
 
@@ -57,7 +61,7 @@
     WebPageProxy* m_page;
     GtkMenu* m_menu;
     WebCore::IntPoint m_popupPosition;
-    HashMap<unsigned long, GtkAction*> m_signalHandlers;
+    HashMap<unsigned long, void*> m_signalHandlers;
 };
 
 

Modified: trunk/Tools/ChangeLog (206504 => 206505)


--- trunk/Tools/ChangeLog	2016-09-28 07:22:11 UTC (rev 206504)
+++ trunk/Tools/ChangeLog	2016-09-28 07:49:05 UTC (rev 206505)
@@ -1,3 +1,16 @@
+2016-09-28  Carlos Garcia Campos  <[email protected]>
+
+        [GTK] Switch to use GMenu internally in the context menu implementation
+        https://bugs.webkit.org/show_bug.cgi?id=162603
+
+        Reviewed by Michael Catanzaro.
+
+        Remove smart separators test, since that's now done automatically by GTK+.
+
+        * TestWebKitAPI/Tests/WebKit2Gtk/TestContextMenu.cpp:
+        (beforeAll):
+        (testContextMenuWebExtensionMenu): Deleted.
+
 2016-09-27  Alex Christensen  <[email protected]>
 
         Correctly parse URLs with the first tab in the fragment

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestContextMenu.cpp (206504 => 206505)


--- trunk/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestContextMenu.cpp	2016-09-28 07:22:11 UTC (rev 206504)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestContextMenu.cpp	2016-09-28 07:49:05 UTC (rev 206505)
@@ -761,115 +761,6 @@
     g_assert(test->m_dismissed);
 }
 
-class ContextMenuSmartSeparatorsTest: public ContextMenuTest {
-public:
-    MAKE_GLIB_TEST_FIXTURE(ContextMenuSmartSeparatorsTest);
-
-    bool contextMenu(WebKitContextMenu* contextMenu, GdkEvent*, WebKitHitTestResult*)
-    {
-        webkit_context_menu_remove_all(contextMenu);
-
-        webkit_context_menu_append(contextMenu, webkit_context_menu_item_new_separator());
-        webkit_context_menu_append(contextMenu, webkit_context_menu_item_new_separator());
-        webkit_context_menu_append(contextMenu, webkit_context_menu_item_new_from_stock_action(WEBKIT_CONTEXT_MENU_ACTION_GO_BACK));
-        webkit_context_menu_append(contextMenu, webkit_context_menu_item_new_from_stock_action(WEBKIT_CONTEXT_MENU_ACTION_GO_FORWARD));
-        webkit_context_menu_append(contextMenu, webkit_context_menu_item_new_separator());
-        webkit_context_menu_append(contextMenu, webkit_context_menu_item_new_separator());
-        webkit_context_menu_append(contextMenu, webkit_context_menu_item_new_from_stock_action(WEBKIT_CONTEXT_MENU_ACTION_COPY));
-        webkit_context_menu_append(contextMenu, webkit_context_menu_item_new_separator());
-        webkit_context_menu_append(contextMenu, webkit_context_menu_item_new_from_stock_action(WEBKIT_CONTEXT_MENU_ACTION_INSPECT_ELEMENT));
-        webkit_context_menu_append(contextMenu, webkit_context_menu_item_new_separator());
-        webkit_context_menu_append(contextMenu, webkit_context_menu_item_new_separator());
-
-        quitMainLoop();
-
-        return false;
-    }
-
-    GtkMenu* showContextMenuAndGetGtkMenu()
-    {
-        showContextMenuAndWaitUntilFinished();
-        return getPopupMenu();
-    }
-};
-
-static void testContextMenuSmartSeparators(ContextMenuSmartSeparatorsTest* test, gconstpointer)
-{
-    test->showInWindowAndWaitUntilMapped();
-
-    test->loadHtml("<html><body>WebKitGTK+ Context menu tests</body></html>", "file:///");
-    test->waitUntilLoadFinished();
-
-    GtkMenu* menu = test->showContextMenuAndGetGtkMenu();
-    g_assert(menu);
-
-    // Leading and trailing separators are not added to the context menu.
-    GUniquePtr<GList> menuItems(gtk_container_get_children(GTK_CONTAINER(menu)));
-    g_assert_cmpuint(g_list_length(menuItems.get()), ==, 6);
-    GtkWidget* item = GTK_WIDGET(g_list_nth_data(menuItems.get(), 0));
-    g_assert(!GTK_IS_SEPARATOR_MENU_ITEM(item) && gtk_widget_get_visible(item));
-    item = GTK_WIDGET(g_list_nth_data(menuItems.get(), 1));
-    g_assert(!GTK_IS_SEPARATOR_MENU_ITEM(item) && gtk_widget_get_visible(item));
-    item = GTK_WIDGET(g_list_nth_data(menuItems.get(), 2));
-    g_assert(GTK_IS_SEPARATOR_MENU_ITEM(item) && gtk_widget_get_visible(item));
-    item = GTK_WIDGET(g_list_nth_data(menuItems.get(), 3));
-    g_assert(!GTK_IS_SEPARATOR_MENU_ITEM(item) && gtk_widget_get_visible(item));
-    item = GTK_WIDGET(g_list_nth_data(menuItems.get(), 4));
-    g_assert(GTK_IS_SEPARATOR_MENU_ITEM(item) && gtk_widget_get_visible(item));
-    item = GTK_WIDGET(g_list_nth_data(menuItems.get(), 5));
-    g_assert(!GTK_IS_SEPARATOR_MENU_ITEM(item) && gtk_widget_get_visible(item));
-
-    // Hiding a menu item between two separators hides the following separator.
-    GtkAction* action = "" 3)));
-    gtk_action_set_visible(action, FALSE);
-    menuItems.reset(gtk_container_get_children(GTK_CONTAINER(menu)));
-    g_assert_cmpuint(g_list_length(menuItems.get()), ==, 6);
-    item = GTK_WIDGET(g_list_nth_data(menuItems.get(), 0));
-    g_assert(!GTK_IS_SEPARATOR_MENU_ITEM(item) && gtk_widget_get_visible(item));
-    item = GTK_WIDGET(g_list_nth_data(menuItems.get(), 1));
-    g_assert(!GTK_IS_SEPARATOR_MENU_ITEM(item) && gtk_widget_get_visible(item));
-    item = GTK_WIDGET(g_list_nth_data(menuItems.get(), 2));
-    g_assert(GTK_IS_SEPARATOR_MENU_ITEM(item) && gtk_widget_get_visible(item));
-    item = GTK_WIDGET(g_list_nth_data(menuItems.get(), 3));
-    g_assert(!GTK_IS_SEPARATOR_MENU_ITEM(item) && !gtk_widget_get_visible(item));
-    item = GTK_WIDGET(g_list_nth_data(menuItems.get(), 4));
-    g_assert(GTK_IS_SEPARATOR_MENU_ITEM(item) && !gtk_widget_get_visible(item));
-    item = GTK_WIDGET(g_list_nth_data(menuItems.get(), 5));
-    g_assert(!GTK_IS_SEPARATOR_MENU_ITEM(item) && gtk_widget_get_visible(item));
-    gtk_action_set_visible(action, TRUE);
-
-    // Showing an action between two separators shows the hidden separator.
-    item = GTK_WIDGET(g_list_nth_data(menuItems.get(), 0));
-    g_assert(!GTK_IS_SEPARATOR_MENU_ITEM(item) && gtk_widget_get_visible(item));
-    item = GTK_WIDGET(g_list_nth_data(menuItems.get(), 1));
-    g_assert(!GTK_IS_SEPARATOR_MENU_ITEM(item) && gtk_widget_get_visible(item));
-    item = GTK_WIDGET(g_list_nth_data(menuItems.get(), 2));
-    g_assert(GTK_IS_SEPARATOR_MENU_ITEM(item) && gtk_widget_get_visible(item));
-    item = GTK_WIDGET(g_list_nth_data(menuItems.get(), 3));
-    g_assert(!GTK_IS_SEPARATOR_MENU_ITEM(item) && gtk_widget_get_visible(item));
-    item = GTK_WIDGET(g_list_nth_data(menuItems.get(), 4));
-    g_assert(GTK_IS_SEPARATOR_MENU_ITEM(item) && gtk_widget_get_visible(item));
-    item = GTK_WIDGET(g_list_nth_data(menuItems.get(), 5));
-    g_assert(!GTK_IS_SEPARATOR_MENU_ITEM(item) && gtk_widget_get_visible(item));
-
-    // Trailing separators are hidden too.
-    action = "" 5)));
-    gtk_action_set_visible(action, FALSE);
-    menuItems.reset(gtk_container_get_children(GTK_CONTAINER(menu)));
-    item = GTK_WIDGET(g_list_nth_data(menuItems.get(), 0));
-    g_assert(!GTK_IS_SEPARATOR_MENU_ITEM(item) && gtk_widget_get_visible(item));
-    item = GTK_WIDGET(g_list_nth_data(menuItems.get(), 1));
-    g_assert(!GTK_IS_SEPARATOR_MENU_ITEM(item) && gtk_widget_get_visible(item));
-    item = GTK_WIDGET(g_list_nth_data(menuItems.get(), 2));
-    g_assert(GTK_IS_SEPARATOR_MENU_ITEM(item) && gtk_widget_get_visible(item));
-    item = GTK_WIDGET(g_list_nth_data(menuItems.get(), 3));
-    g_assert(!GTK_IS_SEPARATOR_MENU_ITEM(item) && gtk_widget_get_visible(item));
-    item = GTK_WIDGET(g_list_nth_data(menuItems.get(), 4));
-    g_assert(GTK_IS_SEPARATOR_MENU_ITEM(item) && !gtk_widget_get_visible(item));
-    item = GTK_WIDGET(g_list_nth_data(menuItems.get(), 5));
-    g_assert(!GTK_IS_SEPARATOR_MENU_ITEM(item) && !gtk_widget_get_visible(item));
-}
-
 class ContextMenuWebExtensionTest: public ContextMenuTest {
 public:
     MAKE_GLIB_TEST_FIXTURE(ContextMenuWebExtensionTest);
@@ -1033,7 +924,6 @@
     ContextMenuDisabledTest::add("WebKitWebView", "disable-menu", testContextMenuDisableMenu);
     ContextMenuSubmenuTest::add("WebKitWebView", "submenu", testContextMenuSubMenu);
     ContextMenuDismissedTest::add("WebKitWebView", "menu-dismissed", testContextMenuDismissed);
-    ContextMenuSmartSeparatorsTest::add("WebKitWebView", "smart-separators", testContextMenuSmartSeparators);
     ContextMenuWebExtensionTest::add("WebKitWebPage", "context-menu", testContextMenuWebExtensionMenu);
     ContextMenuWebExtensionNodeTest::add("WebKitWebPage", "context-menu-node", testContextMenuWebExtensionNode);
 }
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to