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

Unified Diff: Source/core/page/EventHandler.cpp

Issue 353893002: Remove mouse-related hit tests during a GestureTap (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Add deleted-during-dispatch test Created 6 years, 6 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: Source/core/page/EventHandler.cpp
diff --git a/Source/core/page/EventHandler.cpp b/Source/core/page/EventHandler.cpp
index 877be689337ac9c3d27895b589886cf63208ea8f..7e6f1fec7f89c267d3e55c2f7a22a13a356a7a55 100644
--- a/Source/core/page/EventHandler.cpp
+++ b/Source/core/page/EventHandler.cpp
@@ -1227,10 +1227,10 @@ bool EventHandler::handleMousePressEvent(const PlatformMouseEvent& mouseEvent)
}
m_mouseDownWasInSubframe = false;
- HitTestRequest::HitTestRequestType hitType = HitTestRequest::Active;
- if (mouseEvent.fromTouch())
- hitType |= HitTestRequest::ReadOnly;
- HitTestRequest request(hitType);
+ // Mouse events simulated from touch should not hit-test again.
+ ASSERT(!mouseEvent.fromTouch());
+
+ HitTestRequest request(HitTestRequest::Active);
// Save the document point we generate in case the window coordinate is invalidated by what happens
// when we dispatch the event.
LayoutPoint documentPoint = documentPointForWindowPoint(m_frame, mouseEvent.position());
@@ -1409,10 +1409,10 @@ bool EventHandler::handleMouseMoveOrLeaveEvent(const PlatformMouseEvent& mouseEv
return true;
}
- HitTestRequest::HitTestRequestType hitType = HitTestRequest::Move;
- if (mouseEvent.fromTouch())
- hitType |= HitTestRequest::ReadOnly;
+ // Mouse events simulated from touch should not hit-test again.
+ ASSERT(!mouseEvent.fromTouch());
+ HitTestRequest::HitTestRequestType hitType = HitTestRequest::Move;
if (m_mousePressed)
hitType |= HitTestRequest::Active;
else if (onlyUpdateScrollbars) {
@@ -1540,9 +1540,10 @@ bool EventHandler::handleMouseReleaseEvent(const PlatformMouseEvent& mouseEvent)
return !dispatchMouseEvent(EventTypeNames::mouseup, m_lastNodeUnderMouse.get(), m_clickCount, mouseEvent, setUnder);
}
+ // Mouse events simulated from touch should not hit-test again.
+ ASSERT(!mouseEvent.fromTouch());
+
HitTestRequest::HitTestRequestType hitType = HitTestRequest::Release;
- if (mouseEvent.fromTouch())
- hitType |= HitTestRequest::ReadOnly;
HitTestRequest request(hitType);
MouseEventWithHitTestResults mev = prepareMouseEvent(request, mouseEvent);
LocalFrame* subframe = m_capturingMouseEventsNode.get() ? subframeForTargetNode(m_capturingMouseEventsNode.get()) : subframeForHitTestResult(mev);
@@ -2211,8 +2212,6 @@ bool EventHandler::handleGestureTap(const GestureEventWithHitTestResults& target
{
const PlatformGestureEvent& gestureEvent = targetedEvent.event();
- // FIXME: Refactor this code to not hit test multiple times. We use the adjusted position to ensure that the correct node is targeted by the later redundant hit tests.
-
unsigned modifierFlags = 0;
if (gestureEvent.altKey())
modifierFlags |= PlatformEvent::AltKey;
@@ -2224,25 +2223,28 @@ bool EventHandler::handleGestureTap(const GestureEventWithHitTestResults& target
modifierFlags |= PlatformEvent::ShiftKey;
PlatformEvent::Modifiers modifiers = static_cast<PlatformEvent::Modifiers>(modifierFlags);
+ // 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 = gestureEvent.position();
PlatformMouseEvent fakeMouseMove(adjustedPoint, gestureEvent.globalPosition(),
NoButton, PlatformEvent::MouseMoved, /* clickCount */ 0,
modifiers, PlatformMouseEvent::FromTouch, gestureEvent.timestamp());
- handleMouseMoveEvent(fakeMouseMove);
+ dispatchMouseEvent(EventTypeNames::mousemove, targetedEvent.targetNode(), 0, fakeMouseMove, true);
- bool defaultPrevented = false;
PlatformMouseEvent fakeMouseDown(adjustedPoint, gestureEvent.globalPosition(),
LeftButton, PlatformEvent::MousePressed, gestureEvent.tapCount(),
modifiers, PlatformMouseEvent::FromTouch, gestureEvent.timestamp());
- defaultPrevented |= handleMousePressEvent(fakeMouseDown);
+ bool swallowEvent = !dispatchMouseEvent(EventTypeNames::mousedown, targetedEvent.targetNode(), gestureEvent.tapCount(), fakeMouseDown, true);
+ swallowEvent = swallowEvent || !handleMouseFocus(fakeMouseDown);
PlatformMouseEvent fakeMouseUp(adjustedPoint, gestureEvent.globalPosition(),
LeftButton, PlatformEvent::MouseReleased, gestureEvent.tapCount(),
modifiers, PlatformMouseEvent::FromTouch, gestureEvent.timestamp());
- defaultPrevented |= handleMouseReleaseEvent(fakeMouseUp);
+ swallowEvent |= !dispatchMouseEvent(EventTypeNames::mouseup, targetedEvent.targetNode(), gestureEvent.tapCount(), fakeMouseUp, false);
+ swallowEvent |= !dispatchMouseEvent(EventTypeNames::click, targetedEvent.targetNode(), gestureEvent.tapCount(), fakeMouseUp, true);
- return defaultPrevented;
+ return swallowEvent;
}
bool EventHandler::handleGestureLongPress(const GestureEventWithHitTestResults& targetedEvent)

Powered by Google App Engine
This is Rietveld 408576698