| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |