Diff
Modified: trunk/Source/WebCore/ChangeLog (88633 => 88634)
--- trunk/Source/WebCore/ChangeLog 2011-06-13 09:03:15 UTC (rev 88633)
+++ trunk/Source/WebCore/ChangeLog 2011-06-13 09:35:30 UTC (rev 88634)
@@ -1,3 +1,36 @@
+2011-06-13 Carlos Garcia Campos <[email protected]>
+
+ Reviewed by Martin Robinson.
+
+ [GTK] Add context menu support for Webkit2
+ https://bugs.webkit.org/show_bug.cgi?id=54827
+
+ * platform/ContextMenuItem.h: Add gtkAction().
+ * platform/gtk/ContextMenuGtk.cpp:
+ (WebCore::ContextMenu::ContextMenu): Implement constructor that
+ receives a platform menu.
+ (WebCore::ContextMenu::setPlatformDescription): Make sure we don't
+ destroy the menu if the new context menu is the current one.
+ (WebCore::contextMenuItemVector): Implement this method to return
+ the list of menu items in the given context menu, required by WebKit2.
+ (WebCore::platformMenuDescription): Implement this method to
+ return a platform menu for the given menu items.
+ * platform/gtk/ContextMenuItemGtk.cpp:
+ (WebCore::createPlatformMenuItemDescription): Helper function to
+ create a platform context menu item.
+ (WebCore::ContextMenuItem::ContextMenuItem): Use
+ createPlatformMenuItemDescription().
+ (WebCore::ContextMenuItem::title): Convert the title from UTF-8.
+ (WebCore::ContextMenuItem::setTitle): Use gtkAction().
+ (WebCore::ContextMenuItem::setSubMenu): Implement setSubMenu()
+ that receives a list of items.
+ (WebCore::ContextMenuItem::setChecked): Use gtkAction().
+ (WebCore::ContextMenuItem::checked): Implement this, required by WebKit2.
+ (WebCore::ContextMenuItem::enabled): Ditto.
+ (WebCore::ContextMenuItem::setEnabled): Use gtkAction().
+ (WebCore::ContextMenuItem::gtkAction): Return the GtkAction
+ associated to the context menu item.
+
2011-06-13 Keishi Hattori <[email protected]>
Sort WebCore.xcodeproj
Modified: trunk/Source/WebCore/platform/ContextMenuItem.h (88633 => 88634)
--- trunk/Source/WebCore/platform/ContextMenuItem.h 2011-06-13 09:03:15 UTC (rev 88633)
+++ trunk/Source/WebCore/platform/ContextMenuItem.h 2011-06-13 09:35:30 UTC (rev 88634)
@@ -43,6 +43,7 @@
typedef struct tagMENUITEMINFOW MENUITEMINFO;
#elif PLATFORM(GTK)
typedef struct _GtkMenuItem GtkMenuItem;
+typedef struct _GtkAction GtkAction;
#elif PLATFORM(QT)
#include <QAction>
#elif PLATFORM(WX)
@@ -248,6 +249,10 @@
void setSubMenu(ContextMenu*);
+#if PLATFORM(GTK)
+ GtkAction* gtkAction() const;
+#endif
+
#if USE(CROSS_PLATFORM_CONTEXT_MENUS)
#if PLATFORM(WIN)
typedef MENUITEMINFO NativeItem;
Modified: trunk/Source/WebCore/platform/gtk/ContextMenuGtk.cpp (88633 => 88634)
--- trunk/Source/WebCore/platform/gtk/ContextMenuGtk.cpp 2011-06-13 09:03:15 UTC (rev 88633)
+++ trunk/Source/WebCore/platform/gtk/ContextMenuGtk.cpp 2011-06-13 09:35:30 UTC (rev 88634)
@@ -20,7 +20,7 @@
#include "config.h"
#include "ContextMenu.h"
-#include "NotImplemented.h"
+#include "GOwnPtr.h"
#include <gtk/gtk.h>
namespace WebCore {
@@ -30,6 +30,11 @@
m_platformDescription = GTK_MENU(gtk_menu_new());
}
+ContextMenu::ContextMenu(const PlatformMenuDescription menu)
+ : m_platformDescription(menu)
+{
+}
+
ContextMenu::~ContextMenu()
{
if (m_platformDescription)
@@ -49,6 +54,8 @@
void ContextMenu::setPlatformDescription(PlatformMenuDescription menu)
{
ASSERT(menu);
+ if (m_platformDescription == menu)
+ return;
if (m_platformDescription)
gtk_widget_destroy(GTK_WIDGET(m_platformDescription));
@@ -68,12 +75,33 @@
return description;
}
-Vector<ContextMenuItem> contextMenuItemVector(const PlatformMenuDescription)
+Vector<ContextMenuItem> contextMenuItemVector(const PlatformMenuDescription menu)
{
- notImplemented();
+ Vector<ContextMenuItem> menuItemVector;
- Vector<ContextMenuItem> menuItemVector;
+ GOwnPtr<GList> children(gtk_container_get_children(GTK_CONTAINER(menu)));
+ int itemCount = g_list_length(children.get());
+ menuItemVector.reserveCapacity(itemCount);
+
+ for (GList* item = children.get(); item; item = g_list_next(item)) {
+ GtkWidget* widget = static_cast<GtkWidget*>(item->data);
+ if (!GTK_IS_MENU_ITEM(widget))
+ continue;
+ menuItemVector.append(ContextMenuItem(GTK_MENU_ITEM(widget)));
+ }
+
return menuItemVector;
}
+PlatformMenuDescription platformMenuDescription(Vector<ContextMenuItem>& subMenuItems)
+{
+ GtkMenu* menu = GTK_MENU(gtk_menu_new());
+ for (size_t i = 0; i < subMenuItems.size(); i++) {
+ GtkWidget* platformItem = GTK_WIDGET(subMenuItems[i].releasePlatformDescription());
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), platformItem);
+ gtk_widget_show(platformItem);
+ }
+ return menu;
}
+
+}
Modified: trunk/Source/WebCore/platform/gtk/ContextMenuItemGtk.cpp (88633 => 88634)
--- trunk/Source/WebCore/platform/gtk/ContextMenuItemGtk.cpp 2011-06-13 09:03:15 UTC (rev 88633)
+++ trunk/Source/WebCore/platform/gtk/ContextMenuItemGtk.cpp 2011-06-13 09:35:30 UTC (rev 88634)
@@ -24,7 +24,7 @@
#include "ContextMenu.h"
#include "GOwnPtr.h"
-#include "NotImplemented.h"
+#include "GRefPtr.h"
#include <gtk/gtk.h>
#include <wtf/text/CString.h>
@@ -117,51 +117,56 @@
}
}
+static PlatformMenuItemDescription createPlatformMenuItemDescription(ContextMenuItemType type, ContextMenuAction action, const String& title, bool enabled, bool checked)
+{
+ if (type == SeparatorType)
+ return GTK_MENU_ITEM(gtk_separator_menu_item_new());
+
+ GOwnPtr<char> actionName(g_strdup_printf("context-menu-action-%d", action));
+ GRefPtr<GtkAction> platformAction;
+
+ if (type == CheckableActionType) {
+ platformAction = adoptGRef(GTK_ACTION(gtk_toggle_action_new(actionName.get(), title.utf8().data(), 0, gtkStockIDFromContextMenuAction(action))));
+ gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(platformAction.get()), checked);
+ } else
+ platformAction = adoptGRef(gtk_action_new(actionName.get(), title.utf8().data(), 0, gtkStockIDFromContextMenuAction(action)));
+ gtk_action_set_sensitive(platformAction.get(), enabled);
+
+ GtkMenuItem* item = GTK_MENU_ITEM(gtk_action_create_menu_item(platformAction.get()));
+ g_object_set_data(G_OBJECT(item), WEBKIT_CONTEXT_MENU_ACTION, GINT_TO_POINTER(action));
+
+ return item;
+}
+
// Extract the ActionType from the menu item
ContextMenuItem::ContextMenuItem(PlatformMenuItemDescription item)
: m_platformDescription(item)
{
}
-ContextMenuItem::ContextMenuItem(ContextMenu*)
+ContextMenuItem::ContextMenuItem(ContextMenu* subMenu)
{
- notImplemented();
+ m_platformDescription = GTK_MENU_ITEM(gtk_menu_item_new());
+ if (subMenu)
+ setSubMenu(subMenu);
}
ContextMenuItem::ContextMenuItem(ContextMenuItemType type, ContextMenuAction action, const String& title, ContextMenu* subMenu)
{
- if (type == SeparatorType) {
- m_platformDescription = GTK_MENU_ITEM(gtk_separator_menu_item_new());
- return;
- }
-
- GOwnPtr<char> actionName(g_strdup_printf("context-menu-action-%d", action));
- GtkAction* platformAction = 0;
-
- if (type == CheckableActionType)
- platformAction = GTK_ACTION(gtk_toggle_action_new(actionName.get(), title.utf8().data(), 0, gtkStockIDFromContextMenuAction(action)));
- else
- platformAction = gtk_action_new(actionName.get(), title.utf8().data(), 0, gtkStockIDFromContextMenuAction(action));
-
- m_platformDescription = GTK_MENU_ITEM(gtk_action_create_menu_item(platformAction));
- g_object_unref(platformAction);
-
- g_object_set_data(G_OBJECT(m_platformDescription), WEBKIT_CONTEXT_MENU_ACTION, GINT_TO_POINTER(action));
-
+ m_platformDescription = createPlatformMenuItemDescription(type, action, title, true, false);
if (subMenu)
setSubMenu(subMenu);
}
-ContextMenuItem::ContextMenuItem(ContextMenuItemType, ContextMenuAction, const String&, bool, bool)
+ContextMenuItem::ContextMenuItem(ContextMenuItemType type, ContextMenuAction action, const String& title, bool enabled, bool checked)
{
- // FIXME: Implement with WebKit2 ContextMenu changes.
- notImplemented();
+ m_platformDescription = createPlatformMenuItemDescription(type, action, title, enabled, checked);
}
-ContextMenuItem::ContextMenuItem(ContextMenuAction, const String&, bool, bool, Vector<ContextMenuItem>&)
+ContextMenuItem::ContextMenuItem(ContextMenuAction action, const String& title, bool enabled, bool checked, Vector<ContextMenuItem>& subMenuItems)
{
- // FIXME: Implement with WebKit2 ContextMenu changes.
- notImplemented();
+ m_platformDescription = createPlatformMenuItemDescription(SubmenuType, action, title, enabled, checked);
+ setSubMenu(subMenuItems);
}
ContextMenuItem::~ContextMenuItem()
@@ -204,13 +209,13 @@
String ContextMenuItem::title() const
{
- GtkAction* action = ""
- return action ? String(gtk_action_get_label(action)) : String();
+ GtkAction* action = ""
+ return action ? String::fromUTF8(gtk_action_get_label(action)) : String();
}
void ContextMenuItem::setTitle(const String& title)
{
- GtkAction* action = ""
+ GtkAction* action = ""
if (action)
gtk_action_set_label(action, title.utf8().data());
}
@@ -223,35 +228,46 @@
void ContextMenuItem::setSubMenu(ContextMenu* menu)
{
- gtk_menu_item_set_submenu(m_platformDescription, GTK_WIDGET(menu->platformDescription()));
+ gtk_menu_item_set_submenu(m_platformDescription, GTK_WIDGET(menu->releasePlatformDescription()));
}
+void ContextMenuItem::setSubMenu(Vector<ContextMenuItem>& subMenuItems)
+{
+ ContextMenu menu(platformMenuDescription(subMenuItems));
+ setSubMenu(&menu);
+}
+
void ContextMenuItem::setChecked(bool shouldCheck)
{
- GtkAction* action = ""
+ GtkAction* action = ""
if (action && GTK_IS_TOGGLE_ACTION(action))
gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), shouldCheck);
}
bool ContextMenuItem::checked() const
{
- // FIXME: Implement with WebKit2 ContextMenu changes.
- notImplemented();
+ GtkAction* action = ""
+ if (action && GTK_IS_TOGGLE_ACTION(action))
+ return gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(action));
return false;
}
bool ContextMenuItem::enabled() const
{
- // FIXME: Implement with WebKit2 ContextMenu changes.
- notImplemented();
- return false;
+ GtkAction* action = ""
+ return action ? gtk_action_get_sensitive(action) : false;
}
void ContextMenuItem::setEnabled(bool shouldEnable)
{
- GtkAction* action = ""
+ GtkAction* action = ""
if (action)
gtk_action_set_sensitive(action, shouldEnable);
}
+GtkAction* ContextMenuItem::gtkAction() const
+{
+ return gtk_activatable_get_related_action(GTK_ACTIVATABLE(m_platformDescription));
}
+
+}
Modified: trunk/Source/WebKit2/ChangeLog (88633 => 88634)
--- trunk/Source/WebKit2/ChangeLog 2011-06-13 09:03:15 UTC (rev 88633)
+++ trunk/Source/WebKit2/ChangeLog 2011-06-13 09:35:30 UTC (rev 88634)
@@ -2,6 +2,34 @@
Reviewed by Martin Robinson.
+ [GTK] Add context menu support for Webkit2
+ https://bugs.webkit.org/show_bug.cgi?id=54827
+
+ * GNUmakefile.am: Add new files to compilation.
+ * UIProcess/API/gtk/PageClientImpl.cpp:
+ (WebKit::PageClientImpl::createContextMenuProxy): Create a context
+ menu proxy.
+ * UIProcess/API/gtk/WebKitWebViewBase.cpp:
+ (globalPointForClientPoint): Function copied from webkit1 to
+ convert a point in widget coordinates to global coordinates.
+ (popupMenuPositionFunction):
+ (webkitWebViewBaseShowContextMenu): Show the given context menu at
+ the given position.
+ * UIProcess/API/gtk/WebKitWebViewBasePrivate.h:
+ * UIProcess/gtk/WebContextMenuProxyGtk.cpp: Added.
+ (WebKit::contextMenuItemActivatedCallback):
+ (WebKit::WebContextMenuProxyGtk::createGtkMenu):
+ (WebKit::WebContextMenuProxyGtk::showContextMenu):
+ (WebKit::WebContextMenuProxyGtk::hideContextMenu):
+ (WebKit::WebContextMenuProxyGtk::WebContextMenuProxyGtk):
+ (WebKit::WebContextMenuProxyGtk::~WebContextMenuProxyGtk):
+ * UIProcess/gtk/WebContextMenuProxyGtk.h: Copied from Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBasePrivate.h.
+ (WebKit::WebContextMenuProxyGtk::create):
+
+2011-06-13 Carlos Garcia Campos <[email protected]>
+
+ Reviewed by Martin Robinson.
+
[GTK] Export an API similar to WebKit1
https://bugs.webkit.org/show_bug.cgi?id=57820
Modified: trunk/Source/WebKit2/GNUmakefile.am (88633 => 88634)
--- trunk/Source/WebKit2/GNUmakefile.am 2011-06-13 09:03:15 UTC (rev 88633)
+++ trunk/Source/WebKit2/GNUmakefile.am 2011-06-13 09:35:30 UTC (rev 88634)
@@ -394,6 +394,8 @@
Source/WebKit2/UIProcess/gtk/BackingStoreGtk.cpp \
Source/WebKit2/UIProcess/gtk/TextCheckerGtk.cpp \
Source/WebKit2/UIProcess/gtk/WebContextGtk.cpp \
+ Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.cpp \
+ Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.h \
Source/WebKit2/UIProcess/gtk/WebFullScreenManagerProxyGtk.cpp \
Source/WebKit2/UIProcess/gtk/WebInspectorGtk.cpp \
Source/WebKit2/UIProcess/gtk/WebPageProxyGtk.cpp \
Modified: trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.cpp (88633 => 88634)
--- trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.cpp 2011-06-13 09:03:15 UTC (rev 88633)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.cpp 2011-06-13 09:35:30 UTC (rev 88634)
@@ -33,7 +33,7 @@
#include "NativeWebMouseEvent.h"
#include "NotImplemented.h"
#include "WebContext.h"
-#include "WebContextMenuProxy.h"
+#include "WebContextMenuProxyGtk.h"
#include "WebEventFactory.h"
#include "WebKitWebViewBasePrivate.h"
#include "WebPageProxy.h"
@@ -210,10 +210,9 @@
return WebPopupMenuProxyGtk::create(m_viewWidget, page);
}
-PassRefPtr<WebContextMenuProxy> PageClientImpl::createContextMenuProxy(WebPageProxy*)
+PassRefPtr<WebContextMenuProxy> PageClientImpl::createContextMenuProxy(WebPageProxy* page)
{
- notImplemented();
- return 0;
+ return WebContextMenuProxyGtk::create(m_viewWidget, page);
}
void PageClientImpl::setFindIndicator(PassRefPtr<FindIndicator>, bool fadeOut)
Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp (88633 => 88634)
--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp 2011-06-13 09:03:15 UTC (rev 88633)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp 2011-06-13 09:35:30 UTC (rev 88634)
@@ -56,6 +56,7 @@
GtkIMContext* imContext;
GtkClickCounter clickCounter;
CString tooltipText;
+ IntPoint lastPopupPosition;
};
G_DEFINE_TYPE(WebKitWebViewBase, webkit_web_view_base, GTK_TYPE_CONTAINER)
@@ -378,3 +379,42 @@
notImplemented();
#endif
}
+
+static IntPoint globalPointForClientPoint(GdkWindow* window, const IntPoint& clientPoint)
+{
+ int x, y;
+ gdk_window_get_origin(window, &x, &y);
+ return clientPoint + IntSize(x, y);
+}
+
+static void popupMenuPositionFunction(GtkMenu* menu, gint* x, gint* y, gboolean* pushIn, gpointer userData)
+{
+ WebKitWebViewBase* view = WEBKIT_WEB_VIEW_BASE(userData);
+ WebKitWebViewBasePrivate* priv = view->priv;
+ GdkScreen* screen = gtk_widget_get_screen(GTK_WIDGET(view));
+ GtkRequisition menuSize;
+
+#ifdef GTK_API_VERSION_2
+ gtk_widget_size_request(GTK_WIDGET(menu), &menuSize);
+#else
+ gtk_widget_get_preferred_size(GTK_WIDGET(menu), &menuSize, 0);
+#endif
+
+ *x = priv->lastPopupPosition.x();
+ if ((*x + menuSize.width) >= gdk_screen_get_width(screen))
+ *x -= menuSize.width;
+
+ *y = priv->lastPopupPosition.y();
+ if ((*y + menuSize.height) >= gdk_screen_get_height(screen))
+ *y -= menuSize.height;
+
+ *pushIn = FALSE;
+}
+
+void webkitWebViewBaseShowContextMenu(WebKitWebViewBase* webViewBase, GtkMenu* menu, const IntPoint& position)
+{
+ webViewBase->priv->lastPopupPosition = globalPointForClientPoint(gtk_widget_get_window(GTK_WIDGET(webViewBase)), position);
+
+ // Display menu initiated by right click (mouse button pressed = 3).
+ gtk_menu_popup(menu, 0, 0, &popupMenuPositionFunction, webViewBase, 3, gtk_get_current_event_time());
+}
Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBasePrivate.h (88633 => 88634)
--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBasePrivate.h 2011-06-13 09:03:15 UTC (rev 88633)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBasePrivate.h 2011-06-13 09:35:30 UTC (rev 88634)
@@ -46,6 +46,8 @@
void webkitWebViewBaseSetTooltipText(WebKitWebViewBase*, const char*);
+void webkitWebViewBaseShowContextMenu(WebKitWebViewBase*, GtkMenu*, const WebCore::IntPoint&);
+
G_END_DECLS
#endif // WebKitWebViewBasePrivate_h
Added: trunk/Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.cpp (0 => 88634)
--- trunk/Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.cpp (rev 0)
+++ trunk/Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.cpp 2011-06-13 09:35:30 UTC (rev 88634)
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2011 Igalia S.L.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "WebContextMenuProxyGtk.h"
+
+#include "IntPoint.h"
+#include "WebContextMenuItemData.h"
+#include "WebKitWebViewBasePrivate.h"
+#include "WebPageProxy.h"
+#include <WebCore/ContextMenu.h>
+#include <gtk/gtk.h>
+#include <wtf/text/CString.h>
+
+
+static const char* gContextMenuActionId = "webkit-context-menu-action";
+
+using namespace WebCore;
+
+namespace WebKit {
+
+static void contextMenuItemActivatedCallback(GtkAction* action, WebPageProxy* page)
+{
+ gboolean isToggle = GTK_IS_TOGGLE_ACTION(action);
+ WebKit::WebContextMenuItemData item(isToggle ? WebCore::CheckableActionType : WebCore::ActionType,
+ static_cast<WebCore::ContextMenuAction>(GPOINTER_TO_INT(g_object_get_data(G_OBJECT(action), gContextMenuActionId))),
+ gtk_action_get_label(action), gtk_action_get_sensitive(action),
+ isToggle ? gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(action)) : false);
+ page->contextMenuItemSelected(item);
+}
+
+GtkMenu* WebContextMenuProxyGtk::createGtkMenu(const Vector<WebContextMenuItemData>& items)
+{
+ ContextMenu menu;
+ for (size_t i = 0; i < items.size(); i++) {
+ const WebContextMenuItemData& item = items.at(i);
+ ContextMenuItem menuItem(item.type(), item.action(), item.title(), item.enabled(), item.checked());
+ GtkAction* action = ""
+
+ if (action) {
+ g_object_set_data(G_OBJECT(action), gContextMenuActionId, GINT_TO_POINTER(item.action()));
+ g_signal_connect(action, "activate", G_CALLBACK(contextMenuItemActivatedCallback), m_page);
+ }
+
+ if (item.type() == WebCore::SubmenuType) {
+ ContextMenu subMenu(createGtkMenu(item.submenu()));
+ menuItem.setSubMenu(&subMenu);
+ }
+ menu.appendItem(menuItem);
+ }
+ return menu.releasePlatformDescription();
+}
+
+void WebContextMenuProxyGtk::showContextMenu(const WebCore::IntPoint& position, const Vector<WebContextMenuItemData>& items)
+{
+ if (items.isEmpty())
+ return;
+
+ webkitWebViewBaseShowContextMenu(WEBKIT_WEB_VIEW_BASE(m_webView), createGtkMenu(items), position);
+}
+
+void WebContextMenuProxyGtk::hideContextMenu()
+{
+}
+
+WebContextMenuProxyGtk::WebContextMenuProxyGtk(GtkWidget* webView, WebPageProxy* page)
+ : m_webView(webView)
+ , m_page(page)
+{
+}
+
+WebContextMenuProxyGtk::~WebContextMenuProxyGtk()
+{
+}
+
+} // namespace WebKit
Copied: trunk/Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.h (from rev 88633, trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBasePrivate.h) (0 => 88634)
--- trunk/Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.h (rev 0)
+++ trunk/Source/WebKit2/UIProcess/gtk/WebContextMenuProxyGtk.h 2011-06-13 09:35:30 UTC (rev 88634)
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2011 Igalia S.L.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef WebContextMenuProxyGtk_h
+#define WebContextMenuProxyGtk_h
+
+#include "WebContextMenuProxy.h"
+
+namespace WebKit {
+
+class WebContextMenuItemData;
+class WebPageProxy;
+
+class WebContextMenuProxyGtk : public WebContextMenuProxy {
+public:
+ static PassRefPtr<WebContextMenuProxyGtk> create(GtkWidget* webView, WebPageProxy* page)
+ {
+ return adoptRef(new WebContextMenuProxyGtk(webView, page));
+ }
+ ~WebContextMenuProxyGtk();
+
+ virtual void showContextMenu(const WebCore::IntPoint&, const Vector<WebContextMenuItemData>&);
+ virtual void hideContextMenu();
+
+private:
+ WebContextMenuProxyGtk(GtkWidget*, WebPageProxy*);
+ GtkMenu* createGtkMenu(const Vector<WebContextMenuItemData>&);
+
+ GtkWidget* m_webView;
+ WebPageProxy* m_page;
+};
+
+
+} // namespace WebKit
+
+#endif // WebContextMenuProxyGtk_h