Chromium Code Reviews| Index: components/component_updater/component_updater_service.cc |
| diff --git a/components/component_updater/component_updater_service.cc b/components/component_updater/component_updater_service.cc |
| index 89195c482f203701105671039219ff05c33fe8ee..bcd324a4ca87468775359fe1555efc38585de23a 100644 |
| --- a/components/component_updater/component_updater_service.cc |
| +++ b/components/component_updater/component_updater_service.cc |
| @@ -100,6 +100,7 @@ class CrxUpdateService : public ComponentUpdateService, public OnDemandUpdater { |
| Status Start() override; |
| Status Stop() override; |
| Status RegisterComponent(const CrxComponent& component) override; |
| + Status UnregisterComponent(const std::string& crx_id) override; |
| std::vector<std::string> GetComponentIDs() const override; |
| OnDemandUpdater& GetOnDemandUpdater() override; |
| void MaybeThrottle(const std::string& crx_id, |
| @@ -461,6 +462,27 @@ ComponentUpdateService::Status CrxUpdateService::RegisterComponent( |
| return kOk; |
| } |
| +ComponentUpdateService::Status CrxUpdateService::UnregisterComponent( |
| + const std::string& crx_id) { |
| + UpdateItems::iterator it = std::find_if( |
| + work_items_.begin(), work_items_.end(), CrxUpdateItem::FindById(crx_id)); |
| + if (it == work_items_.end()) |
| + return kError; |
| + |
| + CrxUpdateItem* item = *it; |
| + CrxUpdateItem::Status status = item->status; |
| + if (status == CrxUpdateItem::kDownloading || |
| + status == CrxUpdateItem::kDownloadingDiff || |
| + status == CrxUpdateItem::kUpdating || |
| + status == CrxUpdateItem::kUpdatingDiff) { |
| + ChangeItemState(item, CrxUpdateItem::kNoUpdate); |
| + ping_manager_->OnUpdateComplete(item); |
| + } |
| + |
| + work_items_.erase(it); |
|
Sorin Jianu
2015/02/05 22:55:35
We wonder if we could do this in a different way.
Bernhard Bauer
2015/02/05 23:57:35
Okay, that makes sense. I'll try to work on that t
|
| + return kOk; |
| +} |
| + |
| std::vector<std::string> CrxUpdateService::GetComponentIDs() const { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| std::vector<std::string> component_ids; |
| @@ -781,6 +803,23 @@ void CrxUpdateService::DownloadComplete( |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| CrxUpdateItem* crx = FindUpdateItemById(crx_context->id); |
| + |
| + // If the item has been removed in the mean time, clean up and return. |
|
Sorin Jianu
2015/02/05 22:55:35
The code to clean up an item can be hooked up in t
Bernhard Bauer
2015/02/06 16:05:05
Done.
|
| + if (!crx) { |
| + crx_downloader_.reset(); |
| + base::FilePath crx_path = download_result.response; |
| + if (!crx_path.empty()) { |
| + blocking_task_runner_->PostTask( |
| + FROM_HERE, |
| + base::Bind(base::IgnoreResult( |
| + &update_client::DeleteFileAndEmptyParentDirectory), |
| + crx_path)); |
| + } |
| + // Move on to the next update, if there is one available. |
| + ScheduleNextRun(kStepDelayMedium); |
| + return; |
| + } |
| + |
| DCHECK(crx->status == CrxUpdateItem::kDownloadingDiff || |
| crx->status == CrxUpdateItem::kDownloading); |
| @@ -895,6 +934,13 @@ void CrxUpdateService::DoneInstalling(const std::string& component_id, |
| const bool is_success = error == ComponentUnpacker::kNone; |
| CrxUpdateItem* item = FindUpdateItemById(component_id); |
| + |
| + // If the item has been removed in the mean time, return. |
|
Sorin Jianu
2015/02/05 22:55:35
Same. The suggest is to centralize the unregistrat
Bernhard Bauer
2015/02/06 16:05:05
Done.
|
| + if (!item) { |
| + ScheduleNextRun(kStepDelayMedium); |
| + return; |
| + } |
| + |
| if (item->status == CrxUpdateItem::kUpdatingDiff && !is_success) { |
| item->diff_error_category = error_category; |
| item->diff_error_code = error; |