summaryrefslogtreecommitdiff
path: root/content/handlers/javascript/duktape/Window.bnd
diff options
context:
space:
mode:
Diffstat (limited to 'content/handlers/javascript/duktape/Window.bnd')
-rw-r--r--content/handlers/javascript/duktape/Window.bnd146
1 files changed, 146 insertions, 0 deletions
diff --git a/content/handlers/javascript/duktape/Window.bnd b/content/handlers/javascript/duktape/Window.bnd
new file mode 100644
index 000000000..489587899
--- /dev/null
+++ b/content/handlers/javascript/duktape/Window.bnd
@@ -0,0 +1,146 @@
+/* Window 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 Window {
+ private struct browser_window * win;
+ private struct html_content * htmlc;
+ prologue %{
+#include "utils/nsurl.h"
+#include "netsurf/browser_window.h"
+#include "content/hlcache.h"
+#include "render/html.h"
+#include "render/html_internal.h"
+%};
+};
+
+init Window(struct browser_window *win, struct html_content *htmlc)
+%{
+ /* element window */
+ priv->win = win;
+ priv->htmlc = htmlc;
+ LOG("win=%p htmlc=%p", priv->win, priv->htmlc);
+
+ LOG("URL is %s", nsurl_access(browser_window_get_url(priv->win)));
+%}
+
+prototype Window()
+%{
+#define EXPOSE(v) \
+ duk_get_global_string(ctx, #v); \
+ duk_put_prop_string(ctx, 0, #v)
+ /* steal undefined */
+ EXPOSE(undefined);
+ EXPOSE(eval);
+ EXPOSE(Object);
+ EXPOSE(parseInt);
+ EXPOSE(parseFloat);
+ EXPOSE(Array);
+ EXPOSE(Date);
+ EXPOSE(RegExp);
+ EXPOSE(Math);
+ EXPOSE(Function);
+ EXPOSE(Proxy);
+ EXPOSE(String);
+#undef EXPOSE
+%}
+
+getter Window::document()
+%{
+ JS_LOG("priv=%p", priv);
+ dom_document *doc = priv->htmlc->document;
+ dukky_push_node(ctx, (struct dom_node *)doc);
+ return 1;
+%}
+
+getter Window::window()
+%{
+ duk_push_this(ctx);
+ return 1;
+%}
+
+getter Window::console()
+%{
+ duk_push_this(ctx);
+ duk_get_prop_string(ctx, -1, MAGIC(Console));
+ if (duk_is_undefined(ctx, -1)) {
+ duk_pop(ctx);
+ if (dukky_create_object(ctx, PROTO_NAME(CONSOLE), 0) != DUK_EXEC_SUCCESS) {
+ duk_error(ctx, DUK_ERR_ERROR, "Unable to create console object");
+ return 0;
+ }
+ duk_dup(ctx, -1);
+ duk_put_prop_string(ctx, -3, MAGIC(Console));
+ }
+ return 1;
+%}
+
+getter Window::location()
+%{
+ duk_push_this(ctx);
+ duk_get_prop_string(ctx, -1, MAGIC(Location));
+ if (duk_is_undefined(ctx, -1)) {
+ duk_pop(ctx);
+
+ duk_push_pointer(ctx, llcache_handle_get_url(priv->htmlc->base.llcache));
+
+ if (dukky_create_object(ctx, PROTO_NAME(LOCATION), 1) != DUK_EXEC_SUCCESS) {
+ duk_error(ctx, DUK_ERR_ERROR, "Unable to create location object");
+ return 0;
+ }
+ duk_dup(ctx, -1);
+ duk_put_prop_string(ctx, -3, MAGIC(Location));
+ }
+ return 1;
+%}
+
+getter Window::navigator()
+%{
+ duk_push_this(ctx);
+ duk_get_prop_string(ctx, -1, MAGIC(Navigator));
+ if (duk_is_undefined(ctx, -1)) {
+ duk_pop(ctx);
+
+ if (dukky_create_object(ctx,
+ PROTO_NAME(NAVIGATOR),
+ 0) != DUK_EXEC_SUCCESS) {
+ duk_error(ctx,
+ DUK_ERR_ERROR,
+ "Unable to create navigator object");
+ return 0;
+ }
+ duk_dup(ctx, -1);
+ duk_put_prop_string(ctx, -3, MAGIC(Navigator));
+ }
+ return 1;
+%}
+
+getter Window::name()
+%{
+ const char *name;
+ browser_window_get_name(priv->win, &name);
+ duk_push_string(ctx, name);
+ return 1;
+%}
+
+setter Window::name()
+%{
+ const char *name;
+ name = duk_to_string(ctx, -1);
+ browser_window_set_name(priv->win, name);
+ return 0;
+%}
+
+method Window::alert()
+%{
+ duk_size_t msg_len;
+ const char *msg = duk_safe_to_lstring(ctx, 0, &msg_len);
+ LOG("JS ALERT: %*s", (int)msg_len, msg);
+ return 0;
+%}