| Index: Source/core/frame/EventHandlerRegistry.cpp
|
| diff --git a/Source/core/frame/EventHandlerRegistry.cpp b/Source/core/frame/EventHandlerRegistry.cpp
|
| index 251cfbcf162dce531787e991bb26bbb74676e48d..96334e9c9fcaf3a7bdf3eafdf5c3f829f86c8136 100644
|
| --- a/Source/core/frame/EventHandlerRegistry.cpp
|
| +++ b/Source/core/frame/EventHandlerRegistry.cpp
|
| @@ -9,6 +9,8 @@
|
| #include "core/frame/LocalDOMWindow.h"
|
| #include "core/frame/LocalFrame.h"
|
| #include "core/html/HTMLFrameOwnerElement.h"
|
| +#include "core/page/Chrome.h"
|
| +#include "core/page/ChromeClient.h"
|
| #include "core/page/Page.h"
|
| #include "core/page/scrolling/ScrollingCoordinator.h"
|
|
|
| @@ -30,6 +32,8 @@ bool EventHandlerRegistry::eventTypeToClass(const AtomicString& eventType, Event
|
| *result = ScrollEvent;
|
| } else if (eventType == EventTypeNames::wheel || eventType == EventTypeNames::mousewheel) {
|
| *result = WheelEvent;
|
| + } else if (isTouchEventType(eventType)) {
|
| + *result = TouchEvent;
|
| #if ENABLE(ASSERT)
|
| } else if (eventType == EventTypeNames::load || eventType == EventTypeNames::mousemove || eventType == EventTypeNames::touchstart) {
|
| *result = EventsForTesting;
|
| @@ -48,6 +52,7 @@ const EventTargetSet* EventHandlerRegistry::eventHandlerTargets(EventHandlerClas
|
|
|
| bool EventHandlerRegistry::hasEventHandlers(EventHandlerClass handlerClass) const
|
| {
|
| + checkConsistency();
|
| return m_targets[handlerClass].size();
|
| }
|
|
|
| @@ -79,14 +84,15 @@ bool EventHandlerRegistry::updateEventHandlerTargets(ChangeOperation op, EventHa
|
|
|
| void EventHandlerRegistry::updateEventHandlerInternal(ChangeOperation op, EventHandlerClass handlerClass, EventTarget* target)
|
| {
|
| - bool hadHandlers = hasEventHandlers(handlerClass);
|
| - updateEventHandlerTargets(op, handlerClass, target);
|
| - bool hasHandlers = hasEventHandlers(handlerClass);
|
| + bool hadHandlers = m_targets[handlerClass].size();
|
| + bool targetSetChanged = updateEventHandlerTargets(op, handlerClass, target);
|
| + bool hasHandlers = m_targets[handlerClass].size();
|
|
|
| - if (hadHandlers != hasHandlers) {
|
| + if (hadHandlers != hasHandlers)
|
| notifyHasHandlersChanged(handlerClass, hasHandlers);
|
| - }
|
| - checkConsistency();
|
| +
|
| + if (targetSetChanged)
|
| + notifyDidAddOrRemoveEventHandlerTarget(handlerClass);
|
| }
|
|
|
| void EventHandlerRegistry::updateEventHandlerOfType(ChangeOperation op, const AtomicString& eventType, EventTarget* target)
|
| @@ -119,38 +125,41 @@ void EventHandlerRegistry::didRemoveEventHandler(EventTarget& target, EventHandl
|
|
|
| void EventHandlerRegistry::didMoveIntoFrameHost(EventTarget& target)
|
| {
|
| - updateAllEventHandlers(Add, target);
|
| + if (!target.hasEventListeners())
|
| + return;
|
| +
|
| + Vector<AtomicString> eventTypes = target.eventTypes();
|
| + for (size_t i = 0; i < eventTypes.size(); ++i) {
|
| + EventHandlerClass handlerClass;
|
| + if (!eventTypeToClass(eventTypes[i], &handlerClass))
|
| + continue;
|
| + for (unsigned count = target.getEventListeners(eventTypes[i]).size(); count > 0; --count)
|
| + didAddEventHandler(target, handlerClass);
|
| + }
|
| }
|
|
|
| void EventHandlerRegistry::didMoveOutOfFrameHost(EventTarget& target)
|
| {
|
| - updateAllEventHandlers(RemoveAll, target);
|
| + didRemoveAllEventHandlers(target);
|
| }
|
|
|
| -void EventHandlerRegistry::didRemoveAllEventHandlers(EventTarget& target)
|
| +void EventHandlerRegistry::didMoveBetweenFrameHosts(EventTarget& target, FrameHost* oldFrameHost, FrameHost* newFrameHost)
|
| {
|
| + ASSERT(newFrameHost != oldFrameHost);
|
| for (size_t i = 0; i < EventHandlerClassCount; ++i) {
|
| EventHandlerClass handlerClass = static_cast<EventHandlerClass>(i);
|
| - updateEventHandlerInternal(RemoveAll, handlerClass, &target);
|
| + const EventTargetSet* targets = &oldFrameHost->eventHandlerRegistry().m_targets[handlerClass];
|
| + for (unsigned count = targets->count(&target); count > 0; --count)
|
| + newFrameHost->eventHandlerRegistry().didAddEventHandler(target, handlerClass);
|
| + oldFrameHost->eventHandlerRegistry().didRemoveAllEventHandlers(target);
|
| }
|
| }
|
|
|
| -void EventHandlerRegistry::updateAllEventHandlers(ChangeOperation op, EventTarget& target)
|
| +void EventHandlerRegistry::didRemoveAllEventHandlers(EventTarget& target)
|
| {
|
| - if (!target.hasEventListeners())
|
| - return;
|
| -
|
| - Vector<AtomicString> eventTypes = target.eventTypes();
|
| - for (size_t i = 0; i < eventTypes.size(); ++i) {
|
| - EventHandlerClass handlerClass;
|
| - if (!eventTypeToClass(eventTypes[i], &handlerClass))
|
| - continue;
|
| - if (op == RemoveAll) {
|
| - updateEventHandlerInternal(op, handlerClass, &target);
|
| - continue;
|
| - }
|
| - for (unsigned count = target.getEventListeners(eventTypes[i]).size(); count > 0; --count)
|
| - updateEventHandlerInternal(op, handlerClass, &target);
|
| + for (size_t i = 0; i < EventHandlerClassCount; ++i) {
|
| + EventHandlerClass handlerClass = static_cast<EventHandlerClass>(i);
|
| + updateEventHandlerInternal(RemoveAll, handlerClass, &target);
|
| }
|
| }
|
|
|
| @@ -167,6 +176,9 @@ void EventHandlerRegistry::notifyHasHandlersChanged(EventHandlerClass handlerCla
|
| if (scrollingCoordinator)
|
| scrollingCoordinator->updateHaveWheelEventHandlers();
|
| break;
|
| + case TouchEvent:
|
| + m_frameHost.chrome().client().needTouchEvents(hasActiveHandlers);
|
| + break;
|
| #if ENABLE(ASSERT)
|
| case EventsForTesting:
|
| break;
|
| @@ -177,6 +189,13 @@ void EventHandlerRegistry::notifyHasHandlersChanged(EventHandlerClass handlerCla
|
| }
|
| }
|
|
|
| +void EventHandlerRegistry::notifyDidAddOrRemoveEventHandlerTarget(EventHandlerClass handlerClass)
|
| +{
|
| + ScrollingCoordinator* scrollingCoordinator = m_frameHost.page().scrollingCoordinator();
|
| + if (scrollingCoordinator && handlerClass == TouchEvent)
|
| + scrollingCoordinator->touchEventTargetRectsDidChange();
|
| +}
|
| +
|
| void EventHandlerRegistry::trace(Visitor* visitor)
|
| {
|
| visitor->registerWeakMembers<EventHandlerRegistry, &EventHandlerRegistry::clearWeakMembers>(this);
|
|
|