summaryrefslogtreecommitdiff
path: root/src/core/element.c
diff options
context:
space:
mode:
authorBo Yang <struggleyb.nku@gmail.com>2009-08-14 02:52:02 +0000
committerBo Yang <struggleyb.nku@gmail.com>2009-08-14 02:52:02 +0000
commit0f44b5a8c07581232de4c676a00148c6b283c1c1 (patch)
tree756ffbaa886e18cf2c8f8749dd563243a3dc0c99 /src/core/element.c
parentf7d7c296398ef6cee6025ff4d8484a74bca2d554 (diff)
downloadlibdom-0f44b5a8c07581232de4c676a00148c6b283c1c1.tar.gz
libdom-0f44b5a8c07581232de4c676a00148c6b283c1c1.tar.bz2
Fix up some ref/unref error produced from _dispatch_ usage.
Now, the trunk/dom test result are consistent with Core. svn path=/trunk/dom/; revision=9279
Diffstat (limited to 'src/core/element.c')
-rw-r--r--src/core/element.c46
1 files changed, 31 insertions, 15 deletions
diff --git a/src/core/element.c b/src/core/element.c
index 7609b94..000f64b 100644
--- a/src/core/element.c
+++ b/src/core/element.c
@@ -1535,8 +1535,11 @@ dom_exception _dom_element_set_attr_node(struct dom_element *element,
(dom_event_target *) a,
(dom_event_target *) element,
DOM_MUTATION_REMOVAL, &success);
- if (err != DOM_NO_ERR)
+ if (err != DOM_NO_ERR) {
+ dom_string_unref(name);
+ _dom_node_unref_intern_string(&element->base, str);
return err;
+ }
_dom_hash_del(hs, str);
dom_node_ref(a);
@@ -1553,25 +1556,34 @@ dom_exception _dom_element_set_attr_node(struct dom_element *element,
* make sure the event model work as excepted. */
if (err != DOM_NO_ERR && err != DOM_NOT_SUPPORTED_ERR) {
dom_node_unref(a);
+ dom_string_unref(name);
+ _dom_node_unref_intern_string(&element->base, str);
return err;
}
err = _dom_dispatch_attr_modified_event(doc, e, old, NULL,
(dom_event_target *) a, name,
DOM_MUTATION_REMOVAL, &success);
dom_string_unref(old);
- dom_node_unref(a);
- if (err != DOM_NO_ERR)
+ if (err != DOM_NO_ERR) {
+ dom_string_unref(name);
+ _dom_node_unref_intern_string(&element->base, str);
return err;
+ }
success = true;
err = _dom_dispatch_subtree_modified_event(doc,
(dom_event_target *) e, &success);
- if (err != DOM_NO_ERR)
+ if (err != DOM_NO_ERR) {
+ dom_string_unref(name);
+ _dom_node_unref_intern_string(&element->base, str);
return err;
+ }
}
added = _dom_hash_add(hs, str, attr, false);
if (added == false) {
+ dom_string_unref(name);
+ _dom_node_unref_intern_string(&element->base, str);
/* If we failed at this step, there must be no memory */
return DOM_NO_MEM_ERR;
}
@@ -1591,9 +1603,13 @@ dom_exception _dom_element_set_attr_node(struct dom_element *element,
err = _dom_dispatch_attr_modified_event(doc, e, NULL, new,
(dom_event_target *) attr, name,
DOM_MUTATION_ADDITION, &success);
+ /* Cleanup */
dom_string_unref(new);
- if (err != DOM_NO_ERR)
+ dom_string_unref(name);
+ _dom_node_unref_intern_string(&element->base, str);
+ if (err != DOM_NO_ERR) {
return err;
+ }
err = _dom_dispatch_node_change_event(doc, (dom_event_target *) attr,
(dom_event_target *) element, DOM_MUTATION_ADDITION,
@@ -1601,10 +1617,6 @@ dom_exception _dom_element_set_attr_node(struct dom_element *element,
if (err != DOM_NO_ERR)
return err;
- /* Cleanup */
- if (name != NULL)
- dom_string_unref(name);
-
success = true;
err = _dom_dispatch_subtree_modified_event(doc,
(dom_event_target *) element, &success);
@@ -1654,13 +1666,11 @@ dom_exception _dom_element_remove_attr_node(struct dom_element *element,
a = _dom_hash_get(hs, str);
- /* Now, cleaup the dom_string and lwc_string */
- dom_string_unref(name);
- _dom_node_unref_intern_string(&element->base, str);
-
/** \todo defaulted attribute handling */
if (a == NULL || a != (void *) attr) {
+ dom_string_unref(name);
+ _dom_node_unref_intern_string(&element->base, str);
return DOM_NOT_FOUND_ERR;
}
@@ -1670,13 +1680,20 @@ dom_exception _dom_element_remove_attr_node(struct dom_element *element,
err = _dom_dispatch_node_change_event(doc, (dom_event_target *) a,
(dom_event_target *) element, DOM_MUTATION_REMOVAL,
&success);
- if (err != DOM_NO_ERR)
+ if (err != DOM_NO_ERR) {
+ dom_string_unref(name);
+ _dom_node_unref_intern_string(&element->base, str);
return err;
+ }
/* Delete the attribute node */
_dom_hash_del(hs, str);
dom_node_ref(a);
+ /* Now, cleaup the dom_string and lwc_string */
+ dom_string_unref(name);
+ _dom_node_unref_intern_string(&element->base, str);
+
/* Dispatch a DOMAttrModified event */
dom_string *old = NULL;
success = true;
@@ -1692,7 +1709,6 @@ dom_exception _dom_element_remove_attr_node(struct dom_element *element,
(dom_event_target *) a, name,
DOM_MUTATION_REMOVAL, &success);
dom_string_unref(old);
- dom_node_unref(a);
if (err != DOM_NO_ERR)
return err;