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