summaryrefslogtreecommitdiff
path: root/src/html/html_options_collection.c
diff options
context:
space:
mode:
authorJohn-Mark Bell <jmb@netsurf-browser.org>2012-08-08 10:56:53 +0100
committerJohn-Mark Bell <jmb@netsurf-browser.org>2012-08-08 10:56:53 +0100
commit2a9572f844e04332d6a448b2f52be8ba2a5e8784 (patch)
tree49788e878d5ce1aa92bf69c1a095c48d02a6195b /src/html/html_options_collection.c
parente9f991799dd6ee22dcb8af367c72f58ac31e66ca (diff)
downloadlibdom-2a9572f844e04332d6a448b2f52be8ba2a5e8784.tar.gz
libdom-2a9572f844e04332d6a448b2f52be8ba2a5e8784.tar.bz2
Mostly implement HTMLOptionElement, HTMLSelectElement.
Enable HTMLOptionElement tests that pass.
Diffstat (limited to 'src/html/html_options_collection.c')
-rw-r--r--src/html/html_options_collection.c68
1 files changed, 67 insertions, 1 deletions
diff --git a/src/html/html_options_collection.c b/src/html/html_options_collection.c
index 26926bf..e5b5f34 100644
--- a/src/html/html_options_collection.c
+++ b/src/html/html_options_collection.c
@@ -142,7 +142,73 @@ dom_exception dom_html_options_collection_item(dom_html_options_collection *col,
dom_exception dom_html_options_collection_named_item(dom_html_options_collection *col,
dom_string *name, struct dom_node **node)
{
- return dom_html_collection_named_item(&col->base, name, node);
+ struct dom_node_internal *n = col->base.root;
+ dom_string *kname;
+ dom_exception err;
+
+ /* Search for an element with an appropriate ID */
+ err = dom_html_collection_named_item(&col->base, name, node);
+ if (err == DOM_NO_ERR && *node != NULL)
+ return err;
+
+ /* Didn't find one, so consider name attribute */
+ err = dom_string_create_interned((const uint8_t *) "name", SLEN("name"),
+ &kname);
+ if (err != DOM_NO_ERR)
+ return err;
+
+ while (n != NULL) {
+ if (n->type == DOM_ELEMENT_NODE &&
+ col->base.ic(n, col->base.ctx) == true) {
+ dom_string *nval = NULL;
+
+ err = dom_element_get_attribute(n, kname, &nval);
+ if (err != DOM_NO_ERR) {
+ dom_string_unref(kname);
+ return err;
+ }
+
+ if (nval != NULL && dom_string_isequal(name, nval)) {
+ *node = (struct dom_node *) n;
+ dom_node_ref(n);
+ dom_string_unref(nval);
+ dom_string_unref(kname);
+
+ return DOM_NO_ERR;
+ }
+
+ if (nval != NULL)
+ dom_string_unref(nval);
+ }
+
+ /* Depth first iterating */
+ if (n->first_child != NULL) {
+ n = n->first_child;
+ } else if (n->next != NULL) {
+ n = n->next;
+ } else {
+ /* No children and siblings */
+ struct dom_node_internal *parent = n->parent;
+
+ while (parent != col->base.root &&
+ n == parent->last_child) {
+ n = parent;
+ parent = parent->parent;
+ }
+
+ if (parent == col->base.root)
+ n = NULL;
+ else
+ n = n->next;
+ }
+ }
+
+ dom_string_unref(kname);
+
+ /* Not found the target node */
+ *node = NULL;
+
+ return DOM_NO_ERR;
}
/**