Chromium Code Reviews| 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/DocumentUserGestureToken.h" | 7 #include "core/dom/DocumentUserGestureToken.h" |
| 8 #include "core/dom/ElementTraversal.h" | 8 #include "core/dom/ElementTraversal.h" |
| 9 #include "core/dom/shadow/FlatTreeTraversal.h" | 9 #include "core/dom/shadow/FlatTreeTraversal.h" |
| 10 #include "core/events/MouseEvent.h" | 10 #include "core/events/MouseEvent.h" |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 59 void PointerEventManager::clear() { | 59 void PointerEventManager::clear() { |
| 60 for (auto& entry : m_preventMouseEventForPointerType) | 60 for (auto& entry : m_preventMouseEventForPointerType) |
| 61 entry = false; | 61 entry = false; |
| 62 m_touchEventManager->clear(); | 62 m_touchEventManager->clear(); |
| 63 m_inCanceledStateForPointerTypeTouch = false; | 63 m_inCanceledStateForPointerTypeTouch = false; |
| 64 m_pointerEventFactory.clear(); | 64 m_pointerEventFactory.clear(); |
| 65 m_touchIdsForCanceledPointerdowns.clear(); | 65 m_touchIdsForCanceledPointerdowns.clear(); |
| 66 m_nodeUnderPointer.clear(); | 66 m_nodeUnderPointer.clear(); |
| 67 m_pointerCaptureTarget.clear(); | 67 m_pointerCaptureTarget.clear(); |
| 68 m_pendingPointerCaptureTarget.clear(); | 68 m_pendingPointerCaptureTarget.clear(); |
| 69 m_dispatchingPointerId = 0; | |
| 69 } | 70 } |
| 70 | 71 |
| 71 DEFINE_TRACE(PointerEventManager) { | 72 DEFINE_TRACE(PointerEventManager) { |
| 72 visitor->trace(m_frame); | 73 visitor->trace(m_frame); |
| 73 visitor->trace(m_nodeUnderPointer); | 74 visitor->trace(m_nodeUnderPointer); |
| 74 visitor->trace(m_pointerCaptureTarget); | 75 visitor->trace(m_pointerCaptureTarget); |
| 75 visitor->trace(m_pendingPointerCaptureTarget); | 76 visitor->trace(m_pendingPointerCaptureTarget); |
| 76 visitor->trace(m_touchEventManager); | 77 visitor->trace(m_touchEventManager); |
| 77 visitor->trace(m_mouseEventManager); | 78 visitor->trace(m_mouseEventManager); |
| 78 } | 79 } |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 136 | 137 |
| 137 WebInputEventResult PointerEventManager::dispatchPointerEvent( | 138 WebInputEventResult PointerEventManager::dispatchPointerEvent( |
| 138 EventTarget* target, | 139 EventTarget* target, |
| 139 PointerEvent* pointerEvent, | 140 PointerEvent* pointerEvent, |
| 140 bool checkForListener) { | 141 bool checkForListener) { |
| 141 if (!target) | 142 if (!target) |
| 142 return WebInputEventResult::NotHandled; | 143 return WebInputEventResult::NotHandled; |
| 143 | 144 |
| 144 // Set whether node under pointer has received pointerover or not. | 145 // Set whether node under pointer has received pointerover or not. |
| 145 const int pointerId = pointerEvent->pointerId(); | 146 const int pointerId = pointerEvent->pointerId(); |
| 147 | |
| 146 const AtomicString& eventType = pointerEvent->type(); | 148 const AtomicString& eventType = pointerEvent->type(); |
| 147 if ((eventType == EventTypeNames::pointerout || | 149 if ((eventType == EventTypeNames::pointerout || |
| 148 eventType == EventTypeNames::pointerover) && | 150 eventType == EventTypeNames::pointerover) && |
| 149 m_nodeUnderPointer.contains(pointerId)) { | 151 m_nodeUnderPointer.contains(pointerId)) { |
| 150 EventTarget* targetUnderPointer = m_nodeUnderPointer.get(pointerId).target; | 152 EventTarget* targetUnderPointer = m_nodeUnderPointer.get(pointerId).target; |
| 151 if (targetUnderPointer == target) { | 153 if (targetUnderPointer == target) { |
| 152 m_nodeUnderPointer.set( | 154 m_nodeUnderPointer.set( |
| 153 pointerId, | 155 pointerId, |
| 154 EventTargetAttributes(targetUnderPointer, | 156 EventTargetAttributes(targetUnderPointer, |
| 155 eventType == EventTypeNames::pointerover)); | 157 eventType == EventTypeNames::pointerover)); |
| 156 } | 158 } |
| 157 } | 159 } |
| 158 | 160 |
| 159 if (!RuntimeEnabledFeatures::pointerEventEnabled()) | 161 if (!RuntimeEnabledFeatures::pointerEventEnabled()) |
| 160 return WebInputEventResult::NotHandled; | 162 return WebInputEventResult::NotHandled; |
| 161 if (!checkForListener || target->hasEventListeners(eventType)) { | 163 if (!checkForListener || target->hasEventListeners(eventType)) { |
| 162 UseCounter::count(m_frame->document(), UseCounter::PointerEventDispatch); | 164 UseCounter::count(m_frame, UseCounter::PointerEventDispatch); |
| 163 if (eventType == EventTypeNames::pointerdown) | 165 if (eventType == EventTypeNames::pointerdown) |
| 164 UseCounter::count(m_frame->document(), | 166 UseCounter::count(m_frame, UseCounter::PointerEventDispatchPointerDown); |
| 165 UseCounter::PointerEventDispatchPointerDown); | |
| 166 | 167 |
| 168 DCHECK(!m_dispatchingPointerId); | |
| 169 m_dispatchingPointerId = pointerId; | |
|
dtapuska
2017/01/16 21:07:41
You able to use an AutoReset here?
Rick Byers
2017/01/20 22:37:22
Done.
| |
| 167 DispatchEventResult dispatchResult = target->dispatchEvent(pointerEvent); | 170 DispatchEventResult dispatchResult = target->dispatchEvent(pointerEvent); |
| 171 m_dispatchingPointerId = 0; | |
| 172 | |
| 168 return EventHandlingUtil::toWebInputEventResult(dispatchResult); | 173 return EventHandlingUtil::toWebInputEventResult(dispatchResult); |
| 169 } | 174 } |
| 170 return WebInputEventResult::NotHandled; | 175 return WebInputEventResult::NotHandled; |
| 171 } | 176 } |
| 172 | 177 |
| 173 EventTarget* PointerEventManager::getEffectiveTargetForPointerEvent( | 178 EventTarget* PointerEventManager::getEffectiveTargetForPointerEvent( |
| 174 EventTarget* target, | 179 EventTarget* target, |
| 175 int pointerId) { | 180 int pointerId) { |
| 176 if (EventTarget* capturingTarget = getCapturingNode(pointerId)) | 181 if (EventTarget* capturingTarget = getCapturingNode(pointerId)) |
| 177 return capturingTarget; | 182 return capturingTarget; |
| (...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 616 } | 621 } |
| 617 } | 622 } |
| 618 | 623 |
| 619 void PointerEventManager::elementRemoved(EventTarget* target) { | 624 void PointerEventManager::elementRemoved(EventTarget* target) { |
| 620 removeTargetFromPointerCapturingMapping(m_pendingPointerCaptureTarget, | 625 removeTargetFromPointerCapturingMapping(m_pendingPointerCaptureTarget, |
| 621 target); | 626 target); |
| 622 } | 627 } |
| 623 | 628 |
| 624 void PointerEventManager::setPointerCapture(int pointerId, | 629 void PointerEventManager::setPointerCapture(int pointerId, |
| 625 EventTarget* target) { | 630 EventTarget* target) { |
| 626 UseCounter::count(m_frame->document(), UseCounter::PointerEventSetCapture); | 631 UseCounter::count(m_frame, UseCounter::PointerEventSetCapture); |
| 627 if (m_pointerEventFactory.isActiveButtonsState(pointerId)) | 632 if (m_pointerEventFactory.isActiveButtonsState(pointerId)) { |
| 633 if (pointerId != m_dispatchingPointerId) { | |
| 634 UseCounter::count(m_frame, | |
| 635 UseCounter::PointerEventSetCaptureOutsideDispatch); | |
|
Navid Zolghadr
2017/01/16 21:15:01
There is one more place (as of a "temporary" hack)
Rick Byers
2017/01/20 22:37:22
Whoa, that looks potentially bad - commented on th
| |
| 636 } | |
| 628 m_pendingPointerCaptureTarget.set(pointerId, target); | 637 m_pendingPointerCaptureTarget.set(pointerId, target); |
| 638 } | |
| 629 } | 639 } |
| 630 | 640 |
| 631 void PointerEventManager::releasePointerCapture(int pointerId, | 641 void PointerEventManager::releasePointerCapture(int pointerId, |
| 632 EventTarget* target) { | 642 EventTarget* target) { |
| 633 // Only the element that is going to get the next pointer event can release | 643 // Only the element that is going to get the next pointer event can release |
| 634 // the capture. Note that this might be different from | 644 // the capture. Note that this might be different from |
| 635 // |m_pointercaptureTarget|. |m_pointercaptureTarget| holds the element | 645 // |m_pointercaptureTarget|. |m_pointercaptureTarget| holds the element |
| 636 // that had the capture until now and has been receiving the pointerevents | 646 // that had the capture until now and has been receiving the pointerevents |
| 637 // but |m_pendingPointerCaptureTarget| indicated the element that gets the | 647 // but |m_pendingPointerCaptureTarget| indicated the element that gets the |
| 638 // very next pointer event. They will be the same if there was no change in | 648 // very next pointer event. They will be the same if there was no change in |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 692 if (firstId > uniqueTouchEventId) | 702 if (firstId > uniqueTouchEventId) |
| 693 return false; | 703 return false; |
| 694 m_touchIdsForCanceledPointerdowns.takeFirst(); | 704 m_touchIdsForCanceledPointerdowns.takeFirst(); |
| 695 if (firstId == uniqueTouchEventId) | 705 if (firstId == uniqueTouchEventId) |
| 696 return true; | 706 return true; |
| 697 } | 707 } |
| 698 return false; | 708 return false; |
| 699 } | 709 } |
| 700 | 710 |
| 701 } // namespace blink | 711 } // namespace blink |
| OLD | NEW |