summaryrefslogtreecommitdiff
path: root/src/html/html_element.c
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2010-08-30 13:06:19 +0000
committerJohn Mark Bell <jmb@netsurf-browser.org>2010-08-30 13:06:19 +0000
commit7b12b43398bd2beaebe9444ca76e5150b8410691 (patch)
tree4ce25caee01c0a2a2ebbe052999b5eb8a2fbe2e3 /src/html/html_element.c
parente1c80e0df81cec4ccf6a9dd378942d091a0f15dd (diff)
downloadlibdom-7b12b43398bd2beaebe9444ca76e5150b8410691.tar.gz
libdom-7b12b43398bd2beaebe9444ca76e5150b8410691.tar.bz2
Merge branches/struggleyb/libdom-html to trunk.
A few additional fixes to reduce the number of regressions to single figures. svn path=/trunk/dom/; revision=10724
Diffstat (limited to 'src/html/html_element.c')
-rw-r--r--src/html/html_element.c207
1 files changed, 207 insertions, 0 deletions
diff --git a/src/html/html_element.c b/src/html/html_element.c
new file mode 100644
index 0000000..4610c67
--- /dev/null
+++ b/src/html/html_element.c
@@ -0,0 +1,207 @@
+/*
+ * This file is part of libdom.
+ * Licensed under the MIT License,
+ * http://www.opensource.org/licenses/mit-license.php
+ * Copyright 2009 Bo Yang <struggleyb.nku.com>
+ */
+
+#include <assert.h>
+
+#include "html/html_element.h"
+
+#include "core/node.h"
+#include "core/attr.h"
+#include "core/document.h"
+#include "utils/utils.h"
+
+dom_exception _dom_html_element_initialise(struct dom_document *doc,
+ struct dom_html_element *el, struct lwc_string_s *name,
+ struct lwc_string_s *namespace, struct lwc_string_s *prefix)
+{
+ dom_exception err;
+
+ err = _dom_element_initialise(doc, &el->base, name, namespace, prefix);
+ if (err != DOM_NO_ERR)
+ return err;
+
+ el->form = NULL;
+ return err;
+}
+
+void _dom_html_element_finalise(struct dom_document *doc,
+ struct dom_html_element *ele)
+{
+ dom_node_unref(ele->form);
+ ele->form = NULL;
+
+ _dom_element_finalise(doc, &ele->base);
+}
+
+/*------------------------------------------------------------------------*/
+/* The protected virtual functions */
+
+/* The virtual destroy function, see src/core/node.c for detail */
+void _dom_virtual_html_element_destroy(dom_node_internal *node)
+{
+ UNUSED(node);
+ assert("Should never be here" == NULL);
+}
+
+/* The virtual allocation function, see src/core/node.c for detail */
+dom_exception _dom_html_element_alloc(struct dom_document *doc,
+ struct dom_node_internal *n, struct dom_node_internal **ret)
+{
+ UNUSED(doc);
+ UNUSED(n);
+ UNUSED(ret);
+
+ assert("Should never be here" == NULL);
+
+ return DOM_NO_MEM_ERR;
+}
+
+/* The virtual copy function, see src/core/node.c for detail */
+dom_exception _dom_html_element_copy(struct dom_node_internal *new,
+ struct dom_node_internal *old)
+{
+ return _dom_element_copy(new, old);
+}
+
+/*-----------------------------------------------------------------------*/
+/* Common functions */
+
+/**
+ * Get the a bool property
+ *
+ * \param ele The dom_html_element object
+ * \param name The name of the attribute
+ * \param len The length of ::name
+ * \param has The returned status
+ * \return DOM_NO_ERR on success, appropriate dom_exception on failure.
+ */
+dom_exception dom_html_element_get_bool_property(dom_html_element *ele,
+ const char *name, unsigned long len, bool *has)
+{
+ dom_document *doc = dom_node_get_owner(ele);
+ dom_string *str = NULL;
+ dom_attr *a = NULL;
+ dom_exception err;
+
+ err = _dom_document_create_string(doc, (const uint8_t *) name,
+ len, &str);
+ if (err != DOM_NO_ERR)
+ goto fail;
+
+ err = dom_element_get_attribute_node(ele, str, &a);
+ if (err != DOM_NO_ERR)
+ goto cleanup1;
+
+ if (a != NULL) {
+ *has = true;
+ } else {
+ *has = false;
+ }
+
+ dom_node_unref(a);
+
+cleanup1:
+ dom_string_unref(str);
+
+fail:
+ return err;
+}
+
+/**
+ * Set a bool property
+ *
+ * \param ele The dom_html_element object
+ * \param name The name of the attribute
+ * \param len The length of ::name
+ * \param has The status
+ * \return DOM_NO_ERR on success, appropriate dom_exception on failure.
+ */
+dom_exception dom_html_element_set_bool_property(dom_html_element *ele,
+ const char *name, unsigned long len, bool has)
+{
+ dom_document *doc = dom_node_get_owner(ele);
+ dom_string *str = NULL;
+ dom_attr *a = NULL;
+ dom_exception err;
+
+ err = _dom_document_create_string(doc, (const uint8_t *) name,
+ len, &str);
+ if (err != DOM_NO_ERR)
+ goto fail;
+
+ err = dom_element_get_attribute_node(ele, str, &a);
+ if (err != DOM_NO_ERR)
+ goto cleanup1;
+
+ if (a != NULL && has == false) {
+ dom_attr *res = NULL;
+
+ err = dom_element_remove_attribute_node(ele, a, &res);
+ if (err != DOM_NO_ERR)
+ goto cleanup2;
+
+ dom_node_unref(res);
+ } else if (a == NULL && has == true) {
+ dom_attr *res = NULL;
+ lwc_string *lstr = NULL;
+
+ err = _dom_string_intern(str, &lstr);
+ if (err != DOM_NO_ERR)
+ goto cleanup1;
+
+ err = _dom_attr_create(doc, lstr, NULL, NULL, true, &a);
+ if (err != DOM_NO_ERR) {
+ lwc_string_unref(lstr);
+ goto cleanup1;
+ }
+ lwc_string_unref(lstr);
+
+ err = dom_element_set_attribute_node(ele, a, &res);
+ if (err != DOM_NO_ERR)
+ goto cleanup2;
+
+ dom_node_unref(res);
+ }
+
+cleanup2:
+ dom_node_unref(a);
+
+cleanup1:
+ dom_string_unref(str);
+
+fail:
+ return err;
+}
+
+/**
+ * Get the form element if this element is a form control
+ *
+ * \param ele The element object
+ * \param form The form object
+ */
+void _dom_html_element_get_form(dom_html_element *ele,
+ struct dom_html_form_element **form)
+{
+ *form = ele->form;
+ dom_node_ref(*form);
+}
+
+/**
+ * Set the form element if this element is a form control
+ *
+ * \param ele The element object
+ * \param form The form object
+ */
+void _dom_html_element_associate_form(dom_html_element *ele,
+ struct dom_html_form_element *form)
+{
+ /* Unref the form if there is any */
+ dom_node_unref(form);
+ ele->form = form;
+ dom_node_ref(form);
+}
+