redirect_cb(WebKitWebView* web_view, WebKitPolicyDecision* decision, WebKitPolicyDecisionType type, gpointer udata) #endif { GtTwitchLoginDlg* self = GT_TWITCH_LOGIN_DLG(udata); GtTwitchLoginDlgPrivate* priv = gt_twitch_login_dlg_get_instance_private(self); GMatchInfo* match_info = NULL; const gchar* uri = NULL; #ifdef USE_DEPRECATED_WEBKIT uri = webkit_network_request_get_uri(request); #else if (type == WEBKIT_POLICY_DECISION_TYPE_NAVIGATION_ACTION) { WebKitNavigationAction* action = webkit_navigation_policy_decision_get_navigation_action( WEBKIT_NAVIGATION_POLICY_DECISION(decision)); WebKitURIRequest* request = webkit_navigation_action_get_request(action); uri = webkit_uri_request_get_uri(request); } #endif if (uri == NULL || strlen(uri) == 0) return FALSE; MESSAGE("Redirect uri is '%s'", uri); g_regex_match(priv->token_redirect_regex, uri, 0, &match_info); if (g_match_info_matches(match_info)) { g_autofree gchar* token = g_match_info_fetch(match_info, 1); MESSAGEF("Successfully got OAuth token '%s'", token); gt_twitch_fetch_oauth_info_async(main_app->twitch, token, fetch_oauth_info_cb, priv->cancel, self); } else if (g_str_has_prefix(uri, "http://localhost/?error=access_denied")) WARNING("Error logging in or login cancelled"); g_match_info_unref(match_info); return FALSE; }
static gboolean wxgtk_webview_webkit_new_window(WebKitPolicyDecision *decision, wxWebViewWebKit *webKitCtrl) { WebKitNavigationPolicyDecision* navigation_decision = WEBKIT_NAVIGATION_POLICY_DECISION(decision); WebKitNavigationAction* action = webkit_navigation_policy_decision_get_navigation_action(navigation_decision); WebKitURIRequest* request = webkit_navigation_action_get_request(action); const gchar* uri = webkit_uri_request_get_uri(request); wxString target = webkit_navigation_policy_decision_get_frame_name(navigation_decision); wxWebViewEvent event(wxEVT_WEBVIEW_NEWWINDOW, webKitCtrl->GetId(), wxString( uri, wxConvUTF8 ), target); if (webKitCtrl && webKitCtrl->GetEventHandler()) webKitCtrl->GetEventHandler()->ProcessEvent(event); //We always want the user to handle this themselves webkit_policy_decision_ignore(decision); return TRUE; }
static void testNavigationPolicy(PolicyClientTest* test, gconstpointer) { test->m_policyDecisionTypeFilter = WEBKIT_POLICY_DECISION_TYPE_NAVIGATION_ACTION; test->m_policyDecisionResponse = PolicyClientTest::Use; test->loadHtml("<html/>", "http://webkitgtk.org/"); test->waitUntilLoadFinished(); g_assert_cmpint(test->m_loadEvents.size(), ==, 3); // Ideally we'd like to have a more intensive test here, but it's still pretty tricky // to trigger different types of navigations with the GTK+ WebKit2 API. WebKitNavigationPolicyDecision* decision = WEBKIT_NAVIGATION_POLICY_DECISION(test->m_previousPolicyDecision.get()); g_assert_cmpint(webkit_navigation_policy_decision_get_navigation_type(decision), ==, WEBKIT_NAVIGATION_TYPE_OTHER); g_assert_cmpint(webkit_navigation_policy_decision_get_mouse_button(decision), ==, 0); g_assert_cmpint(webkit_navigation_policy_decision_get_modifiers(decision), ==, 0); g_assert_cmpstr(webkit_navigation_policy_decision_get_frame_name(decision), ==, 0); WebKitURIRequest* request = webkit_navigation_policy_decision_get_request(decision); g_assert_cmpstr(webkit_uri_request_get_uri(request), ==, "http://webkitgtk.org/"); test->m_policyDecisionResponse = PolicyClientTest::Use; test->m_respondToPolicyDecisionAsynchronously = true; test->loadHtml("<html/>", "http://webkitgtk.org/"); test->waitUntilLoadFinished(); g_assert_cmpint(test->m_loadEvents.size(), ==, 3); // If we are waiting until load completion, it will never complete if we ignore the // navigation. So we tell the main loop to quit sometime later. test->m_policyDecisionResponse = PolicyClientTest::Ignore; test->m_respondToPolicyDecisionAsynchronously = false; test->m_haltMainLoopAfterMakingDecision = true; test->loadHtml("<html/>", "http://webkitgtk.org/"); test->waitUntilLoadFinished(); g_assert_cmpint(test->m_loadEvents.size(), ==, 0); test->m_policyDecisionResponse = PolicyClientTest::Ignore; test->loadHtml("<html/>", "http://webkitgtk.org/"); test->waitUntilLoadFinished(); g_assert_cmpint(test->m_loadEvents.size(), ==, 0); }
static void testNewWindowPolicy(PolicyClientTest* test, gconstpointer) { static const char* windowOpeningHTML = "<html><body>" " <a id=\"link\" href=\"http://www.google.com\" target=\"_blank\">Link</a>" " <script>" " var event = document.createEvent('MouseEvents');" " event.initEvent('click', true, false);" " document.getElementById('link').dispatchEvent(event);" " </script>" "</body></html>"; test->m_policyDecisionTypeFilter = WEBKIT_POLICY_DECISION_TYPE_NEW_WINDOW_ACTION; webkit_settings_set_javascript_can_open_windows_automatically(webkit_web_view_get_settings(test->m_webView), TRUE); CreateCallbackData data; data.triedToOpenWindow = false; data.mainLoop = test->m_mainLoop; g_signal_connect(test->m_webView, "create", G_CALLBACK(createCallback), &data); test->m_policyDecisionResponse = PolicyClientTest::Use; test->loadHtml(windowOpeningHTML, "http://webkitgtk.org/"); test->wait(1); g_assert(data.triedToOpenWindow); WebKitNavigationPolicyDecision* decision = WEBKIT_NAVIGATION_POLICY_DECISION(test->m_previousPolicyDecision.get()); g_assert_cmpstr(webkit_navigation_policy_decision_get_frame_name(decision), ==, "_blank"); // Using a short timeout is a bit ugly here, but it's hard to get around because if we block // the new window signal we cannot halt the main loop in the create callback. If we // halt the main loop in the policy decision, the create callback never executes. data.triedToOpenWindow = false; test->m_policyDecisionResponse = PolicyClientTest::Ignore; test->loadHtml(windowOpeningHTML, "http://webkitgtk.org/"); test->wait(.2); g_assert(!data.triedToOpenWindow); }
static gboolean wxgtk_webview_webkit_navigation(WebKitWebView *web_view, WebKitPolicyDecision *decision, wxWebViewWebKit *webKitCtrl) { WebKitNavigationPolicyDecision* navigation_decision = WEBKIT_NAVIGATION_POLICY_DECISION(decision); WebKitNavigationAction* action = webkit_navigation_policy_decision_get_navigation_action(navigation_decision); WebKitURIRequest* request = webkit_navigation_action_get_request(action); const gchar* uri = webkit_uri_request_get_uri(request); wxString target = webkit_navigation_policy_decision_get_frame_name(navigation_decision); //If m_creating is true then we are the result of a new window //and so we need to send the event and veto the load if(webKitCtrl->m_creating) { webKitCtrl->m_creating = false; wxWebViewEvent event(wxEVT_WEBVIEW_NEWWINDOW, webKitCtrl->GetId(), wxString(uri, wxConvUTF8), target); if(webKitCtrl && webKitCtrl->GetEventHandler()) webKitCtrl->GetEventHandler()->ProcessEvent(event); webkit_policy_decision_ignore(decision); return TRUE; } if(webKitCtrl->m_guard) { webKitCtrl->m_guard = false; //We set this to make sure that we don't try to load the page again from //the resource request callback webKitCtrl->m_vfsurl = webkit_web_view_get_uri(web_view); webkit_policy_decision_use(decision); return FALSE; } webKitCtrl->m_busy = true; wxWebViewEvent event(wxEVT_WEBVIEW_NAVIGATING, webKitCtrl->GetId(), wxString( uri, wxConvUTF8 ), target); if (webKitCtrl && webKitCtrl->GetEventHandler()) webKitCtrl->GetEventHandler()->ProcessEvent(event); if (!event.IsAllowed()) { webKitCtrl->m_busy = false; webkit_policy_decision_ignore(decision); return TRUE; } else { wxString wxuri = uri; wxSharedPtr<wxWebViewHandler> handler; wxVector<wxSharedPtr<wxWebViewHandler> > handlers = webKitCtrl->GetHandlers(); //We are not vetoed so see if we match one of the additional handlers for(wxVector<wxSharedPtr<wxWebViewHandler> >::iterator it = handlers.begin(); it != handlers.end(); ++it) { if(wxuri.substr(0, (*it)->GetName().length()) == (*it)->GetName()) { handler = (*it); } } //If we found a handler we can then use it to load the file directly //ourselves if(handler) { webKitCtrl->m_guard = true; wxFSFile* file = handler->GetFile(wxuri); if(file) { webKitCtrl->SetPage(*file->GetStream(), wxuri); } //We need to throw some sort of error here if file is NULL webkit_policy_decision_ignore(decision); return TRUE; } return FALSE; } }
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; } }