[GTK] Add WebKitWebView::context-menu-dismissed signal to WebKit2 GTK+ API
authorcarlosgc@webkit.org <carlosgc@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 3 Jul 2012 15:43:42 +0000 (15:43 +0000)
committercarlosgc@webkit.org <carlosgc@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 3 Jul 2012 15:43:42 +0000 (15:43 +0000)
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
Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp
Source/WebKit2/UIProcess/API/gtk/WebKitWebView.h
Source/WebKit2/UIProcess/API/gtk/tests/TestContextMenu.cpp
Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.h

index 0b6e7b9..44ede1b 100644 (file)
@@ -1,3 +1,26 @@
+2012-07-03  Carlos Garcia Campos  <cgarcia@igalia.com>
+
+        [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  <p.roguski@samsung.com>
 
         [EFL][WK2] Added missing WebPageProxy::ViewIsFocused flag to WebPageProxy::viewStateDidChange()
index 94a94ca..8bfabee 100644 (file)
@@ -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());
 }
index 9328fa1..bac32a7 100644 (file)
@@ -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);
index f740160..8766857 100644 (file)
@@ -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<GSourceFunc>(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("<html><body>WebKitGTK+ Context menu tests</body></html>", "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()
index 8e18716..144655f 100644 (file)
@@ -49,6 +49,7 @@ public:
     virtual void hideContextMenu();
 
     void populate(Vector<WebCore::ContextMenuItem>&);
+    GtkMenu* gtkMenu() const { return m_menu.platformDescription(); }
 
 private:
     WebContextMenuProxyGtk(GtkWidget*, WebPageProxy*);