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