| 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/component_updater/component_updater_service.h" | 5 #include "chrome/browser/component_updater/component_updater_service.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <set> | 8 #include <set> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 255 enum StepDelayInterval { | 255 enum StepDelayInterval { |
| 256 kStepDelayShort = 0, | 256 kStepDelayShort = 0, |
| 257 kStepDelayMedium, | 257 kStepDelayMedium, |
| 258 kStepDelayLong, | 258 kStepDelayLong, |
| 259 }; | 259 }; |
| 260 | 260 |
| 261 void OnParseUpdateResponseSucceeded( | 261 void OnParseUpdateResponseSucceeded( |
| 262 const component_updater::UpdateResponse::Results& results); | 262 const component_updater::UpdateResponse::Results& results); |
| 263 void OnParseUpdateResponseFailed(const std::string& error_message); | 263 void OnParseUpdateResponseFailed(const std::string& error_message); |
| 264 | 264 |
| 265 void DownloadComplete(scoped_ptr<CRXContext> crx_context, | 265 void DownloadComplete( |
| 266 int error, | 266 scoped_ptr<CRXContext> crx_context, |
| 267 const base::FilePath& response); | 267 const component_updater::CrxDownloader::Result& download_result); |
| 268 | 268 |
| 269 Status OnDemandUpdateInternal(CrxUpdateItem* item); | 269 Status OnDemandUpdateInternal(CrxUpdateItem* item); |
| 270 | 270 |
| 271 void ProcessPendingItems(); | 271 void ProcessPendingItems(); |
| 272 | 272 |
| 273 CrxUpdateItem* FindReadyComponent(); | 273 CrxUpdateItem* FindReadyComponent(); |
| 274 | 274 |
| 275 void UpdateComponent(CrxUpdateItem* workitem); | 275 void UpdateComponent(CrxUpdateItem* workitem); |
| 276 | 276 |
| 277 void AddItemToUpdateCheck(CrxUpdateItem* item, | 277 void AddItemToUpdateCheck(CrxUpdateItem* item, |
| (...skipping 387 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 665 crx_context->installer = workitem->component.installer; | 665 crx_context->installer = workitem->component.installer; |
| 666 crx_context->fingerprint = workitem->next_fp; | 666 crx_context->fingerprint = workitem->next_fp; |
| 667 GURL package_url; | 667 GURL package_url; |
| 668 if (CanTryDiffUpdate(workitem, *config_)) { | 668 if (CanTryDiffUpdate(workitem, *config_)) { |
| 669 package_url = workitem->diff_crx_url; | 669 package_url = workitem->diff_crx_url; |
| 670 ChangeItemState(workitem, CrxUpdateItem::kDownloadingDiff); | 670 ChangeItemState(workitem, CrxUpdateItem::kDownloadingDiff); |
| 671 } else { | 671 } else { |
| 672 package_url = workitem->crx_url; | 672 package_url = workitem->crx_url; |
| 673 ChangeItemState(workitem, CrxUpdateItem::kDownloading); | 673 ChangeItemState(workitem, CrxUpdateItem::kDownloading); |
| 674 } | 674 } |
| 675 |
| 676 // On demand component updates are always downloaded in foreground. |
| 677 const bool is_background_download = !workitem->on_demand && |
| 678 config_->UseBackgroundDownloader(); |
| 679 |
| 675 crx_downloader_.reset(component_updater::CrxDownloader::Create( | 680 crx_downloader_.reset(component_updater::CrxDownloader::Create( |
| 681 is_background_download, |
| 676 config_->RequestContext(), | 682 config_->RequestContext(), |
| 677 blocking_task_runner_, | 683 blocking_task_runner_, |
| 678 base::Bind(&CrxUpdateService::DownloadComplete, | 684 base::Bind(&CrxUpdateService::DownloadComplete, |
| 679 base::Unretained(this), | 685 base::Unretained(this), |
| 680 base::Passed(&crx_context)))); | 686 base::Passed(&crx_context)))); |
| 681 crx_downloader_->StartDownloadFromUrl(package_url); | 687 crx_downloader_->StartDownloadFromUrl(package_url); |
| 682 } | 688 } |
| 683 | 689 |
| 684 // Sets the state of the component to be checked for updates. After the | 690 // Sets the state of the component to be checked for updates. After the |
| 685 // function is called, the <app> element corresponding to the |item| parameter | 691 // function is called, the <app> element corresponding to the |item| parameter |
| (...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 899 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 905 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 900 size_t count = ChangeItemStatus(CrxUpdateItem::kChecking, | 906 size_t count = ChangeItemStatus(CrxUpdateItem::kChecking, |
| 901 CrxUpdateItem::kNoUpdate); | 907 CrxUpdateItem::kNoUpdate); |
| 902 DCHECK_GT(count, 0ul); | 908 DCHECK_GT(count, 0ul); |
| 903 ScheduleNextRun(kStepDelayLong); | 909 ScheduleNextRun(kStepDelayLong); |
| 904 } | 910 } |
| 905 | 911 |
| 906 // Called when the CRX package has been downloaded to a temporary location. | 912 // Called when the CRX package has been downloaded to a temporary location. |
| 907 // Here we fire the notifications and schedule the component-specific installer | 913 // Here we fire the notifications and schedule the component-specific installer |
| 908 // to be called in the file thread. | 914 // to be called in the file thread. |
| 909 void CrxUpdateService::DownloadComplete(scoped_ptr<CRXContext> crx_context, | 915 void CrxUpdateService::DownloadComplete( |
| 910 int error, | 916 scoped_ptr<CRXContext> crx_context, |
| 911 const base::FilePath& temp_crx_path) { | 917 const component_updater::CrxDownloader::Result& download_result) { |
| 912 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 918 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 913 | 919 |
| 914 CrxUpdateItem* crx = FindUpdateItemById(crx_context->id); | 920 CrxUpdateItem* crx = FindUpdateItemById(crx_context->id); |
| 915 DCHECK(crx->status == CrxUpdateItem::kDownloadingDiff || | 921 DCHECK(crx->status == CrxUpdateItem::kDownloadingDiff || |
| 916 crx->status == CrxUpdateItem::kDownloading); | 922 crx->status == CrxUpdateItem::kDownloading); |
| 917 | 923 |
| 918 if (error) { | 924 if (download_result.error) { |
| 919 if (crx->status == CrxUpdateItem::kDownloadingDiff) { | 925 if (crx->status == CrxUpdateItem::kDownloadingDiff) { |
| 920 crx->diff_error_category = kNetworkError; | 926 crx->diff_error_category = kNetworkError; |
| 921 crx->diff_error_code = error; | 927 crx->diff_error_code = download_result.error; |
| 922 crx->diff_update_failed = true; | 928 crx->diff_update_failed = true; |
| 923 size_t count = ChangeItemStatus(CrxUpdateItem::kDownloadingDiff, | 929 size_t count = ChangeItemStatus(CrxUpdateItem::kDownloadingDiff, |
| 924 CrxUpdateItem::kCanUpdate); | 930 CrxUpdateItem::kCanUpdate); |
| 925 DCHECK_EQ(count, 1ul); | 931 DCHECK_EQ(count, 1ul); |
| 926 crx_downloader_.reset(); | 932 crx_downloader_.reset(); |
| 927 | 933 |
| 928 ScheduleNextRun(kStepDelayShort); | 934 ScheduleNextRun(kStepDelayShort); |
| 929 return; | 935 return; |
| 930 } | 936 } |
| 931 crx->error_category = kNetworkError; | 937 crx->error_category = kNetworkError; |
| 932 crx->error_code = error; | 938 crx->error_code = download_result.error; |
| 933 size_t count = ChangeItemStatus(CrxUpdateItem::kDownloading, | 939 size_t count = ChangeItemStatus(CrxUpdateItem::kDownloading, |
| 934 CrxUpdateItem::kNoUpdate); | 940 CrxUpdateItem::kNoUpdate); |
| 935 DCHECK_EQ(count, 1ul); | 941 DCHECK_EQ(count, 1ul); |
| 936 crx_downloader_.reset(); | 942 crx_downloader_.reset(); |
| 937 | 943 |
| 938 // At this point, since both the differential and the full downloads failed, | 944 // At this point, since both the differential and the full downloads failed, |
| 939 // the update for this component has finished with an error. | 945 // the update for this component has finished with an error. |
| 940 ping_manager_->OnUpdateComplete(crx); | 946 ping_manager_->OnUpdateComplete(crx); |
| 941 | 947 |
| 942 // Move on to the next update, if there is one available. | 948 // Move on to the next update, if there is one available. |
| (...skipping 10 matching lines...) Expand all Loading... |
| 953 DCHECK_EQ(count, 1ul); | 959 DCHECK_EQ(count, 1ul); |
| 954 | 960 |
| 955 crx_downloader_.reset(); | 961 crx_downloader_.reset(); |
| 956 | 962 |
| 957 // Why unretained? See comment at top of file. | 963 // Why unretained? See comment at top of file. |
| 958 blocking_task_runner_->PostDelayedTask( | 964 blocking_task_runner_->PostDelayedTask( |
| 959 FROM_HERE, | 965 FROM_HERE, |
| 960 base::Bind(&CrxUpdateService::Install, | 966 base::Bind(&CrxUpdateService::Install, |
| 961 base::Unretained(this), | 967 base::Unretained(this), |
| 962 base::Passed(&crx_context), | 968 base::Passed(&crx_context), |
| 963 temp_crx_path), | 969 download_result.response), |
| 964 base::TimeDelta::FromMilliseconds(config_->StepDelay())); | 970 base::TimeDelta::FromMilliseconds(config_->StepDelay())); |
| 965 } | 971 } |
| 966 } | 972 } |
| 967 | 973 |
| 968 // Install consists of digital signature verification, unpacking and then | 974 // Install consists of digital signature verification, unpacking and then |
| 969 // calling the component specific installer. All that is handled by the | 975 // calling the component specific installer. All that is handled by the |
| 970 // |unpacker|. If there is an error this function is in charge of deleting | 976 // |unpacker|. If there is an error this function is in charge of deleting |
| 971 // the files created. | 977 // the files created. |
| 972 void CrxUpdateService::Install(scoped_ptr<CRXContext> context, | 978 void CrxUpdateService::Install(scoped_ptr<CRXContext> context, |
| 973 const base::FilePath& crx_path) { | 979 const base::FilePath& crx_path) { |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1111 } | 1117 } |
| 1112 | 1118 |
| 1113 // The component update factory. Using the component updater as a singleton | 1119 // The component update factory. Using the component updater as a singleton |
| 1114 // is the job of the browser process. | 1120 // is the job of the browser process. |
| 1115 ComponentUpdateService* ComponentUpdateServiceFactory( | 1121 ComponentUpdateService* ComponentUpdateServiceFactory( |
| 1116 ComponentUpdateService::Configurator* config) { | 1122 ComponentUpdateService::Configurator* config) { |
| 1117 DCHECK(config); | 1123 DCHECK(config); |
| 1118 return new CrxUpdateService(config); | 1124 return new CrxUpdateService(config); |
| 1119 } | 1125 } |
| 1120 | 1126 |
| OLD | NEW |