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
28class 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