diff options
author | Daniel Silverstone <dsilvers@digital-scurf.org> | 2014-07-21 11:30:17 +0100 |
---|---|---|
committer | Daniel Silverstone <dsilvers@digital-scurf.org> | 2014-07-21 11:30:17 +0100 |
commit | 8df19e5025e6327c5ce48bc5002bc6cc67d1fe74 (patch) | |
tree | 23da8a14d27c04d6ac200d2d79fcc2885a25db0b | |
parent | 9aae1b6cc3ec89c96f0cdcc173405eef1d5b1c2c (diff) | |
parent | 9f0054bb895b7d56602d022cd3f36c1e1c3cbc94 (diff) | |
download | libdom-8df19e5025e6327c5ce48bc5002bc6cc67d1fe74.tar.gz libdom-8df19e5025e6327c5ce48bc5002bc6cc67d1fe74.tar.bz2 |
Merge remote-tracking branch 'origin/rupindersingh/libdom_recovered'
-rw-r--r-- | src/html/html_document.c | 8 | ||||
-rw-r--r-- | src/html/html_select_element.c | 31 | ||||
-rw-r--r-- | src/html/html_table_element.c | 370 | ||||
-rw-r--r-- | src/html/html_table_element.h | 6 | ||||
-rw-r--r-- | src/html/html_tablerow_element.c | 38 | ||||
-rw-r--r-- | src/html/html_tablesection_element.c | 39 |
6 files changed, 333 insertions, 159 deletions
diff --git a/src/html/html_document.c b/src/html/html_document.c index 6adfedd..f6808e7 100644 --- a/src/html/html_document.c +++ b/src/html/html_document.c @@ -724,7 +724,7 @@ bool images_callback(struct dom_node_internal *node, void *ctx) dom_exception _dom_html_document_get_images(dom_html_document *doc, struct dom_html_collection **col) { - dom_html_document *root; + dom_element *root; dom_exception err; err = dom_document_get_document_element(doc, &root); if (err != DOM_NO_ERR) @@ -770,7 +770,7 @@ bool applets_callback(struct dom_node_internal *node, void *ctx) dom_exception _dom_html_document_get_applets(dom_html_document *doc, struct dom_html_collection **col) { - dom_html_document *root; + dom_element *root; dom_exception err; err = dom_document_get_document_element(doc, &root); if (err != DOM_NO_ERR) @@ -812,7 +812,7 @@ bool links_callback(struct dom_node_internal *node, void *ctx) dom_exception _dom_html_document_get_links(dom_html_document *doc, struct dom_html_collection **col) { - dom_html_document *root; + dom_element *root; dom_exception err; err = dom_document_get_document_element(doc, &root); if (err != DOM_NO_ERR) @@ -887,7 +887,7 @@ bool anchors_callback(struct dom_node_internal *node, void *ctx) dom_exception _dom_html_document_get_anchors(dom_html_document *doc, struct dom_html_collection **col) { - dom_html_document *root; + dom_element *root; dom_exception err; err = dom_document_get_document_element(doc, &root); if (err != DOM_NO_ERR) diff --git a/src/html/html_select_element.c b/src/html/html_select_element.c index 7a5e84e..3d199bb 100644 --- a/src/html/html_select_element.c +++ b/src/html/html_select_element.c @@ -598,12 +598,14 @@ dom_exception dom_html_select_element_set_tab_index( dom_exception dom__html_select_element_add(dom_html_select_element *select, struct dom_html_element *ele, struct dom_html_element *before) { + dom_exception err; + dom_node *inserted; - return _dom_node_insert_before((dom_node_internal *)select, - (dom_node_internal *)ele, (dom_node_internal *)before, - (dom_node_internal **)&ele); - + err = dom_node_insert_before(select, ele, before, &inserted); + if (err == DOM_NO_ERR) + dom_node_unref(inserted); + return err; } dom_exception dom_html_select_element_remove(dom_html_select_element *ele, @@ -611,7 +613,8 @@ dom_exception dom_html_select_element_remove(dom_html_select_element *ele, { dom_exception err; uint32_t len; - dom_node *option; + dom_node *option, *old_option; + dom_html_options_collection *col; err = dom_html_select_element_get_length(ele, &len); if (err != DOM_NO_ERR) @@ -620,22 +623,26 @@ dom_exception dom_html_select_element_remove(dom_html_select_element *ele, /* Ensure index is in range */ if (index < 0 || index >= (int32_t)len) return DOM_NO_ERR; - dom_html_options_collection *col; err = _dom_html_select_element_make_collection(ele, &col); if (err != DOM_NO_ERR) return err; - err = dom_html_options_collection_item(col, - index, &option); - + err = dom_html_options_collection_item(col, index, &option); if (err != DOM_NO_ERR) { dom_html_options_collection_unref(col); return err; } - return _dom_node_remove_child(((dom_node_internal *)option)->parent, - (dom_node_internal *)option, - (dom_node_internal **)&option); + + err = dom_node_remove_child(dom_node_get_parent(option), + option, &old_option); + if (err == DOM_NO_ERR) + dom_node_unref(old_option); + + dom_node_unref(option); + dom_html_options_collection_unref(col); + + return err; } /** diff --git a/src/html/html_table_element.c b/src/html/html_table_element.c index 0f27fd3..e9f1dc5 100644 --- a/src/html/html_table_element.c +++ b/src/html/html_table_element.c @@ -64,9 +64,6 @@ dom_exception _dom_html_table_element_initialise(struct dom_html_document *doc, dom_string *namespace, dom_string *prefix, struct dom_html_table_element *ele) { - ele->caption = NULL; - ele->t_head = NULL; - ele->t_foot = NULL; return _dom_html_element_initialise(doc, &ele->base, doc->memoised[hds_TABLE], namespace, prefix); @@ -184,16 +181,17 @@ dom_exception dom_html_table_element_get_caption( dom_node_internal *node_tmp = ((dom_node_internal *)table); dom_html_document *doc = (dom_html_document *)(node_tmp->owner); - if(table->caption == NULL) { - for (node_tmp = node_tmp->first_child; node_tmp != NULL; node_tmp = node_tmp->next) { - if((node_tmp->type == DOM_ELEMENT_NODE) && - dom_string_caseless_isequal(doc->memoised[hds_CAPTION],node_tmp->name)) { - break; - } + for (node_tmp = node_tmp->first_child; node_tmp != NULL; node_tmp = node_tmp->next) { + if((node_tmp->type == DOM_ELEMENT_NODE) && + dom_string_caseless_isequal(doc->memoised[hds_CAPTION],node_tmp->name)) { + break; } - table->caption = (dom_html_table_caption_element *)node_tmp; } - *caption = (table->caption); + + *caption = (dom_html_table_caption_element *)node_tmp; + if(*caption != NULL) + dom_node_ref(*caption); + return DOM_NO_ERR; } @@ -208,14 +206,20 @@ dom_exception dom_html_table_element_set_caption( { dom_node_internal *check_node = ((dom_node_internal *)caption); dom_html_document *doc = (dom_html_document *)(((dom_node_internal *)table)->owner); + dom_exception exp; if(check_node == NULL) { return DOM_HIERARCHY_REQUEST_ERR; } - if(!dom_string_caseless_isequal(doc->memoised[hds_CAPTION],check_node->name)) { + if(!dom_string_caseless_isequal(doc->memoised[hds_CAPTION], + check_node->name)) { return DOM_HIERARCHY_REQUEST_ERR; } - table->caption = caption; - return DOM_NO_ERR; + + exp = dom_html_table_element_delete_caption(table); + if(exp != DOM_NO_ERR) + return exp; + + return dom_html_table_element_create_caption(table, (dom_html_element **)&caption); } /** @@ -229,16 +233,16 @@ dom_exception dom_html_table_element_get_t_head( dom_node_internal *node_tmp = ((dom_node_internal *)table); dom_html_document *doc = (dom_html_document *)(node_tmp->owner); - if(table->t_head == NULL) { - for (node_tmp = node_tmp->first_child; node_tmp != NULL; node_tmp = node_tmp->next) { - if((node_tmp->type == DOM_ELEMENT_NODE) && - dom_string_caseless_isequal(doc->memoised[hds_THEAD],node_tmp->name)) { - break; - } + for (node_tmp = node_tmp->first_child; node_tmp != NULL; node_tmp = node_tmp->next) { + if((node_tmp->type == DOM_ELEMENT_NODE) && + dom_string_caseless_isequal(doc->memoised[hds_THEAD],node_tmp->name)) { + break; } - table->t_head = (dom_html_table_section_element *)node_tmp; } - *t_head = table->t_head; + + *t_head = (dom_html_table_section_element *)node_tmp; + if (*t_head != NULL) + dom_node_ref(*t_head); return DOM_NO_ERR; } @@ -253,14 +257,20 @@ dom_exception dom_html_table_element_set_t_head( { dom_node_internal *check_node = ((dom_node_internal *)t_head); dom_html_document *doc = (dom_html_document *)(((dom_node_internal *)table)->owner); - if(check_node == NULL) { + dom_exception exp; + + if (check_node == NULL) { return DOM_HIERARCHY_REQUEST_ERR; } - if(!dom_string_caseless_isequal(doc->memoised[hds_CAPTION],check_node->name)) { + if (!dom_string_caseless_isequal(doc->memoised[hds_CAPTION],check_node->name)) { return DOM_HIERARCHY_REQUEST_ERR; } - table->t_head = t_head; - return DOM_NO_ERR; + + exp = dom_html_table_element_delete_t_head(table); + if(exp != DOM_NO_ERR) + return exp; + + return dom_html_table_element_create_t_head(table, (dom_html_element **)&t_head); } /** @@ -274,16 +284,18 @@ dom_exception dom_html_table_element_get_t_foot( dom_node_internal *node_tmp = ((dom_node_internal *)table); dom_html_document *doc = (dom_html_document *)(node_tmp->owner); - if(table->t_foot == NULL) { - for (node_tmp = node_tmp->first_child; node_tmp != NULL; node_tmp = node_tmp->next) { - if((node_tmp->type == DOM_ELEMENT_NODE) && - dom_string_caseless_isequal(doc->memoised[hds_TFOOT],node_tmp->name)) { - break; - } + for (node_tmp = node_tmp->first_child; node_tmp != NULL; node_tmp = node_tmp->next) { + if ((node_tmp->type == DOM_ELEMENT_NODE) && + dom_string_caseless_isequal(doc->memoised[hds_TFOOT], + node_tmp->name)) { + break; } - table->t_foot = (dom_html_table_section_element *)node_tmp; } - *t_foot = (table->t_foot); + + *t_foot = (dom_html_table_section_element *)node_tmp; + if (*t_foot != NULL) + dom_node_ref(*t_foot); + return DOM_NO_ERR; } @@ -297,14 +309,21 @@ dom_exception dom_html_table_element_set_t_foot( { dom_node_internal *check_node = ((dom_node_internal *)t_foot); /*< temporary node to check for raised exceptions */ dom_html_document *doc = (dom_html_document *)(((dom_node_internal *)table)->owner); + dom_exception exp; + if(check_node == NULL) { return DOM_HIERARCHY_REQUEST_ERR; } + if(!dom_string_caseless_isequal(doc->memoised[hds_TFOOT],check_node->name)) { return DOM_HIERARCHY_REQUEST_ERR; } - table->t_foot = t_foot; - return DOM_NO_ERR; + + exp = dom_html_table_element_delete_t_foot(table); + if(exp != DOM_NO_ERR) + return exp; + + return dom_html_table_element_create_t_foot(table, (dom_html_element **)&t_foot); } /** @@ -387,11 +406,14 @@ dom_exception dom_html_table_element_create_caption( dom_exception exp; if((exp = dom_html_table_element_get_caption(element, (dom_html_table_caption_element **)caption)) != DOM_NO_ERR) { + dom_node_unref(*caption); return exp; } if((*caption) == NULL) { dom_html_document *doc = (dom_html_document *) ((dom_node_internal *) element)->owner; + dom_node_internal *new_caption; + exp = _dom_html_table_caption_element_create(doc, ((dom_node_internal *)element)->namespace, ((dom_node_internal *)element)->prefix, @@ -399,13 +421,14 @@ dom_exception dom_html_table_element_create_caption( if(exp != DOM_NO_ERR) { return exp; } - _dom_node_append_child((dom_node_internal *)element, - (dom_node_internal *)*caption, - (dom_node_internal **)caption); - element->caption = (dom_html_table_caption_element *)*caption; + exp = dom_node_append_child(element, *caption, + &new_caption); + dom_node_unref(*caption); + if(exp == DOM_NO_ERR) + *caption = (dom_html_element *)new_caption; } - return DOM_NO_ERR; + return exp; } /** @@ -418,12 +441,21 @@ dom_exception dom_html_table_element_delete_caption( dom_html_table_element *element) { dom_html_table_caption_element *caption; - dom_html_table_element_get_caption(element, &caption); - _dom_node_remove_child((dom_node_internal *)element, - (dom_node_internal *)caption, - (dom_node_internal **)&caption); - element->caption = NULL; - return DOM_NO_ERR; + dom_node *old_caption; + dom_exception err; + + err = dom_html_table_element_get_caption(element, &caption); + if (err != DOM_NO_ERR || caption == NULL) + return err; + + err = dom_node_remove_child(element, caption, &old_caption); + if (err == DOM_NO_ERR) { + dom_node_unref(old_caption); + } + + dom_node_unref(caption); + + return err; } /** @@ -440,24 +472,28 @@ dom_exception dom_html_table_element_create_t_foot( dom_exception exp; exp = dom_html_table_element_get_t_foot(element, (dom_html_table_section_element **)t_foot); - if(exp !=DOM_NO_ERR) { + if (exp !=DOM_NO_ERR) return exp; - } - if((*t_foot) == NULL) { + + if ((*t_foot) == NULL) { dom_html_document *doc = (dom_html_document *) ((dom_node_internal *) element)->owner; + dom_node_internal *new_t_foot; + exp = _dom_html_table_section_element_create(doc, doc->memoised[hds_TFOOT], ((dom_node_internal *)element)->namespace, ((dom_node_internal *)element)->prefix, (dom_html_table_section_element **)t_foot); - if(exp != DOM_NO_ERR) { + if (exp != DOM_NO_ERR) return exp; - } - _dom_node_append_child((dom_node_internal *)element, - (dom_node_internal *)*t_foot, - (dom_node_internal **)t_foot); - element->t_foot = (dom_html_table_section_element *)*t_foot; + exp = dom_node_append_child(element, *t_foot, + &new_t_foot); + dom_node_unref(*t_foot); + if (exp == DOM_NO_ERR) + *t_foot = (dom_html_element *)new_t_foot; + + return exp; } return DOM_NO_ERR; @@ -473,12 +509,21 @@ dom_exception dom_html_table_element_delete_t_foot( dom_html_table_element *element) { dom_html_table_section_element *t_foot; - dom_html_table_element_get_t_foot(element, &t_foot); - _dom_node_remove_child((dom_node_internal *)element, - (dom_node_internal *)t_foot, - (dom_node_internal **)&t_foot); - element->t_foot = NULL; - return DOM_NO_ERR; + dom_node *old_t_foot; + dom_exception err; + + err = dom_html_table_element_get_t_foot(element, &t_foot); + if (err != DOM_NO_ERR || t_foot == NULL) + return err; + + err = dom_node_remove_child(element, t_foot, &old_t_foot); + if (err == DOM_NO_ERR) { + dom_node_unref(old_t_foot); + } + + dom_node_unref(t_foot); + + return err; } /** @@ -492,25 +537,34 @@ dom_exception dom_html_table_element_create_t_head( dom_html_table_element *element, dom_html_element **t_head) { - dom_html_table_element_get_t_head(element, + dom_exception exp; + exp = dom_html_table_element_get_t_head(element, (dom_html_table_section_element **)t_head); + if(exp != DOM_NO_ERR) { + dom_node_unref(*t_head); + return exp; + } if((*t_head) == NULL) { dom_exception exp; dom_html_document *doc = (dom_html_document *) ((dom_node_internal *) element)->owner; + dom_node_internal *new_t_head; + exp = _dom_html_table_section_element_create(doc, doc->memoised[hds_THEAD], ((dom_node_internal *)element)->namespace, ((dom_node_internal *)element)->prefix, (dom_html_table_section_element **)t_head); - if(exp != DOM_NO_ERR) { + if(exp != DOM_NO_ERR) return exp; - } - _dom_node_append_child((dom_node_internal *)element, - (dom_node_internal *)*t_head, - (dom_node_internal **)t_head); - element->t_head = (dom_html_table_section_element *)*t_head; + exp = dom_node_append_child(element, + *t_head, &new_t_head); + if(exp == DOM_NO_ERR) { + dom_node_unref(*t_head); + *t_head = (dom_html_element *)new_t_head; + } + return exp; } return DOM_NO_ERR; } @@ -525,12 +579,21 @@ dom_exception dom_html_table_element_delete_t_head( dom_html_table_element *element) { dom_html_table_section_element *t_head; - dom_html_table_element_get_t_head(element, &t_head); - _dom_node_remove_child((dom_node_internal *)element, - (dom_node_internal *)t_head, - (dom_node_internal **)&t_head); - element->t_head = NULL; - return DOM_NO_ERR; + dom_node *old_t_head; + dom_exception err; + + err = dom_html_table_element_get_t_head(element, &t_head); + if (err != DOM_NO_ERR || t_head == NULL) + return err; + + err = dom_node_remove_child(element, t_head, &old_t_head); + if (err == DOM_NO_ERR) { + dom_node_unref(old_t_head); + } + + dom_node_unref(t_head); + + return err; } /** @@ -546,32 +609,46 @@ dom_exception dom_html_table_element_create_t_body( { dom_html_collection *t_bodies; uint32_t len; - dom_html_table_element_get_t_bodies(element, + dom_exception exp; + exp = dom_html_table_element_get_t_bodies(element, &t_bodies); - dom_html_collection_get_length(t_bodies, + if(exp != DOM_NO_ERR) { + dom_html_collection_unref(t_bodies); + return exp; + } + exp = dom_html_collection_get_length(t_bodies, &len); - + if(exp != DOM_NO_ERR) { + dom_html_collection_unref(t_bodies); + return exp; + } if(len == 0) { - dom_exception exp; dom_html_document *doc = (dom_html_document *) ((dom_node_internal *) element)->owner; + dom_node_internal *new_t_body; + exp = _dom_html_table_section_element_create(doc, doc->memoised[hds_TBODY], ((dom_node_internal *)element)->namespace, ((dom_node_internal *)element)->prefix, t_body); if(exp != DOM_NO_ERR) { + dom_node_unref(t_body); return exp; } - return _dom_node_append_child((dom_node_internal *)element, - (dom_node_internal *)*t_body, - (dom_node_internal **)t_body); + exp = dom_node_append_child(element, *t_body, + &new_t_body); + if(exp == DOM_NO_ERR) { + dom_node_unref(*t_body); + *t_body = (dom_html_table_section_element *)new_t_body; + } } else { - return dom_html_collection_item(t_bodies, + exp = dom_html_collection_item(t_bodies, 0, (dom_node **)t_body); } - return DOM_NO_ERR; + dom_html_collection_unref(t_bodies); + return exp; } /** * Insert a new Row into the table @@ -594,49 +671,74 @@ dom_exception dom_html_table_element_insert_row( exp = dom_html_table_element_get_rows(element, &rows); if(exp != DOM_NO_ERR) { + dom_html_collection_unref(rows); return exp; } exp = dom_html_collection_get_length(rows, &len); - + if(exp != DOM_NO_ERR) { + dom_html_collection_unref(rows); + return exp; + } exp = _dom_html_table_row_element_create(doc, ((dom_node_internal *)element)->namespace, ((dom_node_internal *)element)->prefix, (dom_html_table_row_element **)row); if(exp != DOM_NO_ERR) { + dom_node_unref(*row); + dom_html_collection_unref(rows); return exp; } if(index > (int32_t)len || index < -1) { - return DOM_INDEX_SIZE_ERR; + exp = DOM_INDEX_SIZE_ERR; } else if(len == 0) { dom_html_table_section_element *new_body; + dom_node_internal *new_row; exp = dom_html_table_element_create_t_body(element, &new_body); if(exp != DOM_NO_ERR) { + dom_html_collection_unref(rows); + dom_node_unref(new_body); return exp; } - return _dom_node_append_child((dom_node_internal *)new_body, - (dom_node_internal *)*row, - (dom_node_internal **)row); - + exp = dom_node_append_child(new_body, *row, + &new_row); + if(exp == DOM_NO_ERR) { + dom_node_unref(*row); + *row = (dom_html_element *)new_row; + } } else { if(index ==-1) { index = (int32_t)len; } - dom_html_collection* rows; dom_html_table_section_element *t_head; dom_html_table_section_element *t_foot; uint32_t window_len = 0, section_len; - dom_html_table_element_get_t_head(element, &t_head); - dom_html_table_section_element_get_rows(t_head, &rows); + exp = dom_html_table_element_get_t_head(element, &t_head); + if (exp != DOM_NO_ERR) + return exp; + + dom_html_collection_unref(rows); + + exp = dom_html_table_section_element_get_rows(t_head, &rows); + if(exp != DOM_NO_ERR) { + dom_html_collection_unref(rows); + return exp; + } + dom_html_collection_get_length(rows, §ion_len); + if(exp != DOM_NO_ERR) { + dom_html_collection_unref(rows); + return exp; + } if(window_len + section_len > (uint32_t)index || window_len + section_len == len) { + dom_html_collection_unref(rows); return dom_html_table_section_element_insert_row(t_head, index-window_len, row); } @@ -645,12 +747,15 @@ dom_exception dom_html_table_element_insert_row( dom_node_internal *n = (dom_node_internal *)element; + dom_html_collection_unref(rows); + for (n = n->first_child; n != NULL; n = n->next) { if((n->type == DOM_ELEMENT_NODE) && dom_string_caseless_isequal(doc->memoised[hds_TBODY],n->name)) { - dom_html_table_section_element_get_rows((dom_html_table_section_element *)n, &rows); - dom_html_collection_get_length(rows, §ion_len); + exp = dom_html_table_section_element_get_rows((dom_html_table_section_element *)n, &rows); + exp = dom_html_collection_get_length(rows, §ion_len); + dom_html_collection_unref(rows); if(window_len + section_len > (uint32_t)index || window_len + section_len == len) { @@ -662,16 +767,32 @@ dom_exception dom_html_table_element_insert_row( window_len += section_len; } } - dom_html_table_element_get_t_foot(element, &t_foot); - dom_html_table_section_element_get_rows(t_foot, &rows); - dom_html_collection_get_length(rows, §ion_len); + exp = dom_html_table_element_get_t_foot(element, &t_foot); + if(exp != DOM_NO_ERR) + return exp; + + exp = dom_html_table_section_element_get_rows(t_foot, &rows); + if(exp != DOM_NO_ERR) { + dom_html_collection_unref(rows); + return exp; + } + + exp = dom_html_collection_get_length(rows, §ion_len); + + dom_html_collection_unref(rows); + + if(exp != DOM_NO_ERR) + return exp; + if(window_len + section_len > (uint32_t)index || window_len +section_len == len) { return dom_html_table_section_element_insert_row(t_foot, index-window_len, row); } - return DOM_INDEX_SIZE_ERR; + exp = DOM_INDEX_SIZE_ERR; } + dom_html_collection_unref(rows); + return exp; } /** * Delete the table Head, if one exists @@ -692,39 +813,68 @@ dom_exception dom_html_table_element_delete_row( exp = dom_html_table_element_get_rows(element, &rows); if(exp != DOM_NO_ERR) { + dom_html_collection_unref(rows); return exp; } exp = dom_html_collection_get_length(rows, &len); if(exp != DOM_NO_ERR) { + dom_html_collection_unref(rows); return exp; } if(index >= (int32_t)len || index < -1 || len ==0) { + dom_html_collection_unref(rows); return DOM_INDEX_SIZE_ERR; } else { if(index ==-1) { index = (int32_t)len-1; } - dom_html_collection* rows; + + dom_html_collection_unref(rows); + dom_html_table_section_element *t_head; dom_html_table_section_element *t_foot; uint32_t window_len = 0, section_len; - dom_html_table_element_get_t_head(element, &t_head); - dom_html_table_section_element_get_rows(t_head, &rows); - dom_html_collection_get_length(rows, §ion_len); + exp = dom_html_table_element_get_t_head(element, &t_head); + if(exp != DOM_NO_ERR) + return exp; + + exp = dom_html_table_section_element_get_rows(t_head, &rows); + if (exp != DOM_NO_ERR) { + dom_html_collection_unref(rows); + return DOM_NO_ERR; + } + + exp = dom_html_collection_get_length(rows, §ion_len); + + dom_html_collection_unref(rows); + if(exp != DOM_NO_ERR) + return exp; + if(window_len + section_len > (uint32_t)index) { return dom_html_table_section_element_delete_row(t_head, index-window_len); } window_len += section_len; dom_node_internal *n = (dom_node_internal *)element; + for (n = n->first_child; n != NULL; n = n->next) { if((n->type == DOM_ELEMENT_NODE) && dom_string_caseless_isequal(doc->memoised[hds_TBODY],n->name)) { - dom_html_table_section_element_get_rows((dom_html_table_section_element *)n, &rows); + exp = dom_html_table_section_element_get_rows + ((dom_html_table_section_element *)n, &rows); + if(exp != DOM_NO_ERR) { + dom_html_collection_unref(rows); + return exp; + } + dom_html_collection_get_length(rows, §ion_len); + dom_html_collection_unref(rows); + if(exp != DOM_NO_ERR) + return exp; + if(window_len + section_len > (uint32_t)index) { return dom_html_table_section_element_delete_row( (dom_html_table_section_element *)n, @@ -734,8 +884,16 @@ dom_exception dom_html_table_element_delete_row( } } exp = dom_html_table_element_get_t_foot(element, &t_foot); - dom_html_table_section_element_get_rows(t_foot, &rows); - dom_html_collection_get_length(rows, §ion_len); + exp = dom_html_table_section_element_get_rows(t_foot, &rows); + if(exp != DOM_NO_ERR) { + dom_html_collection_unref(rows); + return exp; + } + exp = dom_html_collection_get_length(rows, §ion_len); + dom_html_collection_unref(rows); + if (exp != DOM_NO_ERR) + return exp; + if(window_len + section_len > (uint32_t)index) { return dom_html_table_section_element_delete_row(t_foot, index-window_len); diff --git a/src/html/html_table_element.h b/src/html/html_table_element.h index caabbe8..955ab88 100644 --- a/src/html/html_table_element.h +++ b/src/html/html_table_element.h @@ -15,12 +15,6 @@ struct dom_html_table_element { struct dom_html_element base; /**< The base class */ - dom_html_table_caption_element* caption; - /**< The caption associated with the table*/ - dom_html_table_section_element* t_head; - /**< The thead element associated with the table*/ - dom_html_table_section_element* t_foot; - /**< The tfoot element associated with the table*/ }; /* Create a dom_html_table_element object */ diff --git a/src/html/html_tablerow_element.c b/src/html/html_tablerow_element.c index fb3e27b..174bce1 100644 --- a/src/html/html_tablerow_element.c +++ b/src/html/html_tablerow_element.c @@ -340,36 +340,44 @@ dom_exception dom_html_table_row_element_insert_cell( dom_exception dom_html_table_row_element_delete_cell( dom_html_table_row_element *element, int32_t index) { - dom_node *node; /*< The node at the (index)th position*/ - + dom_node *node, *old_node; /*< The node at the (index)th position*/ dom_html_collection *cells; /*< The collection of rows in input table_row_element*/ uint32_t len; /*< The size of the row collection */ - dom_exception exp; /*< Temporary variable to store & check the exceptions*/ exp = dom_html_table_row_element_get_cells(element, &cells); - if(exp != DOM_NO_ERR) { + if (exp != DOM_NO_ERR) { return exp; } exp = dom_html_collection_get_length(cells, &len); - if(exp != DOM_NO_ERR) { + if (exp != DOM_NO_ERR) { + dom_html_collection_unref(cells); return exp; } - if(index < -1 || index >= (int32_t)len || len ==0) { + if (index < -1 || index >= (int32_t) len || len == 0) { /* Check for index validity */ + dom_html_collection_unref(cells); return DOM_INDEX_SIZE_ERR; - } else if(index == -1) { - exp = dom_html_collection_item(cells, - len-1, &node); - } else { - exp = dom_html_collection_item(cells, - index, &node); } - return _dom_node_remove_child((dom_node_internal *)element, - (dom_node_internal *)node, - (dom_node_internal **)&node); + if (index == -1) + index = len - 1; + + exp = dom_html_collection_item(cells, index, &node); + if (exp != DOM_NO_ERR) { + dom_html_collection_unref(cells); + return exp; + } + + exp = dom_node_remove_child(element, node, &old_node); + if (exp == DOM_NO_ERR) + dom_node_unref(old_node); + + dom_node_unref(node); + dom_html_collection_unref(cells); + + return exp; } diff --git a/src/html/html_tablesection_element.c b/src/html/html_tablesection_element.c index b35cfb4..af4ccb6 100644 --- a/src/html/html_tablesection_element.c +++ b/src/html/html_tablesection_element.c @@ -250,37 +250,44 @@ dom_exception dom_html_table_section_element_insert_row( dom_exception dom_html_table_section_element_delete_row( dom_html_table_section_element *element, int32_t index) { - dom_node *node; /*< The node at the (index)th position*/ - + dom_node *node, *old_node; /*< The node at the (index)th position*/ dom_html_collection *rows; /*< The collection of rows in input table_section_element*/ uint32_t len; /*< The size of the row collection */ - dom_exception exp; /*< Temporary variable to store & check the exceptions*/ exp = dom_html_table_section_element_get_rows(element, &rows); - if(exp != DOM_NO_ERR) { + if (exp != DOM_NO_ERR) { return exp; } exp = dom_html_collection_get_length(rows, &len); - if(exp != DOM_NO_ERR) { + if (exp != DOM_NO_ERR) { + dom_html_collection_unref(rows); return exp; } - if(index < -1 || index >= (int32_t)len) { + if (index < -1 || index >= (int32_t) len || (index == -1 && len == 0)) { /* Check for index validity */ + dom_html_collection_unref(rows); return DOM_INDEX_SIZE_ERR; - } else if(index == -1) { - exp = dom_html_collection_item(rows, - len-1, &node); - } else { - exp = dom_html_collection_item(rows, - index, &node); + } + + if (index == -1) + index = len - 1; + + exp = dom_html_collection_item(rows, index, &node); + if (exp != DOM_NO_ERR) { + dom_html_collection_unref(rows); + return exp; } - exp = _dom_node_remove_child((dom_node_internal *)element, - (dom_node_internal *)node, - (dom_node_internal **)&node); - return DOM_NO_ERR; + exp = dom_node_remove_child(element, node, &old_node); + if (exp == DOM_NO_ERR) + dom_node_unref(old_node); + + dom_node_unref(node); + dom_html_collection_unref(rows); + + return exp; } |