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