Home | History | Annotate | Download | only in custom_handlers
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_CUSTOM_HANDLERS_PROTOCOL_HANDLER_REGISTRY_H_
      6 #define CHROME_BROWSER_CUSTOM_HANDLERS_PROTOCOL_HANDLER_REGISTRY_H_
      7 #pragma once
      8 
      9 #include <string>
     10 #include <map>
     11 
     12 #include "base/basictypes.h"
     13 #include "base/memory/ref_counted.h"
     14 #include "base/values.h"
     15 #include "chrome/browser/custom_handlers/protocol_handler.h"
     16 #include "chrome/browser/profiles/profile.h"
     17 #include "net/url_request/url_request.h"
     18 #include "net/url_request/url_request_job.h"
     19 
     20 
     21 
     22 // This is where handlers for protocols registered with
     23 // navigator.registerProtocolHandler() are registered. Each Profile owns an
     24 // instance of this class, which is initialized on browser start through
     25 // Profile::InitRegisteredProtocolHandlers(), and they should be the only
     26 // instances of this class.
     27 
     28 class ProtocolHandlerRegistry
     29     : public base::RefCountedThreadSafe<ProtocolHandlerRegistry> {
     30  public:
     31   explicit ProtocolHandlerRegistry(Profile* profile);
     32 
     33   // Called when the user accepts the registration of a given protocol handler.
     34   void OnAcceptRegisterProtocolHandler(ProtocolHandler* handler);
     35 
     36   // Called when the user denies the registration of a given protocol handler.
     37   void OnDenyRegisterProtocolHandler(ProtocolHandler* handler);
     38 
     39   // Loads a user's registered protocol handlers.
     40   void Load();
     41 
     42   // Saves a user's registered protocol handlers.
     43   void Save();
     44 
     45   // Returns the handler for this protocol.
     46   ProtocolHandler* GetHandlerFor(const std::string& scheme) const;
     47 
     48   // Returns true if we allow websites to register handlers for the given
     49   // scheme.
     50   bool CanSchemeBeOverridden(const std::string& scheme) const;
     51 
     52   // Returns true if an identical protocol handler has already been registered.
     53   bool IsAlreadyRegistered(const ProtocolHandler* handler) const;
     54 
     55   // URLRequestFactory for use with URLRequest::RegisterProtocolFactory().
     56   // Redirects any URLRequests for which there is a matching protocol handler.
     57   static net::URLRequestJob* Factory(net::URLRequest* request,
     58                                      const std::string& scheme);
     59 
     60   // Registers the preferences that we store registered protocol handlers in.
     61   static void RegisterPrefs(PrefService* prefService);
     62 
     63   // Creates a URL request job for the given request if there is a matching
     64   // protocol handler, returns NULL otherwise.
     65   net::URLRequestJob* MaybeCreateJob(net::URLRequest* request) const;
     66 
     67  private:
     68   typedef std::map<std::string, ProtocolHandler*> ProtocolHandlerMap;
     69 
     70   friend class base::RefCountedThreadSafe<ProtocolHandlerRegistry>;
     71   ~ProtocolHandlerRegistry();
     72 
     73   // Returns a JSON dictionary of protocols to protocol handlers. The caller is
     74   // responsible for deleting this Value.
     75   Value* Encode();
     76 
     77   // Registers a new protocol handler.
     78   void RegisterProtocolHandler(ProtocolHandler* handler);
     79 
     80   // Registers a new protocol handler from a JSON dictionary.
     81   void RegisterHandlerFromValue(const DictionaryValue* value);
     82 
     83   // Map from protocols (strings) to protocol handlers.
     84   ProtocolHandlerMap protocolHandlers_;
     85 
     86   // The Profile that owns this ProtocolHandlerRegistry.
     87   Profile* profile_;
     88 
     89   DISALLOW_COPY_AND_ASSIGN(ProtocolHandlerRegistry);
     90 };
     91 #endif  // CHROME_BROWSER_CUSTOM_HANDLERS_PROTOCOL_HANDLER_REGISTRY_H_
     92 
     93