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 1a8c32ca33cbb0f9825f24aa48f71c1b88e8461e..fe05d753ec28e6c5c51aeb50e180e880dc3c29cf 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" |
@@ -37,6 +38,16 @@ inline bool isPointerEventType(const AtomicString& eventType) |
|| eventType == EventTypeNames::pointerup; |
} |
+WebEventListenerProperties webEventListenerProperties(bool hasBlocking, bool hasPassive) |
+{ |
+ WebEventListenerProperties result = WebEventListenerProperties::Nothing; |
+ if (hasBlocking) |
+ result |= WebEventListenerProperties::Blocking; |
+ if (hasPassive) |
+ result |= WebEventListenerProperties::Passive; |
+ return result; |
+} |
+ |
} // namespace |
EventHandlerRegistry::EventHandlerRegistry(FrameHost& frameHost) |
@@ -49,18 +60,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; |
Rick Byers
2016/02/02 21:44:46
Pointer events never block scrolling, so their lis
dtapuska
2016/02/03 16:30:58
Done.
|
#if ENABLE(ASSERT) |
} else if (eventType == EventTypeNames::load || eventType == EventTypeNames::mousemove || eventType == EventTypeNames::touchstart) { |
*result = EventsForTesting; |
@@ -122,22 +133,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 +166,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); |
+ } |
} |
} |
@@ -200,10 +214,12 @@ void EventHandlerRegistry::notifyHasHandlersChanged(EventHandlerClass handlerCla |
m_frameHost->chromeClient().setHaveScrollEventHandlers(hasActiveHandlers); |
break; |
case WheelEvent: |
- m_frameHost->chromeClient().setHaveWheelEventHandlers(hasActiveHandlers); |
+ case WheelEventPassive: |
+ m_frameHost->chromeClient().setEventListenerProperties(WebEventListenerClass::MouseWheel, webEventListenerProperties(hasEventHandlers(WheelEvent), hasEventHandlers(WheelEventPassive))); |
break; |
case TouchEvent: |
- m_frameHost->chromeClient().needTouchEvents(hasActiveHandlers); |
+ case TouchEventPassive: |
+ m_frameHost->chromeClient().setEventListenerProperties(WebEventListenerClass::Touch, webEventListenerProperties(hasEventHandlers(TouchEvent), hasEventHandlers(TouchEventPassive))); |
break; |
#if ENABLE(ASSERT) |
case EventsForTesting: |