Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(404)

Unified Diff: third_party/WebKit/Source/core/input/GestureManager.cpp

Issue 2141993003: PointerEvents for long-press: fix double firing & canceling MEs (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed preventing MEs on canceled pointerdowns Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/input/GestureManager.cpp
diff --git a/third_party/WebKit/Source/core/input/GestureManager.cpp b/third_party/WebKit/Source/core/input/GestureManager.cpp
index 2ac482815ca50c85dcf664618d8124a06caae12f..f8e1e91fb931858ccb3d6b4a84e7da6fba592b8d 100644
--- a/third_party/WebKit/Source/core/input/GestureManager.cpp
+++ b/third_party/WebKit/Source/core/input/GestureManager.cpp
@@ -104,7 +104,7 @@ WebInputEventResult GestureManager::handleGestureEventInFrame(const GestureEvent
case PlatformEvent::GestureLongTap:
return handleGestureLongTap(targetedEvent);
case PlatformEvent::GestureTwoFingerTap:
- return m_frame->eventHandler().sendContextMenuEventForGesture(targetedEvent);
+ return handleGestureTwoFingerTap(targetedEvent);
case PlatformEvent::GesturePinchBegin:
case PlatformEvent::GesturePinchEnd:
case PlatformEvent::GesturePinchUpdate:
@@ -266,7 +266,7 @@ WebInputEventResult GestureManager::handleGestureLongPress(const GestureEventWit
return WebInputEventResult::HandledSystem;
}
- return m_frame->eventHandler().sendContextMenuEventForGesture(targetedEvent);
+ return sendContextMenuEventForGesture(targetedEvent);
}
WebInputEventResult GestureManager::handleGestureLongTap(const GestureEventWithHitTestResults& targetedEvent)
@@ -274,12 +274,61 @@ WebInputEventResult GestureManager::handleGestureLongTap(const GestureEventWithH
#if !OS(ANDROID)
if (m_longTapShouldInvokeContextMenu) {
m_longTapShouldInvokeContextMenu = false;
- return m_frame->eventHandler().sendContextMenuEventForGesture(targetedEvent);
+ return sendContextMenuEventForGesture(targetedEvent);
}
#endif
return WebInputEventResult::NotHandled;
}
+WebInputEventResult GestureManager::handleGestureTwoFingerTap(const GestureEventWithHitTestResults& targetedEvent)
+{
+ return sendContextMenuEventForGesture(targetedEvent);
+}
+
+WebInputEventResult GestureManager::sendContextMenuEventForGesture(const GestureEventWithHitTestResults& targetedEvent)
+{
+ const PlatformGestureEvent& gestureEvent = targetedEvent.event();
+ unsigned modifiers = gestureEvent.getModifiers();
+
+ if (!m_suppressMouseEventsFromGestures) {
+ // Send MouseMoved event prior to handling (https://crbug.com/485290).
+ PlatformMouseEvent fakeMouseMove(gestureEvent.position(), gestureEvent.globalPosition(),
+ NoButton, PlatformEvent::MouseMoved, /* clickCount */ 0,
+ static_cast<PlatformEvent::Modifiers>(modifiers),
+ PlatformMouseEvent::FromTouch, gestureEvent.timestamp(), WebPointerProperties::PointerType::Mouse);
+
+ m_frame->eventHandler().dispatchMouseEvent(EventTypeNames::mousemove, targetedEvent.hitTestResult().innerNode(), 0, fakeMouseMove);
+ }
+
+ PlatformEvent::EventType eventType = PlatformEvent::MousePressed;
+ if (m_frame->settings() && m_frame->settings()->showContextMenuOnMouseUp())
+ eventType = PlatformEvent::MouseReleased;
+
+ // To simulate right-click behavior, we send a right mouse down and then
+ // context menu event.
+ // TODO(crbug.com/579564): Maybe we should not send mouse down at all
+ PlatformMouseEvent mouseEvent(targetedEvent.event().position(), targetedEvent.event().globalPosition(), RightButton, eventType, 1,
+ static_cast<PlatformEvent::Modifiers>(modifiers | PlatformEvent::RightButtonDown),
+ PlatformMouseEvent::FromTouch, WTF::monotonicallyIncreasingTime(), WebPointerProperties::PointerType::Mouse);
+
+ if (!m_suppressMouseEventsFromGestures && m_frame->view()) {
+ MouseEventWithHitTestResults mev(mouseEvent, targetedEvent.hitTestResult());
dtapuska 2016/07/18 21:16:31 Is it safe to reuse the hit test result here? The
mustaq 2016/07/19 15:50:27 Brought back the hittest, got distracted by the fi
mustaq 2016/07/19 15:52:32 Note that we don't passMousePressEventToScrollbar(
mustaq 2016/07/20 15:54:41 Bad news: the cherry-picking of DOM events is caus
+ WebInputEventResult eventResult = m_frame->eventHandler().dispatchMouseEvent(EventTypeNames::mousedown, mev.innerNode(), /* clickCount */ 0, mouseEvent);
+
+ if (eventResult == WebInputEventResult::NotHandled) {
+ InputDeviceCapabilities* sourceCapabilities = mouseEvent.getSyntheticEventType() == PlatformMouseEvent::FromTouch ? InputDeviceCapabilities::firesTouchEventsSourceCapabilities() : InputDeviceCapabilities::doesntFireTouchEventsSourceCapabilities();
+ eventResult = m_frame->eventHandler().handleMouseFocus(mev, sourceCapabilities);
+ }
+
+ if (eventResult == WebInputEventResult::NotHandled)
+ m_frame->eventHandler().handleMousePressEvent(mev);
+ }
+
+ return m_frame->eventHandler().sendContextMenuEvent(mouseEvent);
+ // We do not need to send a corresponding mouse release because in case of
+ // right-click, the context menu takes capture and consumes all events.
+}
+
WebInputEventResult GestureManager::handleGestureShowPress()
{
m_lastShowPressTimestamp = WTF::monotonicallyIncreasingTime();

Powered by Google App Engine
This is Rietveld 408576698