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

Side by Side Diff: third_party/WebKit/Source/core/events/TouchEvent.cpp

Issue 1980113002: Add UMA metric for tracking root level listeners for blocking touch. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase and add comments Created 4 years, 7 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 /* 1 /*
2 * Copyright 2008, The Android Open Source Project 2 * Copyright 2008, The Android Open Source Project
3 * Copyright (C) 2012 Research In Motion Limited. All rights reserved. 3 * Copyright (C) 2012 Research In Motion Limited. All rights reserved.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions 6 * modification, are permitted provided that the following conditions
7 * are met: 7 * are met:
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright 10 * * Redistributions in binary form must reproduce the above copyright
(...skipping 12 matching lines...) Expand all
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */ 25 */
26 26
27 #include "core/events/TouchEvent.h" 27 #include "core/events/TouchEvent.h"
28 28
29 #include "bindings/core/v8/DOMWrapperWorld.h" 29 #include "bindings/core/v8/DOMWrapperWorld.h"
30 #include "bindings/core/v8/ScriptState.h" 30 #include "bindings/core/v8/ScriptState.h"
31 #include "core/events/EventDispatcher.h" 31 #include "core/events/EventDispatcher.h"
32 #include "core/frame/FrameConsole.h" 32 #include "core/frame/FrameConsole.h"
33 #include "core/frame/FrameView.h"
33 #include "core/frame/LocalDOMWindow.h" 34 #include "core/frame/LocalDOMWindow.h"
34 #include "core/inspector/ConsoleMessage.h" 35 #include "core/inspector/ConsoleMessage.h"
36 #include "platform/Histogram.h"
35 37
36 namespace blink { 38 namespace blink {
37 39
40 namespace {
41
42 // These offsets change indicies into the ListenerHistogram
Rick Byers 2016/05/18 18:37:18 this is quite a lot of complexity / details. Talk
dtapuska 2016/05/19 16:11:21 Done.
43 // enumeration. The addition of a series of offsets then
44 // produces the resulting ListenerHistogram value.
45 const size_t kTouchTargetHistogramRootScrollerOffset = 6;
46 const size_t kTouchTargetHistogramScrollableDocumentOffset = 3;
47 const size_t kTouchTargetHistogramAlreadyHandledOffset = 0;
48 const size_t kTouchTargetHistogramNotHandledOffset = 1;
49 const size_t kTouchTargetHistogramHandledOffset = 2;
50 const size_t kCapturingOffset = 0;
51 const size_t kAtTargetOffset = 12;
52 const size_t kBubblingOffset = 24;
53
54 enum TouchTargetAndDispatchResultType {
55 // The following enums represent state captured during the CAPTURING_PHASE.
56 CapturingNonRootScrollerNonScrollableAlreadyHandled, // Non-root-scroller, n on-scrollable document, already handled.
57 CapturingNonRootScrollerNonScrollableNotHandled, // Non-root-scroller, non-s crollable document, not handled.
58 CapturingNonRootScrollerNonScrollableHandled, // Non-root-scroller, non-scro llable document, handled application.
59 CapturingNonRootScrollerScrollableDocumentAlreadyHandled, // Non-root-scroll er, scrollable document, already handled.
60 CapturingNonRootScrollerScrollableDocumentNotHandled, // Non-root-scroller, scrollable document, not handled.
61 CapturingNonRootScrollerScrollableDocumentHandled, // Non-root-scroller, scr ollable document, handled application.
62 CapturingRootScrollerNonScrollableAlreadyHandled, // Root-scroller, non-scro llable document, already handled.
63 CapturingRootScrollerNonScrollableNotHandled, // Root-scroller, non-scrollab le document, not handled.
64 CapturingRootScrollerNonScrollableHandled, // Root-scroller, non-scrollable document, handled.
65 CapturingRootScrollerScrollableDocumentAlreadyHandled, // Root-scroller, scr ollable document, already handled.
66 CapturingRootScrollerScrollableDocumentNotHandled, // Root-scroller, scrolla ble document, not handled.
67 CapturingRootScrollerScrollableDocumentHandled, // Root-scroller, scrollable document, handled.
68
69 // The following enums represent state captured during the AT_TARGET phase.
70 NonRootScrollerNonScrollableAlreadyHandled, // Non-root-scroller, non-scroll able document, already handled.
71 NonRootScrollerNonScrollableNotHandled, // Non-root-scroller, non-scrollable document, not handled.
72 NonRootScrollerNonScrollableHandled, // Non-root-scroller, non-scrollable do cument, handled application.
73 NonRootScrollerScrollableDocumentAlreadyHandled, // Non-root-scroller, scrol lable document, already handled.
74 NonRootScrollerScrollableDocumentNotHandled, // Non-root-scroller, scrollabl e document, not handled.
75 NonRootScrollerScrollableDocumentHandled, // Non-root-scroller, scrollable d ocument, handled application.
76 RootScrollerNonScrollableAlreadyHandled, // Root-scroller, non-scrollable do cument, already handled.
77 RootScrollerNonScrollableNotHandled, // Root-scroller, non-scrollable docume nt, not handled.
78 RootScrollerNonScrollableHandled, // Root-scroller, non-scrollable document, handled.
79 RootScrollerScrollableDocumentAlreadyHandled, // Root-scroller, scrollable d ocument, already handled.
80 RootScrollerScrollableDocumentNotHandled, // Root-scroller, scrollable docum ent, not handled.
81 RootScrollerScrollableDocumentHandled, // Root-scroller, scrollable document , handled.
82
83 // The following enums represent state captured during the BUBBLING_PHASE.
84 BubblingNonRootScrollerNonScrollableAlreadyHandled, // Non-root-scroller, no n-scrollable document, already handled.
85 BubblingNonRootScrollerNonScrollableNotHandled, // Non-root-scroller, non-sc rollable document, not handled.
86 BubblingNonRootScrollerNonScrollableHandled, // Non-root-scroller, non-scrol lable document, handled application.
87 BubblingNonRootScrollerScrollableDocumentAlreadyHandled, // Non-root-scrolle r, scrollable document, already handled.
88 BubblingNonRootScrollerScrollableDocumentNotHandled, // Non-root-scroller, s crollable document, not handled.
89 BubblingNonRootScrollerScrollableDocumentHandled, // Non-root-scroller, scro llable document, handled application.
90 BubblingRootScrollerNonScrollableAlreadyHandled, // Root-scroller, non-scrol lable document, already handled.
91 BubblingRootScrollerNonScrollableNotHandled, // Root-scroller, non-scrollabl e document, not handled.
92 BubblingRootScrollerNonScrollableHandled, // Root-scroller, non-scrollable d ocument, handled.
93 BubblingRootScrollerScrollableDocumentAlreadyHandled, // Root-scroller, scro llable document, already handled.
94 BubblingRootScrollerScrollableDocumentNotHandled, // Root-scroller, scrollab le document, not handled.
95 BubblingRootScrollerScrollableDocumentHandled, // Root-scroller, scrollable document, handled.
96 TouchTargetAndDispatchResultTypeMax,
97 };
98
99 void logTouchTargetHistogram(EventTarget* eventTarget, unsigned short phase, boo l defaultPreventedBeforeCurrentTarget, bool defaultPrevented)
100 {
101 int result = 0;
102 Document* document = nullptr;
103
104 switch (phase) {
105 default:
106 case Event::NONE:
107 return;
108 case Event::CAPTURING_PHASE:
109 result += kCapturingOffset;
110 break;
111 case Event::AT_TARGET:
112 result += kAtTargetOffset;
113 break;
114 case Event::BUBBLING_PHASE:
115 result += kBubblingOffset;
116 break;
117 }
118
119 if (const LocalDOMWindow* domWindow = eventTarget->toLocalDOMWindow()) {
120 // Treat the window as a root scroller as well.
121 document = domWindow->document();
122 result += kTouchTargetHistogramRootScrollerOffset;
123 } else if (Node* node = eventTarget->toNode()) {
124 // Report if the target node is the document or body.
125 if (node->isDocumentNode() || node->document().documentElement() == node || node->document().body() == node) {
126 result += kTouchTargetHistogramRootScrollerOffset;
127 }
128 document = &node->document();
129 }
130
131 if (document) {
132 FrameView* view = document->view();
133 if (view && view->isScrollable())
134 result += kTouchTargetHistogramScrollableDocumentOffset;
135 }
136
137 if (defaultPreventedBeforeCurrentTarget)
138 result += kTouchTargetHistogramAlreadyHandledOffset;
139 else if (defaultPrevented)
140 result += kTouchTargetHistogramHandledOffset;
141 else
142 result += kTouchTargetHistogramNotHandledOffset;
143
144 DEFINE_STATIC_LOCAL(EnumerationHistogram, rootDocumentListenerHistogram, ("E vent.Touch.TargetAndDispatchResult2", TouchTargetAndDispatchResultTypeMax));
145 rootDocumentListenerHistogram.count(static_cast<TouchTargetAndDispatchResult Type>(result));
146 }
147
148 } // namespace
149
38 TouchEvent::TouchEvent() 150 TouchEvent::TouchEvent()
39 { 151 {
40 } 152 }
41 153
42 TouchEvent::TouchEvent(TouchList* touches, TouchList* targetTouches, 154 TouchEvent::TouchEvent(TouchList* touches, TouchList* targetTouches,
43 TouchList* changedTouches, const AtomicString& type, 155 TouchList* changedTouches, const AtomicString& type,
44 AbstractView* view, 156 AbstractView* view,
45 PlatformEvent::Modifiers modifiers, bool cancelable, bool causesScrollingIfU ncanceled, 157 PlatformEvent::Modifiers modifiers, bool cancelable, bool causesScrollingIfU ncanceled,
46 double platformTimeStamp) 158 double platformTimeStamp)
47 // Pass a sourceCapabilities including the ability to fire touchevents when creating this touchevent, which is always created from input device capabilities from EventHandler. 159 // Pass a sourceCapabilities including the ability to fire touchevents when creating this touchevent, which is always created from input device capabilities from EventHandler.
48 : UIEventWithKeyState(type, true, cancelable, view, 0, modifiers, platformTi meStamp, InputDeviceCapabilities::firesTouchEventsSourceCapabilities()), 160 : UIEventWithKeyState(type, true, cancelable, view, 0, modifiers, platformTi meStamp, InputDeviceCapabilities::firesTouchEventsSourceCapabilities()),
49 m_touches(touches), m_targetTouches(targetTouches), m_changedTouches(changed Touches), m_causesScrollingIfUncanceled(causesScrollingIfUncanceled) 161 m_touches(touches),
162 m_targetTouches(targetTouches),
163 m_changedTouches(changedTouches),
164 m_causesScrollingIfUncanceled(causesScrollingIfUncanceled),
165 m_defaultPreventedBeforeCurrentTarget(false)
50 { 166 {
51 } 167 }
52 168
53 TouchEvent::TouchEvent(const AtomicString& type, const TouchEventInit& initializ er) 169 TouchEvent::TouchEvent(const AtomicString& type, const TouchEventInit& initializ er)
54 : UIEventWithKeyState(type, initializer) 170 : UIEventWithKeyState(type, initializer)
55 , m_touches(TouchList::create(initializer.touches())) 171 , m_touches(TouchList::create(initializer.touches()))
56 , m_targetTouches(TouchList::create(initializer.targetTouches())) 172 , m_targetTouches(TouchList::create(initializer.targetTouches()))
57 , m_changedTouches(TouchList::create(initializer.changedTouches())) 173 , m_changedTouches(TouchList::create(initializer.changedTouches()))
58 { 174 {
59 } 175 }
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
102 218
103 // A common developer error is to wait too long before attempting to stop 219 // A common developer error is to wait too long before attempting to stop
104 // scrolling by consuming a touchmove event. Generate a warning if this 220 // scrolling by consuming a touchmove event. Generate a warning if this
105 // event is uncancelable. 221 // event is uncancelable.
106 if (!cancelable() && view() && view()->isLocalDOMWindow() && view()->frame() ) { 222 if (!cancelable() && view() && view()->isLocalDOMWindow() && view()->frame() ) {
107 toLocalDOMWindow(view())->frame()->console().addMessage(ConsoleMessage:: create(JSMessageSource, WarningMessageLevel, 223 toLocalDOMWindow(view())->frame()->console().addMessage(ConsoleMessage:: create(JSMessageSource, WarningMessageLevel,
108 "Ignored attempt to cancel a " + type() + " event with cancelable=fa lse, for example because scrolling is in progress and cannot be interrupted.")); 224 "Ignored attempt to cancel a " + type() + " event with cancelable=fa lse, for example because scrolling is in progress and cannot be interrupted."));
109 } 225 }
110 } 226 }
111 227
228 void TouchEvent::doneDispatchingEventAtCurrentTarget()
229 {
230 if (!cancelable())
Rick Byers 2016/05/18 18:37:18 This histogram is going to be swamped out by the (
tdresser 2016/05/18 18:57:12 +1, thanks.
dtapuska 2016/05/19 16:11:21 Done.
231 return;
232 bool canceled = defaultPrevented();
233 logTouchTargetHistogram(currentTarget(), eventPhase(), m_defaultPreventedBef oreCurrentTarget, canceled);
234 m_defaultPreventedBeforeCurrentTarget = canceled;
235 }
236
112 EventDispatchMediator* TouchEvent::createMediator() 237 EventDispatchMediator* TouchEvent::createMediator()
113 { 238 {
114 return TouchEventDispatchMediator::create(this); 239 return TouchEventDispatchMediator::create(this);
115 } 240 }
116 241
117 DEFINE_TRACE(TouchEvent) 242 DEFINE_TRACE(TouchEvent)
118 { 243 {
119 visitor->trace(m_touches); 244 visitor->trace(m_touches);
120 visitor->trace(m_targetTouches); 245 visitor->trace(m_targetTouches);
121 visitor->trace(m_changedTouches); 246 visitor->trace(m_changedTouches);
(...skipping 15 matching lines...) Expand all
137 return toTouchEvent(EventDispatchMediator::event()); 262 return toTouchEvent(EventDispatchMediator::event());
138 } 263 }
139 264
140 DispatchEventResult TouchEventDispatchMediator::dispatchEvent(EventDispatcher& d ispatcher) const 265 DispatchEventResult TouchEventDispatchMediator::dispatchEvent(EventDispatcher& d ispatcher) const
141 { 266 {
142 event().eventPath().adjustForTouchEvent(event()); 267 event().eventPath().adjustForTouchEvent(event());
143 return dispatcher.dispatch(); 268 return dispatcher.dispatch();
144 } 269 }
145 270
146 } // namespace blink 271 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698