| Index: Source/core/events/EventListenerMap.cpp
|
| diff --git a/Source/core/events/EventListenerMap.cpp b/Source/core/events/EventListenerMap.cpp
|
| index 11150452bcf65ecbc3f486efdd59ad26bd846656..dd801edf048aeb71664690d6a0fa2b1e9d35543f 100644
|
| --- a/Source/core/events/EventListenerMap.cpp
|
| +++ b/Source/core/events/EventListenerMap.cpp
|
| @@ -33,6 +33,8 @@
|
| #include "config.h"
|
| #include "core/events/EventListenerMap.h"
|
|
|
| +#include "core/dom/ContainerNode.h"
|
| +#include "core/dom/Node.h"
|
| #include "core/events/EventTarget.h"
|
| #include "wtf/StdLibExtras.h"
|
| #include "wtf/Vector.h"
|
| @@ -233,4 +235,64 @@ EventListener* EventListenerIterator::nextListener()
|
| return 0;
|
| }
|
|
|
| +void EventListenerInfo::getEventListeners(EventTarget* target, Vector<EventListenerInfo>& eventInformation, bool includeAncestors)
|
| +{
|
| + // The Node's Ancestors including self.
|
| + Vector<EventTarget*> ancestors;
|
| + ancestors.append(target);
|
| + if (includeAncestors) {
|
| + Node* node = target->toNode();
|
| + for (ContainerNode* ancestor = node ? node->parentOrShadowHostNode() : nullptr; ancestor; ancestor = ancestor->parentOrShadowHostNode())
|
| + ancestors.append(ancestor);
|
| + }
|
| +
|
| + // Nodes and their Listeners for the concerned event types (order is top to bottom)
|
| + for (size_t i = ancestors.size(); i; --i) {
|
| + EventTarget* ancestor = ancestors[i - 1];
|
| + Vector<AtomicString> eventTypes = ancestor->eventTypes();
|
| + for (size_t j = 0; j < eventTypes.size(); ++j) {
|
| + AtomicString& type = eventTypes[j];
|
| + const EventListenerVector& listeners = ancestor->getEventListeners(type);
|
| + EventListenerVector filteredListeners;
|
| + filteredListeners.reserveCapacity(listeners.size());
|
| + for (size_t k = 0; k < listeners.size(); ++k) {
|
| + if (listeners[k].listener->type() == EventListener::JSEventListenerType)
|
| + filteredListeners.append(listeners[k]);
|
| + }
|
| + if (!filteredListeners.isEmpty())
|
| + eventInformation.append(EventListenerInfo(ancestor, type, filteredListeners));
|
| + }
|
| + }
|
| +}
|
| +
|
| +const RegisteredEventListener* RegisteredEventListenerIterator::nextRegisteredEventListener()
|
| +{
|
| + while (true) {
|
| + const EventListenerInfo& info = m_listenersArray[m_infoIndex];
|
| + const EventListenerVector& vector = info.eventListenerVector;
|
| +
|
| + for (; m_listenerIndex < vector.size(); ++m_listenerIndex) {
|
| + if (m_isUseCapturePass == vector[m_listenerIndex].useCapture)
|
| + return &vector[m_listenerIndex++];
|
| + }
|
| +
|
| + m_listenerIndex = 0;
|
| + if (m_isUseCapturePass) {
|
| + if (++m_infoIndex >= m_listenersArray.size())
|
| + m_isUseCapturePass = false;
|
| + }
|
| +
|
| + if (!m_isUseCapturePass) {
|
| + if (m_infoIndex == 0)
|
| + return nullptr;
|
| + --m_infoIndex;
|
| + }
|
| + }
|
| +}
|
| +
|
| +const EventListenerInfo& RegisteredEventListenerIterator::currentEventListenerInfo()
|
| +{
|
| + return m_listenersArray[m_infoIndex];
|
| +}
|
| +
|
| } // namespace blink
|
|
|