Index: chrome/browser/extensions/shared_module_service.cc |
diff --git a/chrome/browser/extensions/shared_module_service.cc b/chrome/browser/extensions/shared_module_service.cc |
index 8474d247606f238d64c1423e83c5d176a7222e13..2b595ff798b9c07f0965fa92939e31c314b62957 100644 |
--- a/chrome/browser/extensions/shared_module_service.cc |
+++ b/chrome/browser/extensions/shared_module_service.cc |
@@ -4,6 +4,7 @@ |
#include "chrome/browser/extensions/shared_module_service.h" |
+#include <set> |
#include <vector> |
#include "base/version.h" |
@@ -130,35 +131,58 @@ scoped_ptr<ExtensionSet> SharedModuleService::GetDependentExtensions( |
return dependents.PassAs<ExtensionSet>(); |
} |
-void SharedModuleService::OnExtensionUninstalled( |
- content::BrowserContext* browser_context, |
- const Extension* extension) { |
- // Uninstalls shared modules that were only referenced by |extension|. |
- if (!SharedModuleInfo::ImportsModules(extension)) |
- return; |
- |
+void SharedModuleService::PruneSharedModules() { |
ExtensionRegistry* registry = ExtensionRegistry::Get(browser_context_); |
ExtensionService* service = |
ExtensionSystem::Get(browser_context_)->extension_service(); |
- const ImportInfoVector& imports = SharedModuleInfo::GetImports(extension); |
- for (ImportInfoVector::const_iterator iter = imports.begin(); |
- iter != imports.end(); |
+ ExtensionSet set_to_check; |
+ set_to_check.InsertAll(registry->enabled_extensions()); |
+ set_to_check.InsertAll(registry->disabled_extensions()); |
+ set_to_check.InsertAll(*service->delayed_installs()); |
+ |
+ std::vector<std::string> shared_modules; |
+ std::set<std::string> used_shared_modules; |
+ |
+ for (ExtensionSet::const_iterator iter = set_to_check.begin(); |
+ iter != set_to_check.end(); |
++iter) { |
- const Extension* imported_module = |
- registry->GetExtensionById(iter->extension_id, |
- ExtensionRegistry::EVERYTHING); |
- if (imported_module && imported_module->from_webstore()) { |
- scoped_ptr<ExtensionSet> dependents = |
- GetDependentExtensions(imported_module); |
- if (dependents->is_empty()) { |
- service->UninstallExtension( |
- iter->extension_id, |
- ExtensionService::UNINSTALL_REASON_ORPHANED_SHARED_MODULE, |
- NULL); // Ignore error. |
- } |
+ if (SharedModuleInfo::IsSharedModule(iter->get())) |
+ shared_modules.push_back(iter->get()->id()); |
+ |
+ const ImportInfoVector& imports = SharedModuleInfo::GetImports(iter->get()); |
+ for (ImportInfoVector::const_iterator imports_iter = imports.begin(); |
+ imports_iter != imports.end(); |
+ ++imports_iter) { |
+ used_shared_modules.insert(imports_iter->extension_id); |
} |
} |
+ |
+ std::vector<std::string>::const_iterator shared_modules_iter; |
+ for (shared_modules_iter = shared_modules.begin(); |
+ shared_modules_iter != shared_modules.end(); |
+ shared_modules_iter++) { |
+ if (used_shared_modules.count(*shared_modules_iter)) |
+ continue; |
+ service->UninstallExtension( |
+ *shared_modules_iter, |
+ ExtensionService::UNINSTALL_REASON_ORPHANED_SHARED_MODULE, |
+ NULL); // Ignore error. |
+ } |
+} |
+ |
+void SharedModuleService::OnExtensionInstalled( |
+ content::BrowserContext* browser_context, |
+ const Extension* extension, |
+ bool is_update) { |
+ if (is_update) |
+ PruneSharedModules(); |
+} |
+ |
+void SharedModuleService::OnExtensionUninstalled( |
+ content::BrowserContext* browser_context, |
+ const Extension* extension) { |
+ PruneSharedModules(); |
} |
} // namespace extensions |