diff options
author | Vincent Sanders <vince@kyllikki.org> | 2012-11-18 12:59:10 +0000 |
---|---|---|
committer | Vincent Sanders <vince@kyllikki.org> | 2012-11-18 12:59:10 +0000 |
commit | 99d3633e0348fcff3f99d87696b57a70cbdcaf4d (patch) | |
tree | 0531195ed697cb8d6e7d387c9361da9c8075b59a | |
parent | bec871152864b1cfb42484505a6622f7f524a405 (diff) | |
download | netsurf-99d3633e0348fcff3f99d87696b57a70cbdcaf4d.tar.gz netsurf-99d3633e0348fcff3f99d87696b57a70cbdcaf4d.tar.bz2 |
implement previousElementSibling and nextElementSibling
-rw-r--r-- | javascript/jsapi/htmlelement.bnd | 64 | ||||
-rw-r--r-- | test/js/dom-element-next_prev_ElementSibling.html | 14 | ||||
-rw-r--r-- | test/js/index.html | 1 |
3 files changed, 77 insertions, 2 deletions
diff --git a/javascript/jsapi/htmlelement.bnd b/javascript/jsapi/htmlelement.bnd index 898f78188..0730ad44b 100644 --- a/javascript/jsapi/htmlelement.bnd +++ b/javascript/jsapi/htmlelement.bnd @@ -123,7 +123,67 @@ getter lastElementChild %{ %} getter previousElementSibling %{ - %} + dom_node *element; + dom_exception exc; + dom_node_type node_type; + dom_node *sib_node; + + exc = dom_node_get_previous_sibling(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_previous_sibling(element, &sib_node); + dom_node_unref(element); + if (exc == DOM_NO_ERR) { + element = sib_node; + } else { + element = NULL; + } + } +%} getter nextElementSibling %{ - %} + dom_node *element; + dom_exception exc; + dom_node_type node_type; + dom_node *sib_node; + + exc = dom_node_get_next_sibling(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, &sib_node); + dom_node_unref(element); + if (exc == DOM_NO_ERR) { + element = sib_node; + } else { + element = NULL; + } + } +%} diff --git a/test/js/dom-element-next_prev_ElementSibling.html b/test/js/dom-element-next_prev_ElementSibling.html new file mode 100644 index 000000000..85263cc17 --- /dev/null +++ b/test/js/dom-element-next_prev_ElementSibling.html @@ -0,0 +1,14 @@ +<html> +<head> +<title>DOM previousElementSibling and nextElementSibling reference</title> +<!-- comment node should be skipped --> +<link rel="stylesheet" type="text/css" href="tst.css"> +</head> +<body> +<h1>DOM previousElementSibling and nextElementSibling reference</h1> +<!-- comment node should be skipped --> +<p><b>head.lastElementChild.previousElementSibling:</b> <script>document.write(document.head.lastElementChild.previousElementSibling.textContent);</script></p> +<!-- comment node should be skipped --> +<p><b>body.firstElementChild.nextElementSibling:</b> <script>document.write(document.body.firstElementChild.nextElementSibling.textContent);</script></p> +</body> +</html> diff --git a/test/js/index.html b/test/js/index.html index 70e4088cf..5341a7482 100644 --- a/test/js/index.html +++ b/test/js/index.html @@ -26,6 +26,7 @@ <ul> <li><a href="dom-element-firstElementChild.html">firstElementChild</a></li> <li><a href="dom-element-lastElementChild.html">lastElementChild</a></li> +<li><a href="dom-element-next_prev_ElementSibling.html">previousElementSibling nextElementSibling</a></li> <li><a href="doc-dom2.html">getElementById</a></li> <li><a href="dom-getElementsByTagName.html">getElementsByTagName</a></li> |