Chromium Code Reviews| Index: Source/core/dom/EventHandlerRegistry.h |
| diff --git a/Source/core/dom/EventHandlerRegistry.h b/Source/core/dom/EventHandlerRegistry.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..e21e6a212201c4711ec0038f8072a466d1d7b5ed |
| --- /dev/null |
| +++ b/Source/core/dom/EventHandlerRegistry.h |
| @@ -0,0 +1,118 @@ |
| +// Copyright 2014 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| +#ifndef EventHandlerRegistry_h |
| +#define EventHandlerRegistry_h |
| + |
| +#include "core/dom/DocumentLifecycleObserver.h" |
| +#include "core/dom/DocumentSupplementable.h" |
| +#include "core/events/Event.h" |
| +#include "core/frame/DOMWindowLifecycleObserver.h" |
| +#include "wtf/HashCountedSet.h" |
| + |
| +namespace WebCore { |
| + |
| +typedef HashCountedSet<EventTarget*> EventTargetSet; |
| + |
| +// Registry for keeping track of event handlers. Handlers can either be |
| +// associated with an EventTarget or be "external" handlers which live outside |
| +// the DOM (e.g., WebViewImpl). |
| +class EventHandlerRegistry FINAL : public DocumentSupplement { |
| +public: |
| + virtual ~EventHandlerRegistry(); |
| + |
| + // Supported event handler classes. Note that each one may correspond to |
| + // multiple event types. |
| + enum EventHandlerClass { |
| + WheelEvent, |
| + ScrollEvent, |
| + TouchEvent, |
| + EventHandlerClassCount, // Must be the last entry. |
| + }; |
| + |
| + static const char* supplementName(); |
| + static EventHandlerRegistry* from(Document&); |
| + |
| + // Returns true if the host Document or any child documents have any |
| + // registered event handlers of the class. |
| + bool hasEventHandlers(EventHandlerClass) const; |
| + |
| + // Returns a set of EventTargets which have registered handlers of the |
| + // given class. Only contains targets directly in this document; all |
| + // handlers in a child Document are collapsed to a single respective |
| + // Document instance in the set. |
| + const EventTargetSet* eventHandlerTargets(EventHandlerClass) const; |
| + |
| + // Returns the number of external event handlers for a given class. |
| + // External handlers are not included in |eventHandlerTargets|. |
| + unsigned externalEventHandlerCount(EventHandlerClass) const; |
| + |
| + // Registration and management of event handlers attached to EventTargets. |
| + void didAddEventHandler(EventTarget&, const AtomicString& eventType); |
| + void didAddEventHandler(EventTarget&, EventHandlerClass); |
| + void didRemoveEventHandler(EventTarget&, const AtomicString& eventType); |
| + void didRemoveEventHandler(EventTarget&, EventHandlerClass); |
| + void didMoveToNewDocument(EventTarget&, Document& oldDocument); |
|
Rick Byers
2014/04/03 15:33:19
Nit: A call like "doc1.didMoveToNewDocument(t, doc
Sami
2014/04/04 19:53:57
Agreed, it reads a little badly. "didMoveFromOther
|
| + void didRemoveAllEventHandlers(EventTarget&); |
| + |
| + // Registration of event handlers attached to non-DOM objects. |
| + void didAddExternalEventHandler(const AtomicString& eventType); |
| + void didRemoveExternalEventHandler(const AtomicString& eventType); |
| +private: |
| + explicit EventHandlerRegistry(Document&); |
| + |
| + enum ChangeOperation { |
| + Add, // Add a new event handler. |
| + Remove, // Remove an existing event handler. |
| + RemoveAll // Remove any and all existing event handlers for a given target. |
| + }; |
| + |
| + // Returns true if |eventType| belongs to a class this registry tracks. |
| + static bool eventTypeToClass(const AtomicString& eventType, EventHandlerClass* result); |
| + |
| + // Returns true if the operation actually added a new target or completely |
| + // removed an existing one. |
| + bool updateEventHandlerTargets(ChangeOperation, EventHandlerClass, EventTarget*); |
| + |
| + // Called to notify clients whenever a single event handler target is |
| + // registered or unregistered. If several handlers are registered for the |
| + // same target, only the first registration will trigger this notification. |
| + void notifyDidAddOrRemoveEventHandlerTarget(EventHandlerClass); |
| + |
| + // Called on the EventHandlerRegistry of the root Document to notify |
| + // clients when we have added the first handler or removed the last one for |
| + // a given event class. |hasActiveHandlers| can be used to distinguish |
| + // between the two cases. |
| + void notifyHasHandlersChanged(EventHandlerClass, bool hasActiveHandlers); |
| + |
| + // Record a change operation to a given event handler class and notify any |
| + // parent registry and other clients accordingly. |
| + void updateEventHandlerOfType(ChangeOperation, const AtomicString& eventType, EventTarget*); |
| + |
| + void updateExternalHandlerCount(ChangeOperation, EventHandlerClass); |
| + void updateEventHandlerInternal(ChangeOperation, EventHandlerClass, EventTarget*); |
| + |
| + class DocumentObserver; |
| + class WindowObserver; |
| + friend class DocumentObserver; |
|
Rick Byers
2014/04/03 15:33:19
I thought nested class members were friends automa
Sami
2014/04/04 19:53:57
I was thinking that was only the case for Java, bu
|
| + |
| + struct HandlerState { |
| + HandlerState(); |
| + ~HandlerState(); |
| + |
| + OwnPtr<EventTargetSet> targets; |
| + // External handlers are not included in |targets|. |
| + unsigned externalHandlerCount; |
|
Rick Byers
2014/04/03 15:33:19
Now that you don't have handlerCount, it's temptin
Sami
2014/04/04 19:53:57
I see where you're going and it would simplify thi
Rick Byers
2014/04/04 20:12:27
Yeah I wouldn't want to expose this to clients eit
|
| + }; |
| + |
| + Document& m_document; |
| + |
| + OwnPtr<DocumentObserver> m_documentObserver; |
|
Rick Byers
2014/04/03 15:33:19
Is there any value to the indirection via a pointe
Sami
2014/04/04 19:53:57
I picked this way just to reduce the number of imp
Rick Byers
2014/04/04 20:12:27
Ok. Did you want to update m_windowObserver too?
|
| + OwnPtr<WindowObserver> m_windowObserver; |
| + |
| + HandlerState m_eventHandlers[EventHandlerClassCount]; |
| +}; |
| + |
| +} // namespace WebCore |
| + |
| +#endif // EventHandlerRegistry_h |