Skip to content

Commit d585739

Browse files
kate-k-leecarlosgcampos
authored andcommitted
[GLib] Add webkit_context_menu_get_position API
https://bugs.webkit.org/show_bug.cgi?id=305137 Reviewed by Carlos Garcia Campos. Added webkit_context_menu_get_position() to retrieve the click coordinates (x, y) in view coordinates when a context menu is triggered. This allows applications to know the exact position where the user right-clicked. * Source/WebKit/Shared/API/glib/WebKitContextMenu.cpp: * Source/WebKit/Shared/API/glib/WebKitContextMenuPrivate.h: * Source/WebKit/UIProcess/API/glib/WebKitContextMenu.h.in: * Source/WebKit/UIProcess/API/glib/WebKitWebView.cpp: * Source/WebKit/UIProcess/WebContextMenuProxy.h: * Tools/TestWebKitAPI/Tests/WebKitGtk/TestContextMenu.cpp:" Canonical link: https://commits.webkit.org/305444@main
1 parent be82aa5 commit d585739

File tree

6 files changed

+60
-0
lines changed

6 files changed

+60
-0
lines changed

‎Source/WebKit/Shared/API/glib/WebKitContextMenu.cpp‎

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "WebKitContextMenuItem.h"
2626
#include "WebKitContextMenuItemPrivate.h"
2727
#include "WebKitContextMenuPrivate.h"
28+
#include <WebCore/IntPoint.h>
2829
#include <wtf/glib/GRefPtr.h>
2930
#include <wtf/glib/WTFGType.h>
3031

@@ -67,6 +68,7 @@ struct _WebKitContextMenuPrivate {
6768
GUniquePtr<GdkEvent> event;
6869
#endif
6970
#endif
71+
std::optional<WebCore::IntPoint> position;
7072
};
7173

7274
WEBKIT_DEFINE_FINAL_TYPE(WebKitContextMenu, webkit_context_menu, G_TYPE_OBJECT, GObject)
@@ -130,6 +132,11 @@ WebKitContextMenuItem* webkitContextMenuGetParentItem(WebKitContextMenu* menu)
130132
{
131133
return menu->priv->parentItem;
132134
}
135+
136+
void webkitContextMenuSetPosition(WebKitContextMenu* menu, const WebCore::IntPoint& position)
137+
{
138+
menu->priv->position = position;
139+
}
133140
#endif // ENABLE(CONTEXT_MENUS)
134141

135142
/**
@@ -434,3 +441,33 @@ GdkEvent* webkit_context_menu_get_event(WebKitContextMenu* menu)
434441
return menu->priv->event.get();
435442
}
436443
#endif
444+
445+
/**
446+
* webkit_context_menu_get_position:
447+
* @menu: a #WebKitContextMenu
448+
* @x: (out) (optional): return location for the x coordinate
449+
* @y: (out) (optional): return location for the y coordinate
450+
*
451+
* Gets the position in view coordinates where the context menu was triggered.
452+
*
453+
* This function only returns valid coordinates when called for a #WebKitContextMenu
454+
* passed to #WebKitWebView::context-menu signal.
455+
*
456+
* Returns: %TRUE if valid position coordinates are available, %FALSE otherwise
457+
*
458+
* Since: 2.52
459+
*/
460+
gboolean webkit_context_menu_get_position(WebKitContextMenu* menu, gint* x, gint* y)
461+
{
462+
g_return_val_if_fail(WEBKIT_IS_CONTEXT_MENU(menu), FALSE);
463+
464+
if (!menu->priv->position)
465+
return FALSE;
466+
467+
if (x)
468+
*x = menu->priv->position->x();
469+
if (y)
470+
*y = menu->priv->position->y();
471+
472+
return TRUE;
473+
}

‎Source/WebKit/Shared/API/glib/WebKitContextMenuPrivate.h‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#if ENABLE(CONTEXT_MENUS)
2323
#include "WebContextMenuItemGlib.h"
2424
#include "WebKitContextMenu.h"
25+
#include <WebCore/IntPoint.h>
2526

