| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |