Title: [111847] trunk/Source/WebKit/gtk
Revision
111847
Author
carlo...@webkit.org
Date
2012-03-23 04:14:13 -0700 (Fri, 23 Mar 2012)

Log Message

[GTK] Add a way to expose well known names for items in the default context menu
https://bugs.webkit.org/show_bug.cgi?id=67660

Reviewed by Martin Robinson.

Add WebKitContextMenuAction enum containing all possible context
menu item actions.

* GNUmakefile.am: Add new files to compilation.
* WebCoreSupport/ContextMenuClientGtk.cpp:
(WebKit::inputMethodsMenuItem): Use WebCore context menu classes
to create the context menu and its items to make sure all items
have a GtkAction associated.
(WebKit::insertControlCharacter):
(WebKit::unicodeMenuItem): Ditto.
* tests/testcontextmenu.c: Added.
(testInfoNew):
(testInfoDestroy):
(contextMenuFixtureSetup):
(contextMenuFixtureTeardown):
(checkAction):
(checkActionWithSubmenu):
(checkSeparator):
(contextMenuCallback):
(pushEvent):
(loadStatusCallback):
(mapEventCallback):
(testContextMenu):
(contextMenuCustomItemCallback):
(testContextMenuCustomItem):
(main):
* webkit/webkitglobals.cpp:
(webkit_context_menu_item_get_action): Return the
WebKitContextMenuAction for the given context menu item.
* webkit/webkitglobals.h:

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebKit/gtk/ChangeLog (111846 => 111847)


--- trunk/Source/WebKit/gtk/ChangeLog	2012-03-23 10:19:30 UTC (rev 111846)
+++ trunk/Source/WebKit/gtk/ChangeLog	2012-03-23 11:14:13 UTC (rev 111847)
@@ -1,5 +1,43 @@
 2012-03-23  Carlos Garcia Campos  <cgar...@igalia.com>
 
+        [GTK] Add a way to expose well known names for items in the default context menu
+        https://bugs.webkit.org/show_bug.cgi?id=67660
+
+        Reviewed by Martin Robinson.
+
+        Add WebKitContextMenuAction enum containing all possible context
+        menu item actions.
+
+        * GNUmakefile.am: Add new files to compilation.
+        * WebCoreSupport/ContextMenuClientGtk.cpp:
+        (WebKit::inputMethodsMenuItem): Use WebCore context menu classes
+        to create the context menu and its items to make sure all items
+        have a GtkAction associated.
+        (WebKit::insertControlCharacter):
+        (WebKit::unicodeMenuItem): Ditto.
+        * tests/testcontextmenu.c: Added.
+        (testInfoNew):
+        (testInfoDestroy):
+        (contextMenuFixtureSetup):
+        (contextMenuFixtureTeardown):
+        (checkAction):
+        (checkActionWithSubmenu):
+        (checkSeparator):
+        (contextMenuCallback):
+        (pushEvent):
+        (loadStatusCallback):
+        (mapEventCallback):
+        (testContextMenu):
+        (contextMenuCustomItemCallback):
+        (testContextMenuCustomItem):
+        (main):
+        * webkit/webkitglobals.cpp:
+        (webkit_context_menu_item_get_action): Return the
+        WebKitContextMenuAction for the given context menu item.
+        * webkit/webkitglobals.h:
+
+2012-03-23  Carlos Garcia Campos  <cgar...@igalia.com>
+
         Unreviewed. Rename a variable name in API documentation.
 
         Rename keyboard_mode to triggered_with_keyboard in

Modified: trunk/Source/WebKit/gtk/GNUmakefile.am (111846 => 111847)


--- trunk/Source/WebKit/gtk/GNUmakefile.am	2012-03-23 10:19:30 UTC (rev 111846)
+++ trunk/Source/WebKit/gtk/GNUmakefile.am	2012-03-23 11:14:13 UTC (rev 111847)
@@ -435,6 +435,7 @@
 
 noinst_PROGRAMS += \
 	Programs/unittests/testapplicationcache \
+	Programs/unittests/testcontextmenu \
 	Programs/unittests/testdomdocument \
 	Programs/unittests/testdomdomwindow \
 	Programs/unittests/testdomnode \
@@ -468,6 +469,11 @@
 Programs_unittests_testapplicationcache_LDADD = $(webkit_tests_ldadd)
 Programs_unittests_testapplicationcache_LDFLAGS = $(webkit_tests_ldflags)
 
+Programs_unittests_testcontextmenu_SOURCES = Source/WebKit/gtk/tests/testcontextmenu.c
+Programs_unittests_testcontextmenu_CFLAGS = $(webkit_tests_cflags)
+Programs_unittests_testcontextmenu_LDADD = $(webkit_tests_ldadd)
+Programs_unittests_testcontextmenu_LDFLAGS = $(webkit_tests_ldflags)
+
 Programs_unittests_testdomdocument_SOURCES = Source/WebKit/gtk/tests/testdomdocument.c
 Programs_unittests_testdomdocument_CFLAGS = $(webkit_tests_cflags)
 Programs_unittests_testdomdocument_LDADD = $(webkit_tests_ldadd)

Modified: trunk/Source/WebKit/gtk/WebCoreSupport/ContextMenuClientGtk.cpp (111846 => 111847)


