Index: third_party/WebKit/Source/core/frame/EventHandlerRegistry.cpp |
diff --git a/third_party/WebKit/Source/core/frame/EventHandlerRegistry.cpp b/third_party/WebKit/Source/core/frame/EventHandlerRegistry.cpp |
index 292ff13d9f96c13643d93ded6f52a55f1015465b..d512ecb039c70657391d772d635fe0c463b5d157 100644 |
--- a/third_party/WebKit/Source/core/frame/EventHandlerRegistry.cpp |
+++ b/third_party/WebKit/Source/core/frame/EventHandlerRegistry.cpp |
@@ -4,6 +4,7 @@ |
#include "core/frame/EventHandlerRegistry.h" |
+#include "core/events/EventListenerOptions.h" |
#include "core/frame/LocalDOMWindow.h" |
#include "core/frame/LocalFrame.h" |
#include "core/html/HTMLFrameOwnerElement.h" |
@@ -49,18 +50,18 @@ EventHandlerRegistry::~EventHandlerRegistry() |
checkConsistency(); |
} |
-bool EventHandlerRegistry::eventTypeToClass(const AtomicString& eventType, EventHandlerClass* result) |
+bool EventHandlerRegistry::eventTypeToClass(const AtomicString& eventType, const EventListenerOptions& options, EventHandlerClass* result) |
{ |
if (eventType == EventTypeNames::scroll) { |
*result = ScrollEvent; |
} else if (eventType == EventTypeNames::wheel || eventType == EventTypeNames::mousewheel) { |
- *result = WheelEvent; |
+ *result = options.passive() ? WheelEventPassive : WheelEvent; |
} else if (isTouchEventType(eventType)) { |
- *result = TouchEvent; |
+ *result = options.passive() ? TouchEventPassive : TouchEvent; |
} else if (isPointerEventType(eventType)) { |
// The EventHandlerClass is still TouchEvent below since we are firing PointerEvents only from |
// EventHandler::handleTouchEvent for now. See crbug.com/476565. |
- *result = TouchEvent; |
+ *result = options.passive() ? TouchEventPassive : TouchEvent; |
#if ENABLE(ASSERT) |
} else if (eventType == EventTypeNames::load || eventType == EventTypeNames::mousemove || eventType == EventTypeNames::touchstart) { |
*result = EventsForTesting; |
@@ -122,22 +123,22 @@ void EventHandlerRegistry::updateEventHandlerInternal(ChangeOperation op, EventH |
notifyDidAddOrRemoveEventHandlerTarget(handlerClass); |
} |
-void EventHandlerRegistry::updateEventHandlerOfType(ChangeOperation op, const AtomicString& eventType, EventTarget* target) |
+void EventHandlerRegistry::updateEventHandlerOfType(ChangeOperation op, const AtomicString& eventType, const EventListenerOptions& options, EventTarget* target) |
{ |
EventHandlerClass handlerClass; |
- if (!eventTypeToClass(eventType, &handlerClass)) |
+ if (!eventTypeToClass(eventType, options, &handlerClass)) |
return; |
updateEventHandlerInternal(op, handlerClass, target); |
} |
-void EventHandlerRegistry::didAddEventHandler(EventTarget& target, const AtomicString& eventType) |
+void EventHandlerRegistry::didAddEventHandler(EventTarget& target, const AtomicString& eventType, const EventListenerOptions& options) |
{ |
- updateEventHandlerOfType(Add, eventType, &target); |
+ updateEventHandlerOfType(Add, eventType, options, &target); |
} |
-void EventHandlerRegistry::didRemoveEventHandler(EventTarget& target, const AtomicString& eventType) |
+void EventHandlerRegistry::didRemoveEventHandler(EventTarget& target, const AtomicString& eventType, const EventListenerOptions& options) |
{ |
- updateEventHandlerOfType(Remove, eventType, &target); |
+ updateEventHandlerOfType(Remove, eventType, options, &target); |
} |
void EventHandlerRegistry::didAddEventHandler(EventTarget& target, EventHandlerClass handlerClass) |
@@ -155,16 +156,19 @@ void EventHandlerRegistry::didMoveIntoFrameHost(EventTarget& target) |
if (!target.hasEventListeners()) |
return; |
+ // This code is not efficient at all. |
Vector<AtomicString> eventTypes = target.eventTypes(); |
for (size_t i = 0; i < eventTypes.size(); ++i) { |
- EventHandlerClass handlerClass; |
- if (!eventTypeToClass(eventTypes[i], &handlerClass)) |
- continue; |
EventListenerVector* listeners = target.getEventListeners(eventTypes[i]); |
if (!listeners) |
continue; |
- for (unsigned count = listeners->size(); count > 0; --count) |
+ for (unsigned count = listeners->size(); count > 0; --count) { |
+ EventHandlerClass handlerClass; |
+ if (!eventTypeToClass(eventTypes[i], (*listeners)[count - 1].options(), &handlerClass)) |
+ continue; |
+ |
didAddEventHandler(target, handlerClass); |
+ } |
} |
} |
@@ -203,10 +207,14 @@ void EventHandlerRegistry::notifyHasHandlersChanged(EventHandlerClass handlerCla |
scrollingCoordinator->updateHaveScrollEventHandlers(); |
break; |
case WheelEvent: |
+ case WheelEventPassive: |
if (scrollingCoordinator) |
- scrollingCoordinator->updateHaveWheelEventHandlers(); |
+ scrollingCoordinator->updateWheelEventListenerProperties(); |
break; |
case TouchEvent: |
+ case TouchEventPassive: |
+ if (scrollingCoordinator) |
+ scrollingCoordinator->updateTouchEventListenerProperties(); |
m_frameHost->chromeClient().needTouchEvents(hasActiveHandlers); |
break; |
#if ENABLE(ASSERT) |