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

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

Issue 2916893003: Bookkeep the pointer event listeners added to page (Closed)
Patch Set: fix rebase error Created 3 years, 6 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/events/EventListenerOptions.h"
8 #include "core/events/EventUtil.h" 8 #include "core/events/EventUtil.h"
9 #include "core/frame/LocalDOMWindow.h" 9 #include "core/frame/LocalDOMWindow.h"
10 #include "core/frame/LocalFrame.h" 10 #include "core/frame/LocalFrame.h"
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 *result = options.passive() ? kWheelEventPassive : kWheelEventBlocking; 49 *result = options.passive() ? kWheelEventPassive : kWheelEventBlocking;
50 } else if (event_type == EventTypeNames::touchend || 50 } else if (event_type == EventTypeNames::touchend ||
51 event_type == EventTypeNames::touchcancel) { 51 event_type == EventTypeNames::touchcancel) {
52 *result = options.passive() ? kTouchEndOrCancelEventPassive 52 *result = options.passive() ? kTouchEndOrCancelEventPassive
53 : kTouchEndOrCancelEventBlocking; 53 : kTouchEndOrCancelEventBlocking;
54 } else if (event_type == EventTypeNames::touchstart || 54 } else if (event_type == EventTypeNames::touchstart ||
55 event_type == EventTypeNames::touchmove) { 55 event_type == EventTypeNames::touchmove) {
56 *result = options.passive() ? kTouchStartOrMoveEventPassive 56 *result = options.passive() ? kTouchStartOrMoveEventPassive
57 : kTouchStartOrMoveEventBlocking; 57 : kTouchStartOrMoveEventBlocking;
58 } else if (EventUtil::IsPointerEventType(event_type)) { 58 } else if (EventUtil::IsPointerEventType(event_type)) {
59 // The EventHandlerClass is TouchStartOrMoveEventPassive since 59 // The pointer events never block scrolling and the compositor
60 // the pointer events never block scrolling and the compositor
61 // only needs to know about the touch listeners. 60 // only needs to know about the touch listeners.
62 *result = kTouchStartOrMoveEventPassive; 61 *result = kPointerEvent;
63 #if DCHECK_IS_ON() 62 #if DCHECK_IS_ON()
64 } else if (event_type == EventTypeNames::load || 63 } else if (event_type == EventTypeNames::load ||
65 event_type == EventTypeNames::mousemove || 64 event_type == EventTypeNames::mousemove ||
66 event_type == EventTypeNames::touchstart) { 65 event_type == EventTypeNames::touchstart) {
67 *result = kEventsForTesting; 66 *result = kEventsForTesting;
68 #endif 67 #endif
69 } else { 68 } else {
70 return false; 69 return false;
71 } 70 }
72 return true; 71 return true;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 } else { 104 } else {
106 if (!targets->erase(target)) { 105 if (!targets->erase(target)) {
107 // Just decremented refcount, no real update. 106 // Just decremented refcount, no real update.
108 return false; 107 return false;
109 } 108 }
110 } 109 }
111 } 110 }
112 return true; 111 return true;
113 } 112 }
114 113
115 void EventHandlerRegistry::UpdateEventHandlerInternal( 114 bool EventHandlerRegistry::UpdateEventHandlerInternal(
116 ChangeOperation op, 115 ChangeOperation op,
117 EventHandlerClass handler_class, 116 EventHandlerClass handler_class,
118 EventTarget* target) { 117 EventTarget* target) {
119 bool had_handlers = targets_[handler_class].size(); 118 bool had_handlers = targets_[handler_class].size();
120 bool target_set_changed = 119 bool target_set_changed =
121 UpdateEventHandlerTargets(op, handler_class, target); 120 UpdateEventHandlerTargets(op, handler_class, target);
122 bool has_handlers = targets_[handler_class].size(); 121 bool has_handlers = targets_[handler_class].size();
123 122
124 if (had_handlers != has_handlers) { 123 bool handlers_changed = had_handlers != has_handlers;
125 LocalFrame* frame = nullptr;
126 if (Node* node = target->ToNode()) {
127 frame = node->GetDocument().GetFrame();
128 } else if (LocalDOMWindow* dom_window = target->ToLocalDOMWindow()) {
129 frame = dom_window->GetFrame();
130 } else {
131 NOTREACHED() << "Unexpected target type for event handler.";
132 }
133 124
134 NotifyHasHandlersChanged(frame, handler_class, has_handlers); 125 if (op != kRemoveAll) {
126 if (handlers_changed)
127 NotifyHasHandlersChanged(target, handler_class, has_handlers);
128
129 if (target_set_changed)
130 NotifyDidAddOrRemoveEventHandlerTarget(handler_class);
135 } 131 }
136 132 return handlers_changed;
137 if (target_set_changed)
138 NotifyDidAddOrRemoveEventHandlerTarget(handler_class);
139 } 133 }
140 134
141 void EventHandlerRegistry::UpdateEventHandlerOfType( 135 void EventHandlerRegistry::UpdateEventHandlerOfType(
142 ChangeOperation op, 136 ChangeOperation op,
143 const AtomicString& event_type, 137 const AtomicString& event_type,
144 const AddEventListenerOptions& options, 138 const AddEventListenerOptions& options,
145 EventTarget* target) { 139 EventTarget* target) {
146 EventHandlerClass handler_class; 140 EventHandlerClass handler_class;
147 if (!EventTypeToClass(event_type, options, &handler_class)) 141 if (!EventTypeToClass(event_type, options, &handler_class))
148 return; 142 return;
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
193 DidAddEventHandler(target, handler_class); 187 DidAddEventHandler(target, handler_class);
194 } 188 }
195 } 189 }
196 } 190 }
197 191
198 void EventHandlerRegistry::DidMoveOutOfPage(EventTarget& target) { 192 void EventHandlerRegistry::DidMoveOutOfPage(EventTarget& target) {
199 DidRemoveAllEventHandlers(target); 193 DidRemoveAllEventHandlers(target);
200 } 194 }
201 195
202 void EventHandlerRegistry::DidRemoveAllEventHandlers(EventTarget& target) { 196 void EventHandlerRegistry::DidRemoveAllEventHandlers(EventTarget& target) {
197 bool handlers_changed[kEventHandlerClassCount];
198 bool target_set_changed[kEventHandlerClassCount];
199
203 for (size_t i = 0; i < kEventHandlerClassCount; ++i) { 200 for (size_t i = 0; i < kEventHandlerClassCount; ++i) {
204 EventHandlerClass handler_class = static_cast<EventHandlerClass>(i); 201 EventHandlerClass handler_class = static_cast<EventHandlerClass>(i);
205 UpdateEventHandlerInternal(kRemoveAll, handler_class, &target); 202
203 EventTargetSet* targets = &targets_[handler_class];
204 target_set_changed[i] = targets->Contains(&target);
205
206 handlers_changed[i] =
207 UpdateEventHandlerInternal(kRemoveAll, handler_class, &target);
208 }
209
210 for (size_t i = 0; i < kEventHandlerClassCount; ++i) {
211 EventHandlerClass handler_class = static_cast<EventHandlerClass>(i);
212 if (handlers_changed[i]) {
213 bool has_handlers = targets_[handler_class].size();
214 NotifyHasHandlersChanged(&target, handler_class, has_handlers);
215 }
216 if (target_set_changed[i])
217 NotifyDidAddOrRemoveEventHandlerTarget(handler_class);
206 } 218 }
207 } 219 }
208 220
209 void EventHandlerRegistry::NotifyHasHandlersChanged( 221 void EventHandlerRegistry::NotifyHasHandlersChanged(
210 LocalFrame* frame, 222 EventTarget* target,
211 EventHandlerClass handler_class, 223 EventHandlerClass handler_class,
212 bool has_active_handlers) { 224 bool has_active_handlers) {
225 LocalFrame* frame = nullptr;
226 if (Node* node = target->ToNode()) {
227 frame = node->GetDocument().GetFrame();
228 } else if (LocalDOMWindow* dom_window = target->ToLocalDOMWindow()) {
229 frame = dom_window->GetFrame();
230 } else {
231 NOTREACHED() << "Unexpected target type for event handler.";
232 }
233
213 switch (handler_class) { 234 switch (handler_class) {
214 case kScrollEvent: 235 case kScrollEvent:
215 page_->GetChromeClient().SetHasScrollEventHandlers(frame, 236 page_->GetChromeClient().SetHasScrollEventHandlers(frame,
216 has_active_handlers); 237 has_active_handlers);
217 break; 238 break;
218 case kWheelEventBlocking: 239 case kWheelEventBlocking:
219 case kWheelEventPassive: 240 case kWheelEventPassive:
220 page_->GetChromeClient().SetEventListenerProperties( 241 page_->GetChromeClient().SetEventListenerProperties(
221 frame, WebEventListenerClass::kMouseWheel, 242 frame, WebEventListenerClass::kMouseWheel,
222 GetWebEventListenerProperties(HasEventHandlers(kWheelEventBlocking), 243 GetWebEventListenerProperties(HasEventHandlers(kWheelEventBlocking),
223 HasEventHandlers(kWheelEventPassive))); 244 HasEventHandlers(kWheelEventPassive)));
224 break; 245 break;
225 case kTouchStartOrMoveEventBlocking: 246 case kTouchStartOrMoveEventBlocking:
226 case kTouchStartOrMoveEventPassive: 247 case kTouchStartOrMoveEventPassive:
248 case kPointerEvent:
227 page_->GetChromeClient().SetEventListenerProperties( 249 page_->GetChromeClient().SetEventListenerProperties(
228 frame, WebEventListenerClass::kTouchStartOrMove, 250 frame, WebEventListenerClass::kTouchStartOrMove,
229 GetWebEventListenerProperties( 251 GetWebEventListenerProperties(
230 HasEventHandlers(kTouchStartOrMoveEventBlocking), 252 HasEventHandlers(kTouchStartOrMoveEventBlocking),
231 HasEventHandlers(kTouchStartOrMoveEventPassive))); 253 HasEventHandlers(kTouchStartOrMoveEventPassive) ||
254 HasEventHandlers(kPointerEvent)));
232 break; 255 break;
233 case kTouchEndOrCancelEventBlocking: 256 case kTouchEndOrCancelEventBlocking:
234 case kTouchEndOrCancelEventPassive: 257 case kTouchEndOrCancelEventPassive:
235 page_->GetChromeClient().SetEventListenerProperties( 258 page_->GetChromeClient().SetEventListenerProperties(
236 frame, WebEventListenerClass::kTouchEndOrCancel, 259 frame, WebEventListenerClass::kTouchEndOrCancel,
237 GetWebEventListenerProperties( 260 GetWebEventListenerProperties(
238 HasEventHandlers(kTouchEndOrCancelEventBlocking), 261 HasEventHandlers(kTouchEndOrCancelEventBlocking),
239 HasEventHandlers(kTouchEndOrCancelEventPassive))); 262 HasEventHandlers(kTouchEndOrCancelEventPassive)));
240 break; 263 break;
241 #if DCHECK_IS_ON() 264 #if DCHECK_IS_ON()
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
326 // its handlers properly. 349 // its handlers properly.
327 DCHECK(window->GetFrame()); 350 DCHECK(window->GetFrame());
328 DCHECK(window->GetFrame()->GetPage()); 351 DCHECK(window->GetFrame()->GetPage());
329 DCHECK(window->GetFrame()->GetPage() == page_); 352 DCHECK(window->GetFrame()->GetPage() == page_);
330 } 353 }
331 } 354 }
332 #endif // DCHECK_IS_ON() 355 #endif // DCHECK_IS_ON()
333 } 356 }
334 357
335 } // namespace blink 358 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698