summaryrefslogtreecommitdiff
path: root/src/events
diff options
context:
space:
mode:
authorMichael Drake <tlsa@netsurf-browser.org>2015-11-22 12:36:42 +0000
committerMichael Drake <tlsa@netsurf-browser.org>2015-11-22 12:36:42 +0000
commited672c93dd99779c90635d063ed5f060e82c6c82 (patch)
treeeacdb96546efe2ffa2c830c260972dded896246f /src/events
parent3b793e09e53c001ffaf165b41a776f7d9248a381 (diff)
downloadlibdom-ed672c93dd99779c90635d063ed5f060e82c6c82.tar.gz
libdom-ed672c93dd99779c90635d063ed5f060e82c6c82.tar.bz2
Fix event target listener destruction.
Diffstat (limited to 'src/events')
-rw-r--r--src/events/event_target.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/src/events/event_target.c b/src/events/event_target.c
index cb4e25b..ef2dc83 100644
--- a/src/events/event_target.c
+++ b/src/events/event_target.c
@@ -19,18 +19,24 @@
#include "utils/utils.h"
#include "utils/validate.h"
+static void event_target_destroy_listener(struct listener_entry *e)
+{
+ list_del(&e->list);
+ dom_event_listener_unref(e->listener);
+ dom_string_unref(e->type);
+ free(e);
+}
static void event_target_destroy_listeners(struct listener_entry *list)
{
- struct listener_entry *next = NULL;
+ struct listener_entry *next;
- for (; list != next; list = next) {
+ while (list != (struct listener_entry *) list->list.next) {
next = (struct listener_entry *) list->list.next;
-
- list_del(&list->list);
- dom_event_listener_unref(list->listener);
- dom_string_unref(list->type);
- free(list);
+ event_target_destroy_listener(list);
+ list = next;
}
+
+ event_target_destroy_listener(list);
}
/* Initialise this EventTarget */
@@ -45,8 +51,10 @@ dom_exception _dom_event_target_internal_initialise(
/* Finalise this EventTarget */
void _dom_event_target_internal_finalise(dom_event_target_internal *eti)
{
- if (eti->listeners != NULL)
+ if (eti->listeners != NULL) {
event_target_destroy_listeners(eti->listeners);
+ eti->listeners = NULL;
+ }
}
/*-------------------------------------------------------------------------*/