Index: chrome/browser/custom_handlers/protocol_handler_registry.h |
diff --git a/chrome/browser/custom_handlers/protocol_handler_registry.h b/chrome/browser/custom_handlers/protocol_handler_registry.h |
index e8ae9137b9a29e9ca8f90b36f4626aebff609cf7..e1331c16332e2f888935e0d27834eb12bb7c1826 100644 |
--- a/chrome/browser/custom_handlers/protocol_handler_registry.h |
+++ b/chrome/browser/custom_handlers/protocol_handler_registry.h |
@@ -11,6 +11,7 @@ |
#include "base/basictypes.h" |
#include "base/memory/ref_counted.h" |
+#include "base/memory/scoped_ptr.h" |
#include "base/sequenced_task_runner_helpers.h" |
#include "base/values.h" |
#include "chrome/browser/profiles/profile.h" |
@@ -84,6 +85,57 @@ class ProtocolHandlerRegistry : public ProfileKeyedService { |
ProtocolHandlerRegistry* registry); |
}; |
+ // Forward declaration of the internal implementation class. |
+ class IOThreadDelegate; |
+ |
+ // JobInterceptorFactory intercepts URLRequestJob creation for URLRequests the |
+ // ProtocolHandlerRegistry is registered to handle. When no handler is |
+ // registered, the URLRequest is passed along to the chained |
+ // URLRequestJobFactory (set with |JobInterceptorFactory::Chain|). |
+ // JobInterceptorFactory's are created via |
+ // |ProtocolHandlerRegistry::CreateJobInterceptorFactory|. |
+ class JobInterceptorFactory : public net::URLRequestJobFactory { |
+ public: |
+ // |io_thread_delegate| is used to perform actual job creation work. |
+ explicit JobInterceptorFactory(IOThreadDelegate* io_thread_delegate); |
+ virtual ~JobInterceptorFactory(); |
+ |
+ // |job_factory| is set as the URLRequestJobFactory where requests are |
+ // forwarded if JobInterceptorFactory decides to pass on them. |
+ void Chain(scoped_ptr<net::URLRequestJobFactory> job_factory); |
+ |
+ // URLRequestJobFactory implementation. |
+ virtual bool SetProtocolHandler(const std::string& scheme, |
+ ProtocolHandler* protocol_handler) OVERRIDE; |
+ virtual void AddInterceptor(Interceptor* interceptor) OVERRIDE; |
+ virtual net::URLRequestJob* MaybeCreateJobWithInterceptor( |
+ net::URLRequest* request, |
+ net::NetworkDelegate* network_delegate) const OVERRIDE; |
+ virtual net::URLRequestJob* MaybeCreateJobWithProtocolHandler( |
+ const std::string& scheme, |
+ net::URLRequest* request, |
+ net::NetworkDelegate* network_delegate) const OVERRIDE; |
+ virtual net::URLRequestJob* MaybeInterceptRedirect( |
+ const GURL& location, |
+ net::URLRequest* request, |
+ net::NetworkDelegate* network_delegate) const OVERRIDE; |
+ virtual net::URLRequestJob* MaybeInterceptResponse( |
+ net::URLRequest* request, |
+ net::NetworkDelegate* network_delegate) const OVERRIDE; |
+ virtual bool IsHandledProtocol(const std::string& scheme) const OVERRIDE; |
+ virtual bool IsHandledURL(const GURL& url) const OVERRIDE; |
+ |
+ private: |
+ // When JobInterceptorFactory decides to pass on particular requests, |
+ // they're forwarded to the chained URLRequestJobFactory, |job_factory_|. |
+ scoped_ptr<URLRequestJobFactory> job_factory_; |
+ // |io_thread_delegate_| performs the actual job creation decisions by |
+ // mirroring the ProtocolHandlerRegistry on the IO thread. |
+ scoped_refptr<IOThreadDelegate> io_thread_delegate_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(JobInterceptorFactory); |
+ }; |
+ |
typedef std::map<std::string, ProtocolHandler> ProtocolHandlerMap; |
typedef std::vector<ProtocolHandler> ProtocolHandlerList; |
typedef std::map<std::string, ProtocolHandlerList> ProtocolHandlerMultiMap; |
@@ -93,10 +145,9 @@ class ProtocolHandlerRegistry : public ProfileKeyedService { |
ProtocolHandlerRegistry(Profile* profile, Delegate* delegate); |
virtual ~ProtocolHandlerRegistry(); |
- // Returns a net::URLRequestJobFactory::Interceptor suitable |
- // for use on the IO thread, but is initialized on the UI thread. |
- // Callers assume responsibility for deleting this object. |
- net::URLRequestJobFactory::Interceptor* CreateURLInterceptor(); |
+ // Returns a net::URLRequestJobFactory suitable for use on the IO thread, but |
+ // is initialized on the UI thread. |
+ scoped_ptr<JobInterceptorFactory> CreateJobInterceptorFactory(); |
// Called when a site tries to register as a protocol handler. If the request |
// can be handled silently by the registry - either to ignore the request |
@@ -212,10 +263,6 @@ class ProtocolHandlerRegistry : public ProfileKeyedService { |
friend class ProtocolHandlerRegistryTest; |
friend class RegisterProtocolHandlerBrowserTest; |
- // Forward declaration of the internal implementation classes. |
- class Core; |
- class URLInterceptor; |
- |
// Puts the given handler at the top of the list of handlers for its |
// protocol. |
void PromoteHandler(const ProtocolHandler& handler); |
@@ -287,7 +334,7 @@ class ProtocolHandlerRegistry : public ProfileKeyedService { |
// Copy of registry data for use on the IO thread. Changes to the registry |
// are posted to the IO thread where updates are applied to this object. |
- scoped_refptr<Core> core_; |
+ scoped_refptr<IOThreadDelegate> io_thread_delegate_; |
DefaultClientObserverList default_client_observers_; |