Diff
Modified: trunk/Source/WebKit2/ChangeLog (178891 => 178892)
--- trunk/Source/WebKit2/ChangeLog 2015-01-22 08:05:45 UTC (rev 178891)
+++ trunk/Source/WebKit2/ChangeLog 2015-01-22 08:30:39 UTC (rev 178892)
@@ -1,3 +1,39 @@
+2014-11-06 Carlos Garcia Campos <cgar...@igalia.com>
+
+ [GTK] Use API::ContextMenuClient and API::InjectedBundle::PageContextMenuClient classes
+ https://bugs.webkit.org/show_bug.cgi?id=138467
+
+ Reviewed by Gustavo Noronha Silva.
+
+ * UIProcess/API/gtk/WebKitContextMenu.cpp:
+ (webkitContextMenuPopulate): Add a version that receives a Vector<WebContextMenuItemData>&.
+ (webkitContextMenuCreate): Change it to receive a const
+ Vector<WebContextMenuItemData>& instead of a API::Array* and also
+ add a another version that receives const Vector<ContextMenuItem>&.
+ * UIProcess/API/gtk/WebKitContextMenuClient.cpp:
+ (attachContextMenuClientToView): Use a class derived from
+ API::ContextMenuClient to implement the context menu client.
+ (getContextMenuFromProposedMenu): Deleted.
+ * UIProcess/API/gtk/WebKitContextMenuItem.cpp:
+ (webkitContextMenuItemCreate): Change it to receive a const
+ WebContextMenuItemData& and added another version that receives a
+ const ContextMenuItem&.
+ * UIProcess/API/gtk/WebKitContextMenuItemPrivate.h:
+ * UIProcess/API/gtk/WebKitContextMenuPrivate.h:
+ * UIProcess/API/gtk/WebKitWebView.cpp:
+ (webkitWebViewPopulateContextMenu): Remove the creation of a
+ WebHitTestResult::Data, since it receives it now as parameter.
+ * UIProcess/API/gtk/WebKitWebViewPrivate.h:
+ * WebProcess/InjectedBundle/API/gtk/WebKitWebHitTestResult.cpp:
+ (webkitWebHitTestResultCreate): Change it to receive a const
+ HitTestResult& instead of const InjectedBundleHitTestResult&.
+ * WebProcess/InjectedBundle/API/gtk/WebKitWebHitTestResultPrivate.h:
+ * WebProcess/InjectedBundle/API/gtk/WebKitWebPage.cpp:
+ (webkitWebPageCreate): Use a class derived from
+ API::InjectedBundle::PageContextMenuClient to implement the
+ context menu client.
+ (getContextMenuFromDefaultMenu): Deleted.
+
2015-01-22 Carlos Garcia Campos <cgar...@igalia.com>
Unreviewed. Try to fix Debug build after r178889.
Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenu.cpp (178891 => 178892)
--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenu.cpp 2015-01-22 08:05:45 UTC (rev 178891)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenu.cpp 2015-01-22 08:30:39 UTC (rev 178892)
@@ -76,18 +76,34 @@
}
}
-WebKitContextMenu* webkitContextMenuCreate(API::Array* items)
+void webkitContextMenuPopulate(WebKitContextMenu* menu, Vector<WebContextMenuItemData>& contextMenuItems)
{
+ for (GList* item = menu->priv->items; item; item = g_list_next(item)) {
+ WebKitContextMenuItem* menuItem = WEBKIT_CONTEXT_MENU_ITEM(item->data);
+ contextMenuItems.append(WebContextMenuItemData(ContextMenuItem(webkitContextMenuItemRelease(menuItem))));
+ }
+}
+
+WebKitContextMenu* webkitContextMenuCreate(const Vector<WebContextMenuItemData>& items)
+{
WebKitContextMenu* menu = webkit_context_menu_new();
- for (size_t i = 0; i < items->size(); ++i) {
- WebContextMenuItem* item = static_cast<WebContextMenuItem*>(items->at(i));
+ for (const auto& item : items)
webkit_context_menu_prepend(menu, webkitContextMenuItemCreate(item));
- }
menu->priv->items = g_list_reverse(menu->priv->items);
return menu;
}
+WebKitContextMenu* webkitContextMenuCreate(const Vector<ContextMenuItem>& items)
+{
+ WebKitContextMenu* menu = webkit_context_menu_new();
+ for (const auto& item : items)
+ webkit_context_menu_prepend(menu, webkitContextMenuItemCreate(item));
+ menu->priv->items = g_list_reverse(menu->priv->items);
+
+ return menu;
+}
+
void webkitContextMenuSetParentItem(WebKitContextMenu* menu, WebKitContextMenuItem* item)
{
menu->priv->parentItem = item;
Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuClient.cpp (178891 => 178892)
--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuClient.cpp 2015-01-22 08:05:45 UTC (rev 178891)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuClient.cpp 2015-01-22 08:30:39 UTC (rev 178892)
@@ -20,38 +20,38 @@
#include "config.h"
#include "WebKitContextMenuClient.h"
-#include "WebKitPrivate.h"
+#include "APIContextMenuClient.h"
#include "WebKitWebViewBasePrivate.h"
#include "WebKitWebViewPrivate.h"
using namespace WebKit;
-static void getContextMenuFromProposedMenu(WKPageRef, WKArrayRef proposedMenu, WKArrayRef*, WKHitTestResultRef hitTestResult, WKTypeRef userData, const void* clientInfo)
-{
- GRefPtr<GVariant> variant;
- if (userData) {
- ASSERT(WKGetTypeID(userData) == WKStringGetTypeID());
- CString userDataString = toImpl(static_cast<WKStringRef>(userData))->string().utf8();
- variant = adoptGRef(g_variant_parse(nullptr, userDataString.data(), userDataString.data() + userDataString.length(), nullptr, nullptr));
+class ContextMenuClient final: public API::ContextMenuClient {
+public:
+ explicit ContextMenuClient(WebKitWebView* webView)
+ : m_webView(webView)
+ {
}
- webkitWebViewPopulateContextMenu(WEBKIT_WEB_VIEW(clientInfo), toImpl(proposedMenu), toImpl(hitTestResult), variant.get());
-}
+private:
+ bool getContextMenuFromProposedMenu(WebPageProxy&, const Vector<WebContextMenuItemData>& proposedMenu, Vector<WebContextMenuItemData>&, const WebHitTestResult::Data& hitTestResultData, API::Object* userData) override
+ {
+ GRefPtr<GVariant> variant;
+ if (userData) {
+ ASSERT(userData->type() == API::Object::Type::String);
+ CString userDataString = static_cast<API::String*>(userData)->string().utf8();
+ variant = adoptGRef(g_variant_parse(nullptr, userDataString.data(), userDataString.data() + userDataString.length(), nullptr, nullptr));
+ }
+ webkitWebViewPopulateContextMenu(m_webView, proposedMenu, hitTestResultData, variant.get());
+ return true;
+ }
+
+ WebKitWebView* m_webView;
+};
+
void attachContextMenuClientToView(WebKitWebView* webView)
{
- WKPageContextMenuClientV3 wkContextMenuClient = {
- {
- 3, // version
- webView, // clientInfo
- },
- 0, // getContextMenuFromProposedMenu_deprecatedForUseWithV0
- 0, // customContextMenuItemSelected
- 0, // contextMenuDismissed
- getContextMenuFromProposedMenu,
- 0, // showContextMenu
- 0, // hideContextMenu
- };
- WKPageRef wkPage = toAPI(webkitWebViewBaseGetPage(WEBKIT_WEB_VIEW_BASE(webView)));
- WKPageSetPageContextMenuClient(wkPage, &wkContextMenuClient.base);
+ WebPageProxy* page = webkitWebViewBaseGetPage(WEBKIT_WEB_VIEW_BASE(webView));
+ page->setContextMenuClient(std::make_unique<ContextMenuClient>(webView));
}
Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuItem.cpp (178891 => 178892)
--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuItem.cpp 2015-01-22 08:05:45 UTC (rev 178891)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuItem.cpp 2015-01-22 08:30:39 UTC (rev 178892)
@@ -90,24 +90,31 @@
webkitContextMenuSetParentItem(subMenu.get(), item);
}
-WebKitContextMenuItem* webkitContextMenuItemCreate(WebContextMenuItem* webItem)
+WebKitContextMenuItem* webkitContextMenuItemCreate(const WebContextMenuItemData& itemData)
{
WebKitContextMenuItem* item = WEBKIT_CONTEXT_MENU_ITEM(g_object_new(WEBKIT_TYPE_CONTEXT_MENU_ITEM, NULL));
- WebContextMenuItemData* itemData = webItem->data();
- item->priv->menuItem = std::make_unique<ContextMenuItem>(itemData->type(), itemData->action(), itemData->title(), itemData->enabled(), itemData->checked());
- const Vector<WebContextMenuItemData>& subMenu = itemData->submenu();
- if (!subMenu.size())
- return item;
- Vector<RefPtr<API::Object>> subMenuItems;
- subMenuItems.reserveInitialCapacity(subMenu.size());
- for (size_t i = 0; i < subMenu.size(); ++i)
- subMenuItems.uncheckedAppend(WebContextMenuItem::create(subMenu[i]).get());
- webkitContextMenuItemSetSubMenu(item, adoptGRef(webkitContextMenuCreate(API::Array::create(WTF::move(subMenuItems)).get())));
+ item->priv->menuItem = std::make_unique<ContextMenuItem>(itemData.type(), itemData.action(), itemData.title(), itemData.enabled(), itemData.checked());
+ const Vector<WebContextMenuItemData>& subMenu = itemData.submenu();
+ if (!subMenu.isEmpty())
+ webkitContextMenuItemSetSubMenu(item, adoptGRef(webkitContextMenuCreate(subMenu)));
return item;
}
+WebKitContextMenuItem* webkitContextMenuItemCreate(const ContextMenuItem& coreItem)
+{
+ WebKitContextMenuItem* item = WEBKIT_CONTEXT_MENU_ITEM(g_object_new(WEBKIT_TYPE_CONTEXT_MENU_ITEM, NULL));
+
+ item->priv->menuItem = std::make_unique<ContextMenuItem>(coreItem.type(), coreItem.action(), coreItem.title(), coreItem.enabled(), coreItem.checked());
+ if (coreItem.type() == WebCore::SubmenuType) {
+ Vector<ContextMenuItem> subMenu = contextMenuItemVector(coreItem.platformSubMenu());
+ webkitContextMenuItemSetSubMenu(item, adoptGRef(webkitContextMenuCreate(subMenu)));
+ }
+
+ return item;
+}
+
static WebKitContextMenuItem* webkitContextMenuItemCreateForGtkItem(GtkMenuItem* menuItem)
{
WebKitContextMenuItem* item = WEBKIT_CONTEXT_MENU_ITEM(g_object_new(WEBKIT_TYPE_CONTEXT_MENU_ITEM, NULL));
Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuItemPrivate.h (178891 => 178892)
--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuItemPrivate.h 2015-01-22 08:05:45 UTC (rev 178891)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuItemPrivate.h 2015-01-22 08:30:39 UTC (rev 178892)
@@ -20,10 +20,12 @@
#ifndef WebKitContextMenuItemPrivate_h
#define WebKitContextMenuItemPrivate_h
+#include "WebContextMenuItemData.h"
#include "WebKitContextMenuItem.h"
#include "WebKitPrivate.h"
-WebKitContextMenuItem* webkitContextMenuItemCreate(WebKit::WebContextMenuItem*);
+WebKitContextMenuItem* webkitContextMenuItemCreate(const WebKit::WebContextMenuItemData&);
+WebKitContextMenuItem* webkitContextMenuItemCreate(const WebCore::ContextMenuItem&);
GtkMenuItem* webkitContextMenuItemRelease(WebKitContextMenuItem*);
void webkitContextMenuItemSetSubMenuFromGtkMenu(WebKitContextMenuItem*, GtkMenu*);
Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuPrivate.h (178891 => 178892)
--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuPrivate.h 2015-01-22 08:05:45 UTC (rev 178891)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitContextMenuPrivate.h 2015-01-22 08:30:39 UTC (rev 178892)
@@ -20,11 +20,14 @@
#ifndef WebKitContextMenuPrivate_h
#define WebKitContextMenuPrivate_h
+#include "WebContextMenuItemData.h"
#include "WebKitContextMenu.h"
#include "WebKitPrivate.h"
-WebKitContextMenu* webkitContextMenuCreate(API::Array* items);
+WebKitContextMenu* webkitContextMenuCreate(const Vector<WebKit::WebContextMenuItemData>&);
+WebKitContextMenu* webkitContextMenuCreate(const Vector<WebCore::ContextMenuItem>&);
void webkitContextMenuPopulate(WebKitContextMenu*, Vector<WebCore::ContextMenuItem>&);
+void webkitContextMenuPopulate(WebKitContextMenu*, Vector<WebKit::WebContextMenuItemData>&);
void webkitContextMenuSetParentItem(WebKitContextMenu*, WebKitContextMenuItem*);
WebKitContextMenuItem* webkitContextMenuGetParentItem(WebKitContextMenu*);
Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp (178891 => 178892)
--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp 2015-01-22 08:05:45 UTC (rev 178891)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp 2015-01-22 08:30:39 UTC (rev 178892)
@@ -2059,30 +2059,17 @@
g_signal_emit(webView, signals[CONTEXT_MENU_DISMISSED], 0, NULL);
}
-void webkitWebViewPopulateContextMenu(WebKitWebView* webView, API::Array* proposedMenu, WebHitTestResult* webHitTestResult, GVariant* userData)
+void webkitWebViewPopulateContextMenu(WebKitWebView* webView, const Vector<WebContextMenuItemData>& proposedMenu, const WebHitTestResult::Data& hitTestResultData, GVariant* userData)
{
WebKitWebViewBase* webViewBase = WEBKIT_WEB_VIEW_BASE(webView);
WebContextMenuProxyGtk* contextMenuProxy = webkitWebViewBaseGetActiveContextMenuProxy(webViewBase);
ASSERT(contextMenuProxy);
GRefPtr<WebKitContextMenu> contextMenu = adoptGRef(webkitContextMenuCreate(proposedMenu));
- if (webHitTestResult->isContentEditable())
+ if (hitTestResultData.isContentEditable)
webkitWebViewCreateAndAppendInputMethodsMenuItem(webView, contextMenu.get());
- // FIXME: we should use a custom ContextMenuClient at some point, that will receive a
- // const WebHitTestResult::Data& that we can use directly here.
- WebHitTestResult::Data data;
- data.absoluteImageURL = webHitTestResult->absoluteImageURL();
- data.absoluteLinkURL = webHitTestResult->absoluteLinkURL();
- data.absoluteMediaURL = webHitTestResult->absoluteMediaURL();
- data.linkLabel = webHitTestResult->linkLabel();
- data.linkTitle = webHitTestResult->linkTitle();
- data.isContentEditable = webHitTestResult->isContentEditable();
- data.elementBoundingBox = webHitTestResult->elementBoundingBox();
- data.isScrollbar = webHitTestResult->isScrollbar();
- data.isSelected = webHitTestResult->isSelected();
-
- GRefPtr<WebKitHitTestResult> hitTestResult = adoptGRef(webkitHitTestResultCreate(data));
+ GRefPtr<WebKitHitTestResult> hitTestResult = adoptGRef(webkitHitTestResultCreate(hitTestResultData));
GUniquePtr<GdkEvent> contextMenuEvent(webkitWebViewBaseTakeContextMenuEvent(webViewBase));
if (userData)
Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewPrivate.h (178891 => 178892)
--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewPrivate.h 2015-01-22 08:05:45 UTC (rev 178891)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewPrivate.h 2015-01-22 08:30:39 UTC (rev 178892)
@@ -27,6 +27,7 @@
#ifndef WebKitWebViewPrivate_h
#define WebKitWebViewPrivate_h
+#include "WebContextMenuItemData.h"
#include "WebHitTestResult.h"
#include "WebImage.h"
#include "WebKitWebView.h"
@@ -53,7 +54,7 @@
void webkitWebViewRemoveLoadingWebResource(WebKitWebView*, uint64_t resourceIdentifier);
bool webkitWebViewEnterFullScreen(WebKitWebView*);
bool webkitWebViewLeaveFullScreen(WebKitWebView*);
-void webkitWebViewPopulateContextMenu(WebKitWebView*, API::Array* proposedMenu, WebKit::WebHitTestResult*, GVariant*);
+void webkitWebViewPopulateContextMenu(WebKitWebView*, const Vector<WebKit::WebContextMenuItemData>& proposedMenu, const WebKit::WebHitTestResult::Data&, GVariant*);
void webkitWebViewSubmitFormRequest(WebKitWebView*, WebKitFormSubmissionRequest*);
void webkitWebViewHandleAuthenticationChallenge(WebKitWebView*, WebKit::AuthenticationChallengeProxy*);
void webkitWebViewInsecureContentDetected(WebKitWebView*, WebKitInsecureContentEvent);
Modified: trunk/Source/WebKit2/WebProcess/InjectedBundle/API/gtk/WebKitWebHitTestResult.cpp (178891 => 178892)
--- trunk/Source/WebKit2/WebProcess/InjectedBundle/API/gtk/WebKitWebHitTestResult.cpp 2015-01-22 08:05:45 UTC (rev 178891)
+++ trunk/Source/WebKit2/WebProcess/InjectedBundle/API/gtk/WebKitWebHitTestResult.cpp 2015-01-22 08:30:39 UTC (rev 178892)
@@ -106,30 +106,36 @@
static_cast<GParamFlags>(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)));
}
-WebKitWebHitTestResult* webkitWebHitTestResultCreate(const InjectedBundleHitTestResult& hitTestResult)
+WebKitWebHitTestResult* webkitWebHitTestResultCreate(const HitTestResult& hitTestResult)
{
unsigned context = WEBKIT_HIT_TEST_RESULT_CONTEXT_DOCUMENT;
- if (!hitTestResult.absoluteLinkURL().isEmpty())
+ String absoluteLinkURL = hitTestResult.absoluteLinkURL().string();
+ if (!absoluteLinkURL.isEmpty())
context |= WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK;
- if (!hitTestResult.absoluteImageURL().isEmpty())
+ String absoluteImageURL = hitTestResult.absoluteImageURL().string();
+ if (!absoluteImageURL.isEmpty())
context |= WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE;
- if (!hitTestResult.absoluteMediaURL().isEmpty())
+ String absoluteMediaURL = hitTestResult.absoluteMediaURL().string();
+ if (!absoluteMediaURL.isEmpty())
context |= WEBKIT_HIT_TEST_RESULT_CONTEXT_MEDIA;
- if (hitTestResult.coreHitTestResult().isContentEditable())
+ if (hitTestResult.isContentEditable())
context |= WEBKIT_HIT_TEST_RESULT_CONTEXT_EDITABLE;
- if (hitTestResult.coreHitTestResult().scrollbar())
+ if (hitTestResult.scrollbar())
context |= WEBKIT_HIT_TEST_RESULT_CONTEXT_SCROLLBAR;
if (hitTestResult.isSelected())
context |= WEBKIT_HIT_TEST_RESULT_CONTEXT_SELECTION;
+ String linkTitle = hitTestResult.titleDisplayString();
+ String linkLabel = hitTestResult.textContent();
+
return WEBKIT_WEB_HIT_TEST_RESULT(g_object_new(WEBKIT_TYPE_WEB_HIT_TEST_RESULT,
"context", context,
- "link-uri", context & WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK ? hitTestResult.absoluteLinkURL().utf8().data() : nullptr,
- "image-uri", context & WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE ? hitTestResult.absoluteImageURL().utf8().data() : nullptr,
- "media-uri", context & WEBKIT_HIT_TEST_RESULT_CONTEXT_MEDIA ? hitTestResult.absoluteMediaURL().utf8().data() : nullptr,
- "link-title", !hitTestResult.linkTitle().isEmpty() ? hitTestResult.linkTitle().utf8().data() : nullptr,
- "link-label", !hitTestResult.linkLabel().isEmpty() ? hitTestResult.linkLabel().utf8().data() : nullptr,
- "node", kit(hitTestResult.coreHitTestResult().innerNonSharedNode()),
+ "link-uri", context & WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK ? absoluteLinkURL.utf8().data() : nullptr,
+ "image-uri", context & WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE ? absoluteImageURL.utf8().data() : nullptr,
+ "media-uri", context & WEBKIT_HIT_TEST_RESULT_CONTEXT_MEDIA ? absoluteMediaURL.utf8().data() : nullptr,
+ "link-title", !linkTitle.isEmpty() ? linkTitle.utf8().data() : nullptr,
+ "link-label", !linkLabel.isEmpty() ? linkLabel.utf8().data() : nullptr,
+ "node", kit(hitTestResult.innerNonSharedNode()),
nullptr));
}
Modified: trunk/Source/WebKit2/WebProcess/InjectedBundle/API/gtk/WebKitWebHitTestResultPrivate.h (178891 => 178892)
--- trunk/Source/WebKit2/WebProcess/InjectedBundle/API/gtk/WebKitWebHitTestResultPrivate.h 2015-01-22 08:05:45 UTC (rev 178891)
+++ trunk/Source/WebKit2/WebProcess/InjectedBundle/API/gtk/WebKitWebHitTestResultPrivate.h 2015-01-22 08:30:39 UTC (rev 178892)
@@ -20,9 +20,9 @@
#ifndef WebKitWebHitTestResultPrivate_h
#define WebKitWebHitTestResultPrivate_h
-#include "InjectedBundleHitTestResult.h"
#include "WebKitWebHitTestResult.h"
+#include <WebCore/HitTestResult.h>
-WebKitWebHitTestResult* webkitWebHitTestResultCreate(const WebKit::InjectedBundleHitTestResult&);
+WebKitWebHitTestResult* webkitWebHitTestResultCreate(const WebCore::HitTestResult&);
#endif // WebKitWebHitTestResultPrivate_h
Modified: trunk/Source/WebKit2/WebProcess/InjectedBundle/API/gtk/WebKitWebPage.cpp (178891 => 178892)
--- trunk/Source/WebKit2/WebProcess/InjectedBundle/API/gtk/WebKitWebPage.cpp 2015-01-22 08:05:45 UTC (rev 178891)
+++ trunk/Source/WebKit2/WebProcess/InjectedBundle/API/gtk/WebKitWebPage.cpp 2015-01-22 08:30:39 UTC (rev 178892)
@@ -228,35 +228,34 @@
WebProcess::shared().injectedBundle()->postMessage(String::fromUTF8("WebPage.DidFailLoadForResource"), API::Dictionary::create(WTF::move(message)).get());
}
-static void getContextMenuFromDefaultMenu(WKBundlePageRef, WKBundleHitTestResultRef wkHitTestResult, WKArrayRef wkDefaultMenu, WKArrayRef* wkNewMenu, WKTypeRef* wkUserData, const void* clientInfo)
-{
- GRefPtr<WebKitContextMenu> contextMenu = adoptGRef(webkitContextMenuCreate(toImpl(wkDefaultMenu)));
- GRefPtr<WebKitWebHitTestResult> webHitTestResult = adoptGRef(webkitWebHitTestResultCreate(*toImpl(wkHitTestResult)));
- gboolean returnValue;
- g_signal_emit(WEBKIT_WEB_PAGE(clientInfo), signals[CONTEXT_MENU], 0, contextMenu.get(), webHitTestResult.get(), &returnValue);
- if (GVariant* userData = webkit_context_menu_get_user_data(contextMenu.get())) {
- GUniquePtr<gchar> dataString(g_variant_print(userData, TRUE));
- *wkUserData = static_cast<WKTypeRef>(WKStringCreateWithUTF8CString(dataString.get()));
+class PageContextMenuClient final : public API::InjectedBundle::PageContextMenuClient {
+public:
+ explicit PageContextMenuClient(WebKitWebPage* webPage)
+ : m_webPage(webPage)
+ {
}
- if (!returnValue) {
- WKRetain(wkDefaultMenu);
- *wkNewMenu = wkDefaultMenu;
- return;
- }
+private:
+ bool getCustomMenuFromDefaultItems(WebPage&, const WebCore::HitTestResult& hitTestResult, const Vector<WebCore::ContextMenuItem>& defaultMenu, Vector<WebContextMenuItemData>& newMenu, RefPtr<API::Object>& userData) override
+ {
+ GRefPtr<WebKitContextMenu> contextMenu = adoptGRef(webkitContextMenuCreate(defaultMenu));
+ GRefPtr<WebKitWebHitTestResult> webHitTestResult = adoptGRef(webkitWebHitTestResultCreate(hitTestResult));
+ gboolean returnValue;
+ g_signal_emit(m_webPage, signals[CONTEXT_MENU], 0, contextMenu.get(), webHitTestResult.get(), &returnValue);
+ if (GVariant* variant = webkit_context_menu_get_user_data(contextMenu.get())) {
+ GUniquePtr<gchar> dataString(g_variant_print(variant, TRUE));
+ userData = API::String::create(String::fromUTF8(dataString.get()));
+ }
- Vector<ContextMenuItem> contextMenuItems;
- webkitContextMenuPopulate(contextMenu.get(), contextMenuItems);
+ if (!returnValue)
+ return false;
- Vector<RefPtr<API::Object>> newMenuItems;
- newMenuItems.reserveInitialCapacity(contextMenuItems.size());
- for (const auto& item : contextMenuItems)
- newMenuItems.uncheckedAppend(WebContextMenuItem::create(item));
+ webkitContextMenuPopulate(contextMenu.get(), newMenu);
+ return true;
+ }
- RefPtr<API::Array> array = API::Array::create(WTF::move(newMenuItems));
- *wkNewMenu = toAPI(array.get());
- WKRetain(*wkNewMenu);
-}
+ WebKitWebPage* m_webPage;
+};
static void webkitWebPageGetProperty(GObject* object, guint propId, GValue* value, GParamSpec* paramSpec)
{
@@ -436,14 +435,7 @@
};
WKBundlePageSetResourceLoadClient(toAPI(webPage), &resourceLoadClient.base);
- WKBundlePageContextMenuClientV0 contextMenuClient = {
- {
- 0, // version
- page, // clientInfo
- },
- getContextMenuFromDefaultMenu,
- };
- WKBundlePageSetContextMenuClient(toAPI(webPage), &contextMenuClient.base);
+ webPage->setInjectedBundleContextMenuClient(std::make_unique<PageContextMenuClient>(page));
return page;
}