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

Unified Diff: third_party/WebKit/Source/core/input/EventHandler.cpp

Issue 1635863006: Pointerevent capture APIs (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 11 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: 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;
}

Powered by Google App Engine
This is Rietveld 408576698