| Index: Source/core/input/EventHandler.cpp
|
| diff --git a/Source/core/input/EventHandler.cpp b/Source/core/input/EventHandler.cpp
|
| index 006aa2c40a9b7a45bfea777b122a31c3acd2a0e9..9576c8bff491641bea1524683fdc2493de98e9e8 100644
|
| --- a/Source/core/input/EventHandler.cpp
|
| +++ b/Source/core/input/EventHandler.cpp
|
| @@ -253,7 +253,6 @@ DEFINE_TRACE(EventHandler)
|
| visitor->trace(m_resizeScrollableArea);
|
| visitor->trace(m_capturingMouseEventsNode);
|
| visitor->trace(m_nodeUnderMouse);
|
| - visitor->trace(m_lastNodeUnderMouse);
|
| visitor->trace(m_lastMouseMoveEventSubframe);
|
| visitor->trace(m_lastScrollbarUnderMouse);
|
| visitor->trace(m_clickNode);
|
| @@ -285,7 +284,6 @@ void EventHandler::clear()
|
| m_activeIntervalTimer.stop();
|
| m_resizeScrollableArea = nullptr;
|
| m_nodeUnderMouse = nullptr;
|
| - m_lastNodeUnderMouse = nullptr;
|
| m_lastMouseMoveEventSubframe = nullptr;
|
| m_lastScrollbarUnderMouse = nullptr;
|
| m_clickCount = 0;
|
| @@ -965,7 +963,7 @@ bool EventHandler::handleMousePressEvent(const PlatformMouseEvent& mouseEvent)
|
|
|
| m_frame->selection().setCaretBlinkingSuspended(true);
|
|
|
| - bool swallowEvent = !dispatchMouseEvent(EventTypeNames::mousedown, mev.innerNode(), m_clickCount, mouseEvent, true);
|
| + bool swallowEvent = !dispatchMouseEvent(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
|
| // give the user the chance to handle the selection by user action like
|
| @@ -1094,7 +1092,7 @@ bool EventHandler::handleMouseMoveOrLeaveEvent(const PlatformMouseEvent& mouseEv
|
| }
|
|
|
| if (m_frameSetBeingResized)
|
| - return !dispatchMouseEvent(EventTypeNames::mousemove, m_frameSetBeingResized.get(), 0, mouseEvent, false);
|
| + return !dispatchMouseEvent(EventTypeNames::mousemove, m_frameSetBeingResized.get(), 0, mouseEvent);
|
|
|
| // Send events right to a scrollbar if the mouse is pressed.
|
| if (m_lastScrollbarUnderMouse && m_mousePressed) {
|
| @@ -1154,7 +1152,7 @@ bool EventHandler::handleMouseMoveOrLeaveEvent(const PlatformMouseEvent& mouseEv
|
|
|
| if (newSubframe) {
|
| // Update over/out state before passing the event to the subframe.
|
| - updateMouseEventTargetNode(mev.innerNode(), mouseEvent, true);
|
| + updateMouseEventTargetNode(mev.innerNode(), mouseEvent);
|
|
|
| // Event dispatch in updateMouseEventTargetNode may have caused the subframe of the target
|
| // node to be detached from its FrameView, in which case the event should not be passed.
|
| @@ -1176,7 +1174,7 @@ bool EventHandler::handleMouseMoveOrLeaveEvent(const PlatformMouseEvent& mouseEv
|
| if (swallowEvent)
|
| return true;
|
|
|
| - swallowEvent = !dispatchMouseEvent(EventTypeNames::mousemove, mev.innerNode(), 0, mouseEvent, true);
|
| + swallowEvent = !dispatchMouseEvent(EventTypeNames::mousemove, mev.innerNode(), 0, mouseEvent);
|
| if (!swallowEvent)
|
| swallowEvent = handleMouseDraggedEvent(mev);
|
|
|
| @@ -1229,13 +1227,12 @@ bool EventHandler::handleMouseReleaseEvent(const PlatformMouseEvent& mouseEvent)
|
| }
|
|
|
| if (m_frameSetBeingResized)
|
| - return !dispatchMouseEvent(EventTypeNames::mouseup, m_frameSetBeingResized.get(), m_clickCount, mouseEvent, false);
|
| + return !dispatchMouseEvent(EventTypeNames::mouseup, m_frameSetBeingResized.get(), m_clickCount, mouseEvent);
|
|
|
| if (m_lastScrollbarUnderMouse) {
|
| invalidateClick();
|
| m_lastScrollbarUnderMouse->mouseUp(mouseEvent);
|
| - bool setUnder = false;
|
| - return !dispatchMouseEvent(EventTypeNames::mouseup, m_nodeUnderMouse.get(), m_clickCount, mouseEvent, setUnder);
|
| + return !dispatchMouseEvent(EventTypeNames::mouseup, m_nodeUnderMouse.get(), m_clickCount, mouseEvent);
|
| }
|
|
|
| // Mouse events simulated from touch should not hit-test again.
|
| @@ -1250,7 +1247,7 @@ bool EventHandler::handleMouseReleaseEvent(const PlatformMouseEvent& mouseEvent)
|
| if (subframe && passMouseReleaseEventToSubframe(mev, subframe))
|
| return true;
|
|
|
| - bool swallowMouseUpEvent = !dispatchMouseEvent(EventTypeNames::mouseup, mev.innerNode(), m_clickCount, mouseEvent, false);
|
| + bool swallowMouseUpEvent = !dispatchMouseEvent(EventTypeNames::mouseup, mev.innerNode(), m_clickCount, mouseEvent);
|
|
|
| bool contextMenuEvent = mouseEvent.button() == RightButton;
|
| #if OS(MACOSX)
|
| @@ -1268,7 +1265,7 @@ bool EventHandler::handleMouseReleaseEvent(const PlatformMouseEvent& mouseEvent)
|
| // because commonAncestor() will exit early if their documents are different.
|
| m_clickNode->updateDistribution();
|
| if (Node* clickTargetNode = mev.innerNode()->commonAncestor(*m_clickNode, parentForClickEvent))
|
| - swallowClickEvent = !dispatchMouseEvent(EventTypeNames::click, clickTargetNode, m_clickCount, mouseEvent, true);
|
| + swallowClickEvent = !dispatchMouseEvent(EventTypeNames::click, clickTargetNode, m_clickCount, mouseEvent);
|
| }
|
|
|
| if (m_resizeScrollableArea) {
|
| @@ -1479,7 +1476,7 @@ MouseEventWithHitTestResults EventHandler::prepareMouseEvent(const HitTestReques
|
| return m_frame->document()->prepareMouseEvent(request, contentPointFromRootFrame(m_frame, mev.position()), mev);
|
| }
|
|
|
| -void EventHandler::updateMouseEventTargetNode(Node* targetNode, const PlatformMouseEvent& mouseEvent, bool fireMouseEvents)
|
| +void EventHandler::updateMouseEventTargetNode(Node* targetNode, const PlatformMouseEvent& mouseEvent)
|
| {
|
| Node* result = targetNode;
|
|
|
| @@ -1491,47 +1488,44 @@ void EventHandler::updateMouseEventTargetNode(Node* targetNode, const PlatformMo
|
| if (result && result->isTextNode())
|
| result = ComposedTreeTraversal::parent(*result);
|
| }
|
| + RefPtrWillBeMember<Node> lastNodeUnderMouse = m_nodeUnderMouse;
|
| m_nodeUnderMouse = result;
|
|
|
| - if (fireMouseEvents) {
|
| - DeprecatedPaintLayer* layerForLastNode = layerForNode(m_lastNodeUnderMouse.get());
|
| - DeprecatedPaintLayer* layerForNodeUnderMouse = layerForNode(m_nodeUnderMouse.get());
|
| - Page* page = m_frame->page();
|
| -
|
| - if (m_lastNodeUnderMouse && (!m_nodeUnderMouse || m_nodeUnderMouse->document() != m_frame->document())) {
|
| - // The mouse has moved between frames.
|
| - if (LocalFrame* frame = m_lastNodeUnderMouse->document().frame()) {
|
| - if (FrameView* frameView = frame->view())
|
| - frameView->mouseExitedContentArea();
|
| - }
|
| - } else if (page && (layerForLastNode && (!layerForNodeUnderMouse || layerForNodeUnderMouse != layerForLastNode))) {
|
| - // The mouse has moved between layers.
|
| - if (ScrollableArea* scrollableAreaForLastNode = associatedScrollableArea(layerForLastNode))
|
| - scrollableAreaForLastNode->mouseExitedContentArea();
|
| - }
|
| + DeprecatedPaintLayer* layerForLastNode = layerForNode(lastNodeUnderMouse.get());
|
| + DeprecatedPaintLayer* layerForNodeUnderMouse = layerForNode(m_nodeUnderMouse.get());
|
| + Page* page = m_frame->page();
|
|
|
| - if (m_nodeUnderMouse && (!m_lastNodeUnderMouse || m_lastNodeUnderMouse->document() != m_frame->document())) {
|
| - // The mouse has moved between frames.
|
| - if (LocalFrame* frame = m_nodeUnderMouse->document().frame()) {
|
| - if (FrameView* frameView = frame->view())
|
| - frameView->mouseEnteredContentArea();
|
| - }
|
| - } else if (page && (layerForNodeUnderMouse && (!layerForLastNode || layerForNodeUnderMouse != layerForLastNode))) {
|
| - // The mouse has moved between layers.
|
| - if (ScrollableArea* scrollableAreaForNodeUnderMouse = associatedScrollableArea(layerForNodeUnderMouse))
|
| - scrollableAreaForNodeUnderMouse->mouseEnteredContentArea();
|
| + if (lastNodeUnderMouse && (!m_nodeUnderMouse || m_nodeUnderMouse->document() != m_frame->document())) {
|
| + // The mouse has moved between frames.
|
| + if (LocalFrame* frame = lastNodeUnderMouse->document().frame()) {
|
| + if (FrameView* frameView = frame->view())
|
| + frameView->mouseExitedContentArea();
|
| }
|
| + } else if (page && (layerForLastNode && (!layerForNodeUnderMouse || layerForNodeUnderMouse != layerForLastNode))) {
|
| + // The mouse has moved between layers.
|
| + if (ScrollableArea* scrollableAreaForLastNode = associatedScrollableArea(layerForLastNode))
|
| + scrollableAreaForLastNode->mouseExitedContentArea();
|
| + }
|
|
|
| - if (m_lastNodeUnderMouse && m_lastNodeUnderMouse->document() != m_frame->document()) {
|
| - m_lastNodeUnderMouse = nullptr;
|
| - m_lastScrollbarUnderMouse = nullptr;
|
| + if (m_nodeUnderMouse && (!lastNodeUnderMouse || lastNodeUnderMouse->document() != m_frame->document())) {
|
| + // The mouse has moved between frames.
|
| + if (LocalFrame* frame = m_nodeUnderMouse->document().frame()) {
|
| + if (FrameView* frameView = frame->view())
|
| + frameView->mouseEnteredContentArea();
|
| }
|
| + } else if (page && (layerForNodeUnderMouse && (!layerForLastNode || layerForNodeUnderMouse != layerForLastNode))) {
|
| + // The mouse has moved between layers.
|
| + if (ScrollableArea* scrollableAreaForNodeUnderMouse = associatedScrollableArea(layerForNodeUnderMouse))
|
| + scrollableAreaForNodeUnderMouse->mouseEnteredContentArea();
|
| + }
|
|
|
| - if (m_lastNodeUnderMouse != m_nodeUnderMouse)
|
| - sendMouseEventsForNodeTransition(m_lastNodeUnderMouse.get(), m_nodeUnderMouse.get(), mouseEvent);
|
| -
|
| - m_lastNodeUnderMouse = m_nodeUnderMouse;
|
| + if (lastNodeUnderMouse && lastNodeUnderMouse->document() != m_frame->document()) {
|
| + lastNodeUnderMouse = nullptr;
|
| + m_lastScrollbarUnderMouse = nullptr;
|
| }
|
| +
|
| + if (lastNodeUnderMouse != m_nodeUnderMouse)
|
| + sendMouseEventsForNodeTransition(lastNodeUnderMouse.get(), m_nodeUnderMouse.get(), mouseEvent);
|
| }
|
|
|
| void EventHandler::sendMouseEventsForNodeTransition(Node* exitedNode, Node* enteredNode, const PlatformMouseEvent& mouseEvent)
|
| @@ -1623,10 +1617,9 @@ void EventHandler::sendMouseEventsForNodeTransition(Node* exitedNode, Node* ente
|
| }
|
|
|
| // The return value means 'continue default handling.'
|
| -// TODO(mustaq): setUnder needs a more informative name.
|
| -bool EventHandler::dispatchMouseEvent(const AtomicString& eventType, Node* targetNode, int clickCount, const PlatformMouseEvent& mouseEvent, bool setUnder)
|
| +bool EventHandler::dispatchMouseEvent(const AtomicString& eventType, Node* targetNode, int clickCount, const PlatformMouseEvent& mouseEvent)
|
| {
|
| - updateMouseEventTargetNode(targetNode, mouseEvent, setUnder);
|
| + updateMouseEventTargetNode(targetNode, mouseEvent);
|
| return !m_nodeUnderMouse || m_nodeUnderMouse->dispatchMouseEvent(mouseEvent, eventType, clickCount);
|
| }
|
|
|
| @@ -2005,7 +1998,7 @@ bool EventHandler::handleGestureTap(const GestureEventWithHitTestResults& target
|
| NoButton, PlatformEvent::MouseMoved, /* clickCount */ 0,
|
| static_cast<PlatformEvent::Modifiers>(modifiers),
|
| PlatformMouseEvent::FromTouch, gestureEvent.timestamp());
|
| - dispatchMouseEvent(EventTypeNames::mousemove, currentHitTest.innerNode(), 0, fakeMouseMove, true);
|
| + dispatchMouseEvent(EventTypeNames::mousemove, currentHitTest.innerNode(), 0, fakeMouseMove);
|
|
|
| // Do a new hit-test in case the mousemove event changed the DOM.
|
| // Note that if the original hit test wasn't over an element (eg. was over a scrollbar) we
|
| @@ -2034,7 +2027,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, true);
|
| + bool swallowMouseDownEvent = !dispatchMouseEvent(EventTypeNames::mousedown, currentHitTest.innerNode(), gestureEvent.tapCount(), fakeMouseDown);
|
| selectionController().initializeSelectionState();
|
| if (!swallowMouseDownEvent)
|
| swallowMouseDownEvent = handleMouseFocus(MouseEventWithHitTestResults(fakeMouseDown, currentHitTest), InputDeviceCapabilities::firesTouchEventsSourceCapabilities());
|
| @@ -2060,7 +2053,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, false);
|
| + bool swallowMouseUpEvent = !dispatchMouseEvent(EventTypeNames::mouseup, currentHitTest.innerNode(), gestureEvent.tapCount(), fakeMouseUp);
|
|
|
| bool swallowClickEvent = false;
|
| if (m_clickNode) {
|
| @@ -2072,7 +2065,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, true);
|
| + swallowClickEvent = !dispatchMouseEvent(EventTypeNames::click, clickTargetNode, gestureEvent.tapCount(), fakeMouseUp);
|
| }
|
| m_clickNode = nullptr;
|
| }
|
| @@ -2524,7 +2517,7 @@ void EventHandler::updateGestureTargetNodeForMouseEvent(const GestureEventWithHi
|
| WillBeHeapVector<LocalFrame*> exitedFrameChain;
|
| // Insert the frame from the disagreement between last frames and entered frames
|
| while (exitedFrameInDocument) {
|
| - Node* lastNodeUnderTap = exitedFrameInDocument->eventHandler().m_lastNodeUnderMouse.get();
|
| + Node* lastNodeUnderTap = exitedFrameInDocument->eventHandler().m_nodeUnderMouse.get();
|
| if (!lastNodeUnderTap)
|
| break;
|
|
|
| @@ -2558,14 +2551,14 @@ void EventHandler::updateGestureTargetNodeForMouseEvent(const GestureEventWithHi
|
| size_t indexExitedFrameChain = exitedFrameChain.size();
|
| while (indexExitedFrameChain) {
|
| LocalFrame* leaveFrame = exitedFrameChain[--indexExitedFrameChain];
|
| - leaveFrame->eventHandler().updateMouseEventTargetNode(nullptr, fakeMouseMove, true);
|
| + leaveFrame->eventHandler().updateMouseEventTargetNode(nullptr, fakeMouseMove);
|
| }
|
|
|
| // update the mouseover/mouseenter event
|
| while (indexEnteredFrameChain) {
|
| Frame* parentFrame = enteredFrameChain[--indexEnteredFrameChain]->tree().parent();
|
| if (parentFrame && parentFrame->isLocalFrame())
|
| - toLocalFrame(parentFrame)->eventHandler().updateMouseEventTargetNode(toHTMLFrameOwnerElement(enteredFrameChain[indexEnteredFrameChain]->owner()), fakeMouseMove, true);
|
| + toLocalFrame(parentFrame)->eventHandler().updateMouseEventTargetNode(toHTMLFrameOwnerElement(enteredFrameChain[indexEnteredFrameChain]->owner()), fakeMouseMove);
|
| }
|
| }
|
|
|
| @@ -2718,7 +2711,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, false);
|
| + return !dispatchMouseEvent(EventTypeNames::contextmenu, targetNode, 0, event);
|
| }
|
|
|
| bool EventHandler::sendContextMenuEventForKey(Element* overrideTargetElement)
|
| @@ -2804,7 +2797,7 @@ bool EventHandler::sendContextMenuEventForGesture(const GestureEventWithHitTestR
|
| NoButton, PlatformEvent::MouseMoved, /* clickCount */ 0,
|
| static_cast<PlatformEvent::Modifiers>(modifiers),
|
| PlatformMouseEvent::FromTouch, gestureEvent.timestamp());
|
| - dispatchMouseEvent(EventTypeNames::mousemove, targetedEvent.hitTestResult().innerNode(), 0, fakeMouseMove, true);
|
| + dispatchMouseEvent(EventTypeNames::mousemove, targetedEvent.hitTestResult().innerNode(), 0, fakeMouseMove);
|
|
|
| PlatformEvent::Type eventType = PlatformEvent::MousePressed;
|
|
|
|
|