From aadb8200899ae7b2dd75bc743b08dcd9cecd27db Mon Sep 17 00:00:00 2001 From: Daniel Silverstone Date: Sun, 9 Aug 2015 12:26:41 +0100 Subject: Add duktape bindings --- javascript/duktape/Document.bnd | 205 ++++++++++++++++++++++++++++++++++ javascript/duktape/Element.bnd | 176 +++++++++++++++++++++++++++++ javascript/duktape/HTMLCollection.bnd | 24 ++++ javascript/duktape/Node.bnd | 60 ++++++++++ javascript/duktape/NodeList.bnd | 54 +++++++++ javascript/duktape/Window.bnd | 52 +++++++++ javascript/duktape/netsurf.bnd | 160 ++++++++++++++++++++++++++ 7 files changed, 731 insertions(+) create mode 100644 javascript/duktape/Document.bnd create mode 100644 javascript/duktape/Element.bnd create mode 100644 javascript/duktape/HTMLCollection.bnd create mode 100644 javascript/duktape/Node.bnd create mode 100644 javascript/duktape/NodeList.bnd create mode 100644 javascript/duktape/Window.bnd create mode 100644 javascript/duktape/netsurf.bnd diff --git a/javascript/duktape/Document.bnd b/javascript/duktape/Document.bnd new file mode 100644 index 000000000..b99e43810 --- /dev/null +++ b/javascript/duktape/Document.bnd @@ -0,0 +1,205 @@ +/* document binding for browser using duktape and libdom + * + * Copyright 2015 Vincent Sanders + * + * 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 Document { + prologue %{ +#include "utils/corestrings.h" +#include "render/html_internal.h" +#include "utils/libdom.h" +%}; +} + +init Document("struct dom_document *" document::node); + +method Document::write() +%{ + struct html_content *htmlc; + duk_size_t text_len; + const char *text = duk_safe_to_lstring(ctx, 0, &text_len); + LOG("Writing %*s", (int)text_len, text); + dom_exception err; + err = dom_node_get_user_data(priv->parent.node, + corestring_dom___ns_key_html_content_data, + &htmlc); + if (err == DOM_NO_ERR && htmlc->parser != NULL) { + dom_hubbub_parser_insert_chunk(htmlc->parser, (uint8_t *)text, text_len); + } + return 0; +%} + +method Document::createTextNode() +%{ + dom_node *newnode; + dom_exception err; + duk_size_t text_len; + const char *text = duk_safe_to_lstring(ctx, 0, &text_len); + dom_string *text_str; + + err = dom_string_create((const uint8_t*)text, text_len, &text_str); + if (err != DOM_NO_ERR) return 0; /* coerced to undefined */ + + err = dom_document_create_text_node(priv->parent.node, + text_str, + &newnode); + if (err != DOM_NO_ERR) { + dom_string_unref(text_str); + return 0; /* coerced to undefined */ + } + + dom_string_unref(text_str); + + dukky_push_node(ctx, newnode); + + dom_node_unref(newnode); + + return 1; +%} + +method Document::createElement() +%{ + dom_node *newnode; + dom_exception err; + duk_size_t text_len; + const char *text = duk_safe_to_lstring(ctx, 0, &text_len); + dom_string *text_str; + + err = dom_string_create((const uint8_t*)text, text_len, &text_str); + if (err != DOM_NO_ERR) return 0; /* coerced to undefined */ + + err = dom_document_create_element_ns(priv->parent.node, + corestring_dom_html_namespace, + text_str, + &newnode); + if (err != DOM_NO_ERR) { + dom_string_unref(text_str); + return 0; /* coerced to undefined */ + } + + dom_string_unref(text_str); + + dukky_push_node(ctx, newnode); + + dom_node_unref(newnode); + + return 1; +%} + +getter Document::head() +%{ + struct dom_nodelist *nodes; + struct dom_node *retnode; + dom_exception err; + err = dom_document_get_elements_by_tag_name(priv->parent.node, + corestring_dom_HEAD, + &nodes); + if (err != DOM_NO_ERR) return 0; /* coerced to undefined */ + + err = dom_nodelist_item(nodes, 0, &retnode); + + if (err != DOM_NO_ERR) { + dom_nodelist_unref(nodes); + return 0; /* coerced to undefined */ + } + + dom_nodelist_unref(nodes); + + if (retnode == NULL) return 0; /* coerced to undefined */ + + dukky_push_node(ctx, retnode); + + dom_node_unref(retnode); + + return 1; +%} + +getter Document::body() +%{ + struct dom_nodelist *nodes; + struct dom_node *retnode; + dom_exception err; + err = dom_document_get_elements_by_tag_name(priv->parent.node, + corestring_dom_BODY, + &nodes); + if (err != DOM_NO_ERR) { + return 0; /* coerced to undefined */ + } + + err = dom_nodelist_item(nodes, 0, &retnode); + + if (err != DOM_NO_ERR) { + dom_nodelist_unref(nodes); + return 0; /* coerced to undefined */ + } + + dom_nodelist_unref(nodes); + + if (retnode != NULL) { + dukky_push_node(ctx, retnode); + + dom_node_unref(retnode); + + return 1; + } + + return 0; /* coerced to undefined */ +%} + +method Document::getElementById() +%{ + dom_string *elementId_dom; + dom_element *element; + dom_exception exc; + duk_size_t text_len; + const char *text = duk_safe_to_lstring(ctx, 0, &text_len); + + exc = dom_string_create((uint8_t*)text, text_len, &elementId_dom); + if (exc != DOM_NO_ERR) { + return 0; + } + + exc = dom_document_get_element_by_id(((node_private_t *)priv)->node, + elementId_dom, &element); + dom_string_unref(elementId_dom); + if (exc != DOM_NO_ERR) { + return 0; + } + + if (element != NULL) { + dukky_push_node(ctx, (dom_node *)element); + return 1; + } + + return 0; +%} + +method Document::getElementsByTagName() +%{ + dom_nodelist *nodes; + dom_exception err; + duk_size_t text_len; + const char *text = duk_safe_to_lstring(ctx, 0, &text_len); + dom_string *tag; + + err = dom_string_create((uint8_t*)text, text_len, &tag); + + if (err != DOM_NO_ERR) return 0; /* coerced to undefined */ + + err = dom_document_get_elements_by_tag_name(((node_private_t *)priv)->node, + tag, &nodes); + dom_string_unref(tag); + if (err != DOM_NO_ERR) return 0; /* coerced to undefined */ + + if (nodes == NULL) return 0; /* coerced to undefined */ + + duk_push_pointer(ctx, nodes); + dukky_create_object(ctx, PROTO_NAME(NODELIST), 1); + dom_nodelist_unref(nodes); + return 1; +%} 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 + * + * 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/HTMLCollection.bnd b/javascript/duktape/HTMLCollection.bnd new file mode 100644 index 000000000..08a162d35 --- /dev/null +++ b/javascript/duktape/HTMLCollection.bnd @@ -0,0 +1,24 @@ +/* HTMLCollection binding for browser using duktape and libdom + * + * Copyright 2015 Vincent Sanders + * + * 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 HTMLCollection { + private "struct dom_html_collection *" coll; +} + +init HTMLCollection("struct dom_html_collection *" coll) +%{ + priv->coll = coll; + dom_html_collection_ref(coll); +%} + +fini HTMLCollection() +%{ + dom_html_collection_unref(priv->coll); +%} diff --git a/javascript/duktape/Node.bnd b/javascript/duktape/Node.bnd new file mode 100644 index 000000000..c5f890395 --- /dev/null +++ b/javascript/duktape/Node.bnd @@ -0,0 +1,60 @@ +/* Node binding for browser using duktape and libdom + * + * Copyright 2015 Vincent Sanders + * + * 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 Node { + private "dom_node *" node; +} + +init Node("struct dom_node *" node) +%{ + priv->node = node; + dom_node_ref(node); +%} + +fini Node() +%{ + dom_node_unref(priv->node); +%} + +method Node::appendChild() +%{ + if (!dukky_instanceof(ctx, PROTO_NAME(NODE))) return 0; + + duk_get_prop_string(ctx, 0, PRIVATE_MAGIC); + node_private_t *other = duk_get_pointer(ctx, -1); + duk_pop(ctx); + + dom_exception err; + dom_node *spare; + + err = dom_node_append_child(priv->node, other->node, &spare); + if (err != DOM_NO_ERR) return 0; + dom_node_unref(spare); + + return 0; +%} + +getter Node::textContent() +%{ + dom_exception exc; + dom_string *content; + + exc = dom_node_get_text_content(priv->node, &content); + if (exc != DOM_NO_ERR) { + return 0; + } + + if (content != NULL) { + duk_push_lstring(ctx, dom_string_data(content), dom_string_length(content)); + dom_string_unref(content); + return 1; + } + return 0; +%} diff --git a/javascript/duktape/NodeList.bnd b/javascript/duktape/NodeList.bnd new file mode 100644 index 000000000..e085b6cda --- /dev/null +++ b/javascript/duktape/NodeList.bnd @@ -0,0 +1,54 @@ +/* NodeList binding for browser using duktape and libdom + * + * Copyright 2015 Vincent Sanders + * + * 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 NodeList { + private "struct dom_nodelist *" nodes; +} + +init NodeList("struct dom_nodelist *" nodes) +%{ + priv->nodes = nodes; + dom_nodelist_ref(nodes); +%} + +fini NodeList() +%{ + dom_nodelist_unref(priv->nodes); +%} + +getter NodeList::length() +%{ + dom_exception err; + uint32_t len; + + err = dom_nodelist_get_length(priv->nodes, &len); + + if (err != DOM_NO_ERR) return 0; /* coerced to undefined */ + + duk_push_uint(ctx, (duk_uint_t)len); + + return 1; +%} + +method NodeList::item() +%{ + unsigned long i = duk_to_uint(ctx, 0); + dom_exception err; + dom_node *node; + + err = dom_nodelist_item(priv->nodes, i, &node); + + if (err != DOM_NO_ERR) return 0; /* coerced to undefied */ + + dukky_push_node(ctx, node); + dom_node_unref(node); + + return 1; +%} diff --git a/javascript/duktape/Window.bnd b/javascript/duktape/Window.bnd new file mode 100644 index 000000000..2223ae88d --- /dev/null +++ b/javascript/duktape/Window.bnd @@ -0,0 +1,52 @@ +/* Window binding for browser using duktape and libdom + * + * Copyright 2015 Vincent Sanders + * + * 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 Window { + private "struct browser_window *" win; + private "struct html_content *" htmlc; + prologue %{ +#include "utils/nsurl.h" +#include "desktop/browser.h" +#include "render/html.h" +#include "render/html_internal.h" +%}; +} + +init Window("struct browser_window *" win, "struct html_content *" htmlc) +%{ + /* element window */ + priv->win = win; + priv->htmlc = htmlc; + LOG("win=%p htmlc=%p", priv->win, priv->htmlc); + + LOG("URL is %s", nsurl_access(browser_window_get_url(priv->win))); +%} + +prototype Window() +%{ + /* steal undefined */ + duk_get_global_string(ctx, "undefined"); + duk_put_prop_string(ctx, 0, "undefined"); +%} + +getter Window::document() +%{ + LOG("priv=%p", priv); + dom_document *doc = priv->htmlc->document; + dukky_push_node(ctx, (struct dom_node *)doc); + return 1; +%} + + +getter Window::document() +%{ + duk_dup(ctx, 0); + return 1; +%} diff --git a/javascript/duktape/netsurf.bnd b/javascript/duktape/netsurf.bnd new file mode 100644 index 000000000..935450a55 --- /dev/null +++ b/javascript/duktape/netsurf.bnd @@ -0,0 +1,160 @@ +/* Binding for browser using duktape and libdom + * + * Copyright 2015 Vincent Sanders + * + * 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 + */ + +binding duk_libdom { + webidl "dom.idl"; + webidl "html.idl"; + webidl "uievents.idl"; + webidl "console.idl"; + + preface %{ +/* DukTape JavaScript bindings for NetSurf browser + * + * Copyright 2015 Vincent Sanders + * 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 + */ + +#include + +#include "utils/log.h" + +#include "javascript/duktape/duktape.h" + +struct browser_window; +struct html_content; +struct dom_node; +struct dom_element; +struct dom_document; +struct dom_html_element; +struct dom_node_character_data; +struct dom_node_text; +struct dom_node_list; +struct dom_node_comment; +struct dom_html_collection; +struct dom_html_br_element; + +%}; + + prologue %{ +#include "javascript/dukky.h" +%}; + +} + +#include "Window.bnd" +#include "Document.bnd" +#include "Node.bnd" +#include "NodeList.bnd" +#include "Element.bnd" +#include "HTMLCollection.bnd" + +/* specialisations of html_element */ +init HTMLUnknownElement("struct dom_html_element *" html_unknown_element::html_element); +init HTMLFontElement("struct dom_html_element *" html_font_element::html_element); +init HTMLDirectoryElement("struct dom_html_element *" html_directory_element::html_element); +init HTMLFrameElement("struct dom_html_element *" html_frame_element::html_element); +init HTMLFrameSetElement("struct dom_html_element *" html_frame_set_element::html_element); +init HTMLMarqueeElement("struct dom_html_element *" html_marquee_element::html_element); +init HTMLAppletElement("struct dom_html_element *" html_applet_element::html_element); +init HTMLCanvasElement("struct dom_html_element *" html_canvas_element::html_element); +init HTMLTemplateElement("struct dom_html_element *" html_template_element::html_element); +init HTMLScriptElement("struct dom_html_element *" html_script_element::html_element); +init HTMLDialogElement("struct dom_html_element *" html_dialog_element::html_element); +init HTMLMenuItemElement("struct dom_html_element *" html_menu_item_element::html_element); +init HTMLMenuElement("struct dom_html_element *" html_menu_element::html_element); +init HTMLDetailsElement("struct dom_html_element *" html_details_element::html_element); +init HTMLLegendElement("struct dom_html_element *" html_legend_element::html_element); +init HTMLFieldSetElement("struct dom_html_element *" html_field_set_element::html_element); +init HTMLMeterElement("struct dom_html_element *" html_meter_element::html_element); +init HTMLProgressElement("struct dom_html_element *" html_progress_element::html_element); +init HTMLOutputElement("struct dom_html_element *" html_output_element::html_element); +init HTMLKeygenElement("struct dom_html_element *" html_keygen_element::html_element); +init HTMLTextAreaElement("struct dom_html_element *" html_text_area_element::html_element); +init HTMLOptionElement("struct dom_html_element *" html_option_element::html_element); +init HTMLOptGroupElement("struct dom_html_element *" html_opt_group_element::html_element); +init HTMLDataListElement("struct dom_html_element *" html_data_list_element::html_element); +init HTMLSelectElement("struct dom_html_element *" html_select_element::html_element); +init HTMLButtonElement("struct dom_html_element *" html_button_element::html_element); +init HTMLInputElement("struct dom_html_element *" html_input_element::html_element); +init HTMLLabelElement("struct dom_html_element *" html_label_element::html_element); +init HTMLFormElement("struct dom_html_element *" html_form_element::html_element); +init HTMLTableCellElement("struct dom_html_element *" html_table_cell_element::html_element); +init HTMLTableRowElement("struct dom_html_element *" html_table_row_element::html_element); +init HTMLTableSectionElement("struct dom_html_element *" html_table_section_element::html_element); +init HTMLTableColElement("struct dom_html_element *" html_table_col_element::html_element); +init HTMLTableCaptionElement("struct dom_html_element *" html_table_caption_element::html_element); +init HTMLTableElement("struct dom_html_element *" html_table_element::html_element); +init HTMLAreaElement("struct dom_html_element *" html_area_element::html_element); +init HTMLMapElement("struct dom_html_element *" html_map_element::html_element); +init HTMLMediaElement("struct dom_html_element *" html_media_element::html_element); +init HTMLTrackElement("struct dom_html_element *" html_track_element::html_element); +init HTMLParamElement("struct dom_html_element *" html_param_element::html_element); +init HTMLObjectElement("struct dom_html_element *" html_object_element::html_element); +init HTMLEmbedElement("struct dom_html_element *" html_embed_element::html_element); +init HTMLIFrameElement("struct dom_html_element *" html_i_frame_element::html_element); +init HTMLImageElement("struct dom_html_element *" html_image_element::html_element); +init HTMLSourceElement("struct dom_html_element *" html_source_element::html_element); +init HTMLPictureElement("struct dom_html_element *" html_picture_element::html_element); +init HTMLModElement("struct dom_html_element *" html_mod_element::html_element); +init HTMLBRElement("struct dom_html_element *" html_br_element::html_element); +init HTMLSpanElement("struct dom_html_element *" html_span_element::html_element); +init HTMLTimeElement("struct dom_html_element *" html_time_element::html_element); +init HTMLDataElement("struct dom_html_element *" html_data_element::html_element); +init HTMLAnchorElement("struct dom_html_element *" html_anchor_element::html_element); +init HTMLDivElement("struct dom_html_element *" html_div_element::html_element); +init HTMLDListElement("struct dom_html_element *" html_d_list_element::html_element); +init HTMLLIElement("struct dom_html_element *" html_li_element::html_element); +init HTMLUListElement("struct dom_html_element *" html_u_list_element::html_element); +init HTMLOListElement("struct dom_html_element *" html_o_list_element::html_element); +init HTMLQuoteElement("struct dom_html_element *" html_quote_element::html_element); +init HTMLPreElement("struct dom_html_element *" html_pre_element::html_element); +init HTMLHRElement("struct dom_html_element *" html_hr_element::html_element); +init HTMLParagraphElement("struct dom_html_element *" html_paragraph_element::html_element); +init HTMLHeadingElement("struct dom_html_element *" html_heading_element::html_element); +init HTMLBodyElement("struct dom_html_element *" html_body_element::html_element); +init HTMLStyleElement("struct dom_html_element *" html_style_element::html_element); +init HTMLMetaElement("struct dom_html_element *" html_meta_element::html_element); +init HTMLLinkElement("struct dom_html_element *" html_link_element::html_element); +init HTMLBaseElement("struct dom_html_element *" html_base_element::html_element); +init HTMLTitleElement("struct dom_html_element *" html_title_element::html_element); +init HTMLHeadElement("struct dom_html_element *" html_head_element::html_element); +init HTMLHtmlElement("struct dom_html_element *" html_html_element::html_element); + +/* specialisations of HTMLTableCellElement */ +init HTMLTableHeaderCellElement("struct dom_html_element *" html_table_header_cell_element::html_table_cell_element); +init HTMLTableDataCellElement("struct dom_html_element *" html_table_data_cell_element::html_table_cell_element); + +/* specialisations of html_media_element */ +init HTMLAudioElement("struct dom_html_element *" html_audio_element::html_media_element); +init HTMLVideoElement("struct dom_html_element *" html_video_element::html_media_element); + +init HTMLElement("struct dom_html_element *" html_element::element); + +init Text("struct dom_node_text *" text::character_data); +init Comment("struct dom_node_comment *" comment::character_data); +init ProcessingInstruction("struct dom_node_text *" text::character_data); + +init XMLDocument("struct dom_document *" document); + +init CharacterData("struct dom_node_character_data *" character_data::node); +init DocumentFragment("struct dom_document *" document::node); +init DocumentType("struct dom_document *" document::node); + +init PropertyNodeList("struct dom_nodelist *" nodes); +init RadioNodeList("struct dom_nodelist *" nodes); + +init HTMLAllCollection("struct dom_html_collection *" coll); +init HTMLFormControlsCollection("struct dom_html_collection *" coll); +init HTMLOptionsCollection("struct dom_html_collection *" coll); +init HTMLPropertiesCollection("struct dom_html_collection *" coll); + + -- cgit v1.2.3