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; |