| 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)
|
|
|