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 |