summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Sanders <vince@kyllikki.org>2015-08-04 08:58:53 +0100
committerVincent Sanders <vince@kyllikki.org>2015-08-04 08:58:53 +0100
commit9cf8d1ffac7f8a3330d30472aff79a112ea2f0ce (patch)
treea993f4bfc03b647dd8568d0df797a04c854b3a21
parentfcdec4efc70864533ad940ea0bcb7dd4ea13f41a (diff)
downloadnetsurf-9cf8d1ffac7f8a3330d30472aff79a112ea2f0ce.tar.gz
netsurf-9cf8d1ffac7f8a3330d30472aff79a112ea2f0ce.tar.bz2
Add element binding
-rw-r--r--javascript/duktape/Element.bnd176
-rw-r--r--javascript/duktape/netsurf.bnd2
2 files changed, 177 insertions, 1 deletions
diff --git a/javascript/duktape/Element.bnd b/javascript/duktape/Element.bnd
new file mode 100644
index 000000000..1c592b228
--- /dev/null
+++ b/javascript/duktape/Element.bnd
@@ -0,0 +1,176 @@
+/* document binding for browser using duktape and libdom
+ *
+ * Copyright 2015 Vincent Sanders <vince@netsurf-browser.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * Released under the terms of the MIT License,
+ * http://www.opensource.org/licenses/mit-license
+ */
+
+class Element {
+ prologue %{
+%};
+}
+
+init Element("struct dom_element *" element::node);
+
+getter Element::firstElementChild()
+%{
+ 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;
+%}
+
+getter Element::lastElementChild()
+%{
+ 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;
+%}
+
+getter Element::previousElementSibling()
+%{
+ 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;
+%}
+
+getter Element::nextElementSibling()
+%{
+ 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;
+%}
+
+getter Element::childElementCount()
+%{
+ 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;
+%}
diff --git a/javascript/duktape/netsurf.bnd b/javascript/duktape/netsurf.bnd
index bca681bd6..72f4b406d 100644
--- a/javascript/duktape/netsurf.bnd
+++ b/javascript/duktape/netsurf.bnd
@@ -53,6 +53,7 @@ struct dom_html_br_element;
#include "Window.bnd"
#include "Document.bnd"
#include "Node.bnd"
+#include "Element.bnd"
/* specialisations of html_element */
init HTMLUnknownElement("struct dom_html_element *" html_unknown_element::html_element);
@@ -142,7 +143,6 @@ init ProcessingInstruction("struct dom_node_text *" text::character_data);
init XMLDocument("struct dom_document *" document);
-init Element("struct dom_element *" element::node);
init CharacterData("struct dom_node_character_data *" character_data::node);
init DocumentFragment("struct dom_document *" document::node);
init DocumentType("struct dom_document *" document::node);