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 4f97d79ed05aaaaee08082ed82196d6e60cfbad5..984487418f7db007d085041d76f528d99b19a106 100644 |
| --- a/third_party/WebKit/Source/core/input/EventHandler.cpp |
| +++ b/third_party/WebKit/Source/core/input/EventHandler.cpp |
| @@ -108,8 +108,67 @@ bool isNodeInDocument(Node* n) |
| return n && n->inDocument(); |
| } |
| +const AtomicString& touchEventNameForTouchPointState(PlatformTouchPoint::State state) |
| +{ |
| + switch (state) { |
| + case PlatformTouchPoint::TouchReleased: |
| + return EventTypeNames::touchend; |
| + case PlatformTouchPoint::TouchCancelled: |
| + return EventTypeNames::touchcancel; |
| + case PlatformTouchPoint::TouchPressed: |
| + return EventTypeNames::touchstart; |
| + case PlatformTouchPoint::TouchMoved: |
| + return EventTypeNames::touchmove; |
| + case PlatformTouchPoint::TouchStationary: |
| + // Fall through to default |
| + default: |
| + ASSERT_NOT_REACHED(); |
| + return emptyAtom; |
| + } |
| } |
| +const AtomicString& pointerEventNameForTouchPointState(PlatformTouchPoint::State state) |
| +{ |
| + switch (state) { |
| + case PlatformTouchPoint::TouchReleased: |
| + return EventTypeNames::pointerup; |
| + case PlatformTouchPoint::TouchCancelled: |
| + return EventTypeNames::pointercancel; |
| + case PlatformTouchPoint::TouchPressed: |
| + return EventTypeNames::pointerdown; |
| + case PlatformTouchPoint::TouchMoved: |
| + return EventTypeNames::pointermove; |
| + case PlatformTouchPoint::TouchStationary: |
| + // Fall through to default |
| + default: |
| + ASSERT_NOT_REACHED(); |
| + return emptyAtom; |
| + } |
| +} |
| + |
| +const AtomicString& pointerEventNameForMouseEventName(const AtomicString& mouseEventName) |
| +{ |
| +#define RETURN_CORRESPONDING_PE_NAME(eventSuffix) \ |
| + if (mouseEventName == EventTypeNames::mouse##eventSuffix) {\ |
| + return EventTypeNames::pointer##eventSuffix;\ |
| + } |
| + |
| + RETURN_CORRESPONDING_PE_NAME(down); |
| + RETURN_CORRESPONDING_PE_NAME(enter); |
| + RETURN_CORRESPONDING_PE_NAME(leave); |
| + RETURN_CORRESPONDING_PE_NAME(move); |
| + RETURN_CORRESPONDING_PE_NAME(out); |
| + RETURN_CORRESPONDING_PE_NAME(over); |
| + RETURN_CORRESPONDING_PE_NAME(up); |
| + |
| +#undef RETURN_CORRESPONDING_PE_NAME |
| + |
| + ASSERT_NOT_REACHED(); |
| + return emptyAtom; |
| +} |
| + |
| +} // namespace |
| + |
| using namespace HTMLNames; |
| // The link drag hysteresis is much larger than the others because there |
| @@ -971,13 +1030,7 @@ bool EventHandler::handleMousePressEvent(const PlatformMouseEvent& mouseEvent) |
| m_frame->selection().setCaretBlinkingSuspended(true); |
| - bool swallowEvent = dispatchPointerEventForMouseEvent(mev.innerNode(), EventTypeNames::pointerdown, mouseEvent); |
| - |
| - if (swallowEvent) { |
| - m_preventMouseEventForPointerTypeMouse = true; |
| - } |
| - if (!m_preventMouseEventForPointerTypeMouse) |
| - swallowEvent = swallowEvent || !dispatchMouseEvent(EventTypeNames::mousedown, mev.innerNode(), m_clickCount, mouseEvent); |
| + bool swallowEvent = dispatchPointerAndMouseEvent(EventTypeNames::mousedown, mev.innerNode(), m_clickCount, mouseEvent); |
| // m_selectionInitiationState is initialized after dispatching mousedown |
| // event in order not to keep the selection by DOM APIs Because we can't |
| @@ -1111,7 +1164,7 @@ bool EventHandler::handleMouseMoveOrLeaveEvent(const PlatformMouseEvent& mouseEv |
| } |
| if (m_frameSetBeingResized) |
| - return !dispatchMouseEvent(EventTypeNames::mousemove, m_frameSetBeingResized.get(), 0, mouseEvent); |
| + return dispatchPointerAndMouseEvent(EventTypeNames::mousemove, m_frameSetBeingResized.get(), 0, mouseEvent); |
| // Send events right to a scrollbar if the mouse is pressed. |
| if (m_lastScrollbarUnderMouse && m_mousePressed) { |
| @@ -1193,7 +1246,8 @@ bool EventHandler::handleMouseMoveOrLeaveEvent(const PlatformMouseEvent& mouseEv |
| if (swallowEvent) |
| return true; |
| - swallowEvent = !dispatchMouseEvent(EventTypeNames::mousemove, mev.innerNode(), 0, mouseEvent); |
| + swallowEvent = dispatchPointerAndMouseEvent(EventTypeNames::mousemove, mev.innerNode(), 0, mouseEvent); |
| + |
| if (!swallowEvent) |
| swallowEvent = handleMouseDraggedEvent(mev); |
| @@ -1246,12 +1300,12 @@ bool EventHandler::handleMouseReleaseEvent(const PlatformMouseEvent& mouseEvent) |
| } |
| if (m_frameSetBeingResized) |
| - return !dispatchMouseEvent(EventTypeNames::mouseup, m_frameSetBeingResized.get(), m_clickCount, mouseEvent); |
| + return dispatchMouseEvent(EventTypeNames::mouseup, m_frameSetBeingResized.get(), m_clickCount, mouseEvent); |
| if (m_lastScrollbarUnderMouse) { |
| invalidateClick(); |
| m_lastScrollbarUnderMouse->mouseUp(mouseEvent); |
| - return !dispatchMouseEvent(EventTypeNames::mouseup, m_nodeUnderMouse.get(), m_clickCount, mouseEvent); |
| + return dispatchMouseEvent(EventTypeNames::mouseup, m_nodeUnderMouse.get(), m_clickCount, mouseEvent); |
| } |
| // Mouse events simulated from touch should not hit-test again. |
| @@ -1266,14 +1320,10 @@ bool EventHandler::handleMouseReleaseEvent(const PlatformMouseEvent& mouseEvent) |
| if (subframe && passMouseReleaseEventToSubframe(mev, subframe)) |
| return true; |
| - bool swallowPointerUpEvent = dispatchPointerEventForMouseEvent(mev.innerNode(), EventTypeNames::pointerup, mouseEvent); |
| - bool swallowMouseUpEvent = false; |
| - if (!m_preventMouseEventForPointerTypeMouse) { |
| - swallowMouseUpEvent = !dispatchMouseEvent(EventTypeNames::mouseup, mev.innerNode(), m_clickCount, mouseEvent); |
| - } else { |
| - // TODO(crbug/545647): This state should reset with pointercancel too. |
| - m_preventMouseEventForPointerTypeMouse = false; |
| - } |
| + bool swallowUpEvent = dispatchPointerAndMouseEvent(EventTypeNames::mouseup, mev.innerNode(), m_clickCount, mouseEvent); |
| + |
| + // TODO(crbug/545647): This state should reset with pointercancel too. |
| + m_preventMouseEventForPointerTypeMouse = false; |
| bool contextMenuEvent = mouseEvent.button() == RightButton; |
| #if OS(MACOSX) |
| @@ -1308,12 +1358,12 @@ bool EventHandler::handleMouseReleaseEvent(const PlatformMouseEvent& mouseEvent) |
| } |
| bool swallowMouseReleaseEvent = false; |
| - if (!swallowPointerUpEvent && !swallowMouseUpEvent) |
| + if (!swallowUpEvent) |
| swallowMouseReleaseEvent = handleMouseReleaseEvent(mev); |
| invalidateClick(); |
| - return swallowPointerUpEvent || swallowMouseUpEvent || swallowClickEvent || swallowMouseReleaseEvent; |
| + return swallowUpEvent || swallowClickEvent || swallowMouseReleaseEvent; |
| } |
| bool EventHandler::dispatchDragEvent(const AtomicString& eventType, Node* dragTarget, const PlatformMouseEvent& event, DataTransfer* dataTransfer) |
| @@ -1677,14 +1727,37 @@ void EventHandler::sendMouseEventsForNodeTransition(Node* exitedNode, Node* ente |
| } |
| } |
| -// The return value means 'continue default handling.' |
| bool EventHandler::dispatchMouseEvent(const AtomicString& eventType, Node* targetNode, int clickCount, const PlatformMouseEvent& mouseEvent) |
|
Rick Byers
2015/10/30 17:21:29
So the pattern you're going for is that all EventH
mustaq
2015/11/03 20:44:30
Done. You are right: dispatchDragSrcEvent is the o
|
| { |
| updateMouseEventTargetNode(targetNode, mouseEvent); |
| - return !m_nodeUnderMouse || m_nodeUnderMouse->dispatchMouseEvent(mouseEvent, eventType, clickCount); |
| + return m_nodeUnderMouse && !m_nodeUnderMouse->dispatchMouseEvent(mouseEvent, eventType, clickCount); |
| +} |
| + |
| +bool EventHandler::dispatchPointerAndMouseEvent(const AtomicString& mouseEventType, Node* targetNode, int clickCount, const PlatformMouseEvent& mouseEvent) |
|
Rick Byers
2015/10/30 17:21:29
In the spirit of working towards pulling all mouse
mustaq
2015/11/03 20:44:30
I think the confusion is caused by the similar loo
Rick Byers
2015/11/03 20:59:56
I'd still like to untangle the mouse event support
mustaq
2015/11/03 21:37:34
Yes, your PE-driving-ME-dispatch suggestion made p
|
| +{ |
| + ASSERT(mouseEventType == EventTypeNames::mousedown |
| + || mouseEventType == EventTypeNames::mousemove |
| + || mouseEventType == EventTypeNames::mouseup); |
| + |
| + updateMouseEventTargetNode(targetNode, mouseEvent); |
| + if (!m_nodeUnderMouse) |
| + return false; |
| + |
| + bool swallowEvent = dispatchPointerEventForMouseEvent(m_nodeUnderMouse.get(), |
| + pointerEventNameForMouseEventName(mouseEventType), |
| + mouseEvent); |
| + |
| + if (swallowEvent && mouseEventType == EventTypeNames::mousedown) { |
| + m_preventMouseEventForPointerTypeMouse = true; |
| + } |
| + |
| + if (!m_preventMouseEventForPointerTypeMouse) { |
| + swallowEvent |= !m_nodeUnderMouse->dispatchMouseEvent(mouseEvent, mouseEventType, clickCount); |
| + } |
| + |
| + return swallowEvent; |
| } |
| -// The return value means 'swallow event' (was handled), as for other handle* functions. |
| bool EventHandler::handleMouseFocus(const MouseEventWithHitTestResults& targetedEvent, InputDeviceCapabilities* sourceCapabilities) |
| { |
| // If clicking on a frame scrollbar, do not mess up with content focus. |
| @@ -2126,7 +2199,7 @@ bool EventHandler::handleGestureTap(const GestureEventWithHitTestResults& target |
| LeftButton, PlatformEvent::MousePressed, gestureEvent.tapCount(), |
| static_cast<PlatformEvent::Modifiers>(modifiers | PlatformEvent::LeftButtonDown), |
| PlatformMouseEvent::FromTouch, gestureEvent.timestamp()); |
| - bool swallowMouseDownEvent = !dispatchMouseEvent(EventTypeNames::mousedown, currentHitTest.innerNode(), gestureEvent.tapCount(), fakeMouseDown); |
| + bool swallowMouseDownEvent = dispatchMouseEvent(EventTypeNames::mousedown, currentHitTest.innerNode(), gestureEvent.tapCount(), fakeMouseDown); |
| selectionController().initializeSelectionState(); |
| if (!swallowMouseDownEvent) |
| swallowMouseDownEvent = handleMouseFocus(MouseEventWithHitTestResults(fakeMouseDown, currentHitTest), InputDeviceCapabilities::firesTouchEventsSourceCapabilities()); |
| @@ -2152,7 +2225,7 @@ bool EventHandler::handleGestureTap(const GestureEventWithHitTestResults& target |
| LeftButton, PlatformEvent::MouseReleased, gestureEvent.tapCount(), |
| static_cast<PlatformEvent::Modifiers>(modifiers), |
| PlatformMouseEvent::FromTouch, gestureEvent.timestamp()); |
| - bool swallowMouseUpEvent = !dispatchMouseEvent(EventTypeNames::mouseup, currentHitTest.innerNode(), gestureEvent.tapCount(), fakeMouseUp); |
| + bool swallowMouseUpEvent = dispatchMouseEvent(EventTypeNames::mouseup, currentHitTest.innerNode(), gestureEvent.tapCount(), fakeMouseUp); |
| bool swallowClickEvent = false; |
| if (m_clickNode) { |
| @@ -2164,7 +2237,7 @@ bool EventHandler::handleGestureTap(const GestureEventWithHitTestResults& target |
| // because commonAncestor() will exit early if their documents are different. |
| m_clickNode->updateDistribution(); |
| Node* clickTargetNode = currentHitTest.innerNode()->commonAncestor(*m_clickNode, parentForClickEvent); |
| - swallowClickEvent = !dispatchMouseEvent(EventTypeNames::click, clickTargetNode, gestureEvent.tapCount(), fakeMouseUp); |
| + swallowClickEvent = dispatchMouseEvent(EventTypeNames::click, clickTargetNode, gestureEvent.tapCount(), fakeMouseUp); |
| } |
| m_clickNode = nullptr; |
| } |
| @@ -2811,7 +2884,7 @@ bool EventHandler::sendContextMenuEvent(const PlatformMouseEvent& event, Node* o |
| selectionController().sendContextMenuEvent(mev, positionInContents); |
| Node* targetNode = overrideTargetNode ? overrideTargetNode : mev.innerNode(); |
| - return !dispatchMouseEvent(EventTypeNames::contextmenu, targetNode, 0, event); |
| + return dispatchMouseEvent(EventTypeNames::contextmenu, targetNode, 0, event); |
| } |
| bool EventHandler::sendContextMenuEventForKey(Element* overrideTargetElement) |
| @@ -3554,44 +3627,6 @@ void EventHandler::updateLastScrollbarUnderMouse(Scrollbar* scrollbar, bool setL |
| } |
| } |
| -static const AtomicString& touchEventNameForTouchPointState(PlatformTouchPoint::State state) |
| -{ |
| - switch (state) { |
| - case PlatformTouchPoint::TouchReleased: |
| - return EventTypeNames::touchend; |
| - case PlatformTouchPoint::TouchCancelled: |
| - return EventTypeNames::touchcancel; |
| - case PlatformTouchPoint::TouchPressed: |
| - return EventTypeNames::touchstart; |
| - case PlatformTouchPoint::TouchMoved: |
| - return EventTypeNames::touchmove; |
| - case PlatformTouchPoint::TouchStationary: |
| - // Fall through to default |
| - default: |
| - ASSERT_NOT_REACHED(); |
| - return emptyAtom; |
| - } |
| -} |
| - |
| -static const AtomicString& pointerEventNameForTouchPointState(PlatformTouchPoint::State state) |
| -{ |
| - switch (state) { |
| - case PlatformTouchPoint::TouchReleased: |
| - return EventTypeNames::pointerup; |
| - case PlatformTouchPoint::TouchCancelled: |
| - return EventTypeNames::pointercancel; |
| - case PlatformTouchPoint::TouchPressed: |
| - return EventTypeNames::pointerdown; |
| - case PlatformTouchPoint::TouchMoved: |
| - return EventTypeNames::pointermove; |
| - case PlatformTouchPoint::TouchStationary: |
| - // Fall through to default |
| - default: |
| - ASSERT_NOT_REACHED(); |
| - return emptyAtom; |
| - } |
| -} |
| - |
| HitTestResult EventHandler::hitTestResultInFrame(LocalFrame* frame, const LayoutPoint& point, HitTestRequest::HitTestRequestType hitType) |
| { |
| HitTestResult result(HitTestRequest(hitType), point); |