| Index: chrome/browser/external_protocol/external_protocol_handler.cc
|
| diff --git a/chrome/browser/external_protocol/external_protocol_handler.cc b/chrome/browser/external_protocol/external_protocol_handler.cc
|
| index 2f9b4d9f985fc9776f11fa0ac4e1066c93ca1315..291652d5e929122ab34c6b95924798160ba6051b 100644
|
| --- a/chrome/browser/external_protocol/external_protocol_handler.cc
|
| +++ b/chrome/browser/external_protocol/external_protocol_handler.cc
|
| @@ -17,8 +17,11 @@
|
| #include "build/build_config.h"
|
| #include "chrome/browser/browser_process.h"
|
| #include "chrome/browser/platform_util.h"
|
| +#include "chrome/browser/profiles/profile.h"
|
| +#include "chrome/browser/tab_contents/tab_util.h"
|
| #include "chrome/common/pref_names.h"
|
| #include "content/public/browser/browser_thread.h"
|
| +#include "content/public/browser/web_contents.h"
|
| #include "net/base/escape.h"
|
| #include "url/gurl.h"
|
|
|
| @@ -70,11 +73,15 @@ void RunExternalProtocolDialogWithDelegate(
|
|
|
| void LaunchUrlWithoutSecurityCheckWithDelegate(
|
| const GURL& url,
|
| + int render_process_host_id,
|
| + int tab_contents_id,
|
| ExternalProtocolHandler::Delegate* delegate) {
|
| - if (!delegate)
|
| - ExternalProtocolHandler::LaunchUrlWithoutSecurityCheck(url);
|
| - else
|
| + if (!delegate) {
|
| + ExternalProtocolHandler::LaunchUrlWithoutSecurityCheck(
|
| + url, render_process_host_id, tab_contents_id);
|
| + } else {
|
| delegate->LaunchUrlWithoutSecurityCheck(url);
|
| + }
|
| }
|
|
|
| // When we are about to launch a URL with the default OS level application,
|
| @@ -124,7 +131,8 @@ class ExternalDefaultProtocolObserver
|
| return;
|
| }
|
|
|
| - LaunchUrlWithoutSecurityCheckWithDelegate(escaped_url_, delegate_);
|
| + LaunchUrlWithoutSecurityCheckWithDelegate(
|
| + escaped_url_, render_process_host_id_, tab_contents_id_, delegate_);
|
| }
|
|
|
| virtual bool IsOwnedByWorker() OVERRIDE { return true; }
|
| @@ -282,18 +290,17 @@ void ExternalProtocolHandler::LaunchUrlWithDelegate(const GURL& url,
|
| }
|
|
|
| // static
|
| -void ExternalProtocolHandler::LaunchUrlWithoutSecurityCheck(const GURL& url) {
|
| -#if defined(OS_MACOSX)
|
| - // This must run on the UI thread on OS X.
|
| - platform_util::OpenExternal(url);
|
| -#else
|
| - // Otherwise put this work on the file thread. On Windows ShellExecute may
|
| - // block for a significant amount of time, and it shouldn't hurt on Linux.
|
| - BrowserThread::PostTask(
|
| - BrowserThread::FILE,
|
| - FROM_HERE,
|
| - base::Bind(&platform_util::OpenExternal, url));
|
| -#endif
|
| +void ExternalProtocolHandler::LaunchUrlWithoutSecurityCheck(
|
| + const GURL& url,
|
| + int render_process_host_id,
|
| + int tab_contents_id) {
|
| + content::WebContents* web_contents = tab_util::GetWebContentsByID(
|
| + render_process_host_id, tab_contents_id);
|
| + if (!web_contents)
|
| + return;
|
| +
|
| + platform_util::OpenExternal(
|
| + Profile::FromBrowserContext(web_contents->GetBrowserContext()), url);
|
| }
|
|
|
| // static
|
|
|