Title: [222855] trunk/Source/WebKit
Revision
222855
Author
[email protected]
Date
2017-10-04 10:33:27 -0700 (Wed, 04 Oct 2017)

Log Message

[GTK] WebKit2GTK+ does not handle touchmove and touchend events correctly
https://bugs.webkit.org/show_bug.cgi?id=158531

Reviewed by Carlos Alberto Lopez Perez.

Do not bypass WebCore event handling when receiving touch events.

Based on a patch by Andre Moreira Magalhaes <[email protected]>.
Thanks to Carlos Garnacho <[email protected]> for helping out reviewing the code.

* UIProcess/API/gtk/PageClientImpl.cpp:
(WebKit::PageClientImpl::doneWithTouchEvent): Make sure touchend reaches gesture controller if touchbegin evet got to it.
* UIProcess/API/gtk/WebKitWebViewBase.cpp:
(webkitWebViewBaseTouchEvent): Do not invoke gesture controller directly by bypassing WebCore event handling.
* UIProcess/gtk/GestureController.cpp:
(WebKit::GestureController::reset): Added.
(WebKit::GestureController::handleEvent): Reset gesture controller when touchpadupdate/end is received without touchbegin.
(WebKit::GestureController::Gesture::reset): Added.
* UIProcess/gtk/GestureController.h:

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (222854 => 222855)


--- trunk/Source/WebKit/ChangeLog	2017-10-04 17:14:24 UTC (rev 222854)
+++ trunk/Source/WebKit/ChangeLog	2017-10-04 17:33:27 UTC (rev 222855)
@@ -1,3 +1,25 @@
+2017-10-04  Adrian Perez de Castro  <[email protected]>
+
+        [GTK] WebKit2GTK+ does not handle touchmove and touchend events correctly
+        https://bugs.webkit.org/show_bug.cgi?id=158531
+
+        Reviewed by Carlos Alberto Lopez Perez.
+
+        Do not bypass WebCore event handling when receiving touch events.
+
+        Based on a patch by Andre Moreira Magalhaes <[email protected]>.
+        Thanks to Carlos Garnacho <[email protected]> for helping out reviewing the code.
+
+        * UIProcess/API/gtk/PageClientImpl.cpp:
+        (WebKit::PageClientImpl::doneWithTouchEvent): Make sure touchend reaches gesture controller if touchbegin evet got to it.
+        * UIProcess/API/gtk/WebKitWebViewBase.cpp:
+        (webkitWebViewBaseTouchEvent): Do not invoke gesture controller directly by bypassing WebCore event handling.
+        * UIProcess/gtk/GestureController.cpp:
+        (WebKit::GestureController::reset): Added.
+        (WebKit::GestureController::handleEvent): Reset gesture controller when touchpadupdate/end is received without touchbegin.
+        (WebKit::GestureController::Gesture::reset): Added.
+        * UIProcess/gtk/GestureController.h:
+
 2017-10-04  Michael Catanzaro  <[email protected]>
 
         Unreviewed WPE build fix after r222837

Modified: trunk/Source/WebKit/UIProcess/API/gtk/PageClientImpl.cpp (222854 => 222855)


--- trunk/Source/WebKit/UIProcess/API/gtk/PageClientImpl.cpp	2017-10-04 17:14:24 UTC (rev 222854)
+++ trunk/Source/WebKit/UIProcess/API/gtk/PageClientImpl.cpp	2017-10-04 17:33:27 UTC (rev 222855)
@@ -342,18 +342,21 @@
 #if ENABLE(TOUCH_EVENTS)
 void PageClientImpl::doneWithTouchEvent(const NativeWebTouchEvent& event, bool wasEventHandled)
 {
-    if (wasEventHandled)
-        return;
+    const GdkEvent* touchEvent = event.nativeEvent();
 
 #if HAVE(GTK_GESTURES)
     GestureController& gestureController = webkitWebViewBaseGestureController(WEBKIT_WEB_VIEW_BASE(m_viewWidget));
-    if (gestureController.handleEvent(event.nativeEvent()))
+    if (wasEventHandled) {
+        gestureController.reset();
         return;
+    }
+    wasEventHandled = gestureController.handleEvent(event.nativeEvent());
 #endif
 
+    if (wasEventHandled)
+        return;
+
     // Emulate pointer events if unhandled.
-    const GdkEvent* touchEvent = event.nativeEvent();
-
     if (!touchEvent->touch.emulating_pointer)
         return;
 

Modified: trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp (222854 => 222855)


--- trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp	2017-10-04 17:14:24 UTC (rev 222854)
+++ trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp	2017-10-04 17:33:27 UTC (rev 222855)
@@ -927,20 +927,6 @@
     GdkEvent* touchEvent = reinterpret_cast<GdkEvent*>(event);
     uint32_t sequence = GPOINTER_TO_UINT(gdk_event_get_event_sequence(touchEvent));
 
-#if HAVE(GTK_GESTURES)
-    GestureController& gestureController = webkitWebViewBaseGestureController(webViewBase);
-    if (gestureController.isProcessingGestures()) {
-        // If we are already processing gestures is because the WebProcess didn't handle the
-        // BEGIN touch event, so pass subsequent events to the GestureController.
-        gestureController.handleEvent(touchEvent);
-        // Remove the gesture event sequence from the handled touch events
-        // list to avoid the gesure sequence and a touch sequence of same
-        // ID to conflict.
-        priv->touchEvents.remove(sequence);
-        return TRUE;
-    }
-#endif
-
     switch (touchEvent->type) {
     case GDK_TOUCH_BEGIN: {
         ASSERT(!priv->touchEvents.contains(sequence));

Modified: trunk/Source/WebKit/UIProcess/gtk/GestureController.cpp (222854 => 222855)


--- trunk/Source/WebKit/UIProcess/gtk/GestureController.cpp	2017-10-04 17:14:24 UTC (rev 222854)
+++ trunk/Source/WebKit/UIProcess/gtk/GestureController.cpp	2017-10-04 17:33:27 UTC (rev 222855)
@@ -67,6 +67,11 @@
     gtk_event_controller_set_propagation_phase(GTK_EVENT_CONTROLLER(m_gesture.get()), GTK_PHASE_NONE);
 }
 
+void GestureController::Gesture::reset()
+{
+    gtk_event_controller_reset(GTK_EVENT_CONTROLLER(m_gesture.get()));
+}
+
 bool GestureController::Gesture::isActive() const
 {
     return gtk_gesture_is_active(m_gesture.get());

Modified: trunk/Source/WebKit/UIProcess/gtk/GestureController.h (222854 => 222855)


--- trunk/Source/WebKit/UIProcess/gtk/GestureController.h	2017-10-04 17:14:24 UTC (rev 222854)
+++ trunk/Source/WebKit/UIProcess/gtk/GestureController.h	2017-10-04 17:33:27 UTC (rev 222855)
@@ -49,9 +49,17 @@
     bool isProcessingGestures() const;
     bool handleEvent(const GdkEvent*);
 
+    void reset()
+    {
+        m_dragGesture.reset();
+        m_swipeGesture.reset();
+        m_zoomGesture.reset();
+    }
+
 private:
     class Gesture {
     public:
+        void reset();
         bool isActive() const;
         void handleEvent(const GdkEvent*);
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to