From 2f7e17fbf9b0f433041a9ade8f04c0936a36688d Mon Sep 17 00:00:00 2001 From: Jake Probst Date: Mon, 22 Mar 2010 10:51:14 +0800 Subject: Fixed window.open and javascript links that open new windows --- src/callbacks.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- src/callbacks.h | 3 +++ src/uzbl-core.c | 1 + src/uzbl-core.h | 1 + 4 files changed, 63 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/callbacks.c b/src/callbacks.c index d3545cc..e8a1ce0 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -289,6 +289,12 @@ cmd_useragent() { } } +void +cmd_javascript_windows() { + g_object_set (G_OBJECT(view_settings()), "javascript-can-open-windows-automatically", + uzbl.behave.javascript_windows, NULL); +} + void cmd_scrollbars_visibility() { if(uzbl.gui.scrollbars_visible) { @@ -640,6 +646,7 @@ new_window_cb (WebKitWebView *web_view, WebKitWebFrame *frame, if (uzbl.state.verbose) printf("New window requested -> %s \n", webkit_network_request_get_uri (request)); + send_event(NEW_WINDOW, webkit_network_request_get_uri (request), NULL); webkit_web_policy_decision_ignore(policy_decision); return TRUE; @@ -674,6 +681,36 @@ request_starting_cb(WebKitWebView *web_view, WebKitWebFrame *frame, WebKitWebRes send_event(REQUEST_STARTING, webkit_network_request_get_uri(request), NULL); } +void +create_web_view_js2_cb (WebKitWebView* web_view, GParamSpec param_spec) { + (void) web_view; + (void) param_spec; + + const gchar* uri = webkit_web_view_get_uri(web_view); + + printf("uri: %s\n", uri); + if (strncmp(uri, "javascript:", strlen("javascript:")) == 0) { + printf("js!\n"); + eval_js(uzbl.gui.web_view, (gchar*) uri + strlen("javascript:"), NULL, "javascript:"); + } + else + send_event(NEW_WINDOW, uri, NULL); + + gtk_widget_destroy(GTK_WIDGET(web_view)); +} + + +gboolean +create_web_view_js_cb (WebKitWebView* web_view, gpointer user_data) { + (void) web_view; + (void) user_data; + + g_object_connect (web_view, "signal::notify::uri", + G_CALLBACK(create_web_view_js2_cb), NULL); + return TRUE; +} + + /*@null@*/ WebKitWebView* create_web_view_cb (WebKitWebView *web_view, WebKitWebFrame *frame, gpointer user_data) { (void) web_view; @@ -682,10 +719,29 @@ create_web_view_cb (WebKitWebView *web_view, WebKitWebFrame *frame, gpointer us if (uzbl.state.selected_url != NULL) { if (uzbl.state.verbose) printf("\nNew web view -> %s\n", uzbl.state.selected_url); - send_event(NEW_WINDOW, uzbl.state.selected_url, NULL); + + if (strncmp(uzbl.state.selected_url, "javascript:", strlen("javascript:")) == 0) { + printf("js: %s\n", uzbl.state.selected_url+strlen("javascript:")); + + WebKitWebView* new_view = WEBKIT_WEB_VIEW(webkit_web_view_new()); + + g_signal_connect (new_view, "web-view-ready", + G_CALLBACK(create_web_view_js_cb), NULL); + + return new_view; + } + else + send_event(NEW_WINDOW, uzbl.state.selected_url, NULL); + } else { if (uzbl.state.verbose) - printf("New web view -> %s\n","Nothing to open, exiting"); + printf("New web view -> javascript link...\n"); + + WebKitWebView* new_view = WEBKIT_WEB_VIEW(webkit_web_view_new()); + + g_signal_connect (new_view, "web-view-ready", + G_CALLBACK(create_web_view_js_cb), NULL); + return new_view; } return NULL; } diff --git a/src/callbacks.h b/src/callbacks.h index 278a31a..30274d6 100644 --- a/src/callbacks.h +++ b/src/callbacks.h @@ -109,6 +109,9 @@ cmd_inject_html(); void cmd_caret_browsing(); +void +cmd_javascript_windows(); + void cmd_set_geometry(); diff --git a/src/uzbl-core.c b/src/uzbl-core.c index 5287431..453c99d 100644 --- a/src/uzbl-core.c +++ b/src/uzbl-core.c @@ -109,6 +109,7 @@ const struct var_name_to_ptr_t { { "max_conns", PTR_V_INT(uzbl.net.max_conns, 1, cmd_max_conns)}, { "max_conns_host", PTR_V_INT(uzbl.net.max_conns_host, 1, cmd_max_conns_host)}, { "useragent", PTR_V_STR(uzbl.net.useragent, 1, cmd_useragent)}, + { "javascript_windows", PTR_V_INT(uzbl.behave.javascript_windows, 1, cmd_javascript_windows)}, /* requires webkit >=1.1.14 */ { "view_source", PTR_V_INT(uzbl.behave.view_source, 0, cmd_view_source)}, diff --git a/src/uzbl-core.h b/src/uzbl-core.h index e3a5020..3078c73 100644 --- a/src/uzbl-core.h +++ b/src/uzbl-core.h @@ -156,6 +156,7 @@ typedef struct { guint enforce_96dpi; gchar *inject_html; guint caret_browsing; + guint javascript_windows; guint mode; gchar* base_url; gboolean print_version; -- cgit v1.2.3