diff options
Diffstat (limited to 'Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestContextMenu.cpp')
-rw-r--r-- | Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestContextMenu.cpp | 370 |
1 files changed, 252 insertions, 118 deletions
diff --git a/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestContextMenu.cpp b/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestContextMenu.cpp index a91e78741..3d7ab00cc 100644 --- a/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestContextMenu.cpp +++ b/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestContextMenu.cpp @@ -19,7 +19,8 @@ #include "config.h" #include "WebViewTest.h" -#include <wtf/gobject/GRefPtr.h> +#include <wtf/Vector.h> +#include <wtf/glib/GRefPtr.h> class ContextMenuTest: public WebViewTest { public: @@ -32,10 +33,24 @@ public: void checkContextMenuEvent(GdkEvent* event) { g_assert(event); - g_assert_cmpint(event->type, ==, GDK_BUTTON_PRESS); - g_assert_cmpint(event->button.button, ==, 3); - g_assert_cmpint(event->button.x, ==, m_menuPositionX); - g_assert_cmpint(event->button.y, ==, m_menuPositionY); + g_assert_cmpint(event->type, ==, m_expectedEventType); + + switch (m_expectedEventType) { + case GDK_BUTTON_PRESS: + g_assert_cmpint(event->button.button, ==, 3); + g_assert_cmpint(event->button.x, ==, m_menuPositionX); + g_assert_cmpint(event->button.y, ==, m_menuPositionY); + break; + case GDK_KEY_PRESS: + g_assert_cmpint(event->key.keyval, ==, GDK_KEY_Menu); + break; + case GDK_NOTHING: + // GDK_NOTHING means that the context menu was triggered by the + // popup-menu signal. We don't have anything to check here. + break; + default: + g_assert_not_reached(); + } } static gboolean contextMenuCallback(WebKitWebView* webView, WebKitContextMenu* contextMenu, GdkEvent* event, WebKitHitTestResult* hitTestResult, ContextMenuTest* test) @@ -57,6 +72,7 @@ public: ContextMenuTest() : m_menuPositionX(0) , m_menuPositionY(0) + , m_expectedEventType(GDK_BUTTON_PRESS) { g_signal_connect(m_webView, "context-menu", G_CALLBACK(contextMenuCallback), this); g_signal_connect(m_webView, "context-menu-dismissed", G_CALLBACK(contextMenuDismissedCallback), this); @@ -92,17 +108,6 @@ public: return 0; } - bool shouldShowInputMethodsMenu() - { - GtkSettings* settings = gtk_widget_get_settings(GTK_WIDGET(m_webView)); - if (!settings) - return true; - - gboolean showInputMethodMenu; - g_object_get(settings, "gtk-show-input-method-menu", &showInputMethodMenu, NULL); - return showInputMethodMenu; - } - void checkActionState(GtkAction* action, unsigned state) { if (state & Visible) @@ -209,6 +214,7 @@ public: void showContextMenuAndWaitUntilFinished() { + m_expectedEventType = GDK_BUTTON_PRESS; showContextMenuAtPositionAndWaitUntilFinished(0, 0); } @@ -224,8 +230,35 @@ public: g_main_loop_run(m_mainLoop); } + static gboolean emitPopupMenuSignalIdleCallback(ContextMenuTest* test) + { + test->emitPopupMenuSignal(); + return FALSE; + } + + void showContextMenuTriggeredByPopupEventAndWaitUntilFinished() + { + m_expectedEventType = GDK_NOTHING; + g_idle_add(reinterpret_cast<GSourceFunc>(emitPopupMenuSignalIdleCallback), this); + g_main_loop_run(m_mainLoop); + } + + static gboolean simulateMenuKeyIdleCallback(ContextMenuTest* test) + { + test->keyStroke(GDK_KEY_Menu); + return FALSE; + } + + void showContextMenuTriggeredByContextMenuKeyAndWaitUntilFinished() + { + m_expectedEventType = GDK_KEY_PRESS; + g_idle_add(reinterpret_cast<GSourceFunc>(simulateMenuKeyIdleCallback), this); + g_main_loop_run(m_mainLoop); + } + double m_menuPositionX; double m_menuPositionY; + GdkEventType m_expectedEventType; }; class ContextMenuDefaultTest: public ContextMenuTest { @@ -239,7 +272,8 @@ public: LinkImage, Video, Audio, - Editable + Editable, + Selection }; ContextMenuDefaultTest() @@ -257,6 +291,7 @@ public: g_assert(!webkit_hit_test_result_context_is_image(hitTestResult)); g_assert(!webkit_hit_test_result_context_is_media(hitTestResult)); g_assert(!webkit_hit_test_result_context_is_editable(hitTestResult)); + g_assert(!webkit_hit_test_result_context_is_selection(hitTestResult)); iter = checkCurrentItemIsStockActionAndGetNext(iter, WEBKIT_CONTEXT_MENU_ACTION_GO_BACK, Visible); iter = checkCurrentItemIsStockActionAndGetNext(iter, WEBKIT_CONTEXT_MENU_ACTION_GO_FORWARD, Visible); iter = checkCurrentItemIsStockActionAndGetNext(iter, WEBKIT_CONTEXT_MENU_ACTION_STOP, Visible); @@ -267,6 +302,7 @@ public: g_assert(!webkit_hit_test_result_context_is_image(hitTestResult)); g_assert(!webkit_hit_test_result_context_is_media(hitTestResult)); g_assert(!webkit_hit_test_result_context_is_editable(hitTestResult)); + g_assert(!webkit_hit_test_result_context_is_selection(hitTestResult)); iter = checkCurrentItemIsStockActionAndGetNext(iter, WEBKIT_CONTEXT_MENU_ACTION_OPEN_LINK, Visible | Enabled); iter = checkCurrentItemIsStockActionAndGetNext(iter, WEBKIT_CONTEXT_MENU_ACTION_OPEN_LINK_IN_NEW_WINDOW, Visible | Enabled); iter = checkCurrentItemIsStockActionAndGetNext(iter, WEBKIT_CONTEXT_MENU_ACTION_DOWNLOAD_LINK_TO_DISK, Visible | Enabled); @@ -277,6 +313,7 @@ public: g_assert(webkit_hit_test_result_context_is_image(hitTestResult)); g_assert(!webkit_hit_test_result_context_is_media(hitTestResult)); g_assert(!webkit_hit_test_result_context_is_editable(hitTestResult)); + g_assert(!webkit_hit_test_result_context_is_selection(hitTestResult)); iter = checkCurrentItemIsStockActionAndGetNext(iter, WEBKIT_CONTEXT_MENU_ACTION_OPEN_IMAGE_IN_NEW_WINDOW, Visible | Enabled); iter = checkCurrentItemIsStockActionAndGetNext(iter, WEBKIT_CONTEXT_MENU_ACTION_DOWNLOAD_IMAGE_TO_DISK, Visible | Enabled); iter = checkCurrentItemIsStockActionAndGetNext(iter, WEBKIT_CONTEXT_MENU_ACTION_COPY_IMAGE_TO_CLIPBOARD, Visible | Enabled); @@ -287,6 +324,7 @@ public: g_assert(webkit_hit_test_result_context_is_image(hitTestResult)); g_assert(!webkit_hit_test_result_context_is_media(hitTestResult)); g_assert(!webkit_hit_test_result_context_is_editable(hitTestResult)); + g_assert(!webkit_hit_test_result_context_is_selection(hitTestResult)); iter = checkCurrentItemIsStockActionAndGetNext(iter, WEBKIT_CONTEXT_MENU_ACTION_OPEN_LINK, Visible | Enabled); iter = checkCurrentItemIsStockActionAndGetNext(iter, WEBKIT_CONTEXT_MENU_ACTION_OPEN_LINK_IN_NEW_WINDOW, Visible | Enabled); iter = checkCurrentItemIsStockActionAndGetNext(iter, WEBKIT_CONTEXT_MENU_ACTION_DOWNLOAD_LINK_TO_DISK, Visible | Enabled); @@ -302,6 +340,7 @@ public: g_assert(!webkit_hit_test_result_context_is_image(hitTestResult)); g_assert(webkit_hit_test_result_context_is_media(hitTestResult)); g_assert(!webkit_hit_test_result_context_is_editable(hitTestResult)); + g_assert(!webkit_hit_test_result_context_is_selection(hitTestResult)); iter = checkCurrentItemIsStockActionAndGetNext(iter, WEBKIT_CONTEXT_MENU_ACTION_MEDIA_PLAY, Visible | Enabled); iter = checkCurrentItemIsStockActionAndGetNext(iter, WEBKIT_CONTEXT_MENU_ACTION_MEDIA_MUTE, Visible); iter = checkCurrentItemIsStockActionAndGetNext(iter, WEBKIT_CONTEXT_MENU_ACTION_TOGGLE_MEDIA_CONTROLS, Visible | Enabled | Checked); @@ -317,6 +356,7 @@ public: g_assert(!webkit_hit_test_result_context_is_image(hitTestResult)); g_assert(webkit_hit_test_result_context_is_media(hitTestResult)); g_assert(!webkit_hit_test_result_context_is_editable(hitTestResult)); + g_assert(!webkit_hit_test_result_context_is_selection(hitTestResult)); iter = checkCurrentItemIsStockActionAndGetNext(iter, WEBKIT_CONTEXT_MENU_ACTION_MEDIA_PLAY, Visible | Enabled); iter = checkCurrentItemIsStockActionAndGetNext(iter, WEBKIT_CONTEXT_MENU_ACTION_MEDIA_MUTE, Visible); iter = checkCurrentItemIsStockActionAndGetNext(iter, WEBKIT_CONTEXT_MENU_ACTION_TOGGLE_MEDIA_CONTROLS, Visible | Enabled | Checked); @@ -332,6 +372,7 @@ public: g_assert(!webkit_hit_test_result_context_is_image(hitTestResult)); g_assert(!webkit_hit_test_result_context_is_media(hitTestResult)); g_assert(webkit_hit_test_result_context_is_editable(hitTestResult)); + g_assert(!webkit_hit_test_result_context_is_selection(hitTestResult)); iter = checkCurrentItemIsStockActionAndGetNext(iter, WEBKIT_CONTEXT_MENU_ACTION_CUT, Visible); iter = checkCurrentItemIsStockActionAndGetNext(iter, WEBKIT_CONTEXT_MENU_ACTION_COPY, Visible); iter = checkCurrentItemIsStockActionAndGetNext(iter, WEBKIT_CONTEXT_MENU_ACTION_PASTE, Visible | Enabled); @@ -339,10 +380,16 @@ public: iter = checkCurrentItemIsSeparatorAndGetNext(iter); iter = checkCurrentItemIsStockActionAndGetNext(iter, WEBKIT_CONTEXT_MENU_ACTION_SELECT_ALL, Visible | Enabled); iter = checkCurrentItemIsSeparatorAndGetNext(iter); - if (shouldShowInputMethodsMenu()) - iter = checkCurrentItemIsStockActionAndGetNext(iter, WEBKIT_CONTEXT_MENU_ACTION_INPUT_METHODS, Visible | Enabled); iter = checkCurrentItemIsStockActionAndGetNext(iter, WEBKIT_CONTEXT_MENU_ACTION_UNICODE, Visible | Enabled); break; + case Selection: + g_assert(!webkit_hit_test_result_context_is_link(hitTestResult)); + g_assert(!webkit_hit_test_result_context_is_image(hitTestResult)); + g_assert(!webkit_hit_test_result_context_is_media(hitTestResult)); + g_assert(!webkit_hit_test_result_context_is_editable(hitTestResult)); + g_assert(webkit_hit_test_result_context_is_selection(hitTestResult)); + iter = checkCurrentItemIsStockActionAndGetNext(iter, WEBKIT_CONTEXT_MENU_ACTION_COPY, Visible | Enabled); + break; default: g_assert_not_reached(); } @@ -361,21 +408,39 @@ public: DefaultMenuType m_expectedMenuType; }; -static void testContextMenuDefaultMenu(ContextMenuDefaultTest* test, gconstpointer) +static void prepareContextMenuTestView(ContextMenuDefaultTest* test) { - test->showInWindowAndWaitUntilMapped(); - + GUniquePtr<char> baseDir(g_strdup_printf("file://%s/", Test::getResourcesDir().data())); const char* linksHTML = "<html><body>" " <a style='position:absolute; left:1; top:1' href='http://www.webkitgtk.org' title='WebKitGTK+ Title'>WebKitGTK+ Website</a>" - " <img style='position:absolute; left:1; top:10' src='0xdeadbeef' width=5 height=5></img>" - " <a style='position:absolute; left:1; top:20' href='http://www.webkitgtk.org/logo' title='WebKitGTK+ Logo'><img src='0xdeadbeef' width=5 height=5></img></a>" + " <img style='position:absolute; left:1; top:10' src='blank.ico' width=5 height=5></img>" + " <a style='position:absolute; left:1; top:20' href='http://www.webkitgtk.org/logo' title='WebKitGTK+ Logo'><img src='blank.ico' width=5 height=5></img></a>" " <input style='position:absolute; left:1; top:30' size='10'></input>" - " <video style='position:absolute; left:1; top:50' width='300' height='300' controls='controls' preload='none'><source src='movie.ogg' type='video/ogg' /></video>" - " <audio style='position:absolute; left:1; top:60' width='50' height='20' controls='controls' preload='none'><source src='track.mp3' type='audio/mp3' /></audio>" + " <video style='position:absolute; left:1; top:50' width='300' height='300' controls='controls' preload='none'><source src='silence.mpg' type='video/mpeg' /></video>" + " <audio style='position:absolute; left:1; top:60' width='50' height='20' controls='controls' preload='none'><source src='track.ogg' type='audio/ogg' /></audio>" + " <p style='position:absolute; left:1; top:90' id='text_to_select'>Lorem ipsum.</p>" + " <script>" + " window.getSelection().removeAllRanges();" + " var select_range = document.createRange();" + " select_range.selectNodeContents(document.getElementById('text_to_select'));" + " window.getSelection().addRange(select_range);" + " </script>" "</body></html>"; - test->loadHtml(linksHTML, "file:///"); + test->loadHtml(linksHTML, baseDir.get()); test->waitUntilLoadFinished(); +} + +static void testContextMenuDefaultMenu(ContextMenuDefaultTest* test, gconstpointer) +{ + test->showInWindowAndWaitUntilMapped(); + + prepareContextMenuTestView(test); + + // Context menu for selection. + // This test should always be the first because any other click removes the selection. + test->m_expectedMenuType = ContextMenuDefaultTest::Selection; + test->showContextMenuAtPositionAndWaitUntilFinished(2, 115); // Context menu for document. test->m_expectedMenuType = ContextMenuDefaultTest::Navigation; @@ -410,6 +475,26 @@ static void testContextMenuDefaultMenu(ContextMenuDefaultTest* test, gconstpoint test->showContextMenuAtPositionAndWaitUntilFinished(5, 35); } +static void testPopupEventSignal(ContextMenuDefaultTest* test, gconstpointer) +{ + test->showInWindowAndWaitUntilMapped(); + + prepareContextMenuTestView(test); + + test->m_expectedMenuType = ContextMenuDefaultTest::Selection; + test->showContextMenuTriggeredByPopupEventAndWaitUntilFinished(); +} + +static void testContextMenuKey(ContextMenuDefaultTest* test, gconstpointer) +{ + test->showInWindowAndWaitUntilMapped(); + + prepareContextMenuTestView(test); + + test->m_expectedMenuType = ContextMenuDefaultTest::Selection; + test->showContextMenuTriggeredByContextMenuKeyAndWaitUntilFinished(); +} + class ContextMenuCustomTest: public ContextMenuTest { public: MAKE_GLIB_TEST_FIXTURE(ContextMenuCustomTest); @@ -742,124 +827,173 @@ static void testContextMenuDismissed(ContextMenuDismissedTest* test, gconstpoint g_assert(test->m_dismissed); } -class ContextMenuSmartSeparatorsTest: public ContextMenuTest { +class ContextMenuWebExtensionTest: public ContextMenuTest { public: - MAKE_GLIB_TEST_FIXTURE(ContextMenuSmartSeparatorsTest); + MAKE_GLIB_TEST_FIXTURE(ContextMenuWebExtensionTest); - bool contextMenu(WebKitContextMenu* contextMenu, GdkEvent*, WebKitHitTestResult*) + void deserializeContextMenuFromUserData(GVariant* userData) { - webkit_context_menu_remove_all(contextMenu); + m_actions.clear(); + if (!userData) + return; - 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()); + GVariantIter iter; + g_variant_iter_init(&iter, userData); + m_actions.reserveInitialCapacity(g_variant_iter_n_children(&iter)); + + uint32_t item; + while (g_variant_iter_next(&iter, "u", &item)) + m_actions.uncheckedAppend(static_cast<WebKitContextMenuAction>(item)); + } + + bool contextMenu(WebKitContextMenu* menu, GdkEvent*, WebKitHitTestResult*) + { + deserializeContextMenuFromUserData(webkit_context_menu_get_user_data(menu)); + GList* items = webkit_context_menu_get_items(menu); + g_assert_cmpuint(g_list_length(items), ==, m_actions.size()); + + unsigned actionIndex = 0; + for (GList* it = items; it; it = g_list_next(it)) { + WebKitContextMenuItem* item = WEBKIT_CONTEXT_MENU_ITEM(it->data); + g_assert_cmpuint(webkit_context_menu_item_get_stock_action(item), ==, m_actions[actionIndex++]); + } quitMainLoop(); - return false; + return true; + } + + Vector<WebKitContextMenuAction> m_actions; +}; + +static void testContextMenuWebExtensionMenu(ContextMenuWebExtensionTest* test, gconstpointer) +{ + test->showInWindowAndWaitUntilMapped(); + test->loadHtml("<html><body>WebKitGTK+ Context menu tests<br>" + "<a style='position:absolute; left:1; top:10' href='http://www.webkitgtk.org'>WebKitGTK+ Website</a></body></html>", + "ContextMenuTestDefault"); + test->waitUntilLoadFinished(); + + // Default context menu. + test->showContextMenuAtPositionAndWaitUntilFinished(1, 1); + g_assert_cmpuint(test->m_actions.size(), ==, 4); + g_assert_cmpuint(test->m_actions[0], ==, WEBKIT_CONTEXT_MENU_ACTION_GO_BACK); + g_assert_cmpuint(test->m_actions[1], ==, WEBKIT_CONTEXT_MENU_ACTION_GO_FORWARD); + g_assert_cmpuint(test->m_actions[2], ==, WEBKIT_CONTEXT_MENU_ACTION_STOP); + g_assert_cmpuint(test->m_actions[3], ==, WEBKIT_CONTEXT_MENU_ACTION_RELOAD); + + // Link menu. + test->showContextMenuAtPositionAndWaitUntilFinished(1, 11); + g_assert_cmpuint(test->m_actions.size(), ==, 4); + g_assert_cmpuint(test->m_actions[0], ==, WEBKIT_CONTEXT_MENU_ACTION_OPEN_LINK); + g_assert_cmpuint(test->m_actions[1], ==, WEBKIT_CONTEXT_MENU_ACTION_OPEN_LINK_IN_NEW_WINDOW); + g_assert_cmpuint(test->m_actions[2], ==, WEBKIT_CONTEXT_MENU_ACTION_DOWNLOAD_LINK_TO_DISK); + g_assert_cmpuint(test->m_actions[3], ==, WEBKIT_CONTEXT_MENU_ACTION_COPY_LINK_TO_CLIPBOARD); + + // Custom menu. + test->loadHtml("<html><body></body></html>", "ContextMenuTestCustom"); + test->showContextMenuAndWaitUntilFinished(); + g_assert_cmpuint(test->m_actions.size(), ==, 4); + g_assert_cmpuint(test->m_actions[0], ==, WEBKIT_CONTEXT_MENU_ACTION_STOP); + g_assert_cmpuint(test->m_actions[1], ==, WEBKIT_CONTEXT_MENU_ACTION_RELOAD); + g_assert_cmpuint(test->m_actions[2], ==, WEBKIT_CONTEXT_MENU_ACTION_NO_ACTION); + g_assert_cmpuint(test->m_actions[3], ==, WEBKIT_CONTEXT_MENU_ACTION_INSPECT_ELEMENT); + + // Menu cleared by the web process. + test->loadHtml("<html><body></body></html>", "ContextMenuTestClear"); + test->showContextMenuAndWaitUntilFinished(); + g_assert_cmpuint(test->m_actions.size(), ==, 0); +} + +class ContextMenuWebExtensionNodeTest: public ContextMenuTest { +public: + MAKE_GLIB_TEST_FIXTURE(ContextMenuWebExtensionNodeTest); + + struct Node { + enum { + NodeUnknown = 0, + NodeElement = 1, + NodeText = 3 + }; + typedef unsigned Type; + + CString name; + Type type; + CString contents; + CString parentName; + }; + + void deserializeNodeFromUserData(GVariant* userData) + { + GVariantIter iter; + g_variant_iter_init(&iter, userData); + + const char* key; + GVariant* value; + while (g_variant_iter_next(&iter, "{&sv}", &key, &value)) { + if (!strcmp(key, "Name") && g_variant_classify(value) == G_VARIANT_CLASS_STRING) + m_node.name = g_variant_get_string(value, nullptr); + else if (!strcmp(key, "Type") && g_variant_classify(value) == G_VARIANT_CLASS_UINT32) + m_node.type = g_variant_get_uint32(value); + else if (!strcmp(key, "Contents") && g_variant_classify(value) == G_VARIANT_CLASS_STRING) + m_node.contents = g_variant_get_string(value, nullptr); + else if (!strcmp(key, "Parent") && g_variant_classify(value) == G_VARIANT_CLASS_STRING) + m_node.parentName = g_variant_get_string(value, nullptr); + g_variant_unref(value); + } } - GtkMenu* showContextMenuAndGetGtkMenu() + bool contextMenu(WebKitContextMenu* menu, GdkEvent*, WebKitHitTestResult*) { - showContextMenuAndWaitUntilFinished(); - return getPopupMenu(); + deserializeNodeFromUserData(webkit_context_menu_get_user_data(menu)); + quitMainLoop(); + + return true; } + + Node m_node; }; -static void testContextMenuSmartSeparators(ContextMenuSmartSeparatorsTest* test, gconstpointer) +static void testContextMenuWebExtensionNode(ContextMenuWebExtensionNodeTest* test, gconstpointer) { test->showInWindowAndWaitUntilMapped(); - - test->loadHtml("<html><body>WebKitGTK+ Context menu tests</body></html>", "file:///"); + test->loadHtml("<html><body><p style='position:absolute; left:1; top:1'>WebKitGTK+ Context menu tests</p><br>" + "<a style='position:absolute; left:1; top:100' href='http://www.webkitgtk.org'>WebKitGTK+ Website</a></body></html>", + "ContextMenuTestNode"); 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 = gtk_activatable_get_related_action(GTK_ACTIVATABLE(g_list_nth_data(menuItems.get(), 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 = gtk_activatable_get_related_action(GTK_ACTIVATABLE(g_list_nth_data(menuItems.get(), 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)); + test->showContextMenuAtPositionAndWaitUntilFinished(0, 0); + g_assert_cmpstr(test->m_node.name.data(), ==, "HTML"); + g_assert_cmpuint(test->m_node.type, ==, ContextMenuWebExtensionNodeTest::Node::NodeElement); + g_assert_cmpstr(test->m_node.contents.data(), ==, "WebKitGTK+ Context menu testsWebKitGTK+ Website"); + g_assert_cmpstr(test->m_node.parentName.data(), ==, "#document"); + + test->showContextMenuAtPositionAndWaitUntilFinished(1, 20); + g_assert_cmpstr(test->m_node.name.data(), ==, "#text"); + g_assert_cmpuint(test->m_node.type, ==, ContextMenuWebExtensionNodeTest::Node::NodeText); + g_assert_cmpstr(test->m_node.contents.data(), ==, "WebKitGTK+ Context menu tests"); + g_assert_cmpstr(test->m_node.parentName.data(), ==, "P"); + + // Link menu. + test->showContextMenuAtPositionAndWaitUntilFinished(1, 101); + g_assert_cmpstr(test->m_node.name.data(), ==, "#text"); + g_assert_cmpuint(test->m_node.type, ==, ContextMenuWebExtensionNodeTest::Node::NodeText); + g_assert_cmpstr(test->m_node.contents.data(), ==, "WebKitGTK+ Website"); + g_assert_cmpstr(test->m_node.parentName.data(), ==, "A"); } void beforeAll() { ContextMenuDefaultTest::add("WebKitWebView", "default-menu", testContextMenuDefaultMenu); + ContextMenuDefaultTest::add("WebKitWebView", "context-menu-key", testContextMenuKey); + ContextMenuDefaultTest::add("WebKitWebView", "popup-event-signal", testPopupEventSignal); ContextMenuCustomTest::add("WebKitWebView", "populate-menu", testContextMenuPopulateMenu); ContextMenuCustomFullTest::add("WebKitWebView", "custom-menu", testContextMenuCustomMenu); 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); } void afterAll() |