| 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 "extensions/browser/updater/extension_downloader.h" | 5 #include "extensions/browser/updater/extension_downloader.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 248 | 248 |
| 249 void ExtensionDownloader::DoStartAllPending() { | 249 void ExtensionDownloader::DoStartAllPending() { |
| 250 ReportStats(); | 250 ReportStats(); |
| 251 url_stats_ = URLStats(); | 251 url_stats_ = URLStats(); |
| 252 | 252 |
| 253 for (FetchMap::iterator it = fetches_preparing_.begin(); | 253 for (FetchMap::iterator it = fetches_preparing_.begin(); |
| 254 it != fetches_preparing_.end(); | 254 it != fetches_preparing_.end(); |
| 255 ++it) { | 255 ++it) { |
| 256 std::vector<linked_ptr<ManifestFetchData>>& list = it->second; | 256 std::vector<linked_ptr<ManifestFetchData>>& list = it->second; |
| 257 for (size_t i = 0; i < list.size(); ++i) { | 257 for (size_t i = 0; i < list.size(); ++i) { |
| 258 StartUpdateCheck(scoped_ptr<ManifestFetchData>(list[i].release())); | 258 StartUpdateCheck(std::unique_ptr<ManifestFetchData>(list[i].release())); |
| 259 } | 259 } |
| 260 } | 260 } |
| 261 fetches_preparing_.clear(); | 261 fetches_preparing_.clear(); |
| 262 } | 262 } |
| 263 | 263 |
| 264 void ExtensionDownloader::StartBlacklistUpdate( | 264 void ExtensionDownloader::StartBlacklistUpdate( |
| 265 const std::string& version, | 265 const std::string& version, |
| 266 const ManifestFetchData::PingData& ping_data, | 266 const ManifestFetchData::PingData& ping_data, |
| 267 int request_id) { | 267 int request_id) { |
| 268 // Note: it is very important that we use the https version of the update | 268 // Note: it is very important that we use the https version of the update |
| 269 // url here to avoid DNS hijacking of the blacklist, which is not validated | 269 // url here to avoid DNS hijacking of the blacklist, which is not validated |
| 270 // by a public key signature like .crx files are. | 270 // by a public key signature like .crx files are. |
| 271 scoped_ptr<ManifestFetchData> blacklist_fetch(CreateManifestFetchData( | 271 std::unique_ptr<ManifestFetchData> blacklist_fetch(CreateManifestFetchData( |
| 272 extension_urls::GetWebstoreUpdateUrl(), request_id)); | 272 extension_urls::GetWebstoreUpdateUrl(), request_id)); |
| 273 DCHECK(blacklist_fetch->base_url().SchemeIsCryptographic()); | 273 DCHECK(blacklist_fetch->base_url().SchemeIsCryptographic()); |
| 274 blacklist_fetch->AddExtension(kBlacklistAppID, version, &ping_data, | 274 blacklist_fetch->AddExtension(kBlacklistAppID, version, &ping_data, |
| 275 std::string(), kDefaultInstallSource); | 275 std::string(), kDefaultInstallSource); |
| 276 StartUpdateCheck(std::move(blacklist_fetch)); | 276 StartUpdateCheck(std::move(blacklist_fetch)); |
| 277 } | 277 } |
| 278 | 278 |
| 279 void ExtensionDownloader::SetWebstoreIdentityProvider( | 279 void ExtensionDownloader::SetWebstoreIdentityProvider( |
| 280 scoped_ptr<IdentityProvider> identity_provider) { | 280 std::unique_ptr<IdentityProvider> identity_provider) { |
| 281 identity_provider_.swap(identity_provider); | 281 identity_provider_.swap(identity_provider); |
| 282 } | 282 } |
| 283 | 283 |
| 284 // static | 284 // static |
| 285 void ExtensionDownloader::set_test_delegate( | 285 void ExtensionDownloader::set_test_delegate( |
| 286 ExtensionDownloaderTestDelegate* delegate) { | 286 ExtensionDownloaderTestDelegate* delegate) { |
| 287 g_test_delegate = delegate; | 287 g_test_delegate = delegate; |
| 288 } | 288 } |
| 289 | 289 |
| 290 bool ExtensionDownloader::AddExtensionData(const std::string& id, | 290 bool ExtensionDownloader::AddExtensionData(const std::string& id, |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 406 url_stats_.pending_count); | 406 url_stats_.pending_count); |
| 407 UMA_HISTOGRAM_COUNTS_100("Extensions.UpdateCheckGoogleUrl", | 407 UMA_HISTOGRAM_COUNTS_100("Extensions.UpdateCheckGoogleUrl", |
| 408 url_stats_.google_url_count); | 408 url_stats_.google_url_count); |
| 409 UMA_HISTOGRAM_COUNTS_100("Extensions.UpdateCheckOtherUrl", | 409 UMA_HISTOGRAM_COUNTS_100("Extensions.UpdateCheckOtherUrl", |
| 410 url_stats_.other_url_count); | 410 url_stats_.other_url_count); |
| 411 UMA_HISTOGRAM_COUNTS_100("Extensions.UpdateCheckNoUrl", | 411 UMA_HISTOGRAM_COUNTS_100("Extensions.UpdateCheckNoUrl", |
| 412 url_stats_.no_url_count); | 412 url_stats_.no_url_count); |
| 413 } | 413 } |
| 414 | 414 |
| 415 void ExtensionDownloader::StartUpdateCheck( | 415 void ExtensionDownloader::StartUpdateCheck( |
| 416 scoped_ptr<ManifestFetchData> fetch_data) { | 416 std::unique_ptr<ManifestFetchData> fetch_data) { |
| 417 if (g_test_delegate) { | 417 if (g_test_delegate) { |
| 418 g_test_delegate->StartUpdateCheck(this, delegate_, std::move(fetch_data)); | 418 g_test_delegate->StartUpdateCheck(this, delegate_, std::move(fetch_data)); |
| 419 return; | 419 return; |
| 420 } | 420 } |
| 421 | 421 |
| 422 const std::set<std::string>& id_set(fetch_data->extension_ids()); | 422 const std::set<std::string>& id_set(fetch_data->extension_ids()); |
| 423 | 423 |
| 424 if (!ExtensionsBrowserClient::Get()->IsBackgroundUpdateAllowed()) { | 424 if (!ExtensionsBrowserClient::Get()->IsBackgroundUpdateAllowed()) { |
| 425 NotifyExtensionsDownloadFailed(id_set, | 425 NotifyExtensionsDownloadFailed(id_set, |
| 426 fetch_data->request_ids(), | 426 fetch_data->request_ids(), |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 576 | 576 |
| 577 // Force https (crbug.com/129587). | 577 // Force https (crbug.com/129587). |
| 578 if (!crx_url.SchemeIsCryptographic()) { | 578 if (!crx_url.SchemeIsCryptographic()) { |
| 579 url::Replacements<char> replacements; | 579 url::Replacements<char> replacements; |
| 580 std::string scheme("https"); | 580 std::string scheme("https"); |
| 581 replacements.SetScheme(scheme.c_str(), | 581 replacements.SetScheme(scheme.c_str(), |
| 582 url::Component(0, scheme.size())); | 582 url::Component(0, scheme.size())); |
| 583 crx_url = crx_url.ReplaceComponents(replacements); | 583 crx_url = crx_url.ReplaceComponents(replacements); |
| 584 } | 584 } |
| 585 } | 585 } |
| 586 scoped_ptr<ExtensionFetch> fetch( | 586 std::unique_ptr<ExtensionFetch> fetch( |
| 587 new ExtensionFetch(update->extension_id, crx_url, update->package_hash, | 587 new ExtensionFetch(update->extension_id, crx_url, update->package_hash, |
| 588 update->version, fetch_data->request_ids())); | 588 update->version, fetch_data->request_ids())); |
| 589 FetchUpdatedExtension(std::move(fetch)); | 589 FetchUpdatedExtension(std::move(fetch)); |
| 590 } | 590 } |
| 591 | 591 |
| 592 // If the manifest response included a <daystart> element, we want to save | 592 // If the manifest response included a <daystart> element, we want to save |
| 593 // that value for any extensions which had sent a ping in the request. | 593 // that value for any extensions which had sent a ping in the request. |
| 594 if (fetch_data->base_url().DomainIs(kGoogleDotCom) && | 594 if (fetch_data->base_url().DomainIs(kGoogleDotCom) && |
| 595 results->daystart_elapsed_seconds >= 0) { | 595 results->daystart_elapsed_seconds >= 0) { |
| 596 Time day_start = | 596 Time day_start = |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 663 << update->browser_min_version; | 663 << update->browser_min_version; |
| 664 continue; | 664 continue; |
| 665 } | 665 } |
| 666 VLOG(2) << "will try to update " << id; | 666 VLOG(2) << "will try to update " << id; |
| 667 result->push_back(i); | 667 result->push_back(i); |
| 668 } | 668 } |
| 669 } | 669 } |
| 670 | 670 |
| 671 // Begins (or queues up) download of an updated extension. | 671 // Begins (or queues up) download of an updated extension. |
| 672 void ExtensionDownloader::FetchUpdatedExtension( | 672 void ExtensionDownloader::FetchUpdatedExtension( |
| 673 scoped_ptr<ExtensionFetch> fetch_data) { | 673 std::unique_ptr<ExtensionFetch> fetch_data) { |
| 674 if (!fetch_data->url.is_valid()) { | 674 if (!fetch_data->url.is_valid()) { |
| 675 // TODO(asargent): This can sometimes be invalid. See crbug.com/130881. | 675 // TODO(asargent): This can sometimes be invalid. See crbug.com/130881. |
| 676 DLOG(WARNING) << "Invalid URL: '" << fetch_data->url.possibly_invalid_spec() | 676 DLOG(WARNING) << "Invalid URL: '" << fetch_data->url.possibly_invalid_spec() |
| 677 << "' for extension " << fetch_data->id; | 677 << "' for extension " << fetch_data->id; |
| 678 return; | 678 return; |
| 679 } | 679 } |
| 680 | 680 |
| 681 for (RequestQueue<ExtensionFetch>::iterator iter = extensions_queue_.begin(); | 681 for (RequestQueue<ExtensionFetch>::iterator iter = extensions_queue_.begin(); |
| 682 iter != extensions_queue_.end(); | 682 iter != extensions_queue_.end(); |
| 683 ++iter) { | 683 ++iter) { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 704 &crx_path, &version); | 704 &crx_path, &version); |
| 705 NotifyDelegateDownloadFinished(std::move(fetch_data), true, crx_path, | 705 NotifyDelegateDownloadFinished(std::move(fetch_data), true, crx_path, |
| 706 false); | 706 false); |
| 707 } else { | 707 } else { |
| 708 extensions_queue_.ScheduleRequest(std::move(fetch_data)); | 708 extensions_queue_.ScheduleRequest(std::move(fetch_data)); |
| 709 } | 709 } |
| 710 } | 710 } |
| 711 } | 711 } |
| 712 | 712 |
| 713 void ExtensionDownloader::NotifyDelegateDownloadFinished( | 713 void ExtensionDownloader::NotifyDelegateDownloadFinished( |
| 714 scoped_ptr<ExtensionFetch> fetch_data, | 714 std::unique_ptr<ExtensionFetch> fetch_data, |
| 715 bool from_cache, | 715 bool from_cache, |
| 716 const base::FilePath& crx_path, | 716 const base::FilePath& crx_path, |
| 717 bool file_ownership_passed) { | 717 bool file_ownership_passed) { |
| 718 // Dereference required params before passing a scoped_ptr. | 718 // Dereference required params before passing a scoped_ptr. |
| 719 const std::string& id = fetch_data->id; | 719 const std::string& id = fetch_data->id; |
| 720 const std::string& package_hash = fetch_data->package_hash; | 720 const std::string& package_hash = fetch_data->package_hash; |
| 721 const GURL& url = fetch_data->url; | 721 const GURL& url = fetch_data->url; |
| 722 const std::string& version = fetch_data->version; | 722 const std::string& version = fetch_data->version; |
| 723 const std::set<int>& request_ids = fetch_data->request_ids; | 723 const std::set<int>& request_ids = fetch_data->request_ids; |
| 724 delegate_->OnExtensionDownloadFinished( | 724 delegate_->OnExtensionDownloadFinished( |
| 725 CRXFileInfo(id, crx_path, package_hash), file_ownership_passed, url, | 725 CRXFileInfo(id, crx_path, package_hash), file_ownership_passed, url, |
| 726 version, ping_results_[id], request_ids, | 726 version, ping_results_[id], request_ids, |
| 727 from_cache ? base::Bind(&ExtensionDownloader::CacheInstallDone, | 727 from_cache ? base::Bind(&ExtensionDownloader::CacheInstallDone, |
| 728 weak_ptr_factory_.GetWeakPtr(), | 728 weak_ptr_factory_.GetWeakPtr(), |
| 729 base::Passed(&fetch_data)) | 729 base::Passed(&fetch_data)) |
| 730 : ExtensionDownloaderDelegate::InstallCallback()); | 730 : ExtensionDownloaderDelegate::InstallCallback()); |
| 731 if (!from_cache) | 731 if (!from_cache) |
| 732 ping_results_.erase(id); | 732 ping_results_.erase(id); |
| 733 } | 733 } |
| 734 | 734 |
| 735 void ExtensionDownloader::CacheInstallDone( | 735 void ExtensionDownloader::CacheInstallDone( |
| 736 scoped_ptr<ExtensionFetch> fetch_data, | 736 std::unique_ptr<ExtensionFetch> fetch_data, |
| 737 bool should_download) { | 737 bool should_download) { |
| 738 ping_results_.erase(fetch_data->id); | 738 ping_results_.erase(fetch_data->id); |
| 739 if (should_download) { | 739 if (should_download) { |
| 740 // Resume download from cached manifest data. | 740 // Resume download from cached manifest data. |
| 741 extensions_queue_.ScheduleRequest(std::move(fetch_data)); | 741 extensions_queue_.ScheduleRequest(std::move(fetch_data)); |
| 742 } | 742 } |
| 743 } | 743 } |
| 744 | 744 |
| 745 void ExtensionDownloader::CreateExtensionFetcher() { | 745 void ExtensionDownloader::CreateExtensionFetcher() { |
| 746 const ExtensionFetch* fetch = extensions_queue_.active_request(); | 746 const ExtensionFetch* fetch = extensions_queue_.active_request(); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 796 ExtensionFetch& active_request = *extensions_queue_.active_request(); | 796 ExtensionFetch& active_request = *extensions_queue_.active_request(); |
| 797 const std::string& id = active_request.id; | 797 const std::string& id = active_request.id; |
| 798 if (status.status() == net::URLRequestStatus::SUCCESS && | 798 if (status.status() == net::URLRequestStatus::SUCCESS && |
| 799 (response_code == 200 || url.SchemeIsFile())) { | 799 (response_code == 200 || url.SchemeIsFile())) { |
| 800 RETRY_HISTOGRAM("CrxFetchSuccess", | 800 RETRY_HISTOGRAM("CrxFetchSuccess", |
| 801 extensions_queue_.active_request_failure_count(), | 801 extensions_queue_.active_request_failure_count(), |
| 802 url); | 802 url); |
| 803 base::FilePath crx_path; | 803 base::FilePath crx_path; |
| 804 // Take ownership of the file at |crx_path|. | 804 // Take ownership of the file at |crx_path|. |
| 805 CHECK(source->GetResponseAsFilePath(true, &crx_path)); | 805 CHECK(source->GetResponseAsFilePath(true, &crx_path)); |
| 806 scoped_ptr<ExtensionFetch> fetch_data = | 806 std::unique_ptr<ExtensionFetch> fetch_data = |
| 807 extensions_queue_.reset_active_request(); | 807 extensions_queue_.reset_active_request(); |
| 808 if (extension_cache_) { | 808 if (extension_cache_) { |
| 809 const std::string& version = fetch_data->version; | 809 const std::string& version = fetch_data->version; |
| 810 const std::string& expected_hash = fetch_data->package_hash; | 810 const std::string& expected_hash = fetch_data->package_hash; |
| 811 extension_cache_->PutExtension( | 811 extension_cache_->PutExtension( |
| 812 id, expected_hash, crx_path, version, | 812 id, expected_hash, crx_path, version, |
| 813 base::Bind(&ExtensionDownloader::NotifyDelegateDownloadFinished, | 813 base::Bind(&ExtensionDownloader::NotifyDelegateDownloadFinished, |
| 814 weak_ptr_factory_.GetWeakPtr(), base::Passed(&fetch_data), | 814 weak_ptr_factory_.GetWeakPtr(), base::Passed(&fetch_data), |
| 815 false)); | 815 false)); |
| 816 } else { | 816 } else { |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 952 const GURL& update_url, | 952 const GURL& update_url, |
| 953 int request_id) { | 953 int request_id) { |
| 954 ManifestFetchData::PingMode ping_mode = ManifestFetchData::NO_PING; | 954 ManifestFetchData::PingMode ping_mode = ManifestFetchData::NO_PING; |
| 955 if (update_url.DomainIs(ping_enabled_domain_.c_str())) | 955 if (update_url.DomainIs(ping_enabled_domain_.c_str())) |
| 956 ping_mode = ManifestFetchData::PING_WITH_ENABLED_STATE; | 956 ping_mode = ManifestFetchData::PING_WITH_ENABLED_STATE; |
| 957 return new ManifestFetchData( | 957 return new ManifestFetchData( |
| 958 update_url, request_id, brand_code_, manifest_query_params_, ping_mode); | 958 update_url, request_id, brand_code_, manifest_query_params_, ping_mode); |
| 959 } | 959 } |
| 960 | 960 |
| 961 } // namespace extensions | 961 } // namespace extensions |
| OLD | NEW |