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);
}