From 042fcb82b83d19bf08afd3367235ac71a60b3850 Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Tue, 7 Jun 2016 16:01:04 +0100 Subject: Move javascript content handler as appropriate for updated source format --- content/handlers/javascript/duktape/Window.bnd | 146 +++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 content/handlers/javascript/duktape/Window.bnd (limited to 'content/handlers/javascript/duktape/Window.bnd') 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 + * + * 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; +%} -- cgit v1.2.3