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