2627
#if PLATFORM(GTK)
2728
#include "GRefPtrGtk.h"
@@ -33,6 +34,7 @@ void webkitContextMenuPopulate(WebKitContextMenu*, Vector<WebKit::WebContextMenu
3334
void webkitContextMenuPopulate(WebKitContextMenu*, Vector<WebKit::WebContextMenuItemData>&);
3435
void webkitContextMenuSetParentItem(WebKitContextMenu*, WebKitContextMenuItem*);
3536
WebKitContextMenuItem* webkitContextMenuGetParentItem(WebKitContextMenu*);
37+
void webkitContextMenuSetPosition(WebKitContextMenu*, const WebCore::IntPoint&);
3638
#if PLATFORM(GTK)
3739
#if USE(GTK4)
3840
void webkitContextMenuSetEvent(WebKitContextMenu*, GRefPtr<GdkEvent>&&);

‎Source/WebKit/UIProcess/API/glib/WebKitContextMenu.h.in‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,11 @@ WEBKIT_API GdkEvent *
111111
webkit_context_menu_get_event (WebKitContextMenu *menu);
112112
#endif
113113

114+
WEBKIT_API gboolean
115+
webkit_context_menu_get_position (WebKitContextMenu *menu,
116+
gint *x,
117+
gint *y);
118+
114119
G_END_DECLS
115120

116121
#endif

‎Source/WebKit/UIProcess/API/glib/WebKitWebView.cpp‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@
111111
#include "WPEUtilities.h"
112112
#include "WPEWebViewLegacy.h"
113113
#include "WPEWebViewPlatform.h"
114+
#include "WebContextMenuProxy.h"
114115
#include "WebKitOptionMenuPrivate.h"
115116
#include "WebKitWebViewBackendPrivate.h"
116117
#include "WebKitWebViewClient.h"
@@ -3017,6 +3018,7 @@ void webkitWebViewPopulateContextMenu(WebKitWebView* webView, const Vector<WebCo
30173018
if (userData)
30183019
webkit_context_menu_set_user_data(WEBKIT_CONTEXT_MENU(contextMenu.get()), userData);
30193020
webkitContextMenuSetEvent(contextMenu.get(), webkitWebViewBaseTakeContextMenuEvent(webViewBase));
3021+
webkitContextMenuSetPosition(contextMenu.get(), contextMenuProxy->menuLocation());
30203022

30213023
GRefPtr<WebKitHitTestResult> hitTestResult = adoptGRef(webkitHitTestResultCreate(hitTestResultData));
30223024
gboolean returnValue;
@@ -3045,6 +3047,9 @@ void webkitWebViewPopulateContextMenu(WebKitWebView* webView, const Vector<WebCo
30453047
GRefPtr<WebKitContextMenu> contextMenu = adoptGRef(webkitContextMenuCreate(proposedMenu));
30463048
if (userData)
30473049
webkit_context_menu_set_user_data(WEBKIT_CONTEXT_MENU(contextMenu.get()), userData);
3050+
if (auto* contextMenuProxy = getPage(webView).activeContextMenu())
3051+
webkitContextMenuSetPosition(contextMenu.get(), contextMenuProxy->menuLocation());
3052+
30483053
GRefPtr<WebKitHitTestResult> hitTestResult = adoptGRef(webkitHitTestResultCreate(hitTestResultData));
30493054
gboolean returnValue;
30503055
g_signal_emit(webView, signals[CONTEXT_MENU], 0, contextMenu.get(),

‎Source/WebKit/UIProcess/WebContextMenuProxy.h‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ class WebContextMenuProxy : public RefCounted<WebContextMenuProxy>, public WebCo
5555
WebPageProxy* page() const { return m_page.get(); }
5656
RefPtr<WebPageProxy> protectedPage() const;
5757
const FrameInfoData& frameInfo() const { return m_frameInfo; }
58+
const WebCore::IntPoint& menuLocation() const { return m_context.menuLocation(); }
5859

5960
#if PLATFORM(COCOA)
6061
virtual NSMenu *platformMenu() const = 0;

‎Tools/TestWebKitAPI/Tests/WebKitGtk/TestContextMenu.cpp‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,22 @@ class ContextMenuTest: public WebViewTest {
6161
#endif
6262
}
6363

64+
void checkContextMenuPosition(WebKitContextMenu* contextMenu)
65+
{
66+
gint x, y;
67+
gboolean hasPosition = webkit_context_menu_get_position(contextMenu, &x, &y);
68+
g_assert_true(hasPosition);
69+
g_assert_cmpint(x, ==, static_cast<gint>(m_menuPositionX));
70+
g_assert_cmpint(y, ==, static_cast<gint>(m_menuPositionY));
71+
}
72+
6473
static gboolean contextMenuCallback(WebKitWebView* webView, WebKitContextMenu* contextMenu, GdkEvent* event, WebKitHitTestResult* hitTestResult, ContextMenuTest* test)
6574
{
6675
g_assert_true(WEBKIT_IS_CONTEXT_MENU(contextMenu));
6776
test->assertObjectIsDeletedWhenTestFinishes(G_OBJECT(contextMenu));
6877
g_assert_true(webkit_context_menu_get_event(contextMenu) == event);
6978
test->checkContextMenuEvent(event);
79+
test->checkContextMenuPosition(contextMenu);
7080
g_assert_true(WEBKIT_IS_HIT_TEST_RESULT(hitTestResult));
7181
test->assertObjectIsDeletedWhenTestFinishes(G_OBJECT(hitTestResult));
7282

0 commit comments

Comments
 (0)