EventListenerMap.h [plain text]
#ifndef EventListenerMap_h
#define EventListenerMap_h
#include "RegisteredEventListener.h"
#include <atomic>
#include <memory>
#include <wtf/Forward.h>
#include <wtf/text/AtomicString.h>
namespace WebCore {
class EventTarget;
typedef Vector<RegisteredEventListener, 1> EventListenerVector;
class EventListenerMap {
public:
EventListenerMap();
bool isEmpty() const { return m_entries.isEmpty(); }
WEBCORE_EXPORT bool contains(const AtomicString& eventType) const;
bool containsCapturing(const AtomicString& eventType) const;
void clear();
bool add(const AtomicString& eventType, PassRefPtr<EventListener>, bool useCapture);
bool remove(const AtomicString& eventType, EventListener*, bool useCapture, size_t& indexOfRemovedListener);
EventListenerVector* find(const AtomicString& eventType);
Vector<AtomicString> eventTypes() const;
void removeFirstEventListenerCreatedFromMarkup(const AtomicString& eventType);
void copyEventListenersNotCreatedFromMarkupToTarget(EventTarget*);
private:
friend class EventListenerIterator;
void assertNoActiveIterators();
Vector<std::pair<AtomicString, std::unique_ptr<EventListenerVector>>, 2> m_entries;
#ifndef NDEBUG
std::atomic<int> m_activeIteratorCount { 0 };
#endif
};
class EventListenerIterator {
WTF_MAKE_NONCOPYABLE(EventListenerIterator);
public:
EventListenerIterator();
explicit EventListenerIterator(EventTarget*);
#ifndef NDEBUG
~EventListenerIterator();
#endif
EventListener* nextListener();
private:
EventListenerMap* m_map;
unsigned m_entryIndex;
unsigned m_index;
};
#ifdef NDEBUG
inline void EventListenerMap::assertNoActiveIterators() { }
#endif
}
#endif // EventListenerMap_h