diff options
author | John-Mark Bell <jmb@netsurf-browser.org> | 2012-08-08 10:56:53 +0100 |
---|---|---|
committer | John-Mark Bell <jmb@netsurf-browser.org> | 2012-08-08 10:56:53 +0100 |
commit | 2a9572f844e04332d6a448b2f52be8ba2a5e8784 (patch) | |
tree | 49788e878d5ce1aa92bf69c1a095c48d02a6195b /src/html/html_options_collection.c | |
parent | e9f991799dd6ee22dcb8af367c72f58ac31e66ca (diff) | |
download | libdom-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.c | 68 |
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; } /** |