--- trunk/Source/WebKit/gtk/WebCoreSupport/ContextMenuClientGtk.cpp	2012-03-23 10:19:30 UTC (rev 111846)
+++ trunk/Source/WebKit/gtk/WebCoreSupport/ContextMenuClientGtk.cpp	2012-03-23 11:14:13 UTC (rev 111847)
@@ -59,16 +59,14 @@
             return 0;
     }
 
-    GtkWidget* menuitem = gtk_image_menu_item_new_with_mnemonic(
-        _("Input _Methods"));
-
     WebKitWebViewPrivate* priv = webView->priv;
-    GtkWidget* imContextMenu = gtk_menu_new();
-    gtk_im_multicontext_append_menuitems(GTK_IM_MULTICONTEXT(priv->imContext.get()), GTK_MENU_SHELL(imContextMenu));
+    ContextMenu imContextMenu;
+    gtk_im_multicontext_append_menuitems(GTK_IM_MULTICONTEXT(priv->imContext.get()), GTK_MENU_SHELL(imContextMenu.platformDescription()));
 
-    gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), imContextMenu);
+    ContextMenuItem menuItem(ActionType, ContextMenuItemTagInputMethods, contextMenuItemTagInputMethods(), &imContextMenu);
+    imContextMenu.releasePlatformDescription();
 
-    return menuitem;
+    return GTK_WIDGET(menuItem.releasePlatformDescription());
 }
 
 static int getUnicodeMenuItemPosition(GtkMenu* menu)

Modified: trunk/Source/WebKit/gtk/docs/webkitgtk-sections.txt (111846 => 111847)


--- trunk/Source/WebKit/gtk/docs/webkitgtk-sections.txt	2012-03-23 10:19:30 UTC (rev 111846)
+++ trunk/Source/WebKit/gtk/docs/webkitgtk-sections.txt	2012-03-23 11:14:13 UTC (rev 111847)
@@ -530,6 +530,9 @@
 WebKitCacheModel
 webkit_get_cache_model
 webkit_set_cache_model
+<SUBSECTION ContextMenuItem>
+WebKitContextMenuAction
+webkit_context_menu_item_get_action
 <SUBSECTION Private>
 WEBKITGTK_API_VERSION
 </SECTION>

Added: trunk/Source/WebKit/gtk/tests/testcontextmenu.c (0 => 111847)


