From 1a43dd21b38805424d717c68a95635d4386bd6d8 Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Mon, 7 Sep 2015 13:52:57 +0100 Subject: Add initial readonly location implementation --- javascript/duktape/Location.bnd | 206 ++++++++++++++++++++++++++++++++++++++++ javascript/duktape/Window.bnd | 19 ++++ javascript/duktape/netsurf.bnd | 2 + 3 files changed, 227 insertions(+) create mode 100644 javascript/duktape/Location.bnd diff --git a/javascript/duktape/Location.bnd b/javascript/duktape/Location.bnd new file mode 100644 index 000000000..5acbde2da --- /dev/null +++ b/javascript/duktape/Location.bnd @@ -0,0 +1,206 @@ +/* Location binding for browser using duktape and libdom + * + * Copyright 2015 Vincent Sanders + * Copyright 2015 Daniel Silverstone + * + * 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 Location { + private "nsurl *" url; +} + +init Location("nsurl *" url) +%{ + priv->url = url; + nsurl_ref(url); +%} + +fini Location() +%{ + nsurl_unref(priv->url); +%} + +getter Location::href() +%{ + char *url_s = NULL; + size_t url_l; + + nsurl_get(priv->url, NSURL_COMPLETE, &url_s, &url_l); + if (url_s == NULL) { + return 0; + } + + duk_push_lstring(ctx, url_s, url_l); + + free(url_s); + + return 1; +%} + + +getter Location::protocol() +%{ + char *url_s = NULL; + size_t url_l; + + nsurl_get(priv->url, NSURL_SCHEME, &url_s, &url_l); + if (url_s == NULL) { + return 0; + } + + duk_push_lstring(ctx, url_s, url_l); + + free(url_s); + + return 1; +%} + + +getter Location::username() +%{ + char *url_s = NULL; + size_t url_l; + + nsurl_get(priv->url, NSURL_USERNAME, &url_s, &url_l); + if (url_s == NULL) { + return 0; + } + + duk_push_lstring(ctx, url_s, url_l); + + free(url_s); + + return 1; +%} + + +getter Location::password() +%{ + char *url_s = NULL; + size_t url_l; + + nsurl_get(priv->url, NSURL_PASSWORD, &url_s, &url_l); + if (url_s == NULL) { + return 0; + } + + duk_push_lstring(ctx, url_s, url_l); + + free(url_s); + + return 1; +%} + + +getter Location::host() +%{ + char *url_s = NULL; + size_t url_l; + + nsurl_get(priv->url, NSURL_HOST, &url_s, &url_l); + if (url_s == NULL) { + return 0; + } + + duk_push_lstring(ctx, url_s, url_l); + + free(url_s); + + return 1; +%} + + +getter Location::hostname() +%{ + char *url_s = NULL; + size_t url_l; + + nsurl_get(priv->url, NSURL_COMPLETE, &url_s, &url_l); + if (url_s == NULL) { + return 0; + } + + duk_push_lstring(ctx, url_s, url_l); + + free(url_s); + + return 1; +%} + + +getter Location::port() +%{ + char *url_s = NULL; + size_t url_l; + + nsurl_get(priv->url, NSURL_PORT, &url_s, &url_l); + if (url_s == NULL) { + return 0; + } + + duk_push_lstring(ctx, url_s, url_l); + + free(url_s); + + return 1; +%} + + +getter Location::pathname() +%{ + char *url_s = NULL; + size_t url_l; + + nsurl_get(priv->url, NSURL_PATH, &url_s, &url_l); + if (url_s == NULL) { + return 0; + } + + duk_push_lstring(ctx, url_s, url_l); + + free(url_s); + + return 1; +%} + + +getter Location::search() +%{ + char *url_s = NULL; + size_t url_l; + + nsurl_get(priv->url, NSURL_QUERY, &url_s, &url_l); + if (url_s == NULL) { + return 0; + } + + duk_push_lstring(ctx, url_s, url_l); + + free(url_s); + + return 1; +%} + + +getter Location::hash() +%{ + char *url_s = NULL; + size_t url_l; + + nsurl_get(priv->url, NSURL_FRAGMENT, &url_s, &url_l); + if (url_s == NULL) { + return 0; + } + + duk_push_lstring(ctx, url_s, url_l); + + free(url_s); + + return 1; +%} + + diff --git a/javascript/duktape/Window.bnd b/javascript/duktape/Window.bnd index 1aacd5ac6..4121ac6ca 100644 --- a/javascript/duktape/Window.bnd +++ b/javascript/duktape/Window.bnd @@ -76,3 +76,22 @@ getter Window::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; +%} diff --git a/javascript/duktape/netsurf.bnd b/javascript/duktape/netsurf.bnd index a75641a66..56107b987 100644 --- a/javascript/duktape/netsurf.bnd +++ b/javascript/duktape/netsurf.bnd @@ -27,6 +27,7 @@ binding duk_libdom { #include #include "utils/log.h" +#include "utils/nsurl.h" #include "javascript/duktape/duktape.h" @@ -58,6 +59,7 @@ struct dom_html_br_element; #include "NodeList.bnd" #include "Element.bnd" #include "HTMLCollection.bnd" +#include "Location.bnd" /* specialisations of html_element */ init HTMLUnknownElement("struct dom_html_element *" html_unknown_element::html_element); -- cgit v1.2.3