/* 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 "html/html.h" #include "html/html_internal.h" %}; }; init Window(struct browser_window *win, struct html_content *htmlc) %{ /* element window */ priv->win = win; priv->htmlc = htmlc; NSLOG(netsurf, INFO, "win=%p htmlc=%p", priv->win, priv->htmlc); NSLOG(netsurf, INFO, "URL is %s", nsurl_access(browser_window_access_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() %{ NSLOG(netsurf, DEBUG, "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) { return duk_error(ctx, DUK_ERR_ERROR, "Unable to create console object"); } 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) { return duk_error(ctx, DUK_ERR_ERROR, "Unable to create location object"); } 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) { return duk_error(ctx, DUK_ERR_ERROR, "Unable to create navigator object"); } 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); NSLOG(netsurf, INFO, "JS ALERT: %*s", (int)msg_len, msg); return 0; %}