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