diff options
author | Daniel Silverstone <dsilvers@digital-scurf.org> | 2015-07-19 16:50:46 +0100 |
---|---|---|
committer | Daniel Silverstone <dsilvers@digital-scurf.org> | 2015-07-19 16:50:46 +0100 |
commit | 72a78ba9f5e2098480b922ab5cb5117ecdb05b36 (patch) | |
tree | 5a105118a75d8d896d78a000f336fb3c212edc7a /javascript/duktape/element.c | |
parent | 8ec9e559e00f7c2288fa724591208e710690eff5 (diff) | |
download | netsurf-72a78ba9f5e2098480b922ab5cb5117ecdb05b36.tar.gz netsurf-72a78ba9f5e2098480b922ab5cb5117ecdb05b36.tar.bz2 |
Getting further
Diffstat (limited to 'javascript/duktape/element.c')
-rw-r--r-- | javascript/duktape/element.c | 172 |
1 files changed, 171 insertions, 1 deletions
diff --git a/javascript/duktape/element.c b/javascript/duktape/element.c index f495d8621..23c76278a 100644 --- a/javascript/duktape/element.c +++ b/javascript/duktape/element.c @@ -36,10 +36,180 @@ static DUKKY_FUNC(element, __destructor) return 0; } +static DUKKY_GETTER(element, firstElementChild) +{ + DUKKY_GET_METHOD_PRIVATE(element); + dom_node *element; + dom_exception exc; + dom_node_type node_type; + dom_node *next_node; + + exc = dom_node_get_first_child(((node_private_t*)priv)->node, &element); + if (exc != DOM_NO_ERR) { + return 0; + } + + while (element != NULL) { + exc = dom_node_get_node_type(element, &node_type); + if ((exc == DOM_NO_ERR) && (node_type == DOM_ELEMENT_NODE)) { + /* found it */ + dukky_push_node(ctx, (dom_node *)element); + dom_node_unref(element); + return 1; + } + + exc = dom_node_get_next_sibling(element, &next_node); + dom_node_unref(element); + if (exc == DOM_NO_ERR) { + element = next_node; + } else { + element = NULL; + } + } + return 0; +} + +static DUKKY_GETTER(element, lastElementChild) +{ + DUKKY_GET_METHOD_PRIVATE(element); + dom_node *element; + dom_exception exc; + dom_node_type node_type; + dom_node *next_node; + + exc = dom_node_get_last_child(((node_private_t*)priv)->node, &element); + if (exc != DOM_NO_ERR) { + return 0; + } + + while (element != NULL) { + exc = dom_node_get_node_type(element, &node_type); + if ((exc == DOM_NO_ERR) && (node_type == DOM_ELEMENT_NODE)) { + /* found it */ + dukky_push_node(ctx, (dom_node *)element); + dom_node_unref(element); + return 1; + } + + exc = dom_node_get_previous_sibling(element, &next_node); + dom_node_unref(element); + if (exc == DOM_NO_ERR) { + element = next_node; + } else { + element = NULL; + } + } + return 0; +} + +static DUKKY_GETTER(element, previousElementSibling) +{ + DUKKY_GET_METHOD_PRIVATE(element); + dom_node *element; + dom_exception exc; + dom_node_type node_type; + dom_node *sib_node; + + exc = dom_node_get_previous_sibling(((node_private_t *)priv)->node, &element); + if (exc != DOM_NO_ERR) { + return 0; + } + + while (element != NULL) { + exc = dom_node_get_node_type(element, &node_type); + if ((exc == DOM_NO_ERR) && (node_type == DOM_ELEMENT_NODE)) { + /* found it */ + dukky_push_node(ctx, (dom_node *)element); + dom_node_unref(element); + return 1; + } + + exc = dom_node_get_previous_sibling(element, &sib_node); + dom_node_unref(element); + if (exc == DOM_NO_ERR) { + element = sib_node; + } else { + element = NULL; + } + } + return 0; +} + +static DUKKY_GETTER(element, nextElementSibling) +{ + DUKKY_GET_METHOD_PRIVATE(element); + dom_node *element; + dom_exception exc; + dom_node_type node_type; + dom_node *sib_node; + + exc = dom_node_get_next_sibling(((node_private_t *)priv)->node, &element); + if (exc != DOM_NO_ERR) { + return 0; + } + + while (element != NULL) { + exc = dom_node_get_node_type(element, &node_type); + if ((exc == DOM_NO_ERR) && (node_type == DOM_ELEMENT_NODE)) { + /* found it */ + dukky_push_node(ctx, (dom_node *)element); + dom_node_unref(element); + return 1; + } + + exc = dom_node_get_next_sibling(element, &sib_node); + dom_node_unref(element); + if (exc == DOM_NO_ERR) { + element = sib_node; + } else { + element = NULL; + } + } + return 0; +} + +static DUKKY_GETTER(element, childElementCount) +{ + LOG("MOO"); + DUKKY_GET_METHOD_PRIVATE(element); + dom_node *element; + dom_exception exc; + dom_node_type node_type; + dom_node *next_node; + duk_uint_t jsret = 0; + + exc = dom_node_get_first_child(((node_private_t *)priv)->node, &element); + if (exc != DOM_NO_ERR) { + return 0; + } + + while (element != NULL) { + exc = dom_node_get_node_type(element, &node_type); + if ((exc == DOM_NO_ERR) && (node_type == DOM_ELEMENT_NODE)) { + jsret += 1; + } + + exc = dom_node_get_next_sibling(element, &next_node); + dom_node_unref(element); + if (exc == DOM_NO_ERR) { + element = next_node; + } else { + element = NULL; + } + } + LOG("I found %u of them", jsret); + duk_push_uint(ctx, jsret); + return 1; +} + DUKKY_FUNC(element, __proto) { /* Populate element's prototypical functionality */ - + DUKKY_POPULATE_READONLY_PROPERTY(element, firstElementChild); + DUKKY_POPULATE_READONLY_PROPERTY(element, lastElementChild); + DUKKY_POPULATE_READONLY_PROPERTY(element, nextElementSibling); + DUKKY_POPULATE_READONLY_PROPERTY(element, previousElementSibling); + DUKKY_POPULATE_READONLY_PROPERTY(element, childElementCount); /* Set this prototype's prototype (left-parent)*/ DUKKY_GET_PROTOTYPE(node); duk_set_prototype(ctx, 0); |