diff options
author | Michael Drake <michael.drake@codethink.co.uk> | 2016-02-05 20:31:46 +0000 |
---|---|---|
committer | Michael Drake <michael.drake@codethink.co.uk> | 2016-02-05 20:31:46 +0000 |
commit | 68c446328f2d874384b2d7ca6afb42b9d7fe4a17 (patch) | |
tree | fe7e75b5deb3fcf3d1b2864f962ffa2117480eef /src/core | |
parent | e9257f8c49dacf49feebad32780ffb7e6a7f013c (diff) | |
parent | d19eda00d250fae4b18ce41c941e709d7d384ff5 (diff) | |
download | libdom-68c446328f2d874384b2d7ca6afb42b9d7fe4a17.tar.gz libdom-68c446328f2d874384b2d7ca6afb42b9d7fe4a17.tar.bz2 |
Merge branch 'tlsa/fix-html-element-copy-constructors'
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/element.c | 77 | ||||
-rw-r--r-- | src/core/element.h | 5 |
2 files changed, 53 insertions, 29 deletions
diff --git a/src/core/element.c b/src/core/element.c index a86dc65..bbf4c2b 100644 --- a/src/core/element.c +++ b/src/core/element.c @@ -1515,51 +1515,70 @@ void __dom_element_destroy(struct dom_node_internal *node) * are all specified. For the methods like importNode and adoptNode, * this will make _dom_element_copy can be used in them. */ -dom_exception _dom_element_copy(dom_node_internal *old, +dom_exception _dom_element_copy(dom_node_internal *old, dom_node_internal **copy) { - dom_element *olde = (dom_element *) old; - dom_element *e; + dom_element *new_node; dom_exception err; - uint32_t classnr; - - e = malloc(sizeof(dom_element)); - if (e == NULL) + + new_node = malloc(sizeof(dom_element)); + if (new_node == NULL) return DOM_NO_MEM_ERR; - err = dom_node_copy_internal(old, e); + err = dom_element_copy_internal(old, new_node); if (err != DOM_NO_ERR) { - free(e); + free(new_node); return err; } - if (olde->attributes != NULL) { + *copy = (dom_node_internal *) new_node; + + return DOM_NO_ERR; +} + +dom_exception _dom_element_copy_internal(dom_element *old, dom_element *new) +{ + dom_exception err; + uint32_t classnr; + + if (old->attributes != NULL) { /* Copy the attribute list */ - e->attributes = _dom_element_attr_list_clone(olde->attributes, - e); + new->attributes = _dom_element_attr_list_clone( + old->attributes, new); } else { - e->attributes = NULL; + new->attributes = NULL; } - - if (olde->n_classes > 0) { - e->n_classes = olde->n_classes; - e->classes = malloc(sizeof(lwc_string *) * e->n_classes); - for (classnr = 0; classnr < e->n_classes; ++classnr) - e->classes[classnr] = - lwc_string_ref(olde->classes[classnr]); - } else { - e->n_classes = 0; - e->classes = NULL; - } - - e->id_ns = NULL; - e->id_name = NULL; - /* TODO: deal with dom_type_info, it get no definition ! */ + if (old->n_classes > 0) { + new->n_classes = old->n_classes; + new->classes = malloc(sizeof(lwc_string *) * new->n_classes); + if (new->classes == NULL) { + err = DOM_NO_MEM_ERR; + goto error; + } + for (classnr = 0; classnr < new->n_classes; ++classnr) + new->classes[classnr] = + lwc_string_ref(old->classes[classnr]); + } else { + new->n_classes = 0; + new->classes = NULL; + } + + err = dom_node_copy_internal(old, new); + if (err != DOM_NO_ERR) { + goto error; + } - *copy = (dom_node_internal *) e; + new->id_ns = NULL; + new->id_name = NULL; + + /* TODO: deal with dom_type_info, it get no definition ! */ return DOM_NO_ERR; + +error: + free(new->classes); + return err; } diff --git a/src/core/element.h b/src/core/element.h index 5873396..c89ddc0 100644 --- a/src/core/element.h +++ b/src/core/element.h @@ -231,6 +231,11 @@ dom_exception _dom_element_copy(dom_node_internal *old, _dom_element_copy /* Helper functions*/ +dom_exception _dom_element_copy_internal(dom_element *old, + dom_element *new); +#define dom_element_copy_internal(o, n) _dom_element_copy_internal( \ + (dom_element *) (o), (dom_element *) (n)) + dom_exception _dom_element_get_id(struct dom_element *ele, dom_string **id); extern struct dom_element_vtable _dom_element_vtable; |