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

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

Issue 1495403002: Observe adding external extensions via windows registry. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: move prefs to OnUpdated's param, instead of storing, to avoid multi-thread issues Created 4 years, 11 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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/external_provider_impl.h" 5 #include "chrome/browser/extensions/external_provider_impl.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <set> 9 #include <set>
10 #include <vector> 10 #include <vector>
(...skipping 21 matching lines...) Expand all
32 #include "chrome/browser/policy/profile_policy_connector.h" 32 #include "chrome/browser/policy/profile_policy_connector.h"
33 #include "chrome/browser/policy/profile_policy_connector_factory.h" 33 #include "chrome/browser/policy/profile_policy_connector_factory.h"
34 #include "chrome/browser/profiles/profile.h" 34 #include "chrome/browser/profiles/profile.h"
35 #include "chrome/common/chrome_paths.h" 35 #include "chrome/common/chrome_paths.h"
36 #include "chrome/common/chrome_switches.h" 36 #include "chrome/common/chrome_switches.h"
37 #include "chrome/common/extensions/extension_constants.h" 37 #include "chrome/common/extensions/extension_constants.h"
38 #include "chrome/common/pref_names.h" 38 #include "chrome/common/pref_names.h"
39 #include "components/crx_file/id_util.h" 39 #include "components/crx_file/id_util.h"
40 #include "content/public/browser/browser_thread.h" 40 #include "content/public/browser/browser_thread.h"
41 #include "extensions/browser/extension_system.h" 41 #include "extensions/browser/extension_system.h"
42 #include "extensions/browser/external_install_info.h"
42 #include "extensions/browser/external_provider_interface.h" 43 #include "extensions/browser/external_provider_interface.h"
43 #include "extensions/common/extension.h" 44 #include "extensions/common/extension.h"
44 #include "extensions/common/manifest.h" 45 #include "extensions/common/manifest.h"
45 #include "ui/base/l10n/l10n_util.h" 46 #include "ui/base/l10n/l10n_util.h"
46 47
47 #if defined(OS_CHROMEOS) 48 #if defined(OS_CHROMEOS)
48 #include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h" 49 #include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h"
49 #include "chrome/browser/chromeos/customization/customization_document.h" 50 #include "chrome/browser/chromeos/customization/customization_document.h"
50 #include "chrome/browser/chromeos/extensions/device_local_account_external_polic y_loader.h" 51 #include "chrome/browser/chromeos/extensions/device_local_account_external_polic y_loader.h"
51 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" 52 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 void ExternalProviderImpl::SetPrefs(base::DictionaryValue* prefs) { 114 void ExternalProviderImpl::SetPrefs(base::DictionaryValue* prefs) {
114 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 115 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
115 116
116 // Check if the service is still alive. It is possible that it went 117 // Check if the service is still alive. It is possible that it went
117 // away while |loader_| was working on the FILE thread. 118 // away while |loader_| was working on the FILE thread.
118 if (!service_) return; 119 if (!service_) return;
119 120
120 prefs_.reset(prefs); 121 prefs_.reset(prefs);
121 ready_ = true; // Queries for extensions are allowed from this point. 122 ready_ = true; // Queries for extensions are allowed from this point.
122 123
124 ScopedVector<ExternalInstallInfoUpdateUrl> external_update_url_extensions;
125 ScopedVector<ExternalInstallInfoFile> external_file_extensions;
126
127 RetrieveExtensionsFromPrefs(&external_update_url_extensions,
128 &external_file_extensions);
129 for (const auto& extension : external_update_url_extensions)
130 service_->OnExternalExtensionUpdateUrlFound(*extension, true);
131
132 for (const auto& extension : external_file_extensions)
133 service_->OnExternalExtensionFileFound(*extension);
134
135 service_->OnExternalProviderReady(this);
136 }
137
138 void ExternalProviderImpl::UpdatePrefs(base::DictionaryValue* prefs) {
139 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
140 // We only expect updates from windows registry.
141 CHECK(crx_location_ == Manifest::EXTERNAL_REGISTRY);
142
143 // Check if the service is still alive. It is possible that it went
144 // away while |loader_| was working on the FILE thread.
145 if (!service_)
146 return;
147
148 std::set<std::string> removed_extensions;
149 // Find extensions that were removed by this ExternalProvider.
150 for (base::DictionaryValue::Iterator i(*prefs_); !i.IsAtEnd(); i.Advance()) {
151 const std::string& extension_id = i.key();
152 // Don't bother about invalid ids.
153 if (!crx_file::id_util::IdIsValid(extension_id))
154 continue;
155 if (!prefs->HasKey(extension_id))
156 removed_extensions.insert(extension_id);
157 }
158
159 prefs_.reset(prefs);
160
161 ScopedVector<ExternalInstallInfoUpdateUrl> external_update_url_extensions;
162 ScopedVector<ExternalInstallInfoFile> external_file_extensions;
163 RetrieveExtensionsFromPrefs(&external_update_url_extensions,
164 &external_file_extensions);
165
166 // Notify ExtensionService about completion of finding incremental updates
167 // from this provider.
168 // Provide the list of added and removed extensions.
169 service_->OnExternalProviderUpdateComplete(
170 this, external_update_url_extensions, external_file_extensions,
171 removed_extensions);
172 }
173
174 void ExternalProviderImpl::RetrieveExtensionsFromPrefs(
175 ScopedVector<ExternalInstallInfoUpdateUrl>* external_update_url_extensions,
176 ScopedVector<ExternalInstallInfoFile>* external_file_extensions) {
123 // Set of unsupported extensions that need to be deleted from prefs_. 177 // Set of unsupported extensions that need to be deleted from prefs_.
124 std::set<std::string> unsupported_extensions; 178 std::set<std::string> unsupported_extensions;
125 179
126 // Notify ExtensionService about all the extensions this provider has. 180 // Discover all the extensions this provider has.
127 for (base::DictionaryValue::Iterator i(*prefs_); !i.IsAtEnd(); i.Advance()) { 181 for (base::DictionaryValue::Iterator i(*prefs_); !i.IsAtEnd(); i.Advance()) {
128 const std::string& extension_id = i.key(); 182 const std::string& extension_id = i.key();
129 const base::DictionaryValue* extension = NULL; 183 const base::DictionaryValue* extension = NULL;
130 184
131 if (!crx_file::id_util::IdIsValid(extension_id)) { 185 if (!crx_file::id_util::IdIsValid(extension_id)) {
132 LOG(WARNING) << "Malformed extension dictionary: key " 186 LOG(WARNING) << "Malformed extension dictionary: key "
133 << extension_id.c_str() << " is not a valid id."; 187 << extension_id.c_str() << " is not a valid id.";
134 continue; 188 continue;
135 } 189 }
136 190
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
282 if (!path.IsAbsolute()) { 336 if (!path.IsAbsolute()) {
283 base::FilePath base_path = loader_->GetBaseCrxFilePath(); 337 base::FilePath base_path = loader_->GetBaseCrxFilePath();
284 if (base_path.empty()) { 338 if (base_path.empty()) {
285 LOG(WARNING) << "File path " << external_crx.c_str() 339 LOG(WARNING) << "File path " << external_crx.c_str()
286 << " is relative. An absolute path is required."; 340 << " is relative. An absolute path is required.";
287 continue; 341 continue;
288 } 342 }
289 path = base_path.Append(external_crx); 343 path = base_path.Append(external_crx);
290 } 344 }
291 345
292 Version version(external_version); 346 scoped_ptr<Version> version(new Version(external_version));
293 if (!version.IsValid()) { 347 if (!version->IsValid()) {
294 LOG(WARNING) << "Malformed extension dictionary for extension: " 348 LOG(WARNING) << "Malformed extension dictionary for extension: "
295 << extension_id.c_str() << ". Invalid version string \"" 349 << extension_id.c_str() << ". Invalid version string \""
296 << external_version << "\"."; 350 << external_version << "\".";
297 continue; 351 continue;
298 } 352 }
299 service_->OnExternalExtensionFileFound(extension_id, &version, path, 353 external_file_extensions->push_back(new ExternalInstallInfoFile(
300 crx_location_, creation_flags, 354 extension_id, std::move(version), path, crx_location_, creation_flags,
301 auto_acknowledge_, 355 auto_acknowledge_, install_immediately_));
302 install_immediately_);
303 } else { // if (has_external_update_url) 356 } else { // if (has_external_update_url)
304 CHECK(has_external_update_url); // Checking of keys above ensures this. 357 CHECK(has_external_update_url); // Checking of keys above ensures this.
305 if (download_location_ == Manifest::INVALID_LOCATION) { 358 if (download_location_ == Manifest::INVALID_LOCATION) {
306 LOG(WARNING) << "This provider does not support installing external " 359 LOG(WARNING) << "This provider does not support installing external "
307 << "extensions from update URLs."; 360 << "extensions from update URLs.";
308 continue; 361 continue;
309 } 362 }
310 GURL update_url(external_update_url); 363 scoped_ptr<GURL> update_url(new GURL(external_update_url));
311 if (!update_url.is_valid()) { 364 if (!update_url->is_valid()) {
312 LOG(WARNING) << "Malformed extension dictionary for extension: " 365 LOG(WARNING) << "Malformed extension dictionary for extension: "
313 << extension_id.c_str() << ". Key " << kExternalUpdateUrl 366 << extension_id.c_str() << ". Key " << kExternalUpdateUrl
314 << " has value \"" << external_update_url 367 << " has value \"" << external_update_url
315 << "\", which is not a valid URL."; 368 << "\", which is not a valid URL.";
316 continue; 369 continue;
317 } 370 }
318 service_->OnExternalExtensionUpdateUrlFound(extension_id, 371 external_update_url_extensions->push_back(
319 install_parameter, 372 new ExternalInstallInfoUpdateUrl(
320 update_url, 373 extension_id, install_parameter, std::move(update_url),
321 download_location_, 374 download_location_, creation_flags, auto_acknowledge_));
322 creation_flags,
323 auto_acknowledge_);
324 } 375 }
325 } 376 }
326 377
327 for (std::set<std::string>::iterator it = unsupported_extensions.begin(); 378 for (std::set<std::string>::iterator it = unsupported_extensions.begin();
328 it != unsupported_extensions.end(); ++it) { 379 it != unsupported_extensions.end(); ++it) {
329 // Remove extension for the list of know external extensions. The extension 380 // Remove extension for the list of know external extensions. The extension
330 // will be uninstalled later because provider doesn't provide it anymore. 381 // will be uninstalled later because provider doesn't provide it anymore.
331 prefs_->Remove(*it, NULL); 382 prefs_->Remove(*it, NULL);
332 } 383 }
333
334 service_->OnExternalProviderReady(this);
335 } 384 }
336 385
337 void ExternalProviderImpl::ServiceShutdown() { 386 void ExternalProviderImpl::ServiceShutdown() {
338 service_ = NULL; 387 service_ = NULL;
339 } 388 }
340 389
341 bool ExternalProviderImpl::IsReady() const { 390 bool ExternalProviderImpl::IsReady() const {
342 return ready_; 391 return ready_;
343 } 392 }
344 393
(...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after
691 new ExternalProviderImpl( 740 new ExternalProviderImpl(
692 service, 741 service,
693 new ExternalComponentLoader(profile), 742 new ExternalComponentLoader(profile),
694 profile, 743 profile,
695 Manifest::INVALID_LOCATION, 744 Manifest::INVALID_LOCATION,
696 Manifest::EXTERNAL_COMPONENT, 745 Manifest::EXTERNAL_COMPONENT,
697 Extension::FROM_WEBSTORE | Extension::WAS_INSTALLED_BY_DEFAULT))); 746 Extension::FROM_WEBSTORE | Extension::WAS_INSTALLED_BY_DEFAULT)));
698 } 747 }
699 748
700 } // namespace extensions 749 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698