1/* Location binding for browser using duktape and libdom 2 * 3 * Copyright 2015 Vincent Sanders <vince@netsurf-browser.org> 4 * Copyright 2015 Daniel Silverstone <dsilvers@netsurf-browser.org> 5 * 6 * This file is part of NetSurf, http://www.netsurf-browser.org/ 7 * 8 * Released under the terms of the MIT License, 9 * http://www.opensource.org/licenses/mit-license 10 */ 11 12class Location { 13 private nsurl *url; 14}; 15 16prologue Location() 17%{ 18#include "netsurf/browser_window.h" 19%} 20 21init Location(nsurl *url) 22%{ 23 priv->url = url; 24 nsurl_ref(url); 25%} 26 27fini Location() 28%{ 29 nsurl_unref(priv->url); 30%} 31 32method Location::reload() 33%{ 34 /* retrieve the private data from the root object (window) */ 35 duk_push_global_object(ctx); 36 duk_get_prop_string(ctx, -1, PRIVATE_MAGIC); 37 window_private_t *priv_win = duk_get_pointer(ctx, -1); 38 duk_pop(ctx); 39 40 if (priv_win->win != NULL) { 41 browser_window_reload(priv_win->win, false); 42 } else { 43 NSLOG(netsurf, INFO, "failed to get browser context"); 44 } 45 return 0; 46%} 47 48method Location::assign() 49%{ 50 /* retrieve the private data from the root object (window) */ 51 duk_push_global_object(ctx); 52 duk_get_prop_string(ctx, -1, PRIVATE_MAGIC); 53 window_private_t *priv_win = duk_get_pointer(ctx, -1); 54 duk_pop(ctx); 55 56 if (priv_win == NULL || priv_win->win == NULL) { 57 NSLOG(netsurf, INFO, "failed to get browser context"); 58 return 0; 59 } 60 61 nsurl *joined; 62 duk_size_t slen; 63 const char *url = duk_safe_to_lstring(ctx, 0, &slen); 64 65 nsurl_join(priv->url, url, &joined); 66 browser_window_navigate(priv_win->win, 67 joined, 68 NULL, 69 BW_NAVIGATE_HISTORY, 70 NULL, 71 NULL, 72 NULL); 73 nsurl_unref(joined); 74 return 0; 75%} 76 77method Location::replace() 78%{ 79 /* retrieve the private data from the root object (window) */ 80 duk_push_global_object(ctx); 81 duk_get_prop_string(ctx, -1, PRIVATE_MAGIC); 82 window_private_t *priv_win = duk_get_pointer(ctx, -1); 83 duk_pop(ctx); 84 85 if (priv_win == NULL || priv_win->win == NULL) { 86 NSLOG(netsurf, INFO, "failed to get browser context"); 87 return 0; 88 } 89 90 nsurl *joined; 91 duk_size_t slen; 92 const char *url = duk_safe_to_lstring(ctx, 0, &slen); 93 94 nsurl_join(priv->url, url, &joined); 95 browser_window_navigate(priv_win->win, 96 joined, 97 NULL, 98 BW_NAVIGATE_NONE, 99 NULL, 100 NULL, 101 NULL); 102 nsurl_unref(joined); 103 return 0; 104%} 105 106getter Location::href() 107%{ 108 char *url_s = NULL; 109 size_t url_l; 110 111 nsurl_get(priv->url, NSURL_COMPLETE, &url_s, &url_l); 112 if (url_s == NULL) { 113 return 0; 114 } 115 116 duk_push_lstring(ctx, url_s, url_l); 117 118 if (url_s != NULL) { 119 free(url_s); 120 } 121 122 return 1; 123%} 124 125setter Location::href() 126%{ 127 /* retrieve the private data from the root object (window) */ 128 duk_push_global_object(ctx); 129 duk_get_prop_string(ctx, -1, PRIVATE_MAGIC); 130 window_private_t *priv_win = duk_get_pointer(ctx, -1); 131 duk_pop(ctx); 132 133 if (priv_win == NULL || priv_win->win == NULL) { 134 NSLOG(netsurf, INFO, "failed to get browser context"); 135 return 0; 136 } 137 138 nsurl *joined; 139 duk_size_t slen; 140 const char *url = duk_safe_to_lstring(ctx, 0, &slen); 141 142 nsurl_join(priv->url, url, &joined); 143 browser_window_navigate(priv_win->win, 144 joined, 145 NULL, 146 BW_NAVIGATE_HISTORY, 147 NULL, 148 NULL, 149 NULL); 150 nsurl_unref(joined); 151 return 0; 152%} 153 154getter Location::origin() 155%{ 156 char *url_s = NULL; 157 size_t url_l; 158 159 nsurl_get(priv->url, NSURL_SCHEME | NSURL_HOST | NSURL_PORT, &url_s, &url_l); 160 161 /* if url_s is NULL duk_push_lstring pushes an empty string 162 * which is correct for this API 163 */ 164 duk_push_lstring(ctx, url_s, url_l); 165 166 if (url_s != NULL) { 167 free(url_s); 168 } 169 170 return 1; 171%} 172 173getter Location::protocol() 174%{ 175 char *url_s = NULL; 176 size_t url_l; 177 178 nsurl_get(priv->url, NSURL_SCHEME, &url_s, &url_l); 179 180 /* if url_s is NULL duk_push_lstring pushes an empty string 181 * which is correct for this API 182 */ 183 duk_push_lstring(ctx, url_s, url_l); 184 185 if (url_s != NULL) { 186 free(url_s); 187 } 188 189 return 1; 190%} 191 192 193getter Location::username() 194%{ 195 char *url_s = NULL; 196 size_t url_l; 197 198 nsurl_get(priv->url, NSURL_USERNAME, &url_s, &url_l); 199 200 /* if url_s is NULL duk_push_lstring pushes an empty string 201 * which is correct for this API 202 */ 203 duk_push_lstring(ctx, url_s, url_l); 204 205 if (url_s != NULL) { 206 free(url_s); 207 } 208 209 return 1; 210%} 211 212 213getter Location::password() 214%{ 215 char *url_s = NULL; 216 size_t url_l; 217 218 nsurl_get(priv->url, NSURL_PASSWORD, &url_s, &url_l); 219 220 /* if url_s is NULL duk_push_lstring pushes an empty string 221 * which is correct for this API 222 */ 223 duk_push_lstring(ctx, url_s, url_l); 224 225 if (url_s != NULL) { 226 free(url_s); 227 } 228 229 return 1; 230%} 231 232 233getter Location::host() 234%{ 235 char *url_s = NULL; 236 size_t url_l; 237 238 nsurl_get(priv->url, NSURL_HOST, &url_s, &url_l); 239 240 /* if url_s is NULL duk_push_lstring pushes an empty string 241 * which is correct for this API 242 */ 243 duk_push_lstring(ctx, url_s, url_l); 244 245 if (url_s != NULL) { 246 free(url_s); 247 } 248 249 return 1; 250%} 251 252 253getter Location::hostname() 254%{ 255 char *url_s = NULL; 256 size_t url_l; 257 258 nsurl_get(priv->url, NSURL_HOST, &url_s, &url_l); 259 260 /* if url_s is NULL duk_push_lstring pushes an empty string 261 * which is correct for this API 262 */ 263 duk_push_lstring(ctx, url_s, url_l); 264 265 if (url_s != NULL) { 266 free(url_s); 267 } 268 269 return 1; 270%} 271 272 273 274getter Location::port() 275%{ 276 char *url_s = NULL; 277 size_t url_l; 278 279 nsurl_get(priv->url, NSURL_PORT, &url_s, &url_l); 280 281 /* if url_s is NULL duk_push_lstring pushes an empty string 282 * which is correct for this API 283 */ 284 duk_push_lstring(ctx, url_s, url_l); 285 286 if (url_s != NULL) { 287 free(url_s); 288 } 289 290 return 1; 291%} 292 293 294getter Location::pathname() 295%{ 296 char *url_s = NULL; 297 size_t url_l; 298 299 nsurl_get(priv->url, NSURL_PATH, &url_s, &url_l); 300 301 /* if url_s is NULL duk_push_lstring pushes an empty string 302 * which is correct for this API 303 */ 304 duk_push_lstring(ctx, url_s, url_l); 305 306 if (url_s != NULL) { 307 free(url_s); 308 } 309 310 return 1; 311%} 312 313 314getter Location::search() 315%{ 316 char *url_s = NULL; 317 size_t url_l; 318 319 nsurl_get(priv->url, NSURL_QUERY, &url_s, &url_l); 320 321 /* if url_s is NULL duk_push_lstring pushes an empty string 322 * which is correct for this API 323 */ 324 duk_push_lstring(ctx, url_s, url_l); 325 326 if (url_s != NULL) { 327 free(url_s); 328 } 329 330 return 1; 331%} 332 333 334getter Location::hash() 335%{ 336 char *url_s = NULL; 337 size_t url_l; 338 339 nsurl_get(priv->url, NSURL_FRAGMENT, &url_s, &url_l); 340 341 /* if url_s is NULL duk_push_lstring pushes an empty string 342 * which is correct for this API 343 */ 344 duk_push_lstring(ctx, url_s, url_l); 345 346 if (url_s != NULL) { 347 free(url_s); 348 } 349 350 return 1; 351%} 352 353 354