Chromium Code Reviews| Index: Source/core/frame/EventHandlerRegistry.cpp |
| diff --git a/Source/core/frame/EventHandlerRegistry.cpp b/Source/core/frame/EventHandlerRegistry.cpp |
| index 5161cf92e82630ebc6e88c224c7c0a09c99f858d..0875283575d4a5d3c23c799d0db6ed6abca017cb 100644 |
| --- a/Source/core/frame/EventHandlerRegistry.cpp |
| +++ b/Source/core/frame/EventHandlerRegistry.cpp |
| @@ -14,6 +14,15 @@ |
| namespace WebCore { |
| +EventHandlerRegistry::HandlerState::HandlerState() |
| + : externalHandlerCount(0) |
| +{ |
| +} |
| + |
| +EventHandlerRegistry::HandlerState::~HandlerState() |
| +{ |
| +} |
| + |
| EventHandlerRegistry::EventHandlerRegistry(FrameHost& frameHost) |
| : m_frameHost(frameHost) |
| { |
| @@ -28,6 +37,8 @@ bool EventHandlerRegistry::eventTypeToClass(const AtomicString& eventType, Event |
| { |
| if (eventType == EventTypeNames::scroll) { |
| *result = ScrollEvent; |
| + } else if (eventType == EventTypeNames::wheel || eventType == EventTypeNames::mousewheel) { |
| + *result = WheelEvent; |
| #if ASSERT_ENABLED |
| } else if (eventType == EventTypeNames::load || eventType == EventTypeNames::mousemove || eventType == EventTypeNames::touchstart) { |
| *result = EventsForTesting; |
| @@ -41,17 +52,34 @@ bool EventHandlerRegistry::eventTypeToClass(const AtomicString& eventType, Event |
| const EventTargetSet* EventHandlerRegistry::eventHandlerTargets(EventHandlerClass handlerClass) const |
| { |
| checkConsistency(); |
| - return &m_targets[handlerClass]; |
| + return &m_handlers[handlerClass].targets; |
| +} |
| + |
| +unsigned EventHandlerRegistry::externalEventHandlerCount(EventHandlerClass handlerClass) const |
| +{ |
| + return m_handlers[handlerClass].externalHandlerCount; |
| } |
| bool EventHandlerRegistry::hasEventHandlers(EventHandlerClass handlerClass) const |
| { |
| - return m_targets[handlerClass].size(); |
| + const HandlerState& state = m_handlers[handlerClass]; |
| + return state.targets.size() || state.externalHandlerCount; |
| +} |
| + |
| +void EventHandlerRegistry::updateExternalHandlerCount(ChangeOperation op, EventHandlerClass handlerClass) |
| +{ |
| + if (op == Add) { |
| + m_handlers[handlerClass].externalHandlerCount++; |
| + } else { |
| + ASSERT(op == Remove); |
| + ASSERT(m_handlers[handlerClass].externalHandlerCount > 0); |
| + m_handlers[handlerClass].externalHandlerCount--; |
| + } |
| } |
| bool EventHandlerRegistry::updateEventHandlerTargets(ChangeOperation op, EventHandlerClass handlerClass, EventTarget* target) |
| { |
| - EventTargetSet* targets = &m_targets[handlerClass]; |
| + EventTargetSet* targets = &m_handlers[handlerClass].targets; |
| if (op == Add) { |
| if (!targets->add(target).isNewEntry) { |
| // Just incremented refcount, no real change. |
| @@ -78,7 +106,11 @@ bool EventHandlerRegistry::updateEventHandlerTargets(ChangeOperation op, EventHa |
| void EventHandlerRegistry::updateEventHandlerInternal(ChangeOperation op, EventHandlerClass handlerClass, EventTarget* target) |
| { |
| bool hadHandlers = hasEventHandlers(handlerClass); |
| - updateEventHandlerTargets(op, handlerClass, target); |
| + if (target) { |
| + updateEventHandlerTargets(op, handlerClass, target); |
| + } else { |
| + updateExternalHandlerCount(op, handlerClass); |
| + } |
| bool hasHandlers = hasEventHandlers(handlerClass); |
| if (hadHandlers != hasHandlers) { |
| @@ -95,6 +127,16 @@ void EventHandlerRegistry::updateEventHandlerOfType(ChangeOperation op, const At |
| updateEventHandlerInternal(op, handlerClass, target); |
| } |
| +void EventHandlerRegistry::didAddExternalEventHandler(const AtomicString& eventType) |
| +{ |
| + updateEventHandlerOfType(Add, eventType, 0); |
| +} |
| + |
| +void EventHandlerRegistry::didRemoveExternalEventHandler(const AtomicString& eventType) |
| +{ |
| + updateEventHandlerOfType(Remove, eventType, 0); |
| +} |
| + |
| void EventHandlerRegistry::didAddEventHandler(EventTarget& target, const AtomicString& eventType) |
| { |
| updateEventHandlerOfType(Add, eventType, &target); |
| @@ -155,12 +197,21 @@ void EventHandlerRegistry::updateAllEventHandlers(ChangeOperation op, EventTarge |
| void EventHandlerRegistry::notifyHasHandlersChanged(EventHandlerClass handlerClass, bool hasActiveHandlers) |
| { |
| ScrollingCoordinator* scrollingCoordinator = m_frameHost.page().scrollingCoordinator(); |
| + LocalFrame* mainFrame = m_frameHost.page().mainFrame(); |
| switch (handlerClass) { |
| case ScrollEvent: |
| if (scrollingCoordinator) |
| scrollingCoordinator->updateHaveScrollEventHandlers(); |
| break; |
| + case WheelEvent: |
| + if (mainFrame) { |
| + // TODO(skyostil): This notification is wired up to a black hole, so remove it. |
|
ojan
2014/06/02 21:23:04
Blink style is:
// FIXME: ...
Sami
2014/06/03 15:57:45
Done.
|
| + mainFrame->notifyChromeClientWheelEventHandlerCountChanged(); |
| + } |
| + if (scrollingCoordinator) |
| + scrollingCoordinator->updateHaveWheelEventHandlers(); |
| + break; |
| #if ASSERT_ENABLED |
| case EventsForTesting: |
| break; |
| @@ -181,7 +232,7 @@ void EventHandlerRegistry::clearWeakMembers(Visitor* visitor) |
| Vector<EventTarget*> deadTargets; |
| for (size_t i = 0; i < EventHandlerClassCount; ++i) { |
| EventHandlerClass handlerClass = static_cast<EventHandlerClass>(i); |
| - const EventTargetSet* targets = &m_targets[handlerClass]; |
| + const EventTargetSet* targets = &m_handlers[handlerClass].targets; |
| for (EventTargetSet::const_iterator it = targets->begin(); it != targets->end(); ++it) { |
| Node* node = it->key->toNode(); |
| DOMWindow* window = it->key->toDOMWindow(); |
| @@ -202,7 +253,7 @@ void EventHandlerRegistry::documentDetached(Document& document) |
| for (size_t handlerClassIndex = 0; handlerClassIndex < EventHandlerClassCount; ++handlerClassIndex) { |
| EventHandlerClass handlerClass = static_cast<EventHandlerClass>(handlerClassIndex); |
| Vector<EventTarget*> targetsToRemove; |
| - const EventTargetSet* targets = &m_targets[handlerClass]; |
| + const EventTargetSet* targets = &m_handlers[handlerClass].targets; |
| for (EventTargetSet::const_iterator iter = targets->begin(); iter != targets->end(); ++iter) { |
| if (Node* node = iter->key->toNode()) { |
| for (Document* doc = &node->document(); doc; doc = doc->ownerElement() ? &doc->ownerElement()->document() : 0) { |
| @@ -228,7 +279,7 @@ void EventHandlerRegistry::checkConsistency() const |
| #if ASSERT_ENABLED |
| for (size_t i = 0; i < EventHandlerClassCount; ++i) { |
| EventHandlerClass handlerClass = static_cast<EventHandlerClass>(i); |
| - const EventTargetSet* targets = &m_targets[handlerClass]; |
| + const EventTargetSet* targets = &m_handlers[handlerClass].targets; |
| for (EventTargetSet::const_iterator iter = targets->begin(); iter != targets->end(); ++iter) { |
| if (Node* node = iter->key->toNode()) { |
| // See the comment for |documentDetached| if either of these assertions fails. |