summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--javascript/duktape/Location.bnd206
-rw-r--r--javascript/duktape/Window.bnd19
-rw-r--r--javascript/duktape/netsurf.bnd2
3 files changed, 227 insertions, 0 deletions
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 <vince@netsurf-browser.org>
+ * Copyright 2015 Daniel Silverstone <dsilvers@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 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 <dom/dom.h>
#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);