OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/external_protocol/external_protocol_handler.h" | 5 #include "chrome/browser/external_protocol/external_protocol_handler.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
11 #include "base/message_loop/message_loop.h" | 11 #include "base/message_loop/message_loop.h" |
12 #include "base/prefs/pref_registry_simple.h" | 12 #include "base/prefs/pref_registry_simple.h" |
13 #include "base/prefs/pref_service.h" | 13 #include "base/prefs/pref_service.h" |
14 #include "base/prefs/scoped_user_pref_update.h" | 14 #include "base/prefs/scoped_user_pref_update.h" |
15 #include "base/strings/string_util.h" | 15 #include "base/strings/string_util.h" |
16 #include "base/threading/thread.h" | 16 #include "base/threading/thread.h" |
17 #include "build/build_config.h" | 17 #include "build/build_config.h" |
18 #include "chrome/browser/browser_process.h" | 18 #include "chrome/browser/browser_process.h" |
19 #include "chrome/browser/platform_util.h" | 19 #include "chrome/browser/platform_util.h" |
| 20 #include "chrome/browser/profiles/profile.h" |
| 21 #include "chrome/browser/tab_contents/tab_util.h" |
20 #include "chrome/common/pref_names.h" | 22 #include "chrome/common/pref_names.h" |
21 #include "content/public/browser/browser_thread.h" | 23 #include "content/public/browser/browser_thread.h" |
| 24 #include "content/public/browser/web_contents.h" |
22 #include "net/base/escape.h" | 25 #include "net/base/escape.h" |
23 #include "url/gurl.h" | 26 #include "url/gurl.h" |
24 | 27 |
25 using content::BrowserThread; | 28 using content::BrowserThread; |
26 | 29 |
27 // Whether we accept requests for launching external protocols. This is set to | 30 // Whether we accept requests for launching external protocols. This is set to |
28 // false every time an external protocol is requested, and set back to true on | 31 // false every time an external protocol is requested, and set back to true on |
29 // each user gesture. This variable should only be accessed from the UI thread. | 32 // each user gesture. This variable should only be accessed from the UI thread. |
30 static bool g_accept_requests = true; | 33 static bool g_accept_requests = true; |
31 | 34 |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
63 render_process_host_id, | 66 render_process_host_id, |
64 routing_id); | 67 routing_id); |
65 } else { | 68 } else { |
66 delegate->RunExternalProtocolDialog(url, render_process_host_id, | 69 delegate->RunExternalProtocolDialog(url, render_process_host_id, |
67 routing_id); | 70 routing_id); |
68 } | 71 } |
69 } | 72 } |
70 | 73 |
71 void LaunchUrlWithoutSecurityCheckWithDelegate( | 74 void LaunchUrlWithoutSecurityCheckWithDelegate( |
72 const GURL& url, | 75 const GURL& url, |
| 76 int render_process_host_id, |
| 77 int tab_contents_id, |
73 ExternalProtocolHandler::Delegate* delegate) { | 78 ExternalProtocolHandler::Delegate* delegate) { |
74 if (!delegate) | 79 if (!delegate) { |
75 ExternalProtocolHandler::LaunchUrlWithoutSecurityCheck(url); | 80 ExternalProtocolHandler::LaunchUrlWithoutSecurityCheck( |
76 else | 81 url, render_process_host_id, tab_contents_id); |
| 82 } else { |
77 delegate->LaunchUrlWithoutSecurityCheck(url); | 83 delegate->LaunchUrlWithoutSecurityCheck(url); |
| 84 } |
78 } | 85 } |
79 | 86 |
80 // When we are about to launch a URL with the default OS level application, | 87 // When we are about to launch a URL with the default OS level application, |
81 // we check if that external application will be us. If it is we just ignore | 88 // we check if that external application will be us. If it is we just ignore |
82 // the request. | 89 // the request. |
83 class ExternalDefaultProtocolObserver | 90 class ExternalDefaultProtocolObserver |
84 : public ShellIntegration::DefaultWebClientObserver { | 91 : public ShellIntegration::DefaultWebClientObserver { |
85 public: | 92 public: |
86 ExternalDefaultProtocolObserver(const GURL& escaped_url, | 93 ExternalDefaultProtocolObserver(const GURL& escaped_url, |
87 int render_process_host_id, | 94 int render_process_host_id, |
(...skipping 29 matching lines...) Expand all Loading... |
117 // what the default is, so we proceed. | 124 // what the default is, so we proceed. |
118 if (prompt_user_) { | 125 if (prompt_user_) { |
119 // Ask the user if they want to allow the protocol. This will call | 126 // Ask the user if they want to allow the protocol. This will call |
120 // LaunchUrlWithoutSecurityCheck if the user decides to accept the | 127 // LaunchUrlWithoutSecurityCheck if the user decides to accept the |
121 // protocol. | 128 // protocol. |
122 RunExternalProtocolDialogWithDelegate(escaped_url_, | 129 RunExternalProtocolDialogWithDelegate(escaped_url_, |
123 render_process_host_id_, tab_contents_id_, delegate_); | 130 render_process_host_id_, tab_contents_id_, delegate_); |
124 return; | 131 return; |
125 } | 132 } |
126 | 133 |
127 LaunchUrlWithoutSecurityCheckWithDelegate(escaped_url_, delegate_); | 134 LaunchUrlWithoutSecurityCheckWithDelegate( |
| 135 escaped_url_, render_process_host_id_, tab_contents_id_, delegate_); |
128 } | 136 } |
129 | 137 |
130 virtual bool IsOwnedByWorker() OVERRIDE { return true; } | 138 virtual bool IsOwnedByWorker() OVERRIDE { return true; } |
131 | 139 |
132 private: | 140 private: |
133 ExternalProtocolHandler::Delegate* delegate_; | 141 ExternalProtocolHandler::Delegate* delegate_; |
134 GURL escaped_url_; | 142 GURL escaped_url_; |
135 int render_process_host_id_; | 143 int render_process_host_id_; |
136 int tab_contents_id_; | 144 int tab_contents_id_; |
137 bool prompt_user_; | 145 bool prompt_user_; |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
275 scoped_refptr<ShellIntegration::DefaultProtocolClientWorker> worker = | 283 scoped_refptr<ShellIntegration::DefaultProtocolClientWorker> worker = |
276 CreateShellWorker(observer, escaped_url.scheme(), delegate); | 284 CreateShellWorker(observer, escaped_url.scheme(), delegate); |
277 | 285 |
278 // Start the check process running. This will send tasks to the FILE thread | 286 // Start the check process running. This will send tasks to the FILE thread |
279 // and when the answer is known will send the result back to the observer on | 287 // and when the answer is known will send the result back to the observer on |
280 // the UI thread. | 288 // the UI thread. |
281 worker->StartCheckIsDefault(); | 289 worker->StartCheckIsDefault(); |
282 } | 290 } |
283 | 291 |
284 // static | 292 // static |
285 void ExternalProtocolHandler::LaunchUrlWithoutSecurityCheck(const GURL& url) { | 293 void ExternalProtocolHandler::LaunchUrlWithoutSecurityCheck( |
286 #if defined(OS_MACOSX) | 294 const GURL& url, |
287 // This must run on the UI thread on OS X. | 295 int render_process_host_id, |
288 platform_util::OpenExternal(url); | 296 int tab_contents_id) { |
289 #else | 297 content::WebContents* web_contents = tab_util::GetWebContentsByID( |
290 // Otherwise put this work on the file thread. On Windows ShellExecute may | 298 render_process_host_id, tab_contents_id); |
291 // block for a significant amount of time, and it shouldn't hurt on Linux. | 299 if (!web_contents) |
292 BrowserThread::PostTask( | 300 return; |
293 BrowserThread::FILE, | 301 |
294 FROM_HERE, | 302 platform_util::OpenExternal( |
295 base::Bind(&platform_util::OpenExternal, url)); | 303 Profile::FromBrowserContext(web_contents->GetBrowserContext()), url); |
296 #endif | |
297 } | 304 } |
298 | 305 |
299 // static | 306 // static |
300 void ExternalProtocolHandler::RegisterPrefs(PrefRegistrySimple* registry) { | 307 void ExternalProtocolHandler::RegisterPrefs(PrefRegistrySimple* registry) { |
301 registry->RegisterDictionaryPref(prefs::kExcludedSchemes); | 308 registry->RegisterDictionaryPref(prefs::kExcludedSchemes); |
302 } | 309 } |
303 | 310 |
304 // static | 311 // static |
305 void ExternalProtocolHandler::PermitLaunchUrl() { | 312 void ExternalProtocolHandler::PermitLaunchUrl() { |
306 DCHECK_EQ(base::MessageLoop::TYPE_UI, base::MessageLoop::current()->type()); | 313 DCHECK_EQ(base::MessageLoop::TYPE_UI, base::MessageLoop::current()->type()); |
307 g_accept_requests = true; | 314 g_accept_requests = true; |
308 } | 315 } |
OLD | NEW |