diff options
Diffstat (limited to 'src/html')
59 files changed, 655 insertions, 242 deletions
diff --git a/src/html/Makefile b/src/html/Makefile index c98ce9a..db765ad 100644 --- a/src/html/Makefile +++ b/src/html/Makefile @@ -1,24 +1,62 @@ # Sources DIR_SOURCES := \ - html_document.c html_collection.c html_options_collection.c \ - html_element.c html_html_element.c html_head_element.c \ - html_link_element.c html_title_element.c html_meta_element.c \ - html_base_element.c html_style_element.c \ - html_body_element.c html_form_element.c html_select_element.c \ - html_button_element.c html_input_element.c html_text_area_element.c \ - html_opt_group_element.c html_option_element.c html_hr_element.c \ - html_dlist_element.c html_directory_element.c html_menu_element.c \ - html_fieldset_element.c html_legend_element.c html_div_element.c \ - html_paragraph_element.c html_heading_element.c html_quote_element.c \ - html_pre_element.c html_br_element.c html_label_element.c \ - html_ulist_element.c html_olist_element.c html_li_element.c \ - html_font_element.c html_mod_element.c html_anchor_element.c \ - html_basefont_element.c html_image_element.c html_object_element.c \ - html_param_element.c html_applet_element.c html_area_element.c \ - html_map_element.c html_script_element.c html_tablecaption_element.c \ - html_tablecell_element.c html_tablecol_element.c html_tablesection_element.c \ - html_table_element.c html_tablerow_element.c html_frameset_element.c \ - html_frame_element.c html_iframe_element.c html_isindex_element.c \ + html_applet_element.c \ + html_area_element.c \ + html_anchor_element.c \ + html_basefont_element.c \ + html_base_element.c \ + html_body_element.c \ + html_button_element.c \ + html_canvas_element.c \ + html_collection.c \ + html_document.c \ + html_element.c \ + html_dlist_element.c \ + html_directory_element.c \ + html_options_collection.c \ + html_html_element.c \ + html_head_element.c \ + html_link_element.c \ + html_title_element.c \ + html_meta_element.c \ + html_style_element.c \ + html_form_element.c \ + html_select_element.c \ + html_input_element.c \ + html_text_area_element.c \ + html_opt_group_element.c \ + html_option_element.c \ + html_hr_element.c \ + html_menu_element.c \ + html_fieldset_element.c \ + html_legend_element.c \ + html_div_element.c \ + html_paragraph_element.c \ + html_heading_element.c \ + html_quote_element.c \ + html_pre_element.c \ + html_br_element.c \ + html_label_element.c \ + html_ulist_element.c \ + html_olist_element.c \ + html_li_element.c \ + html_font_element.c \ + html_mod_element.c \ + html_image_element.c \ + html_object_element.c \ + html_param_element.c \ + html_map_element.c \ + html_script_element.c \ + html_tablecaption_element.c \ + html_tablecell_element.c \ + html_tablecol_element.c \ + html_tablesection_element.c \ + html_table_element.c \ + html_tablerow_element.c \ + html_frameset_element.c \ + html_frame_element.c \ + html_iframe_element.c \ + html_isindex_element.c \ UNINMPLEMENTED_SOURCES := \ diff --git a/src/html/html_anchor_element.c b/src/html/html_anchor_element.c index 8d64c2b..88fd2ac 100644 --- a/src/html/html_anchor_element.c +++ b/src/html/html_anchor_element.c @@ -18,7 +18,7 @@ #include "core/attr.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_ANCHOR_ELEMENT }, diff --git a/src/html/html_applet_element.c b/src/html/html_applet_element.c index 93ea1b5..f7f1afc 100644 --- a/src/html/html_applet_element.c +++ b/src/html/html_applet_element.c @@ -18,7 +18,7 @@ #include "core/attr.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_APPLET_ELEMENT }, diff --git a/src/html/html_area_element.c b/src/html/html_area_element.c index 828b073..3da59d7 100644 --- a/src/html/html_area_element.c +++ b/src/html/html_area_element.c @@ -17,7 +17,7 @@ #include "core/attr.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_AREA_ELEMENT }, diff --git a/src/html/html_base_element.c b/src/html/html_base_element.c index 0034f7c..f322f5b 100644 --- a/src/html/html_base_element.c +++ b/src/html/html_base_element.c @@ -13,7 +13,7 @@ #include "core/node.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_BASE_ELEMENT }, diff --git a/src/html/html_basefont_element.c b/src/html/html_basefont_element.c index ac1183d..b68ae03 100644 --- a/src/html/html_basefont_element.c +++ b/src/html/html_basefont_element.c @@ -17,7 +17,7 @@ #include "core/attr.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_BASE_FONT_ELEMENT }, diff --git a/src/html/html_body_element.c b/src/html/html_body_element.c index 0fc4b13..4f52152 100644 --- a/src/html/html_body_element.c +++ b/src/html/html_body_element.c @@ -15,7 +15,7 @@ #include "core/node.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_BODY_ELEMENT }, diff --git a/src/html/html_br_element.c b/src/html/html_br_element.c index 74e3ea8..71778f6 100644 --- a/src/html/html_br_element.c +++ b/src/html/html_br_element.c @@ -17,7 +17,7 @@ #include "core/attr.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_BR_ELEMENT }, diff --git a/src/html/html_button_element.c b/src/html/html_button_element.c index 04a17dd..52a3607 100644 --- a/src/html/html_button_element.c +++ b/src/html/html_button_element.c @@ -17,7 +17,7 @@ #include "core/attr.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_BUTTON_ELEMENT }, diff --git a/src/html/html_canvas_element.c b/src/html/html_canvas_element.c new file mode 100644 index 0000000..71d4a53 --- /dev/null +++ b/src/html/html_canvas_element.c @@ -0,0 +1,214 @@ +/* + * This file is part of libdom. + * Licensed under the MIT License, + * http://www.opensource.org/licenses/mit-license.php + * Copyright 2020 Vincent Sanders <vince@netsurf-browser.org> + */ + +#include <assert.h> +#include <stdlib.h> + +#include <dom/html/html_canvas_element.h> + +#include "html/html_document.h" +#include "html/html_canvas_element.h" + +#include "core/node.h" +#include "core/attr.h" +#include "utils/utils.h" + +static const struct dom_element_protected_vtable _protect_vtable = { + { + DOM_NODE_PROTECT_VTABLE_HTML_CANVAS_ELEMENT + }, + DOM_HTML_CANVAS_ELEMENT_PROTECT_VTABLE +}; + +/** + * Create a dom_html_canvas_element object + * + * \param params The html element creation parameters + * \param ele The returned element object + * \return DOM_NO_ERR on success, appropriate dom_exception on failure. + */ +dom_exception _dom_html_canvas_element_create( + struct dom_html_element_create_params *params, + struct dom_html_canvas_element **ele) +{ + struct dom_node_internal *node; + + *ele = malloc(sizeof(dom_html_canvas_element)); + if (*ele == NULL) + return DOM_NO_MEM_ERR; + + /* Set up vtables */ + node = (struct dom_node_internal *) *ele; + node->base.vtable = &_dom_html_element_vtable; + node->vtable = &_protect_vtable; + + return _dom_html_canvas_element_initialise(params, *ele); +} + +/** + * Initialise a dom_html_canvas_element object + * + * \param params The html element creation parameters + * \param ele The dom_html_canvas_element object + * \return DOM_NO_ERR on success, appropriate dom_exception on failure. + */ +dom_exception _dom_html_canvas_element_initialise( + struct dom_html_element_create_params *params, + struct dom_html_canvas_element *ele) +{ + return _dom_html_element_initialise(params, &ele->base); +} + +/** + * Finalise a dom_html_canvas_element object + * + * \param ele The dom_html_canvas_element object + */ +void _dom_html_canvas_element_finalise(struct dom_html_canvas_element *ele) +{ + _dom_html_element_finalise(&ele->base); +} + +/** + * Destroy a dom_html_canvas_element object + * + * \param ele The dom_html_canvas_element object + */ +void _dom_html_canvas_element_destroy(struct dom_html_canvas_element *ele) +{ + _dom_html_canvas_element_finalise(ele); + free(ele); +} + +/*------------------------------------------------------------------------*/ +/* The protected virtual functions */ + +/* The virtual function used to parse attribute value, see src/core/element.c + * for detail */ +dom_exception _dom_html_canvas_element_parse_attribute(dom_element *ele, + dom_string *name, dom_string *value, + dom_string **parsed) +{ + UNUSED(ele); + UNUSED(name); + + dom_string_ref(value); + *parsed = value; + + return DOM_NO_ERR; +} + +/* The virtual destroy function, see src/core/node.c for detail */ +void _dom_virtual_html_canvas_element_destroy(dom_node_internal *node) +{ + _dom_html_canvas_element_destroy((struct dom_html_canvas_element *) node); +} + +/* The virtual copy function, see src/core/node.c for detail */ +dom_exception _dom_html_canvas_element_copy( + dom_node_internal *old, dom_node_internal **copy) +{ + dom_html_canvas_element *new_node; + dom_exception err; + + new_node = malloc(sizeof(dom_html_canvas_element)); + if (new_node == NULL) + return DOM_NO_MEM_ERR; + + err = dom_html_canvas_element_copy_internal(old, new_node); + if (err != DOM_NO_ERR) { + free(new_node); + return err; + } + + *copy = (dom_node_internal *) new_node; + + return DOM_NO_ERR; +} + +dom_exception _dom_html_canvas_element_copy_internal( + dom_html_canvas_element *old, + dom_html_canvas_element *new) +{ + dom_exception err; + + err = dom_html_element_copy_internal(old, new); + if (err != DOM_NO_ERR) { + return err; + } + + return DOM_NO_ERR; +} + +/*-----------------------------------------------------------------------*/ +/* API functions */ + + +dom_exception +dom_html_canvas_element_get_width(dom_html_canvas_element *canvas, + dom_ulong *width) +{ + dom_exception exc; + + exc = dom_html_element_get_dom_ulong_property(&canvas->base, + "width", + SLEN("width"), + width); + + if (exc != DOM_NO_ERR) + return exc; + + if (*width == (dom_ulong)-1) { + /* width not set on the canvas, default is 300px */ + *width = 300; + } + + return DOM_NO_ERR; +} + +dom_exception +dom_html_canvas_element_set_width(dom_html_canvas_element *canvas, + dom_ulong width) +{ + return dom_html_element_set_dom_ulong_property(&canvas->base, + "width", + SLEN("width"), + width); +} + +dom_exception +dom_html_canvas_element_get_height(dom_html_canvas_element *canvas, + dom_ulong *height) +{ + dom_exception exc; + + exc = dom_html_element_get_dom_ulong_property(&canvas->base, + "height", + SLEN("height"), + height); + + if (exc != DOM_NO_ERR) + return exc; + + if (*height == (dom_ulong)-1) { + /* height not set on the canvas, default is 150px */ + *height = 150; + } + + return DOM_NO_ERR; +} + +dom_exception +dom_html_canvas_element_set_height(dom_html_canvas_element *canvas, + dom_ulong height) +{ + return dom_html_element_set_dom_ulong_property(&canvas->base, + "height", + SLEN("height"), + height); +} + diff --git a/src/html/html_canvas_element.h b/src/html/html_canvas_element.h new file mode 100644 index 0000000..4cf3042 --- /dev/null +++ b/src/html/html_canvas_element.h @@ -0,0 +1,62 @@ +/* + * This file is part of libdom. + * Licensed under the MIT License, + * http://www.opensource.org/licenses/mit-license.php + * Copyright 2020 Vincent Sanders <vince@netsurf-browser.org> + */ + +#ifndef dom_internal_html_canvas_element_h_ +#define dom_internal_html_canvas_element_h_ + +#include <dom/html/html_canvas_element.h> + +#include "html/html_element.h" + +struct dom_html_canvas_element { + struct dom_html_element base; + /**< The base class */ +}; + +/* Create a dom_html_canvas_element object */ +dom_exception _dom_html_canvas_element_create( + struct dom_html_element_create_params *params, + struct dom_html_canvas_element **ele); + +/* Initialise a dom_html_canvas_element object */ +dom_exception _dom_html_canvas_element_initialise( + struct dom_html_element_create_params *params, + struct dom_html_canvas_element *ele); + +/* Finalise a dom_html_canvas_element object */ +void _dom_html_canvas_element_finalise(struct dom_html_canvas_element *ele); + +/* Destroy a dom_html_canvas_element object */ +void _dom_html_canvas_element_destroy(struct dom_html_canvas_element *ele); + +/* The protected virtual functions */ +dom_exception _dom_html_canvas_element_parse_attribute(dom_element *ele, + dom_string *name, dom_string *value, + dom_string **parsed); + +void _dom_virtual_html_canvas_element_destroy(dom_node_internal *node); +dom_exception _dom_html_canvas_element_copy(dom_node_internal *old, + dom_node_internal **copy); + +#define DOM_HTML_CANVAS_ELEMENT_PROTECT_VTABLE \ + _dom_html_canvas_element_parse_attribute + +#define DOM_NODE_PROTECT_VTABLE_HTML_CANVAS_ELEMENT \ + _dom_virtual_html_canvas_element_destroy, \ + _dom_html_canvas_element_copy + +/* Helper functions*/ +dom_exception _dom_html_canvas_element_copy_internal( + dom_html_canvas_element *old, + dom_html_canvas_element *new); +#define dom_html_canvas_element_copy_internal(o, n) \ + _dom_html_canvas_element_copy_internal( \ + (dom_html_canvas_element *) (o), \ + (dom_html_canvas_element *) (n)) + + +#endif diff --git a/src/html/html_collection.c b/src/html/html_collection.c index cba2b2d..7bb55b6 100644 --- a/src/html/html_collection.c +++ b/src/html/html_collection.c @@ -215,7 +215,8 @@ dom_exception dom_html_collection_named_item(dom_html_collection *col, struct dom_node_internal *n = col->root; dom_html_document *doc = (dom_html_document *)dom_node_get_owner(n); dom_exception err; - while (n != NULL) { + + while (n != NULL) { if (n->type == DOM_ELEMENT_NODE && col->ic(n, col->ctx) == true) { dom_string *id = NULL; @@ -227,16 +228,15 @@ dom_exception dom_html_collection_named_item(dom_html_collection *col, return err; } - if (id != NULL && dom_string_isequal(name, id)) { - *node = (struct dom_node *) n; - dom_node_ref(n); - dom_string_unref(id); - - return DOM_NO_ERR; - } + if (id != NULL) { + if (dom_string_isequal(name, id)) { + *node = dom_node_ref(n); + dom_string_unref(id); - if (id != NULL) + return DOM_NO_ERR; + } dom_string_unref(id); + } /* Check for Name attr if id not matched/found */ err = _dom_element_get_attribute((dom_element *)n, @@ -244,14 +244,16 @@ dom_exception dom_html_collection_named_item(dom_html_collection *col, if(err != DOM_NO_ERR) { return err; } - if (id_name != NULL && dom_string_isequal(name, id_name)) { - *node = (struct dom_node *) n; - dom_node_ref(n); - dom_string_unref(id_name); - return DOM_NO_ERR; - } + if (id_name != NULL) { + if (dom_string_isequal(name, id_name)) { + *node = dom_node_ref(n); + dom_string_unref(id_name); + return DOM_NO_ERR; + } + dom_string_unref(id_name); + } } /* Depth first iterating */ diff --git a/src/html/html_directory_element.c b/src/html/html_directory_element.c index 585af1c..19db7cd 100644 --- a/src/html/html_directory_element.c +++ b/src/html/html_directory_element.c @@ -17,7 +17,7 @@ #include "core/attr.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_DIRECTORY_ELEMENT }, diff --git a/src/html/html_div_element.c b/src/html/html_div_element.c index b061246..c39af74 100644 --- a/src/html/html_div_element.c +++ b/src/html/html_div_element.c @@ -17,7 +17,7 @@ #include "core/attr.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_DIV_ELEMENT }, diff --git a/src/html/html_dlist_element.c b/src/html/html_dlist_element.c index ab9d4c3..fb0ad56 100644 --- a/src/html/html_dlist_element.c +++ b/src/html/html_dlist_element.c @@ -17,7 +17,7 @@ #include "core/attr.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_DL_ELEMENT }, diff --git a/src/html/html_document.c b/src/html/html_document.c index 2f219d0..cf3c25d 100644 --- a/src/html/html_document.c +++ b/src/html/html_document.c @@ -17,6 +17,7 @@ #include "html/html_head_element.h" #include "html/html_body_element.h" #include "html/html_base_element.h" +#include "html/html_canvas_element.h" #include "html/html_div_element.h" #include "html/html_link_element.h" #include "html/html_title_element.h" @@ -71,7 +72,7 @@ #include "utils/namespace.h" #include "utils/utils.h" -static struct dom_html_document_vtable html_document_vtable = { +static const struct dom_html_document_vtable html_document_vtable = { { { { @@ -84,7 +85,7 @@ static struct dom_html_document_vtable html_document_vtable = { DOM_HTML_DOCUMENT_VTABLE }; -static struct dom_node_protect_vtable html_document_protect_vtable = { +static const struct dom_node_protect_vtable html_document_protect_vtable = { DOM_HTML_DOCUMENT_PROTECT_VTABLE }; @@ -318,6 +319,8 @@ static inline dom_html_element_type _dom_html_document_get_element_type( RETURN_IF_MATCH(upper, DOM_HTML_ELEMENT_TYPE_RP) else RETURN_IF_MATCH(upper, DOM_HTML_ELEMENT_TYPE_RT) + else + RETURN_IF_MATCH(upper, DOM_HTML_ELEMENT_TYPE_TT) break; case 3: RETURN_IF_MATCH(upper, DOM_HTML_ELEMENT_TYPE_DIV) @@ -353,6 +356,8 @@ static inline dom_html_element_type _dom_html_document_get_element_type( RETURN_IF_MATCH(upper, DOM_HTML_ELEMENT_TYPE_BDO) else RETURN_IF_MATCH(upper, DOM_HTML_ELEMENT_TYPE_WBR) + else + RETURN_IF_MATCH(upper, DOM_HTML_ELEMENT_TYPE_BIG) break; case 4: RETURN_IF_MATCH(upper, DOM_HTML_ELEMENT_TYPE_META) @@ -394,6 +399,8 @@ static inline dom_html_element_type _dom_html_document_get_element_type( RETURN_IF_MATCH(upper, DOM_HTML_ELEMENT_TYPE_BASE) else RETURN_IF_MATCH(upper, DOM_HTML_ELEMENT_TYPE_TIME) + else + RETURN_IF_MATCH(upper, DOM_HTML_ELEMENT_TYPE_NOBR) break; case 5: RETURN_IF_MATCH(upper, DOM_HTML_ELEMENT_TYPE_INPUT) @@ -468,6 +475,10 @@ static inline dom_html_element_type _dom_html_document_get_element_type( RETURN_IF_MATCH(upper, DOM_HTML_ELEMENT_TYPE_SOURCE) else RETURN_IF_MATCH(upper, DOM_HTML_ELEMENT_TYPE_STRONG) + else + RETURN_IF_MATCH(upper, DOM_HTML_ELEMENT_TYPE_SPACER) + else + RETURN_IF_MATCH(upper, DOM_HTML_ELEMENT_TYPE_STRIKE) break; case 7: RETURN_IF_MATCH(upper, DOM_HTML_ELEMENT_TYPE_CAPTION) @@ -485,6 +496,12 @@ static inline dom_html_element_type _dom_html_document_get_element_type( RETURN_IF_MATCH(upper, DOM_HTML_ELEMENT_TYPE_SECTION) else RETURN_IF_MATCH(upper, DOM_HTML_ELEMENT_TYPE_SUMMARY) + else + RETURN_IF_MATCH(upper, DOM_HTML_ELEMENT_TYPE_ACRONYM) + else + RETURN_IF_MATCH(upper, DOM_HTML_ELEMENT_TYPE_BGSOUND) + else + RETURN_IF_MATCH(upper, DOM_HTML_ELEMENT_TYPE_MARQUEE) break; case 8: RETURN_IF_MATCH(upper, DOM_HTML_ELEMENT_TYPE_TEXTAREA) @@ -508,6 +525,8 @@ static inline dom_html_element_type _dom_html_document_get_element_type( RETURN_IF_MATCH(upper, DOM_HTML_ELEMENT_TYPE_PROGRESS) else RETURN_IF_MATCH(upper, DOM_HTML_ELEMENT_TYPE_TEMPLATE) + else + RETURN_IF_MATCH(upper, DOM_HTML_ELEMENT_TYPE_NOFRAMES) break; case 10: RETURN_IF_MATCH(upper, DOM_HTML_ELEMENT_TYPE_BLOCKQUOTE) @@ -535,6 +554,10 @@ _dom_html_document_create_element_internal( dom_exception exc; struct dom_html_element_create_params params; + /* If the input tag name is empty, this is an 'invalid character' error */ + if (dom_string_length(in_tag_name) == 0) + return DOM_INVALID_CHARACTER_ERR; + exc = dom_string_toupper(in_tag_name, true, ¶ms.name); if (exc != DOM_NO_ERR) return exc; @@ -771,6 +794,10 @@ _dom_html_document_create_element_internal( exc = _dom_html_isindex_element_create(¶ms, (dom_html_isindex_element **) result); break; + case DOM_HTML_ELEMENT_TYPE_CANVAS: + exc = _dom_html_canvas_element_create(¶ms, + (dom_html_canvas_element **) result); + break; case DOM_HTML_ELEMENT_TYPE_DATA: case DOM_HTML_ELEMENT_TYPE_SPAN: case DOM_HTML_ELEMENT_TYPE_TIME: @@ -779,7 +806,6 @@ _dom_html_document_create_element_internal( case DOM_HTML_ELEMENT_TYPE_METER: case DOM_HTML_ELEMENT_TYPE_TRACK: case DOM_HTML_ELEMENT_TYPE_VIDEO: - case DOM_HTML_ELEMENT_TYPE_CANVAS: case DOM_HTML_ELEMENT_TYPE_DIALOG: case DOM_HTML_ELEMENT_TYPE_KEYGEN: case DOM_HTML_ELEMENT_TYPE_OUTPUT: @@ -801,8 +827,10 @@ _dom_html_document_create_element_internal( case DOM_HTML_ELEMENT_TYPE_EM: case DOM_HTML_ELEMENT_TYPE_RP: case DOM_HTML_ELEMENT_TYPE_RT: + case DOM_HTML_ELEMENT_TYPE_TT: case DOM_HTML_ELEMENT_TYPE_BDI: case DOM_HTML_ELEMENT_TYPE_BDO: + case DOM_HTML_ELEMENT_TYPE_BIG: case DOM_HTML_ELEMENT_TYPE_DFN: case DOM_HTML_ELEMENT_TYPE_KBD: case DOM_HTML_ELEMENT_TYPE_NAV: @@ -815,6 +843,7 @@ _dom_html_document_create_element_internal( case DOM_HTML_ELEMENT_TYPE_CODE: case DOM_HTML_ELEMENT_TYPE_MAIN: case DOM_HTML_ELEMENT_TYPE_MARK: + case DOM_HTML_ELEMENT_TYPE_NOBR: case DOM_HTML_ELEMENT_TYPE_RUBY: case DOM_HTML_ELEMENT_TYPE_SAMP: case DOM_HTML_ELEMENT_TYPE_ASIDE: @@ -825,10 +854,16 @@ _dom_html_document_create_element_internal( case DOM_HTML_ELEMENT_TYPE_HEADER: case DOM_HTML_ELEMENT_TYPE_HGROUP: case DOM_HTML_ELEMENT_TYPE_STRONG: + case DOM_HTML_ELEMENT_TYPE_SPACER: + case DOM_HTML_ELEMENT_TYPE_STRIKE: + case DOM_HTML_ELEMENT_TYPE_ACRONYM: case DOM_HTML_ELEMENT_TYPE_ADDRESS: case DOM_HTML_ELEMENT_TYPE_ARTICLE: + case DOM_HTML_ELEMENT_TYPE_BGSOUND: + case DOM_HTML_ELEMENT_TYPE_MARQUEE: case DOM_HTML_ELEMENT_TYPE_SECTION: case DOM_HTML_ELEMENT_TYPE_SUMMARY: + case DOM_HTML_ELEMENT_TYPE_NOFRAMES: case DOM_HTML_ELEMENT_TYPE_NOSCRIPT: case DOM_HTML_ELEMENT_TYPE_FIGCAPTION: /* These have no specialisation: use HTMLElement */ @@ -1119,6 +1154,7 @@ dom_exception _dom_html_document_get_body(dom_html_document *doc, } if (len == 0) { + dom_nodelist_unref(nodes); exc = dom_document_get_elements_by_tag_name(doc, doc->elements[DOM_HTML_ELEMENT_TYPE_FRAMESET], &nodes); @@ -1143,7 +1179,6 @@ dom_exception _dom_html_document_get_body(dom_html_document *doc, } *body = (dom_html_element *)node; - dom_node_unref(node); } return exc; @@ -1183,8 +1218,10 @@ dom_exception _dom_html_document_get_images(dom_html_document *doc, if (err != DOM_NO_ERR) return err; - return _dom_html_collection_create(doc, (dom_node_internal *) root, + err = _dom_html_collection_create(doc, (dom_node_internal *) root, images_callback, doc, col); + dom_node_unref(root); + return err; } bool applet_callback(struct dom_node_internal * node, void *ctx) @@ -1232,8 +1269,10 @@ dom_exception _dom_html_document_get_applets(dom_html_document *doc, if (err != DOM_NO_ERR) return err; - return _dom_html_collection_create(doc, (dom_node_internal *) root, + err = _dom_html_collection_create(doc, (dom_node_internal *) root, applets_callback, doc, col); + dom_node_unref(root); + return err; } /** @@ -1275,8 +1314,10 @@ dom_exception _dom_html_document_get_links(dom_html_document *doc, if (err != DOM_NO_ERR) return err; - return _dom_html_collection_create(doc, (dom_node_internal *) root, + err = _dom_html_collection_create(doc, (dom_node_internal *) root, links_callback, doc, col); + dom_node_unref(root); + return err; } static bool __dom_html_document_node_is_form(dom_node_internal *node, @@ -1351,8 +1392,10 @@ dom_exception _dom_html_document_get_anchors(dom_html_document *doc, if (err != DOM_NO_ERR) return err; - return _dom_html_collection_create(doc, (dom_node_internal *) root, + err = _dom_html_collection_create(doc, (dom_node_internal *) root, anchors_callback, doc, col); + dom_node_unref(root); + return err; } dom_exception _dom_html_document_get_cookie(dom_html_document *doc, diff --git a/src/html/html_element.c b/src/html/html_element.c index 65a75ca..c110455 100644 --- a/src/html/html_element.c +++ b/src/html/html_element.c @@ -18,7 +18,7 @@ #include "core/document.h" #include "utils/utils.h" -struct dom_html_element_vtable _dom_html_element_vtable = { +const struct dom_html_element_vtable _dom_html_element_vtable = { { { { @@ -31,7 +31,7 @@ struct dom_html_element_vtable _dom_html_element_vtable = { DOM_HTML_ELEMENT_VTABLE }; -static struct dom_element_protected_vtable _dom_html_element_protect_vtable = { +static const struct dom_element_protected_vtable _dom_html_element_protect_vtable = { { DOM_HTML_ELEMENT_PROTECT_VTABLE }, @@ -477,7 +477,7 @@ dom_exception dom_html_element_get_int32_t_property(dom_html_element *ele, char *s3 = _strndup(dom_string_data(s2), dom_string_byte_length(s2)); if (s3 != NULL) { - *value = strtoul(s3, NULL, 0); + *value = strtol(s3, NULL, 0); free(s3); } else { err = DOM_NO_MEM_ERR; @@ -518,7 +518,7 @@ dom_exception dom_html_element_set_int32_t_property(dom_html_element *ele, if (err != DOM_NO_ERR) goto fail; - if (snprintf(numbuffer, 32, "%u", value) == 32) + if (snprintf(numbuffer, 32, "%"PRIu32, value) == 32) numbuffer[31] = '\0'; err = dom_string_create((const uint8_t *) numbuffer, @@ -526,7 +526,7 @@ dom_exception dom_html_element_set_int32_t_property(dom_html_element *ele, if (err != DOM_NO_ERR) goto cleanup; - err = dom_element_set_attribute(ele, svalue, str); + err = dom_element_set_attribute(ele, str, svalue); dom_string_unref(svalue); cleanup: @@ -607,7 +607,7 @@ dom_exception dom_html_element_set_dom_ulong_property(dom_html_element *ele, if (err != DOM_NO_ERR) goto fail; - if (snprintf(numbuffer, 32, "%u", value) == 32) + if (snprintf(numbuffer, 32, "%"PRIu32, value) == 32) numbuffer[31] = '\0'; err = dom_string_create((const uint8_t *) numbuffer, @@ -615,7 +615,7 @@ dom_exception dom_html_element_set_dom_ulong_property(dom_html_element *ele, if (err != DOM_NO_ERR) goto cleanup; - err = dom_element_set_attribute(ele, svalue, str); + err = dom_element_set_attribute(ele, str, svalue); dom_string_unref(svalue); cleanup: diff --git a/src/html/html_element.h b/src/html/html_element.h index 0290569..87e1bbb 100644 --- a/src/html/html_element.h +++ b/src/html/html_element.h @@ -162,7 +162,7 @@ dom_exception _dom_html_element_copy_internal(dom_html_element *old, #define dom_html_element_copy_internal(o, n) _dom_html_element_copy_internal( \ (dom_html_element *) (o), (dom_html_element *) (n)) -extern struct dom_html_element_vtable _dom_html_element_vtable; +extern const struct dom_html_element_vtable _dom_html_element_vtable; #endif diff --git a/src/html/html_fieldset_element.c b/src/html/html_fieldset_element.c index c869822..2ab8dd0 100644 --- a/src/html/html_fieldset_element.c +++ b/src/html/html_fieldset_element.c @@ -17,7 +17,7 @@ #include "core/node.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_FIELDSET_ELEMENT }, @@ -170,7 +170,7 @@ dom_exception dom_html_field_set_element_get_form( } if (form_tmp != NULL) { - *form = (dom_html_form_element *) form_tmp; + *form = (dom_html_form_element *) dom_node_ref(form_tmp); return DOM_NO_ERR; } diff --git a/src/html/html_font_element.c b/src/html/html_font_element.c index ecedfb0..38f8869 100644 --- a/src/html/html_font_element.c +++ b/src/html/html_font_element.c @@ -17,7 +17,7 @@ #include "core/attr.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_FONT_ELEMENT }, diff --git a/src/html/html_form_element.c b/src/html/html_form_element.c index 1dd1992..5ba8365 100644 --- a/src/html/html_form_element.c +++ b/src/html/html_form_element.c @@ -22,7 +22,7 @@ #include "core/node.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_FORM_ELEMENT }, diff --git a/src/html/html_frame_element.c b/src/html/html_frame_element.c index fe6859c..321cff9 100644 --- a/src/html/html_frame_element.c +++ b/src/html/html_frame_element.c @@ -17,7 +17,7 @@ #include "core/attr.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_FRAME_ELEMENT }, diff --git a/src/html/html_frameset_element.c b/src/html/html_frameset_element.c index be44d5d..84a52b0 100644 --- a/src/html/html_frameset_element.c +++ b/src/html/html_frameset_element.c @@ -17,7 +17,7 @@ #include "core/attr.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_FRAME_SET_ELEMENT }, diff --git a/src/html/html_head_element.c b/src/html/html_head_element.c index ff02b1f..20f6aa8 100644 --- a/src/html/html_head_element.c +++ b/src/html/html_head_element.c @@ -13,7 +13,7 @@ #include "core/node.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_HEAD_ELEMENT }, diff --git a/src/html/html_heading_element.c b/src/html/html_heading_element.c index 8ab2c5a..21e36c6 100644 --- a/src/html/html_heading_element.c +++ b/src/html/html_heading_element.c @@ -17,7 +17,7 @@ #include "core/attr.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_HEADING_ELEMENT }, diff --git a/src/html/html_hr_element.c b/src/html/html_hr_element.c index e6086f5..8ca9743 100644 --- a/src/html/html_hr_element.c +++ b/src/html/html_hr_element.c @@ -17,7 +17,7 @@ #include "core/attr.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_HR_ELEMENT }, diff --git a/src/html/html_html_element.c b/src/html/html_html_element.c index 9cdcd5e..24f35e4 100644 --- a/src/html/html_html_element.c +++ b/src/html/html_html_element.c @@ -13,7 +13,7 @@ #include "core/node.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_HTML_ELEMENT }, diff --git a/src/html/html_iframe_element.c b/src/html/html_iframe_element.c index 4d7272b..96397d0 100644 --- a/src/html/html_iframe_element.c +++ b/src/html/html_iframe_element.c @@ -17,7 +17,7 @@ #include "core/attr.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_IFRAME_ELEMENT }, diff --git a/src/html/html_image_element.c b/src/html/html_image_element.c index 3cdd15f..e5b9c7b 100644 --- a/src/html/html_image_element.c +++ b/src/html/html_image_element.c @@ -18,7 +18,7 @@ #include "core/attr.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_IMAGE_ELEMENT }, diff --git a/src/html/html_input_element.c b/src/html/html_input_element.c index 079b55e..025ef5d 100644 --- a/src/html/html_input_element.c +++ b/src/html/html_input_element.c @@ -17,7 +17,7 @@ #include "core/attr.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_INPUT_ELEMENT }, diff --git a/src/html/html_isindex_element.c b/src/html/html_isindex_element.c index 40cb99c..e793fae 100644 --- a/src/html/html_isindex_element.c +++ b/src/html/html_isindex_element.c @@ -16,7 +16,7 @@ #include "core/attr.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_ISINDEX_ELEMENT }, diff --git a/src/html/html_label_element.c b/src/html/html_label_element.c index 3864cc4..c62adca 100644 --- a/src/html/html_label_element.c +++ b/src/html/html_label_element.c @@ -15,7 +15,7 @@ #include "core/node.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_LABEL_ELEMENT }, @@ -167,7 +167,7 @@ dom_exception dom_html_label_element_get_form( } if (form_tmp != NULL) { - *form = (dom_html_form_element *) form_tmp; + *form = (dom_html_form_element *) dom_node_ref(form_tmp); return DOM_NO_ERR; } diff --git a/src/html/html_legend_element.c b/src/html/html_legend_element.c index efb712b..f4200c8 100644 --- a/src/html/html_legend_element.c +++ b/src/html/html_legend_element.c @@ -19,7 +19,7 @@ #include "core/attr.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_LEGEND_ELEMENT }, diff --git a/src/html/html_li_element.c b/src/html/html_li_element.c index 84becf9..6856046 100644 --- a/src/html/html_li_element.c +++ b/src/html/html_li_element.c @@ -17,7 +17,7 @@ #include "core/attr.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_LI_ELEMENT }, diff --git a/src/html/html_link_element.c b/src/html/html_link_element.c index 87fe980..4916883 100644 --- a/src/html/html_link_element.c +++ b/src/html/html_link_element.c @@ -15,7 +15,7 @@ #include "core/attr.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_LINK_ELEMENT }, diff --git a/src/html/html_map_element.c b/src/html/html_map_element.c index 3b10222..865d9b6 100644 --- a/src/html/html_map_element.c +++ b/src/html/html_map_element.c @@ -19,7 +19,7 @@ #include "core/attr.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_MAP_ELEMENT }, diff --git a/src/html/html_menu_element.c b/src/html/html_menu_element.c index 09eadb6..882f1f2 100644 --- a/src/html/html_menu_element.c +++ b/src/html/html_menu_element.c @@ -17,7 +17,7 @@ #include "core/attr.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_MENU_ELEMENT }, diff --git a/src/html/html_meta_element.c b/src/html/html_meta_element.c index 4098daf..39fd9e1 100644 --- a/src/html/html_meta_element.c +++ b/src/html/html_meta_element.c @@ -13,7 +13,7 @@ #include "core/node.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_META_ELEMENT }, diff --git a/src/html/html_mod_element.c b/src/html/html_mod_element.c index 20cb042..4f3331c 100644 --- a/src/html/html_mod_element.c +++ b/src/html/html_mod_element.c @@ -17,7 +17,7 @@ #include "core/attr.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_MOD_ELEMENT }, diff --git a/src/html/html_object_element.c b/src/html/html_object_element.c index e926aef..1359ede 100644 --- a/src/html/html_object_element.c +++ b/src/html/html_object_element.c @@ -20,7 +20,7 @@ #include "core/attr.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_OBJECT_ELEMENT }, @@ -274,7 +274,7 @@ dom_exception dom_html_object_element_get_form( } if (form_tmp != NULL) { - *form = (dom_html_form_element *) form_tmp; + *form = (dom_html_form_element *) dom_node_ref(form_tmp); return DOM_NO_ERR; } diff --git a/src/html/html_olist_element.c b/src/html/html_olist_element.c index c89d11f..415b656 100644 --- a/src/html/html_olist_element.c +++ b/src/html/html_olist_element.c @@ -17,7 +17,7 @@ #include "core/attr.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_OLIST_ELEMENT }, diff --git a/src/html/html_opt_group_element.c b/src/html/html_opt_group_element.c index 6af0a29..a50e3de 100644 --- a/src/html/html_opt_group_element.c +++ b/src/html/html_opt_group_element.c @@ -17,7 +17,7 @@ #include "core/attr.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_OPT_GROUP_ELEMENT }, diff --git a/src/html/html_paragraph_element.c b/src/html/html_paragraph_element.c index 2b2f420..3c8f384 100644 --- a/src/html/html_paragraph_element.c +++ b/src/html/html_paragraph_element.c @@ -17,7 +17,7 @@ #include "core/attr.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_P_ELEMENT }, diff --git a/src/html/html_param_element.c b/src/html/html_param_element.c index c75e1ce..2c991ac 100644 --- a/src/html/html_param_element.c +++ b/src/html/html_param_element.c @@ -17,7 +17,7 @@ #include "core/attr.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_PARAM_ELEMENT }, diff --git a/src/html/html_pre_element.c b/src/html/html_pre_element.c index 64c8c3d..7582fde 100644 --- a/src/html/html_pre_element.c +++ b/src/html/html_pre_element.c @@ -17,7 +17,7 @@ #include "core/attr.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_PRE_ELEMENT }, diff --git a/src/html/html_quote_element.c b/src/html/html_quote_element.c index cf3e0c5..f1bc06f 100644 --- a/src/html/html_quote_element.c +++ b/src/html/html_quote_element.c @@ -17,7 +17,7 @@ #include "core/attr.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_QUOTE_ELEMENT }, diff --git a/src/html/html_script_element.c b/src/html/html_script_element.c index d20d727..9acbf29 100644 --- a/src/html/html_script_element.c +++ b/src/html/html_script_element.c @@ -17,7 +17,7 @@ #include "core/attr.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_SCRIPT_ELEMENT }, @@ -60,6 +60,8 @@ dom_exception _dom_html_script_element_initialise( struct dom_html_element_create_params *params, struct dom_html_script_element *ele) { + ele->flags = DOM_HTML_SCRIPT_ELEMENT_FLAG_NON_BLOCKING; + return _dom_html_element_initialise(params, &ele->base); } @@ -273,3 +275,40 @@ dom_exception dom_html_script_element_set_text( { return _dom_node_set_text_content((dom_node_internal *)ele, text); } + +/** + * Read the internal node flags + * + * \param ele The dom_html_script_element object + * \param flags Where to fill out the flags + * \return DOM_NO_ERR on success + */ +dom_exception dom_html_script_element_get_flags( + dom_html_script_element *ele, + dom_html_script_element_flags *flags) +{ + assert(flags != NULL); + assert(ele != NULL); + + *flags = ele->flags; + + return DOM_NO_ERR; +} + +/** + * Set the internal node flags + * + * \param ele The dom_html_script_element object + * \param flags The flags to retain + * \return DOM_NO_ERR on success + */ +dom_exception dom_html_script_element_set_flags( + dom_html_script_element *ele, + dom_html_script_element_flags flags) +{ + assert(ele != NULL); + + ele->flags = flags; + + return DOM_NO_ERR; +} diff --git a/src/html/html_script_element.h b/src/html/html_script_element.h index 9b1d704..1b34f6a 100644 --- a/src/html/html_script_element.h +++ b/src/html/html_script_element.h @@ -16,6 +16,7 @@ struct dom_html_script_element { struct dom_html_element base; /**< The base class */ + dom_html_script_element_flags flags; }; /* Create a dom_html_script_element object */ diff --git a/src/html/html_select_element.c b/src/html/html_select_element.c index ff549b2..8ba78f1 100644 --- a/src/html/html_select_element.c +++ b/src/html/html_select_element.c @@ -17,7 +17,7 @@ #include "core/node.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_SELECT_ELEMENT }, @@ -213,6 +213,9 @@ dom_exception dom_html_select_element_get_selected_index( 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_get_length(col, &len); if (err != DOM_NO_ERR) { @@ -266,6 +269,9 @@ dom_exception dom_html_select_element_set_selected_index( 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); diff --git a/src/html/html_style_element.c b/src/html/html_style_element.c index ae845be..4e4974f 100644 --- a/src/html/html_style_element.c +++ b/src/html/html_style_element.c @@ -13,7 +13,7 @@ #include "core/node.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_STYLE_ELEMENT }, diff --git a/src/html/html_table_element.c b/src/html/html_table_element.c index 7e8a508..010a6cd 100644 --- a/src/html/html_table_element.c +++ b/src/html/html_table_element.c @@ -21,7 +21,7 @@ #include "core/attr.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_TABLE_ELEMENT }, @@ -726,6 +726,7 @@ static dom_exception dom_html_table_element_create_t_body( dom_html_collection_unref(t_bodies); return exp; } + /** * Insert a new Row into the table * @@ -736,7 +737,7 @@ static dom_exception dom_html_table_element_create_t_body( dom_exception dom_html_table_element_insert_row( dom_html_table_element *element, int32_t index, - dom_html_element **row) + dom_html_element **row_out) { dom_exception exp; dom_html_collection* rows; @@ -744,31 +745,13 @@ dom_exception dom_html_table_element_insert_row( dom_html_document *doc = (dom_html_document *) ((dom_node_internal *) element)->owner; - struct dom_html_element_create_params params = { - .type = DOM_HTML_ELEMENT_TYPE_TR, - .doc = doc, - .name = doc->elements[DOM_HTML_ELEMENT_TYPE_TR], - .namespace = ((dom_node_internal *)element)->namespace, - .prefix = ((dom_node_internal *)element)->prefix - }; - - exp = dom_html_table_element_get_rows(element, - &rows); + 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(¶ms, - (dom_html_table_row_element **)row); + exp = dom_html_collection_get_length(rows, &len); + dom_html_collection_unref(rows); if(exp != DOM_NO_ERR) { - dom_node_unref(*row); - dom_html_collection_unref(rows); return exp; } @@ -776,25 +759,40 @@ dom_exception dom_html_table_element_insert_row( exp = DOM_INDEX_SIZE_ERR; } else if(len == 0) { dom_html_table_section_element *new_body; + dom_html_table_row_element *row; dom_node *new_row; - exp = dom_html_table_element_create_t_body(element, - &new_body); + + struct dom_html_element_create_params params = { + .type = DOM_HTML_ELEMENT_TYPE_TR, + .doc = doc, + .name = doc->elements[DOM_HTML_ELEMENT_TYPE_TR], + .namespace = ((dom_node_internal *)element)->namespace, + .prefix = ((dom_node_internal *)element)->prefix + }; + + exp = _dom_html_table_row_element_create(¶ms, &row); if(exp != DOM_NO_ERR) { - dom_html_collection_unref(rows); - dom_node_unref(new_body); return exp; } - exp = dom_node_append_child(new_body, *row, + exp = dom_html_table_element_create_t_body(element, &new_body); + if(exp != DOM_NO_ERR) { + dom_node_unref(row); + return exp; + } + + exp = dom_node_append_child(new_body, (dom_html_element *) row, &new_row); + dom_node_unref(new_body); + dom_node_unref(row); if(exp == DOM_NO_ERR) { - dom_node_unref(*row); - *row = (dom_html_element *)new_row; + *row_out = (dom_html_element *)new_row; } } else { uint32_t window_len = 0, section_len; dom_html_table_section_element *t_head; dom_html_table_section_element *t_foot; + dom_html_element *row; dom_node_internal *n; if(index ==-1) { @@ -802,83 +800,106 @@ dom_exception dom_html_table_element_insert_row( } exp = dom_html_table_element_get_t_head(element, &t_head); - if (exp != DOM_NO_ERR) + 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); + dom_node_unref(t_head); return exp; } - dom_html_collection_get_length(rows, §ion_len); + exp = dom_html_collection_get_length(rows, §ion_len); + dom_html_collection_unref(rows); if(exp != DOM_NO_ERR) { - dom_html_collection_unref(rows); + dom_node_unref(t_head); 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); + exp = dom_html_table_section_element_insert_row(t_head, + index-window_len, &row); + dom_node_unref(t_head); + if (exp == DOM_NO_ERR) { + *row_out = row; + } + return exp; } + dom_node_unref(t_head); window_len += section_len; 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->elements[DOM_HTML_ELEMENT_TYPE_TBODY], n->name)) { - exp = 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) { + 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( + exp = dom_html_table_section_element_insert_row( (dom_html_table_section_element *)n, - index-window_len, row); + index-window_len, &row); + if (exp == DOM_NO_ERR) { + *row_out = row; + } + return exp; } window_len += section_len; } } exp = dom_html_table_element_get_t_foot(element, &t_foot); - if(exp != DOM_NO_ERR) + 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); + dom_node_unref(t_foot); return exp; } exp = dom_html_collection_get_length(rows, §ion_len); - dom_html_collection_unref(rows); - - if(exp != DOM_NO_ERR) + if(exp != DOM_NO_ERR) { + dom_node_unref(t_foot); 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); + exp = dom_html_table_section_element_insert_row(t_foot, + index-window_len, &row); + dom_node_unref(t_foot); + if (exp == DOM_NO_ERR) { + *row_out = row; + } + return exp; } + dom_node_unref(t_foot); exp = DOM_INDEX_SIZE_ERR; } - dom_html_collection_unref(rows); + return exp; } + /** * Delete the table Head, if one exists * @@ -895,22 +916,17 @@ dom_exception dom_html_table_element_delete_row( dom_html_document *doc = (dom_html_document *) ((dom_node_internal *) element)->owner; - exp = dom_html_table_element_get_rows(element, - &rows); + 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); - + exp = dom_html_collection_get_length(rows, &len); + dom_html_collection_unref(rows); 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 { uint32_t window_len = 0, section_len; @@ -922,28 +938,31 @@ dom_exception dom_html_table_element_delete_row( index = (int32_t)len-1; } - dom_html_collection_unref(rows); - 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); + dom_node_unref(t_head); return DOM_NO_ERR; } exp = dom_html_collection_get_length(rows, §ion_len); - dom_html_collection_unref(rows); - if(exp != DOM_NO_ERR) + if(exp != DOM_NO_ERR) { + dom_node_unref(t_head); return exp; + } if(window_len + section_len > (uint32_t)index) { - return dom_html_table_section_element_delete_row(t_head, + exp = dom_html_table_section_element_delete_row(t_head, index-window_len); + dom_node_unref(t_head); + return exp; } + dom_node_unref(t_head); + window_len += section_len; n = (dom_node_internal *)element; @@ -952,10 +971,10 @@ dom_exception dom_html_table_element_delete_row( dom_string_caseless_isequal( doc->elements[DOM_HTML_ELEMENT_TYPE_TBODY], n->name)) { - exp = 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; } @@ -973,19 +992,26 @@ dom_exception dom_html_table_element_delete_row( } } 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); + dom_node_unref(t_foot); return exp; } exp = dom_html_collection_get_length(rows, §ion_len); dom_html_collection_unref(rows); - if (exp != DOM_NO_ERR) + if (exp != DOM_NO_ERR) { + dom_node_unref(t_foot); return exp; + } if(window_len + section_len > (uint32_t)index) { - return dom_html_table_section_element_delete_row(t_foot, + exp = dom_html_table_section_element_delete_row(t_foot, index-window_len); + dom_node_unref(t_foot); + return exp; } return DOM_INDEX_SIZE_ERR; } diff --git a/src/html/html_tablecaption_element.c b/src/html/html_tablecaption_element.c index cae229c..0e55e3a 100644 --- a/src/html/html_tablecaption_element.c +++ b/src/html/html_tablecaption_element.c @@ -17,7 +17,7 @@ #include "core/attr.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_TABLE_CAPTION_ELEMENT }, diff --git a/src/html/html_tablecell_element.c b/src/html/html_tablecell_element.c index 7a1f968..2fc31c8 100644 --- a/src/html/html_tablecell_element.c +++ b/src/html/html_tablecell_element.c @@ -18,7 +18,7 @@ #include "core/attr.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_TABLE_CELL_ELEMENT }, diff --git a/src/html/html_tablecol_element.c b/src/html/html_tablecol_element.c index 74169be..56bcd64 100644 --- a/src/html/html_tablecol_element.c +++ b/src/html/html_tablecol_element.c @@ -17,7 +17,7 @@ #include "core/attr.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_TABLE_COL_ELEMENT }, diff --git a/src/html/html_tablerow_element.c b/src/html/html_tablerow_element.c index b722d0d..1a6069b 100644 --- a/src/html/html_tablerow_element.c +++ b/src/html/html_tablerow_element.c @@ -20,7 +20,7 @@ #include "core/attr.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_TABLE_ROW_ELEMENT }, @@ -244,18 +244,17 @@ dom_exception dom_html_table_row_element_get_row_index( return exp; } - exp = dom_html_table_section_element_get_rows(t_head, - &rows); - if (exp != DOM_NO_ERR) { + if (t_head != NULL) { + exp = dom_html_table_section_element_get_rows(t_head, &rows); dom_node_unref(t_head); - return exp; - } - - dom_html_collection_get_length(rows, - &len); - dom_html_collection_unref(rows); + if (exp != DOM_NO_ERR) { + return exp; + } - count += len; + dom_html_collection_get_length(rows, &len); + dom_html_collection_unref(rows); + count += len; + } for (n = n->first_child;n != parent && n != NULL; n = n->next) { @@ -356,7 +355,7 @@ dom_exception dom_html_table_row_element_insert_cell( int32_t index, dom_html_element **cell) { dom_html_document *doc = (dom_html_document *) ((dom_node_internal *) element)->owner; - dom_node *node; /*< The node at the (index)th position*/ + dom_html_element *new_cell; dom_html_collection *cells; /*< The collection of cells in input table_row_element*/ uint32_t len; /*< The size of the cell collection */ @@ -370,42 +369,45 @@ dom_exception dom_html_table_row_element_insert_cell( .prefix = ((dom_node_internal *)element)->prefix }; - exp = _dom_html_element_create(¶ms, cell); + exp = _dom_html_element_create(¶ms, &new_cell); if (exp != DOM_NO_ERR) return exp; exp = dom_html_table_row_element_get_cells(element, &cells); if (exp != DOM_NO_ERR) { - dom_node_unref(*cell); + dom_node_unref(new_cell); return exp; } exp = dom_html_collection_get_length(cells, &len); if (exp != DOM_NO_ERR) { - dom_node_unref(*cell); + dom_node_unref(new_cell); + dom_html_collection_unref(cells); return exp; } if (index < -1 || index > (int32_t)len) { /* Check for index validity */ + dom_node_unref(new_cell); dom_html_collection_unref (cells); return DOM_INDEX_SIZE_ERR; } else if (index == -1 || index == (int32_t)len) { - dom_node *new_cell; dom_html_collection_unref(cells); - return dom_node_append_child(element, - *cell, - &new_cell); + exp = dom_node_append_child(element, new_cell, cell); + dom_node_unref(new_cell); + } else { - dom_node *new_cell; - dom_html_collection_item(cells, - index, &node); + dom_node *node; + dom_html_collection_item(cells, index, &node); dom_html_collection_unref(cells); - return dom_node_insert_before(element, - *cell, node, &new_cell); + exp = dom_node_insert_before(element, new_cell, node, cell); + dom_node_unref(new_cell); + dom_node_unref(node); } + + return exp; } /** diff --git a/src/html/html_tablesection_element.c b/src/html/html_tablesection_element.c index 1ffe102..dee5ae5 100644 --- a/src/html/html_tablesection_element.c +++ b/src/html/html_tablesection_element.c @@ -21,7 +21,7 @@ #include "core/attr.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_TABLE_SECTION_ELEMENT }, @@ -229,14 +229,13 @@ dom_exception dom_html_table_section_element_get_rows( */ dom_exception dom_html_table_section_element_insert_row( dom_html_table_section_element *element, - int32_t index, dom_html_element **new_row) { + int32_t index, dom_html_element **new_row) +{ dom_html_document *doc = (dom_html_document *) ((dom_node_internal *) element)->owner; - - dom_node *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; /*< Variable for getting the exceptions*/ + dom_node *new_node; struct dom_html_element_create_params params = { .type = DOM_HTML_ELEMENT_TYPE_TR, @@ -247,48 +246,45 @@ dom_exception dom_html_table_section_element_insert_row( }; exp = _dom_html_table_row_element_create(¶ms, - (dom_html_table_row_element **)new_row); + (dom_html_table_row_element **)(void *) &new_node); if(exp != DOM_NO_ERR) return exp; exp = dom_html_table_section_element_get_rows(element, &rows); if(exp != DOM_NO_ERR) { - dom_node_unref(new_row); - new_row = NULL; + dom_node_unref(new_node); return exp; } exp = dom_html_collection_get_length(rows, &len); - - - if(exp != DOM_NO_ERR) { - dom_node_unref(new_row); - new_row = NULL; + if (exp != DOM_NO_ERR) { + dom_node_unref(new_node); dom_html_collection_unref(rows); return exp; } - if(index < -1 || index > (int32_t)len) { + if (index < -1 || index > (int32_t)len) { /* Check for index validity */ dom_html_collection_unref(rows); + dom_node_unref(new_node); return DOM_INDEX_SIZE_ERR; - } else if(index == -1 || index == (int32_t)len) { - dom_node *new_node; + + } else if (index == -1 || index == (int32_t)len) { dom_html_collection_unref(rows); - return dom_node_append_child(element, - *new_row, - &new_node); + exp = dom_node_append_child(element, new_node, new_row); } else { - dom_node *new_node; - - dom_html_collection_item(rows, - index, &node); + dom_node *node; + dom_html_collection_item(rows, index, &node); dom_html_collection_unref(rows); - return dom_node_insert_before(element, - *new_row, node, - &new_node); + exp = dom_node_insert_before(element, + new_node, node, new_row); + dom_node_unref(node); } + + dom_node_unref(new_node); + + return exp; } /** diff --git a/src/html/html_text_area_element.c b/src/html/html_text_area_element.c index 6117e83..db351bc 100644 --- a/src/html/html_text_area_element.c +++ b/src/html/html_text_area_element.c @@ -17,7 +17,7 @@ #include "core/attr.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_TEXT_AREA_ELEMENT }, @@ -273,7 +273,7 @@ dom_exception dom_html_text_area_element_set_value( if (ele->value != NULL) dom_string_ref(ele->value); - return DOM_NO_ERR; + return dom_node_set_text_content((dom_node *)ele, ele->value); } /*------------------------------------------------------------------------*/ diff --git a/src/html/html_title_element.c b/src/html/html_title_element.c index 39e898a..f727dfa 100644 --- a/src/html/html_title_element.c +++ b/src/html/html_title_element.c @@ -17,7 +17,7 @@ #include "core/node.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_TITLE_ELEMENT }, @@ -157,15 +157,7 @@ dom_exception _dom_html_title_element_copy_internal( dom_exception dom_html_title_element_get_text(dom_html_title_element *ele, dom_string **text) { - dom_node_internal *node = (dom_node_internal *) ele; - dom_node_internal *n = node->first_child; - - /* There should be only one child of title element */ - assert(node->first_child == node->last_child); - /* And it should be a text node */ - assert(n->type == DOM_TEXT_NODE); - - return dom_characterdata_get_data(n, text); + return dom_node_get_text_content(ele, text); } /** @@ -178,14 +170,6 @@ dom_exception dom_html_title_element_get_text(dom_html_title_element *ele, dom_exception dom_html_title_element_set_text(dom_html_title_element *ele, dom_string *text) { - dom_node_internal *node = (dom_node_internal *) ele; - dom_node_internal *n = node->first_child; - - /* There should be only one child of title element */ - assert(node->first_child == node->last_child); - /* And it should be a text node */ - assert(n->type == DOM_TEXT_NODE); - - return dom_characterdata_set_data(n, text); + return dom_node_set_text_content(ele, text); } diff --git a/src/html/html_ulist_element.c b/src/html/html_ulist_element.c index f2b87fb..48cb0c2 100644 --- a/src/html/html_ulist_element.c +++ b/src/html/html_ulist_element.c @@ -17,7 +17,7 @@ #include "core/attr.h" #include "utils/utils.h" -static struct dom_element_protected_vtable _protect_vtable = { +static const struct dom_element_protected_vtable _protect_vtable = { { DOM_NODE_PROTECT_VTABLE_HTML_U_LIST_ELEMENT }, |