OLD | NEW |
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 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
115 void ExternalProviderImpl::SetPrefs(base::DictionaryValue* prefs) { | 115 void ExternalProviderImpl::SetPrefs(base::DictionaryValue* prefs) { |
116 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 116 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
117 | 117 |
118 // Check if the service is still alive. It is possible that it went | 118 // Check if the service is still alive. It is possible that it went |
119 // away while |loader_| was working on the FILE thread. | 119 // away while |loader_| was working on the FILE thread. |
120 if (!service_) return; | 120 if (!service_) return; |
121 | 121 |
122 prefs_.reset(prefs); | 122 prefs_.reset(prefs); |
123 ready_ = true; // Queries for extensions are allowed from this point. | 123 ready_ = true; // Queries for extensions are allowed from this point. |
124 | 124 |
125 ScopedVector<ExternalInstallInfoUpdateUrl> external_update_url_extensions; | 125 std::vector<std::unique_ptr<ExternalInstallInfoUpdateUrl>> |
126 ScopedVector<ExternalInstallInfoFile> external_file_extensions; | 126 external_update_url_extensions; |
| 127 std::vector<std::unique_ptr<ExternalInstallInfoFile>> |
| 128 external_file_extensions; |
127 | 129 |
128 RetrieveExtensionsFromPrefs(&external_update_url_extensions, | 130 RetrieveExtensionsFromPrefs(&external_update_url_extensions, |
129 &external_file_extensions); | 131 &external_file_extensions); |
130 for (auto* extension : external_update_url_extensions) | 132 for (const auto& extension : external_update_url_extensions) |
131 service_->OnExternalExtensionUpdateUrlFound(*extension, true); | 133 service_->OnExternalExtensionUpdateUrlFound(*extension, true); |
132 | 134 |
133 for (auto* extension : external_file_extensions) | 135 for (const auto& extension : external_file_extensions) |
134 service_->OnExternalExtensionFileFound(*extension); | 136 service_->OnExternalExtensionFileFound(*extension); |
135 | 137 |
136 service_->OnExternalProviderReady(this); | 138 service_->OnExternalProviderReady(this); |
137 } | 139 } |
138 | 140 |
139 void ExternalProviderImpl::UpdatePrefs(base::DictionaryValue* prefs) { | 141 void ExternalProviderImpl::UpdatePrefs(base::DictionaryValue* prefs) { |
140 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 142 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
141 // We only expect updates from windows registry. | 143 // We only expect updates from windows registry. |
142 CHECK(crx_location_ == Manifest::EXTERNAL_REGISTRY); | 144 CHECK(crx_location_ == Manifest::EXTERNAL_REGISTRY); |
143 | 145 |
144 // Check if the service is still alive. It is possible that it went | 146 // Check if the service is still alive. It is possible that it went |
145 // away while |loader_| was working on the FILE thread. | 147 // away while |loader_| was working on the FILE thread. |
146 if (!service_) | 148 if (!service_) |
147 return; | 149 return; |
148 | 150 |
149 std::set<std::string> removed_extensions; | 151 std::set<std::string> removed_extensions; |
150 // Find extensions that were removed by this ExternalProvider. | 152 // Find extensions that were removed by this ExternalProvider. |
151 for (base::DictionaryValue::Iterator i(*prefs_); !i.IsAtEnd(); i.Advance()) { | 153 for (base::DictionaryValue::Iterator i(*prefs_); !i.IsAtEnd(); i.Advance()) { |
152 const std::string& extension_id = i.key(); | 154 const std::string& extension_id = i.key(); |
153 // Don't bother about invalid ids. | 155 // Don't bother about invalid ids. |
154 if (!crx_file::id_util::IdIsValid(extension_id)) | 156 if (!crx_file::id_util::IdIsValid(extension_id)) |
155 continue; | 157 continue; |
156 if (!prefs->HasKey(extension_id)) | 158 if (!prefs->HasKey(extension_id)) |
157 removed_extensions.insert(extension_id); | 159 removed_extensions.insert(extension_id); |
158 } | 160 } |
159 | 161 |
160 prefs_.reset(prefs); | 162 prefs_.reset(prefs); |
161 | 163 |
162 ScopedVector<ExternalInstallInfoUpdateUrl> external_update_url_extensions; | 164 std::vector<std::unique_ptr<ExternalInstallInfoUpdateUrl>> |
163 ScopedVector<ExternalInstallInfoFile> external_file_extensions; | 165 external_update_url_extensions; |
| 166 std::vector<std::unique_ptr<ExternalInstallInfoFile>> |
| 167 external_file_extensions; |
164 RetrieveExtensionsFromPrefs(&external_update_url_extensions, | 168 RetrieveExtensionsFromPrefs(&external_update_url_extensions, |
165 &external_file_extensions); | 169 &external_file_extensions); |
166 | 170 |
167 // Notify ExtensionService about completion of finding incremental updates | 171 // Notify ExtensionService about completion of finding incremental updates |
168 // from this provider. | 172 // from this provider. |
169 // Provide the list of added and removed extensions. | 173 // Provide the list of added and removed extensions. |
170 service_->OnExternalProviderUpdateComplete( | 174 service_->OnExternalProviderUpdateComplete( |
171 this, external_update_url_extensions, external_file_extensions, | 175 this, external_update_url_extensions, external_file_extensions, |
172 removed_extensions); | 176 removed_extensions); |
173 } | 177 } |
174 | 178 |
175 void ExternalProviderImpl::RetrieveExtensionsFromPrefs( | 179 void ExternalProviderImpl::RetrieveExtensionsFromPrefs( |
176 ScopedVector<ExternalInstallInfoUpdateUrl>* external_update_url_extensions, | 180 std::vector<std::unique_ptr<ExternalInstallInfoUpdateUrl>>* |
177 ScopedVector<ExternalInstallInfoFile>* external_file_extensions) { | 181 external_update_url_extensions, |
| 182 std::vector<std::unique_ptr<ExternalInstallInfoFile>>* |
| 183 external_file_extensions) { |
178 // Set of unsupported extensions that need to be deleted from prefs_. | 184 // Set of unsupported extensions that need to be deleted from prefs_. |
179 std::set<std::string> unsupported_extensions; | 185 std::set<std::string> unsupported_extensions; |
180 | 186 |
181 // Discover all the extensions this provider has. | 187 // Discover all the extensions this provider has. |
182 for (base::DictionaryValue::Iterator i(*prefs_); !i.IsAtEnd(); i.Advance()) { | 188 for (base::DictionaryValue::Iterator i(*prefs_); !i.IsAtEnd(); i.Advance()) { |
183 const std::string& extension_id = i.key(); | 189 const std::string& extension_id = i.key(); |
184 const base::DictionaryValue* extension = NULL; | 190 const base::DictionaryValue* extension = NULL; |
185 | 191 |
186 if (!crx_file::id_util::IdIsValid(extension_id)) { | 192 if (!crx_file::id_util::IdIsValid(extension_id)) { |
187 LOG(WARNING) << "Malformed extension dictionary: key " | 193 LOG(WARNING) << "Malformed extension dictionary: key " |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
344 } | 350 } |
345 | 351 |
346 std::unique_ptr<base::Version> version( | 352 std::unique_ptr<base::Version> version( |
347 new base::Version(external_version)); | 353 new base::Version(external_version)); |
348 if (!version->IsValid()) { | 354 if (!version->IsValid()) { |
349 LOG(WARNING) << "Malformed extension dictionary for extension: " | 355 LOG(WARNING) << "Malformed extension dictionary for extension: " |
350 << extension_id.c_str() << ". Invalid version string \"" | 356 << extension_id.c_str() << ". Invalid version string \"" |
351 << external_version << "\"."; | 357 << external_version << "\"."; |
352 continue; | 358 continue; |
353 } | 359 } |
354 external_file_extensions->push_back(new ExternalInstallInfoFile( | 360 external_file_extensions->push_back( |
355 extension_id, std::move(version), path, crx_location_, creation_flags, | 361 base::MakeUnique<ExternalInstallInfoFile>( |
356 auto_acknowledge_, install_immediately_)); | 362 extension_id, std::move(version), path, crx_location_, |
| 363 creation_flags, auto_acknowledge_, install_immediately_)); |
357 } else { // if (has_external_update_url) | 364 } else { // if (has_external_update_url) |
358 CHECK(has_external_update_url); // Checking of keys above ensures this. | 365 CHECK(has_external_update_url); // Checking of keys above ensures this. |
359 if (download_location_ == Manifest::INVALID_LOCATION) { | 366 if (download_location_ == Manifest::INVALID_LOCATION) { |
360 LOG(WARNING) << "This provider does not support installing external " | 367 LOG(WARNING) << "This provider does not support installing external " |
361 << "extensions from update URLs."; | 368 << "extensions from update URLs."; |
362 continue; | 369 continue; |
363 } | 370 } |
364 std::unique_ptr<GURL> update_url(new GURL(external_update_url)); | 371 std::unique_ptr<GURL> update_url(new GURL(external_update_url)); |
365 if (!update_url->is_valid()) { | 372 if (!update_url->is_valid()) { |
366 LOG(WARNING) << "Malformed extension dictionary for extension: " | 373 LOG(WARNING) << "Malformed extension dictionary for extension: " |
367 << extension_id.c_str() << ". Key " << kExternalUpdateUrl | 374 << extension_id.c_str() << ". Key " << kExternalUpdateUrl |
368 << " has value \"" << external_update_url | 375 << " has value \"" << external_update_url |
369 << "\", which is not a valid URL."; | 376 << "\", which is not a valid URL."; |
370 continue; | 377 continue; |
371 } | 378 } |
372 external_update_url_extensions->push_back( | 379 external_update_url_extensions->push_back( |
373 new ExternalInstallInfoUpdateUrl( | 380 base::MakeUnique<ExternalInstallInfoUpdateUrl>( |
374 extension_id, install_parameter, std::move(update_url), | 381 extension_id, install_parameter, std::move(update_url), |
375 download_location_, creation_flags, auto_acknowledge_)); | 382 download_location_, creation_flags, auto_acknowledge_)); |
376 } | 383 } |
377 } | 384 } |
378 | 385 |
379 for (std::set<std::string>::iterator it = unsupported_extensions.begin(); | 386 for (std::set<std::string>::iterator it = unsupported_extensions.begin(); |
380 it != unsupported_extensions.end(); ++it) { | 387 it != unsupported_extensions.end(); ++it) { |
381 // Remove extension for the list of know external extensions. The extension | 388 // Remove extension for the list of know external extensions. The extension |
382 // will be uninstalled later because provider doesn't provide it anymore. | 389 // will be uninstalled later because provider doesn't provide it anymore. |
383 prefs_->Remove(*it, NULL); | 390 prefs_->Remove(*it, NULL); |
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
688 provider_list->push_back(std::move(drive_migration_provider)); | 695 provider_list->push_back(std::move(drive_migration_provider)); |
689 } | 696 } |
690 | 697 |
691 provider_list->push_back(base::MakeUnique<ExternalProviderImpl>( | 698 provider_list->push_back(base::MakeUnique<ExternalProviderImpl>( |
692 service, new ExternalComponentLoader(profile), profile, | 699 service, new ExternalComponentLoader(profile), profile, |
693 Manifest::INVALID_LOCATION, Manifest::EXTERNAL_COMPONENT, | 700 Manifest::INVALID_LOCATION, Manifest::EXTERNAL_COMPONENT, |
694 Extension::FROM_WEBSTORE | Extension::WAS_INSTALLED_BY_DEFAULT)); | 701 Extension::FROM_WEBSTORE | Extension::WAS_INSTALLED_BY_DEFAULT)); |
695 } | 702 } |
696 | 703 |
697 } // namespace extensions | 704 } // namespace extensions |
OLD | NEW |