Index: Source/core/page/EventHandlerRegistry.h |
diff --git a/Source/core/dom/EventHandlerRegistry.h b/Source/core/page/EventHandlerRegistry.h |
similarity index 69% |
rename from Source/core/dom/EventHandlerRegistry.h |
rename to Source/core/page/EventHandlerRegistry.h |
index 94245afab3e9e16379ccc9f1cf0c0b07eeff9072..b3de2258d51bddcdb74eb70344a1efcb3aa10cdd 100644 |
--- a/Source/core/dom/EventHandlerRegistry.h |
+++ b/Source/core/page/EventHandlerRegistry.h |
@@ -5,18 +5,19 @@ |
#ifndef EventHandlerRegistry_h |
#define EventHandlerRegistry_h |
-#include "core/dom/DocumentSupplementable.h" |
#include "core/events/Event.h" |
+#include "core/page/Page.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 NoBaseWillBeGarbageCollectedFinalized<EventHandlerRegistry>, public DocumentSupplement { |
+// Registry for keeping track of event handlers. Note that only handlers on |
+// documents that can be rendered or can receive input (i.e., are attached to a |
+// Page) are registered here. |
+// TODO(skyostil): This class should move to the FrameHost (crbug.com/369082). |
+class EventHandlerRegistry FINAL : public NoBaseWillBeGarbageCollectedFinalized<EventHandlerRegistry>, public Supplement<Page> { |
WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(EventHandlerRegistry); |
public: |
virtual ~EventHandlerRegistry(); |
@@ -25,20 +26,20 @@ public: |
// multiple event types. |
enum EventHandlerClass { |
ScrollEvent, |
+#if ASSERT_ENABLED |
+ // Additional event categories for verifying handler tracking logic. |
+ EventsForTesting, |
+#endif |
EventHandlerClassCount, // Must be the last entry. |
}; |
static const char* supplementName(); |
- static EventHandlerRegistry* from(Document&); |
+ static EventHandlerRegistry* from(Page&); |
- // Returns true if the host Document or any child documents have any |
- // registered event handlers of the class. |
+ // Returns true if the page has event handlers of the specified 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. |
+ // Returns a set of EventTargets which have registered handlers of the given class. |
const EventTargetSet* eventHandlerTargets(EventHandlerClass) const; |
// Registration and management of event handlers attached to EventTargets. |
@@ -46,14 +47,21 @@ public: |
void didAddEventHandler(EventTarget&, EventHandlerClass); |
void didRemoveEventHandler(EventTarget&, const AtomicString& eventType); |
void didRemoveEventHandler(EventTarget&, EventHandlerClass); |
- void didMoveFromOtherDocument(EventTarget&, Document& oldDocument); |
void didRemoveAllEventHandlers(EventTarget&); |
+ void didMoveIntoPage(EventTarget&); |
+ void didMoveOutOfPage(EventTarget&); |
+ |
+ // Either |documentDetached| or |didMoveOutOfPage| must be called whenever |
+ // the Page that is associated with a registered event target changes. This |
+ // ensures the registry does not end up with stale references to handlers |
+ // that are no longer related to it. |
+ void documentDetached(Document&); |
virtual void trace(Visitor*) OVERRIDE; |
void clearWeakMembers(Visitor*); |
private: |
- explicit EventHandlerRegistry(Document&); |
+ explicit EventHandlerRegistry(Page&); |
enum ChangeOperation { |
Add, // Add a new event handler. |
@@ -80,15 +88,12 @@ private: |
void updateEventHandlerInternal(ChangeOperation, EventHandlerClass, EventTarget*); |
- struct HandlerState { |
- HandlerState(); |
- ~HandlerState(); |
+ void updateAllEventHandlers(ChangeOperation, EventTarget&); |
- OwnPtr<EventTargetSet> targets; |
- }; |
+ void checkConsistency() const; |
- Document& m_document; |
- HandlerState m_eventHandlers[EventHandlerClassCount]; |
+ Page& m_page; |
+ EventTargetSet m_targets[EventHandlerClassCount]; |
}; |
} // namespace WebCore |