summaryrefslogtreecommitdiff
path: root/src/html/html_document.c
diff options
context:
space:
mode:
authorDaniel Silverstone <dsilvers@digital-scurf.org>2014-07-18 13:33:23 +0100
committerDaniel Silverstone <dsilvers@digital-scurf.org>2014-07-18 13:33:23 +0100
commit9aae1b6cc3ec89c96f0cdcc173405eef1d5b1c2c (patch)
treea620d0d2f56db44778157ac7925b2b8fa9899e5b /src/html/html_document.c
parentdb5517f4e24d0e7c39a405ce1b363c887196784a (diff)
parentd293e6e7ffdc9224ffba9593f4cc8f73701f2cd5 (diff)
downloadlibdom-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.c384
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;
}