--- trunk/Source/WebKit/gtk/tests/testcontextmenu.c	                        (rev 0)
+++ trunk/Source/WebKit/gtk/tests/testcontextmenu.c	2012-03-23 11:14:13 UTC (rev 111847)
@@ -0,0 +1,324 @@
+/*
+ * Copyright (C) 2012 Igalia S.L.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2,1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include <webkit/webkit.h>
+
+#if GTK_CHECK_VERSION(2, 14, 0)
+
+typedef struct {
+    char *data;
+    guint flag;
+} TestInfo;
+
+static GMainLoop *loop;
+
+typedef struct {
+    WebKitWebView *webView;
+    TestInfo *info;
+} ContextMenuFixture;
+
+static TestInfo *testInfoNew(const char *data, guint flag)
+{
+    TestInfo *info = g_slice_new(TestInfo);
+    info->data = ""
+    info->flag = flag;
+
+    return info;
+}
+
+static void testInfoDestroy(TestInfo *info)
+{
+    g_free(info->data);
+    g_slice_free(TestInfo, info);
+}
+
+static void contextMenuFixtureSetup(ContextMenuFixture *fixture, gconstpointer data)
+{
+    fixture->webView = WEBKIT_WEB_VIEW(webkit_web_view_new());
+    loop = g_main_loop_new(NULL, TRUE);
+    fixture->info = (TestInfo *)data;
+}
+
+static void contextMenuFixtureTeardown(ContextMenuFixture *fixture, gconstpointer data)
+{
+    g_object_unref(fixture->webView);
+    g_main_loop_unref(loop);
+    testInfoDestroy(fixture->info);
+}
+
+static GList *checkAction(GList *iter, WebKitContextMenuAction action)
+{
+    GtkMenuItem *item = (GtkMenuItem *)iter->data;
+
+    g_assert(GTK_IS_MENU_ITEM(item));
+    g_assert(webkit_context_menu_item_get_action(item) == action);
+
+    return iter->next;
+}
+
+static GList *checkActionWithSubmenu(GList *iter, WebKitContextMenuAction action)
+{
+    GtkMenuItem *item = (GtkMenuItem *)iter->data;
+
+    g_assert(GTK_IS_MENU_ITEM(item));
+    g_assert(webkit_context_menu_item_get_action(item) == action);
+    g_assert(GTK_IS_MENU(gtk_menu_item_get_submenu(item)));
+
+    return iter->next;
+}
+
+static GList *checkSeparator(GList *iter)
+{
+    GtkMenuItem *item = (GtkMenuItem *)iter->data;
+
+    g_assert(GTK_IS_SEPARATOR_MENU_ITEM(item));
+
+    return iter->next;
+}
+
+static gboolean contextMenuCallback(WebKitWebView *webView, GtkWidget *defaultMenu, WebKitHitTestResult *hitTestResult, gboolean keyboardMode, gpointer userData)
+{
+    TestInfo *info = (TestInfo *)userData;
+    guint context;
+    GList *items;
+    GList *iter;
+
+    /* Check signal parameters */
+    g_assert(WEBKIT_IS_WEB_VIEW(webView));
+    g_assert(GTK_IS_MENU(defaultMenu));
+    g_assert(WEBKIT_IS_HIT_TEST_RESULT(hitTestResult));
+    g_assert(!keyboardMode);
+
+    g_object_get(hitTestResult, "context", &context, NULL);
+    g_assert(context & info->flag);
+
+    items = gtk_container_get_children(GTK_CONTAINER(defaultMenu));
+    switch (info->flag) {
+    case WEBKIT_HIT_TEST_RESULT_CONTEXT_DOCUMENT:
+        iter = items;
+        iter = checkAction(iter, WEBKIT_CONTEXT_MENU_ACTION_GO_BACK);
+        iter = checkAction(iter, WEBKIT_CONTEXT_MENU_ACTION_GO_FORWARD);
+        iter = checkAction(iter, WEBKIT_CONTEXT_MENU_ACTION_STOP);
+        iter = checkAction(iter, WEBKIT_CONTEXT_MENU_ACTION_RELOAD);
+        g_assert(!iter);
+
+        break;
+    case WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE:
+        iter = items;
+        iter = checkAction(iter, WEBKIT_CONTEXT_MENU_ACTION_OPEN_IMAGE_IN_NEW_WINDOW);
+        iter = checkAction(iter, WEBKIT_CONTEXT_MENU_ACTION_DOWNLOAD_IMAGE_TO_DISK);
+        iter = checkAction(iter, WEBKIT_CONTEXT_MENU_ACTION_COPY_IMAGE_TO_CLIPBOARD);
+        iter = checkAction(iter, WEBKIT_CONTEXT_MENU_ACTION_COPY_IMAGE_URL_TO_CLIPBOARD);
+        g_assert(!iter);
+
+        break;
+    case WEBKIT_HIT_TEST_RESULT_CONTEXT_EDITABLE:
+        iter = items;
+        iter = checkAction(iter, WEBKIT_CONTEXT_MENU_ACTION_CUT);
+        iter = checkAction(iter, WEBKIT_CONTEXT_MENU_ACTION_COPY);
+        iter = checkAction(iter, WEBKIT_CONTEXT_MENU_ACTION_PASTE);
+        iter = checkAction(iter, WEBKIT_CONTEXT_MENU_ACTION_DELETE);
+        iter = checkSeparator(iter);
+        iter = checkAction(iter, WEBKIT_CONTEXT_MENU_ACTION_SELECT_ALL);
+        iter = checkSeparator(iter);
+        iter = checkActionWithSubmenu(iter, WEBKIT_CONTEXT_MENU_ACTION_INPUT_METHODS);
+        iter = checkActionWithSubmenu(iter, WEBKIT_CONTEXT_MENU_ACTION_UNICODE);
+        g_assert(!iter);
+
+        break;
+    case WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK:
+        iter = items;
+        iter = checkAction(iter, WEBKIT_CONTEXT_MENU_ACTION_OPEN_LINK);
+        iter = checkAction(iter, WEBKIT_CONTEXT_MENU_ACTION_OPEN_LINK_IN_NEW_WINDOW);
+        iter = checkAction(iter, WEBKIT_CONTEXT_MENU_ACTION_DOWNLOAD_LINK_TO_DISK);
+        iter = checkAction(iter, WEBKIT_CONTEXT_MENU_ACTION_COPY_LINK_TO_CLIPBOARD);
+        g_assert(!iter);
+
+        break;
+    default:
+        g_assert_not_reached();
+    }
+
+    g_list_free(items);
+    g_main_loop_quit(loop);
+
+    return TRUE;
+}
+
+static void pushEvent(WebKitWebView *webView)
+{
+    GdkEvent *event = gdk_event_new(GDK_BUTTON_PRESS);
+#if GTK_CHECK_VERSION(3, 0, 0)
+    GdkDeviceManager *deviceManager;
+#endif
+
+    event->any.window = g_object_ref(gtk_widget_get_window(GTK_WIDGET(webView)));
+    event->any.send_event = FALSE;
+    event->button.time = GDK_CURRENT_TIME;
+    event->button.button = 3;
+    event->button.x = event->button.y = 5;
+    event->button.x_root = event->button.x;
+    event->button.y_root = event->button.y;
+#if GTK_CHECK_VERSION(3, 0, 0)
+    deviceManager = gdk_display_get_device_manager(gdk_display_get_default());
+    event->button.device = gdk_device_manager_get_client_pointer(deviceManager);
+#endif
+
+    gdk_event_put(event);
+    gdk_event_free(event);
+}
+
+static void loadStatusCallback(WebKitWebView *webView, GParamSpec *spec, gpointer data)
+{
+    WebKitLoadStatus status = webkit_web_view_get_load_status(webView);
+    TestInfo *info = (TestInfo *)data;
+
+    g_assert(status != WEBKIT_LOAD_FAILED);
+
+    if (status != WEBKIT_LOAD_FINISHED)
+        return;
+
+    g_signal_connect(webView, "context-menu", G_CALLBACK(contextMenuCallback), info);
+    pushEvent(webView);
+}
+
+static gboolean mapEventCallback(GtkWidget *widget, GdkEvent *event, gpointer data)
+{
+    gtk_widget_grab_focus(widget);
+    ContextMenuFixture *fixture = (ContextMenuFixture *)data;
+    webkit_web_view_load_string(fixture->webView,
+                                fixture->info->data,
+                                "text/html",
+                                "utf-8",
+                                "file://");
+    g_signal_connect(fixture->webView, "notify::load-status", G_CALLBACK(loadStatusCallback), fixture->info);
+    return FALSE;
+}
+
+static void testContextMenu(ContextMenuFixture *fixture, gconstpointer data)
+{
+    GtkAllocation allocation = { 0, 0, 50, 50 };
+    GtkWidget *window = gtk_window_new(GTK_WINDOW_POPUP);
+
+    gtk_window_resize(GTK_WINDOW(window), 50, 50);
+    gtk_window_move(GTK_WINDOW(window), 0, 0);
+    gtk_widget_size_allocate(GTK_WIDGET(fixture->webView), &allocation);
+    gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(fixture->webView));
+    g_signal_connect(window, "map-event", G_CALLBACK(mapEventCallback), fixture);
+    gtk_widget_show_all(window);
+
+    g_main_loop_run(loop);
+}
+
+static gboolean contextMenuCustomItemCallback(WebKitWebView *webView, GtkWidget *defaultMenu, WebKitHitTestResult *hitTestResult, gboolean keyboardMode, gpointer userData)
+{
+    TestInfo *info = (TestInfo *)userData;
+    guint context;
+    GList *items;
+    GList *iter;
+    GtkWidget *menuItem;
+    GtkAction *action;
+
+    /* Check signal parameters */
+    g_assert(WEBKIT_IS_WEB_VIEW(webView));
+    g_assert(GTK_IS_MENU(defaultMenu));
+    g_assert(WEBKIT_IS_HIT_TEST_RESULT(hitTestResult));
+    g_assert(!keyboardMode);
+
+    g_object_get(hitTestResult, "context", &context, NULL);
+    g_assert(context & info->flag);
+
+    action = "" "Custom Action", "Custom Action Tooltip", NULL);
+    menuItem = gtk_action_create_menu_item(action);
+    g_object_unref(action);
+
+    gtk_menu_shell_append(GTK_MENU_SHELL(defaultMenu), menuItem);
+    gtk_widget_show(menuItem);
+
+    items = gtk_container_get_children(GTK_CONTAINER(defaultMenu));
+    iter = items;
+    iter = checkAction(iter, WEBKIT_CONTEXT_MENU_ACTION_GO_BACK);
+    iter = checkAction(iter, WEBKIT_CONTEXT_MENU_ACTION_GO_FORWARD);
+    iter = checkAction(iter, WEBKIT_CONTEXT_MENU_ACTION_STOP);
+    iter = checkAction(iter, WEBKIT_CONTEXT_MENU_ACTION_RELOAD);
+    iter = checkAction(iter, WEBKIT_CONTEXT_MENU_ACTION_NO_ACTION);
+    g_assert(!iter);
+
+    g_list_free(items);
+    g_main_loop_quit(loop);
+
+    return TRUE;
+}
+
+static void testContextMenuCustomItem(ContextMenuFixture *fixture, gconstpointer data)
+{
+    GtkWidget *window = gtk_window_new(GTK_WINDOW_POPUP);
+    gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(fixture->webView));
+    gtk_widget_show_all(window);
+    gtk_widget_grab_focus(GTK_WIDGET(fixture->webView));
+
+    webkit_web_view_load_string(fixture->webView,
+                                fixture->info->data,
+                                "text/html",
+                                "utf-8",
+                                "file://");
+    g_signal_connect(fixture->webView, "context-menu", G_CALLBACK(contextMenuCustomItemCallback), fixture->info);
+    pushEvent(fixture->webView);
+}
+
+int main(int argc, char **argv)
+{
+    gtk_test_init(&argc, &argv, NULL);
+
+    g_test_bug_base("https://bugs.webkit.org/");
+
+    g_test_add("/webkit/testcontextmenu/document", ContextMenuFixture,
+               testInfoNew("<html><body><h1>WebKitGTK+!</h1></body></html>",
+                           WEBKIT_HIT_TEST_RESULT_CONTEXT_DOCUMENT),
+               contextMenuFixtureSetup, testContextMenu, contextMenuFixtureTeardown);
+    /* We hardcode all elements to be at 0,0 so that we know where to generate the button events */
+    g_test_add("/webkit/testcontextmenu/image", ContextMenuFixture,
+               testInfoNew("<html><body><img style='position:absolute; left:0; top:0' src='' width=50 height=50></img></body></html>",
+                           WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE),
+               contextMenuFixtureSetup, testContextMenu, contextMenuFixtureTeardown);
+    g_test_add("/webkit/testcontextmenu/editable", ContextMenuFixture,
+               testInfoNew("<html><body><input style='position:absolute; left:0; top:0' size='35'></input>></body></html>",
+                           WEBKIT_HIT_TEST_RESULT_CONTEXT_EDITABLE),
+               contextMenuFixtureSetup, testContextMenu, contextMenuFixtureTeardown);
+    g_test_add("/webkit/testcontextmenu/link", ContextMenuFixture,
+               testInfoNew("<html><body><a style='position:absolute; left:0; top:0' href=''>HELLO WORLD</a></body></html>",
+                           WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK),
+               contextMenuFixtureSetup, testContextMenu, contextMenuFixtureTeardown);
+    g_test_add("/webkit/testcontextmenu/customitem", ContextMenuFixture,
+               testInfoNew("<html><body><h1>WebKitGTK+!</h1></body></html>",
+                           WEBKIT_HIT_TEST_RESULT_CONTEXT_DOCUMENT),
+               contextMenuFixtureSetup, testContextMenuCustomItem, contextMenuFixtureTeardown);
+
+    return g_test_run();
+}
+
+#else
+
+int main(int argc, char **argv)
+{
+    g_critical("You will need at least GTK+ 2.14.0 to run the unit tests.");
+    return 0;
+}
+
+#endif

