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

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

Issue 2635583002: Add UseCounter for setPointerCapture outside dispatch (Closed)
Patch Set: Rebase again Created 3 years, 10 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/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
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
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
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
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
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/input/PointerEventManager.h ('k') | tools/metrics/histograms/histograms.xml » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698