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

Side by Side Diff: third_party/WebKit/Source/core/frame/EventHandlerRegistry.cpp

Issue 1577263004: Communicate whether passive event listeners exist to cc. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master_wheel_passive_listeners
Patch Set: Fix Android/ChromeOS build problems with bit packed enum class Created 4 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/frame/EventHandlerRegistry.h" 5 #include "core/frame/EventHandlerRegistry.h"
6 6
7 #include "core/events/EventListenerOptions.h"
7 #include "core/frame/LocalDOMWindow.h" 8 #include "core/frame/LocalDOMWindow.h"
8 #include "core/frame/LocalFrame.h" 9 #include "core/frame/LocalFrame.h"
9 #include "core/html/HTMLFrameOwnerElement.h" 10 #include "core/html/HTMLFrameOwnerElement.h"
10 #include "core/page/ChromeClient.h" 11 #include "core/page/ChromeClient.h"
11 #include "core/page/Page.h" 12 #include "core/page/Page.h"
12 #include "core/page/scrolling/ScrollingCoordinator.h" 13 #include "core/page/scrolling/ScrollingCoordinator.h"
13 14
14 namespace blink { 15 namespace blink {
15 16
16 namespace { 17 namespace {
(...skipping 25 matching lines...) Expand all
42 EventHandlerRegistry::EventHandlerRegistry(FrameHost& frameHost) 43 EventHandlerRegistry::EventHandlerRegistry(FrameHost& frameHost)
43 : m_frameHost(&frameHost) 44 : m_frameHost(&frameHost)
44 { 45 {
45 } 46 }
46 47
47 EventHandlerRegistry::~EventHandlerRegistry() 48 EventHandlerRegistry::~EventHandlerRegistry()
48 { 49 {
49 checkConsistency(); 50 checkConsistency();
50 } 51 }
51 52
52 bool EventHandlerRegistry::eventTypeToClass(const AtomicString& eventType, Event HandlerClass* result) 53 bool EventHandlerRegistry::eventTypeToClass(const AtomicString& eventType, const EventListenerOptions& options, EventHandlerClass* result)
53 { 54 {
54 if (eventType == EventTypeNames::scroll) { 55 if (eventType == EventTypeNames::scroll) {
55 *result = ScrollEvent; 56 *result = ScrollEvent;
56 } else if (eventType == EventTypeNames::wheel || eventType == EventTypeNames ::mousewheel) { 57 } else if (eventType == EventTypeNames::wheel || eventType == EventTypeNames ::mousewheel) {
57 *result = WheelEvent; 58 *result = options.passive() ? WheelEventPassive : WheelEvent;
58 } else if (isTouchEventType(eventType)) { 59 } else if (isTouchEventType(eventType)) {
59 *result = TouchEvent; 60 *result = options.passive() ? TouchEventPassive : TouchEvent;
60 } else if (isPointerEventType(eventType)) { 61 } else if (isPointerEventType(eventType)) {
61 // The EventHandlerClass is still TouchEvent below since we are firing P ointerEvents only from 62 // The EventHandlerClass is still TouchEvent below since we are firing P ointerEvents only from
62 // EventHandler::handleTouchEvent for now. See crbug.com/476565. 63 // EventHandler::handleTouchEvent for now. See crbug.com/476565.
63 *result = TouchEvent; 64 *result = options.passive() ? TouchEventPassive : TouchEvent;
64 #if ENABLE(ASSERT) 65 #if ENABLE(ASSERT)
65 } else if (eventType == EventTypeNames::load || eventType == EventTypeNames: :mousemove || eventType == EventTypeNames::touchstart) { 66 } else if (eventType == EventTypeNames::load || eventType == EventTypeNames: :mousemove || eventType == EventTypeNames::touchstart) {
66 *result = EventsForTesting; 67 *result = EventsForTesting;
67 #endif 68 #endif
68 } else { 69 } else {
69 return false; 70 return false;
70 } 71 }
71 return true; 72 return true;
72 } 73 }
73 74
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 bool targetSetChanged = updateEventHandlerTargets(op, handlerClass, target); 116 bool targetSetChanged = updateEventHandlerTargets(op, handlerClass, target);
116 bool hasHandlers = m_targets[handlerClass].size(); 117 bool hasHandlers = m_targets[handlerClass].size();
117 118
118 if (hadHandlers != hasHandlers) 119 if (hadHandlers != hasHandlers)
119 notifyHasHandlersChanged(handlerClass, hasHandlers); 120 notifyHasHandlersChanged(handlerClass, hasHandlers);
120 121
121 if (targetSetChanged) 122 if (targetSetChanged)
122 notifyDidAddOrRemoveEventHandlerTarget(handlerClass); 123 notifyDidAddOrRemoveEventHandlerTarget(handlerClass);
123 } 124 }
124 125
125 void EventHandlerRegistry::updateEventHandlerOfType(ChangeOperation op, const At omicString& eventType, EventTarget* target) 126 void EventHandlerRegistry::updateEventHandlerOfType(ChangeOperation op, const At omicString& eventType, const EventListenerOptions& options, EventTarget* target)
126 { 127 {
127 EventHandlerClass handlerClass; 128 EventHandlerClass handlerClass;
128 if (!eventTypeToClass(eventType, &handlerClass)) 129 if (!eventTypeToClass(eventType, options, &handlerClass))
129 return; 130 return;
130 updateEventHandlerInternal(op, handlerClass, target); 131 updateEventHandlerInternal(op, handlerClass, target);
131 } 132 }
132 133
133 void EventHandlerRegistry::didAddEventHandler(EventTarget& target, const AtomicS tring& eventType) 134 void EventHandlerRegistry::didAddEventHandler(EventTarget& target, const AtomicS tring& eventType, const EventListenerOptions& options)
134 { 135 {
135 updateEventHandlerOfType(Add, eventType, &target); 136 updateEventHandlerOfType(Add, eventType, options, &target);
136 } 137 }
137 138
138 void EventHandlerRegistry::didRemoveEventHandler(EventTarget& target, const Atom icString& eventType) 139 void EventHandlerRegistry::didRemoveEventHandler(EventTarget& target, const Atom icString& eventType, const EventListenerOptions& options)
139 { 140 {
140 updateEventHandlerOfType(Remove, eventType, &target); 141 updateEventHandlerOfType(Remove, eventType, options, &target);
141 } 142 }
142 143
143 void EventHandlerRegistry::didAddEventHandler(EventTarget& target, EventHandlerC lass handlerClass) 144 void EventHandlerRegistry::didAddEventHandler(EventTarget& target, EventHandlerC lass handlerClass)
144 { 145 {
145 updateEventHandlerInternal(Add, handlerClass, &target); 146 updateEventHandlerInternal(Add, handlerClass, &target);
146 } 147 }
147 148
148 void EventHandlerRegistry::didRemoveEventHandler(EventTarget& target, EventHandl erClass handlerClass) 149 void EventHandlerRegistry::didRemoveEventHandler(EventTarget& target, EventHandl erClass handlerClass)
149 { 150 {
150 updateEventHandlerInternal(Remove, handlerClass, &target); 151 updateEventHandlerInternal(Remove, handlerClass, &target);
151 } 152 }
152 153
153 void EventHandlerRegistry::didMoveIntoFrameHost(EventTarget& target) 154 void EventHandlerRegistry::didMoveIntoFrameHost(EventTarget& target)
154 { 155 {
155 if (!target.hasEventListeners()) 156 if (!target.hasEventListeners())
156 return; 157 return;
157 158
159 // This code is not efficient at all.
158 Vector<AtomicString> eventTypes = target.eventTypes(); 160 Vector<AtomicString> eventTypes = target.eventTypes();
159 for (size_t i = 0; i < eventTypes.size(); ++i) { 161 for (size_t i = 0; i < eventTypes.size(); ++i) {
160 EventHandlerClass handlerClass;
161 if (!eventTypeToClass(eventTypes[i], &handlerClass))
162 continue;
163 EventListenerVector* listeners = target.getEventListeners(eventTypes[i]) ; 162 EventListenerVector* listeners = target.getEventListeners(eventTypes[i]) ;
164 if (!listeners) 163 if (!listeners)
165 continue; 164 continue;
166 for (unsigned count = listeners->size(); count > 0; --count) 165 for (unsigned count = listeners->size(); count > 0; --count) {
166 EventHandlerClass handlerClass;
167 if (!eventTypeToClass(eventTypes[i], (*listeners)[count - 1].options (), &handlerClass))
168 continue;
169
167 didAddEventHandler(target, handlerClass); 170 didAddEventHandler(target, handlerClass);
171 }
168 } 172 }
169 } 173 }
170 174
171 void EventHandlerRegistry::didMoveOutOfFrameHost(EventTarget& target) 175 void EventHandlerRegistry::didMoveOutOfFrameHost(EventTarget& target)
172 { 176 {
173 didRemoveAllEventHandlers(target); 177 didRemoveAllEventHandlers(target);
174 } 178 }
175 179
176 void EventHandlerRegistry::didMoveBetweenFrameHosts(EventTarget& target, FrameHo st* oldFrameHost, FrameHost* newFrameHost) 180 void EventHandlerRegistry::didMoveBetweenFrameHosts(EventTarget& target, FrameHo st* oldFrameHost, FrameHost* newFrameHost)
177 { 181 {
(...skipping 18 matching lines...) Expand all
196 void EventHandlerRegistry::notifyHasHandlersChanged(EventHandlerClass handlerCla ss, bool hasActiveHandlers) 200 void EventHandlerRegistry::notifyHasHandlersChanged(EventHandlerClass handlerCla ss, bool hasActiveHandlers)
197 { 201 {
198 ScrollingCoordinator* scrollingCoordinator = m_frameHost->page().scrollingCo ordinator(); 202 ScrollingCoordinator* scrollingCoordinator = m_frameHost->page().scrollingCo ordinator();
199 203
200 switch (handlerClass) { 204 switch (handlerClass) {
201 case ScrollEvent: 205 case ScrollEvent:
202 if (scrollingCoordinator) 206 if (scrollingCoordinator)
203 scrollingCoordinator->updateHaveScrollEventHandlers(); 207 scrollingCoordinator->updateHaveScrollEventHandlers();
204 break; 208 break;
205 case WheelEvent: 209 case WheelEvent:
210 case WheelEventPassive:
206 if (scrollingCoordinator) 211 if (scrollingCoordinator)
207 scrollingCoordinator->updateHaveWheelEventHandlers(); 212 scrollingCoordinator->updateWheelEventListenerProperties();
208 break; 213 break;
209 case TouchEvent: 214 case TouchEvent:
215 case TouchEventPassive:
216 if (scrollingCoordinator)
217 scrollingCoordinator->updateTouchEventListenerProperties();
210 m_frameHost->chromeClient().needTouchEvents(hasActiveHandlers); 218 m_frameHost->chromeClient().needTouchEvents(hasActiveHandlers);
211 break; 219 break;
212 #if ENABLE(ASSERT) 220 #if ENABLE(ASSERT)
213 case EventsForTesting: 221 case EventsForTesting:
214 break; 222 break;
215 #endif 223 #endif
216 default: 224 default:
217 ASSERT_NOT_REACHED(); 225 ASSERT_NOT_REACHED();
218 break; 226 break;
219 } 227 }
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
296 ASSERT(window->frame()); 304 ASSERT(window->frame());
297 ASSERT(window->frame()->host()); 305 ASSERT(window->frame()->host());
298 ASSERT(window->frame()->host() == m_frameHost); 306 ASSERT(window->frame()->host() == m_frameHost);
299 } 307 }
300 } 308 }
301 } 309 }
302 #endif // ENABLE(ASSERT) 310 #endif // ENABLE(ASSERT)
303 } 311 }
304 312
305 } // namespace blink 313 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698