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