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