Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(368)

Unified Diff: Source/core/frame/EventHandlerRegistry.cpp

Issue 225903009: Migrate touch events to EventHandlerRegistry (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Rebased. Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/core/frame/EventHandlerRegistry.cpp
diff --git a/Source/core/frame/EventHandlerRegistry.cpp b/Source/core/frame/EventHandlerRegistry.cpp
index 478ce65904bdb1af7e12f1fe21ad465f5021fc4b..4f7be781efaaa77f1bd3e3f92df48394816cf8e4 100644
--- a/Source/core/frame/EventHandlerRegistry.cpp
+++ b/Source/core/frame/EventHandlerRegistry.cpp
@@ -9,6 +9,8 @@
#include "core/frame/DOMWindow.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 ASSERT_ENABLED
} 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)
@@ -117,14 +123,33 @@ void EventHandlerRegistry::didRemoveEventHandler(EventTarget& target, EventHandl
updateEventHandlerInternal(Remove, handlerClass, &target);
}
-void EventHandlerRegistry::didMoveIntoFrameHost(EventTarget& target)
+void EventHandlerRegistry::didMoveBetweenFrameHosts(EventTarget& target, FrameHost* oldFrameHost, FrameHost* newFrameHost)
{
- updateAllEventHandlers(Add, target);
-}
+ ASSERT(newFrameHost || oldFrameHost);
+ ASSERT(newFrameHost != oldFrameHost);
+ if (newFrameHost && !oldFrameHost) {
Rick Byers 2014/06/19 17:10:36 this code reads like it should really be 3 functio
Sami 2014/06/27 17:58:51 Agreed, let me clean this up.
Rick Byers 2014/06/27 21:36:51 Looks better, thanks.
+ if (!target.hasEventListeners())
+ return;
-void EventHandlerRegistry::didMoveOutOfFrameHost(EventTarget& target)
-{
- updateAllEventHandlers(RemoveAll, target);
+ 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)
+ newFrameHost->eventHandlerRegistry().didAddEventHandler(target, handlerClass);
+ }
+ } else if (!newFrameHost && oldFrameHost) {
+ oldFrameHost->eventHandlerRegistry().didRemoveAllEventHandlers(target);
+ } else if (newFrameHost && oldFrameHost) {
+ for (size_t i = 0; i < EventHandlerClassCount; ++i) {
+ EventHandlerClass handlerClass = static_cast<EventHandlerClass>(i);
+ 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::didRemoveAllEventHandlers(EventTarget& target)
@@ -135,25 +160,6 @@ void EventHandlerRegistry::didRemoveAllEventHandlers(EventTarget& target)
}
}
-void EventHandlerRegistry::updateAllEventHandlers(ChangeOperation op, 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);
- }
-}
-
void EventHandlerRegistry::notifyHasHandlersChanged(EventHandlerClass handlerClass, bool hasActiveHandlers)
{
ScrollingCoordinator* scrollingCoordinator = m_frameHost.page().scrollingCoordinator();
@@ -167,6 +173,9 @@ void EventHandlerRegistry::notifyHasHandlersChanged(EventHandlerClass handlerCla
if (scrollingCoordinator)
scrollingCoordinator->updateHaveWheelEventHandlers();
break;
+ case TouchEvent:
+ m_frameHost.chrome().client().needTouchEvents(hasActiveHandlers);
+ break;
#if ASSERT_ENABLED
case EventsForTesting:
break;
@@ -177,6 +186,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);

Powered by Google App Engine
This is Rietveld 408576698