From f7d7c296398ef6cee6025ff4d8484a74bca2d554 Mon Sep 17 00:00:00 2001 From: Bo Yang Date: Thu, 13 Aug 2009 11:51:54 +0000 Subject: 1. Fix a string intern bug. 2. Reset the fields when finalise a dom_event. svn path=/trunk/dom/; revision=9247 --- src/core/string.c | 2 ++ src/events/event.c | 15 +++++++++++++-- src/events/event_target.c | 5 +++-- src/events/mutation_event.c | 5 +++++ 4 files changed, 23 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/core/string.c b/src/core/string.c index 7442c66..473363b 100644 --- a/src/core/string.c +++ b/src/core/string.c @@ -236,6 +236,8 @@ dom_exception _dom_string_intern(struct dom_string *str, /* If this string is interned with the same context, do nothing */ if (str->context != NULL && str->context == ctx) { *lwcstr = str->intern; + lwc_context_ref(ctx); + lwc_context_string_ref(ctx, *lwcstr); return DOM_NO_ERR; } diff --git a/src/events/event.c b/src/events/event.c index f9caa0b..9330edf 100644 --- a/src/events/event.c +++ b/src/events/event.c @@ -59,8 +59,6 @@ dom_exception _dom_event_initialise(struct dom_document *doc, evt->namespace = NULL; - evt->timestamp = time(NULL); - evt->refcnt = 1; evt->in_dispatch = false; @@ -78,6 +76,17 @@ void _dom_event_finalise(struct dom_document *doc, struct dom_event *evt) lwc_context_string_unref(ctx, evt->type); if (evt->namespace != NULL) lwc_context_string_unref(ctx, evt->namespace); + + evt->stop = false; + evt->stop_now = false; + evt->prevent_default = false; + evt->custom = false; + + evt->type = NULL; + + evt->namespace = NULL; + + evt->in_dispatch = false; } /* The virtual destroy function */ @@ -253,6 +262,8 @@ dom_exception _dom_event_init(dom_event *evt, struct dom_string *type, evt->bubble = bubble; evt->cancelable = cancelable; + evt->timestamp = time(NULL); + return DOM_NO_ERR; } diff --git a/src/events/event_target.c b/src/events/event_target.c index e17aa9c..69f4dd6 100644 --- a/src/events/event_target.c +++ b/src/events/event_target.c @@ -624,7 +624,8 @@ dom_exception _dom_dispatch_node_change_event(struct dom_document *doc, if (err != DOM_NO_ERR) goto cleanup; - dom_event_target *target = et; + /* Dispatch the events for its children */ + dom_event_target *target = et->first_child; while (target != NULL) { err = dom_mutation_event_init(evt, t, true, false, NULL, NULL, NULL, NULL, change); @@ -641,7 +642,7 @@ dom_exception _dom_dispatch_node_change_event(struct dom_document *doc, } else if (target->next != NULL) { target = target->next; } else { - while (p != et && target == p->first_child) { + while (p != et && target == p->last_child) { target = p; p = dom_node_get_parent(p); } diff --git a/src/events/mutation_event.c b/src/events/mutation_event.c index ea7163c..c24ae15 100644 --- a/src/events/mutation_event.c +++ b/src/events/mutation_event.c @@ -56,6 +56,11 @@ void _dom_mutation_event_finalise(struct dom_document *doc, dom_string_unref(evt->prev_value); dom_string_unref(evt->new_value); dom_string_unref(evt->attr_name); + + evt->related_node = NULL; + evt->prev_value = NULL; + evt->new_value = NULL; + evt->attr_name = NULL; _dom_event_finalise(doc, &evt->base); } -- cgit v1.2.3