static gboolean policy_cb (WebKitWebView *v, WebKitPolicyDecision *pd, WebKitPolicyDecisionType pt, gpointer d) { if (is_loaded && !options.html_data.browser) { WebKitNavigationAction *act = webkit_navigation_policy_decision_get_navigation_action (WEBKIT_NAVIGATION_POLICY_DECISION (pd)); webkit_policy_decision_ignore (pd); if (webkit_navigation_action_get_navigation_type (act) == WEBKIT_NAVIGATION_TYPE_LINK_CLICKED) { WebKitURIRequest *r = webkit_navigation_action_get_request (act); gchar *uri = (gchar *) webkit_uri_request_get_uri (r); if (options.html_data.print_uri) g_printf ("%s\n", uri); else g_app_info_launch_default_for_uri (uri, NULL, NULL); } } else return FALSE; return TRUE; }
static gboolean webViewDecidePolicy(WebKitWebView *webView, WebKitPolicyDecision *decision, WebKitPolicyDecisionType decisionType, BrowserWindow *window) { switch (decisionType) { case WEBKIT_POLICY_DECISION_TYPE_NAVIGATION_ACTION: { WebKitNavigationAction *navigationAction = webkit_navigation_policy_decision_get_navigation_action(WEBKIT_NAVIGATION_POLICY_DECISION(decision)); if (webkit_navigation_action_get_navigation_type(navigationAction) != WEBKIT_NAVIGATION_TYPE_LINK_CLICKED || webkit_navigation_action_get_mouse_button(navigationAction) != GDK_BUTTON_MIDDLE) return FALSE; // Opening a new window if link clicked with the middle button. WebKitWebView *newWebView = WEBKIT_WEB_VIEW(webkit_web_view_new_with_context(webkit_web_view_get_context(webView))); GtkWidget *newWindow = browser_window_new(newWebView, GTK_WINDOW(window)); webkit_web_view_load_request(newWebView, webkit_navigation_action_get_request(navigationAction)); gtk_widget_show(newWindow); webkit_policy_decision_ignore(decision); return TRUE; } case WEBKIT_POLICY_DECISION_TYPE_RESPONSE: { WebKitResponsePolicyDecision *responseDecision = WEBKIT_RESPONSE_POLICY_DECISION(decision); if (webkit_response_policy_decision_is_mime_type_supported(responseDecision)) return FALSE; WebKitWebResource *mainResource = webkit_web_view_get_main_resource(webView); WebKitURIRequest *request = webkit_response_policy_decision_get_request(responseDecision); const char *requestURI = webkit_uri_request_get_uri(request); if (g_strcmp0(webkit_web_resource_get_uri(mainResource), requestURI)) return FALSE; webkit_policy_decision_download(decision); return TRUE; } case WEBKIT_POLICY_DECISION_TYPE_NEW_WINDOW_ACTION: default: return FALSE; } }
WebKitNavigationResponse juniper_events_navigation_requested(WebKitWebView * page, WebKitNavigationAction * action, WebKitWebFrame * frame, WebKitNetworkRequest * request, GtkVBox * tab) { gint button, modifier_flags, navigation_type; const gchar * url; button = webkit_navigation_action_get_button(action); navigation_type = webkit_navigation_action_get_navigation_type(action); modifier_flags = webkit_navigation_action_get_modifier_flags(action); url = webkit_navigation_action_get_original_url(action); #ifdef DEBUG printf("navigation requested: button=%i, navigation_type=%i, modifier_flags=%i, url=%s\n", button, navigation_type, modifier_flags, url); #endif if (button == 1 || (button == 0 && (modifier_flags & GDK_CONTROL_MASK))) /* middle click or ctrl-click */ { juniper_tabs_add_with_location(url); return WEBKIT_NAVIGATION_RESPONSE_IGNORE; } juniper_ui_status_bar_update(juniper_util_sprintf("Navigating to %s", url)); return WEBKIT_NAVIGATION_RESPONSE_ACCEPT; }