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

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: Applying comments 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
« no previous file with comments | « third_party/WebKit/Source/core/events/Event.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/frame/FrameView.h" 10 #include "core/frame/FrameView.h"
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
74 HTMLCanvasElement* canvas = Traversal<HTMLCanvasElement>::firstAncestorOrSel f(*element); 74 HTMLCanvasElement* canvas = Traversal<HTMLCanvasElement>::firstAncestorOrSel f(*element);
75 // In this case, the event target is canvas and mouse rerouting doesn't happ en. 75 // In this case, the event target is canvas and mouse rerouting doesn't happ en.
76 if (canvas == element) 76 if (canvas == element)
77 return mouseEvent; 77 return mouseEvent;
78 String region = canvas->getIdFromControl(element); 78 String region = canvas->getIdFromControl(element);
79 PlatformMouseEvent newMouseEvent = mouseEvent; 79 PlatformMouseEvent newMouseEvent = mouseEvent;
80 newMouseEvent.setRegion(region); 80 newMouseEvent.setRegion(region);
81 return newMouseEvent; 81 return newMouseEvent;
82 } 82 }
83 83
84 void buildAncestorChain(
85 EventTarget* target,
86 HeapVector<Member<Node>, 20>* ancestors)
87 {
88 if (!isInDocument(target))
89 return;
90 Node* targetNode = target->toNode();
91 DCHECK(targetNode);
92 targetNode->updateDistribution();
93 // Index 0 element in the ancestors arrays will be the corresponding
94 // target. So the root of their document will be their last element.
95 for (Node* node = targetNode; node; node = FlatTreeTraversal::parent(*node))
96 ancestors->append(node);
97 }
98
84 void buildAncestorChainsAndFindCommonAncestors( 99 void buildAncestorChainsAndFindCommonAncestors(
85 EventTarget* exitedTarget, EventTarget* enteredTarget, 100 EventTarget* exitedTarget, EventTarget* enteredTarget,
86 HeapVector<Member<Node>, 20>* exitedAncestorsOut, 101 HeapVector<Member<Node>, 20>* exitedAncestorsOut,
87 HeapVector<Member<Node>, 20>* enteredAncestorsOut, 102 HeapVector<Member<Node>, 20>* enteredAncestorsOut,
88 size_t* exitedAncestorsCommonParentIndexOut, 103 size_t* exitedAncestorsCommonParentIndexOut,
89 size_t* enteredAncestorsCommonParentIndexOut) 104 size_t* enteredAncestorsCommonParentIndexOut)
90 { 105 {
91 DCHECK(exitedAncestorsOut); 106 DCHECK(exitedAncestorsOut);
92 DCHECK(enteredAncestorsOut); 107 DCHECK(enteredAncestorsOut);
93 DCHECK(exitedAncestorsCommonParentIndexOut); 108 DCHECK(exitedAncestorsCommonParentIndexOut);
94 DCHECK(enteredAncestorsCommonParentIndexOut); 109 DCHECK(enteredAncestorsCommonParentIndexOut);
95 110
96 // Index 0 element in the ancestors arrays will be the corresponding 111 buildAncestorChain(exitedTarget, exitedAncestorsOut);
97 // target. So the root of their document will be their last element. 112 buildAncestorChain(enteredTarget, enteredAncestorsOut);
98
99 if (isInDocument(exitedTarget)) {
100 Node* exitedNode = exitedTarget->toNode();
101 DCHECK(exitedNode);
102 exitedNode->updateDistribution();
103 for (Node* node = exitedNode; node; node = FlatTreeTraversal::parent(*no de))
104 exitedAncestorsOut->append(node);
105 }
106
107 if (isInDocument(enteredTarget)) {
108 Node* enteredNode = enteredTarget->toNode();
109 DCHECK(enteredNode);
110 enteredNode->updateDistribution();
111 for (Node* node = enteredNode; node; node = FlatTreeTraversal::parent(*n ode))
112 enteredAncestorsOut->append(node);
113 }
114 113
115 *exitedAncestorsCommonParentIndexOut = exitedAncestorsOut->size(); 114 *exitedAncestorsCommonParentIndexOut = exitedAncestorsOut->size();
116 *enteredAncestorsCommonParentIndexOut = enteredAncestorsOut->size(); 115 *enteredAncestorsCommonParentIndexOut = enteredAncestorsOut->size();
117 while (*exitedAncestorsCommonParentIndexOut > 0 116 while (*exitedAncestorsCommonParentIndexOut > 0
118 && *enteredAncestorsCommonParentIndexOut > 0) { 117 && *enteredAncestorsCommonParentIndexOut > 0) {
119 if ((*exitedAncestorsOut)[(*exitedAncestorsCommonParentIndexOut)-1] 118 if ((*exitedAncestorsOut)[(*exitedAncestorsCommonParentIndexOut)-1]
120 != (*enteredAncestorsOut)[(*enteredAncestorsCommonParentIndexOut)-1] ) 119 != (*enteredAncestorsOut)[(*enteredAncestorsCommonParentIndexOut)-1] )
121 break; 120 break;
122 (*exitedAncestorsCommonParentIndexOut)--; 121 (*exitedAncestorsCommonParentIndexOut)--;
123 (*enteredAncestorsCommonParentIndexOut)--; 122 (*enteredAncestorsCommonParentIndexOut)--;
(...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after
501 500
502 if (result != WebInputEventResult::NotHandled 501 if (result != WebInputEventResult::NotHandled
503 && pointerEvent->type() == EventTypeNames::pointerdown 502 && pointerEvent->type() == EventTypeNames::pointerdown
504 && pointerEvent->isPrimary()) { 503 && pointerEvent->isPrimary()) {
505 m_preventMouseEventForPointerType[toPointerTypeIndex( 504 m_preventMouseEventForPointerType[toPointerTypeIndex(
506 mouseEvent.pointerProperties().pointerType)] = true; 505 mouseEvent.pointerProperties().pointerType)] = true;
507 } 506 }
508 507
509 if (pointerEvent->isPrimary() && !m_preventMouseEventForPointerType[toPointe rTypeIndex( 508 if (pointerEvent->isPrimary() && !m_preventMouseEventForPointerType[toPointe rTypeIndex(
510 mouseEvent.pointerProperties().pointerType)]) { 509 mouseEvent.pointerProperties().pointerType)]) {
510 EventTarget* mouseTarget = effectiveTarget;
511 // Event path could be null if pointer event is not dispatched and
512 // that happens for example when pointer event feature is not enabled.
513 if (!isInDocument(mouseTarget) && pointerEvent->hasEventPath()) {
514 for (size_t i = 0; i < pointerEvent->eventPath().size(); i++) {
515 if (isInDocument(pointerEvent->eventPath()[i].node())) {
516 mouseTarget = pointerEvent->eventPath()[i].node();
517 break;
518 }
519 }
520 }
511 result = EventHandler::mergeEventResult(result, 521 result = EventHandler::mergeEventResult(result,
512 dispatchMouseEvent(effectiveTarget, mouseEventType, mouseEvent, 522 dispatchMouseEvent(mouseTarget, mouseEventType, mouseEvent,
513 nullptr, clickCount)); 523 nullptr, clickCount));
514 } 524 }
515 525
516 if (pointerEvent->buttons() == 0) { 526 if (pointerEvent->buttons() == 0) {
517 releasePointerCapture(pointerEvent->pointerId()); 527 releasePointerCapture(pointerEvent->pointerId());
518 if (pointerEvent->isPrimary()) { 528 if (pointerEvent->isPrimary()) {
519 m_preventMouseEventForPointerType[toPointerTypeIndex( 529 m_preventMouseEventForPointerType[toPointerTypeIndex(
520 mouseEvent.pointerProperties().pointerType)] = false; 530 mouseEvent.pointerProperties().pointerType)] = false;
521 } 531 }
522 } 532 }
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
720 { 730 {
721 visitor->trace(m_frame); 731 visitor->trace(m_frame);
722 visitor->trace(m_nodeUnderPointer); 732 visitor->trace(m_nodeUnderPointer);
723 visitor->trace(m_pointerCaptureTarget); 733 visitor->trace(m_pointerCaptureTarget);
724 visitor->trace(m_pendingPointerCaptureTarget); 734 visitor->trace(m_pendingPointerCaptureTarget);
725 visitor->trace(m_touchEventManager); 735 visitor->trace(m_touchEventManager);
726 } 736 }
727 737
728 738
729 } // namespace blink 739 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/events/Event.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698