summaryrefslogtreecommitdiffstats
path: root/chrome/browser/custom_handlers/protocol_handler_registry.h
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/custom_handlers/protocol_handler_registry.h')
-rw-r--r--chrome/browser/custom_handlers/protocol_handler_registry.h74
1 files changed, 34 insertions, 40 deletions
diff --git a/chrome/browser/custom_handlers/protocol_handler_registry.h b/chrome/browser/custom_handlers/protocol_handler_registry.h
index a74a765..a418ad1 100644
--- a/chrome/browser/custom_handlers/protocol_handler_registry.h
+++ b/chrome/browser/custom_handlers/protocol_handler_registry.h
@@ -20,17 +20,18 @@
#include "content/public/browser/notification_service.h"
#include "net/url_request/url_request.h"
#include "net/url_request/url_request_job.h"
+#include "net/url_request/url_request_job_factory.h"
// This is where handlers for protocols registered with
// navigator.registerProtocolHandler() are registered. Each Profile owns an
// instance of this class, which is initialized on browser start through
// Profile::InitRegisteredProtocolHandlers(), and they should be the only
// instances of this class.
+class ProtocolHandlerRegistry : public ProfileKeyedService {
-class ProtocolHandlerRegistry
- : public base::RefCountedThreadSafe<
- ProtocolHandlerRegistry, content::BrowserThread::DeleteOnIOThread> {
public:
+ // Provides notification of when the OS level user agent settings
+ // are changed.
class DefaultClientObserver
: public ShellIntegration::DefaultWebClientObserver {
public:
@@ -59,9 +60,9 @@ class ProtocolHandlerRegistry
DISALLOW_COPY_AND_ASSIGN(DefaultClientObserver);
};
- // TODO(koz): Refactor this to eliminate the unnecessary virtuals. All that
- // should be needed is a way to ensure that the list of websafe protocols is
- // updated.
+ // |Delegate| provides an interface for interacting asynchronously
+ // with the underlying OS for the purposes of registering Chrome
+ // as the default handler for specific protocols.
class Delegate {
public:
virtual ~Delegate();
@@ -83,7 +84,14 @@ class ProtocolHandlerRegistry
typedef std::map<std::string, ProtocolHandlerList> ProtocolHandlerMultiMap;
typedef std::vector<DefaultClientObserver*> DefaultClientObserverList;
+ // Creates a new instance. Assumes ownership of |delegate|.
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();
// 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
@@ -116,8 +124,10 @@ class ProtocolHandlerRegistry
// Returns true if this handler is the default handler for its protocol.
bool IsDefault(const ProtocolHandler& handler) const;
- // Loads a user's registered protocol handlers.
- void Load();
+ // Initializes default protocol settings and loads them from prefs.
+ // This method must be called to complete initialization of the
+ // registry after creation, and prior to use.
+ void InitProtocolSettings();
// Returns the offset in the list of handlers for a protocol of the default
// handler for that protocol.
@@ -155,10 +165,6 @@ class ProtocolHandlerRegistry
// Returns true if the protocol has a default protocol handler.
bool IsHandledProtocol(const std::string& scheme) const;
- // Returns true if the protocol has a default protocol handler.
- // Should be called only from the IO thread.
- bool IsHandledProtocolIO(const std::string& scheme) const;
-
// Removes the given protocol handler from the registry.
void RemoveHandler(const ProtocolHandler& handler);
@@ -169,10 +175,6 @@ class ProtocolHandlerRegistry
// exists.
const ProtocolHandler& GetHandlerFor(const std::string& scheme) const;
- // Creates a URL request job for the given request if there is a matching
- // protocol handler, returns NULL otherwise.
- net::URLRequestJob* MaybeCreateJob(net::URLRequest* request) const;
-
// Puts this registry in the enabled state - registered protocol handlers
// will handle requests.
void Enable();
@@ -183,7 +185,7 @@ class ProtocolHandlerRegistry
// This is called by the UI thread when the system is shutting down. This
// does finalization which must be done on the UI thread.
- void Finalize();
+ virtual void Shutdown() OVERRIDE;
// Registers the preferences that we store registered protocol handlers in.
static void RegisterPrefs(PrefService* prefService);
@@ -198,31 +200,21 @@ class ProtocolHandlerRegistry
friend class base::DeleteHelper<ProtocolHandlerRegistry>;
friend struct content::BrowserThread::DeleteOnThread<
content::BrowserThread::IO>;
+
+ // for access to InstallDefaultsForChromeOS
+ friend class ProtocolHandlerRegistryFactory;
+
friend class ProtocolHandlerRegistryTest;
friend class RegisterProtocolHandlerBrowserTest;
- ~ProtocolHandlerRegistry();
+ // 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);
- // Clears the default for the provided protocol.
- // Should be called only from the IO thread.
- void ClearDefaultIO(const std::string& scheme);
-
- // Makes this ProtocolHandler the default handler for its protocol.
- // Should be called only from the IO thread.
- void SetDefaultIO(const ProtocolHandler& handler);
-
- // Indicate that the registry has been enabled in the IO thread's copy of the
- // data.
- void EnableIO() { enabled_io_ = true; }
-
- // Indicate that the registry has been disabled in the IO thread's copy of
- // the data.
- void DisableIO() { enabled_io_ = false; }
-
// Saves a user's registered protocol handlers.
void Save();
@@ -230,6 +222,10 @@ class ProtocolHandlerRegistry
// or NULL if there are none.
const ProtocolHandlerList* GetHandlerList(const std::string& scheme) const;
+ // Install default protocol handlers for chromeos which must be done
+ // prior to calling InitProtocolSettings.
+ void InstallDefaultsForChromeOS();
+
// Makes this ProtocolHandler the default handler for its protocol.
void SetDefault(const ProtocolHandler& handler);
@@ -277,9 +273,6 @@ class ProtocolHandlerRegistry
// requests.
bool enabled_;
- // Copy of enabled_ that is only accessed on the IO thread.
- bool enabled_io_;
-
// Whether or not we are loading.
bool is_loading_;
@@ -287,10 +280,11 @@ class ProtocolHandlerRegistry
// AddPredefinedHandler will be rejected.
bool is_loaded_;
- DefaultClientObserverList default_client_observers_;
+ // 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_;
- // Copy of default_handlers_ that is only accessed on the IO thread.
- ProtocolHandlerMap default_handlers_io_;
+ DefaultClientObserverList default_client_observers_;
DISALLOW_COPY_AND_ASSIGN(ProtocolHandlerRegistry);
};