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

Side by Side Diff: third_party/WebKit/Source/core/input/PointerEventManager.cpp

Issue 1949563002: Retarget mouse event if the target is removed (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Using event path Created 4 years, 7 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "core/input/PointerEventManager.h" 5 #include "core/input/PointerEventManager.h"
6 6
7 #include "core/dom/ElementTraversal.h" 7 #include "core/dom/ElementTraversal.h"
8 #include "core/dom/shadow/FlatTreeTraversal.h" 8 #include "core/dom/shadow/FlatTreeTraversal.h"
9 #include "core/events/MouseEvent.h" 9 #include "core/events/MouseEvent.h"
10 #include "core/html/HTMLCanvasElement.h" 10 #include "core/html/HTMLCanvasElement.h"
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 HTMLCanvasElement* canvas = Traversal<HTMLCanvasElement>::firstAncestorOrSel f(*element); 72 HTMLCanvasElement* canvas = Traversal<HTMLCanvasElement>::firstAncestorOrSel f(*element);
73 // In this case, the event target is canvas and mouse rerouting doesn't happ en. 73 // In this case, the event target is canvas and mouse rerouting doesn't happ en.
74 if (canvas == element) 74 if (canvas == element)
75 return mouseEvent; 75 return mouseEvent;
76 String region = canvas->getIdFromControl(element); 76 String region = canvas->getIdFromControl(element);
77 PlatformMouseEvent newMouseEvent = mouseEvent; 77 PlatformMouseEvent newMouseEvent = mouseEvent;
78 newMouseEvent.setRegion(region); 78 newMouseEvent.setRegion(region);
79 return newMouseEvent; 79 return newMouseEvent;
80 } 80 }
81 81
82 void buildAncestorChain(
83 EventTarget* target,
84 HeapVector<Member<Node>, 20>* ancestors)
85 {
86 if (!isInDocument(target))
87 return;
88 Node* targetNode = target->toNode();
89 DCHECK(targetNode);
90 targetNode->updateDistribution();
91 // Index 0 element in the ancestors arrays will be the corresponding
92 // target. So the root of their document will be their last element.
93 for (Node* node = targetNode; node; node = FlatTreeTraversal::parent(*node))
94 ancestors->append(node);
95 }
96
82 void buildAncestorChainsAndFindCommonAncestors( 97 void buildAncestorChainsAndFindCommonAncestors(
83 EventTarget* exitedTarget, EventTarget* enteredTarget, 98 EventTarget* exitedTarget, EventTarget* enteredTarget,
84 HeapVector<Member<Node>, 20>* exitedAncestorsOut, 99 HeapVector<Member<Node>, 20>* exitedAncestorsOut,
85 HeapVector<Member<Node>, 20>* enteredAncestorsOut, 100 HeapVector<Member<Node>, 20>* enteredAncestorsOut,
86 size_t* exitedAncestorsCommonParentIndexOut, 101 size_t* exitedAncestorsCommonParentIndexOut,
87 size_t* enteredAncestorsCommonParentIndexOut) 102 size_t* enteredAncestorsCommonParentIndexOut)
88 { 103 {
89 DCHECK(exitedAncestorsOut); 104 DCHECK(exitedAncestorsOut);
90 DCHECK(enteredAncestorsOut); 105 DCHECK(enteredAncestorsOut);
91 DCHECK(exitedAncestorsCommonParentIndexOut); 106 DCHECK(exitedAncestorsCommonParentIndexOut);
92 DCHECK(enteredAncestorsCommonParentIndexOut); 107 DCHECK(enteredAncestorsCommonParentIndexOut);
93 108
94 // Index 0 element in the ancestors arrays will be the corresponding 109 buildAncestorChain(exitedTarget, exitedAncestorsOut);
95 // target. So the root of their document will be their last element. 110 buildAncestorChain(enteredTarget, enteredAncestorsOut);
96
97 if (isInDocument(exitedTarget)) {
98 Node* exitedNode = exitedTarget->toNode();
99 DCHECK(exitedNode);
100 exitedNode->updateDistribution();
101 for (Node* node = exitedNode; node; node = FlatTreeTraversal::parent(*no de))
102 exitedAncestorsOut->append(node);
103 }
104
105 if (isInDocument(enteredTarget)) {
106 Node* enteredNode = enteredTarget->toNode();
107 DCHECK(enteredNode);
108 enteredNode->updateDistribution();
109 for (Node* node = enteredNode; node; node = FlatTreeTraversal::parent(*n ode))
110 enteredAncestorsOut->append(node);
111 }
112 111
113 *exitedAncestorsCommonParentIndexOut = exitedAncestorsOut->size(); 112 *exitedAncestorsCommonParentIndexOut = exitedAncestorsOut->size();
114 *enteredAncestorsCommonParentIndexOut = enteredAncestorsOut->size(); 113 *enteredAncestorsCommonParentIndexOut = enteredAncestorsOut->size();
115 while (*exitedAncestorsCommonParentIndexOut > 0 114 while (*exitedAncestorsCommonParentIndexOut > 0
116 && *enteredAncestorsCommonParentIndexOut > 0) { 115 && *enteredAncestorsCommonParentIndexOut > 0) {
117 if ((*exitedAncestorsOut)[(*exitedAncestorsCommonParentIndexOut)-1] 116 if ((*exitedAncestorsOut)[(*exitedAncestorsCommonParentIndexOut)-1]
118 != (*enteredAncestorsOut)[(*enteredAncestorsCommonParentIndexOut)-1] ) 117 != (*enteredAncestorsOut)[(*enteredAncestorsCommonParentIndexOut)-1] )
119 break; 118 break;
120 (*exitedAncestorsCommonParentIndexOut)--; 119 (*exitedAncestorsCommonParentIndexOut)--;
121 (*enteredAncestorsCommonParentIndexOut)--; 120 (*enteredAncestorsCommonParentIndexOut)--;
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after
445 444
446 if (result != WebInputEventResult::NotHandled 445 if (result != WebInputEventResult::NotHandled
447 && pointerEvent->type() == EventTypeNames::pointerdown 446 && pointerEvent->type() == EventTypeNames::pointerdown
448 && pointerEvent->isPrimary()) { 447 && pointerEvent->isPrimary()) {
449 m_preventMouseEventForPointerType[toPointerTypeIndex( 448 m_preventMouseEventForPointerType[toPointerTypeIndex(
450 mouseEvent.pointerProperties().pointerType)] = true; 449 mouseEvent.pointerProperties().pointerType)] = true;
451 } 450 }
452 451
453 if (pointerEvent->isPrimary() && !m_preventMouseEventForPointerType[toPointe rTypeIndex( 452 if (pointerEvent->isPrimary() && !m_preventMouseEventForPointerType[toPointe rTypeIndex(
454 mouseEvent.pointerProperties().pointerType)]) { 453 mouseEvent.pointerProperties().pointerType)]) {
454 EventTarget* mouseTarget = effectiveTarget;
mustaq 2016/05/05 15:31:02 Can we ever have both of these false? - isInDocume
Navid Zolghadr 2016/05/06 15:47:20 When pointer event feature is not enabled we are n
455 if (!isInDocument(mouseTarget) && pointerEvent->hasEventPath()) {
456 for (size_t i = 0; i < pointerEvent->eventPath().size(); i++) {
457 if (isInDocument(pointerEvent->eventPath()[i].node())) {
458 mouseTarget = pointerEvent->eventPath()[i].node();
459 break;
460 }
461 }
462 }
455 result = EventHandler::mergeEventResult(result, 463 result = EventHandler::mergeEventResult(result,
456 dispatchMouseEvent(effectiveTarget, mouseEventType, mouseEvent, 464 dispatchMouseEvent(mouseTarget, mouseEventType, mouseEvent,
457 nullptr, clickCount)); 465 nullptr, clickCount));
458 } 466 }
459 467
460 if (pointerEvent->buttons() == 0) { 468 if (pointerEvent->buttons() == 0) {
461 releasePointerCapture(pointerEvent->pointerId()); 469 releasePointerCapture(pointerEvent->pointerId());
462 if (pointerEvent->isPrimary()) { 470 if (pointerEvent->isPrimary()) {
463 m_preventMouseEventForPointerType[toPointerTypeIndex( 471 m_preventMouseEventForPointerType[toPointerTypeIndex(
464 mouseEvent.pointerProperties().pointerType)] = false; 472 mouseEvent.pointerProperties().pointerType)] = false;
465 } 473 }
466 } 474 }
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
654 662
655 DEFINE_TRACE(PointerEventManager) 663 DEFINE_TRACE(PointerEventManager)
656 { 664 {
657 visitor->trace(m_nodeUnderPointer); 665 visitor->trace(m_nodeUnderPointer);
658 visitor->trace(m_pointerCaptureTarget); 666 visitor->trace(m_pointerCaptureTarget);
659 visitor->trace(m_pendingPointerCaptureTarget); 667 visitor->trace(m_pendingPointerCaptureTarget);
660 } 668 }
661 669
662 670
663 } // namespace blink 671 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698