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

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

Issue 2635583002: Add UseCounter for setPointerCapture outside dispatch (Closed)
Patch Set: Merge branch 'master' into capture-metrics Created 3 years, 11 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"
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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