[GTK] Open links in a new window when clicking with the middle button in MiniBrowser
authorcarlosgc@webkit.org <carlosgc@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 8 Feb 2012 15:51:08 +0000 (15:51 +0000)
committercarlosgc@webkit.org <carlosgc@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 8 Feb 2012 15:51:08 +0000 (15:51 +0000)
https://bugs.webkit.org/show_bug.cgi?id=78099

Reviewed by Martin Robinson.

* MiniBrowser/gtk/BrowserWindow.c:
(webViewDecidePolicy): Check whether it's a link clicked with the
middle mouse button and load the request in a new window.
(browserWindowConstructed): Connect to
WebKitWebView::decide-policy signal.

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@107088 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Tools/ChangeLog
Tools/MiniBrowser/gtk/BrowserWindow.c

index e884946..7046506 100644 (file)
@@ -1,3 +1,16 @@
+2012-02-08  Carlos Garcia Campos  <cgarcia@igalia.com>
+
+        [GTK] Open links in a new window when clicking with the middle button in MiniBrowser
+        https://bugs.webkit.org/show_bug.cgi?id=78099
+
+        Reviewed by Martin Robinson.
+
+        * MiniBrowser/gtk/BrowserWindow.c:
+        (webViewDecidePolicy): Check whether it's a link clicked with the
+        middle mouse button and load the request in a new window.
+        (browserWindowConstructed): Connect to
+        WebKitWebView::decide-policy signal.
+
 2012-02-08  Ryosuke Niwa  <rniwa@webkit.org>
 
         Revert a part of the change in r106687 as a build fix.
index e04ab0b..4d6bde4 100644 (file)
@@ -235,6 +235,26 @@ static gboolean webViewLoadFailed(WebKitWebView *webView, WebKitLoadEvent loadEv
     return FALSE;
 }
 
+static gboolean webViewDecidePolicy(WebKitWebView *webView, WebKitPolicyDecision *decision, WebKitPolicyDecisionType decisionType, BrowserWindow *window)
+{
+    if (decisionType != WEBKIT_POLICY_DECISION_TYPE_NAVIGATION_ACTION)
+        return FALSE;
+
+    WebKitNavigationPolicyDecision *navigationDecision = WEBKIT_NAVIGATION_POLICY_DECISION(decision);
+    if (webkit_navigation_policy_decision_get_navigation_type(navigationDecision) != WEBKIT_NAVIGATION_TYPE_LINK_CLICKED
+        || webkit_navigation_policy_decision_get_mouse_button(navigationDecision) != 2)
+        return FALSE;
+
+    WebKitWebView *newWebView = WEBKIT_WEB_VIEW(webkit_web_view_new_with_context(webkit_web_view_get_context(webView)));
+    webkit_web_view_set_settings(newWebView, webkit_web_view_get_settings(webView));
+    GtkWidget *newWindow = browser_window_new(newWebView);
+    webkit_web_view_load_request(newWebView, webkit_navigation_policy_decision_get_request(navigationDecision));
+    gtk_widget_show(newWindow);
+
+    webkit_policy_decision_ignore(decision);
+    return TRUE;
+}
+
 static void browserWindowFinalize(GObject *gObject)
 {
     G_OBJECT_CLASS(browser_window_parent_class)->finalize(gObject);
@@ -333,6 +353,7 @@ static void browserWindowConstructed(GObject *gObject)
     g_signal_connect(window->webView, "notify::title", G_CALLBACK(webViewTitleChanged), window);
     g_signal_connect(window->webView, "create", G_CALLBACK(webViewCreate), window);
     g_signal_connect(window->webView, "load-failed", G_CALLBACK(webViewLoadFailed), window);
+    g_signal_connect(window->webView, "decide-policy", G_CALLBACK(webViewDecidePolicy), window);
 
     WebKitBackForwardList *backForwadlist = webkit_web_view_get_back_forward_list(window->webView);
     g_signal_connect(backForwadlist, "changed", G_CALLBACK(backForwadlistChanged), window);