From be3469f7f445ed4200cdccf1e0decee02364eebc Mon Sep 17 00:00:00 2001 From: "carlosgc@webkit.org" Date: Wed, 8 Feb 2012 15:51:08 +0000 Subject: [PATCH] [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. git-svn-id: http://svn.webkit.org/repository/webkit/trunk@107088 268f45cc-cd09-0410-ab3c-d52691b4dbfc --- Tools/ChangeLog | 13 +++++++++++++ Tools/MiniBrowser/gtk/BrowserWindow.c | 21 +++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/Tools/ChangeLog b/Tools/ChangeLog index e884946..7046506 100644 --- a/Tools/ChangeLog +++ b/Tools/ChangeLog @@ -1,3 +1,16 @@ +2012-02-08 Carlos Garcia Campos + + [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 Revert a part of the change in r106687 as a build fix. diff --git a/Tools/MiniBrowser/gtk/BrowserWindow.c b/Tools/MiniBrowser/gtk/BrowserWindow.c index e04ab0b..4d6bde4 100644 --- a/Tools/MiniBrowser/gtk/BrowserWindow.c +++ b/Tools/MiniBrowser/gtk/BrowserWindow.c @@ -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); -- 2.7.4