| 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" |
| 11 #include "core/frame/FrameView.h" | 11 #include "core/frame/FrameView.h" |
| 12 #include "core/frame/UseCounter.h" | 12 #include "core/frame/UseCounter.h" |
| 13 #include "core/html/HTMLCanvasElement.h" | 13 #include "core/html/HTMLCanvasElement.h" |
| 14 #include "core/input/EventHandler.h" | 14 #include "core/input/EventHandler.h" |
| 15 #include "core/input/EventHandlingUtil.h" | 15 #include "core/input/EventHandlingUtil.h" |
| 16 #include "core/input/MouseEventManager.h" | 16 #include "core/input/MouseEventManager.h" |
| 17 #include "core/input/TouchActionUtil.h" | 17 #include "core/input/TouchActionUtil.h" |
| 18 #include "core/layout/HitTestCanvasResult.h" | 18 #include "core/layout/HitTestCanvasResult.h" |
| 19 #include "core/page/ChromeClient.h" | 19 #include "core/page/ChromeClient.h" |
| 20 #include "core/page/Page.h" | 20 #include "core/page/Page.h" |
| 21 #include "public/platform/WebTouchEvent.h" | 21 #include "public/platform/WebTouchEvent.h" |
| 22 #include "wtf/AutoReset.h" |
| 22 | 23 |
| 23 namespace blink { | 24 namespace blink { |
| 24 | 25 |
| 25 namespace { | 26 namespace { |
| 26 | 27 |
| 27 size_t toPointerTypeIndex(WebPointerProperties::PointerType t) { | 28 size_t toPointerTypeIndex(WebPointerProperties::PointerType t) { |
| 28 return static_cast<size_t>(t); | 29 return static_cast<size_t>(t); |
| 29 } | 30 } |
| 30 | 31 |
| 31 bool isInDocument(EventTarget* n) { | 32 bool isInDocument(EventTarget* n) { |
| (...skipping 27 matching lines...) Expand all Loading... |
| 59 void PointerEventManager::clear() { | 60 void PointerEventManager::clear() { |
| 60 for (auto& entry : m_preventMouseEventForPointerType) | 61 for (auto& entry : m_preventMouseEventForPointerType) |
| 61 entry = false; | 62 entry = false; |
| 62 m_touchEventManager->clear(); | 63 m_touchEventManager->clear(); |
| 63 m_inCanceledStateForPointerTypeTouch = false; | 64 m_inCanceledStateForPointerTypeTouch = false; |
| 64 m_pointerEventFactory.clear(); | 65 m_pointerEventFactory.clear(); |
| 65 m_touchIdsForCanceledPointerdowns.clear(); | 66 m_touchIdsForCanceledPointerdowns.clear(); |
| 66 m_nodeUnderPointer.clear(); | 67 m_nodeUnderPointer.clear(); |
| 67 m_pointerCaptureTarget.clear(); | 68 m_pointerCaptureTarget.clear(); |
| 68 m_pendingPointerCaptureTarget.clear(); | 69 m_pendingPointerCaptureTarget.clear(); |
| 70 m_dispatchingPointerId = 0; |
| 69 } | 71 } |
| 70 | 72 |
| 71 DEFINE_TRACE(PointerEventManager) { | 73 DEFINE_TRACE(PointerEventManager) { |
| 72 visitor->trace(m_frame); | 74 visitor->trace(m_frame); |
| 73 visitor->trace(m_nodeUnderPointer); | 75 visitor->trace(m_nodeUnderPointer); |
| 74 visitor->trace(m_pointerCaptureTarget); | 76 visitor->trace(m_pointerCaptureTarget); |
| 75 visitor->trace(m_pendingPointerCaptureTarget); | 77 visitor->trace(m_pendingPointerCaptureTarget); |
| 76 visitor->trace(m_touchEventManager); | 78 visitor->trace(m_touchEventManager); |
| 77 visitor->trace(m_mouseEventManager); | 79 visitor->trace(m_mouseEventManager); |
| 78 } | 80 } |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 136 | 138 |
| 137 WebInputEventResult PointerEventManager::dispatchPointerEvent( | 139 WebInputEventResult PointerEventManager::dispatchPointerEvent( |
| 138 EventTarget* target, | 140 EventTarget* target, |
| 139 PointerEvent* pointerEvent, | 141 PointerEvent* pointerEvent, |
| 140 bool checkForListener) { | 142 bool checkForListener) { |
| 141 if (!target) | 143 if (!target) |
| 142 return WebInputEventResult::NotHandled; | 144 return WebInputEventResult::NotHandled; |
| 143 | 145 |
| 144 // Set whether node under pointer has received pointerover or not. | 146 // Set whether node under pointer has received pointerover or not. |
| 145 const int pointerId = pointerEvent->pointerId(); | 147 const int pointerId = pointerEvent->pointerId(); |
| 148 |
| 146 const AtomicString& eventType = pointerEvent->type(); | 149 const AtomicString& eventType = pointerEvent->type(); |
| 147 if ((eventType == EventTypeNames::pointerout || | 150 if ((eventType == EventTypeNames::pointerout || |
| 148 eventType == EventTypeNames::pointerover) && | 151 eventType == EventTypeNames::pointerover) && |
| 149 m_nodeUnderPointer.contains(pointerId)) { | 152 m_nodeUnderPointer.contains(pointerId)) { |
| 150 EventTarget* targetUnderPointer = m_nodeUnderPointer.get(pointerId).target; | 153 EventTarget* targetUnderPointer = m_nodeUnderPointer.get(pointerId).target; |
| 151 if (targetUnderPointer == target) { | 154 if (targetUnderPointer == target) { |
| 152 m_nodeUnderPointer.set( | 155 m_nodeUnderPointer.set( |
| 153 pointerId, | 156 pointerId, |
| 154 EventTargetAttributes(targetUnderPointer, | 157 EventTargetAttributes(targetUnderPointer, |
| 155 eventType == EventTypeNames::pointerover)); | 158 eventType == EventTypeNames::pointerover)); |
| 156 } | 159 } |
| 157 } | 160 } |
| 158 | 161 |
| 159 if (!RuntimeEnabledFeatures::pointerEventEnabled()) | 162 if (!RuntimeEnabledFeatures::pointerEventEnabled()) |
| 160 return WebInputEventResult::NotHandled; | 163 return WebInputEventResult::NotHandled; |
| 161 if (!checkForListener || target->hasEventListeners(eventType)) { | 164 if (!checkForListener || target->hasEventListeners(eventType)) { |
| 162 UseCounter::count(m_frame->document(), UseCounter::PointerEventDispatch); | 165 UseCounter::count(m_frame, UseCounter::PointerEventDispatch); |
| 163 if (eventType == EventTypeNames::pointerdown) | 166 if (eventType == EventTypeNames::pointerdown) |
| 164 UseCounter::count(m_frame->document(), | 167 UseCounter::count(m_frame, UseCounter::PointerEventDispatchPointerDown); |
| 165 UseCounter::PointerEventDispatchPointerDown); | |
| 166 | 168 |
| 169 DCHECK(!m_dispatchingPointerId); |
| 170 AutoReset<int> dispatchHolder(&m_dispatchingPointerId, pointerId); |
| 167 DispatchEventResult dispatchResult = target->dispatchEvent(pointerEvent); | 171 DispatchEventResult dispatchResult = target->dispatchEvent(pointerEvent); |
| 168 return EventHandlingUtil::toWebInputEventResult(dispatchResult); | 172 return EventHandlingUtil::toWebInputEventResult(dispatchResult); |
| 169 } | 173 } |
| 170 return WebInputEventResult::NotHandled; | 174 return WebInputEventResult::NotHandled; |
| 171 } | 175 } |
| 172 | 176 |
| 173 EventTarget* PointerEventManager::getEffectiveTargetForPointerEvent( | 177 EventTarget* PointerEventManager::getEffectiveTargetForPointerEvent( |
| 174 EventTarget* target, | 178 EventTarget* target, |
| 175 int pointerId) { | 179 int pointerId) { |
| 176 if (EventTarget* capturingTarget = getCapturingNode(pointerId)) | 180 if (EventTarget* capturingTarget = getCapturingNode(pointerId)) |
| (...skipping 445 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 622 } | 626 } |
| 623 } | 627 } |
| 624 | 628 |
| 625 void PointerEventManager::elementRemoved(EventTarget* target) { | 629 void PointerEventManager::elementRemoved(EventTarget* target) { |
| 626 removeTargetFromPointerCapturingMapping(m_pendingPointerCaptureTarget, | 630 removeTargetFromPointerCapturingMapping(m_pendingPointerCaptureTarget, |
| 627 target); | 631 target); |
| 628 } | 632 } |
| 629 | 633 |
| 630 void PointerEventManager::setPointerCapture(int pointerId, | 634 void PointerEventManager::setPointerCapture(int pointerId, |
| 631 EventTarget* target) { | 635 EventTarget* target) { |
| 632 UseCounter::count(m_frame->document(), UseCounter::PointerEventSetCapture); | 636 UseCounter::count(m_frame, UseCounter::PointerEventSetCapture); |
| 633 if (m_pointerEventFactory.isActiveButtonsState(pointerId)) | 637 if (m_pointerEventFactory.isActiveButtonsState(pointerId)) { |
| 638 if (pointerId != m_dispatchingPointerId) { |
| 639 UseCounter::count(m_frame, |
| 640 UseCounter::PointerEventSetCaptureOutsideDispatch); |
| 641 } |
| 634 m_pendingPointerCaptureTarget.set(pointerId, target); | 642 m_pendingPointerCaptureTarget.set(pointerId, target); |
| 643 } |
| 635 } | 644 } |
| 636 | 645 |
| 637 void PointerEventManager::releasePointerCapture(int pointerId, | 646 void PointerEventManager::releasePointerCapture(int pointerId, |
| 638 EventTarget* target) { | 647 EventTarget* target) { |
| 639 // Only the element that is going to get the next pointer event can release | 648 // Only the element that is going to get the next pointer event can release |
| 640 // the capture. Note that this might be different from | 649 // the capture. Note that this might be different from |
| 641 // |m_pointercaptureTarget|. |m_pointercaptureTarget| holds the element | 650 // |m_pointercaptureTarget|. |m_pointercaptureTarget| holds the element |
| 642 // that had the capture until now and has been receiving the pointerevents | 651 // that had the capture until now and has been receiving the pointerevents |
| 643 // but |m_pendingPointerCaptureTarget| indicated the element that gets the | 652 // but |m_pendingPointerCaptureTarget| indicated the element that gets the |
| 644 // very next pointer event. They will be the same if there was no change in | 653 // 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... |
| 698 if (firstId > uniqueTouchEventId) | 707 if (firstId > uniqueTouchEventId) |
| 699 return false; | 708 return false; |
| 700 m_touchIdsForCanceledPointerdowns.takeFirst(); | 709 m_touchIdsForCanceledPointerdowns.takeFirst(); |
| 701 if (firstId == uniqueTouchEventId) | 710 if (firstId == uniqueTouchEventId) |
| 702 return true; | 711 return true; |
| 703 } | 712 } |
| 704 return false; | 713 return false; |
| 705 } | 714 } |
| 706 | 715 |
| 707 } // namespace blink | 716 } // namespace blink |
| OLD | NEW |