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..4bfc2d7edaea0092b856f221be16f3d58cd6c64a 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; |
| @@ -492,7 +510,7 @@ void CrxUpdateService::MaybeThrottle(const std::string& crx_id, |
| scoped_refptr<base::SequencedTaskRunner> |
| CrxUpdateService::GetSequencedTaskRunner() { |
| - return config_->GetSequencedTaskRunner(); |
| + return blocking_task_runner_; |
|
Bernhard Bauer
2015/02/08 23:20:40
I had to make this change because of failing tests
|
| } |
| bool CrxUpdateService::GetComponentDetails(const std::string& component_id, |
| @@ -524,10 +542,26 @@ void CrxUpdateService::ProcessPendingItems() { |
| return; |
| } |
| + UninstallUnregisteredItems(); |
| + |
| if (!CheckForUpdates()) |
| 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; |