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..7722c827a19be5e5549a0689cf4f582bad10914a 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, |
| @@ -154,6 +155,9 @@ class CrxUpdateService : public ComponentUpdateService, public OnDemandUpdater { |
| void ProcessPendingItems(); |
| + // Uninstall and remove all unregistered work items. |
| + void UninstallUnregisteredItems(); |
| + |
| // Find a component that is ready to update. |
| CrxUpdateItem* FindReadyComponent() const; |
| @@ -432,6 +436,7 @@ ComponentUpdateService::Status CrxUpdateService::RegisterComponent( |
| CrxUpdateItem* uit = FindUpdateItemById(id); |
| if (uit) { |
| uit->component = component; |
| + uit->unregistered = false; |
| return kReplaced; |
| } |
| @@ -461,6 +466,19 @@ ComponentUpdateService::Status CrxUpdateService::RegisterComponent( |
| return kOk; |
| } |
| +ComponentUpdateService::Status CrxUpdateService::UnregisterComponent( |
| + const std::string& crx_id) { |
| + auto it = std::find_if(work_items_.begin(), work_items_.end(), |
| + CrxUpdateItem::FindById(crx_id)); |
| + if (it == work_items_.end()) |
| + return kError; |
| + |
| + (*it)->unregistered = true; |
| + |
| + ScheduleNextRun(kStepDelayShort); |
| + return kOk; |
| +} |
| + |
| std::vector<std::string> CrxUpdateService::GetComponentIDs() const { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| std::vector<std::string> component_ids; |
| @@ -518,6 +536,8 @@ ComponentUpdateService::Status CrxUpdateService::OnDemandUpdate( |
| void CrxUpdateService::ProcessPendingItems() { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| + UninstallUnregisteredItems(); |
|
Sorin Jianu
2015/02/06 23:00:30
Need to move this call at line 546, I will explain
|
| + |
| CrxUpdateItem* ready_upgrade = FindReadyComponent(); |
| if (ready_upgrade) { |
| UpdateComponent(ready_upgrade); |
| @@ -528,6 +548,20 @@ void CrxUpdateService::ProcessPendingItems() { |
| ScheduleNextRun(kStepDelayLong); |
| } |
| +void CrxUpdateService::UninstallUnregisteredItems() { |
| + std::vector<CrxUpdateItem*> new_work_items; |
| + for (CrxUpdateItem* item : work_items_) { |
| + scoped_ptr<CrxUpdateItem> owned_item(item); |
| + if (owned_item->unregistered) { |
| + const bool success = owned_item->component.installer->Uninstall(); |
| + DCHECK(success); |
| + } else { |
| + new_work_items.push_back(owned_item.release()); |
| + } |
| + } |
| + new_work_items.swap(work_items_); |
| +} |
| + |
| CrxUpdateItem* CrxUpdateService::FindReadyComponent() const { |
| class Helper { |
| public: |
| @@ -781,6 +815,7 @@ void CrxUpdateService::DownloadComplete( |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| CrxUpdateItem* crx = FindUpdateItemById(crx_context->id); |
| + |
| DCHECK(crx->status == CrxUpdateItem::kDownloadingDiff || |
| crx->status == CrxUpdateItem::kDownloading); |
| @@ -895,6 +930,7 @@ void CrxUpdateService::DoneInstalling(const std::string& component_id, |
| const bool is_success = error == ComponentUnpacker::kNone; |
| CrxUpdateItem* item = FindUpdateItemById(component_id); |
| + |
| if (item->status == CrxUpdateItem::kUpdatingDiff && !is_success) { |
| item->diff_error_category = error_category; |
| item->diff_error_code = error; |