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

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

Issue 1425053002: Fire pointermoves for mousemove events. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Tweaked the tests. Created 5 years, 2 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/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);

Powered by Google App Engine
This is Rietveld 408576698