Chromium Code Reviews| Index: third_party/WebKit/Source/core/input/EventHandler.cpp |
| diff --git a/third_party/WebKit/Source/core/input/EventHandler.cpp b/third_party/WebKit/Source/core/input/EventHandler.cpp |
| index 0ae26ba3d1e0713165e07821db931a4ca6935347..b7fe894272120c6b61ab4b9f475e272b3c85c81d 100644 |
| --- a/third_party/WebKit/Source/core/input/EventHandler.cpp |
| +++ b/third_party/WebKit/Source/core/input/EventHandler.cpp |
| @@ -261,6 +261,7 @@ EventHandler::EventHandler(LocalFrame* frame) |
| , m_activeIntervalTimer(this, &EventHandler::activeIntervalTimerFired) |
| , m_lastShowPressTimestamp(0) |
| , m_deltaConsumedForScrollSequence(false) |
| + , m_suppressMouseEventsFromGestures(false) |
| { |
| } |
| @@ -334,6 +335,7 @@ void EventHandler::clear() |
| m_dragStartPos = LayoutPoint(); |
| m_offsetFromResizeCorner = LayoutSize(); |
| m_mouseDown = PlatformMouseEvent(); |
| + m_suppressMouseEventsFromGestures = false; |
| } |
| WebInputEventResult EventHandler::mergeEventResult( |
| @@ -2063,6 +2065,8 @@ WebInputEventResult EventHandler::handleGestureEventInFrame(const GestureEventWi |
| } |
| switch (gestureEvent.type()) { |
| + case PlatformEvent::GestureTapDown: |
| + return handleGestureTapDown(targetedEvent); |
| case PlatformEvent::GestureTap: |
| return handleGestureTap(targetedEvent); |
| case PlatformEvent::GestureShowPress: |
| @@ -2073,7 +2077,6 @@ WebInputEventResult EventHandler::handleGestureEventInFrame(const GestureEventWi |
| return handleGestureLongTap(targetedEvent); |
| case PlatformEvent::GestureTwoFingerTap: |
| return sendContextMenuEventForGesture(targetedEvent); |
| - case PlatformEvent::GestureTapDown: |
| case PlatformEvent::GesturePinchBegin: |
| case PlatformEvent::GesturePinchEnd: |
| case PlatformEvent::GesturePinchUpdate: |
| @@ -2161,6 +2164,13 @@ WebInputEventResult EventHandler::handleGestureScrollEvent(const PlatformGesture |
| } |
| } |
| +WebInputEventResult EventHandler::handleGestureTapDown(const GestureEventWithHitTestResults& targetedEvent) |
| +{ |
| + m_suppressMouseEventsFromGestures = |
|
dtapuska
2016/05/27 20:54:07
I see there is an ASSERT in debug mode for the Deq
|
| + m_pointerEventManager.firstPrimaryPointerdownResult() != WebInputEventResult::NotHandled; |
| + return WebInputEventResult::NotHandled; |
| +} |
| + |
| WebInputEventResult EventHandler::handleGestureTap(const GestureEventWithHitTestResults& targetedEvent) |
| { |
| FrameView* frameView(m_frame->view()); |
| @@ -2176,13 +2186,15 @@ WebInputEventResult EventHandler::handleGestureTap(const GestureEventWithHitTest |
| // We use the adjusted position so the application isn't surprised to see a event with |
| // co-ordinates outside the target's bounds. |
| IntPoint adjustedPoint = frameView->rootFrameToContents(gestureEvent.position()); |
| + const unsigned modifiers = gestureEvent.getModifiers(); |
| - unsigned modifiers = gestureEvent.getModifiers(); |
| - PlatformMouseEvent fakeMouseMove(gestureEvent.position(), gestureEvent.globalPosition(), |
| - NoButton, PlatformEvent::MouseMoved, /* clickCount */ 0, |
| - static_cast<PlatformEvent::Modifiers>(modifiers), |
| - PlatformMouseEvent::FromTouch, gestureEvent.timestamp(), WebPointerProperties::PointerType::Mouse); |
| - dispatchMouseEvent(EventTypeNames::mousemove, currentHitTest.innerNode(), 0, fakeMouseMove); |
| + if (!m_suppressMouseEventsFromGestures) { |
| + PlatformMouseEvent fakeMouseMove(gestureEvent.position(), gestureEvent.globalPosition(), |
| + NoButton, PlatformEvent::MouseMoved, /* clickCount */ 0, |
| + static_cast<PlatformEvent::Modifiers>(modifiers), |
| + PlatformMouseEvent::FromTouch, gestureEvent.timestamp(), WebPointerProperties::PointerType::Mouse); |
| + dispatchMouseEvent(EventTypeNames::mousemove, currentHitTest.innerNode(), 0, fakeMouseMove); |
| + } |
| // Do a new hit-test in case the mousemove event changed the DOM. |
| // Note that if the original hit test wasn't over an element (eg. was over a scrollbar) we |
| @@ -2207,16 +2219,19 @@ WebInputEventResult EventHandler::handleGestureTap(const GestureEventWithHitTest |
| if (m_clickNode && m_clickNode->isTextNode()) |
| m_clickNode = FlatTreeTraversal::parent(*m_clickNode); |
| - PlatformMouseEvent fakeMouseDown(gestureEvent.position(), gestureEvent.globalPosition(), |
| - LeftButton, PlatformEvent::MousePressed, gestureEvent.tapCount(), |
| - static_cast<PlatformEvent::Modifiers>(modifiers | PlatformEvent::LeftButtonDown), |
| - PlatformMouseEvent::FromTouch, gestureEvent.timestamp(), WebPointerProperties::PointerType::Mouse); |
| - WebInputEventResult mouseDownEventResult = dispatchMouseEvent(EventTypeNames::mousedown, currentHitTest.innerNode(), gestureEvent.tapCount(), fakeMouseDown); |
| - selectionController().initializeSelectionState(); |
| - if (mouseDownEventResult == WebInputEventResult::NotHandled) |
| - mouseDownEventResult = handleMouseFocus(MouseEventWithHitTestResults(fakeMouseDown, currentHitTest), InputDeviceCapabilities::firesTouchEventsSourceCapabilities()); |
| - if (mouseDownEventResult == WebInputEventResult::NotHandled) |
| - mouseDownEventResult = handleMousePressEvent(MouseEventWithHitTestResults(fakeMouseDown, currentHitTest)); |
| + WebInputEventResult mouseDownEventResult = WebInputEventResult::NotHandled; |
| + if (!m_suppressMouseEventsFromGestures) { |
| + PlatformMouseEvent fakeMouseDown(gestureEvent.position(), gestureEvent.globalPosition(), |
| + LeftButton, PlatformEvent::MousePressed, gestureEvent.tapCount(), |
| + static_cast<PlatformEvent::Modifiers>(modifiers | PlatformEvent::LeftButtonDown), |
| + PlatformMouseEvent::FromTouch, gestureEvent.timestamp(), WebPointerProperties::PointerType::Mouse); |
| + mouseDownEventResult = dispatchMouseEvent(EventTypeNames::mousedown, currentHitTest.innerNode(), gestureEvent.tapCount(), fakeMouseDown); |
| + selectionController().initializeSelectionState(); |
| + if (mouseDownEventResult == WebInputEventResult::NotHandled) |
| + mouseDownEventResult = handleMouseFocus(MouseEventWithHitTestResults(fakeMouseDown, currentHitTest), InputDeviceCapabilities::firesTouchEventsSourceCapabilities()); |
| + if (mouseDownEventResult == WebInputEventResult::NotHandled) |
| + mouseDownEventResult = handleMousePressEvent(MouseEventWithHitTestResults(fakeMouseDown, currentHitTest)); |
|
Rick Byers
2016/05/27 20:39:27
In addition to suppressing the generation of mouse
mustaq
2016/06/02 19:26:26
A milder approach seems to make more sense to me n
Rick Byers
2016/06/03 15:31:39
I think it's important that cancelling pointerdown
|
| + } |
| if (currentHitTest.innerNode()) { |
| ASSERT(gestureEvent.type() == PlatformEvent::GestureTap); |
| @@ -2233,11 +2248,15 @@ WebInputEventResult EventHandler::handleGestureTap(const GestureEventWithHitTest |
| adjustedPoint = frameView->rootFrameToContents(gestureEvent.position()); |
| currentHitTest = hitTestResultInFrame(m_frame, adjustedPoint, hitType); |
| } |
| + |
| + WebInputEventResult mouseUpEventResult = WebInputEventResult::NotHandled; |
| PlatformMouseEvent fakeMouseUp(gestureEvent.position(), gestureEvent.globalPosition(), |
| LeftButton, PlatformEvent::MouseReleased, gestureEvent.tapCount(), |
| static_cast<PlatformEvent::Modifiers>(modifiers), |
| - PlatformMouseEvent::FromTouch, gestureEvent.timestamp(), WebPointerProperties::PointerType::Mouse); |
| - WebInputEventResult mouseUpEventResult = dispatchMouseEvent(EventTypeNames::mouseup, currentHitTest.innerNode(), gestureEvent.tapCount(), fakeMouseUp); |
| + PlatformMouseEvent::FromTouch, gestureEvent.timestamp(), WebPointerProperties::PointerType::Mouse); |
| + if (!m_suppressMouseEventsFromGestures) { |
| + mouseUpEventResult = dispatchMouseEvent(EventTypeNames::mouseup, currentHitTest.innerNode(), gestureEvent.tapCount(), fakeMouseUp); |
| + } |
| WebInputEventResult clickEventResult = WebInputEventResult::NotHandled; |
| if (m_clickNode) { |
| @@ -2254,7 +2273,7 @@ WebInputEventResult EventHandler::handleGestureTap(const GestureEventWithHitTest |
| m_clickNode = nullptr; |
| } |
| - if (mouseUpEventResult == WebInputEventResult::NotHandled) |
| + if (!m_suppressMouseEventsFromGestures && mouseUpEventResult == WebInputEventResult::NotHandled) |
| mouseUpEventResult = handleMouseReleaseEvent(MouseEventWithHitTestResults(fakeMouseUp, currentHitTest)); |
| WebInputEventResult eventResult = mergeEventResult(mergeEventResult(mouseDownEventResult, mouseUpEventResult), clickEventResult); |
| @@ -2281,6 +2300,8 @@ WebInputEventResult EventHandler::handleGestureLongPress(const GestureEventWithH |
| m_longTapShouldInvokeContextMenu = false; |
| if (m_frame->settings() && m_frame->settings()->touchDragDropEnabled() && m_frame->view()) { |
| + // TODO(mustaq): Suppressing long-tap MouseEvents could break |
| + // drag-drop. Will do separately because of the risk. crbug.com/606938. |
| PlatformMouseEvent mouseDownEvent(adjustedPoint, gestureEvent.globalPosition(), LeftButton, PlatformEvent::MousePressed, 1, |
| static_cast<PlatformEvent::Modifiers>(modifiers | PlatformEvent::LeftButtonDown), |
| PlatformMouseEvent::FromTouch, WTF::monotonicallyIncreasingTime(), WebPointerProperties::PointerType::Mouse); |
| @@ -3638,7 +3659,6 @@ HitTestResult EventHandler::hitTestResultInFrame(LocalFrame* frame, const Layout |
| WebInputEventResult EventHandler::handleTouchEvent(const PlatformTouchEvent& event) |
| { |
| TRACE_EVENT0("blink", "EventHandler::handleTouchEvent"); |
| - |
| return m_pointerEventManager.handleTouchEvents(event); |
| } |