diff options
author | Vincent Sanders <vince@kyllikki.org> | 2012-11-18 12:14:44 +0000 |
---|---|---|
committer | Vincent Sanders <vince@kyllikki.org> | 2012-11-18 12:14:44 +0000 |
commit | b1ca83ad8c68f18194d47c06bdcb410064ca8c25 (patch) | |
tree | 361e09b4c0bcac8f039be2951a6710f34290486d /javascript | |
parent | 6589c7cc196863d0d0694d6bd14c39386b27ae81 (diff) | |
download | netsurf-b1ca83ad8c68f18194d47c06bdcb410064ca8c25.tar.gz netsurf-b1ca83ad8c68f18194d47c06bdcb410064ca8c25.tar.bz2 |
implement firstElementChild
Diffstat (limited to 'javascript')
-rw-r--r-- | javascript/jsapi/htmlelement.bnd | 51 |
1 files changed, 46 insertions, 5 deletions
diff --git a/javascript/jsapi/htmlelement.bnd b/javascript/jsapi/htmlelement.bnd index 18e343f68..3b533ebef 100644 --- a/javascript/jsapi/htmlelement.bnd +++ b/javascript/jsapi/htmlelement.bnd @@ -20,7 +20,7 @@ hdrcomment " http://www.opensource.org/licenses/mit-license"; preamble %{ #include <dom/dom.h> - + #include "utils/config.h" #include "utils/log.h" @@ -35,16 +35,57 @@ binding htmlelement { interface HTMLElement; /* Web IDL interface to generate */ private "dom_element *" node; - private "struct html_content *" htmlc; + private "struct html_content *" htmlc; } api finalise %{ - if (private != NULL) { - dom_node_unref(private->node); - } + if (private != NULL) { + dom_node_unref(private->node); + } %} +/* interface Element in dom idl */ + +/* + * DOM 3 has these as the element traversal extension + * + * http://dev.w3.org/2006/webapi/ElementTraversal/publish/ElementTraversal.html + */ + getter firstElementChild %{ + dom_node *element; + dom_exception exc; + dom_node_type node_type; + dom_node *next_node; + + exc = dom_node_get_first_child(private->node, &element); + if (exc != DOM_NO_ERR) { + return JS_FALSE; + } + + while (element != NULL) { + exc = dom_node_get_node_type(element, &node_type); + if ((exc == DOM_NO_ERR) && (node_type == DOM_ELEMENT_NODE)) { + /* found it */ + jsret = jsapi_new_HTMLElement(cx, + NULL, + NULL, + (dom_element *)element, + private->htmlc); + break; + } + + exc = dom_node_get_next_sibling(element, &next_node); + dom_node_unref(element); + if (exc == DOM_NO_ERR) { + element = next_node; + } else { + element = NULL; + } + + } + + %} getter lastElementChild %{ |