Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/extensions/shared_module_service.h" | 5 #include "chrome/browser/extensions/shared_module_service.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/version.h" | 9 #include "base/version.h" |
| 10 #include "chrome/browser/extensions/extension_service.h" | 10 #include "chrome/browser/extensions/extension_service.h" |
| 11 #include "chrome/browser/extensions/install_tracker.h" | |
| 12 #include "chrome/browser/extensions/pending_extension_manager.h" | 11 #include "chrome/browser/extensions/pending_extension_manager.h" |
| 13 #include "chrome/common/extensions/extension_constants.h" | 12 #include "chrome/common/extensions/extension_constants.h" |
| 14 #include "extensions/browser/extension_registry.h" | 13 #include "extensions/browser/extension_registry.h" |
| 15 #include "extensions/browser/extension_system.h" | 14 #include "extensions/browser/extension_system.h" |
| 16 #include "extensions/common/extension.h" | 15 #include "extensions/common/extension.h" |
| 17 | 16 |
| 18 namespace extensions { | 17 namespace extensions { |
| 19 | 18 |
| 20 namespace { | 19 namespace { |
| 21 | 20 |
| 22 typedef std::vector<SharedModuleInfo::ImportInfo> ImportInfoVector; | 21 typedef std::vector<SharedModuleInfo::ImportInfo> ImportInfoVector; |
| 23 typedef std::list<SharedModuleInfo::ImportInfo> ImportInfoList; | 22 typedef std::list<SharedModuleInfo::ImportInfo> ImportInfoList; |
| 24 | 23 |
| 25 } // namespace | 24 } // namespace |
| 26 | 25 |
| 27 SharedModuleService::SharedModuleService(content::BrowserContext* context) | 26 SharedModuleService::SharedModuleService(content::BrowserContext* context) |
| 28 : context_(context), observing_(false) { | 27 : extension_registry_observer_(this), browser_context_(context) { |
| 29 InstallTracker::Get(context_)->AddObserver(this); | 28 extension_registry_observer_.Add(ExtensionRegistry::Get(browser_context_)); |
| 30 } | 29 } |
| 31 | 30 |
| 32 SharedModuleService::~SharedModuleService() { | 31 SharedModuleService::~SharedModuleService() { |
| 33 if (observing_) | |
| 34 InstallTracker::Get(context_)->RemoveObserver(this); | |
| 35 } | 32 } |
| 36 | 33 |
| 37 SharedModuleService::ImportStatus SharedModuleService::CheckImports( | 34 SharedModuleService::ImportStatus SharedModuleService::CheckImports( |
| 38 const extensions::Extension* extension, | 35 const Extension* extension, |
| 39 ImportInfoList* missing_modules, | 36 ImportInfoList* missing_modules, |
| 40 ImportInfoList* outdated_modules) { | 37 ImportInfoList* outdated_modules) { |
| 41 DCHECK(extension); | 38 DCHECK(extension); |
| 42 DCHECK(missing_modules && missing_modules->empty()); | 39 DCHECK(missing_modules && missing_modules->empty()); |
| 43 DCHECK(outdated_modules && outdated_modules->empty()); | 40 DCHECK(outdated_modules && outdated_modules->empty()); |
| 44 | 41 |
| 45 ImportStatus status = IMPORT_STATUS_OK; | 42 ImportStatus status = IMPORT_STATUS_OK; |
| 46 | 43 |
| 47 ExtensionRegistry* registry = ExtensionRegistry::Get(context_); | 44 ExtensionRegistry* registry = ExtensionRegistry::Get(browser_context_); |
| 48 const ImportInfoVector& imports = SharedModuleInfo::GetImports(extension); | 45 const ImportInfoVector& imports = SharedModuleInfo::GetImports(extension); |
| 49 for (ImportInfoVector::const_iterator iter = imports.begin(); | 46 for (ImportInfoVector::const_iterator iter = imports.begin(); |
| 50 iter != imports.end(); | 47 iter != imports.end(); |
| 51 ++iter) { | 48 ++iter) { |
| 52 base::Version version_required(iter->minimum_version); | 49 base::Version version_required(iter->minimum_version); |
| 53 const Extension* imported_module = | 50 const Extension* imported_module = |
| 54 registry->GetExtensionById(iter->extension_id, | 51 registry->GetExtensionById(iter->extension_id, |
| 55 ExtensionRegistry::EVERYTHING); | 52 ExtensionRegistry::EVERYTHING); |
| 56 if (!imported_module) { | 53 if (!imported_module) { |
| 57 if (extension->from_webstore()) { | 54 if (extension->from_webstore()) { |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 80 } | 77 } |
| 81 | 78 |
| 82 SharedModuleService::ImportStatus SharedModuleService::SatisfyImports( | 79 SharedModuleService::ImportStatus SharedModuleService::SatisfyImports( |
| 83 const Extension* extension) { | 80 const Extension* extension) { |
| 84 ImportInfoList missing_modules; | 81 ImportInfoList missing_modules; |
| 85 ImportInfoList outdated_modules; | 82 ImportInfoList outdated_modules; |
| 86 ImportStatus status = | 83 ImportStatus status = |
| 87 CheckImports(extension, &missing_modules, &outdated_modules); | 84 CheckImports(extension, &missing_modules, &outdated_modules); |
| 88 | 85 |
| 89 ExtensionService* service = | 86 ExtensionService* service = |
| 90 ExtensionSystem::Get(context_)->extension_service(); | 87 ExtensionSystem::Get(browser_context_)->extension_service(); |
| 91 | 88 |
| 92 PendingExtensionManager* pending_extension_manager = | 89 PendingExtensionManager* pending_extension_manager = |
| 93 service->pending_extension_manager(); | 90 service->pending_extension_manager(); |
| 94 DCHECK(pending_extension_manager); | 91 DCHECK(pending_extension_manager); |
| 95 | 92 |
| 96 if (status == IMPORT_STATUS_UNSATISFIED) { | 93 if (status == IMPORT_STATUS_UNSATISFIED) { |
| 97 for (ImportInfoList::const_iterator iter = missing_modules.begin(); | 94 for (ImportInfoList::const_iterator iter = missing_modules.begin(); |
| 98 iter != missing_modules.end(); | 95 iter != missing_modules.end(); |
| 99 ++iter) { | 96 ++iter) { |
| 100 pending_extension_manager->AddFromExtensionImport( | 97 pending_extension_manager->AddFromExtensionImport( |
| 101 iter->extension_id, | 98 iter->extension_id, |
| 102 extension_urls::GetWebstoreUpdateUrl(), | 99 extension_urls::GetWebstoreUpdateUrl(), |
| 103 SharedModuleInfo::IsSharedModule); | 100 SharedModuleInfo::IsSharedModule); |
| 104 } | 101 } |
| 105 service->CheckForUpdatesSoon(); | 102 service->CheckForUpdatesSoon(); |
| 106 } | 103 } |
| 107 return status; | 104 return status; |
| 108 } | 105 } |
| 109 | 106 |
| 110 scoped_ptr<const ExtensionSet> SharedModuleService::GetDependentExtensions( | 107 scoped_ptr<const ExtensionSet> SharedModuleService::GetDependentExtensions( |
| 111 const Extension* extension) { | 108 const Extension* extension) { |
| 112 scoped_ptr<ExtensionSet> dependents(new ExtensionSet()); | 109 scoped_ptr<ExtensionSet> dependents(new ExtensionSet()); |
| 113 | 110 |
| 114 if (SharedModuleInfo::IsSharedModule(extension)) { | 111 if (SharedModuleInfo::IsSharedModule(extension)) { |
| 115 ExtensionRegistry* registry = ExtensionRegistry::Get(context_); | 112 ExtensionRegistry* registry = ExtensionRegistry::Get(browser_context_); |
| 116 ExtensionService* service = | 113 ExtensionService* service = |
| 117 ExtensionSystem::Get(context_)->extension_service(); | 114 ExtensionSystem::Get(browser_context_)->extension_service(); |
| 118 | 115 |
| 119 ExtensionSet set_to_check; | 116 ExtensionSet set_to_check; |
| 120 set_to_check.InsertAll(registry->enabled_extensions()); | 117 set_to_check.InsertAll(registry->enabled_extensions()); |
| 121 set_to_check.InsertAll(registry->disabled_extensions()); | 118 set_to_check.InsertAll(registry->disabled_extensions()); |
| 122 set_to_check.InsertAll(*service->delayed_installs()); | 119 set_to_check.InsertAll(*service->delayed_installs()); |
| 123 | 120 |
| 124 for (ExtensionSet::const_iterator iter = set_to_check.begin(); | 121 for (ExtensionSet::const_iterator iter = set_to_check.begin(); |
| 125 iter != set_to_check.end(); | 122 iter != set_to_check.end(); |
| 126 ++iter) { | 123 ++iter) { |
| 127 if (SharedModuleInfo::ImportsExtensionById(iter->get(), | 124 if (SharedModuleInfo::ImportsExtensionById(iter->get(), |
| 128 extension->id())) { | 125 extension->id())) { |
| 129 dependents->Insert(*iter); | 126 dependents->Insert(*iter); |
| 130 } | 127 } |
| 131 } | 128 } |
| 132 } | 129 } |
| 133 return dependents.PassAs<const ExtensionSet>(); | 130 return dependents.PassAs<const ExtensionSet>(); |
| 134 } | 131 } |
| 135 | 132 |
| 136 void SharedModuleService::PruneSharedModulesOnUninstall( | 133 void SharedModuleService::OnExtensionUninstalled( |
| 134 content::BrowserContext* browser_context, | |
| 137 const Extension* extension) { | 135 const Extension* extension) { |
| 136 // Uninstalls shared modules that were only referenced by |extension|. | |
| 138 if (!SharedModuleInfo::ImportsModules(extension)) | 137 if (!SharedModuleInfo::ImportsModules(extension)) |
| 139 return; | 138 return; |
| 140 | 139 |
| 141 ExtensionRegistry* registry = ExtensionRegistry::Get(context_); | 140 ExtensionRegistry* registry = ExtensionRegistry::Get(browser_context_); |
| 142 ExtensionService* service = | 141 ExtensionService* service = |
| 143 ExtensionSystem::Get(context_)->extension_service(); | 142 ExtensionSystem::Get(browser_context_)->extension_service(); |
| 144 | 143 |
| 145 const ImportInfoVector& imports = SharedModuleInfo::GetImports(extension); | 144 const ImportInfoVector& imports = SharedModuleInfo::GetImports(extension); |
| 146 for (ImportInfoVector::const_iterator iter = imports.begin(); | 145 for (ImportInfoVector::const_iterator iter = imports.begin(); |
| 147 iter != imports.end(); | 146 iter != imports.end(); |
| 148 ++iter) { | 147 ++iter) { |
| 149 const Extension* imported_module = | 148 const Extension* imported_module = |
| 150 registry->GetExtensionById(iter->extension_id, | 149 registry->GetExtensionById(iter->extension_id, |
| 151 ExtensionRegistry::EVERYTHING); | 150 ExtensionRegistry::EVERYTHING); |
| 152 if (imported_module && imported_module->from_webstore()) { | 151 if (imported_module && imported_module->from_webstore()) { |
| 153 scoped_ptr<const ExtensionSet> dependents = | 152 scoped_ptr<const ExtensionSet> dependents = |
| 154 GetDependentExtensions(imported_module); | 153 GetDependentExtensions(imported_module); |
| 155 if (dependents->is_empty()) { | 154 if (dependents->is_empty()) { |
| 156 service->UninstallExtension(iter->extension_id, | 155 service->UninstallExtension(iter->extension_id, |
| 157 true, // External uninstall. | 156 true, // External uninstall. |
| 158 NULL); // Ignore error. | 157 NULL); // Ignore error. |
| 159 } | 158 } |
| 160 } | 159 } |
| 161 } | 160 } |
| 162 } | 161 } |
| 163 | 162 |
| 164 void SharedModuleService::OnExtensionUninstalled(const Extension* extension) { | |
| 165 PruneSharedModulesOnUninstall(extension); | |
| 166 } | |
| 167 | |
| 168 void SharedModuleService::OnShutdown() { | |
| 169 InstallTracker::Get(context_)->RemoveObserver(this); | |
|
not at google - send to devlin
2014/06/10 18:12:41
so.... it does seem like this is safe to remove, b
limasdf
2014/06/11 00:26:00
yep, please let me know if there's problem about t
| |
| 170 observing_ = false; | |
| 171 } | |
| 172 | |
| 173 } // namespace extensions | 163 } // namespace extensions |
| OLD | NEW |