extension_registry.cc revision 116680a4aac90f2aa7413d9095a592090648e557
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#include "extensions/browser/extension_registry.h"
6
7#include "base/strings/string_util.h"
8#include "extensions/browser/extension_registry_factory.h"
9#include "extensions/browser/extension_registry_observer.h"
10
11namespace extensions {
12
13ExtensionRegistry::ExtensionRegistry(content::BrowserContext* browser_context)
14    : browser_context_(browser_context) {}
15ExtensionRegistry::~ExtensionRegistry() {}
16
17// static
18ExtensionRegistry* ExtensionRegistry::Get(content::BrowserContext* context) {
19  return ExtensionRegistryFactory::GetForBrowserContext(context);
20}
21
22scoped_ptr<ExtensionSet> ExtensionRegistry::GenerateInstalledExtensionsSet()
23    const {
24  scoped_ptr<ExtensionSet> installed_extensions(new ExtensionSet);
25  installed_extensions->InsertAll(enabled_extensions_);
26  installed_extensions->InsertAll(disabled_extensions_);
27  installed_extensions->InsertAll(terminated_extensions_);
28  installed_extensions->InsertAll(blacklisted_extensions_);
29  return installed_extensions.Pass();
30}
31
32void ExtensionRegistry::AddObserver(ExtensionRegistryObserver* observer) {
33  observers_.AddObserver(observer);
34}
35
36void ExtensionRegistry::RemoveObserver(ExtensionRegistryObserver* observer) {
37  observers_.RemoveObserver(observer);
38}
39
40void ExtensionRegistry::TriggerOnLoaded(const Extension* extension) {
41  DCHECK(enabled_extensions_.Contains(extension->id()));
42  FOR_EACH_OBSERVER(ExtensionRegistryObserver,
43                    observers_,
44                    OnExtensionLoaded(browser_context_, extension));
45}
46
47void ExtensionRegistry::TriggerOnUnloaded(
48    const Extension* extension,
49    UnloadedExtensionInfo::Reason reason) {
50  DCHECK(!enabled_extensions_.Contains(extension->id()));
51  FOR_EACH_OBSERVER(ExtensionRegistryObserver,
52                    observers_,
53                    OnExtensionUnloaded(browser_context_, extension, reason));
54}
55
56void ExtensionRegistry::TriggerOnWillBeInstalled(const Extension* extension,
57                                                 bool is_update,
58                                                 bool from_ephemeral,
59                                                 const std::string& old_name) {
60  DCHECK(is_update ==
61         GenerateInstalledExtensionsSet()->Contains(extension->id()));
62  DCHECK(is_update == !old_name.empty());
63  FOR_EACH_OBSERVER(
64      ExtensionRegistryObserver,
65      observers_,
66      OnExtensionWillBeInstalled(
67          browser_context_, extension, is_update, from_ephemeral, old_name));
68}
69
70void ExtensionRegistry::TriggerOnInstalled(const Extension* extension,
71                                           bool is_update) {
72  DCHECK(GenerateInstalledExtensionsSet()->Contains(extension->id()));
73  FOR_EACH_OBSERVER(ExtensionRegistryObserver,
74                    observers_,
75                    OnExtensionInstalled(
76                        browser_context_, extension, is_update));
77}
78
79void ExtensionRegistry::TriggerOnUninstalled(const Extension* extension) {
80  DCHECK(!GenerateInstalledExtensionsSet()->Contains(extension->id()));
81  FOR_EACH_OBSERVER(ExtensionRegistryObserver,
82                    observers_,
83                    OnExtensionUninstalled(browser_context_, extension));
84}
85
86const Extension* ExtensionRegistry::GetExtensionById(const std::string& id,
87                                                     int include_mask) const {
88  std::string lowercase_id = StringToLowerASCII(id);
89  if (include_mask & ENABLED) {
90    const Extension* extension = enabled_extensions_.GetByID(lowercase_id);
91    if (extension)
92      return extension;
93  }
94  if (include_mask & DISABLED) {
95    const Extension* extension = disabled_extensions_.GetByID(lowercase_id);
96    if (extension)
97      return extension;
98  }
99  if (include_mask & TERMINATED) {
100    const Extension* extension = terminated_extensions_.GetByID(lowercase_id);
101    if (extension)
102      return extension;
103  }
104  if (include_mask & BLACKLISTED) {
105    const Extension* extension = blacklisted_extensions_.GetByID(lowercase_id);
106    if (extension)
107      return extension;
108  }
109  return NULL;
110}
111
112bool ExtensionRegistry::AddEnabled(
113    const scoped_refptr<const Extension>& extension) {
114  return enabled_extensions_.Insert(extension);
115}
116
117bool ExtensionRegistry::RemoveEnabled(const std::string& id) {
118  return enabled_extensions_.Remove(id);
119}
120
121bool ExtensionRegistry::AddDisabled(
122    const scoped_refptr<const Extension>& extension) {
123  return disabled_extensions_.Insert(extension);
124}
125
126bool ExtensionRegistry::RemoveDisabled(const std::string& id) {
127  return disabled_extensions_.Remove(id);
128}
129
130bool ExtensionRegistry::AddTerminated(
131    const scoped_refptr<const Extension>& extension) {
132  return terminated_extensions_.Insert(extension);
133}
134
135bool ExtensionRegistry::RemoveTerminated(const std::string& id) {
136  return terminated_extensions_.Remove(id);
137}
138
139bool ExtensionRegistry::AddBlacklisted(
140    const scoped_refptr<const Extension>& extension) {
141  return blacklisted_extensions_.Insert(extension);
142}
143
144bool ExtensionRegistry::RemoveBlacklisted(const std::string& id) {
145  return blacklisted_extensions_.Remove(id);
146}
147
148void ExtensionRegistry::ClearAll() {
149  enabled_extensions_.Clear();
150  disabled_extensions_.Clear();
151  terminated_extensions_.Clear();
152  blacklisted_extensions_.Clear();
153}
154
155void ExtensionRegistry::SetDisabledModificationCallback(
156    const ExtensionSet::ModificationCallback& callback) {
157  disabled_extensions_.set_modification_callback(callback);
158}
159
160void ExtensionRegistry::Shutdown() {
161  // Release references to all Extension objects in the sets.
162  ClearAll();
163  FOR_EACH_OBSERVER(ExtensionRegistryObserver, observers_, OnShutdown(this));
164}
165
166}  // namespace extensions
167