OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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/chromeos/extensions/external_cache.h" | 5 #include "chrome/browser/chromeos/extensions/external_cache.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
258 | 258 |
259 if (update_url.is_valid()) | 259 if (update_url.is_valid()) |
260 downloader_->AddPendingExtension(it.key(), update_url, false, 0); | 260 downloader_->AddPendingExtension(it.key(), update_url, false, 0); |
261 } | 261 } |
262 | 262 |
263 base::FilePath file_path; | 263 base::FilePath file_path; |
264 std::string version; | 264 std::string version; |
265 std::string hash; | 265 std::string hash; |
266 if (local_cache_.GetExtension(it.key(), hash, &file_path, &version)) { | 266 if (local_cache_.GetExtension(it.key(), hash, &file_path, &version)) { |
267 // Copy entry to don't modify it inside extensions_. | 267 // Copy entry to don't modify it inside extensions_. |
268 base::DictionaryValue* entry_copy = entry->DeepCopy(); | 268 std::unique_ptr<base::DictionaryValue> entry_copy = |
| 269 entry->CreateDeepCopy(); |
269 | 270 |
270 if (extension_urls::IsWebstoreUpdateUrl(GURL(external_update_url))) { | 271 if (extension_urls::IsWebstoreUpdateUrl(GURL(external_update_url))) { |
271 entry_copy->SetBoolean( | 272 entry_copy->SetBoolean( |
272 extensions::ExternalProviderImpl::kIsFromWebstore, true); | 273 extensions::ExternalProviderImpl::kIsFromWebstore, true); |
273 } | 274 } |
274 entry_copy->Remove(extensions::ExternalProviderImpl::kExternalUpdateUrl, | 275 entry_copy->Remove(extensions::ExternalProviderImpl::kExternalUpdateUrl, |
275 NULL); | 276 NULL); |
276 entry_copy->SetString(extensions::ExternalProviderImpl::kExternalVersion, | 277 entry_copy->SetString(extensions::ExternalProviderImpl::kExternalVersion, |
277 version); | 278 version); |
278 entry_copy->SetString(extensions::ExternalProviderImpl::kExternalCrx, | 279 entry_copy->SetString(extensions::ExternalProviderImpl::kExternalCrx, |
279 file_path.value()); | 280 file_path.value()); |
280 cached_extensions_->Set(it.key(), entry_copy); | 281 cached_extensions_->Set(it.key(), std::move(entry_copy)); |
281 } else { | 282 } else { |
282 bool has_external_crx = entry->HasKey( | 283 bool has_external_crx = entry->HasKey( |
283 extensions::ExternalProviderImpl::kExternalCrx); | 284 extensions::ExternalProviderImpl::kExternalCrx); |
284 bool is_already_installed = | 285 bool is_already_installed = |
285 !delegate_->GetInstalledExtensionVersion(it.key()).empty(); | 286 !delegate_->GetInstalledExtensionVersion(it.key()).empty(); |
286 if (keep_if_present || has_external_crx || is_already_installed) { | 287 if (keep_if_present || has_external_crx || is_already_installed) { |
287 // Copy entry to don't modify it inside extensions_. | 288 // Copy entry to don't modify it inside extensions_. |
288 cached_extensions_->Set(it.key(), entry->DeepCopy()); | 289 cached_extensions_->Set(it.key(), entry->CreateDeepCopy()); |
289 } | 290 } |
290 } | 291 } |
291 } | 292 } |
292 | 293 |
293 if (downloader_) | 294 if (downloader_) |
294 downloader_->StartAllPending(NULL); | 295 downloader_->StartAllPending(NULL); |
295 | 296 |
296 VLOG(1) << "Updated ExternalCache, there are " | 297 VLOG(1) << "Updated ExternalCache, there are " |
297 << cached_extensions_->size() << " extensions cached"; | 298 << cached_extensions_->size() << " extensions cached"; |
298 | 299 |
299 UpdateExtensionLoader(); | 300 UpdateExtensionLoader(); |
300 } | 301 } |
301 | 302 |
302 void ExternalCache::OnPutExtension(const std::string& id, | 303 void ExternalCache::OnPutExtension(const std::string& id, |
303 const base::FilePath& file_path, | 304 const base::FilePath& file_path, |
304 bool file_ownership_passed) { | 305 bool file_ownership_passed) { |
305 if (local_cache_.is_shutdown() || file_ownership_passed) { | 306 if (local_cache_.is_shutdown() || file_ownership_passed) { |
306 backend_task_runner_->PostTask(FROM_HERE, | 307 backend_task_runner_->PostTask(FROM_HERE, |
307 base::Bind(base::IgnoreResult(&base::DeleteFile), file_path, true)); | 308 base::Bind(base::IgnoreResult(&base::DeleteFile), file_path, true)); |
308 return; | 309 return; |
309 } | 310 } |
310 | 311 |
311 VLOG(1) << "ExternalCache installed a new extension in the cache " << id; | 312 VLOG(1) << "ExternalCache installed a new extension in the cache " << id; |
312 | 313 |
313 base::DictionaryValue* entry = NULL; | 314 base::DictionaryValue* original_entry = NULL; |
314 if (!extensions_->GetDictionary(id, &entry)) { | 315 if (!extensions_->GetDictionary(id, &original_entry)) { |
315 LOG(ERROR) << "ExternalCache cannot find entry for extension " << id; | 316 LOG(ERROR) << "ExternalCache cannot find entry for extension " << id; |
316 return; | 317 return; |
317 } | 318 } |
318 | 319 |
319 // Copy entry to don't modify it inside extensions_. | 320 // Copy original_entry to avoid modifying it inside extensions_. |
320 entry = entry->DeepCopy(); | 321 std::unique_ptr<base::DictionaryValue> entry = |
| 322 original_entry->CreateDeepCopy(); |
321 | 323 |
322 std::string version; | 324 std::string version; |
323 std::string hash; | 325 std::string hash; |
324 if (!local_cache_.GetExtension(id, hash, NULL, &version)) { | 326 if (!local_cache_.GetExtension(id, hash, NULL, &version)) { |
325 // Copy entry to don't modify it inside extensions_. | 327 // Copy entry to don't modify it inside extensions_. |
326 LOG(ERROR) << "Can't find installed extension in cache " << id; | 328 LOG(ERROR) << "Can't find installed extension in cache " << id; |
327 return; | 329 return; |
328 } | 330 } |
329 | 331 |
330 if (flush_on_put_) { | 332 if (flush_on_put_) { |
331 backend_task_runner_->PostTask(FROM_HERE, | 333 backend_task_runner_->PostTask(FROM_HERE, |
332 base::Bind(&FlushFile, file_path)); | 334 base::Bind(&FlushFile, file_path)); |
333 } | 335 } |
334 | 336 |
335 std::string update_url; | 337 std::string update_url; |
336 if (entry->GetString(extensions::ExternalProviderImpl::kExternalUpdateUrl, | 338 if (entry->GetString(extensions::ExternalProviderImpl::kExternalUpdateUrl, |
337 &update_url) && | 339 &update_url) && |
338 extension_urls::IsWebstoreUpdateUrl(GURL(update_url))) { | 340 extension_urls::IsWebstoreUpdateUrl(GURL(update_url))) { |
339 entry->SetBoolean(extensions::ExternalProviderImpl::kIsFromWebstore, true); | 341 entry->SetBoolean(extensions::ExternalProviderImpl::kIsFromWebstore, true); |
340 } | 342 } |
341 entry->Remove(extensions::ExternalProviderImpl::kExternalUpdateUrl, NULL); | 343 entry->Remove(extensions::ExternalProviderImpl::kExternalUpdateUrl, NULL); |
342 entry->SetString(extensions::ExternalProviderImpl::kExternalVersion, version); | 344 entry->SetString(extensions::ExternalProviderImpl::kExternalVersion, version); |
343 entry->SetString(extensions::ExternalProviderImpl::kExternalCrx, | 345 entry->SetString(extensions::ExternalProviderImpl::kExternalCrx, |
344 file_path.value()); | 346 file_path.value()); |
345 | 347 |
346 cached_extensions_->Set(id, entry); | 348 cached_extensions_->Set(id, std::move(entry)); |
347 if (delegate_) | 349 if (delegate_) |
348 delegate_->OnExtensionLoadedInCache(id); | 350 delegate_->OnExtensionLoadedInCache(id); |
349 UpdateExtensionLoader(); | 351 UpdateExtensionLoader(); |
350 } | 352 } |
351 | 353 |
352 void ExternalCache::OnPutExternalExtension( | 354 void ExternalCache::OnPutExternalExtension( |
353 const std::string& id, | 355 const std::string& id, |
354 const PutExternalExtensionCallback& callback, | 356 const PutExternalExtensionCallback& callback, |
355 const base::FilePath& file_path, | 357 const base::FilePath& file_path, |
356 bool file_ownership_passed) { | 358 bool file_ownership_passed) { |
357 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 359 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
358 OnPutExtension(id, file_path, file_ownership_passed); | 360 OnPutExtension(id, file_path, file_ownership_passed); |
359 callback.Run(id, !file_ownership_passed); | 361 callback.Run(id, !file_ownership_passed); |
360 } | 362 } |
361 | 363 |
362 std::string ExternalCache::Delegate::GetInstalledExtensionVersion( | 364 std::string ExternalCache::Delegate::GetInstalledExtensionVersion( |
363 const std::string& id) { | 365 const std::string& id) { |
364 return std::string(); | 366 return std::string(); |
365 } | 367 } |
366 | 368 |
367 } // namespace chromeos | 369 } // namespace chromeos |
OLD | NEW |