extension_registry.cc revision c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c
143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Copyright 2013 The Chromium Authors. All rights reserved.
243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Use of this source code is governed by a BSD-style license that can be
343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// found in the LICENSE file.
443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "extensions/browser/extension_registry.h"
643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "base/strings/string_util.h"
843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "extensions/browser/extension_registry_factory.h"
943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "extensions/browser/extension_registry_observer.h"
1043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansennamespace extensions {
1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenExtensionRegistry::ExtensionRegistry(content::BrowserContext* browser_context)
1443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    : browser_context_(browser_context) {}
1543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenExtensionRegistry::~ExtensionRegistry() {}
1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// static
1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenExtensionRegistry* ExtensionRegistry::Get(content::BrowserContext* context) {
1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return ExtensionRegistryFactory::GetForBrowserContext(context);
2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenscoped_ptr<ExtensionSet> ExtensionRegistry::GenerateInstalledExtensionsSet()
2343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    const {
2443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  scoped_ptr<ExtensionSet> installed_extensions(new ExtensionSet);
2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  installed_extensions->InsertAll(enabled_extensions_);
2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  installed_extensions->InsertAll(disabled_extensions_);
2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  installed_extensions->InsertAll(terminated_extensions_);
2843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  installed_extensions->InsertAll(blacklisted_extensions_);
2943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return installed_extensions.Pass();
3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
3143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid ExtensionRegistry::AddObserver(ExtensionRegistryObserver* observer) {
3343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  observers_.AddObserver(observer);
3443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
3556454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org
3643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid ExtensionRegistry::RemoveObserver(ExtensionRegistryObserver* observer) {
3743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  observers_.RemoveObserver(observer);
3843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
399dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com
409dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.comvoid ExtensionRegistry::TriggerOnLoaded(const Extension* extension) {
4143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  DCHECK(enabled_extensions_.Contains(extension->id()));
4243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  FOR_EACH_OBSERVER(ExtensionRegistryObserver,
4343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                    observers_,
4443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                    OnExtensionLoaded(browser_context_, extension));
4571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org}
4671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org
4743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid ExtensionRegistry::TriggerOnUnloaded(const Extension* extension) {
4843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  DCHECK(!enabled_extensions_.Contains(extension->id()));
4943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  FOR_EACH_OBSERVER(ExtensionRegistryObserver,
5043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                    observers_,
51c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org                    OnExtensionUnloaded(browser_context_, extension));
52c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org}
53c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org
54c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.orgconst Extension* ExtensionRegistry::GetExtensionById(const std::string& id,
55c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org                                                     int include_mask) const {
5643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  std::string lowercase_id = StringToLowerASCII(id);
5743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (include_mask & ENABLED) {
58c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    const Extension* extension = enabled_extensions_.GetByID(lowercase_id);
59c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    if (extension)
60c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org      return extension;
61c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  }
62061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  if (include_mask & DISABLED) {
63c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org    const Extension* extension = disabled_extensions_.GetByID(lowercase_id);
64c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org    if (extension)
65c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org      return extension;
66c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  }
67c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  if (include_mask & TERMINATED) {
68c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    const Extension* extension = terminated_extensions_.GetByID(lowercase_id);
69c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    if (extension)
70061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org      return extension;
71c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  }
72c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  if (include_mask & BLACKLISTED) {
73c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org    const Extension* extension = blacklisted_extensions_.GetByID(lowercase_id);
74c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org    if (extension)
75c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org      return extension;
76c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  }
77c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  return NULL;
78c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org}
79c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org
80c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.orgbool ExtensionRegistry::AddEnabled(
81c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org    const scoped_refptr<const Extension>& extension) {
82c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  return enabled_extensions_.Insert(extension);
83c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org}
84061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org
8543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool ExtensionRegistry::RemoveEnabled(const std::string& id) {
8643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return enabled_extensions_.Remove(id);
8743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
8843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool ExtensionRegistry::AddDisabled(
9043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    const scoped_refptr<const Extension>& extension) {
91c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  return disabled_extensions_.Insert(extension);
92061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org}
9343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
9443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool ExtensionRegistry::RemoveDisabled(const std::string& id) {
9543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return disabled_extensions_.Remove(id);
96c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
9743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
9843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool ExtensionRegistry::AddTerminated(
9943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    const scoped_refptr<const Extension>& extension) {
10043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return terminated_extensions_.Insert(extension);
10143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
102c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
103061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.orgbool ExtensionRegistry::RemoveTerminated(const std::string& id) {
104061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  return terminated_extensions_.Remove(id);
105061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org}
106c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
107c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.combool ExtensionRegistry::AddBlacklisted(
108061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    const scoped_refptr<const Extension>& extension) {
109061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  return blacklisted_extensions_.Insert(extension);
110061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org}
111061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org
112061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.orgbool ExtensionRegistry::RemoveBlacklisted(const std::string& id) {
113061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  return blacklisted_extensions_.Remove(id);
11443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
11543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
11643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid ExtensionRegistry::ClearAll() {
11743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  enabled_extensions_.Clear();
11843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  disabled_extensions_.Clear();
11943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  terminated_extensions_.Clear();
120061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  blacklisted_extensions_.Clear();
121061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org}
122061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org
123c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comvoid ExtensionRegistry::SetDisabledModificationCallback(
124061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    const ExtensionSet::ModificationCallback& callback) {
125c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  disabled_extensions_.set_modification_callback(callback);
126061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org}
127061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org
12843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid ExtensionRegistry::Shutdown() {
129c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // Release references to all Extension objects in the sets.
13043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ClearAll();
13143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
13243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
13343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}  // namespace extensions
13443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen