void EventListenerInfo::getEventListeners(EventTarget* target, WillBeHeapVector<EventListenerInfo>& eventInformation, bool includeAncestors) { // The Node's Ancestors including self. WillBeHeapVector<RawPtrWillBeMember<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]; EventListenerVector* listeners = ancestor->getEventListeners(type); if (!listeners) continue; EventListenerVector filteredListeners; filteredListeners.reserveCapacity(listeners->size()); for (size_t k = 0; k < listeners->size(); ++k) { if (listeners->at(k).listener->type() == EventListener::JSEventListenerType) filteredListeners.append(listeners->at(k)); } if (!filteredListeners.isEmpty()) eventInformation.append(EventListenerInfo(ancestor, type, filteredListeners)); } } }
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); } }