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