summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile6
-rw-r--r--javascript/Makefile16
-rw-r--r--javascript/WebIDL/dom.idl8
-rw-r--r--javascript/dukky.c89
-rw-r--r--javascript/dukky.h17
-rw-r--r--javascript/duktape/Node.bnd55
-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.bnd148
9 files changed, 228 insertions, 111 deletions
diff --git a/Makefile b/Makefile
index 8399024e8..d03062147 100644
--- a/Makefile
+++ b/Makefile
@@ -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);
+