summaryrefslogtreecommitdiff
path: root/javascript/jsapi
diff options
context:
space:
mode:
Diffstat (limited to 'javascript/jsapi')
-rw-r--r--javascript/jsapi/binding.h99
-rw-r--r--javascript/jsapi/console.bnd59
-rw-r--r--javascript/jsapi/console.c152
-rw-r--r--javascript/jsapi/document.c110
-rw-r--r--javascript/jsapi/dom.bnd26
-rw-r--r--javascript/jsapi/domexception.c106
-rw-r--r--javascript/jsapi/element.c99
-rw-r--r--javascript/jsapi/eventtarget.c76
-rw-r--r--javascript/jsapi/example.bnd229
-rw-r--r--javascript/jsapi/htmldocument.bnd40
-rw-r--r--javascript/jsapi/htmldocument.c262
-rw-r--r--javascript/jsapi/htmlelement.bnd51
-rw-r--r--javascript/jsapi/htmlelement.c230
-rw-r--r--javascript/jsapi/jsclass.h39
-rw-r--r--javascript/jsapi/location.bnd53
-rw-r--r--javascript/jsapi/navigator.bnd120
-rw-r--r--javascript/jsapi/navigator.c206
-rw-r--r--javascript/jsapi/node.c299
-rw-r--r--javascript/jsapi/window.bnd167
-rw-r--r--javascript/jsapi/window.c327
20 files changed, 844 insertions, 1906 deletions
diff --git a/javascript/jsapi/binding.h b/javascript/jsapi/binding.h
new file mode 100644
index 000000000..68ab6d1ed
--- /dev/null
+++ b/javascript/jsapi/binding.h
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2012 Vincent Sanders <vince@netsurf-browser.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** \file
+ * spidermonkey jsapi class bindings
+ */
+
+#ifndef _NETSURF_JAVASCRIPT_JSAPI_BINDING_H_
+#define _NETSURF_JAVASCRIPT_JSAPI_BINDING_H_
+
+
+#include "render/html_internal.h"
+
+JSObject *jsapi_InitClass_Window(JSContext *cx, JSObject *parent);
+
+/** Create a new javascript window object
+ *
+ * @param cx The javascript context.
+ * @param parent The parent object or NULL for new global
+ * @param win_priv The private context to set on the object
+ * @return new javascript object or NULL on error
+ */
+JSObject *jsapi_new_Window(JSContext *cx,
+ JSObject *window,
+ JSObject *parent,
+ struct browser_window *bw,
+ html_content *htmlc);
+
+JSObject *jsapi_InitClass_Location(JSContext *cx, JSObject *parent);
+JSObject *jsapi_new_Location(JSContext *cx,
+ JSObject *window,
+ JSObject *parent,
+ struct browser_window *bw);
+
+
+JSObject *jsapi_InitClass_Document(JSContext *cx, JSObject *parent);
+
+/** Create a new javascript document object
+ *
+ * @param cx The javascript context.
+ * @param parent The parent object, usually a global window object
+ * @param doc_priv The private context to set on the object
+ * @return new javascript object or NULL on error
+ */
+JSObject *jsapi_new_Document(JSContext *cx,
+ JSObject *proto,
+ JSObject *parent,
+ dom_document *node,
+ struct html_content *htmlc);
+
+JSObject *jsapi_InitClass_Console(JSContext *cx, JSObject *parent);
+/** Create a new javascript console object
+ *
+ * @param cx The javascript context.
+ * @param parent The parent object, usually a global window object
+ * @return new javascript object or NULL on error
+ */
+JSObject *jsapi_new_Console(JSContext *cx, JSObject *prototype, JSObject *parent);
+
+
+JSObject *jsapi_InitClass_Navigator(JSContext *cx, JSObject *parent);
+/** Create a new javascript navigator object
+ *
+ * @param cx The javascript context.
+ * @param parent The parent object, usually a global window object
+ * @return new javascript object or NULL on error
+ */
+JSObject *jsapi_new_Navigator(JSContext *cx, JSObject *proto, JSObject *parent);
+
+JSObject *jsapi_InitClass_HTMLElement(JSContext *cx, JSObject *parent);
+/** Create a new javascript element object
+ *
+ * @param cx The javascript context.
+ * @param parent The parent object, usually a global window object
+ * @param doc_priv The private context to set on the object
+ * @return new javascript object or NULL on error
+ */
+JSObject *jsapi_new_HTMLElement(JSContext *cx,
+ JSObject *prototype,
+ JSObject *parent,
+ dom_element *node,
+ struct html_content *htmlc);
+
+#endif
diff --git a/javascript/jsapi/console.bnd b/javascript/jsapi/console.bnd
new file mode 100644
index 000000000..6aef9dcb8
--- /dev/null
+++ b/javascript/jsapi/console.bnd
@@ -0,0 +1,59 @@
+/* Binding to generate Console interface
+ *
+ * Copyright 2012 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
+ */
+
+webidlfile "console.idl";
+
+hdrcomment "Copyright 2012 Vincent Sanders <vince@netsurf-browser.org>";
+hdrcomment "This file is part of NetSurf, http://www.netsurf-browser.org/";
+hdrcomment "Released under the terms of the MIT License,";
+hdrcomment " http://www.opensource.org/licenses/mit-license";
+
+preamble %{
+
+#include "utils/config.h"
+#include "utils/log.h"
+
+#include "javascript/jsapi.h"
+#include "javascript/jsapi/binding.h"
+
+%}
+
+binding navigator {
+ type js_libdom; /* the binding type */
+
+ interface Console; /* Web IDL interface to generate */
+
+ /* private members:
+ * - stored in private context structure.
+ * - passed as parameters to constructor and stored automatically.
+ * - are *not* considered for property getters/setters.
+ *
+ * internal members:
+ * - value stored in private context structure
+ * - not passed to constructor
+ * - must be instantiated by constructor
+ * - are considered for property getters/setters.
+ */
+ internal "void *" gui_console;
+}
+
+operation log %{
+ unsigned int argloop;
+ JSString *jsstr;
+ unsigned long jsstrlen;
+ char *txt;
+
+ for (argloop = 0; argloop < argc; argloop++) {
+ jsstr = JS_ValueToString(cx, argv[argloop]);
+
+ JSString_to_char(jsstr, txt, jsstrlen);
+ LOG(("%s", txt));
+ }
+%}
diff --git a/javascript/jsapi/console.c b/javascript/jsapi/console.c
deleted file mode 100644
index 6a6d7d3c3..000000000
--- a/javascript/jsapi/console.c
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Copyright 2012 Vincent Sanders <vince@netsurf-browser.org>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#include "utils/log.h"
-
-#include "javascript/jsapi.h"
-
-static JSBool JSAPI_NATIVE(debug, JSContext *cx, uintN argc, jsval *vp)
-{
- JSAPI_SET_RVAL(cx, vp, JSVAL_VOID);
- return JS_TRUE;
-}
-
-static JSBool JSAPI_NATIVE(dir, JSContext *cx, uintN argc, jsval *vp)
-{
- JSAPI_SET_RVAL(cx, vp, JSVAL_VOID);
- return JS_TRUE;
-}
-
-static JSBool JSAPI_NATIVE(error, JSContext *cx, uintN argc, jsval *vp)
-{
- JSAPI_SET_RVAL(cx, vp, JSVAL_VOID);
- return JS_TRUE;
-}
-
-static JSBool JSAPI_NATIVE(group, JSContext *cx, uintN argc, jsval *vp)
-{
- JSAPI_SET_RVAL(cx, vp, JSVAL_VOID);
- return JS_TRUE;
-}
-
-static JSBool JSAPI_NATIVE(groupCollapsed, JSContext *cx, uintN argc, jsval *vp)
-{
- JSAPI_SET_RVAL(cx, vp, JSVAL_VOID);
- return JS_TRUE;
-}
-
-static JSBool JSAPI_NATIVE(groupEnd, JSContext *cx, uintN argc, jsval *vp)
-{
- JSAPI_SET_RVAL(cx, vp, JSVAL_VOID);
- return JS_TRUE;
-}
-
-static JSBool JSAPI_NATIVE(info, JSContext *cx, uintN argc, jsval *vp)
-{
- JSAPI_SET_RVAL(cx, vp, JSVAL_VOID);
- return JS_TRUE;
-}
-
-static JSBool JSAPI_NATIVE(log, JSContext *cx, uintN argc, jsval *vp)
-{
- unsigned int argloop;
- JSString *jsstr;
- unsigned long jsstrlen;
- char *txt;
-
- for (argloop = 0; argloop < argc; argloop++) {
- jsstr = JS_ValueToString(cx, *JSAPI_ARGV(cx, vp + argloop));
-
- JSString_to_char(jsstr, txt, jsstrlen);
- LOG(("%s", txt));
- }
-
- JSAPI_SET_RVAL(cx, vp, JSVAL_VOID);
- return JS_TRUE;
-}
-
-static JSBool JSAPI_NATIVE(time, JSContext *cx, uintN argc, jsval *vp)
-{
- JSAPI_SET_RVAL(cx, vp, JSVAL_VOID);
- return JS_TRUE;
-}
-
-static JSBool JSAPI_NATIVE(timeEnd, JSContext *cx, uintN argc, jsval *vp)
-{
- JSAPI_SET_RVAL(cx, vp, JSVAL_VOID);
- return JS_TRUE;
-}
-
-static JSBool JSAPI_NATIVE(trace, JSContext *cx, uintN argc, jsval *vp)
-{
- JSAPI_SET_RVAL(cx, vp, JSVAL_VOID);
- return JS_TRUE;
-}
-
-static JSBool JSAPI_NATIVE(warn, JSContext *cx, uintN argc, jsval *vp)
-{
- JSAPI_SET_RVAL(cx, vp, JSVAL_VOID);
- return JS_TRUE;
-}
-
-static JSFunctionSpec jsfunctions_console[] = {
- JSAPI_FS(debug, 1, 0),
- JSAPI_FS(dir, 1, 0),
- JSAPI_FS(error, 1, 0),
- JSAPI_FS(group, 1, 0),
- JSAPI_FS(groupCollapsed, 1, 0),
- JSAPI_FS(groupEnd, 1, 0),
- JSAPI_FS(info, 1, 0),
- JSAPI_FS(log, 1, 0),
- JSAPI_FS(time, 1, 0),
- JSAPI_FS(timeEnd, 1, 0),
- JSAPI_FS(trace, 1, 0),
- JSAPI_FS(warn, 1, 0),
- JSAPI_FS_END
-};
-
-static JSClass jsclass_console =
-{
- "console",
- JSCLASS_HAS_PRIVATE,
- JS_PropertyStub,
- JS_PropertyStub,
- JS_PropertyStub,
- JS_StrictPropertyStub,
- JS_EnumerateStub,
- JS_ResolveStub,
- JS_ConvertStub,
- JS_FinalizeStub,
- JSCLASS_NO_OPTIONAL_MEMBERS
-};
-
-
-JSObject *jsapi_new_console(JSContext *cx, JSObject *parent)
-{
- return JS_InitClass(cx,
- parent,
- NULL,
- &jsclass_console,
- NULL,
- 0,
- NULL,
- jsfunctions_console,
- NULL,
- NULL);
-}
diff --git a/javascript/jsapi/document.c b/javascript/jsapi/document.c
deleted file mode 100644
index 2d3bde41a..000000000
--- a/javascript/jsapi/document.c
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright 2012 Vincent Sanders <vince@netsurf-browser.org>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-/* IDL http://dvcs.w3.org/hg/domcore/raw-file/tip/Overview.html#interface-document
-
-interface Document : Node {
- readonly attribute DOMImplementation implementation;
- readonly attribute DOMString URL;
- readonly attribute DOMString documentURI;
- readonly attribute DOMString compatMode;
- readonly attribute DOMString characterSet;
- readonly attribute DOMString contentType;
-
- readonly attribute DocumentType? doctype;
- readonly attribute Element? documentElement;
- HTMLCollection getElementsByTagName(DOMString localName);
- HTMLCollection getElementsByTagNameNS(DOMString? namespace, DOMString localName);
- HTMLCollection getElementsByClassName(DOMString classNames);
- Element? getElementById(DOMString elementId);
-
- Element createElement(DOMString localName);
- Element createElementNS(DOMString? namespace, DOMString qualifiedName);
- DocumentFragment createDocumentFragment();
- Text createTextNode(DOMString data);
- Comment createComment(DOMString data);
- ProcessingInstruction createProcessingInstruction(DOMString target, DOMString data);
-
- Node importNode(Node node, optional boolean deep = true);
- Node adoptNode(Node node);
-
- Event createEvent(DOMString interface);
-
- Range createRange();
-
- // NodeFilter.SHOW_ALL = 0xFFFFFFFF
- NodeIterator createNodeIterator(Node root, optional unsigned long whatToShow = 0xFFFFFFFF, optional NodeFilter? filter = null);
- TreeWalker createTreeWalker(Node root, optional unsigned long whatToShow = 0xFFFFFFFF, optional NodeFilter? filter = null);
-
- // NEW
- void prepend((Node or DOMString)... nodes);
- void append((Node or DOMString)... nodes);
-};
-
-
- */
-
-#include "jsclass.h"
-
-#include "node.c"
-
-static JSBool JSAPI_NATIVE(getElementById, JSContext *cx, uintN argc, jsval *vp)
-{
- JSString* u16_txt;
- char *txt;
- unsigned long txtlen;
- dom_string *idstr;
- dom_element *idelement;
- struct jsclass_document_priv *document;
-
- document = JS_GetInstancePrivate(cx, JS_THIS_OBJECT(cx,vp), &JSCLASS_OBJECT, NULL);
- if (document == NULL) {
- return JS_FALSE;
- }
-
- if (document->node == NULL) {
- /* no document available, this is obviously a problem
- * for finding elements
- */
- JSAPI_SET_RVAL(cx, vp, JSVAL_NULL);
-
- return JS_TRUE;
- }
-
- if (!JS_ConvertArguments(cx, argc, JSAPI_ARGV(cx, vp), "S", &u16_txt))
- return JS_FALSE;
-
- JSString_to_char(u16_txt, txt, txtlen);
-
- dom_string_create((unsigned char*)txt, txtlen, &idstr);
-
- dom_document_get_element_by_id(document->node, idstr, &idelement);
-
- JSAPI_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(jsapi_new_element(cx, JS_GetGlobalObject(cx), document->htmlc, idelement)));
-
- return JS_TRUE;
-}
-
-#define JSAPI_FS_DOCUMENT \
- JSAPI_FS_NODE, \
- JSAPI_FS(getElementById, 1, 0) \
-
-
-#define JSAPI_PS_DOCUMENT \
- JSAPI_PS_NODE
diff --git a/javascript/jsapi/dom.bnd b/javascript/jsapi/dom.bnd
new file mode 100644
index 000000000..362c828f6
--- /dev/null
+++ b/javascript/jsapi/dom.bnd
@@ -0,0 +1,26 @@
+/* DOM bindings entries */
+
+webidlfile "dom.idl";
+
+operation getElementById %{
+ dom_string *elementId_dom;
+ dom_element *element;
+ dom_exception exc;
+
+ dom_string_create((unsigned char*)elementId, elementId_len, &elementId_dom);
+
+ exc = dom_document_get_element_by_id(private->node, elementId_dom, &element);
+ if ((exc == DOM_NO_ERR) && (element != NULL)) {
+ jsret = jsapi_new_HTMLElement(cx, NULL, NULL, element, private->htmlc);
+ }
+%}
+
+getter textContent %{
+ dom_exception exc;
+ dom_string *content;
+
+ exc = dom_node_get_text_content(private->node, &content);
+ if ((exc == DOM_NO_ERR) && (content != NULL)) {
+ jsret = JS_NewStringCopyN(cx, dom_string_data(content), dom_string_length(content));
+ }
+%}
diff --git a/javascript/jsapi/domexception.c b/javascript/jsapi/domexception.c
deleted file mode 100644
index b7c61cf45..000000000
--- a/javascript/jsapi/domexception.c
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright 2012 Vincent Sanders <vince@netsurf-browser.org>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <dom/dom.h>
-
-
-#include "javascript/jsapi.h"
-#include "utils/config.h"
-#include "render/html_internal.h"
-#include "utils/log.h"
-
-/* IDL http://dvcs.w3.org/hg/domcore/raw-file/tip/Overview.html#exception-domexception
-exception DOMException {
- const unsigned short INDEX_SIZE_ERR = 1;
- const unsigned short DOMSTRING_SIZE_ERR = 2; // historical
- const unsigned short HIERARCHY_REQUEST_ERR = 3;
- const unsigned short WRONG_DOCUMENT_ERR = 4;
- const unsigned short INVALID_CHARACTER_ERR = 5;
- const unsigned short NO_DATA_ALLOWED_ERR = 6; // historical
- const unsigned short NO_MODIFICATION_ALLOWED_ERR = 7;
- const unsigned short NOT_FOUND_ERR = 8;
- const unsigned short NOT_SUPPORTED_ERR = 9;
- const unsigned short INUSE_ATTRIBUTE_ERR = 10; // historical
- const unsigned short INVALID_STATE_ERR = 11;
- const unsigned short SYNTAX_ERR = 12;
- const unsigned short INVALID_MODIFICATION_ERR = 13;
- const unsigned short NAMESPACE_ERR = 14;
- const unsigned short INVALID_ACCESS_ERR = 15;
- const unsigned short VALIDATION_ERR = 16; // historical
- const unsigned short TYPE_MISMATCH_ERR = 17;
- const unsigned short SECURITY_ERR = 18;
- const unsigned short NETWORK_ERR = 19;
- const unsigned short ABORT_ERR = 20;
- const unsigned short URL_MISMATCH_ERR = 21;
- const unsigned short QUOTA_EXCEEDED_ERR = 22;
- const unsigned short TIMEOUT_ERR = 23;
- const unsigned short INVALID_NODE_TYPE_ERR = 24;
- const unsigned short DATA_CLONE_ERR = 25;
- unsigned short code;
-};
-
-*/
-
-static JSClass jsclass_domexception =
-{
- "DOMException",
- JSCLASS_HAS_PRIVATE,
- JS_PropertyStub,
- JS_PropertyStub,
- JS_PropertyStub,
- JS_StrictPropertyStub,
- JS_EnumerateStub,
- JS_ResolveStub,
- JS_ConvertStub,
- JS_FinalizeStub,
- JSCLASS_NO_OPTIONAL_MEMBERS
-};
-
-
-
-JSObject *
-jsapi_new_domexception(JSContext *cx,
- JSObject *parent,
- int code)
-{
- /* create element object and return it*/
- JSObject *jsdomexception;
-
- jssomexception = JS_InitClass(cx,
- parent,
- NULL,
- &jsclass_domexception,
- NULL,
- 0,
- NULL,
- NULL,
- NULL,
- NULL);
- if (jsdomexecption == NULL) {
- return NULL;
- }
-
- LOG(("setting element private to %d", code));
- /* private pointer to browsing context */
- if (JS_SetPrivate(cx, jsdomexception, code) != JS_TRUE) {
- LOG(("failed to set content"));
- return NULL;
- }
-
- return jsdomexception;
-}
diff --git a/javascript/jsapi/element.c b/javascript/jsapi/element.c
deleted file mode 100644
index d301321d9..000000000
--- a/javascript/jsapi/element.c
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright 2012 Vincent Sanders <vince@netsurf-browser.org>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-/* IDL http://dvcs.w3.org/hg/domcore/raw-file/tip/Overview.html#interface-element
-
-
-interface Element : Node {
- readonly attribute DOMString? namespaceURI;
- readonly attribute DOMString? prefix;
- readonly attribute DOMString localName;
- readonly attribute DOMString tagName;
-
- attribute DOMString id;
- attribute DOMString className;
- readonly attribute DOMTokenList classList;
-
- readonly attribute Attr[] attributes;
- DOMString? getAttribute(DOMString name);
- DOMString? getAttributeNS(DOMString? namespace, DOMString localName);
- void setAttribute(DOMString name, DOMString value);
- void setAttributeNS(DOMString? namespace, DOMString name, DOMString value);
- void removeAttribute(DOMString name);
- void removeAttributeNS(DOMString? namespace, DOMString localName);
- boolean hasAttribute(DOMString name);
- boolean hasAttributeNS(DOMString? namespace, DOMString localName);
-
- HTMLCollection getElementsByTagName(DOMString localName);
- HTMLCollection getElementsByTagNameNS(DOMString? namespace, DOMString localName);
- HTMLCollection getElementsByClassName(DOMString classNames);
-
- readonly attribute HTMLCollection children;
- readonly attribute Element? firstElementChild;
- readonly attribute Element? lastElementChild;
- readonly attribute Element? previousElementSibling;
- readonly attribute Element? nextElementSibling;
- readonly attribute unsigned long childElementCount;
-
- // NEW
- void prepend((Node or DOMString)... nodes);
- void append((Node or DOMString)... nodes);
- void before((Node or DOMString)... nodes);
- void after((Node or DOMString)... nodes);
- void replace((Node or DOMString)... nodes);
- void remove();
-};
-*/
-
-#include "jsclass.h"
-
-#include "node.c"
-
-static JSBool JSAPI_NATIVE(getAttribute, JSContext *cx, uintN argc, jsval *vp)
-{
- struct JSCLASS_TYPE *priv;
-
- priv = JS_GetInstancePrivate(cx, JS_THIS_OBJECT(cx,vp), &JSCLASS_OBJECT, NULL);
- if (priv == NULL)
- return JS_FALSE;
-
-
- JSAPI_SET_RVAL(cx, vp, JSVAL_NULL);
-
- return JS_TRUE;
-}
-
-#define JSAPI_FS_ELEMENT \
- JSAPI_FS_NODE, \
- JSAPI_FS(getAttribute, 0, 0)
-
-static JSBool JSAPI_PROPERTYGET(id, JSContext *cx, JSObject *obj, jsval *vp)
-{
- JS_SET_RVAL(cx, vp, JSVAL_NULL);
- return JS_TRUE;
-}
-
-static JSBool JSAPI_PROPERTYSET(id, JSContext *cx, JSObject *obj, jsval *vp)
-{
- return JS_FALSE;
-}
-
-#define JSAPI_PS_ELEMENT \
- JSAPI_PS_NODE, \
- JSAPI_PS(id, 0, JSPROP_ENUMERATE | JSPROP_SHARED)
diff --git a/javascript/jsapi/eventtarget.c b/javascript/jsapi/eventtarget.c
deleted file mode 100644
index e2ab6a95d..000000000
--- a/javascript/jsapi/eventtarget.c
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright 2012 Vincent Sanders <vince@netsurf-browser.org>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-/* IDL http://dvcs.w3.org/hg/domcore/raw-file/tip/Overview.html#eventtarget
-
-interface EventTarget {
- void addEventListener(DOMString type, EventListener? callback, optional boolean capture = false);
- void removeEventListener(DOMString type, EventListener? callback, optional boolean capture = false);
- boolean dispatchEvent(Event event);
-};
-*/
-
-#include "jsclass.h"
-
-static JSBool JSAPI_NATIVE(addEventListener, JSContext *cx, uintN argc, jsval *vp)
-{
- struct JSCLASS_TYPE *priv;
-
- priv = JS_GetInstancePrivate(cx, JS_THIS_OBJECT(cx,vp), &JSCLASS_OBJECT, NULL);
- if (priv == NULL)
- return JS_FALSE;
-
-
- JSAPI_SET_RVAL(cx, vp, JSVAL_VOID);
-
- return JS_TRUE;
-}
-
-static JSBool JSAPI_NATIVE(removeEventListener, JSContext *cx, uintN argc, jsval *vp)
-{
- struct JSCLASS_TYPE *priv;
-
- priv = JS_GetInstancePrivate(cx, JS_THIS_OBJECT(cx,vp), &JSCLASS_OBJECT, NULL);
- if (priv == NULL)
- return JS_FALSE;
-
-
- JSAPI_SET_RVAL(cx, vp, JSVAL_VOID);
-
- return JS_TRUE;
-}
-
-static JSBool JSAPI_NATIVE(dispatchEvent, JSContext *cx, uintN argc, jsval *vp)
-{
- struct JSCLASS_TYPE *priv;
-
- priv = JS_GetInstancePrivate(cx, JS_THIS_OBJECT(cx,vp), &JSCLASS_OBJECT, NULL);
- if (priv == NULL)
- return JS_FALSE;
-
-
- JSAPI_SET_RVAL(cx, vp, JSVAL_VOID);
-
- return JS_TRUE;
-}
-
-#define JSAPI_FS_EVENTTARGET \
- JSAPI_FS(addEventListener, 0, 0), \
- JSAPI_FS(removeEventListener, 0, 0), \
- JSAPI_FS(dispatchEvent, 0, 0)
diff --git a/javascript/jsapi/example.bnd b/javascript/jsapi/example.bnd
new file mode 100644
index 000000000..f2f81fb2d
--- /dev/null
+++ b/javascript/jsapi/example.bnd
@@ -0,0 +1,229 @@
+/* Example binding to generate Example interface
+ *
+ * The js_libdom (javascript to libdom) binding type is currently the
+ * only one implemented and this principly describes that binding.
+ *
+ * Copyright 2012 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
+ */
+
+/* additional binding fragments may be included
+ * Note: this is not preprocessed despite the #include name, the
+ * parser will simply switch input to the included file and carry on
+ * cosntructing the bindings Abstract Syntax Tree (AST)
+ */
+#include "dom.bnd"
+
+/* directive to read WebIDL file and add its contents to the webidl AST */
+webidlfile "html.idl";
+
+/* The hdrcomment are added into the geenrated output comment header */
+hdrcomment "Copyright 2012 Vincent Sanders <vince@netsurf-browser.org>";
+hdrcomment "This file is part of NetSurf, http://www.netsurf-browser.org/";
+hdrcomment "Released under the terms of the MIT License,";
+hdrcomment " http://www.opensource.org/licenses/mit-license";
+
+/* the preamble block is copied verbatum into the generated output
+ *
+ * This can be used for includes, comments or whatever else is desired
+ */
+preamble %{
+
+#include <dom/dom.h>
+
+#include "utils/config.h"
+#include "utils/log.h"
+
+#include "javascript/jsapi.h"
+#include "javascript/jsapi/binding.h"
+
+%}
+
+/* this block describes the binding to be generated
+ *
+ * Depending on the type of binding being generated multiple blocks
+ * may be allowed.
+ *
+ * Note: the js_libdom (javascript to libdom) binding as currently
+ * implemented only allows for a single binding per file, this may
+ * be improved in future.
+ */
+binding example {
+ type js_libdom; /* the binding type */
+
+ interface Navigator; /* The WebIDL interface to generate a binding for */
+
+ /* private members:
+ * - stored in private context structure.
+ * - passed as parameters to constructor and stored automatically.
+ * - are *not* considered for property getters/setters.
+ */
+ private "dom_document *" node;
+
+ /* internal members:
+ * - value stored in private context structure
+ * - not passed to constructor
+ * - must be instantiated by constructor
+ * - are considered for property getters/setters.
+ */
+ internal "void *" fluff;
+
+}
+
+/* operation implementation code.
+ *
+ * The body is copied verbatum into operation binding
+ *
+ * several values are generated automatically:
+ *
+ * - The generated operations use a macro to create a JSNative JSAPI
+ * callback. The interface allows a uniform interface despite the
+ * evolution of the interface over differing spidermonkey versions.
+ *
+ * - The above implies the javascript context is in a variable called cx
+ *
+ * - If private or internal binding members are present they may be
+ * accessed through a structure named "private"
+ *
+ * - if there are arguemnts they may be accesed via an argc/argv jsval
+ * vector.
+ *
+ * - Arguments are automatically converted into c variables (named as
+ * per the WebIDL names.
+ *
+ * - Return values (excepting void return types where its omitted) are
+ * always named "retval" and are of the appropriate c type. The
+ * initial value is set appropriately.
+ */
+operation foo %{
+ retval = JS_NewStringCopyN(cx, "foo", SLEN("foo"));
+%}
+
+/* property getter implementation code.
+ *
+ * The body is copied verbatum into property getter binding
+ *
+ * several values are generated automatically:
+ *
+ * - The generated operations use a macro to create a JSPropertyOp
+ * JSAPI callback. The interface allows a uniform interface despite
+ * the evolution of the interface over differing spidermonkey
+ * versions.
+ *
+ * - The above implies the javascript context is available in a
+ * variable called "cx".
+ *
+ * - If private or internal binding members are present they may be
+ * accessed through a structure named "private"
+ *
+ * - Return values (void on a getter is not possible) are always named
+ * "retval" and are of the appropriate c type. The initial value is
+ * set appropriately.
+ *
+ * - If the getter is omitted altogether but an internal or private
+ * value of the same name appears in the private structure a getter
+ * is automatically constructed to return that value.
+ */
+getter bar %{
+ retval = JS_NewStringCopyN(cx, "bar", SLEN("bar"));
+%}
+
+/* property setter implementation code.
+ *
+ * The body is copied verbatum into property getter binding
+ *
+ * several values are generated automatically:
+ *
+ * - The generated operations use a macro to create a JSPropertyOp
+ * JSAPI callback. The interface allows a uniform interface despite
+ * the evolution of the interface over differing spidermonkey
+ * versions.
+ *
+ * - The above implies the javascript context is available in a
+ * variable called "cx".
+ *
+ * - If private or internal binding members are present they may be
+ * accessed through a structure named "private"
+ *
+ * - Value to set is placed in a c variable named "setval" of the
+ * appropriate type.
+ *
+ * - Return value, named retval" is a boolean (default true) which
+ * indicates if the set was performed.
+ *
+ * - If the setter is omitted altogether but an internal or private
+ * value of the same name appears in the private structure a setter
+ * is automatically constructed to assign that value.
+ */
+setter baz %{
+ printf("%s\n", setval);
+%}
+
+/* implementation of the class initilisation
+ *
+ * This allows the default JS_InitClass to be overriden - currently
+ * only used for the window (global) object to cause all the other class
+ * initialisors to be called.
+ *
+ * function prototype is:
+ * JSObject *jsapi_InitClass_HTMLElement(JSContext *cx, JSObject *parent)
+ */
+api init %{
+ %}
+
+/* implementation of the c instance creation
+ *
+ * This allows the overriding of the construction of an interface instance.
+ *
+ * The body is copied verbatum and must return the new object in the
+ * "newobject" variable.
+ *
+ * The base prototype is
+ * JSObject *jsapi_new_HTMLElement(JSContext *cx, JSObject *prototype, JSObject *parent, ...)
+ * The varadic elements are private variables as specified in the binding
+ *
+ * If there are private or internal values the private struct is
+ * constructed and instantiated. The struct is available during the
+ * new function and is automatically attached as the private value to
+ * the object.
+ *
+ * The default implemenattion simply calls JS_NewObject()
+ *
+ * Note this does *not* rely upon (or even call) the instances
+ * javascript constructor allowing the c code to create objects that
+ * cannot be instantiated from javascript.
+ *
+ */
+api new %{
+ %}
+
+/* additional code in the instance finalise operation.
+ *
+ * The body is copied verbatum into the output
+ *
+ * Prototype is
+ * void jsclass_finalize(JSContext *cx, JSObject *obj)
+ *
+ * private is available (if appropriate) and freed after the body
+ */
+api finalise %{
+ %}
+
+/* resolver code
+ *
+ * A resolver is only generated if this api is provided. This is a
+ * JSResolveOp with JSCLASS_NEW_RESOLVE specified and must provide a
+ * complete implementation.
+ *
+ * The body is copied verbatum into the output
+ *
+ * Prototype is:
+ * JSBool jsclass_resolve(JSContext *cx, JSObject *obj, jsval id, uintN flags, JSObject **objp)
+ *
+ */
+api resolve %{
+ %}
diff --git a/javascript/jsapi/htmldocument.bnd b/javascript/jsapi/htmldocument.bnd
new file mode 100644
index 000000000..c90114162
--- /dev/null
+++ b/javascript/jsapi/htmldocument.bnd
@@ -0,0 +1,40 @@
+/* Binding to generate htmldocument */
+
+#include "dom.bnd"
+
+webidlfile "html.idl";
+
+hdrcomment "Part of NetSurf Project";
+
+preamble %{
+
+#include <dom/dom.h>
+
+#include "utils/config.h"
+#include "utils/log.h"
+
+#include "javascript/jsapi.h"
+#include "javascript/jsapi/binding.h"
+
+%}
+
+operation write %{
+ LOG(("content %p parser %p writing %s",
+ private->htmlc, private->htmlc->parser, text));
+
+ if (private->htmlc->parser != NULL) {
+ dom_hubbub_parser_insert_chunk(private->htmlc->parser, (uint8_t *)text, text_len);
+ }
+%}
+
+binding document {
+ type js_libdom; /* the binding type */
+
+ /* parameters to constructor value stored in private
+ * context structure.
+ */
+ private "dom_document *" node;
+ private "struct html_content *" htmlc;
+
+ interface Document; /* Web IDL interface to generate */
+}
diff --git a/javascript/jsapi/htmldocument.c b/javascript/jsapi/htmldocument.c
deleted file mode 100644
index 8b38acd4d..000000000
--- a/javascript/jsapi/htmldocument.c
+++ /dev/null
@@ -1,262 +0,0 @@
-/*
- * Copyright 2012 Vincent Sanders <vince@netsurf-browser.org>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <dom/dom.h>
-
-#include "utils/config.h"
-#include "utils/log.h"
-
-#include "javascript/jsapi.h"
-
-/* IDL http://www.whatwg.org/specs/web-apps/current-work/#the-document-object
-
-[OverrideBuiltins]
-partial interface Document {
- // resource metadata management
- [PutForwards=href] readonly attribute Location? location;
- attribute DOMString domain;
- readonly attribute DOMString referrer;
- attribute DOMString cookie;
- readonly attribute DOMString lastModified;
- readonly attribute DOMString readyState;
-
- // DOM tree accessors
- getter object (DOMString name);
- attribute DOMString title;
- attribute DOMString dir;
- attribute HTMLElement? body;
- readonly attribute HTMLHeadElement? head;
- readonly attribute HTMLCollection images;
- readonly attribute HTMLCollection embeds;
- readonly attribute HTMLCollection plugins;
- readonly attribute HTMLCollection links;
- readonly attribute HTMLCollection forms;
- readonly attribute HTMLCollection scripts;
- NodeList getElementsByName(DOMString elementName);
- NodeList getItems(optional DOMString typeNames); // microdata
- readonly attribute DOMElementMap cssElementMap;
-
- // dynamic markup insertion
- Document open(optional DOMString type, optional DOMString replace);
- WindowProxy open(DOMString url, DOMString name, DOMString features, optional boolean replace);
- void close();
- void write(DOMString... text);
- void writeln(DOMString... text);
-
- // user interaction
- readonly attribute WindowProxy? defaultView;
- readonly attribute Element? activeElement;
- boolean hasFocus();
- attribute DOMString designMode;
- boolean execCommand(DOMString commandId);
- boolean execCommand(DOMString commandId, boolean showUI);
- boolean execCommand(DOMString commandId, boolean showUI, DOMString value);
- boolean queryCommandEnabled(DOMString commandId);
- boolean queryCommandIndeterm(DOMString commandId);
- boolean queryCommandState(DOMString commandId);
- boolean queryCommandSupported(DOMString commandId);
- DOMString queryCommandValue(DOMString commandId);
- readonly attribute HTMLCollection commands;
-
- // event handler IDL attributes
- attribute EventHandler onabort;
- attribute EventHandler onblur;
- attribute EventHandler oncancel;
- attribute EventHandler oncanplay;
- attribute EventHandler oncanplaythrough;
- attribute EventHandler onchange;
- attribute EventHandler onclick;
- attribute EventHandler onclose;
- attribute EventHandler oncontextmenu;
- attribute EventHandler oncuechange;
- attribute EventHandler ondblclick;
- attribute EventHandler ondrag;
- attribute EventHandler ondragend;
- attribute EventHandler ondragenter;
- attribute EventHandler ondragleave;
- attribute EventHandler ondragover;
- attribute EventHandler ondragstart;
- attribute EventHandler ondrop;
- attribute EventHandler ondurationchange;
- attribute EventHandler onemptied;
- attribute EventHandler onended;
- attribute OnErrorEventHandler onerror;
- attribute EventHandler onfocus;
- attribute EventHandler oninput;
- attribute EventHandler oninvalid;
- attribute EventHandler onkeydown;
- attribute EventHandler onkeypress;
- attribute EventHandler onkeyup;
- attribute EventHandler onload;
- attribute EventHandler onloadeddata;
- attribute EventHandler onloadedmetadata;
- attribute EventHandler onloadstart;
- attribute EventHandler onmousedown;
- attribute EventHandler onmousemove;
- attribute EventHandler onmouseout;
- attribute EventHandler onmouseover;
- attribute EventHandler onmouseup;
- attribute EventHandler onmousewheel;
- attribute EventHandler onpause;
- attribute EventHandler onplay;
- attribute EventHandler onplaying;
- attribute EventHandler onprogress;
- attribute EventHandler onratechange;
- attribute EventHandler onreset;
- attribute EventHandler onscroll;
- attribute EventHandler onseeked;
- attribute EventHandler onseeking;
- attribute EventHandler onselect;
- attribute EventHandler onshow;
- attribute EventHandler onstalled;
- attribute EventHandler onsubmit;
- attribute EventHandler onsuspend;
- attribute EventHandler ontimeupdate;
- attribute EventHandler onvolumechange;
- attribute EventHandler onwaiting;
-
- // special event handler IDL attributes that only apply to Document objects
- [LenientThis] attribute EventHandler onreadystatechange;
-};
-
- */
-
-static void jsfinalize_document(JSContext *cx, JSObject *obj);
-static JSBool jsresove_node(JSContext *cx, JSObject *obj, jsval id, uintN flags, JSObject **objp);
-
-struct jsclass_document_priv {
- struct html_content *htmlc;
- dom_document *node;
-};
-
-
-#define JSCLASS_NAME document
-
-#include "jsclass.h"
-
-static JSClass JSCLASS_OBJECT =
-{
- "document",
- JSCLASS_NEW_RESOLVE | JSCLASS_HAS_PRIVATE,
- JS_PropertyStub,
- JS_PropertyStub,
- JS_PropertyStub,
- JS_StrictPropertyStub,
- JS_EnumerateStub,
- (JSResolveOp)jsresove_node,
- JS_ConvertStub,
- jsfinalize_document,
- JSCLASS_NO_OPTIONAL_MEMBERS
-};
-
-#include "document.c"
-
-static JSBool jsresove_node(JSContext *cx, JSObject *obj, jsval id, uintN flags, JSObject **objp)
-{
- *objp = NULL;
- return JS_TRUE;
-}
-
-static JSBool JSAPI_NATIVE(write, JSContext *cx, uintN argc, jsval *vp)
-{
- JSString* u16_txt;
- char *txt;
- unsigned long length;
- struct jsclass_document_priv *document;
-
- document = JS_GetInstancePrivate(cx, JS_THIS_OBJECT(cx,vp), &JSCLASS_OBJECT, NULL);
- if (document == NULL) {
- return JS_FALSE;
- }
-
- if (!JS_ConvertArguments(cx, argc, JSAPI_ARGV(cx, vp), "S", &u16_txt)) {
- return JS_FALSE;
- }
-
- JSString_to_char(u16_txt, txt, length);
-
- LOG(("content %p parser %p writing %s",
- document->htmlc, document->htmlc->parser, txt));
- if (document->htmlc->parser != NULL) {
- dom_hubbub_parser_insert_chunk(document->htmlc->parser, (uint8_t *)txt, length);
- }
- JSAPI_SET_RVAL(cx, vp, JSVAL_VOID);
-
- return JS_TRUE;
-}
-
-static JSFunctionSpec jsfunctions_document[] = {
- JSAPI_FS_DOCUMENT,
- JSAPI_FS(write, 1, 0),
- JSAPI_FS_END
-};
-
-static JSPropertySpec jsproperties_document[] =
-{
- JSAPI_PS_DOCUMENT,
- JSAPI_PS_END
-};
-
-static void jsfinalize_document(JSContext *cx, JSObject *obj)
-{
- struct jsclass_document_priv *document;
-
- document = JS_GetInstancePrivate(cx, obj, &JSCLASS_OBJECT, NULL);
- if (document != NULL) {
- free(document);
- }
-}
-
-JSObject *jsapi_new_document(JSContext *cx, JSObject *parent, struct html_content *htmlc)
-{
- /* create document object and return it */
- JSObject *jsdocument;
- struct jsclass_document_priv *document;
-
- document = malloc(sizeof(*document));
- if (document == NULL) {
- return NULL;
- }
- document->htmlc = htmlc;
- document->node = htmlc->document;
-
- jsdocument = JS_InitClass(cx,
- parent,
- NULL,
- &JSCLASS_OBJECT,
- NULL,
- 0,
- jsproperties_document,
- jsfunctions_document,
- NULL,
- NULL);
- if (jsdocument == NULL) {
- free(document);
- return NULL;
- }
-
- LOG(("setting document private to %p", document));
- /* private pointer to browsing context */
- if (JS_SetPrivate(cx, jsdocument, document) != JS_TRUE) {
- LOG(("failed to set document private"));
- free(document);
- return NULL;
- }
-
- return jsdocument;
-}
diff --git a/javascript/jsapi/htmlelement.bnd b/javascript/jsapi/htmlelement.bnd
new file mode 100644
index 000000000..596bb7de0
--- /dev/null
+++ b/javascript/jsapi/htmlelement.bnd
@@ -0,0 +1,51 @@
+/* Binding to generate HTMLElement interface
+ *
+ * Copyright 2012 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.bnd"
+
+webidlfile "html.idl";
+
+hdrcomment "Copyright 2012 Vincent Sanders <vince@netsurf-browser.org>";
+hdrcomment "This file is part of NetSurf, http://www.netsurf-browser.org/";
+hdrcomment "Released under the terms of the MIT License,";
+hdrcomment " http://www.opensource.org/licenses/mit-license";
+
+preamble %{
+
+#include <dom/dom.h>
+
+#include "utils/config.h"
+#include "utils/log.h"
+
+#include "javascript/jsapi.h"
+#include "javascript/jsapi/binding.h"
+
+%}
+
+binding htmlelement {
+ type js_libdom; /* the binding type */
+
+ interface HTMLElement; /* Web IDL interface to generate */
+
+ /* private members:
+ * - stored in private context structure.
+ * - passed as parameters to constructor and stored automatically.
+ * - are *not* considered for property getters/setters.
+ *
+ * internal members:
+ * - value stored in private context structure
+ * - not passed to constructor
+ * - must be instantiated by constructor
+ * - are considered for property getters/setters.
+ */
+ private "dom_element *" node;
+ private "struct html_content *" htmlc;
+}
+
diff --git a/javascript/jsapi/htmlelement.c b/javascript/jsapi/htmlelement.c
deleted file mode 100644
index a7846bacd..000000000
--- a/javascript/jsapi/htmlelement.c
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- * Copyright 2012 Vincent Sanders <vince@netsurf-browser.org>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <dom/dom.h>
-
-#include "utils/config.h"
-#include "utils/log.h"
-#include "render/html_internal.h"
-
-#include "javascript/jsapi.h"
-
-/* IDL http://www.whatwg.org/specs/web-apps/current-work/#elements-in-the-dom
-
-CAUTION - innerHTML and outerHTML etc. are part of the DOM parsing
- specification but more can be found in:
-http://html5.org/specs/dom-parsing.html#extensions-to-the-element-interface
-
-interface HTMLElement : Element {
- // metadata attributes
- attribute DOMString title;
- attribute DOMString lang;
- attribute boolean translate;
- attribute DOMString dir;
- readonly attribute DOMStringMap dataset;
-
- // microdata
- attribute boolean itemScope;
- [PutForwards=value] readonly attribute DOMSettableTokenList itemType;
- attribute DOMString itemId;
- [PutForwards=value] readonly attribute DOMSettableTokenList itemRef;
- [PutForwards=value] readonly attribute DOMSettableTokenList itemProp;
- readonly attribute HTMLPropertiesCollection properties;
- attribute any itemValue;
-
- // user interaction
- attribute boolean hidden;
- void click();
- attribute long tabIndex;
- void focus();
- void blur();
- attribute DOMString accessKey;
- readonly attribute DOMString accessKeyLabel;
- attribute boolean draggable;
- [PutForwards=value] readonly attribute DOMSettableTokenList dropzone;
- attribute DOMString contentEditable;
- readonly attribute boolean isContentEditable;
- attribute HTMLMenuElement? contextMenu;
- attribute boolean spellcheck;
-
- // command API
- readonly attribute DOMString? commandType;
- readonly attribute DOMString? commandLabel;
- readonly attribute DOMString? commandIcon;
- readonly attribute boolean? commandHidden;
- readonly attribute boolean? commandDisabled;
- readonly attribute boolean? commandChecked;
-
- // styling
- readonly attribute CSSStyleDeclaration style;
-
- // event handler IDL attributes
- attribute EventHandler onabort;
- attribute EventHandler onblur;
- attribute EventHandler oncancel;
- attribute EventHandler oncanplay;
- attribute EventHandler oncanplaythrough;
- attribute EventHandler onchange;
- attribute EventHandler onclick;
- attribute EventHandler onclose;
- attribute EventHandler oncontextmenu;
- attribute EventHandler oncuechange;
- attribute EventHandler ondblclick;
- attribute EventHandler ondrag;
- attribute EventHandler ondragend;
- attribute EventHandler ondragenter;
- attribute EventHandler ondragleave;
- attribute EventHandler ondragover;
- attribute EventHandler ondragstart;
- attribute EventHandler ondrop;
- attribute EventHandler ondurationchange;
- attribute EventHandler onemptied;
- attribute EventHandler onended;
- attribute OnErrorEventHandler onerror;
- attribute EventHandler onfocus;
- attribute EventHandler oninput;
- attribute EventHandler oninvalid;
- attribute EventHandler onkeydown;
- attribute EventHandler onkeypress;
- attribute EventHandler onkeyup;
- attribute EventHandler onload;
- attribute EventHandler onloadeddata;
- attribute EventHandler onloadedmetadata;
- attribute EventHandler onloadstart;
- attribute EventHandler onmousedown;
- attribute EventHandler onmousemove;
- attribute EventHandler onmouseout;
- attribute EventHandler onmouseover;
- attribute EventHandler onmouseup;
- attribute EventHandler onmousewheel;
- attribute EventHandler onpause;
- attribute EventHandler onplay;
- attribute EventHandler onplaying;
- attribute EventHandler onprogress;
- attribute EventHandler onratechange;
- attribute EventHandler onreset;
- attribute EventHandler onscroll;
- attribute EventHandler onseeked;
- attribute EventHandler onseeking;
- attribute EventHandler onselect;
- attribute EventHandler onshow;
- attribute EventHandler onstalled;
- attribute EventHandler onsubmit;
- attribute EventHandler onsuspend;
- attribute EventHandler ontimeupdate;
- attribute EventHandler onvolumechange;
- attribute EventHandler onwaiting;
-};
-
-*/
-
-static void jsfinalize_element(JSContext *cx, JSObject *obj);
-
-struct jsclass_document_priv {
- struct html_content *htmlc;
- dom_element *node;
-};
-
-#define JSCLASS_NAME htmlelement
-
-#include "jsclass.h"
-
-static JSClass JSCLASS_OBJECT =
-{
- "HTMLElement",
- JSCLASS_HAS_PRIVATE,
- JS_PropertyStub,
- JS_PropertyStub,
- JS_PropertyStub,
- JS_StrictPropertyStub,
- JS_EnumerateStub,
- JS_ResolveStub,
- JS_ConvertStub,
- jsfinalize_element,
- JSCLASS_NO_OPTIONAL_MEMBERS
-};
-
-#include "element.c"
-
-static void jsfinalize_element(JSContext *cx, JSObject *obj)
-{
- struct jsclass_document_priv *element;
- element = JS_GetInstancePrivate(cx, obj, &JSCLASS_OBJECT, NULL);
- if (element != NULL) {
- free(element);
- }
-}
-
-
-
-static JSFunctionSpec jsfunctions_element[] = {
- JSAPI_FS_ELEMENT,
- JSAPI_FS_END
-};
-
-
-
-
-static JSPropertySpec jsproperties_element[] =
-{
- JSAPI_PS_ELEMENT,
- JSAPI_PS_END
-};
-
-JSObject *
-jsapi_new_element(JSContext *cx,
- JSObject *parent,
- struct html_content *htmlc,
- dom_element *domelement)
-{
- /* create element object and return it */
- JSObject *jselement;
- struct jsclass_document_priv *element;
-
- element = malloc(sizeof(element));
- if (element == NULL) {
- return NULL;
- }
- element->htmlc = htmlc;
- element->node = domelement;
-
- jselement = JS_InitClass(cx,
- parent,
- NULL,
- &JSCLASS_OBJECT,
- NULL,
- 0,
- jsproperties_element,
- jsfunctions_element,
- NULL,
- NULL);
- if (jselement == NULL) {
- free(element);
- return NULL;
- }
-
- LOG(("setting private to %p", element));
- /* private pointer to browsing context */
- if (JS_SetPrivate(cx, jselement, element) != JS_TRUE) {
- LOG(("failed to set private"));
- free(element);
- return NULL;
- }
-
- return jselement;
-}
diff --git a/javascript/jsapi/jsclass.h b/javascript/jsapi/jsclass.h
deleted file mode 100644
index 30b926a52..000000000
--- a/javascript/jsapi/jsclass.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2012 Vincent Sanders <vince@netsurf-browser.org>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/** \file
- * jsapi pseudo class glue.
- */
-
-#ifndef _NETSURF_JAVASCRIPT_JSAPI_JSCLASS_H_
-#define _NETSURF_JAVASCRIPT_JSAPI_JSCLASS_H_
-
-#ifndef JSCLASS_NAME
-#error "The class name must be defined"
-#endif
-
-#ifndef JSCLASS_TYPE
-#define CLASS jsclass
-#define PRIVATE priv
-#define EXPAND(a,b) PASTE(a,b)
-#define PASTE(x,y) x##_##y
-#define JSCLASS_OBJECT EXPAND(CLASS,JSCLASS_NAME)
-#define JSCLASS_TYPE EXPAND(JSCLASS_OBJECT,PRIVATE)
-#endif
-
-#endif
diff --git a/javascript/jsapi/location.bnd b/javascript/jsapi/location.bnd
new file mode 100644
index 000000000..c83fe46e3
--- /dev/null
+++ b/javascript/jsapi/location.bnd
@@ -0,0 +1,53 @@
+/* Binding to generate Location interface
+ *
+ * Copyright 2012 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.bnd"
+
+webidlfile "html.idl";
+
+hdrcomment "Copyright 2012 Vincent Sanders <vince@netsurf-browser.org>";
+hdrcomment "This file is part of NetSurf, http://www.netsurf-browser.org/";
+hdrcomment "Released under the terms of the MIT License,";
+hdrcomment " http://www.opensource.org/licenses/mit-license";
+
+preamble %{
+
+#include "desktop/browser.h"
+
+#include "utils/config.h"
+#include "utils/log.h"
+
+#include "javascript/jsapi.h"
+#include "javascript/jsapi/binding.h"
+
+%}
+
+binding location {
+ type js_libdom; /* the binding type */
+
+ interface Location; /* Web IDL interface to generate */
+
+ /* private members:
+ * - stored in private context structure.
+ * - passed as parameters to constructor and stored automatically.
+ * - are *not* considered for property getters/setters.
+ *
+ * internal members:
+ * - value stored in private context structure
+ * - not passed to constructor
+ * - must be instantiated by constructor
+ * - are considered for property getters/setters.
+ */
+ private "struct browser_window *" bw;
+}
+
+operation reload %{
+ browser_window_reload(private->bw, false);
+%}
diff --git a/javascript/jsapi/navigator.bnd b/javascript/jsapi/navigator.bnd
new file mode 100644
index 000000000..e63e9a9fd
--- /dev/null
+++ b/javascript/jsapi/navigator.bnd
@@ -0,0 +1,120 @@
+/* Binding to generate Navigator interface
+ *
+ * Copyright 2012 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.bnd"
+
+webidlfile "html.idl";
+
+hdrcomment "Copyright 2012 Vincent Sanders <vince@netsurf-browser.org>";
+hdrcomment "This file is part of NetSurf, http://www.netsurf-browser.org/";
+hdrcomment "Released under the terms of the MIT License,";
+hdrcomment " http://www.opensource.org/licenses/mit-license";
+
+preamble %{
+
+#include <assert.h>
+#include <stdlib.h>
+
+#include "desktop/netsurf.h"
+#include "desktop/options.h"
+
+#include "utils/config.h"
+#include "utils/useragent.h"
+#include "utils/log.h"
+#include "utils/utsname.h"
+
+#include "javascript/jsapi.h"
+#include "javascript/jsapi/binding.h"
+
+/*
+ * navigator properties for netsurf
+ *
+ * Property | Everyone else | NetSurf | Notes
+ * ------------+-----------------+--------------+------------------------------
+ * appCodeName | "Mozilla" | "NetSurf" | This is kinda a pointless
+ * | | | constant as everyone returns
+ * | | | "Mozilla" which is dumb
+ * ------------+-----------------+--------------+------------------------------
+ * appName | "<Browsername>" | "NetSurf" | Browsers named other than
+ * | | | "Netscape", "Mozilla",
+ * | | | "Netscape Navigator",
+ * | | | "Microsoft Internet Explorer"
+ * | | | often other browser have
+ * | | | "(compatible with Netscape)"
+ * | | | append.
+ * ------------+-----------------+--------------+------------------------------
+ * appVersion | "<ver> (<type>)"| "<ver>" | Actually just the version
+ * | | | number e.g "3.0".
+ * ------------+-----------------+--------------+------------------------------
+ * language | "<lang>" | "<lang>" | The language the frontend is
+ * | | | configured for
+ * ------------+-----------------+--------------+------------------------------
+ * platform | "<krn> <hw>" | "<krn> <hw>" | Efectively uname -s -i,
+ * | | | eg "Linux x86_64"
+ * ------------+-----------------+--------------+------------------------------
+ * userAgent | "Mozilla/5.0 (" | "NetSurf" | The usual useragent string
+ * | | | with excessive lies
+ * ------------+-----------------+--------------+------------------------------
+ */
+
+#define NAVIGATOR_APPNAME "NetSurf"
+#define NAVIGATOR_APPCODENAME "NetSurf"
+%}
+
+binding navigator {
+ type js_libdom; /* the binding type */
+
+ interface Navigator; /* Web IDL interface to generate */
+
+}
+
+getter appName %{
+ jsret = JS_NewStringCopyZ(cx, NAVIGATOR_APPNAME);
+%}
+
+getter appCodeName %{
+ jsret = JS_NewStringCopyZ(cx, NAVIGATOR_APPCODENAME);
+%}
+
+getter appVersion %{
+ jsret = JS_NewStringCopyZ(cx, netsurf_version);
+%}
+
+getter language %{
+ const char *alang = nsoption_charp(accept_language);
+
+ if (alang != NULL) {
+ jsret = JS_NewStringCopyZ(cx, alang);
+ }
+
+%}
+
+getter platform %{
+ struct utsname *cutsname;
+
+ cutsname = malloc(sizeof(struct utsname));
+
+ if ((cutsname != NULL) && (uname(cutsname) >= 0)) {
+ char *platstr;
+ int platstrlen;
+
+ platstrlen = strlen(cutsname->sysname) + strlen(cutsname->machine) + 2;
+ platstr = malloc(platstrlen);
+ if (platstr != NULL) {
+ snprintf(platstr, platstrlen, "%s %s", cutsname->sysname, cutsname->machine);
+ jsret = JS_NewStringCopyN(cx, platstr, platstrlen - 1);
+ free(platstr);
+ }
+ }
+%}
+
+getter userAgent %{
+ jsret = JS_NewStringCopyZ(cx, user_agent_string());
+%}
diff --git a/javascript/jsapi/navigator.c b/javascript/jsapi/navigator.c
deleted file mode 100644
index 88fc5351a..000000000
--- a/javascript/jsapi/navigator.c
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Copyright 2012 Vincent Sanders <vince@netsurf-browser.org>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <assert.h>
-#include <stdlib.h>
-
-#include "desktop/netsurf.h"
-#include "desktop/options.h"
-
-#include "utils/config.h"
-#include "utils/useragent.h"
-#include "utils/log.h"
-#include "utils/utsname.h"
-
-#include "javascript/jsapi.h"
-
-/*
- * navigator properties for netsurf
- *
- * Property | Everyone else | NetSurf | Notes
- * ------------+-----------------+--------------+------------------------------
- * appCodeName | "Mozilla" | "NetSurf" | This is kinda a pointless
- * | | | constant as everyone returns
- * | | | "Mozilla" which is dumb
- * ------------+-----------------+--------------+------------------------------
- * appName | "<Browsername>" | "NetSurf" | Browsers named other than
- * | | | "Netscape", "Mozilla",
- * | | | "Netscape Navigator",
- * | | | "Microsoft Internet Explorer"
- * | | | often other browser have
- * | | | "(compatible with Netscape)"
- * | | | append.
- * ------------+-----------------+--------------+------------------------------
- * appVersion | "<ver> (<type>)"| "<ver>" | Actually just the version
- * | | | number e.g "3.0".
- * ------------+-----------------+--------------+------------------------------
- * language | "<lang>" | "<lang>" | The language the frontend is
- * | | | configured for
- * ------------+-----------------+--------------+------------------------------
- * platform | "<krn> <hw>" | "<krn> <hw>" | Efectively uname -s -i,
- * | | | eg "Linux x86_64"
- * ------------+-----------------+--------------+------------------------------
- * userAgent | "Mozilla/5.0 (" | "NetSurf" | The usual useragent string
- * | | | with excessive lies
- * ------------+-----------------+--------------+------------------------------
- */
-
-static JSFunctionSpec jsfunctions_navigator[] = {
- JS_FS_END
-};
-
-#define NAVIGATOR_APPNAME "NetSurf"
-#define NAVIGATOR_APPCODENAME "NetSurf"
-
-static JSBool JSAPI_PROPERTYGET(appName, JSContext *cx, JSObject *obj, jsval *vp)
-{
- JS_SET_RVAL(cx, vp, STRING_TO_JSVAL(JS_NewStringCopyZ(cx, NAVIGATOR_APPNAME)));
- return JS_TRUE;
-}
-
-static JSBool JSAPI_PROPERTYSET(appName, JSContext *cx, JSObject *obj, jsval *vp)
-{
- assert(false);
- return JS_FALSE;
-}
-
-static JSBool JSAPI_PROPERTYGET(appCodeName, JSContext *cx, JSObject *obj, jsval *vp)
-{
- JS_SET_RVAL(cx, vp, STRING_TO_JSVAL(JS_NewStringCopyZ(cx, NAVIGATOR_APPCODENAME)));
- return JS_TRUE;
-}
-
-static JSBool JSAPI_PROPERTYSET(appCodeName, JSContext *cx, JSObject *obj, jsval *vp)
-{
- assert(false);
- return JS_FALSE;
-}
-
-static JSBool JSAPI_PROPERTYGET(appVersion, JSContext *cx, JSObject *obj, jsval *vp)
-{
- JS_SET_RVAL(cx, vp, STRING_TO_JSVAL(JS_NewStringCopyZ(cx, netsurf_version)));
- return JS_TRUE;
-}
-
-static JSBool JSAPI_PROPERTYSET(appVersion, JSContext *cx, JSObject *obj, jsval *vp)
-{
- assert(false);
- return JS_FALSE;
-}
-
-static JSBool JSAPI_PROPERTYGET(language, JSContext *cx, JSObject *obj, jsval *vp)
-{
- const char *alang = nsoption_charp(accept_language);
-
- if (alang != NULL) {
- JS_SET_RVAL(cx, vp, STRING_TO_JSVAL(JS_NewStringCopyZ(cx, alang)));
- } else {
- JS_SET_RVAL(cx, vp, JSVAL_VOID);
- }
- return JS_TRUE;
-}
-
-static JSBool JSAPI_PROPERTYSET(language, JSContext *cx, JSObject *obj, jsval *vp)
-{
- assert(false);
- return JS_FALSE;
-}
-
-static JSBool JSAPI_PROPERTYGET(platform, JSContext *cx, JSObject *obj, jsval *vp)
-{
- struct utsname *cutsname;
-
- cutsname = malloc(sizeof(struct utsname));
-
- if ((cutsname == NULL) || uname(cutsname) < 0) {
- JS_SET_RVAL(cx, vp, JSVAL_VOID);
- } else {
- char *platstr;
- int platstrlen;
- platstrlen = strlen(cutsname->sysname) + strlen(cutsname->machine) + 2;
- platstr = malloc(platstrlen);
- if (platstr != NULL) {
- snprintf(platstr, platstrlen, "%s %s", cutsname->sysname, cutsname->machine);
- JS_SET_RVAL(cx, vp, STRING_TO_JSVAL(JS_NewStringCopyN(cx, platstr, platstrlen - 1)));
- free(platstr);
- } else {
- JS_SET_RVAL(cx, vp, JSVAL_VOID);
- }
- }
- return JS_TRUE;
-}
-
-static JSBool JSAPI_PROPERTYSET(platform, JSContext *cx, JSObject *obj, jsval *vp)
-{
- assert(false);
- return JS_FALSE;
-}
-
-static JSBool JSAPI_PROPERTYGET(userAgent, JSContext *cx, JSObject *obj, jsval *vp)
-{
- JS_SET_RVAL(cx, vp, STRING_TO_JSVAL(JS_NewStringCopyZ(cx, user_agent_string())));
- return JS_TRUE;
-}
-
-static JSBool JSAPI_PROPERTYSET(userAgent, JSContext *cx, JSObject *obj, jsval *vp)
-{
- assert(false);
- return JS_FALSE;
-}
-
-
-static JSPropertySpec jsproperties_navigator[] =
-{
- JSAPI_PS(appName, 0, JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_SHARED),
- JSAPI_PS(appCodeName, 0, JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_SHARED),
- JSAPI_PS(appVersion, 0, JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_SHARED),
- JSAPI_PS(language, 0, JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_SHARED),
- JSAPI_PS(platform, 0, JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_SHARED),
- JSAPI_PS(userAgent, 0, JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_SHARED),
- JSAPI_PS_END
-};
-
-static JSClass jsclass_navigator =
-{
- "navigator",
- JSCLASS_HAS_PRIVATE,
- JS_PropertyStub,
- JS_PropertyStub,
- JS_PropertyStub,
- JS_StrictPropertyStub,
- JS_EnumerateStub,
- JS_ResolveStub,
- JS_ConvertStub,
- JS_FinalizeStub,
- JSCLASS_NO_OPTIONAL_MEMBERS
-};
-
-
-JSObject *jsapi_new_navigator(JSContext *cx, JSObject *parent)
-{
- return JS_InitClass(cx,
- parent,
- NULL,
- &jsclass_navigator,
- NULL,
- 0,
- jsproperties_navigator,
- jsfunctions_navigator,
- NULL,
- NULL);
-}
diff --git a/javascript/jsapi/node.c b/javascript/jsapi/node.c
deleted file mode 100644
index b8c073752..000000000
--- a/javascript/jsapi/node.c
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- * Copyright 2012 Vincent Sanders <vince@netsurf-browser.org>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-/* IDL http://dvcs.w3.org/hg/domcore/raw-file/tip/Overview.html#interface-node
-
-interface Node : EventTarget {
- const unsigned short ELEMENT_NODE = 1;
- const unsigned short ATTRIBUTE_NODE = 2; // historical
- const unsigned short TEXT_NODE = 3;
- const unsigned short CDATA_SECTION_NODE = 4; // historical
- const unsigned short ENTITY_REFERENCE_NODE = 5; // historical
- const unsigned short ENTITY_NODE = 6; // historical
- const unsigned short PROCESSING_INSTRUCTION_NODE = 7;
- const unsigned short COMMENT_NODE = 8;
- const unsigned short DOCUMENT_NODE = 9;
- const unsigned short DOCUMENT_TYPE_NODE = 10;
- const unsigned short DOCUMENT_FRAGMENT_NODE = 11;
- const unsigned short NOTATION_NODE = 12; // historical
- readonly attribute unsigned short nodeType;
- readonly attribute DOMString nodeName;
-
- readonly attribute DOMString? baseURI;
-
- readonly attribute Document? ownerDocument;
- readonly attribute Node? parentNode;
- readonly attribute Element? parentElement;
- boolean hasChildNodes();
- readonly attribute NodeList childNodes;
- readonly attribute Node? firstChild;
- readonly attribute Node? lastChild;
- readonly attribute Node? previousSibling;
- readonly attribute Node? nextSibling;
-
- const unsigned short DOCUMENT_POSITION_DISCONNECTED = 0x01;
- const unsigned short DOCUMENT_POSITION_PRECEDING = 0x02;
- const unsigned short DOCUMENT_POSITION_FOLLOWING = 0x04;
- const unsigned short DOCUMENT_POSITION_CONTAINS = 0x08;
- const unsigned short DOCUMENT_POSITION_CONTAINED_BY = 0x10;
- const unsigned short DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 0x20; // historical
- unsigned short compareDocumentPosition(Node other);
- boolean contains(Node? other);
-
- attribute DOMString? nodeValue;
- attribute DOMString? textContent;
- Node insertBefore(Node node, Node? child);
- Node appendChild(Node node);
- Node replaceChild(Node node, Node child);
- Node removeChild(Node child);
- void normalize();
-
-
- Node cloneNode(optional boolean deep = true);
- boolean isEqualNode(Node? node);
-
- DOMString lookupPrefix(DOMString? namespace);
- DOMString lookupNamespaceURI(DOMString? prefix);
- boolean isDefaultNamespace(DOMString? namespace);
-};
-*/
-
-#include "jsclass.h"
-
-#include "eventtarget.c"
-
-static JSBool JSAPI_NATIVE(hasChildNodes, JSContext *cx, uintN argc, jsval *vp)
-{
- struct JSCLASS_TYPE *priv;
-
- priv = JS_GetInstancePrivate(cx, JS_THIS_OBJECT(cx,vp), &JSCLASS_OBJECT, NULL);
- if (priv == NULL)
- return JS_FALSE;
-
-
- JSAPI_SET_RVAL(cx, vp, JSVAL_VOID);
-
- return JS_TRUE;
-}
-
-static JSBool JSAPI_NATIVE(compareDocumentPosition, JSContext *cx, uintN argc, jsval *vp)
-{
- struct JSCLASS_TYPE *priv;
-
- priv = JS_GetInstancePrivate(cx, JS_THIS_OBJECT(cx,vp), &JSCLASS_OBJECT, NULL);
- if (priv == NULL)
- return JS_FALSE;
-
-
- JSAPI_SET_RVAL(cx, vp, JSVAL_VOID);
-
- return JS_TRUE;
-}
-
-static JSBool JSAPI_NATIVE(contains, JSContext *cx, uintN argc, jsval *vp)
-{
- struct JSCLASS_TYPE *priv;
-
- priv = JS_GetInstancePrivate(cx, JS_THIS_OBJECT(cx,vp), &JSCLASS_OBJECT, NULL);
- if (priv == NULL)
- return JS_FALSE;
-
-
- JSAPI_SET_RVAL(cx, vp, JSVAL_VOID);
-
- return JS_TRUE;
-}
-
-static JSBool JSAPI_NATIVE(insertBefore, JSContext *cx, uintN argc, jsval *vp)
-{
- struct JSCLASS_TYPE *priv;
-
- priv = JS_GetInstancePrivate(cx, JS_THIS_OBJECT(cx,vp), &JSCLASS_OBJECT, NULL);
- if (priv == NULL)
- return JS_FALSE;
-
-
- JSAPI_SET_RVAL(cx, vp, JSVAL_VOID);
-
- return JS_TRUE;
-}
-
-static JSBool JSAPI_NATIVE(appendChild, JSContext *cx, uintN argc, jsval *vp)
-{
- struct JSCLASS_TYPE *priv;
-
- priv = JS_GetInstancePrivate(cx, JS_THIS_OBJECT(cx,vp), &JSCLASS_OBJECT, NULL);
- if (priv == NULL)
- return JS_FALSE;
-
-
- JSAPI_SET_RVAL(cx, vp, JSVAL_VOID);
-
- return JS_TRUE;
-}
-
-static JSBool JSAPI_NATIVE(replaceChild, JSContext *cx, uintN argc, jsval *vp)
-{
- struct JSCLASS_TYPE *priv;
-
- priv = JS_GetInstancePrivate(cx, JS_THIS_OBJECT(cx,vp), &JSCLASS_OBJECT, NULL);
- if (priv == NULL)
- return JS_FALSE;
-
-
- JSAPI_SET_RVAL(cx, vp, JSVAL_VOID);
-
- return JS_TRUE;
-}
-
-static JSBool JSAPI_NATIVE(removeChild, JSContext *cx, uintN argc, jsval *vp)
-{
- struct JSCLASS_TYPE *priv;
-
- priv = JS_GetInstancePrivate(cx, JS_THIS_OBJECT(cx,vp), &JSCLASS_OBJECT, NULL);
- if (priv == NULL)
- return JS_FALSE;
-
-
- JSAPI_SET_RVAL(cx, vp, JSVAL_VOID);
-
- return JS_TRUE;
-}
-
-static JSBool JSAPI_NATIVE(normalize, JSContext *cx, uintN argc, jsval *vp)
-{
- struct JSCLASS_TYPE *priv;
-
- priv = JS_GetInstancePrivate(cx, JS_THIS_OBJECT(cx,vp), &JSCLASS_OBJECT, NULL);
- if (priv == NULL)
- return JS_FALSE;
-
-
- JSAPI_SET_RVAL(cx, vp, JSVAL_VOID);
-
- return JS_TRUE;
-}
-
-static JSBool JSAPI_NATIVE(cloneNode, JSContext *cx, uintN argc, jsval *vp)
-{
- struct JSCLASS_TYPE *priv;
-
- priv = JS_GetInstancePrivate(cx, JS_THIS_OBJECT(cx,vp), &JSCLASS_OBJECT, NULL);
- if (priv == NULL)
- return JS_FALSE;
-
-
- JSAPI_SET_RVAL(cx, vp, JSVAL_VOID);
-
- return JS_TRUE;
-}
-
-static JSBool JSAPI_NATIVE(isEqualNode, JSContext *cx, uintN argc, jsval *vp)
-{
- struct JSCLASS_TYPE *priv;
-
- priv = JS_GetInstancePrivate(cx, JS_THIS_OBJECT(cx,vp), &JSCLASS_OBJECT, NULL);
- if (priv == NULL)
- return JS_FALSE;
-
-
- JSAPI_SET_RVAL(cx, vp, JSVAL_VOID);
-
- return JS_TRUE;
-}
-
-static JSBool JSAPI_NATIVE(lookupPrefix, JSContext *cx, uintN argc, jsval *vp)
-{
- struct JSCLASS_TYPE *priv;
-
- priv = JS_GetInstancePrivate(cx, JS_THIS_OBJECT(cx,vp), &JSCLASS_OBJECT, NULL);
- if (priv == NULL)
- return JS_FALSE;
-
-
- JSAPI_SET_RVAL(cx, vp, JSVAL_VOID);
-
- return JS_TRUE;
-}
-
-static JSBool JSAPI_NATIVE(lookupNamespaceURI, JSContext *cx, uintN argc, jsval *vp)
-{
- struct JSCLASS_TYPE *priv;
-
- priv = JS_GetInstancePrivate(cx, JS_THIS_OBJECT(cx,vp), &JSCLASS_OBJECT, NULL);
- if (priv == NULL)
- return JS_FALSE;
-
-
- JSAPI_SET_RVAL(cx, vp, JSVAL_VOID);
-
- return JS_TRUE;
-}
-
-static JSBool JSAPI_NATIVE(isDefaultNamespace, JSContext *cx, uintN argc, jsval *vp)
-{
- struct JSCLASS_TYPE *priv;
-
- priv = JS_GetInstancePrivate(cx, JS_THIS_OBJECT(cx,vp), &JSCLASS_OBJECT, NULL);
- if (priv == NULL)
- return JS_FALSE;
-
-
- JSAPI_SET_RVAL(cx, vp, JSVAL_VOID);
-
- return JS_TRUE;
-}
-
-#define JSAPI_FS_NODE \
- JSAPI_FS_EVENTTARGET, \
- JSAPI_FS(hasChildNodes, 0, 0), \
- JSAPI_FS(compareDocumentPosition, 0, 0), \
- JSAPI_FS(contains, 0, 0), \
- JSAPI_FS(insertBefore, 0, 0), \
- JSAPI_FS(appendChild, 0, 0), \
- JSAPI_FS(replaceChild, 0, 0), \
- JSAPI_FS(removeChild, 0, 0), \
- JSAPI_FS(normalize, 0, 0), \
- JSAPI_FS(cloneNode, 0, 0), \
- JSAPI_FS(isEqualNode, 0, 0), \
- JSAPI_FS(lookupPrefix, 0, 0), \
- JSAPI_FS(lookupNamespaceURI, 0, 0), \
- JSAPI_FS(isDefaultNamespace, 0, 0)
-
-
-static JSBool JSAPI_PROPERTYGET(nodeType, JSContext *cx, JSObject *obj, jsval *vp)
-{
- JS_SET_RVAL(cx, vp, JSVAL_NULL);
- return JS_TRUE;
-}
-
-static JSBool JSAPI_PROPERTYGET(textContent, JSContext *cx, JSObject *obj, jsval *vp)
-{
- JS_SET_RVAL(cx, vp, JSVAL_NULL);
- return JS_TRUE;
-}
-
-static JSBool JSAPI_PROPERTYSET(textContent, JSContext *cx, JSObject *obj, jsval *vp)
-{
- return JS_FALSE;
-}
-
-#define JSAPI_PS_NODE \
- JSAPI_PS_RO(nodeType, 0, JSPROP_ENUMERATE | JSPROP_SHARED), \
- JSAPI_PS(textContent, 0, JSPROP_ENUMERATE | JSPROP_SHARED)
diff --git a/javascript/jsapi/window.bnd b/javascript/jsapi/window.bnd
new file mode 100644
index 000000000..da6400332
--- /dev/null
+++ b/javascript/jsapi/window.bnd
@@ -0,0 +1,167 @@
+/* binding to generate window */
+
+#include "dom.bnd"
+
+webidlfile "html.idl";
+
+hdrcomment "Part of NetSurf Project";
+
+preamble %{
+
+#include <dom/dom.h>
+
+#include "utils/config.h"
+#include "utils/log.h"
+
+#include "javascript/jsapi.h"
+#include "javascript/jsapi/binding.h"
+
+%}
+
+binding window {
+ type js_libdom; /* the binding type */
+
+ interface Window; /* Web IDL interface to generate */
+
+ /* private are parameters to constructor stored in private
+ * context structure.
+ *
+ * internal are value stored in private context structure but not
+ * passed to constructor but are considered for property
+ * getters/setters.
+ */
+ private "struct browser_window *" bw;
+ private "struct html_content *" htmlc;
+ internal "JSObject *" document;
+ internal "JSObject *" navigator;
+ internal "JSObject *" console;
+ internal "JSObject *" location;
+}
+
+api global %{
+%}
+
+api init %{
+ JSObject *user_proto;
+
+ prototype = JS_NewCompartmentAndGlobalObject(cx, &JSClass_Window, NULL);
+ if (prototype == NULL) {
+ return NULL;
+ }
+
+ /** @todo reconsider global object handling. future
+ * editions of spidermonkey appear to be removing the
+ * idea of a global so we probably need to handle
+ * global object references internally
+ */
+
+ /* set the contexts global */
+ JS_SetGlobalObject(cx, prototype);
+
+ /* Populate the global object with the standard globals, like
+ * Object and Array.
+ */
+ if (!JS_InitStandardClasses(cx, prototype)) {
+ return NULL;
+ }
+
+ /* add functions to prototype */
+ if (!JS_DefineFunctions(cx, prototype, jsclass_functions)) {
+ return NULL;
+ }
+
+ /* add properties to prototype */
+ if (!JS_DefineProperties(cx, prototype, jsclass_properties))
+ return NULL;
+
+ /* Initialises all the user javascript classes to make their
+ * prototypes available.
+ */
+ /** @todo should we be managing these prototype objects ourselves */
+ user_proto = jsapi_InitClass_Document(cx, prototype);
+ if (user_proto == NULL) {
+ return NULL;
+ }
+
+ user_proto = jsapi_InitClass_Navigator(cx, prototype);
+ if (user_proto == NULL) {
+ return NULL;
+ }
+
+ user_proto = jsapi_InitClass_Location(cx, prototype);
+ if (user_proto == NULL) {
+ return NULL;
+ }
+
+ user_proto = jsapi_InitClass_Console(cx, prototype);
+ if (user_proto == NULL) {
+ return NULL;
+ }
+
+ user_proto = jsapi_InitClass_HTMLElement(cx, prototype);
+ if (user_proto == NULL) {
+ return NULL;
+ }
+
+%}
+
+api new %{
+ /* @todo sort out windows that are not globals */
+ assert(parent == NULL);
+
+ /* the window object is the global so its prototype *is* the instance */
+ newobject = prototype;
+
+ /* instantiate the subclasses off the window global */
+ private->document = jsapi_new_Document(cx,
+ NULL,
+ newobject,
+ htmlc->document,
+ htmlc);
+ if (private->document == NULL) {
+ free(private);
+ return NULL;
+ }
+
+ private->navigator = jsapi_new_Navigator(cx, NULL, newobject);
+ if (private->navigator == NULL) {
+ free(private);
+ return NULL;
+ }
+
+ private->location = jsapi_new_Location(cx, NULL, newobject, bw);
+ if (private->location == NULL) {
+ free(private);
+ return NULL;
+ }
+
+ private->console = jsapi_new_Console(cx, NULL, newobject);
+ if (private->console == NULL) {
+ free(private);
+ return NULL;
+ }
+
+ /** @todo forms, history */
+
+ LOG(("Created new window object %p", newobject));
+%}
+
+operation confirm %{
+ warn_user(message, NULL);
+%}
+
+operation alert %{
+ warn_user(message, NULL);
+%}
+
+operation prompt %{
+ warn_user(message, NULL);
+%}
+
+getter window %{
+ jsret = obj;
+%}
+
+getter self %{
+ jsret = obj;
+%}
diff --git a/javascript/jsapi/window.c b/javascript/jsapi/window.c
deleted file mode 100644
index 72d3837d9..000000000
--- a/javascript/jsapi/window.c
+++ /dev/null
@@ -1,327 +0,0 @@
-/*
- * Copyright 2012 Vincent Sanders <vince@netsurf-browser.org>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "utils/log.h"
-
-#include "javascript/jsapi.h"
-
-/* IDL
-
-[NamedPropertiesObject]
-interface Window : EventTarget {
- // the current browsing context
- [Unforgeable] readonly attribute WindowProxy window;
- [Replaceable] readonly attribute WindowProxy self;
- [Unforgeable] readonly attribute Document document;
- attribute DOMString name;
- [PutForwards=href, Unforgeable] readonly attribute Location location;
- readonly attribute History history;
-
- boolean find(optional DOMString aString, optional boolean aCaseSensitive, optional boolean aBackwards, optional boolean aWrapAround, optional boolean aWholeWord, optional boolean aSearchInFrames, optional boolean aShowDialog);
-
- [Replaceable] readonly attribute BarProp locationbar;
- [Replaceable] readonly attribute BarProp menubar;
- [Replaceable] readonly attribute BarProp personalbar;
- [Replaceable] readonly attribute BarProp scrollbars;
- [Replaceable] readonly attribute BarProp statusbar;
- [Replaceable] readonly attribute BarProp toolbar;
- attribute DOMString status;
- void close();
- void stop();
- void focus();
- void blur();
-
- // other browsing contexts
- [Replaceable] readonly attribute WindowProxy frames;
- [Replaceable] readonly attribute unsigned long length;
- [Unforgeable] readonly attribute WindowProxy top;
- attribute WindowProxy? opener;
- readonly attribute WindowProxy parent;
- readonly attribute Element? frameElement;
- WindowProxy open(optional DOMString url, optional DOMString target, optional DOMString features, optional boolean replace);
- getter WindowProxy (unsigned long index);
- getter object (DOMString name);
-
- // the user agent
- readonly attribute Navigator navigator;
- readonly attribute External external;
- readonly attribute ApplicationCache applicationCache;
-
- // user prompts
- void alert(DOMString message);
- boolean confirm(DOMString message);
- DOMString? prompt(DOMString message, optional DOMString default);
- void print();
- any showModalDialog(DOMString url, optional any argument);
-
- // cross-document messaging
- void postMessage(any message, DOMString targetOrigin, optional sequence<Transferable> transfer);
-
- // event handler IDL attributes
- [TreatNonCallableAsNull] attribute Function? onabort;
- [TreatNonCallableAsNull] attribute Function? onafterprint;
- [TreatNonCallableAsNull] attribute Function? onbeforeprint;
- [TreatNonCallableAsNull] attribute Function? onbeforeunload;
- [TreatNonCallableAsNull] attribute Function? onblur;
- [TreatNonCallableAsNull] attribute Function? oncancel;
- [TreatNonCallableAsNull] attribute Function? oncanplay;
- [TreatNonCallableAsNull] attribute Function? oncanplaythrough;
- [TreatNonCallableAsNull] attribute Function? onchange;
- [TreatNonCallableAsNull] attribute Function? onclick;
- [TreatNonCallableAsNull] attribute Function? onclose;
- [TreatNonCallableAsNull] attribute Function? oncontextmenu;
- [TreatNonCallableAsNull] attribute Function? oncuechange;
- [TreatNonCallableAsNull] attribute Function? ondblclick;
- [TreatNonCallableAsNull] attribute Function? ondrag;
- [TreatNonCallableAsNull] attribute Function? ondragend;
- [TreatNonCallableAsNull] attribute Function? ondragenter;
- [TreatNonCallableAsNull] attribute Function? ondragleave;
- [TreatNonCallableAsNull] attribute Function? ondragover;
- [TreatNonCallableAsNull] attribute Function? ondragstart;
- [TreatNonCallableAsNull] attribute Function? ondrop;
- [TreatNonCallableAsNull] attribute Function? ondurationchange;
- [TreatNonCallableAsNull] attribute Function? onemptied;
- [TreatNonCallableAsNull] attribute Function? onended;
- [TreatNonCallableAsNull] attribute Function? onerror;
- [TreatNonCallableAsNull] attribute Function? onfocus;
- [TreatNonCallableAsNull] attribute Function? onhashchange;
- [TreatNonCallableAsNull] attribute Function? oninput;
- [TreatNonCallableAsNull] attribute Function? oninvalid;
- [TreatNonCallableAsNull] attribute Function? onkeydown;
- [TreatNonCallableAsNull] attribute Function? onkeypress;
- [TreatNonCallableAsNull] attribute Function? onkeyup;
- [TreatNonCallableAsNull] attribute Function? onload;
- [TreatNonCallableAsNull] attribute Function? onloadeddata;
- [TreatNonCallableAsNull] attribute Function? onloadedmetadata;
- [TreatNonCallableAsNull] attribute Function? onloadstart;
- [TreatNonCallableAsNull] attribute Function? onmessage;
- [TreatNonCallableAsNull] attribute Function? onmousedown;
- [TreatNonCallableAsNull] attribute Function? onmousemove;
- [TreatNonCallableAsNull] attribute Function? onmouseout;
- [TreatNonCallableAsNull] attribute Function? onmouseover;
- [TreatNonCallableAsNull] attribute Function? onmouseup;
- [TreatNonCallableAsNull] attribute Function? onmousewheel;
- [TreatNonCallableAsNull] attribute Function? onoffline;
- [TreatNonCallableAsNull] attribute Function? ononline;
- [TreatNonCallableAsNull] attribute Function? onpause;
- [TreatNonCallableAsNull] attribute Function? onplay;
- [TreatNonCallableAsNull] attribute Function? onplaying;
- [TreatNonCallableAsNull] attribute Function? onpagehide;
- [TreatNonCallableAsNull] attribute Function? onpageshow;
- [TreatNonCallableAsNull] attribute Function? onpopstate;
- [TreatNonCallableAsNull] attribute Function? onprogress;
- [TreatNonCallableAsNull] attribute Function? onratechange;
- [TreatNonCallableAsNull] attribute Function? onreset;
- [TreatNonCallableAsNull] attribute Function? onresize;
- [TreatNonCallableAsNull] attribute Function? onscroll;
- [TreatNonCallableAsNull] attribute Function? onseeked;
- [TreatNonCallableAsNull] attribute Function? onseeking;
- [TreatNonCallableAsNull] attribute Function? onselect;
- [TreatNonCallableAsNull] attribute Function? onshow;
- [TreatNonCallableAsNull] attribute Function? onstalled;
- [TreatNonCallableAsNull] attribute Function? onstorage;
- [TreatNonCallableAsNull] attribute Function? onsubmit;
- [TreatNonCallableAsNull] attribute Function? onsuspend;
- [TreatNonCallableAsNull] attribute Function? ontimeupdate;
- [TreatNonCallableAsNull] attribute Function? onunload;
- [TreatNonCallableAsNull] attribute Function? onvolumechange;
- [TreatNonCallableAsNull] attribute Function? onwaiting;
-};
-
-*/
-
-
-static JSBool JSAPI_NATIVE(alert, JSContext *cx, uintN argc, jsval *vp)
-{
- JSString* u16_txt;
- char *txt;
- unsigned long length;
-
- if (!JS_ConvertArguments(cx, argc, JSAPI_ARGV(cx, vp), "S", &u16_txt))
- return JS_FALSE;
-
- JSString_to_char(u16_txt, txt, length);
-
- warn_user(txt, NULL);
-
- JSAPI_SET_RVAL(cx, vp, JSVAL_VOID);
-
- return JS_TRUE;
-}
-
-static JSBool JSAPI_NATIVE(confirm, JSContext *cx, uintN argc, jsval *vp)
-{
- JSString* u16_txt;
- char *txt;
- unsigned long length;
- JSBool result = JS_FALSE;
-
- if (!JS_ConvertArguments(cx, argc, JSAPI_ARGV(cx, vp), "S", &u16_txt))
- return JS_FALSE;
-
- JSString_to_char(u16_txt, txt, length);
-
- warn_user(txt, NULL);
-
- JSAPI_SET_RVAL(cx, vp, BOOLEAN_TO_JSVAL(result));
-
- return JS_TRUE;
-}
-
-static JSBool JSAPI_NATIVE(prompt, JSContext *cx, uintN argc, jsval *vp)
-{
- JSString* u16_txt;
- char *txt;
- unsigned long length;
-
- if (!JS_ConvertArguments(cx, argc, JSAPI_ARGV(cx, vp), "S", &u16_txt))
- return JS_FALSE;
-
- JSString_to_char(u16_txt, txt, length);
-
- warn_user(txt, NULL);
-
- JSAPI_SET_RVAL(cx, vp, JSVAL_VOID);
-
- return JS_TRUE;
-}
-
-static JSBool JSAPI_NATIVE(close, JSContext *cx, uintN argc, jsval *vp)
-{
- JSAPI_SET_RVAL(cx, vp, JSVAL_VOID);
-
- return JS_TRUE;
-}
-
-static JSBool JSAPI_NATIVE(stop, JSContext *cx, uintN argc, jsval *vp)
-{
- JSAPI_SET_RVAL(cx, vp, JSVAL_VOID);
-
- return JS_TRUE;
-}
-
-static JSBool JSAPI_NATIVE(focus, JSContext *cx, uintN argc, jsval *vp)
-{
- JSAPI_SET_RVAL(cx, vp, JSVAL_VOID);
-
- return JS_TRUE;
-}
-
-static JSBool JSAPI_NATIVE(blur, JSContext *cx, uintN argc, jsval *vp)
-{
- JSAPI_SET_RVAL(cx, vp, JSVAL_VOID);
-
- return JS_TRUE;
-}
-
-static JSFunctionSpec jsfunctions_window[] =
-{
- JSAPI_FS(close, 0, 0),
- JSAPI_FS(stop, 0, 0),
- JSAPI_FS(focus, 0, 0),
- JSAPI_FS(blur, 0, 0),
- JSAPI_FS(alert, 1, 0),
- JSAPI_FS(confirm, 1, 0),
- JSAPI_FS(prompt, 1, 0),
- JSAPI_FS_END
-};
-
-
-static JSBool JSAPI_PROPERTYGET(window, JSContext *cx, JSObject *obj, jsval *vp)
-{
- JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(obj));
- return JS_TRUE;
-}
-
-static JSBool JSAPI_PROPERTYGET(self, JSContext *cx, JSObject *obj, jsval *vp)
-{
- JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(obj));
- return JS_TRUE;
-}
-
-static JSPropertySpec jsproperties_window[] =
-{
- JSAPI_PS_RO(window, 0, JSPROP_ENUMERATE | JSPROP_SHARED),
- JSAPI_PS_RO(self, 0, JSPROP_ENUMERATE | JSPROP_SHARED),
- JSAPI_PS_END
-};
-
-/* The class of the global object. */
-static JSClass jsclass_window = {
- "window",
- JSCLASS_HAS_PRIVATE | JSCLASS_GLOBAL_FLAGS,
- JS_PropertyStub,
- JS_PropertyStub,
- JS_PropertyStub,
- JS_StrictPropertyStub,
- JS_EnumerateStub,
- JS_ResolveStub,
- JS_ConvertStub,
- JS_FinalizeStub,
- JSCLASS_NO_OPTIONAL_MEMBERS
-};
-
-
-JSObject * jsapi_new_window(JSContext *cx, JSObject *parent, void *win_priv)
-{
- JSObject *window = NULL;
-
- if (parent == NULL) {
- window = JS_NewCompartmentAndGlobalObject(cx, &jsclass_window, NULL);
- if (window == NULL) {
- return NULL;
- }
-
- /** @todo reconsider global object handling. future
- * editions of spidermonkey appear to be removing the
- * idea of a global so we probably need to handle
- * global object references internally
- */
-
- /* set the contexts global */
- JS_SetGlobalObject(cx, window);
-
- /* Populate the global object with the standard globals, like
- * Object and Array.
- */
- if (!JS_InitStandardClasses(cx, window)) {
- return NULL;
- }
-
- } else {
- /* @todo sort out windows that are not globals */
- assert(false);
- }
-
- /* private pointer to browsing context */
- if (!JS_SetPrivate(cx, window, win_priv))
- return NULL;
-
- /* functions */
- if (!JS_DefineFunctions(cx, window, jsfunctions_window)) {
- return NULL;
- }
-
- /* properties */
- if (!JS_DefineProperties(cx, window, jsproperties_window))
- return NULL;
-
- LOG(("Created new window object %p", window));
-
- return window;
-}