diff options
author | Vincent Sanders <vince@kyllikki.org> | 2015-08-02 21:49:33 +0100 |
---|---|---|
committer | Vincent Sanders <vince@kyllikki.org> | 2015-08-02 21:49:33 +0100 |
commit | ba214995f8d259790a9eab683a227403b2d3608d (patch) | |
tree | 527d9ab96d720e7fc8be8f349af4e727ba601aa3 | |
parent | 41adda891da5f692c186a96edd530dd8fdc4d5f5 (diff) | |
download | netsurf-ba214995f8d259790a9eab683a227403b2d3608d.tar.gz netsurf-ba214995f8d259790a9eab683a227403b2d3608d.tar.bz2 |
update to use nsgenbind bindings
-rw-r--r-- | Makefile | 6 | ||||
-rw-r--r-- | javascript/Makefile | 16 | ||||
-rw-r--r-- | javascript/WebIDL/dom.idl | 8 | ||||
-rw-r--r-- | javascript/dukky.c | 89 | ||||
-rw-r--r-- | javascript/dukky.h | 17 | ||||
-rw-r--r-- | javascript/duktape/Node.bnd | 55 | ||||
-rw-r--r-- | javascript/duktape/duktape.c (renamed from javascript/duktape.c) | 0 | ||||
-rw-r--r-- | javascript/duktape/duktape.h (renamed from javascript/duktape.h) | 0 | ||||
-rw-r--r-- | javascript/duktape/netsurf.bnd | 148 |
9 files changed, 228 insertions, 111 deletions
@@ -527,17 +527,17 @@ CXXFLAGS += -DNETSURF_HOMEPAGE=\"$(NETSURF_HOMEPAGE)\" $(OBJROOT)/created: $(VQ)echo " MKDIR: $(OBJROOT)" - $(Q)$(MKDIR) $(OBJROOT) + $(Q)$(MKDIR) -p $(OBJROOT) $(Q)$(TOUCH) $(OBJROOT)/created $(DEPROOT)/created: $(OBJROOT)/created $(VQ)echo " MKDIR: $(DEPROOT)" - $(Q)$(MKDIR) $(DEPROOT) + $(Q)$(MKDIR) -p $(DEPROOT) $(Q)$(TOUCH) $(DEPROOT)/created $(TOOLROOT)/created: $(OBJROOT)/created $(VQ)echo " MKDIR: $(TOOLROOT)" - $(Q)$(MKDIR) $(TOOLROOT) + $(Q)$(MKDIR) -p $(TOOLROOT) $(Q)$(TOUCH) $(TOOLROOT)/created CLEANS := diff --git a/javascript/Makefile b/javascript/Makefile index 3d3e2733f..eaeb8b9d9 100644 --- a/javascript/Makefile +++ b/javascript/Makefile @@ -61,12 +61,18 @@ $(eval $(foreach V,$(filter JSAPI_BINDING_%,$(.VARIABLES)),$(call convert_jsapi_ else ifeq ($(NETSURF_USE_DUKTAPE),YES) -S_DUKKY := event_target.c window.c node.c document.c \ - element.c html_element.c html_unknown_element.c \ - character_data.c text.c comment.c html_collection.c node_list.c \ - html_br_element.c +JUNK:=$(shell mkdir -p $(OBJROOT)/duktape) +JUNK:=$(shell nsgenbind -v -g -D -I javascript/WebIDL javascript/duktape/netsurf.bnd $(OBJROOT)/duktape) +include $(OBJROOT)/duktape/Makefile -S_JAVASCRIPT += dukky.c duktape.c content.c fetcher.c $(addprefix duktape/,$(S_DUKKY)) +S_JSAPI_BINDING:=$(addprefix $(OBJROOT)/duktape/,$(NSGENBIND_SOURCES)) + +#S_DUKKY := event_target.c window.c node.c document.c \ +# element.c html_element.c html_unknown_element.c \ +# character_data.c text.c comment.c html_collection.c node_list.c \ +# html_br_element.c + +S_JAVASCRIPT += dukky.c content.c fetcher.c duktape/duktape.c else S_JAVASCRIPT += none.c fetcher.c diff --git a/javascript/WebIDL/dom.idl b/javascript/WebIDL/dom.idl index 6a4a95eae..1c9e75bd8 100644 --- a/javascript/WebIDL/dom.idl +++ b/javascript/WebIDL/dom.idl @@ -107,10 +107,10 @@ DocumentType implements ChildNode; Element implements ChildNode; CharacterData implements ChildNode; -class Elements extends Array { - Element? query(DOMString relativeSelectors); - Elements queryAll(DOMString relativeSelectors); -}; +//class Elements extends Array { +// Element? query(DOMString relativeSelectors); +// Elements queryAll(DOMString relativeSelectors); +//}; [Exposed=Window] interface NodeList { diff --git a/javascript/dukky.c b/javascript/dukky.c index 0e9e39a9a..35e2c60eb 100644 --- a/javascript/dukky.c +++ b/javascript/dukky.c @@ -30,7 +30,9 @@ #include "javascript/js.h" #include "javascript/content.h" -#include "duktape.h" +#include "duktape/binding.h" + +#include "duktape/duktape.h" #include "dukky.h" #include <dom/dom.h> @@ -89,49 +91,7 @@ duk_ret_t dukky_create_object(duk_context *ctx, const char *name, int args) return DUK_EXEC_SUCCESS; } -static duk_ret_t -dukky_to_string(duk_context *ctx) -{ - /* */ - duk_push_this(ctx); - /* this */ - duk_get_prototype(ctx, -1); - /* this proto */ - duk_get_prop_string(ctx, -1, MAGIC(klass_name)); - /* this proto classname */ - duk_push_string(ctx, "[object "); - /* this proto classname str */ - duk_insert(ctx, -2); - /* this proto str classname */ - duk_push_string(ctx, "]"); - /* this proto str classname str */ - duk_concat(ctx, 3); - /* this proto str */ - return 1; -} -static duk_ret_t dukky_create_prototype(duk_context *ctx, - duk_safe_call_function genproto, - const char *proto_name, - const char *klass_name) -{ - duk_int_t ret; - duk_push_object(ctx); - if ((ret = duk_safe_call(ctx, genproto, 1, 1)) != DUK_EXEC_SUCCESS) { - duk_pop(ctx); - LOG("Failed to register prototype for %s", proto_name + 2); - return ret; - } - /* top of stack is the ready prototype, inject it */ - duk_push_string(ctx, klass_name); - duk_put_prop_string(ctx, -2, MAGIC(klass_name)); - duk_push_c_function(ctx, dukky_to_string, 0); - duk_put_prop_string(ctx, -2, "toString"); - duk_push_string(ctx, "toString"); - duk_def_prop(ctx, -2, DUK_DEFPROP_HAVE_ENUMERABLE); - duk_put_global_string(ctx, proto_name); - return 0; -} duk_bool_t dukky_push_node_stacked(duk_context *ctx) @@ -287,32 +247,6 @@ dukky_push_node(duk_context *ctx, struct dom_node *node) return dukky_push_node_stacked(ctx); } -duk_bool_t -dukky_instanceof(duk_context *ctx, const char *klass) -{ - /* ... ??? */ - if (!duk_check_type(ctx, -1, DUK_TYPE_OBJECT)) return false; - /* ... obj */ - duk_get_global_string(ctx, PROTO_MAGIC); - /* ... obj protos */ - duk_get_prop_string(ctx, -1, klass); - /* ... obj protos goalproto */ - duk_get_prototype(ctx, -3); - /* ... obj protos goalproto proto? */ - while (!duk_is_undefined(ctx, -1)) { - if (duk_strict_equals(ctx, -1, -2)) { - duk_pop_3(ctx); - return true; - } - duk_get_prototype(ctx, -1); - /* ... obj protos goalproto proto proto? */ - duk_replace(ctx, -2); - /* ... obj protos goalproto proto? */ - } - duk_pop_3(ctx); - /* ... obj */ - return false; -} /**************************************** js.h ******************************/ @@ -352,21 +286,8 @@ jscontext *js_newcontext(int timeout, jscallback *cb, void *cbctx) duk_put_prop_string(ctx, -2, "protos"); duk_put_global_string(ctx, PROTO_MAGIC); /* Create prototypes here? */ - DUKKY_NEW_PROTOTYPE(event_target, EVENTTARGET, "EventTarget"); - DUKKY_NEW_PROTOTYPE(node, NODE, "Node"); - DUKKY_NEW_PROTOTYPE(character_data, CHARACTERDATA, "CharacterData"); - DUKKY_NEW_PROTOTYPE(text, TEXT, "Text"); - DUKKY_NEW_PROTOTYPE(comment, COMMENT, "Comment"); - DUKKY_NEW_PROTOTYPE(document, DOCUMENT, "Document"); - DUKKY_NEW_PROTOTYPE(element, ELEMENT, "Element"); - DUKKY_NEW_PROTOTYPE(html_element, HTMLELEMENT, "HTMLElement"); - DUKKY_NEW_PROTOTYPE(html_unknown_element, HTMLUNKNOWNELEMENT, "HTMLUnknownElement"); - DUKKY_NEW_PROTOTYPE(html_br_element, HTMLBRELEMENT, "HTMLBRElement"); - DUKKY_NEW_PROTOTYPE(html_collection, HTMLCOLLECTION, "HTMLCollection"); - DUKKY_NEW_PROTOTYPE(node_list, NODELIST, "NodeList"); - - /* Finally window's prototype */ - DUKKY_NEW_PROTOTYPE(window, WINDOW, "Window"); + dukky_create_prototypes(ctx); + return ret; } diff --git a/javascript/dukky.h b/javascript/dukky.h index bbcf9f38f..acc65af2d 100644 --- a/javascript/dukky.h +++ b/javascript/dukky.h @@ -3,18 +3,6 @@ #ifndef DUKKY_H #define DUKKY_H -#include "duktape.h" - -#define _MAGIC(S) ("\xFF\xFF" "NETSURF_DUKTAPE_" S) -#define MAGIC(S) _MAGIC(#S) -#define PROTO_MAGIC MAGIC(PROTOTYPES) -#define PRIVATE_MAGIC MAGIC(PRIVATE) -#define INIT_MAGIC MAGIC(INIT) -#define NODE_MAGIC MAGIC(NODE_MAP) -#define _PROTO_NAME(K) _MAGIC("PROTOTYPE_" K) -#define PROTO_NAME(K) _PROTO_NAME(#K) -#define _PROP_NAME(K,V) _MAGIC(K "_PROPERTY_" V) -#define PROP_NAME(K,V) _PROP_NAME(#K,#V) #define DUKKY_FUNC_T(t,e) dukky_##t##_##e #define DUKKY_FUNC(t,e) duk_ret_t DUKKY_FUNC_T(t,e) (duk_context *ctx) @@ -125,11 +113,10 @@ static inline void *dukky_get_private(duk_context *ctx, int idx) DUKKY_FUNC_INIT(klass, ##init); \ DUKKY_FUNC_FINI(klass) -#include "duktape/private.h" -#include "duktape/prototypes.h" duk_ret_t dukky_create_object(duk_context *ctx, const char *name, int args); duk_bool_t dukky_push_node_stacked(duk_context *ctx); duk_bool_t dukky_push_node(duk_context *ctx, struct dom_node *node); -duk_bool_t dukky_instanceof(duk_context *ctx, const char *klass); + + #endif diff --git a/javascript/duktape/Node.bnd b/javascript/duktape/Node.bnd new file mode 100644 index 000000000..dcb02aa80 --- /dev/null +++ b/javascript/duktape/Node.bnd @@ -0,0 +1,55 @@ +/* Node 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 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; + + DUKKY_SAFE_GET_ANOTHER(other,node,0); + + 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); +%} + +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; + } +%} diff --git a/javascript/duktape.c b/javascript/duktape/duktape.c index 44324404e..44324404e 100644 --- a/javascript/duktape.c +++ b/javascript/duktape/duktape.c diff --git a/javascript/duktape.h b/javascript/duktape/duktape.h index 4fe4cddcf..4fe4cddcf 100644 --- a/javascript/duktape.h +++ b/javascript/duktape/duktape.h diff --git a/javascript/duktape/netsurf.bnd b/javascript/duktape/netsurf.bnd new file mode 100644 index 000000000..d50275fe1 --- /dev/null +++ b/javascript/duktape/netsurf.bnd @@ -0,0 +1,148 @@ +/* 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 + */ + +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 <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 + */ + +#include <dom/dom.h> + +#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 "Node.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 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); +init Document("struct dom_document *" document::node); + |