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..b889e6cab12db1871bb7de93baf527fb4d1cfa12 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,15 @@ inline bool isPointerEventType(const AtomicString& eventType) |
|| eventType == EventTypeNames::pointerup; |
} |
+WebEventListenerProperties webEventListenerProperties(bool hasBlocking, bool hasPassive) |
+{ |
+ if (hasBlocking) |
+ return WebEventListenerProperties::Blocking; |
+ if (hasPassive) |
+ return WebEventListenerProperties::Passive; |
+ return WebEventListenerProperties::Nothing; |
+} |
+ |
} // namespace |
EventHandlerRegistry::EventHandlerRegistry(FrameHost& frameHost) |
@@ -49,18 +59,19 @@ 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 : WheelEventBlocking; |
} else if (isTouchEventType(eventType)) { |
- *result = TouchEvent; |
+ *result = options.passive() ? TouchEventPassive : TouchEventBlocking; |
} 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; |
+ // The EventHandlerClass is TouchEventPassive since the pointer events |
+ // never block scrolling and the compositor only needs to know |
+ // about the touch listeners. |
+ *result = TouchEventPassive; |
#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); |
+ } |
} |
} |
@@ -199,11 +213,13 @@ void EventHandlerRegistry::notifyHasHandlersChanged(EventHandlerClass handlerCla |
case ScrollEvent: |
m_frameHost->chromeClient().setHaveScrollEventHandlers(hasActiveHandlers); |
break; |
- case WheelEvent: |
- m_frameHost->chromeClient().setHaveWheelEventHandlers(hasActiveHandlers); |
+ case WheelEventBlocking: |
+ case WheelEventPassive: |
+ m_frameHost->chromeClient().setEventListenerProperties(WebEventListenerClass::MouseWheel, webEventListenerProperties(hasEventHandlers(WheelEventBlocking), hasEventHandlers(WheelEventPassive))); |
break; |
- case TouchEvent: |
- m_frameHost->chromeClient().needTouchEvents(hasActiveHandlers); |
+ case TouchEventBlocking: |
+ case TouchEventPassive: |
+ m_frameHost->chromeClient().setEventListenerProperties(WebEventListenerClass::Touch, webEventListenerProperties(hasEventHandlers(TouchEventBlocking), hasEventHandlers(TouchEventPassive))); |
break; |
#if ENABLE(ASSERT) |
case EventsForTesting: |
@@ -218,7 +234,7 @@ void EventHandlerRegistry::notifyHasHandlersChanged(EventHandlerClass handlerCla |
void EventHandlerRegistry::notifyDidAddOrRemoveEventHandlerTarget(EventHandlerClass handlerClass) |
{ |
ScrollingCoordinator* scrollingCoordinator = m_frameHost->page().scrollingCoordinator(); |
- if (scrollingCoordinator && handlerClass == TouchEvent) |
+ if (scrollingCoordinator && handlerClass == TouchEventBlocking) |
scrollingCoordinator->touchEventTargetRectsDidChange(); |
} |