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