Index: chrome/browser/ui/extensions/shell_window.cc |
diff --git a/chrome/browser/ui/extensions/shell_window.cc b/chrome/browser/ui/extensions/shell_window.cc |
index 0ac8a5f058f6644d8b150cbc5c03f2b5b7d4d38c..87b9690d07afb55bd91c55ee3a716c7f4dc1f6d3 100644 |
--- a/chrome/browser/ui/extensions/shell_window.cc |
+++ b/chrome/browser/ui/extensions/shell_window.cc |
@@ -17,6 +17,7 @@ |
#include "chrome/browser/file_select_helper.h" |
#include "chrome/browser/lifetime/application_lifetime.h" |
#include "chrome/browser/media/media_capture_devices_dispatcher.h" |
+#include "chrome/browser/platform_util.h" |
#include "chrome/browser/profiles/profile.h" |
#include "chrome/browser/sessions/session_id.h" |
#include "chrome/browser/ui/browser.h" |
@@ -67,6 +68,23 @@ const int kPreferredIconSize = ash::kLauncherPreferredSize; |
const int kPreferredIconSize = extension_misc::EXTENSION_ICON_SMALL; |
#endif |
+static bool disable_external_open_for_testing_ = false; |
+ |
+class ShellWindowLinkDelegate : public content::WebContentsDelegate { |
+ private: |
+ virtual content::WebContents* OpenURLFromTab( |
+ content::WebContents* source, |
+ const content::OpenURLParams& params) OVERRIDE; |
+}; |
+ |
+content::WebContents* ShellWindowLinkDelegate::OpenURLFromTab( |
+ content::WebContents* source, |
+ const content::OpenURLParams& params) { |
+ platform_util::OpenExternal(params.url); |
+ delete source; |
+ return NULL; |
miket_OOO
2013/06/03 21:12:38
Hmmm. Is this a common pattern? Fine if it is; it
Ken Rockot(use gerrit already)
2013/06/03 21:24:47
It's not terribly common, but it's not unheard of.
|
+} |
+ |
} // namespace |
ShellWindow::CreateParams::CreateParams() |
@@ -284,6 +302,20 @@ void ShellWindow::AddNewContents(WebContents* source, |
bool* was_blocked) { |
DCHECK(Profile::FromBrowserContext(new_contents->GetBrowserContext()) == |
profile_); |
+#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN) |
+ if (disable_external_open_for_testing_) { |
+ Browser* browser = |
+ chrome::FindOrCreateTabbedBrowser(profile_, chrome::GetActiveDesktop()); |
+ // Force all links to open in a new tab, even if they were trying to open a |
+ // new window. |
+ disposition = |
+ disposition == NEW_BACKGROUND_TAB ? disposition : NEW_FOREGROUND_TAB; |
+ chrome::AddWebContents(browser, NULL, new_contents, disposition, |
+ initial_pos, user_gesture, was_blocked); |
+ } else { |
+ new_contents->SetDelegate(new ShellWindowLinkDelegate()); |
+ } |
+#else |
Browser* browser = |
chrome::FindOrCreateTabbedBrowser(profile_, chrome::GetActiveDesktop()); |
// Force all links to open in a new tab, even if they were trying to open a |
@@ -292,6 +324,7 @@ void ShellWindow::AddNewContents(WebContents* source, |
disposition == NEW_BACKGROUND_TAB ? disposition : NEW_FOREGROUND_TAB; |
chrome::AddWebContents(browser, NULL, new_contents, disposition, initial_pos, |
user_gesture, was_blocked); |
+#endif |
} |
void ShellWindow::HandleKeyboardEvent( |
@@ -605,3 +638,8 @@ SkRegion* ShellWindow::RawDraggableRegionsToSkRegion( |
} |
return sk_region; |
} |
+ |
+void ShellWindow::DisableExternalOpenForTesting() { |
+ disable_external_open_for_testing_ = true; |
+} |
+ |