summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2012-02-05 21:01:43 +0000
committerJohn Mark Bell <jmb@netsurf-browser.org>2012-02-05 21:01:43 +0000
commit1ab1ed7301d3885a00b3081b3bf7ccdeabd0466a (patch)
tree4179a08dad87ae02ef86d2bac69bba16901f7116 /src
parent7b193ec6c254488870c0360a2a5bf004d1d848b4 (diff)
downloadlibdom-1ab1ed7301d3885a00b3081b3bf7ccdeabd0466a.tar.gz
libdom-1ab1ed7301d3885a00b3081b3bf7ccdeabd0466a.tar.bz2
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
Diffstat (limited to 'src')
-rw-r--r--src/core/implementation.c14
-rw-r--r--src/html/html_document.c223
-rw-r--r--src/html/html_document.h98
3 files changed, 288 insertions, 47 deletions
diff --git a/src/core/implementation.c b/src/core/implementation.c
index ab87e6d..08ce996 100644
--- a/src/core/implementation.c
+++ b/src/core/implementation.c
@@ -209,23 +209,13 @@ dom_exception dom_implementation_create_document(
}
/* Create document object that reflects the required APIs */
- /** \todo Why do these have different APIs?
- * Why is the html document constructor public? */
- /** \todo Of course, none of the HTML stuff actually works,
- * so enabling it results in total breakage of the testsuite */
-#ifdef WITH_NON_BROKEN_HTML_IMPLEMENTATION
if (impl_type == DOM_IMPLEMENTATION_HTML) {
dom_html_document *html_doc;
- err = dom_html_document_create(NULL, NULL,
- daf, NULL, DOM_HTML_PARSER, &html_doc);
+ err = _dom_html_document_create(daf, &html_doc);
d = (dom_document *) html_doc;
- } else
-#else
- UNUSED(impl_type);
-#endif
- {
+ } else {
err = _dom_document_create(daf, &d);
}
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 <stdlib.h>
#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 <title> 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