Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(341)

Side by Side Diff: chrome/browser/extensions/shared_module_service.cc

Issue 386033002: Prune shared extendion module after extension updating. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix review issues Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
OLDNEW
« no previous file with comments | « chrome/browser/extensions/shared_module_service.h ('k') | chrome/browser/extensions/shared_module_service_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698