1// Copyright 2013 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_EXTENSIONS_API_SETTINGS_OVERRIDES_SETTINGS_OVERRIDES_API_H_
6#define CHROME_BROWSER_EXTENSIONS_API_SETTINGS_OVERRIDES_SETTINGS_OVERRIDES_API_H_
7
8#include <set>
9#include <string>
10
11#include "base/scoped_observer.h"
12#include "components/search_engines/template_url_service.h"
13#include "extensions/browser/browser_context_keyed_api_factory.h"
14#include "extensions/browser/extension_registry_observer.h"
15
16class Profile;
17class TemplateURL;
18
19namespace extensions {
20class ExtensionRegistry;
21
22class SettingsOverridesAPI : public BrowserContextKeyedAPI,
23                             public ExtensionRegistryObserver {
24 public:
25  explicit SettingsOverridesAPI(content::BrowserContext* context);
26  virtual ~SettingsOverridesAPI();
27
28  // BrowserContextKeyedAPI implementation.
29  static BrowserContextKeyedAPIFactory<SettingsOverridesAPI>*
30      GetFactoryInstance();
31
32 private:
33  friend class BrowserContextKeyedAPIFactory<SettingsOverridesAPI>;
34
35  typedef std::set<scoped_refptr<const Extension> > PendingExtensions;
36
37  // Wrappers around PreferenceAPI.
38  void SetPref(const std::string& extension_id,
39               const std::string& pref_key,
40               base::Value* value);
41  void UnsetPref(const std::string& extension_id,
42                 const std::string& pref_key);
43
44  // ExtensionRegistryObserver implementation.
45  virtual void OnExtensionLoaded(content::BrowserContext* browser_context,
46                                 const Extension* extension) OVERRIDE;
47  virtual void OnExtensionUnloaded(
48      content::BrowserContext* browser_context,
49      const Extension* extension,
50      UnloadedExtensionInfo::Reason reason) OVERRIDE;
51
52  // KeyedService implementation.
53  virtual void Shutdown() OVERRIDE;
54
55  void OnTemplateURLsLoaded();
56
57  void RegisterSearchProvider(const Extension* extension) const;
58  // BrowserContextKeyedAPI implementation.
59  static const char* service_name() { return "SettingsOverridesAPI"; }
60
61  Profile* profile_;
62  TemplateURLService* url_service_;
63
64  // List of extensions waiting for the TemplateURLService to Load to
65  // have search provider registered.
66  PendingExtensions pending_extensions_;
67
68  // Listen to extension load, unloaded notifications.
69  ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
70      extension_registry_observer_;
71
72  scoped_ptr<TemplateURLService::Subscription> template_url_sub_;
73
74  DISALLOW_COPY_AND_ASSIGN(SettingsOverridesAPI);
75};
76
77template <>
78void BrowserContextKeyedAPIFactory<
79    SettingsOverridesAPI>::DeclareFactoryDependencies();
80
81}  // namespace extensions
82
83#endif  // CHROME_BROWSER_EXTENSIONS_API_SETTINGS_OVERRIDES_SETTINGS_OVERRIDES_API_H_
84