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); |