| 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/custom_handlers/protocol_handler_registry.h" | 5 #include "chrome/browser/custom_handlers/protocol_handler_registry.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <utility> | 10 #include <utility> |
| 11 | 11 |
| 12 #include "base/bind.h" | 12 #include "base/bind.h" |
| 13 #include "base/command_line.h" | 13 #include "base/command_line.h" |
| 14 #include "base/logging.h" | 14 #include "base/logging.h" |
| 15 #include "base/macros.h" | 15 #include "base/macros.h" |
| 16 #include "base/memory/ptr_util.h" | 16 #include "base/memory/ptr_util.h" |
| 17 #include "base/memory/ref_counted.h" |
| 17 #include "build/build_config.h" | 18 #include "build/build_config.h" |
| 18 #include "chrome/browser/chrome_notification_types.h" | 19 #include "chrome/browser/chrome_notification_types.h" |
| 19 #include "chrome/browser/profiles/profile_io_data.h" | 20 #include "chrome/browser/profiles/profile_io_data.h" |
| 20 #include "chrome/common/custom_handlers/protocol_handler.h" | 21 #include "chrome/common/custom_handlers/protocol_handler.h" |
| 21 #include "chrome/common/pref_names.h" | 22 #include "chrome/common/pref_names.h" |
| 22 #include "chrome/grit/generated_resources.h" | 23 #include "chrome/grit/generated_resources.h" |
| 23 #include "components/pref_registry/pref_registry_syncable.h" | 24 #include "components/pref_registry/pref_registry_syncable.h" |
| 24 #include "components/prefs/pref_service.h" | 25 #include "components/prefs/pref_service.h" |
| 25 #include "components/user_prefs/user_prefs.h" | 26 #include "components/user_prefs/user_prefs.h" |
| 26 #include "content/public/browser/child_process_security_policy.h" | 27 #include "content/public/browser/child_process_security_policy.h" |
| (...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 240 const std::string& protocol) { | 241 const std::string& protocol) { |
| 241 } | 242 } |
| 242 | 243 |
| 243 bool ProtocolHandlerRegistry::Delegate::IsExternalHandlerRegistered( | 244 bool ProtocolHandlerRegistry::Delegate::IsExternalHandlerRegistered( |
| 244 const std::string& protocol) { | 245 const std::string& protocol) { |
| 245 // NOTE(koz): This function is safe to call from any thread, despite living | 246 // NOTE(koz): This function is safe to call from any thread, despite living |
| 246 // in ProfileIOData. | 247 // in ProfileIOData. |
| 247 return ProfileIOData::IsHandledProtocol(protocol); | 248 return ProfileIOData::IsHandledProtocol(protocol); |
| 248 } | 249 } |
| 249 | 250 |
| 250 scoped_refptr<shell_integration::DefaultProtocolClientWorker> | |
| 251 ProtocolHandlerRegistry::Delegate::CreateShellWorker( | |
| 252 const shell_integration::DefaultWebClientWorkerCallback& callback, | |
| 253 const std::string& protocol) { | |
| 254 return new shell_integration::DefaultProtocolClientWorker(callback, protocol); | |
| 255 } | |
| 256 | |
| 257 void ProtocolHandlerRegistry::Delegate::RegisterWithOSAsDefaultClient( | 251 void ProtocolHandlerRegistry::Delegate::RegisterWithOSAsDefaultClient( |
| 258 const std::string& protocol, ProtocolHandlerRegistry* registry) { | 252 const std::string& protocol, ProtocolHandlerRegistry* registry) { |
| 259 // The worker pointer is reference counted. While it is running, the | 253 // The worker pointer is reference counted. While it is running, the |
| 260 // message loops of the FILE and UI thread will hold references to it | 254 // sequence it runs on will hold references it will be automatically freed |
| 261 // and it will be automatically freed once all its tasks have finished. | 255 // once all its tasks have finished. |
| 262 CreateShellWorker(registry->GetDefaultWebClientCallback(protocol), protocol) | 256 base::MakeRefCounted<shell_integration::DefaultProtocolClientWorker>( |
| 257 registry->GetDefaultWebClientCallback(protocol), protocol) |
| 263 ->StartSetAsDefault(); | 258 ->StartSetAsDefault(); |
| 264 } | 259 } |
| 265 | 260 |
| 266 // ProtocolHandlerRegistry ----------------------------------------------------- | 261 // ProtocolHandlerRegistry ----------------------------------------------------- |
| 267 | 262 |
| 268 ProtocolHandlerRegistry::ProtocolHandlerRegistry( | 263 ProtocolHandlerRegistry::ProtocolHandlerRegistry( |
| 269 content::BrowserContext* context, | 264 content::BrowserContext* context, |
| 270 Delegate* delegate) | 265 Delegate* delegate) |
| 271 : context_(context), | 266 : context_(context), |
| 272 delegate_(delegate), | 267 delegate_(delegate), |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 407 IgnoreProtocolHandlersFromPref(prefs::kIgnoredProtocolHandlers, USER); | 402 IgnoreProtocolHandlersFromPref(prefs::kIgnoredProtocolHandlers, USER); |
| 408 | 403 |
| 409 is_loading_ = false; | 404 is_loading_ = false; |
| 410 | 405 |
| 411 // For each default protocol handler, check that we are still registered | 406 // For each default protocol handler, check that we are still registered |
| 412 // with the OS as the default application. | 407 // with the OS as the default application. |
| 413 if (ShouldRemoveHandlersNotInOS()) { | 408 if (ShouldRemoveHandlersNotInOS()) { |
| 414 for (ProtocolHandlerMap::const_iterator p = default_handlers_.begin(); | 409 for (ProtocolHandlerMap::const_iterator p = default_handlers_.begin(); |
| 415 p != default_handlers_.end(); ++p) { | 410 p != default_handlers_.end(); ++p) { |
| 416 ProtocolHandler handler = p->second; | 411 ProtocolHandler handler = p->second; |
| 417 // The worker pointer is reference counted. While it is running the | 412 delegate_->RegisterWithOSAsDefaultClient(handler.protocol(), this); |
| 418 // message loops of the FILE and UI thread will hold references to it | |
| 419 // and it will be automatically freed once all its tasks have finished. | |
| 420 delegate_ | |
| 421 ->CreateShellWorker(GetDefaultWebClientCallback(handler.protocol()), | |
| 422 handler.protocol()) | |
| 423 ->StartSetAsDefault(); | |
| 424 } | 413 } |
| 425 } | 414 } |
| 426 } | 415 } |
| 427 | 416 |
| 428 int ProtocolHandlerRegistry::GetHandlerIndex(const std::string& scheme) const { | 417 int ProtocolHandlerRegistry::GetHandlerIndex(const std::string& scheme) const { |
| 429 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 418 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 430 const ProtocolHandler& handler = GetHandlerFor(scheme); | 419 const ProtocolHandler& handler = GetHandlerFor(scheme); |
| 431 if (handler.IsEmpty()) | 420 if (handler.IsEmpty()) |
| 432 return -1; | 421 return -1; |
| 433 const ProtocolHandlerList* handlers = GetHandlerList(scheme); | 422 const ProtocolHandlerList* handlers = GetHandlerList(scheme); |
| (...skipping 479 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 913 | 902 |
| 914 std::unique_ptr<ProtocolHandlerRegistry::JobInterceptorFactory> | 903 std::unique_ptr<ProtocolHandlerRegistry::JobInterceptorFactory> |
| 915 ProtocolHandlerRegistry::CreateJobInterceptorFactory() { | 904 ProtocolHandlerRegistry::CreateJobInterceptorFactory() { |
| 916 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 905 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 917 // this is always created on the UI thread (in profile_io's | 906 // this is always created on the UI thread (in profile_io's |
| 918 // InitializeOnUIThread. Any method calls must be done | 907 // InitializeOnUIThread. Any method calls must be done |
| 919 // on the IO thread (this is checked). | 908 // on the IO thread (this is checked). |
| 920 return std::unique_ptr<JobInterceptorFactory>( | 909 return std::unique_ptr<JobInterceptorFactory>( |
| 921 new JobInterceptorFactory(io_thread_delegate_.get())); | 910 new JobInterceptorFactory(io_thread_delegate_.get())); |
| 922 } | 911 } |
| OLD | NEW |