Modified: trunk/Source/WebKit/gtk/webkit/webkitglobals.cpp (111846 => 111847)


--- trunk/Source/WebKit/gtk/webkit/webkitglobals.cpp	2012-03-23 10:19:30 UTC (rev 111846)
+++ trunk/Source/WebKit/gtk/webkit/webkitglobals.cpp	2012-03-23 11:14:13 UTC (rev 111847)
@@ -23,6 +23,7 @@
 
 #include "ApplicationCacheStorage.h"
 #include "Chrome.h"
+#include "ContextMenuItem.h"
 #include "FrameNetworkingContextGtk.h"
 #include "GtkUtilities.h"
 #include "IconDatabase.h"
@@ -326,6 +327,165 @@
     textChecker = checker ? WEBKIT_SPELL_CHECKER(checker) : 0;
 }
 
+/**
+ * webkit_context_menu_item_get_action:
+ * @item: a #GtkMenuItem of the default context menu
+ *
+ * Returns the #WebKitContextMenuAction of the given @item. This function
+ * can be used to determine the items present in the default context menu.
+ * In order to inspect the default context menu, you should connect to
+ * #WebKitWebView::context-menu signal.
+ *
+ * <example>
+ * <title>Inspecting the default context menu</title>
+ * <programlisting>
+ * static gboolean context_menu_cb (WebKitWebView       *webView,
+ *                                  GtkWidget           *default_menu,
+ *                                  WebKitHitTestResult *hit_test_result,
+ *                                  gboolean             triggered_with_keyboard,
+ *                                  gpointer             user_data)
+ * {
+ *     GList *items = gtk_container_get_children (GTK_CONTAINER (default_menu));
+ *     GList *l;
+ *     GtkAction *action;
+ *     GtkWidget *sub_menu;
+ *
+ *     for (l = items; l; l = g_list_next (l)) {
+ *         GtkMenuItem *item = (GtkMenuItem *)l->data;
+ *
+ *         if (GTK_IS_SEPARATOR_MENU_ITEM (item)) {
+ *             /&ast; It's  separator, do nothing &ast;/
+ *             continue;
+ *         }
+ *
+ *         switch (webkit_context_menu_item_get_action (item)) {
+ *         case WEBKIT_CONTEXT_MENU_ACTION_NO_ACTION:
+ *             /&ast; No action for this item &ast;/
+ *             break;
+ *         /&ast; Don't allow to ope links from context menu &ast;/
+ *         case WEBKIT_CONTEXT_MENU_ACTION_OPEN_LINK:
+ *         case WEBKIT_CONTEXT_MENU_ACTION_OPEN_LINK_IN_NEW_WINDOW:
+ *             action = "" (GTK_ACTIVATABLE (item));
+ *             gtk_action_set_sensitive (action, FALSE);
+ *             break;
+ *         default:
+ *             break;
+ *         }
+ *
+ *         sub_menu = gtk_menu_item_get_submenu (item);
+ *         if (sub_menu) {
+ *             GtkWidget *menu_item;
+ *
+ *             /&ast; Add custom action to submenu &ast;/
+ *             action = "" ("CustomItemName", "Custom Action", NULL, NULL);
+ *             g_signal_connect (action, "activate", G_CALLBACK (custom_menu_item_activated), NULL);
+ *
+ *             menu_item = gtk_action_create_menu_item (action);
+ *             g_object_unref (action);
+ *             gtk_menu_shell_append (GTK_MENU_SHELL (sub_menu), menu_item);
+ *             gtk_widget_show (menu_item);
+ *         }
+ *     }
+ *
+ *     g_list_free(items);
+ * }
+ * </programlisting>
+ * </example>
+ *
+ * Note that you can get the #GtkAction of any item in the default context menu with
+ * gtk_activatable_get_related_action().
+ *
+ * Returns: the #WebKitContextMenuAction of the given @item
+ *
+ * Since: 1.10
+ */
+WebKitContextMenuAction webkit_context_menu_item_get_action(GtkMenuItem* item)
+{
+    g_return_val_if_fail(GTK_IS_MENU_ITEM(item), WEBKIT_CONTEXT_MENU_ACTION_NO_ACTION);
+
+    ContextMenuItem menuItem(item);
+    switch (menuItem.action()) {
+    case ContextMenuItemTagNoAction:
+        return WEBKIT_CONTEXT_MENU_ACTION_NO_ACTION;
+    case ContextMenuItemTagOpenLink:
+        return WEBKIT_CONTEXT_MENU_ACTION_OPEN_LINK;
+    case ContextMenuItemTagOpenLinkInNewWindow:
+        return WEBKIT_CONTEXT_MENU_ACTION_OPEN_LINK_IN_NEW_WINDOW;
+    case ContextMenuItemTagDownloadLinkToDisk:
+        return WEBKIT_CONTEXT_MENU_ACTION_DOWNLOAD_LINK_TO_DISK;
+    case ContextMenuItemTagCopyLinkToClipboard:
+        return WEBKIT_CONTEXT_MENU_ACTION_COPY_LINK_TO_CLIPBOARD;
+    case ContextMenuItemTagOpenImageInNewWindow:
+        return WEBKIT_CONTEXT_MENU_ACTION_OPEN_IMAGE_IN_NEW_WINDOW;
+    case ContextMenuItemTagDownloadImageToDisk:
+        return WEBKIT_CONTEXT_MENU_ACTION_DOWNLOAD_IMAGE_TO_DISK;
+    case ContextMenuItemTagCopyImageToClipboard:
+        return WEBKIT_CONTEXT_MENU_ACTION_COPY_IMAGE_TO_CLIPBOARD;
+    case ContextMenuItemTagCopyImageUrlToClipboard:
+        return WEBKIT_CONTEXT_MENU_ACTION_COPY_IMAGE_URL_TO_CLIPBOARD;
+    case ContextMenuItemTagOpenFrameInNewWindow:
+        return WEBKIT_CONTEXT_MENU_ACTION_OPEN_FRAME_IN_NEW_WINDOW;
+    case ContextMenuItemTagGoBack:
+        return WEBKIT_CONTEXT_MENU_ACTION_GO_BACK;
+    case ContextMenuItemTagGoForward:
+        return WEBKIT_CONTEXT_MENU_ACTION_GO_FORWARD;
+    case ContextMenuItemTagStop:
+        return WEBKIT_CONTEXT_MENU_ACTION_STOP;
+    case ContextMenuItemTagReload:
+        return WEBKIT_CONTEXT_MENU_ACTION_RELOAD;
+    case ContextMenuItemTagCopy:
+        return WEBKIT_CONTEXT_MENU_ACTION_COPY;
+    case ContextMenuItemTagCut:
+        return WEBKIT_CONTEXT_MENU_ACTION_CUT;
+    case ContextMenuItemTagPaste:
+        return WEBKIT_CONTEXT_MENU_ACTION_PASTE;
+    case ContextMenuItemTagDelete:
+        return WEBKIT_CONTEXT_MENU_ACTION_DELETE;
+    case ContextMenuItemTagSelectAll:
+        return WEBKIT_CONTEXT_MENU_ACTION_SELECT_ALL;
+    case ContextMenuItemTagInputMethods:
+        return WEBKIT_CONTEXT_MENU_ACTION_INPUT_METHODS;
+    case ContextMenuItemTagUnicode:
+        return WEBKIT_CONTEXT_MENU_ACTION_UNICODE;
+    case ContextMenuItemTagSpellingGuess:
+        return WEBKIT_CONTEXT_MENU_ACTION_SPELLING_GUESS;
+    case ContextMenuItemTagIgnoreSpelling:
+        return WEBKIT_CONTEXT_MENU_ACTION_IGNORE_SPELLING;
+    case ContextMenuItemTagLearnSpelling:
+        return WEBKIT_CONTEXT_MENU_ACTION_LEARN_SPELLING;
+    case ContextMenuItemTagIgnoreGrammar:
+        return WEBKIT_CONTEXT_MENU_ACTION_IGNORE_GRAMMAR;
+    case ContextMenuItemTagFontMenu:
+        return WEBKIT_CONTEXT_MENU_ACTION_FONT_MENU;
+    case ContextMenuItemTagBold:
+        return WEBKIT_CONTEXT_MENU_ACTION_BOLD;
+    case ContextMenuItemTagItalic:
+        return WEBKIT_CONTEXT_MENU_ACTION_ITALIC;
+    case ContextMenuItemTagUnderline:
+        return WEBKIT_CONTEXT_MENU_ACTION_UNDERLINE;
+    case ContextMenuItemTagOutline:
+        return WEBKIT_CONTEXT_MENU_ACTION_OUTLINE;
+    case ContextMenuItemTagInspectElement:
+        return WEBKIT_CONTEXT_MENU_ACTION_INSPECT_ELEMENT;
+    case ContextMenuItemTagOpenMediaInNewWindow:
+        return WEBKIT_CONTEXT_MENU_ACTION_OPEN_MEDIA_IN_NEW_WINDOW;
+    case ContextMenuItemTagCopyMediaLinkToClipboard:
+        return WEBKIT_CONTEXT_MENU_ACTION_COPY_MEDIA_LINK_TO_CLIPBOARD;
+    case ContextMenuItemTagToggleMediaControls:
+        return WEBKIT_CONTEXT_MENU_ACTION_TOGGLE_MEDIA_CONTROLS;
+    case ContextMenuItemTagToggleMediaLoop:
+        return WEBKIT_CONTEXT_MENU_ACTION_TOGGLE_MEDIA_LOOP;
+    case ContextMenuItemTagEnterVideoFullscreen:
+        return WEBKIT_CONTEXT_MENU_ACTION_ENTER_VIDEO_FULLSCREEN;
+    case ContextMenuItemTagMediaPlayPause:
+        return WEBKIT_CONTEXT_MENU_ACTION_MEDIA_PLAY_PAUSE;
+    case ContextMenuItemTagMediaMute:
+        return WEBKIT_CONTEXT_MENU_ACTION_MEDIA_MUTE;
+    default:
+        g_assert_not_reached();
+    }
+}
+
 void webkitInit()
 {
     static bool isInitialized = false;

Modified: trunk/Source/WebKit/gtk/webkit/webkitglobals.h (111846 => 111847)


--- trunk/Source/WebKit/gtk/webkit/webkitglobals.h	2012-03-23 10:19:30 UTC (rev 111846)
+++ trunk/Source/WebKit/gtk/webkit/webkitglobals.h	2012-03-23 11:14:13 UTC (rev 111847)
@@ -25,6 +25,7 @@
 
 #include "webkitdefines.h"
 #include <glib.h>
+#include <gtk/gtk.h>
 #include <libsoup/soup.h>
 
 G_BEGIN_DECLS
@@ -53,6 +54,94 @@
     WEBKIT_CACHE_MODEL_DOCUMENT_BROWSER,
 } WebKitCacheModel;
 
