| 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 395 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 406 void AddUpdateCheckItems(std::string* query); | 406 void AddUpdateCheckItems(std::string* query); |
| 407 | 407 |
| 408 void DoUpdateCheck(const std::string& query); | 408 void DoUpdateCheck(const std::string& query); |
| 409 | 409 |
| 410 void ScheduleNextRun(StepDelayInterval step_delay); | 410 void ScheduleNextRun(StepDelayInterval step_delay); |
| 411 | 411 |
| 412 void ParseManifest(const std::string& xml); | 412 void ParseManifest(const std::string& xml); |
| 413 | 413 |
| 414 void Install(const CRXContext* context, const base::FilePath& crx_path); | 414 void Install(const CRXContext* context, const base::FilePath& crx_path); |
| 415 | 415 |
| 416 void DoneUnpacking(const std::string& component_id, |
| 417 const base::FilePath& crx_path, |
| 418 component_updater::Error error, |
| 419 int extended_error); |
| 420 |
| 416 void DoneInstalling(const std::string& component_id, | 421 void DoneInstalling(const std::string& component_id, |
| 417 ComponentUnpacker::Error error, | 422 component_updater::Error error, |
| 418 int extended_error); | 423 int extended_error); |
| 419 | 424 |
| 420 void ChangeItemState(CrxUpdateItem* item, CrxUpdateItem::Status to); | 425 void ChangeItemState(CrxUpdateItem* item, CrxUpdateItem::Status to); |
| 421 | 426 |
| 422 size_t ChangeItemStatus(CrxUpdateItem::Status from, | 427 size_t ChangeItemStatus(CrxUpdateItem::Status from, |
| 423 CrxUpdateItem::Status to); | 428 CrxUpdateItem::Status to); |
| 424 | 429 |
| 425 CrxUpdateItem* FindUpdateItemById(const std::string& id); | 430 CrxUpdateItem* FindUpdateItemById(const std::string& id); |
| 426 | 431 |
| 427 void NotifyComponentObservers(ComponentObserver::Events event, | 432 void NotifyComponentObservers(ComponentObserver::Events event, |
| 428 int extra) const; | 433 int extra) const; |
| 429 | 434 |
| 430 bool HasOnDemandItems() const; | 435 bool HasOnDemandItems() const; |
| 431 | 436 |
| 432 void OnNewResourceThrottle(base::WeakPtr<CUResourceThrottle> rt, | 437 void OnNewResourceThrottle(base::WeakPtr<CUResourceThrottle> rt, |
| 433 const std::string& crx_id); | 438 const std::string& crx_id); |
| 434 | 439 |
| 435 scoped_ptr<ComponentUpdateService::Configurator> config_; | 440 scoped_ptr<ComponentUpdateService::Configurator> config_; |
| 436 | 441 |
| 437 scoped_ptr<ComponentPatcher> component_patcher_; | 442 scoped_ptr<ComponentPatcher> component_patcher_; |
| 438 | 443 |
| 439 scoped_ptr<net::URLFetcher> url_fetcher_; | 444 scoped_ptr<net::URLFetcher> url_fetcher_; |
| 440 | 445 |
| 441 scoped_ptr<component_updater::PingManager> ping_manager_; | 446 scoped_ptr<component_updater::PingManager> ping_manager_; |
| 442 | 447 |
| 448 scoped_ptr<component_updater::ComponentUnpacker> unpacker_; |
| 449 |
| 443 // A collection of every work item. | 450 // A collection of every work item. |
| 444 typedef std::vector<CrxUpdateItem*> UpdateItems; | 451 typedef std::vector<CrxUpdateItem*> UpdateItems; |
| 445 UpdateItems work_items_; | 452 UpdateItems work_items_; |
| 446 | 453 |
| 447 base::OneShotTimer<CrxUpdateService> timer_; | 454 base::OneShotTimer<CrxUpdateService> timer_; |
| 448 | 455 |
| 449 scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_; | 456 scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_; |
| 450 | 457 |
| 451 const Version chrome_version_; | 458 const Version chrome_version_; |
| 452 | 459 |
| (...skipping 601 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1054 base::Bind(&CrxUpdateService::Install, | 1061 base::Bind(&CrxUpdateService::Install, |
| 1055 base::Unretained(this), | 1062 base::Unretained(this), |
| 1056 crx_context.release(), | 1063 crx_context.release(), |
| 1057 temp_crx_path), | 1064 temp_crx_path), |
| 1058 base::TimeDelta::FromMilliseconds(config_->StepDelay())); | 1065 base::TimeDelta::FromMilliseconds(config_->StepDelay())); |
| 1059 } | 1066 } |
| 1060 } | 1067 } |
| 1061 | 1068 |
| 1062 // Install consists of digital signature verification, unpacking and then | 1069 // Install consists of digital signature verification, unpacking and then |
| 1063 // calling the component specific installer. All that is handled by the | 1070 // calling the component specific installer. All that is handled by the |
| 1064 // |unpacker|. If there is an error this function is in charge of deleting | 1071 // |unpacker_|. If there is an error this function is in charge of deleting |
| 1065 // the files created. | 1072 // the files created. |
| 1066 void CrxUpdateService::Install(const CRXContext* context, | 1073 void CrxUpdateService::Install(const CRXContext* context, |
| 1067 const base::FilePath& crx_path) { | 1074 const base::FilePath& crx_path) { |
| 1068 // This function owns the file at |crx_path| and the |context| object. | 1075 // This function owns the file at |crx_path| and the |context| object. |
| 1069 ComponentUnpacker unpacker(context->pk_hash, | 1076 unpacker_.reset(new component_updater::ComponentUnpacker( |
| 1070 crx_path, | 1077 context->pk_hash, |
| 1071 context->fingerprint, | 1078 crx_path, |
| 1072 component_patcher_.get(), | 1079 context->fingerprint, |
| 1073 context->installer); | 1080 component_patcher_.get(), |
| 1081 context->installer, |
| 1082 blocking_task_runner_)); |
| 1083 unpacker_->Unpack(base::Bind(&CrxUpdateService::DoneUnpacking, |
| 1084 base::Unretained(this), |
| 1085 context->id, |
| 1086 crx_path)); |
| 1087 delete context; |
| 1088 } |
| 1089 |
| 1090 // Do some cleanup before we skip back to the UI thread. |
| 1091 void CrxUpdateService::DoneUnpacking(const std::string& component_id, |
| 1092 const base::FilePath& crx_path, |
| 1093 component_updater::Error error, |
| 1094 int extended_error) { |
| 1074 if (!base::DeleteFile(crx_path, false)) | 1095 if (!base::DeleteFile(crx_path, false)) |
| 1075 NOTREACHED() << crx_path.value(); | 1096 NOTREACHED() << crx_path.value(); |
| 1076 // Why unretained? See comment at top of file. | |
| 1077 BrowserThread::PostDelayedTask( | 1097 BrowserThread::PostDelayedTask( |
| 1078 BrowserThread::UI, | 1098 BrowserThread::UI, |
| 1079 FROM_HERE, | 1099 FROM_HERE, |
| 1080 base::Bind(&CrxUpdateService::DoneInstalling, base::Unretained(this), | 1100 base::Bind(&CrxUpdateService::DoneInstalling, base::Unretained(this), |
| 1081 context->id, unpacker.error(), unpacker.extended_error()), | 1101 component_id, error, extended_error), |
| 1082 base::TimeDelta::FromMilliseconds(config_->StepDelay())); | 1102 base::TimeDelta::FromMilliseconds(config_->StepDelay())); |
| 1083 delete context; | |
| 1084 } | 1103 } |
| 1085 | 1104 |
| 1086 // Installation has been completed. Adjust the component status and | 1105 // Installation has been completed. Adjust the component status and |
| 1087 // schedule the next check. Schedule a short delay before trying the full | 1106 // schedule the next check. Schedule a short delay before trying the full |
| 1088 // update when the differential update failed. | 1107 // update when the differential update failed. |
| 1089 void CrxUpdateService::DoneInstalling(const std::string& component_id, | 1108 void CrxUpdateService::DoneInstalling(const std::string& component_id, |
| 1090 ComponentUnpacker::Error error, | 1109 component_updater::Error error, |
| 1091 int extra_code) { | 1110 int extra_code) { |
| 1092 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1111 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 1093 | 1112 |
| 1094 ErrorCategory error_category = kErrorNone; | 1113 ErrorCategory error_category = kErrorNone; |
| 1095 switch (error) { | 1114 switch (error) { |
| 1096 case ComponentUnpacker::kNone: | 1115 case component_updater::kNone: |
| 1097 break; | 1116 break; |
| 1098 case ComponentUnpacker::kInstallerError: | 1117 case component_updater::kInstallerError: |
| 1099 error_category = kInstallError; | 1118 error_category = kInstallError; |
| 1100 break; | 1119 break; |
| 1101 default: | 1120 default: |
| 1102 error_category = kUnpackError; | 1121 error_category = kUnpackError; |
| 1103 break; | 1122 break; |
| 1104 } | 1123 } |
| 1105 | 1124 |
| 1106 const bool is_success = error == ComponentUnpacker::kNone; | 1125 const bool is_success = error == component_updater::kNone; |
| 1107 | 1126 |
| 1108 CrxUpdateItem* item = FindUpdateItemById(component_id); | 1127 CrxUpdateItem* item = FindUpdateItemById(component_id); |
| 1109 if (item->status == CrxUpdateItem::kUpdatingDiff && !is_success) { | 1128 if (item->status == CrxUpdateItem::kUpdatingDiff && !is_success) { |
| 1110 item->diff_error_category = error_category; | 1129 item->diff_error_category = error_category; |
| 1111 item->diff_error_code = error; | 1130 item->diff_error_code = error; |
| 1112 item->diff_extra_code1 = extra_code; | 1131 item->diff_extra_code1 = extra_code; |
| 1113 item->diff_update_failed = true; | 1132 item->diff_update_failed = true; |
| 1114 size_t count = ChangeItemStatus(CrxUpdateItem::kUpdatingDiff, | 1133 size_t count = ChangeItemStatus(CrxUpdateItem::kUpdatingDiff, |
| 1115 CrxUpdateItem::kCanUpdate); | 1134 CrxUpdateItem::kCanUpdate); |
| 1116 DCHECK_EQ(count, 1ul); | 1135 DCHECK_EQ(count, 1ul); |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1205 state_ = UNBLOCKED; | 1224 state_ = UNBLOCKED; |
| 1206 } | 1225 } |
| 1207 | 1226 |
| 1208 // The component update factory. Using the component updater as a singleton | 1227 // The component update factory. Using the component updater as a singleton |
| 1209 // is the job of the browser process. | 1228 // is the job of the browser process. |
| 1210 ComponentUpdateService* ComponentUpdateServiceFactory( | 1229 ComponentUpdateService* ComponentUpdateServiceFactory( |
| 1211 ComponentUpdateService::Configurator* config) { | 1230 ComponentUpdateService::Configurator* config) { |
| 1212 DCHECK(config); | 1231 DCHECK(config); |
| 1213 return new CrxUpdateService(config); | 1232 return new CrxUpdateService(config); |
| 1214 } | 1233 } |
| OLD | NEW |