summaryrefslogtreecommitdiff
path: root/javascript/duktape/element.c
diff options
context:
space:
mode:
Diffstat (limited to 'javascript/duktape/element.c')
-rw-r--r--javascript/duktape/element.c172
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);