extension_registry.cc revision effb81e5f8246d0db0270817048dc992db66e9fb
15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_registry.h" 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/string_util.h" 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_registry_factory.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_registry_observer.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace extensions { 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ExtensionRegistry::ExtensionRegistry() {} 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ExtensionRegistry::~ExtensionRegistry() {} 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ExtensionRegistry* ExtensionRegistry::Get(content::BrowserContext* context) { 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ExtensionRegistryFactory::GetForBrowserContext(context); 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)scoped_ptr<ExtensionSet> ExtensionRegistry::GenerateInstalledExtensionsSet() 2223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const { 2323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) scoped_ptr<ExtensionSet> installed_extensions(new ExtensionSet); 2423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) installed_extensions->InsertAll(enabled_extensions_); 2523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) installed_extensions->InsertAll(disabled_extensions_); 2623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) installed_extensions->InsertAll(terminated_extensions_); 2723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) installed_extensions->InsertAll(blacklisted_extensions_); 2823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return installed_extensions.Pass(); 2923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 3023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ExtensionRegistry::AddObserver(ExtensionRegistryObserver* observer) { 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observers_.AddObserver(observer); 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ExtensionRegistry::RemoveObserver(ExtensionRegistryObserver* observer) { 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observers_.RemoveObserver(observer); 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid ExtensionRegistry::TriggerOnLoaded(const Extension* extension) { 40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK(enabled_extensions_.Contains(extension->id())); 41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch FOR_EACH_OBSERVER( 42effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ExtensionRegistryObserver, observers_, OnExtensionLoaded(extension)); 43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 44effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ExtensionRegistry::TriggerOnUnloaded(const Extension* extension) { 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!enabled_extensions_.Contains(extension->id())); 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FOR_EACH_OBSERVER( 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExtensionRegistryObserver, observers_, OnExtensionUnloaded(extension)); 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const Extension* ExtensionRegistry::GetExtensionById(const std::string& id, 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int include_mask) const { 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string lowercase_id = StringToLowerASCII(id); 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (include_mask & ENABLED) { 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const Extension* extension = enabled_extensions_.GetByID(lowercase_id); 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (extension) 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return extension; 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (include_mask & DISABLED) { 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const Extension* extension = disabled_extensions_.GetByID(lowercase_id); 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (extension) 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return extension; 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (include_mask & TERMINATED) { 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const Extension* extension = terminated_extensions_.GetByID(lowercase_id); 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (extension) 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return extension; 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (include_mask & BLACKLISTED) { 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const Extension* extension = blacklisted_extensions_.GetByID(lowercase_id); 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (extension) 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return extension; 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NULL; 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ExtensionRegistry::AddEnabled( 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const scoped_refptr<const Extension>& extension) { 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return enabled_extensions_.Insert(extension); 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ExtensionRegistry::RemoveEnabled(const std::string& id) { 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return enabled_extensions_.Remove(id); 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ExtensionRegistry::AddDisabled( 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const scoped_refptr<const Extension>& extension) { 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return disabled_extensions_.Insert(extension); 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ExtensionRegistry::RemoveDisabled(const std::string& id) { 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return disabled_extensions_.Remove(id); 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ExtensionRegistry::AddTerminated( 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const scoped_refptr<const Extension>& extension) { 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return terminated_extensions_.Insert(extension); 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ExtensionRegistry::RemoveTerminated(const std::string& id) { 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return terminated_extensions_.Remove(id); 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ExtensionRegistry::AddBlacklisted( 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const scoped_refptr<const Extension>& extension) { 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return blacklisted_extensions_.Insert(extension); 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ExtensionRegistry::RemoveBlacklisted(const std::string& id) { 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return blacklisted_extensions_.Remove(id); 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ExtensionRegistry::ClearAll() { 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) enabled_extensions_.Clear(); 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) disabled_extensions_.Clear(); 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) terminated_extensions_.Clear(); 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) blacklisted_extensions_.Clear(); 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ExtensionRegistry::SetDisabledModificationCallback( 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ExtensionSet::ModificationCallback& callback) { 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) disabled_extensions_.set_modification_callback(callback); 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ExtensionRegistry::Shutdown() { 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Release references to all Extension objects in the sets. 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ClearAll(); 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace extensions 131