summaryrefslogtreecommitdiffstats
path: root/chrome/browser/extensions/shared_module_service.cc
diff options
context:
space:
mode:
authorpenghuang@chromium.org <penghuang@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-07-16 23:27:51 +0000
committerpenghuang@chromium.org <penghuang@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-07-16 23:27:51 +0000
commit38e87253e69adebfd3ce5b1050cea6c0c9942165 (patch)
tree9bfb3b5e562014f9aa9ef11de62cd3b05b28371e /chrome/browser/extensions/shared_module_service.cc
parent6fa58150d06d0bbd3fa74f7f04ebe7e911b16dff (diff)
downloadchromium_src-38e87253e69adebfd3ce5b1050cea6c0c9942165.zip
chromium_src-38e87253e69adebfd3ce5b1050cea6c0c9942165.tar.gz
chromium_src-38e87253e69adebfd3ce5b1050cea6c0c9942165.tar.bz2
Prune shared extension module after extension updating.
When an extension is updated, the imported module of the extension could be changed in the new version. If the imported modules are removed in the new version, we need check and remove the shared modules if necessary. BUG=393232 Review URL: https://codereview.chromium.org/386033002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@283574 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/extensions/shared_module_service.cc')
-rw-r--r--chrome/browser/extensions/shared_module_service.cc68
1 files changed, 46 insertions, 22 deletions
diff --git a/chrome/browser/extensions/shared_module_service.cc b/chrome/browser/extensions/shared_module_service.cc
index 8474d24..2b595ff 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