From c011515f3527093d69c2ce018acead3e7bfc51b2 Mon Sep 17 00:00:00 2001 From: "carlosgc@webkit.org" Date: Tue, 3 Jul 2012 15:43:42 +0000 Subject: [PATCH] [GTK] Add WebKitWebView::context-menu-dismissed signal to WebKit2 GTK+ API https://bugs.webkit.org/show_bug.cgi?id=90386 Reviewed by Martin Robinson. * UIProcess/API/gtk/WebKitWebView.cpp: (webkit_web_view_class_init): Add context-menu-dismissed signal. (contextMenuDismissed): Emit context-menu-dismissed signal. (webkitWebViewPopulateContextMenu): Connect to deactivate signal of the GtkMenu and emit WebKitWebView::context-menu-dismissed when the gtk menu is deactivated. * UIProcess/API/gtk/WebKitWebView.h: (_WebKitWebViewClass): Add virtual methos for context-menu-dismissed signal. * UIProcess/API/gtk/tests/TestContextMenu.cpp: (testContextMenuDismissed): (beforeAll): * UIProcess/gtk/WebContextMenuProxyGtk.h: (WebKit::WebContextMenuProxyGtk::gtkMenu): Get the GtkMenu built for the context menu proxy. git-svn-id: http://svn.webkit.org/repository/webkit/trunk@121771 268f45cc-cd09-0410-ab3c-d52691b4dbfc --- Source/WebKit2/ChangeLog | 23 +++++++ Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp | 24 +++++++ Source/WebKit2/UIProcess/API/gtk/WebKitWebView.h | 73 +++++++++++----------- .../UIProcess/API/gtk/tests/TestContextMenu.cpp | 67 +++++++++++++++++++- .../WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.h | 1 + 5 files changed, 151 insertions(+), 37 deletions(-) diff --git a/Source/WebKit2/ChangeLog b/Source/WebKit2/ChangeLog index 0b6e7b9..44ede1b 100644 --- a/Source/WebKit2/ChangeLog +++ b/Source/WebKit2/ChangeLog @@ -1,3 +1,26 @@ +2012-07-03 Carlos Garcia Campos + + [GTK] Add WebKitWebView::context-menu-dismissed signal to WebKit2 GTK+ API + https://bugs.webkit.org/show_bug.cgi?id=90386 + + Reviewed by Martin Robinson. + + * UIProcess/API/gtk/WebKitWebView.cpp: + (webkit_web_view_class_init): Add context-menu-dismissed signal. + (contextMenuDismissed): Emit context-menu-dismissed signal. + (webkitWebViewPopulateContextMenu): Connect to deactivate signal + of the GtkMenu and emit WebKitWebView::context-menu-dismissed when + the gtk menu is deactivated. + * UIProcess/API/gtk/WebKitWebView.h: + (_WebKitWebViewClass): Add virtual methos for + context-menu-dismissed signal. + * UIProcess/API/gtk/tests/TestContextMenu.cpp: + (testContextMenuDismissed): + (beforeAll): + * UIProcess/gtk/WebContextMenuProxyGtk.h: + (WebKit::WebContextMenuProxyGtk::gtkMenu): Get the GtkMenu built + for the context menu proxy. + 2012-07-03 Piotr Roguski [EFL][WK2] Added missing WebPageProxy::ViewIsFocused flag to WebPageProxy::viewStateDidChange() diff --git a/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp b/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp index 94a94ca..8bfabee 100644 --- a/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp +++ b/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp @@ -88,6 +88,7 @@ enum { RUN_FILE_CHOOSER, CONTEXT_MENU, + CONTEXT_MENU_DISMISSED, LAST_SIGNAL }; @@ -1043,6 +1044,22 @@ static void webkit_web_view_class_init(WebKitWebViewClass* webViewClass) WEBKIT_TYPE_CONTEXT_MENU, GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE, WEBKIT_TYPE_HIT_TEST_RESULT); + + /** + * WebKitWebView::context-menu-dismissed: + * @web_view: the #WebKitWebView on which the signal is emitted + * + * Emitted after #WebKitWebView::context-menu signal, if the context menu is shown, + * to notify that the context menu is dismissed. + */ + signals[CONTEXT_MENU_DISMISSED] = + g_signal_new("context-menu-dismissed", + G_TYPE_FROM_CLASS(webViewClass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET(WebKitWebViewClass, context_menu_dismissed), + 0, 0, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); } static bool updateReplaceContentStatus(WebKitWebView* webView, WebKitLoadEvent loadEvent) @@ -1338,6 +1355,11 @@ static void webkitWebViewCreateAndAppendInputMethodsMenuItem(WebKitWebView* webV webkit_context_menu_insert(contextMenu, menuItem, unicodeMenuItemPosition); } +static void contextMenuDismissed(GtkMenuShell*, WebKitWebView* webView) +{ + g_signal_emit(webView, signals[CONTEXT_MENU_DISMISSED], 0, NULL); +} + void webkitWebViewPopulateContextMenu(WebKitWebView* webView, WKArrayRef wkProposedMenu, WKHitTestResultRef wkHitTestResult) { WebKitWebViewBase* webViewBase = WEBKIT_WEB_VIEW_BASE(webView); @@ -1360,6 +1382,8 @@ void webkitWebViewPopulateContextMenu(WebKitWebView* webView, WKArrayRef wkPropo webkitContextMenuPopulate(contextMenu.get(), contextMenuItems); contextMenuProxy->populate(contextMenuItems); + g_signal_connect(contextMenuProxy->gtkMenu(), "deactivate", G_CALLBACK(contextMenuDismissed), webView); + // Clear the menu to make sure it's useless after signal emission. webkit_context_menu_remove_all(contextMenu.get()); } diff --git a/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.h b/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.h index 9328fa1..bac32a7 100644 --- a/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.h +++ b/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.h @@ -127,42 +127,43 @@ struct _WebKitWebView { struct _WebKitWebViewClass { WebKitWebViewBaseClass parent; - void (* load_changed) (WebKitWebView *web_view, - WebKitLoadEvent load_event); - gboolean (* load_failed) (WebKitWebView *web_view, - WebKitLoadEvent load_event, - const gchar *failing_uri, - GError *error); - - GtkWidget *(* create) (WebKitWebView *web_view); - void (* ready_to_show) (WebKitWebView *web_view); - void (* run_as_modal) (WebKitWebView *web_view); - void (* close) (WebKitWebView *web_view); - - gboolean (* script_dialog) (WebKitWebView *web_view, - WebKitScriptDialog *dialog); - - gboolean (* decide_policy) (WebKitWebView *web_view, - WebKitPolicyDecision *decision, - WebKitPolicyDecisionType type); - gboolean (* permission_request) (WebKitWebView *web_view, - WebKitPermissionRequest *permission_request); - void (* mouse_target_changed) (WebKitWebView *web_view, - WebKitHitTestResult *hit_test_result, - guint modifiers); - gboolean (* print_requested) (WebKitWebView *web_view, - WebKitPrintOperation *print_operation); - void (* resource_load_started) (WebKitWebView *web_view, - WebKitWebResource *resource, - WebKitURIRequest *request); - gboolean (* enter_fullscreen) (WebKitWebView *web_view); - gboolean (* leave_fullscreen) (WebKitWebView *web_view); - gboolean (* run_file_chooser) (WebKitWebView *web_view, - WebKitFileChooserRequest *request); - gboolean (* context_menu) (WebKitWebView *web_view, - WebKitContextMenu *context_menu, - GdkEvent *event, - WebKitHitTestResult *hit_test_result); + void (* load_changed) (WebKitWebView *web_view, + WebKitLoadEvent load_event); + gboolean (* load_failed) (WebKitWebView *web_view, + WebKitLoadEvent load_event, + const gchar *failing_uri, + GError *error); + + GtkWidget *(* create) (WebKitWebView *web_view); + void (* ready_to_show) (WebKitWebView *web_view); + void (* run_as_modal) (WebKitWebView *web_view); + void (* close) (WebKitWebView *web_view); + + gboolean (* script_dialog) (WebKitWebView *web_view, + WebKitScriptDialog *dialog); + + gboolean (* decide_policy) (WebKitWebView *web_view, + WebKitPolicyDecision *decision, + WebKitPolicyDecisionType type); + gboolean (* permission_request) (WebKitWebView *web_view, + WebKitPermissionRequest *permission_request); + void (* mouse_target_changed) (WebKitWebView *web_view, + WebKitHitTestResult *hit_test_result, + guint modifiers); + gboolean (* print_requested) (WebKitWebView *web_view, + WebKitPrintOperation *print_operation); + void (* resource_load_started) (WebKitWebView *web_view, + WebKitWebResource *resource, + WebKitURIRequest *request); + gboolean (* enter_fullscreen) (WebKitWebView *web_view); + gboolean (* leave_fullscreen) (WebKitWebView *web_view); + gboolean (* run_file_chooser) (WebKitWebView *web_view, + WebKitFileChooserRequest *request); + gboolean (* context_menu) (WebKitWebView *web_view, + WebKitContextMenu *context_menu, + GdkEvent *event, + WebKitHitTestResult *hit_test_result); + void (* context_menu_dismissed) (WebKitWebView *web_view); /* Padding for future expansion */ void (*_webkit_reserved0) (void); diff --git a/Source/WebKit2/UIProcess/API/gtk/tests/TestContextMenu.cpp b/Source/WebKit2/UIProcess/API/gtk/tests/TestContextMenu.cpp index f740160..8766857 100644 --- a/Source/WebKit2/UIProcess/API/gtk/tests/TestContextMenu.cpp +++ b/Source/WebKit2/UIProcess/API/gtk/tests/TestContextMenu.cpp @@ -49,11 +49,17 @@ public: return test->contextMenu(contextMenu, event, hitTestResult); } + static void contextMenuDismissedCallback(WebKitWebView*, ContextMenuTest* test) + { + test->contextMenuDismissed(); + } + ContextMenuTest() : m_menuPositionX(0) , m_menuPositionY(0) { g_signal_connect(m_webView, "context-menu", G_CALLBACK(contextMenuCallback), this); + g_signal_connect(m_webView, "context-menu-dismissed", G_CALLBACK(contextMenuDismissedCallback), this); } ~ContextMenuTest() @@ -63,6 +69,11 @@ public: virtual bool contextMenu(WebKitContextMenu*, GdkEvent*, WebKitHitTestResult*) = 0; + virtual void contextMenuDismissed() + { + quitMainLoop(); + } + bool shouldShowInputMethodsMenu() { GtkSettings* settings = gtk_widget_get_settings(GTK_WIDGET(m_webView)); @@ -183,6 +194,18 @@ public: showContextMenuAtPositionAndWaitUntilFinished(0, 0); } + static gboolean simulateEscKeyIdleCallback(ContextMenuTest* test) + { + test->keyStroke(GDK_KEY_Escape); + return FALSE; + } + + void dismissContextMenuAndWaitUntilFinished() + { + g_idle_add(reinterpret_cast(simulateEscKeyIdleCallback), this); + g_main_loop_run(m_mainLoop); + } + double m_menuPositionX; double m_menuPositionY; }; @@ -405,7 +428,6 @@ public: GtkMenuItem* item = getMenuItem(menu, m_itemToActivateLabel); gtk_menu_shell_activate_item(GTK_MENU_SHELL(menu), GTK_WIDGET(item), TRUE); m_itemToActivateLabel = 0; - quitMainLoop(); } static gboolean activateMenuItemIdleCallback(gpointer userData) @@ -657,6 +679,48 @@ static void testContextMenuSubMenu(ContextMenuSubmenuTest* test, gconstpointer) test->showContextMenuAndWaitUntilFinished(); } +class ContextMenuDismissedTest: public ContextMenuTest { +public: + MAKE_GLIB_TEST_FIXTURE(ContextMenuDismissedTest); + + ContextMenuDismissedTest() + : m_dismissed(false) + { + } + + bool contextMenu(WebKitContextMenu* contextMenu, GdkEvent*, WebKitHitTestResult*) + { + quitMainLoop(); + // Show the default context menu. + return false; + } + + void contextMenuDismissed() + { + m_dismissed = true; + ContextMenuTest::contextMenuDismissed(); + } + + void showContextMenuAndWaitUntilDismissed() + { + showContextMenuAndWaitUntilFinished(); + dismissContextMenuAndWaitUntilFinished(); + } + + bool m_dismissed; +}; + +static void testContextMenuDismissed(ContextMenuDismissedTest* test, gconstpointer) +{ + test->showInWindowAndWaitUntilMapped(); + + test->loadHtml("WebKitGTK+ Context menu tests", "file:///"); + test->waitUntilLoadFinished(); + + test->showContextMenuAndWaitUntilDismissed(); + g_assert(test->m_dismissed); +} + void beforeAll() { ContextMenuDefaultTest::add("WebKitWebView", "default-menu", testContextMenuDefaultMenu); @@ -664,6 +728,7 @@ void beforeAll() ContextMenuCustomFullTest::add("WebKitWebView", "custom-menu", testContextMenuCustomMenu); ContextMenuDisabledTest::add("WebKitWebView", "disable-menu", testContextMenuDisableMenu); ContextMenuSubmenuTest::add("WebKitWebView", "submenu", testContextMenuSubMenu); + ContextMenuDismissedTest::add("WebKitWebView", "menu-dismissed", testContextMenuDismissed); } void afterAll() diff --git a/Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.h b/Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.h index 8e18716..144655f 100644 --- a/Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.h +++ b/Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.h @@ -49,6 +49,7 @@ public: virtual void hideContextMenu(); void populate(Vector&); + GtkMenu* gtkMenu() const { return m_menu.platformDescription(); } private: WebContextMenuProxyGtk(GtkWidget*, WebPageProxy*); -- 2.7.4