Chromium Code Reviews| 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 2592c55c780ed7175c4a9d2e18c6f9e60fc3b550..2dcfe1362db38a0a73b8415e0446a04a1b1f44aa 100644 |
| --- a/third_party/WebKit/Source/core/input/EventHandler.cpp |
| +++ b/third_party/WebKit/Source/core/input/EventHandler.cpp |
| @@ -1661,9 +1661,14 @@ void EventHandler::sendNodeTransitionEvents(Node* exitedNode, Node* enteredNode, |
| { |
| ASSERT(exitedNode != enteredNode); |
| - // Dispatch pointerout/mouseout events |
| - if (isNodeInDocument(exitedNode)) { |
| - sendPointerAndMouseTransitionEvents(exitedNode, EventTypeNames::mouseout, mouseEvent, enteredNode, false); |
| + if (m_pointerEventManager.getMouseCapturingNode()) { |
| + EventTarget* target = m_pointerEventManager.getMouseCapturingNode(); |
|
mustaq
2016/02/06 04:36:31
s/target/capturingNode/
Navid Zolghadr
2016/02/08 15:58:43
Done.
|
| + if (target == exitedNode) |
| + enteredNode = nullptr; |
| + else if (target == enteredNode) |
| + exitedNode = nullptr; |
|
mustaq
2016/02/06 04:36:31
Perhaps this won't happen but not sure: any chance
Navid Zolghadr
2016/02/08 15:58:43
Do you have any particular scenario in mind? I can
|
| + else |
| + return; |
| } |
| // A note on mouseenter and mouseleave: These are non-bubbling events, and they are dispatched if there |
| @@ -1696,6 +1701,11 @@ void EventHandler::sendNodeTransitionEvents(Node* exitedNode, Node* enteredNode, |
| } |
| } |
| + // Dispatch pointerout/mouseout events |
| + if (isNodeInDocument(exitedNode)) { |
| + sendPointerAndMouseTransitionEvents(exitedNode, EventTypeNames::mouseout, mouseEvent, enteredNode, false); |
| + } |
| + |
| size_t numExitedAncestors = exitedAncestors.size(); |
| size_t numEnteredAncestors = enteredAncestors.size(); |
| @@ -1758,6 +1768,26 @@ WebInputEventResult EventHandler::dispatchMouseEvent(const AtomicString& eventTy |
| return eventToEventResult(event, dispatchResult); |
| } |
| +bool EventHandler::isPointerEventActive(int pointerId) |
| +{ |
| + return m_pointerEventManager.isActive(pointerId); |
| +} |
| + |
| +void EventHandler::setPointerCapture(int pointerId, EventTarget* target) |
| +{ |
| + m_pointerEventManager.setPointerCapture(pointerId, target); |
| +} |
| + |
| +void EventHandler::releasePointerCapture(int pointerId, EventTarget* target) |
| +{ |
| + m_pointerEventManager.releasePointerCapture(pointerId, target); |
| +} |
| + |
| +void EventHandler::elementRemoved(EventTarget* target) |
| +{ |
| + m_pointerEventManager.elementRemoved(target); |
| +} |
| + |
| EventTarget* EventHandler::getEffectiveTargetForPointerEvent( |
| EventTarget* target, PassRefPtrWillBeRawPtr<PointerEvent> pointerEvent) |
| { |
| @@ -1779,8 +1809,16 @@ void EventHandler::sendPointerAndMouseTransitionEvents(Node* target, const Atomi |
| RefPtrWillBeRawPtr<PointerEvent> pointerEvent = m_pointerEventManager.create(pointerEventType, |
| mouseEvent, relatedTarget, m_frame->document()->domWindow()); |
| - // Suppress these events if the target is not the capturing element |
| - if (target != getEffectiveTargetForPointerEvent(target, pointerEvent)) |
| + |
| + int isAncestor = false; |
|
mustaq
2016/02/06 04:36:31
I guess you can avoid the loop below for mouseover
Navid Zolghadr
2016/02/08 15:58:43
I believe I can get rid of this for now as the cha
|
| + for (Node* node = target; node; node = ComposedTreeTraversal::parent(*node)) { |
| + if (node == target) { |
|
mustaq
2016/02/06 04:36:31
I think the loop should start at node = capturingN
|
| + isAncestor = true; |
| + break; |
| + } |
| + } |
| + // Suppress these events if the target is not the capturing element inclusive ancestors |
|
mustaq
2016/02/06 04:36:31
Is it clearer?
"...if target is not an (inclusive)
|
| + if (!isAncestor) |
| return; |
| if (!checkForListener || target->hasEventListeners(pointerEventType)) |
| @@ -1824,6 +1862,9 @@ WebInputEventResult EventHandler::updatePointerTargetAndDispatchEvents(const Ato |
| result = mergeEventResult(result, eventToEventResult(event, dispatchResult)); |
| } |
| + if (pointerEvent->buttons() == 0) |
| + m_pointerEventManager.implicitReleasePointerCapture(pointerEvent->pointerId()); |
| + |
| return result; |
| } |