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.
5 #ifndef EXTENSIONS_BROWSER_EXTENSION_REGISTRY_H_
6 #define EXTENSIONS_BROWSER_EXTENSION_REGISTRY_H_
10 #include "base/compiler_specific.h"
11 #include "base/memory/ref_counted.h"
12 #include "base/observer_list.h"
13 #include "components/keyed_service/core/keyed_service.h"
14 #include "extensions/browser/uninstall_reason.h"
15 #include "extensions/common/extension_set.h"
21 namespace extensions
{
23 class ExtensionRegistryObserver
;
25 // ExtensionRegistry holds sets of the installed extensions for a given
26 // BrowserContext. An incognito browser context and its master browser context
27 // share a single registry.
28 class ExtensionRegistry
: public KeyedService
{
30 // Flags to pass to GetExtensionById() to select which sets to look in.
37 EVERYTHING
= (1 << 4) - 1,
40 explicit ExtensionRegistry(content::BrowserContext
* browser_context
);
41 virtual ~ExtensionRegistry();
43 // Returns the instance for the given |browser_context|.
44 static ExtensionRegistry
* Get(content::BrowserContext
* browser_context
);
46 content::BrowserContext
* browser_context() const { return browser_context_
; }
48 // NOTE: These sets are *eventually* mututally exclusive, but an extension can
49 // appear in two sets for short periods of time.
50 const ExtensionSet
& enabled_extensions() const {
51 return enabled_extensions_
;
53 const ExtensionSet
& disabled_extensions() const {
54 return disabled_extensions_
;
56 const ExtensionSet
& terminated_extensions() const {
57 return terminated_extensions_
;
59 const ExtensionSet
& blacklisted_extensions() const {
60 return blacklisted_extensions_
;
63 // Returns a set of all installed, disabled, blacklisted, and terminated
65 scoped_ptr
<ExtensionSet
> GenerateInstalledExtensionsSet() const;
67 // The usual observer interface.
68 void AddObserver(ExtensionRegistryObserver
* observer
);
69 void RemoveObserver(ExtensionRegistryObserver
* observer
);
71 // Invokes the observer method OnExtensionLoaded(). The extension must be
72 // enabled at the time of the call.
73 void TriggerOnLoaded(const Extension
* extension
);
75 // Invokes the observer method OnExtensionUnloaded(). The extension must not
76 // be enabled at the time of the call.
77 void TriggerOnUnloaded(const Extension
* extension
,
78 UnloadedExtensionInfo::Reason reason
);
80 // If this is a fresh install then |is_update| is false and there must not be
81 // any installed extension with |extension|'s ID. If this is an update then
82 // |is_update| is true and must be an installed extension with |extension|'s
83 // ID, and |old_name| must be non-empty.
84 // If true, |from_ephemeral| indicates that the extension was previously
85 // installed ephemerally and has been promoted to a regular installed
86 // extension. |is_update| should also be true.
87 void TriggerOnWillBeInstalled(const Extension
* extension
,
90 const std::string
& old_name
);
92 // Invokes the observer method OnExtensionInstalled(). The extension must be
93 // contained in one of the registry's extension sets.
94 void TriggerOnInstalled(const Extension
* extension
,
97 // Invokes the observer method OnExtensionUninstalled(). The extension must
98 // not be any installed extension with |extension|'s ID.
99 void TriggerOnUninstalled(const Extension
* extension
, UninstallReason reason
);
101 // Find an extension by ID using |include_mask| to pick the sets to search:
102 // * enabled_extensions() --> ExtensionRegistry::ENABLED
103 // * disabled_extensions() --> ExtensionRegistry::DISABLED
104 // * terminated_extensions() --> ExtensionRegistry::TERMINATED
105 // * blacklisted_extensions() --> ExtensionRegistry::BLACKLISTED
106 // Returns NULL if the extension is not found in the selected sets.
107 const Extension
* GetExtensionById(const std::string
& id
,
108 int include_mask
) const;
110 // Adds the specified extension to the enabled set. The registry becomes an
111 // owner. Any previous extension with the same ID is removed.
112 // Returns true if there is no previous extension.
113 // NOTE: You probably want to use ExtensionService instead of calling this
115 bool AddEnabled(const scoped_refptr
<const Extension
>& extension
);
117 // Removes the specified extension from the enabled set.
118 // Returns true if the set contained the specified extension.
119 // NOTE: You probably want to use ExtensionService instead of calling this
121 bool RemoveEnabled(const std::string
& id
);
123 // As above, but for the disabled set.
124 bool AddDisabled(const scoped_refptr
<const Extension
>& extension
);
125 bool RemoveDisabled(const std::string
& id
);
127 // As above, but for the terminated set.
128 bool AddTerminated(const scoped_refptr
<const Extension
>& extension
);
129 bool RemoveTerminated(const std::string
& id
);
131 // As above, but for the blacklisted set.
132 bool AddBlacklisted(const scoped_refptr
<const Extension
>& extension
);
133 bool RemoveBlacklisted(const std::string
& id
);
135 // Removes all extensions from all sets.
138 // Sets a callback to run when the disabled extension set is modified.
139 // TODO(jamescook): This is too specific for a generic registry; find some
140 // other way to do this.
141 void SetDisabledModificationCallback(
142 const ExtensionSet::ModificationCallback
& callback
);
144 // KeyedService implementation:
145 virtual void Shutdown() OVERRIDE
;
148 // Extensions that are installed, enabled and not terminated.
149 ExtensionSet enabled_extensions_
;
151 // Extensions that are installed and disabled.
152 ExtensionSet disabled_extensions_
;
154 // Extensions that are installed and terminated.
155 ExtensionSet terminated_extensions_
;
157 // Extensions that are installed and blacklisted. Generally these shouldn't be
158 // considered as installed by the extension platform: we only keep them around
159 // so that if extensions are blacklisted by mistake they can easily be
161 ExtensionSet blacklisted_extensions_
;
163 ObserverList
<ExtensionRegistryObserver
> observers_
;
165 content::BrowserContext
* const browser_context_
;
167 DISALLOW_COPY_AND_ASSIGN(ExtensionRegistry
);
170 } // namespace extensions
172 #endif // EXTENSIONS_BROWSER_EXTENSION_REGISTRY_H_