summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Silverstone <dsilvers@digital-scurf.org>2014-07-21 11:30:17 +0100
committerDaniel Silverstone <dsilvers@digital-scurf.org>2014-07-21 11:30:17 +0100
commit8df19e5025e6327c5ce48bc5002bc6cc67d1fe74 (patch)
tree23da8a14d27c04d6ac200d2d79fcc2885a25db0b
parent9aae1b6cc3ec89c96f0cdcc173405eef1d5b1c2c (diff)
parent9f0054bb895b7d56602d022cd3f36c1e1c3cbc94 (diff)
downloadlibdom-8df19e5025e6327c5ce48bc5002bc6cc67d1fe74.tar.gz
libdom-8df19e5025e6327c5ce48bc5002bc6cc67d1fe74.tar.bz2
Merge remote-tracking branch 'origin/rupindersingh/libdom_recovered'
-rw-r--r--src/html/html_document.c8
-rw-r--r--src/html/html_select_element.c31
-rw-r--r--src/html/html_table_element.c370
-rw-r--r--src/html/html_table_element.h6
-rw-r--r--src/html/html_tablerow_element.c38
-rw-r--r--src/html/html_tablesection_element.c39
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, &section_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, &section_len);
+ exp = dom_html_table_section_element_get_rows((dom_html_table_section_element *)n, &rows);
+ exp = dom_html_collection_get_length(rows, &section_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, &section_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, &section_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, &section_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, &section_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, &section_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, &section_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, &section_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;
}