From 1ab1ed7301d3885a00b3081b3bf7ccdeabd0466a Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Sun, 5 Feb 2012 21:01:43 +0000 Subject: Make HTMLDocument use dynamic dispatch like everything else. Fix variable misuse in HTMLDocument constructor. Overload Document.createElement and Document.createElementNS for HTMLDocuments Re-enable decision to create HTMLDocument instead of Document in DOMImplementation.createDocument svn path=/trunk/libdom/; revision=13425 --- src/html/html_document.c | 223 +++++++++++++++++++++++++++++++++++++++-------- src/html/html_document.h | 98 +++++++++++++++++++++ 2 files changed, 286 insertions(+), 35 deletions(-) (limited to 'src/html') diff --git a/src/html/html_document.c b/src/html/html_document.c index 673615e..52e0b9c 100644 --- a/src/html/html_document.c +++ b/src/html/html_document.c @@ -9,9 +9,12 @@ #include #include "html/html_document.h" +#include "html/html_element.h" #include "core/string.h" +#include "utils/namespace.h" #include "utils/utils.h" +#include "utils/validate.h" static struct dom_html_document_vtable html_document_vtable = { { @@ -21,8 +24,9 @@ static struct dom_html_document_vtable html_document_vtable = { }, DOM_NODE_VTABLE, }, - DOM_DOCUMENT_VTABLE - } + DOM_DOCUMENT_VTABLE_HTML + }, + DOM_HTML_DOCUMENT_VTABLE }; static struct dom_node_protect_vtable html_document_protect_vtable = { @@ -44,7 +48,7 @@ dom_exception _dom_html_document_create( result->base.base.base.vtable = &html_document_vtable; result->base.base.vtable = &html_document_protect_vtable; - error = _dom_html_document_initialise(*doc, daf); + error = _dom_html_document_initialise(result, daf); if (error != DOM_NO_ERR) { free(result); return error; @@ -104,6 +108,60 @@ dom_exception _dom_html_document_copy(dom_node_internal *old, return DOM_NOT_SUPPORTED_ERR; } +/* Overloaded methods inherited from super class */ +/** \todo: dispatch on tag name to create correct HTMLElement subclass */ + +dom_exception _dom_html_document_create_element(dom_document *doc, + dom_string *tag_name, dom_element **result) +{ + dom_html_document *html = (dom_html_document *) doc; + + if (_dom_validate_name(tag_name) == false) + return DOM_INVALID_CHARACTER_ERR; + + return _dom_html_element_create(html, tag_name, NULL, NULL, + (dom_html_element **) result); +} + +dom_exception _dom_html_document_create_element_ns(dom_document *doc, + dom_string *namespace, dom_string *qname, + dom_element **result) +{ + dom_html_document *html = (dom_html_document *) doc; + dom_string *prefix, *localname; + dom_exception err; + + if (_dom_validate_name(qname) == false) + return DOM_INVALID_CHARACTER_ERR; + + /* Validate qname */ + err = _dom_namespace_validate_qname(qname, namespace); + if (err != DOM_NO_ERR) { + return err; + } + + /* Divide QName into prefix/localname pair */ + err = _dom_namespace_split_qname(qname, &prefix, &localname); + if (err != DOM_NO_ERR) { + return err; + } + + /* Attempt to create element */ + err = _dom_html_element_create(html, localname, namespace, prefix, + (dom_html_element **) result); + + /* Tidy up */ + if (localname != NULL) { + dom_string_unref(localname); + } + + if (prefix != NULL) { + dom_string_unref(prefix); + } + + return err; +} + /*-----------------------------------------------------------------------*/ /* The DOM spec public API */ @@ -119,7 +177,7 @@ dom_exception _dom_html_document_copy(dom_node_internal *old, * 2. If there is no such one, find the element and use its text * as the returned title. */ -dom_exception dom_html_document_get_title(dom_html_document *doc, +dom_exception _dom_html_document_get_title(dom_html_document *doc, dom_string **title) { if (doc->title != NULL) { @@ -131,7 +189,7 @@ dom_exception dom_html_document_get_title(dom_html_document *doc, return DOM_NO_ERR; } -dom_exception dom_html_document_set_title(dom_html_document *doc, +dom_exception _dom_html_document_set_title(dom_html_document *doc, dom_string *title) { if (doc->title != NULL) @@ -142,7 +200,7 @@ dom_exception dom_html_document_set_title(dom_html_document *doc, return DOM_NO_ERR; } -dom_exception dom_html_document_get_referer(dom_html_document *doc, +dom_exception _dom_html_document_get_referer(dom_html_document *doc, dom_string **referer) { *referer = dom_string_ref(doc->referer); @@ -150,7 +208,7 @@ dom_exception dom_html_document_get_referer(dom_html_document *doc, return DOM_NO_ERR; } -dom_exception dom_html_document_get_domain(dom_html_document *doc, +dom_exception _dom_html_document_get_domain(dom_html_document *doc, dom_string **domain) { *domain = dom_string_ref(doc->domain); @@ -158,7 +216,7 @@ dom_exception dom_html_document_get_domain(dom_html_document *doc, return DOM_NO_ERR; } -dom_exception dom_html_document_get_url(dom_html_document *doc, +dom_exception _dom_html_document_get_url(dom_html_document *doc, dom_string **url) { *url = dom_string_ref(doc->url); @@ -166,31 +224,126 @@ dom_exception dom_html_document_get_url(dom_html_document *doc, return DOM_NO_ERR; } -dom_exception dom_html_document_get_body(dom_html_document *doc, - struct dom_html_element **body); -dom_exception dom_html_document_set_body(dom_html_document *doc, - struct dom_html_element *body); -dom_exception dom_html_document_get_images(dom_html_document *doc, - struct dom_html_collection **col); -dom_exception dom_html_document_get_applets(dom_html_document *doc, - struct dom_html_collection **col); -dom_exception dom_html_document_get_links(dom_html_document *doc, - struct dom_html_collection **col); -dom_exception dom_html_document_get_forms(dom_html_document *doc, - struct dom_html_collection **col); -dom_exception dom_html_document_get_anchors(dom_html_document *doc, - struct dom_html_collection **col); -dom_exception dom_html_document_get_cookie(dom_html_document *doc, - dom_string **cookie); -dom_exception dom_html_document_set_cookie(dom_html_document *doc, - dom_string *cookie); - -dom_exception dom_html_document_open(dom_html_document *doc); -dom_exception dom_html_document_close(dom_html_document *doc); -dom_exception dom_html_document_write(dom_html_document *doc, - dom_string *text); -dom_exception dom_html_document_writeln(dom_html_document *doc, - dom_string *text); -dom_exception dom_html_document_get_elements_by_name(dom_html_document *doc, - dom_string *name, struct dom_nodelist **list); +dom_exception _dom_html_document_get_body(dom_html_document *doc, + struct dom_html_element **body) +{ + UNUSED(doc); + UNUSED(body); + + return DOM_NOT_SUPPORTED_ERR; +} + +dom_exception _dom_html_document_set_body(dom_html_document *doc, + struct dom_html_element *body) +{ + UNUSED(doc); + UNUSED(body); + + return DOM_NOT_SUPPORTED_ERR; +} + +dom_exception _dom_html_document_get_images(dom_html_document *doc, + struct dom_html_collection **col) +{ + UNUSED(doc); + UNUSED(col); + + return DOM_NOT_SUPPORTED_ERR; +} + +dom_exception _dom_html_document_get_applets(dom_html_document *doc, + struct dom_html_collection **col) +{ + UNUSED(doc); + UNUSED(col); + + return DOM_NOT_SUPPORTED_ERR; +} + +dom_exception _dom_html_document_get_links(dom_html_document *doc, + struct dom_html_collection **col) +{ + UNUSED(doc); + UNUSED(col); + + return DOM_NOT_SUPPORTED_ERR; +} + +dom_exception _dom_html_document_get_forms(dom_html_document *doc, + struct dom_html_collection **col) +{ + UNUSED(doc); + UNUSED(col); + + return DOM_NOT_SUPPORTED_ERR; +} + +dom_exception _dom_html_document_get_anchors(dom_html_document *doc, + struct dom_html_collection **col) +{ + UNUSED(doc); + UNUSED(col); + + return DOM_NOT_SUPPORTED_ERR; +} + +dom_exception _dom_html_document_get_cookie(dom_html_document *doc, + dom_string **cookie) +{ + UNUSED(doc); + UNUSED(cookie); + + return DOM_NOT_SUPPORTED_ERR; +} + +dom_exception _dom_html_document_set_cookie(dom_html_document *doc, + dom_string *cookie) +{ + UNUSED(doc); + UNUSED(cookie); + + return DOM_NOT_SUPPORTED_ERR; +} + +dom_exception _dom_html_document_open(dom_html_document *doc) +{ + UNUSED(doc); + + return DOM_NOT_SUPPORTED_ERR; +} + +dom_exception _dom_html_document_close(dom_html_document *doc) +{ + UNUSED(doc); + + return DOM_NOT_SUPPORTED_ERR; +} + +dom_exception _dom_html_document_write(dom_html_document *doc, + dom_string *text) +{ + UNUSED(doc); + UNUSED(text); + + return DOM_NOT_SUPPORTED_ERR; +} + +dom_exception _dom_html_document_writeln(dom_html_document *doc, + dom_string *text) +{ + UNUSED(doc); + UNUSED(text); + + return DOM_NOT_SUPPORTED_ERR; +} + +dom_exception _dom_html_document_get_elements_by_name(dom_html_document *doc, + dom_string *name, struct dom_nodelist **list) +{ + UNUSED(doc); + UNUSED(name); + UNUSED(list); + + return DOM_NOT_SUPPORTED_ERR; +} diff --git a/src/html/html_document.h b/src/html/html_document.h index 28041d6..f27de20 100644 --- a/src/html/html_document.h +++ b/src/html/html_document.h @@ -43,5 +43,103 @@ dom_exception _dom_html_document_copy(dom_node_internal *old, _dom_html_document_destroy, \ _dom_html_document_copy +dom_exception _dom_html_document_get_title(dom_html_document *doc, + dom_string **title); +dom_exception _dom_html_document_set_title(dom_html_document *doc, + dom_string *title); +dom_exception _dom_html_document_get_referer(dom_html_document *doc, + dom_string **referer); +dom_exception _dom_html_document_get_domain(dom_html_document *doc, + dom_string **domain); +dom_exception _dom_html_document_get_url(dom_html_document *doc, + dom_string **url); +dom_exception _dom_html_document_get_body(dom_html_document *doc, + struct dom_html_element **body); +dom_exception _dom_html_document_set_body(dom_html_document *doc, + struct dom_html_element *body); +dom_exception _dom_html_document_get_images(dom_html_document *doc, + struct dom_html_collection **col); +dom_exception _dom_html_document_get_applets(dom_html_document *doc, + struct dom_html_collection **col); +dom_exception _dom_html_document_get_links(dom_html_document *doc, + struct dom_html_collection **col); +dom_exception _dom_html_document_get_forms(dom_html_document *doc, + struct dom_html_collection **col); +dom_exception _dom_html_document_get_anchors(dom_html_document *doc, + struct dom_html_collection **col); +dom_exception _dom_html_document_get_cookie(dom_html_document *doc, + dom_string **cookie); +dom_exception _dom_html_document_set_cookie(dom_html_document *doc, + dom_string *cookie); + +dom_exception _dom_html_document_open(dom_html_document *doc); +dom_exception _dom_html_document_close(dom_html_document *doc); +dom_exception _dom_html_document_write(dom_html_document *doc, + dom_string *text); +dom_exception _dom_html_document_writeln(dom_html_document *doc, + dom_string *text); +dom_exception _dom_html_document_get_elements_by_name(dom_html_document *doc, + dom_string *name, struct dom_nodelist **list); + +#define DOM_HTML_DOCUMENT_VTABLE \ + _dom_html_document_get_title, \ + _dom_html_document_set_title, \ + _dom_html_document_get_referer, \ + _dom_html_document_get_domain, \ + _dom_html_document_get_url, \ + _dom_html_document_get_body, \ + _dom_html_document_set_body, \ + _dom_html_document_get_images, \ + _dom_html_document_get_applets, \ + _dom_html_document_get_links, \ + _dom_html_document_get_forms, \ + _dom_html_document_get_anchors, \ + _dom_html_document_get_cookie, \ + _dom_html_document_set_cookie, \ + _dom_html_document_open, \ + _dom_html_document_close, \ + _dom_html_document_write, \ + _dom_html_document_writeln, \ + _dom_html_document_get_elements_by_name + +dom_exception _dom_html_document_create_element(dom_document *doc, + dom_string *tag_name, dom_element **result); +dom_exception _dom_html_document_create_element_ns(dom_document *doc, + dom_string *namespace, dom_string *qname, + dom_element **result); + +#define DOM_DOCUMENT_VTABLE_HTML \ + _dom_document_get_doctype, \ + _dom_document_get_implementation, \ + _dom_document_get_document_element, \ + _dom_html_document_create_element, \ + _dom_document_create_document_fragment, \ + _dom_document_create_text_node, \ + _dom_document_create_comment, \ + _dom_document_create_cdata_section, \ + _dom_document_create_processing_instruction, \ + _dom_document_create_attribute, \ + _dom_document_create_entity_reference, \ + _dom_document_get_elements_by_tag_name, \ + _dom_document_import_node, \ + _dom_html_document_create_element_ns, \ + _dom_document_create_attribute_ns, \ + _dom_document_get_elements_by_tag_name_ns, \ + _dom_document_get_element_by_id, \ + _dom_document_get_input_encoding, \ + _dom_document_get_xml_encoding, \ + _dom_document_get_xml_standalone, \ + _dom_document_set_xml_standalone, \ + _dom_document_get_xml_version, \ + _dom_document_set_xml_version, \ + _dom_document_get_strict_error_checking, \ + _dom_document_set_strict_error_checking, \ + _dom_document_get_uri, \ + _dom_document_set_uri, \ + _dom_document_adopt_node, \ + _dom_document_get_dom_config, \ + _dom_document_normalize, \ + _dom_document_rename_node + #endif -- cgit v1.2.3