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 <set> |
7 #include <vector> | 8 #include <vector> |
8 | 9 |
9 #include "base/version.h" | 10 #include "base/version.h" |
10 #include "chrome/browser/extensions/extension_service.h" | 11 #include "chrome/browser/extensions/extension_service.h" |
11 #include "chrome/browser/extensions/pending_extension_manager.h" | 12 #include "chrome/browser/extensions/pending_extension_manager.h" |
12 #include "chrome/common/extensions/extension_constants.h" | 13 #include "chrome/common/extensions/extension_constants.h" |
13 #include "extensions/browser/extension_registry.h" | 14 #include "extensions/browser/extension_registry.h" |
14 #include "extensions/browser/extension_system.h" | 15 #include "extensions/browser/extension_system.h" |
15 #include "extensions/common/extension.h" | 16 #include "extensions/common/extension.h" |
16 | 17 |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
123 ++iter) { | 124 ++iter) { |
124 if (SharedModuleInfo::ImportsExtensionById(iter->get(), | 125 if (SharedModuleInfo::ImportsExtensionById(iter->get(), |
125 extension->id())) { | 126 extension->id())) { |
126 dependents->Insert(*iter); | 127 dependents->Insert(*iter); |
127 } | 128 } |
128 } | 129 } |
129 } | 130 } |
130 return dependents.PassAs<ExtensionSet>(); | 131 return dependents.PassAs<ExtensionSet>(); |
131 } | 132 } |
132 | 133 |
| 134 void SharedModuleService::PruneSharedModules() { |
| 135 ExtensionRegistry* registry = ExtensionRegistry::Get(browser_context_); |
| 136 ExtensionService* service = |
| 137 ExtensionSystem::Get(browser_context_)->extension_service(); |
| 138 |
| 139 ExtensionSet set_to_check; |
| 140 set_to_check.InsertAll(registry->enabled_extensions()); |
| 141 set_to_check.InsertAll(registry->disabled_extensions()); |
| 142 set_to_check.InsertAll(*service->delayed_installs()); |
| 143 |
| 144 std::vector<std::string> shared_modules; |
| 145 std::set<std::string> used_shared_modules; |
| 146 |
| 147 for (ExtensionSet::const_iterator iter = set_to_check.begin(); |
| 148 iter != set_to_check.end(); |
| 149 ++iter) { |
| 150 if (SharedModuleInfo::IsSharedModule(iter->get())) |
| 151 shared_modules.push_back(iter->get()->id()); |
| 152 |
| 153 const ImportInfoVector& imports = SharedModuleInfo::GetImports(iter->get()); |
| 154 for (ImportInfoVector::const_iterator imports_iter = imports.begin(); |
| 155 imports_iter != imports.end(); |
| 156 ++imports_iter) { |
| 157 used_shared_modules.insert(imports_iter->extension_id); |
| 158 } |
| 159 } |
| 160 |
| 161 std::vector<std::string>::const_iterator shared_modules_iter; |
| 162 for (shared_modules_iter = shared_modules.begin(); |
| 163 shared_modules_iter != shared_modules.end(); |
| 164 shared_modules_iter++) { |
| 165 if (used_shared_modules.count(*shared_modules_iter)) |
| 166 continue; |
| 167 service->UninstallExtension( |
| 168 *shared_modules_iter, |
| 169 ExtensionService::UNINSTALL_REASON_ORPHANED_SHARED_MODULE, |
| 170 NULL); // Ignore error. |
| 171 } |
| 172 } |
| 173 |
| 174 void SharedModuleService::OnExtensionInstalled( |
| 175 content::BrowserContext* browser_context, |
| 176 const Extension* extension, |
| 177 bool is_update) { |
| 178 if (is_update) |
| 179 PruneSharedModules(); |
| 180 } |
| 181 |
133 void SharedModuleService::OnExtensionUninstalled( | 182 void SharedModuleService::OnExtensionUninstalled( |
134 content::BrowserContext* browser_context, | 183 content::BrowserContext* browser_context, |
135 const Extension* extension) { | 184 const Extension* extension) { |
136 // Uninstalls shared modules that were only referenced by |extension|. | 185 PruneSharedModules(); |
137 if (!SharedModuleInfo::ImportsModules(extension)) | |
138 return; | |
139 | |
140 ExtensionRegistry* registry = ExtensionRegistry::Get(browser_context_); | |
141 ExtensionService* service = | |
142 ExtensionSystem::Get(browser_context_)->extension_service(); | |
143 | |
144 const ImportInfoVector& imports = SharedModuleInfo::GetImports(extension); | |
145 for (ImportInfoVector::const_iterator iter = imports.begin(); | |
146 iter != imports.end(); | |
147 ++iter) { | |
148 const Extension* imported_module = | |
149 registry->GetExtensionById(iter->extension_id, | |
150 ExtensionRegistry::EVERYTHING); | |
151 if (imported_module && imported_module->from_webstore()) { | |
152 scoped_ptr<ExtensionSet> dependents = | |
153 GetDependentExtensions(imported_module); | |
154 if (dependents->is_empty()) { | |
155 service->UninstallExtension( | |
156 iter->extension_id, | |
157 ExtensionService::UNINSTALL_REASON_ORPHANED_SHARED_MODULE, | |
158 NULL); // Ignore error. | |
159 } | |
160 } | |
161 } | |
162 } | 186 } |
163 | 187 |
164 } // namespace extensions | 188 } // namespace extensions |
OLD | NEW |