From 4e9b50f5b200918088bc6b1136751ea81cd8984b Mon Sep 17 00:00:00 2001 From: Daniel Silverstone Date: Sat, 4 Feb 2017 17:51:29 +0000 Subject: Unregister all instances of a listener Sometimes we register a listener a lot on an event target. This change allows us to pass NULL as the event type to the remove call in order to remove every instance of the given listener, regardless of event type and capture vs. bubble. --- src/events/event_target.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/events/event_target.c b/src/events/event_target.c index ef2dc83..4592fee 100644 --- a/src/events/event_target.c +++ b/src/events/event_target.c @@ -99,6 +99,9 @@ dom_exception _dom_event_target_add_event_listener( /** * Remove an EventListener from the EventTarget * + * (LibDOM extension: If type is NULL, remove all listener registrations + * regardless of type and cature) + * * \param et The EventTarget object * \param type The event type this listener is registered for * \param listener The listener object @@ -114,9 +117,15 @@ dom_exception _dom_event_target_remove_event_listener( struct listener_entry *le = eti->listeners; do { - if (dom_string_isequal(le->type, type) && - le->listener == listener && - le->capture == capture) { + bool matches; + if (type == NULL) { + matches = (le->listener == listener); + } else { + matches = dom_string_isequal(le->type, type) && + (le->listener == listener) && + (le->capture == capture); + } + if (matches) { if (le->list.next == &le->list) { eti->listeners = NULL; } else { -- cgit v1.2.3