Home | History | Annotate | Download | only in browser
      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 
     11 namespace extensions {
     12 
     13 ExtensionRegistry::ExtensionRegistry(content::BrowserContext* browser_context)
     14     : browser_context_(browser_context) {}
     15 ExtensionRegistry::~ExtensionRegistry() {}
     16 
     17 // static
     18 ExtensionRegistry* ExtensionRegistry::Get(content::BrowserContext* context) {
     19   return ExtensionRegistryFactory::GetForBrowserContext(context);
     20 }
     21 
     22 scoped_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 
     32 void ExtensionRegistry::AddObserver(ExtensionRegistryObserver* observer) {
     33   observers_.AddObserver(observer);
     34 }
     35 
     36 void ExtensionRegistry::RemoveObserver(ExtensionRegistryObserver* observer) {
     37   observers_.RemoveObserver(observer);
     38 }
     39 
     40 void 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 
     47 void 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 
     56 void 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 
     70 void 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 
     79 void ExtensionRegistry::TriggerOnUninstalled(const Extension* extension,
     80                                              UninstallReason reason) {
     81   DCHECK(!GenerateInstalledExtensionsSet()->Contains(extension->id()));
     82   FOR_EACH_OBSERVER(
     83       ExtensionRegistryObserver,
     84       observers_,
     85       OnExtensionUninstalled(browser_context_, extension, reason));
     86 }
     87 
     88 const Extension* ExtensionRegistry::GetExtensionById(const std::string& id,
     89                                                      int include_mask) const {
     90   std::string lowercase_id = base::StringToLowerASCII(id);
     91   if (include_mask & ENABLED) {
     92     const Extension* extension = enabled_extensions_.GetByID(lowercase_id);
     93     if (extension)
     94       return extension;
     95   }
     96   if (include_mask & DISABLED) {
     97     const Extension* extension = disabled_extensions_.GetByID(lowercase_id);
     98     if (extension)
     99       return extension;
    100   }
    101   if (include_mask & TERMINATED) {
    102     const Extension* extension = terminated_extensions_.GetByID(lowercase_id);
    103     if (extension)
    104       return extension;
    105   }
    106   if (include_mask & BLACKLISTED) {
    107     const Extension* extension = blacklisted_extensions_.GetByID(lowercase_id);
    108     if (extension)
    109       return extension;
    110   }
    111   return NULL;
    112 }
    113 
    114 bool ExtensionRegistry::AddEnabled(
    115     const scoped_refptr<const Extension>& extension) {
    116   return enabled_extensions_.Insert(extension);
    117 }
    118 
    119 bool ExtensionRegistry::RemoveEnabled(const std::string& id) {
    120   return enabled_extensions_.Remove(id);
    121 }
    122 
    123 bool ExtensionRegistry::AddDisabled(
    124     const scoped_refptr<const Extension>& extension) {
    125   return disabled_extensions_.Insert(extension);
    126 }
    127 
    128 bool ExtensionRegistry::RemoveDisabled(const std::string& id) {
    129   return disabled_extensions_.Remove(id);
    130 }
    131 
    132 bool ExtensionRegistry::AddTerminated(
    133     const scoped_refptr<const Extension>& extension) {
    134   return terminated_extensions_.Insert(extension);
    135 }
    136 
    137 bool ExtensionRegistry::RemoveTerminated(const std::string& id) {
    138   return terminated_extensions_.Remove(id);
    139 }
    140 
    141 bool ExtensionRegistry::AddBlacklisted(
    142     const scoped_refptr<const Extension>& extension) {
    143   return blacklisted_extensions_.Insert(extension);
    144 }
    145 
    146 bool ExtensionRegistry::RemoveBlacklisted(const std::string& id) {
    147   return blacklisted_extensions_.Remove(id);
    148 }
    149 
    150 void ExtensionRegistry::ClearAll() {
    151   enabled_extensions_.Clear();
    152   disabled_extensions_.Clear();
    153   terminated_extensions_.Clear();
    154   blacklisted_extensions_.Clear();
    155 }
    156 
    157 void ExtensionRegistry::SetDisabledModificationCallback(
    158     const ExtensionSet::ModificationCallback& callback) {
    159   disabled_extensions_.set_modification_callback(callback);
    160 }
    161 
    162 void ExtensionRegistry::Shutdown() {
    163   // Release references to all Extension objects in the sets.
    164   ClearAll();
    165   FOR_EACH_OBSERVER(ExtensionRegistryObserver, observers_, OnShutdown(this));
    166 }
    167 
    168 }  // namespace extensions
    169