Modified: trunk/Source/WebKit/ChangeLog (261047 => 261048)
--- trunk/Source/WebKit/ChangeLog 2020-05-02 12:54:36 UTC (rev 261047)
+++ trunk/Source/WebKit/ChangeLog 2020-05-02 12:55:57 UTC (rev 261048)
@@ -1,3 +1,21 @@
+2020-05-02 Carlos Garcia Campos <[email protected]>
+
+ [GTK4] Re-inject key press events not handled by the web process
+ https://bugs.webkit.org/show_bug.cgi?id=211286
+
+ Reviewed by Adrian Perez de Castro.
+
+ Use gdk_display_put_event() since gtk_main_do_event() is no longer available in GTK4. Also stop forwarding key
+ release events in GTK3 case, this only makes sense for key press events and we were re-injecting every release
+ event since they are not handled by web elements in most of the cases.
+
+ * UIProcess/API/gtk/PageClientImpl.cpp:
+ (WebKit::PageClientImpl::doneWithKeyEvent):
+ * UIProcess/API/gtk/WebKitWebViewBase.cpp:
+ (webkitWebViewBaseKeyPressEvent):
+ (webkitWebViewBaseKeyReleaseEvent):
+ (webkitWebViewBaseKeyPressed):
+
2020-05-02 Adrian Perez de Castro <[email protected]>
[GTK] Specify action group name when binding context menu models
Modified: trunk/Source/WebKit/UIProcess/API/gtk/PageClientImpl.cpp (261047 => 261048)
--- trunk/Source/WebKit/UIProcess/API/gtk/PageClientImpl.cpp 2020-05-02 12:54:36 UTC (rev 261047)
+++ trunk/Source/WebKit/UIProcess/API/gtk/PageClientImpl.cpp 2020-05-02 12:55:57 UTC (rev 261048)
@@ -239,11 +239,14 @@
void PageClientImpl::doneWithKeyEvent(const NativeWebKeyboardEvent& event, bool wasEventHandled)
{
- if (wasEventHandled)
+ if (wasEventHandled || event.type() != WebEvent::Type::KeyDown)
return;
-#if !USE(GTK4)
+
WebKitWebViewBase* webkitWebViewBase = WEBKIT_WEB_VIEW_BASE(m_viewWidget);
webkitWebViewBaseForwardNextKeyEvent(webkitWebViewBase);
+#if USE(GTK4)
+ gdk_display_put_event(gtk_widget_get_display(m_viewWidget), event.nativeEvent());
+#else
gtk_main_do_event(event.nativeEvent());
#endif
}
Modified: trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp (261047 => 261048)
--- trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp 2020-05-02 12:54:36 UTC (rev 261047)
+++ trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp 2020-05-02 12:55:57 UTC (rev 261048)
@@ -816,6 +816,15 @@
WebKitWebViewBase* webViewBase = WEBKIT_WEB_VIEW_BASE(widget);
WebKitWebViewBasePrivate* priv = webViewBase->priv;
+ // Since WebProcess key event handling is not synchronous, handle the event in two passes.
+ // When WebProcess processes the input event, it will call PageClientImpl::doneWithKeyEvent
+ // with event handled status which determines whether to pass the input event to parent or not
+ // using gtk_main_do_event().
+ if (priv->shouldForwardNextKeyEvent) {
+ priv->shouldForwardNextKeyEvent = false;
+ return GTK_WIDGET_CLASS(webkit_web_view_base_parent_class)->key_press_event(widget, keyEvent);
+ }
+
GdkModifierType state;
guint keyval;
gdk_event_get_state(reinterpret_cast<GdkEvent*>(keyEvent), &state);
@@ -825,7 +834,6 @@
if ((state & GDK_CONTROL_MASK) && (state & GDK_SHIFT_MASK) && keyval == GDK_KEY_G) {
auto& preferences = priv->pageProxy->preferences();
preferences.setResourceUsageOverlayVisible(!preferences.resourceUsageOverlayVisible());
- priv->shouldForwardNextKeyEvent = FALSE;
return GDK_EVENT_STOP;
}
#endif
@@ -847,14 +855,6 @@
}
#endif
- // Since WebProcess key event handling is not synchronous, handle the event in two passes.
- // When WebProcess processes the input event, it will call PageClientImpl::doneWithKeyEvent
- // with event handled status which determines whether to pass the input event to parent or not
- // using gtk_main_do_event().
- if (priv->shouldForwardNextKeyEvent) {
- priv->shouldForwardNextKeyEvent = FALSE;
- return GTK_WIDGET_CLASS(webkit_web_view_base_parent_class)->key_press_event(widget, keyEvent);
- }
auto filterResult = priv->inputMethodFilter.filterKeyEvent(reinterpret_cast<GdkEvent*>(keyEvent));
if (!filterResult.handled) {
priv->pageProxy->handleKeyboardEvent(NativeWebKeyboardEvent(reinterpret_cast<GdkEvent*>(keyEvent), filterResult.keyText,
@@ -869,11 +869,6 @@
WebKitWebViewBase* webViewBase = WEBKIT_WEB_VIEW_BASE(widget);
WebKitWebViewBasePrivate* priv = webViewBase->priv;
- if (priv->shouldForwardNextKeyEvent) {
- priv->shouldForwardNextKeyEvent = FALSE;
- return GTK_WIDGET_CLASS(webkit_web_view_base_parent_class)->key_release_event(widget, keyEvent);
- }
-
if (!priv->inputMethodFilter.filterKeyEvent(reinterpret_cast<GdkEvent*>(keyEvent)).handled) {
priv->pageProxy->handleKeyboardEvent(NativeWebKeyboardEvent(reinterpret_cast<GdkEvent*>(keyEvent), { },
NativeWebKeyboardEvent::HandledByInputMethod::No, WTF::nullopt, WTF::nullopt, { }));
@@ -898,6 +893,15 @@
{
WebKitWebViewBasePrivate* priv = webViewBase->priv;
+ // Since WebProcess key event handling is not synchronous, handle the event in two passes.
+ // When WebProcess processes the input event, it will call PageClientImpl::doneWithKeyEvent
+ // with event handled status which determines whether to pass the input event to parent or not
+ // using gdk_display_put_event().
+ if (priv->shouldForwardNextKeyEvent) {
+ priv->shouldForwardNextKeyEvent = false;
+ return GDK_EVENT_PROPAGATE;
+ }
+
#if ENABLE(DEVELOPER_MODE) && OS(LINUX)
if ((state & GDK_CONTROL_MASK) && (state & GDK_SHIFT_MASK) && keyval == GDK_KEY_G) {
auto& preferences = priv->pageProxy->preferences();