+/**
+ * WebKitContextMenuAction:
+ * @WEBKIT_CONTEXT_MENU_ACTION_NO_ACTION: No action, used by separator menu items.
+ * @WEBKIT_CONTEXT_MENU_ACTION_OPEN_LINK: Open current link.
+ * @WEBKIT_CONTEXT_MENU_ACTION_OPEN_LINK_IN_NEW_WINDOW: Open current link in a new window.
+ * @WEBKIT_CONTEXT_MENU_ACTION_DOWNLOAD_LINK_TO_DISK: Download link destination.
+ * @WEBKIT_CONTEXT_MENU_ACTION_COPY_LINK_TO_CLIPBOARD: Copy link location to the clipboard.
+ * @WEBKIT_CONTEXT_MENU_ACTION_OPEN_IMAGE_IN_NEW_WINDOW: Open current image in a new window.
+ * @WEBKIT_CONTEXT_MENU_ACTION_DOWNLOAD_IMAGE_TO_DISK: Download current image.
+ * @WEBKIT_CONTEXT_MENU_ACTION_COPY_IMAGE_TO_CLIPBOARD: Copy current image to the clipboard.
+ * @WEBKIT_CONTEXT_MENU_ACTION_COPY_IMAGE_URL_TO_CLIPBOARD: Copy curent image location to the clipboard.
+ * @WEBKIT_CONTEXT_MENU_ACTION_OPEN_FRAME_IN_NEW_WINDOW: Open current frame in a new window.
+ * @WEBKIT_CONTEXT_MENU_ACTION_GO_BACK: Load the previous history item.
+ * @WEBKIT_CONTEXT_MENU_ACTION_GO_FORWARD: Load the next history item.
+ * @WEBKIT_CONTEXT_MENU_ACTION_STOP: Stop any ongoing loading operation.
+ * @WEBKIT_CONTEXT_MENU_ACTION_RELOAD: Reload the conents of current view.
+ * @WEBKIT_CONTEXT_MENU_ACTION_COPY: Copy current selection the clipboard.
+ * @WEBKIT_CONTEXT_MENU_ACTION_CUT: Cut current selection to the clipboard.
+ * @WEBKIT_CONTEXT_MENU_ACTION_PASTE: Paste clipboard contents.
+ * @WEBKIT_CONTEXT_MENU_ACTION_DELETE: Delete current selection.
+ * @WEBKIT_CONTEXT_MENU_ACTION_SELECT_ALL: Select all text.
+ * @WEBKIT_CONTEXT_MENU_ACTION_INPUT_METHODS: Input methods menu.
+ * @WEBKIT_CONTEXT_MENU_ACTION_UNICODE: Unicode menu.
+ * @WEBKIT_CONTEXT_MENU_ACTION_SPELLING_GUESS: Guess spelling.
+ * @WEBKIT_CONTEXT_MENU_ACTION_NO_GUESSES_FOUND: No guesses found.
+ * @WEBKIT_CONTEXT_MENU_ACTION_IGNORE_SPELLING: Ignore spelling.
+ * @WEBKIT_CONTEXT_MENU_ACTION_LEARN_SPELLING: Learn spelling.
+ * @WEBKIT_CONTEXT_MENU_ACTION_IGNORE_GRAMMAR: Ignore grammar.
+ * @WEBKIT_CONTEXT_MENU_ACTION_FONT_MENU: Font menu.
+ * @WEBKIT_CONTEXT_MENU_ACTION_BOLD: Bold.
+ * @WEBKIT_CONTEXT_MENU_ACTION_ITALIC: Italic.
+ * @WEBKIT_CONTEXT_MENU_ACTION_UNDERLINE: Underline.
+ * @WEBKIT_CONTEXT_MENU_ACTION_OUTLINE: Outline.
+ * @WEBKIT_CONTEXT_MENU_ACTION_INSPECT_ELEMENT: Open current element in the inspector.
+ * @WEBKIT_CONTEXT_MENU_ACTION_OPEN_MEDIA_IN_NEW_WINDOW: Open current media element in a new window.
+ * @WEBKIT_CONTEXT_MENU_ACTION_COPY_MEDIA_LINK_TO_CLIPBOARD: Copy media link location in to the clipboard.
+ * @WEBKIT_CONTEXT_MENU_ACTION_TOGGLE_MEDIA_CONTROLS: Enable or disable media controls.
+ * @WEBKIT_CONTEXT_MENU_ACTION_TOGGLE_MEDIA_LOOP: Enable or disable media loop.
+ * @WEBKIT_CONTEXT_MENU_ACTION_ENTER_VIDEO_FULLSCREEN: Show current video element in fullscreen mode.
+ * @WEBKIT_CONTEXT_MENU_ACTION_MEDIA_PLAY_PAUSE: Play or pause current media element.
+ * @WEBKIT_CONTEXT_MENU_ACTION_MEDIA_MUTE: Mute current media element.
+ *
+ * Enum values used to denote actions of items in the default context menu.
+ *
+ * Since: 1.10
+ */
+typedef enum {
+    WEBKIT_CONTEXT_MENU_ACTION_NO_ACTION = 0,
+    WEBKIT_CONTEXT_MENU_ACTION_OPEN_LINK,
+    WEBKIT_CONTEXT_MENU_ACTION_OPEN_LINK_IN_NEW_WINDOW,
+    WEBKIT_CONTEXT_MENU_ACTION_DOWNLOAD_LINK_TO_DISK,
+    WEBKIT_CONTEXT_MENU_ACTION_COPY_LINK_TO_CLIPBOARD,
+    WEBKIT_CONTEXT_MENU_ACTION_OPEN_IMAGE_IN_NEW_WINDOW,
+    WEBKIT_CONTEXT_MENU_ACTION_DOWNLOAD_IMAGE_TO_DISK,
+    WEBKIT_CONTEXT_MENU_ACTION_COPY_IMAGE_TO_CLIPBOARD,
+    WEBKIT_CONTEXT_MENU_ACTION_COPY_IMAGE_URL_TO_CLIPBOARD,
+    WEBKIT_CONTEXT_MENU_ACTION_OPEN_FRAME_IN_NEW_WINDOW,
+    WEBKIT_CONTEXT_MENU_ACTION_GO_BACK,
+    WEBKIT_CONTEXT_MENU_ACTION_GO_FORWARD,
+    WEBKIT_CONTEXT_MENU_ACTION_STOP,
+    WEBKIT_CONTEXT_MENU_ACTION_RELOAD,
+    WEBKIT_CONTEXT_MENU_ACTION_COPY,
+    WEBKIT_CONTEXT_MENU_ACTION_CUT,
+    WEBKIT_CONTEXT_MENU_ACTION_PASTE,
+    WEBKIT_CONTEXT_MENU_ACTION_DELETE,
+    WEBKIT_CONTEXT_MENU_ACTION_SELECT_ALL,
+    WEBKIT_CONTEXT_MENU_ACTION_INPUT_METHODS,
+    WEBKIT_CONTEXT_MENU_ACTION_UNICODE,
+    WEBKIT_CONTEXT_MENU_ACTION_SPELLING_GUESS,
+    WEBKIT_CONTEXT_MENU_ACTION_NO_GUESSES_FOUND,
+    WEBKIT_CONTEXT_MENU_ACTION_IGNORE_SPELLING,
+    WEBKIT_CONTEXT_MENU_ACTION_LEARN_SPELLING,
+    WEBKIT_CONTEXT_MENU_ACTION_IGNORE_GRAMMAR,
+    WEBKIT_CONTEXT_MENU_ACTION_FONT_MENU,
+    WEBKIT_CONTEXT_MENU_ACTION_BOLD,
+    WEBKIT_CONTEXT_MENU_ACTION_ITALIC,
+    WEBKIT_CONTEXT_MENU_ACTION_UNDERLINE,
+    WEBKIT_CONTEXT_MENU_ACTION_OUTLINE,
+    WEBKIT_CONTEXT_MENU_ACTION_INSPECT_ELEMENT,
+    WEBKIT_CONTEXT_MENU_ACTION_OPEN_MEDIA_IN_NEW_WINDOW,
+    WEBKIT_CONTEXT_MENU_ACTION_COPY_MEDIA_LINK_TO_CLIPBOARD,
+    WEBKIT_CONTEXT_MENU_ACTION_TOGGLE_MEDIA_CONTROLS,
+    WEBKIT_CONTEXT_MENU_ACTION_TOGGLE_MEDIA_LOOP,
+    WEBKIT_CONTEXT_MENU_ACTION_ENTER_VIDEO_FULLSCREEN,
+    WEBKIT_CONTEXT_MENU_ACTION_MEDIA_PLAY_PAUSE,
+    WEBKIT_CONTEXT_MENU_ACTION_MEDIA_MUTE
+} WebKitContextMenuAction;
+
 WEBKIT_API SoupSession*
 webkit_get_default_session                      (void);
 
@@ -79,6 +168,9 @@
 WEBKIT_API void
 webkit_set_text_checker                        (GObject*  checker);
 
+WEBKIT_API WebKitContextMenuAction
+webkit_context_menu_item_get_action            (GtkMenuItem* item);
+
 G_END_DECLS
 
 #endif
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to