diff options
author | Daniel Silverstone <dsilvers@digital-scurf.org> | 2014-07-18 13:33:23 +0100 |
---|---|---|
committer | Daniel Silverstone <dsilvers@digital-scurf.org> | 2014-07-18 13:33:23 +0100 |
commit | 9aae1b6cc3ec89c96f0cdcc173405eef1d5b1c2c (patch) | |
tree | a620d0d2f56db44778157ac7925b2b8fa9899e5b /src/html/html_document.c | |
parent | db5517f4e24d0e7c39a405ce1b363c887196784a (diff) | |
parent | d293e6e7ffdc9224ffba9593f4cc8f73701f2cd5 (diff) | |
download | libdom-9aae1b6cc3ec89c96f0cdcc173405eef1d5b1c2c.tar.gz libdom-9aae1b6cc3ec89c96f0cdcc173405eef1d5b1c2c.tar.bz2 |
Merge remote-tracking branch 'origin/rupindersingh/libdom_recovered'
Reviewed-By: Daniel Silverstone <dsilvers@netsurf-browser.org>
Diffstat (limited to 'src/html/html_document.c')
-rw-r--r-- | src/html/html_document.c | 384 |
1 files changed, 356 insertions, 28 deletions
diff --git a/src/html/html_document.c b/src/html/html_document.c index 0da16bb..6adfedd 100644 --- a/src/html/html_document.c +++ b/src/html/html_document.c @@ -25,6 +25,42 @@ #include "html/html_option_element.h" #include "html/html_select_element.h" #include "html/html_hr_element.h" +#include "html/html_dlist_element.h" +#include "html/html_directory_element.h" +#include "html/html_menu_element.h" +#include "html/html_fieldset_element.h" +#include "html/html_legend_element.h" +#include "html/html_paragraph_element.h" +#include "html/html_heading_element.h" +#include "html/html_quote_element.h" +#include "html/html_pre_element.h" +#include "html/html_br_element.h" +#include "html/html_label_element.h" +#include "html/html_ulist_element.h" +#include "html/html_olist_element.h" +#include "html/html_li_element.h" +#include "html/html_font_element.h" +#include "html/html_mod_element.h" +#include "html/html_anchor_element.h" +#include "html/html_basefont_element.h" +#include "html/html_image_element.h" +#include "html/html_object_element.h" +#include "html/html_param_element.h" +#include "html/html_applet_element.h" +#include "html/html_map_element.h" +#include "html/html_area_element.h" +#include "html/html_script_element.h" +#include "html/html_tablecaption_element.h" +#include "html/html_tablecell_element.h" +#include "html/html_tablecol_element.h" +#include "html/html_tablesection_element.h" +#include "html/html_table_element.h" +#include "html/html_tablerow_element.h" +#include "html/html_style_element.h" +#include "html/html_frameset_element.h" +#include "html/html_frame_element.h" +#include "html/html_iframe_element.h" +#include "html/html_isindex_element.h" #include "core/attr.h" #include "core/string.h" @@ -91,16 +127,17 @@ dom_exception _dom_html_document_initialise(dom_html_document *doc, doc->domain = NULL; doc->url = NULL; doc->cookie = NULL; - + doc->body = NULL; + doc->memoised = calloc(sizeof(dom_string *), hds_COUNT); if (doc->memoised == NULL) { error = DOM_NO_MEM_ERR; goto out; } - + #define HTML_DOCUMENT_STRINGS_ACTION(attr,str) \ error = dom_string_create_interned((const uint8_t *) #str, \ - SLEN(#str), &doc->memoised[hds_##attr]); \ + SLEN(#str), &doc->memoised[hds_##attr]); \ if (error != DOM_NO_ERR) { \ goto out; \ } @@ -224,6 +261,127 @@ _dom_html_document_create_element_internal(dom_html_document *html, } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_HR])) { exc = _dom_html_hr_element_create(html, namespace, prefix, (dom_html_hr_element **) result); + } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_DL])) { + exc = _dom_html_d_list_element_create(html, namespace, prefix, + (dom_html_d_list_element **) result); + } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_DIRECTORY])) { + exc = _dom_html_directory_element_create(html, namespace, prefix, + (dom_html_directory_element **) result); + } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_MENU])) { + exc = _dom_html_menu_element_create(html, namespace, prefix, + (dom_html_menu_element **) result); + } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_FIELDSET])) { + exc = _dom_html_field_set_element_create(html, namespace, prefix, + (dom_html_field_set_element **) result); + } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_LEGEND])) { + exc = _dom_html_legend_element_create(html, namespace, prefix, + (dom_html_legend_element **) result); + } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_P])) { + exc = _dom_html_paragraph_element_create(html, namespace, prefix, + (dom_html_paragraph_element **) result); + } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_H1]) || + dom_string_caseless_isequal(tag_name, html->memoised[hds_H2]) || + dom_string_caseless_isequal(tag_name, html->memoised[hds_H3]) || + dom_string_caseless_isequal(tag_name, html->memoised[hds_H4]) || + dom_string_caseless_isequal(tag_name, html->memoised[hds_H5]) || + dom_string_caseless_isequal(tag_name, html->memoised[hds_H6]) + ) { + exc = _dom_html_heading_element_create(html, tag_name, namespace, prefix, + (dom_html_heading_element **) result); + } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_Q])) { + exc = _dom_html_quote_element_create(html, namespace, prefix, + (dom_html_quote_element **) result); + } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_PRE])) { + exc = _dom_html_pre_element_create(html, namespace, prefix, + (dom_html_pre_element **) result); + } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_BR])) { + exc = _dom_html_br_element_create(html, namespace, prefix, + (dom_html_br_element **) result); + } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_LABEL])) { + exc = _dom_html_label_element_create(html, namespace, prefix, + (dom_html_label_element **) result); + } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_UL])) { + exc = _dom_html_u_list_element_create(html, namespace, prefix, + (dom_html_u_list_element **) result); + } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_OL])) { + exc = _dom_html_o_list_element_create(html, namespace, prefix, + (dom_html_o_list_element **) result); + } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_LI])) { + exc = _dom_html_li_element_create(html, namespace, prefix, + (dom_html_li_element **) result); + } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_FONT])) { + exc = _dom_html_font_element_create(html, namespace, prefix, + (dom_html_font_element **) result); + } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_DEL]) || + dom_string_caseless_isequal(tag_name, html->memoised[hds_INS])) { + exc = _dom_html_mod_element_create(html, tag_name, namespace, + prefix, (dom_html_mod_element **) result); + } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_A])) { + exc = _dom_html_anchor_element_create(html, namespace, prefix, + (dom_html_anchor_element **) result); + } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_BASEFONT])) { + exc = _dom_html_base_font_element_create(html, namespace, prefix, + (dom_html_base_font_element **) result); + } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_IMG])) { + exc = _dom_html_image_element_create(html, namespace, prefix, + (dom_html_image_element **) result); + } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_OBJECT])) { + exc = _dom_html_object_element_create(html, namespace, prefix, + (dom_html_object_element **) result); + } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_PARAM])) { + exc = _dom_html_param_element_create(html, namespace, prefix, + (dom_html_param_element **) result); + } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_APPLET])) { + exc = _dom_html_applet_element_create(html, namespace, prefix, + (dom_html_applet_element **) result); + } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_MAP])) { + exc = _dom_html_map_element_create(html, namespace, prefix, + (dom_html_map_element **) result); + } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_AREA])) { + exc = _dom_html_area_element_create(html, namespace, prefix, + (dom_html_area_element **) result); + } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_SCRIPT])) { + exc = _dom_html_script_element_create(html, namespace, prefix, + (dom_html_script_element **) result); + } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_CAPTION])) { + exc = _dom_html_table_caption_element_create(html, namespace, prefix, + (dom_html_table_caption_element **) result); + } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_TD]) || + dom_string_caseless_isequal(tag_name, html->memoised[hds_TH]) + ) { + exc = _dom_html_table_cell_element_create(html, tag_name, namespace, prefix, + (dom_html_table_cell_element **) result); + } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_COL])|| + dom_string_caseless_isequal(tag_name, html->memoised[hds_COLGROUP]) + ) { + exc = _dom_html_table_col_element_create(html, tag_name, namespace, prefix, + (dom_html_table_col_element **) result); + } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_THEAD])|| + dom_string_caseless_isequal(tag_name, html->memoised[hds_TBODY])|| + dom_string_caseless_isequal(tag_name, html->memoised[hds_TFOOT])) { + exc = _dom_html_table_section_element_create(html, tag_name, namespace, prefix, + (dom_html_table_section_element **) result); + } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_TABLE])) { + exc = _dom_html_table_element_create(html, namespace, prefix, + (dom_html_table_element **) result); + } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_TD])) { + exc = _dom_html_table_row_element_create(html, namespace, prefix, + (dom_html_table_row_element **) result); + } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_STYLE])) { + exc = _dom_html_style_element_create(html, + (dom_html_style_element **) result); + } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_FRAMESET])) { + exc = _dom_html_frame_set_element_create(html, namespace, prefix, + (dom_html_frame_set_element **) result); + } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_FRAME])) { + exc = _dom_html_frame_element_create(html, namespace, prefix, + (dom_html_frame_element **) result); + } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_IFRAME])) { + exc = _dom_html_iframe_element_create(html, namespace, prefix, + (dom_html_iframe_element **) result); + } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_ISINDEX])) { + exc = _dom_html_isindex_element_create(html, namespace, prefix, + (dom_html_isindex_element **) result); } else { exc = _dom_html_element_create(html, tag_name, namespace, prefix, result); @@ -486,57 +644,193 @@ dom_exception _dom_html_document_get_url(dom_html_document *doc, dom_exception _dom_html_document_get_body(dom_html_document *doc, struct dom_html_element **body) { - UNUSED(doc); - UNUSED(body); + dom_exception exc = DOM_NO_ERR; - return DOM_NOT_SUPPORTED_ERR; + if (doc->body != NULL) { + *body = doc->body; + } else { + dom_element *node; + dom_nodelist *nodes; + uint32_t len; + + exc = dom_document_get_elements_by_tag_name(doc, + doc->memoised[hds_BODY], + &nodes); + if (exc != DOM_NO_ERR) { + return exc; + } + + exc = dom_nodelist_get_length(nodes, &len); + if (exc != DOM_NO_ERR) { + dom_nodelist_unref(nodes); + return exc; + } + + if (len == 0) { + exc = dom_document_get_elements_by_tag_name(doc, + doc->memoised[hds_FRAMESET], + &nodes); + if (exc != DOM_NO_ERR) { + return exc; + } + exc = dom_nodelist_get_length(nodes, &len); + if (exc != DOM_NO_ERR) { + dom_nodelist_unref(nodes); + return exc; + } + if(len == 0) { + dom_nodelist_unref(nodes); + return DOM_NO_ERR; + } + } + + exc = dom_nodelist_item(nodes, 0, (void *) &node); + dom_nodelist_unref(nodes); + if (exc != DOM_NO_ERR) { + return exc; + } + + *body = (dom_html_element *)node; + dom_node_unref(node); + } + + return exc; } dom_exception _dom_html_document_set_body(dom_html_document *doc, struct dom_html_element *body) { - UNUSED(doc); - UNUSED(body); + doc->body = body; + return DOM_NO_ERR; +} - return DOM_NOT_SUPPORTED_ERR; +/** + * Callback for creating the images collection + * + * \param node The dom_node_internal object + * \param ctx The dom_html_document object (void *) + * \return DOM_NO_ERR on success, appropriate dom_exception on failure. + */ +bool images_callback(struct dom_node_internal *node, void *ctx) +{ + if(node->type == DOM_ELEMENT_NODE && + dom_string_caseless_isequal(node->name, + ((dom_html_document *)ctx)->memoised[hds_IMG])) { + return true; + } + return false; } dom_exception _dom_html_document_get_images(dom_html_document *doc, struct dom_html_collection **col) { - UNUSED(doc); - UNUSED(col); + dom_html_document *root; + dom_exception err; + err = dom_document_get_document_element(doc, &root); + if (err != DOM_NO_ERR) + return err; - return DOM_NOT_SUPPORTED_ERR; + return _dom_html_collection_create(doc, (dom_node_internal *) root, + images_callback, doc, col); +} + +bool applet_callback(struct dom_node_internal * node, void *ctx) +{ + if(node->type == DOM_ELEMENT_NODE && + dom_string_caseless_isequal(node->name, + ((dom_html_document *)ctx)->memoised[hds_APPLET])) { + return true; + } + return false; +} +/** + * Callback for creating the applets collection + * + * \param node The dom_node_internal object + * \param ctx The dom_html_document object (void *) + * \return DOM_NO_ERR on success, appropriate dom_exception on failure. + */ +bool applets_callback(struct dom_node_internal *node, void *ctx) +{ + if(node->type == DOM_ELEMENT_NODE && + dom_string_caseless_isequal(node->name, + ((dom_html_document *)ctx)->memoised[hds_OBJECT])) { + uint32_t len = 0; + dom_html_collection *applets; + _dom_html_collection_create(ctx, node, + applet_callback, ctx, &applets); + + dom_html_collection_get_length(applets, &len); + if(len != 0) + return true; + } + return false; } dom_exception _dom_html_document_get_applets(dom_html_document *doc, struct dom_html_collection **col) { - UNUSED(doc); - UNUSED(col); + dom_html_document *root; + dom_exception err; + err = dom_document_get_document_element(doc, &root); + if (err != DOM_NO_ERR) + return err; - return DOM_NOT_SUPPORTED_ERR; + return _dom_html_collection_create(doc, (dom_node_internal *) root, + applets_callback, doc, col); +} + +/** + * Callback for creating the links collection + * + * \param node The dom_node_internal object + * \param ctx The dom_html_document object (void *) + * \return DOM_NO_ERR on success, appropriate dom_exception on failure. + */ +bool links_callback(struct dom_node_internal *node, void *ctx) +{ + if(node->type == DOM_ELEMENT_NODE && + (dom_string_caseless_isequal(node->name, + ((dom_html_document *)ctx)->memoised[hds_A]) || + dom_string_caseless_isequal(node->name, + ((dom_html_document *)ctx)->memoised[hds_AREA])) + ) { + bool has_value = false; + dom_exception err; + + err = dom_element_has_attribute(node, + ((dom_html_document *)ctx)->memoised[hds_href], &has_value); + if(err !=DOM_NO_ERR) + return err; + + if(has_value) + return true; + } + return false; } dom_exception _dom_html_document_get_links(dom_html_document *doc, struct dom_html_collection **col) { - UNUSED(doc); - UNUSED(col); + dom_html_document *root; + dom_exception err; + err = dom_document_get_document_element(doc, &root); + if (err != DOM_NO_ERR) + return err; - return DOM_NOT_SUPPORTED_ERR; + return _dom_html_collection_create(doc, (dom_node_internal *) root, + links_callback, doc, col); } static bool __dom_html_document_node_is_form(dom_node_internal *node, - void *ctx) + void *ctx) { dom_html_document *doc = (dom_html_document *)node->owner; - + UNUSED(ctx); - + return dom_string_caseless_isequal(node->name, - doc->memoised[hds_FORM]); + doc->memoised[hds_FORM]); } dom_exception _dom_html_document_get_forms(dom_html_document *doc, @@ -564,13 +858,43 @@ dom_exception _dom_html_document_get_forms(dom_html_document *doc, return DOM_NO_ERR; } +/** + * Callback for creating the anchors collection + * + * \param node The dom_node_internal object + * \param ctx The dom_html_document object (void *) + * \return DOM_NO_ERR on success, appropriate dom_exception on failure. + */ +bool anchors_callback(struct dom_node_internal *node, void *ctx) +{ + if(node->type == DOM_ELEMENT_NODE && + dom_string_caseless_isequal(node->name, + ((dom_html_document *)ctx)->memoised[hds_A])) { + bool has_value = false; + dom_exception err; + + err = dom_element_has_attribute(node, + ((dom_html_document *)ctx)->memoised[hds_name], &has_value); + if(err !=DOM_NO_ERR) + return err; + + if(has_value) + return true; + } + return false; +} + dom_exception _dom_html_document_get_anchors(dom_html_document *doc, struct dom_html_collection **col) { - UNUSED(doc); - UNUSED(col); + dom_html_document *root; + dom_exception err; + err = dom_document_get_document_element(doc, &root); + if (err != DOM_NO_ERR) + return err; - return DOM_NOT_SUPPORTED_ERR; + return _dom_html_collection_create(doc, (dom_node_internal *) root, + anchors_callback, doc, col); } dom_exception _dom_html_document_get_cookie(dom_html_document *doc, @@ -578,7 +902,7 @@ dom_exception _dom_html_document_get_cookie(dom_html_document *doc, { UNUSED(doc); UNUSED(cookie); - + /*todo implement this after updating client interface */ return DOM_NOT_SUPPORTED_ERR; } @@ -588,6 +912,7 @@ dom_exception _dom_html_document_set_cookie(dom_html_document *doc, UNUSED(doc); UNUSED(cookie); + /*todo implement this after updating client interface */ return DOM_NOT_SUPPORTED_ERR; } @@ -595,13 +920,14 @@ dom_exception _dom_html_document_open(dom_html_document *doc) { UNUSED(doc); + /*todo implement this after updating client interface */ return DOM_NOT_SUPPORTED_ERR; } dom_exception _dom_html_document_close(dom_html_document *doc) { UNUSED(doc); - + /*todo implement this after updating client interface */ return DOM_NOT_SUPPORTED_ERR; } @@ -611,6 +937,7 @@ dom_exception _dom_html_document_write(dom_html_document *doc, UNUSED(doc); UNUSED(text); + /*todo implement this after updating client interface */ return DOM_NOT_SUPPORTED_ERR; } @@ -620,6 +947,7 @@ dom_exception _dom_html_document_writeln(dom_html_document *doc, UNUSED(doc); UNUSED(text); + /*todo implement this after _dom_html_document_write */ return DOM_NOT_SUPPORTED_ERR; } @@ -629,7 +957,7 @@ dom_exception _dom_html_document_get_elements_by_name(dom_html_document *doc, UNUSED(doc); UNUSED(name); UNUSED(list); - + /*todo implement after updating core nodelist interface */ return DOM_NOT_SUPPORTED_ERR; } |