| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "components/update_client/action_update.h" | 5 #include "components/update_client/action_update.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
| (...skipping 17 matching lines...) Expand all Loading... |
| 28 namespace update_client { | 28 namespace update_client { |
| 29 | 29 |
| 30 namespace { | 30 namespace { |
| 31 | 31 |
| 32 void AppendDownloadMetrics( | 32 void AppendDownloadMetrics( |
| 33 const std::vector<CrxDownloader::DownloadMetrics>& source, | 33 const std::vector<CrxDownloader::DownloadMetrics>& source, |
| 34 std::vector<CrxDownloader::DownloadMetrics>* destination) { | 34 std::vector<CrxDownloader::DownloadMetrics>* destination) { |
| 35 destination->insert(destination->end(), source.begin(), source.end()); | 35 destination->insert(destination->end(), source.begin(), source.end()); |
| 36 } | 36 } |
| 37 | 37 |
| 38 ErrorCategory UnpackerErrorToErrorCategory(UnpackerError error) { |
| 39 ErrorCategory error_category = ErrorCategory::kErrorNone; |
| 40 switch (error) { |
| 41 case UnpackerError::kNone: |
| 42 break; |
| 43 case UnpackerError::kInstallerError: |
| 44 error_category = ErrorCategory::kInstallError; |
| 45 break; |
| 46 default: |
| 47 error_category = ErrorCategory::kUnpackError; |
| 48 break; |
| 49 } |
| 50 return error_category; |
| 51 } |
| 52 |
| 38 } // namespace | 53 } // namespace |
| 39 | 54 |
| 40 ActionUpdate::ActionUpdate() { | 55 ActionUpdate::ActionUpdate() { |
| 41 } | 56 } |
| 42 | 57 |
| 43 ActionUpdate::~ActionUpdate() { | 58 ActionUpdate::~ActionUpdate() { |
| 44 DCHECK(thread_checker_.CalledOnValidThread()); | 59 DCHECK(thread_checker_.CalledOnValidThread()); |
| 45 } | 60 } |
| 46 | 61 |
| 47 void ActionUpdate::Run(UpdateContext* update_context, Callback callback) { | 62 void ActionUpdate::Run(UpdateContext* update_context, Callback callback) { |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 147 | 162 |
| 148 if (result.error == UnpackerError::kNone) { | 163 if (result.error == UnpackerError::kNone) { |
| 149 update_context_->blocking_task_runner->PostTask( | 164 update_context_->blocking_task_runner->PostTask( |
| 150 FROM_HERE, | 165 FROM_HERE, |
| 151 base::Bind(&ActionUpdate::StartInstallOnBlockingTaskRunner, | 166 base::Bind(&ActionUpdate::StartInstallOnBlockingTaskRunner, |
| 152 base::Unretained(this), item, crx_path, result.unpack_path)); | 167 base::Unretained(this), item, crx_path, result.unpack_path)); |
| 153 } else { | 168 } else { |
| 154 update_context_->blocking_task_runner->PostTask( | 169 update_context_->blocking_task_runner->PostTask( |
| 155 FROM_HERE, | 170 FROM_HERE, |
| 156 base::Bind(&ActionUpdate::InstallCompleteOnBlockingTaskRunner, | 171 base::Bind(&ActionUpdate::InstallCompleteOnBlockingTaskRunner, |
| 157 base::Unretained(this), item, crx_path, | 172 base::Unretained(this), item, crx_path, result.error, |
| 158 ErrorCategory::kUnpackError, static_cast<int>(result.error), | |
| 159 result.extended_error)); | 173 result.extended_error)); |
| 160 } | 174 } |
| 161 } | 175 } |
| 162 | 176 |
| 163 void ActionUpdate::StartInstallOnBlockingTaskRunner( | 177 void ActionUpdate::StartInstallOnBlockingTaskRunner( |
| 164 CrxUpdateItem* item, | 178 CrxUpdateItem* item, |
| 165 const base::FilePath& crx_path, | 179 const base::FilePath& crx_path, |
| 166 const base::FilePath& unpack_path) { | 180 const base::FilePath& unpack_path) { |
| 167 DCHECK(update_context_->blocking_task_runner->RunsTasksOnCurrentThread()); | 181 DCHECK(update_context_->blocking_task_runner->RunsTasksOnCurrentThread()); |
| 168 DCHECK(!unpack_path.empty()); | 182 DCHECK(!unpack_path.empty()); |
| 169 | 183 |
| 170 const auto result = DoInstall(item, crx_path, unpack_path); | 184 const auto error = DoInstall(item, crx_path, unpack_path); |
| 171 const ErrorCategory error_category = | |
| 172 result.error ? ErrorCategory::kInstallError : ErrorCategory::kErrorNone; | |
| 173 update_context_->blocking_task_runner->PostTask( | 185 update_context_->blocking_task_runner->PostTask( |
| 174 FROM_HERE, | 186 FROM_HERE, base::Bind(&ActionUpdate::InstallCompleteOnBlockingTaskRunner, |
| 175 base::Bind(&ActionUpdate::InstallCompleteOnBlockingTaskRunner, | 187 base::Unretained(this), item, crx_path, error, 0)); |
| 176 base::Unretained(this), item, crx_path, error_category, | |
| 177 result.error, result.extended_error)); | |
| 178 } | 188 } |
| 179 | 189 |
| 180 void ActionUpdate::InstallCompleteOnBlockingTaskRunner( | 190 void ActionUpdate::InstallCompleteOnBlockingTaskRunner( |
| 181 CrxUpdateItem* item, | 191 CrxUpdateItem* item, |
| 182 const base::FilePath& crx_path, | 192 const base::FilePath& crx_path, |
| 183 ErrorCategory error_category, | 193 UnpackerError error, |
| 184 int error, | |
| 185 int extended_error) { | 194 int extended_error) { |
| 186 update_client::DeleteFileAndEmptyParentDirectory(crx_path); | 195 update_client::DeleteFileAndEmptyParentDirectory(crx_path); |
| 187 update_context_->main_task_runner->PostDelayedTask( | 196 update_context_->main_task_runner->PostDelayedTask( |
| 188 FROM_HERE, | 197 FROM_HERE, |
| 189 base::Bind(&ActionUpdate::InstallComplete, base::Unretained(this), | 198 base::Bind(&ActionUpdate::InstallComplete, base::Unretained(this), |
| 190 item->id, error_category, error, extended_error), | 199 item->id, error, extended_error), |
| 191 base::TimeDelta::FromMilliseconds(update_context_->config->StepDelay())); | 200 base::TimeDelta::FromMilliseconds(update_context_->config->StepDelay())); |
| 192 } | 201 } |
| 193 | 202 |
| 194 CrxInstaller::Result ActionUpdate::DoInstall( | 203 UnpackerError ActionUpdate::DoInstall(CrxUpdateItem* item, |
| 195 CrxUpdateItem* item, | 204 const base::FilePath& crx_path, |
| 196 const base::FilePath& crx_path, | 205 const base::FilePath& unpack_path) { |
| 197 const base::FilePath& unpack_path) { | |
| 198 const auto& fingerprint = item->next_fp; | 206 const auto& fingerprint = item->next_fp; |
| 199 if (static_cast<int>(fingerprint.size()) != | 207 if (static_cast<int>(fingerprint.size()) != |
| 200 base::WriteFile( | 208 base::WriteFile( |
| 201 unpack_path.Append(FILE_PATH_LITERAL("manifest.fingerprint")), | 209 unpack_path.Append(FILE_PATH_LITERAL("manifest.fingerprint")), |
| 202 fingerprint.c_str(), base::checked_cast<int>(fingerprint.size()))) { | 210 fingerprint.c_str(), base::checked_cast<int>(fingerprint.size()))) { |
| 203 return CrxInstaller::Result(InstallError::FINGERPRINT_WRITE_FAILED); | 211 return UnpackerError::kFingerprintWriteFailed; |
| 204 } | 212 } |
| 205 | 213 |
| 206 std::unique_ptr<base::DictionaryValue> manifest = ReadManifest(unpack_path); | 214 std::unique_ptr<base::DictionaryValue> manifest = ReadManifest(unpack_path); |
| 207 if (!manifest.get()) | 215 if (!manifest.get()) |
| 208 return CrxInstaller::Result(InstallError::BAD_MANIFEST); | 216 return UnpackerError::kBadManifest; |
| 209 | 217 |
| 210 return item->component.installer->Install(*manifest, unpack_path); | 218 return item->component.installer->Install(*manifest, unpack_path) |
| 219 ? UnpackerError::kNone |
| 220 : UnpackerError::kInstallerError; |
| 211 } | 221 } |
| 212 | 222 |
| 213 void ActionUpdate::InstallComplete(const std::string& id, | 223 void ActionUpdate::InstallComplete(const std::string& id, |
| 214 ErrorCategory error_category, | 224 UnpackerError error, |
| 215 int error, | |
| 216 int extended_error) { | 225 int extended_error) { |
| 217 DCHECK(thread_checker_.CalledOnValidThread()); | 226 DCHECK(thread_checker_.CalledOnValidThread()); |
| 218 DCHECK(id == update_context_->queue.front()); | 227 DCHECK(id == update_context_->queue.front()); |
| 219 | 228 |
| 220 CrxUpdateItem* item = FindUpdateItemById(id); | 229 CrxUpdateItem* item = FindUpdateItemById(id); |
| 221 DCHECK(item); | 230 DCHECK(item); |
| 222 | 231 |
| 223 if (error == 0) { | 232 if (error == UnpackerError::kNone) |
| 224 DCHECK_EQ(ErrorCategory::kErrorNone, error_category); | |
| 225 DCHECK_EQ(0, extended_error); | |
| 226 OnInstallSuccess(item); | 233 OnInstallSuccess(item); |
| 227 } else { | 234 else |
| 228 OnInstallError(item, error_category, error, extended_error); | 235 OnInstallError(item, error, extended_error); |
| 229 } | |
| 230 } | 236 } |
| 231 | 237 |
| 232 ActionUpdateDiff::ActionUpdateDiff() { | 238 ActionUpdateDiff::ActionUpdateDiff() { |
| 233 } | 239 } |
| 234 | 240 |
| 235 ActionUpdateDiff::~ActionUpdateDiff() { | 241 ActionUpdateDiff::~ActionUpdateDiff() { |
| 236 DCHECK(thread_checker_.CalledOnValidThread()); | 242 DCHECK(thread_checker_.CalledOnValidThread()); |
| 237 } | 243 } |
| 238 | 244 |
| 239 std::unique_ptr<Action> ActionUpdateDiff::Create() { | 245 std::unique_ptr<Action> ActionUpdateDiff::Create() { |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 308 DCHECK(item->state == CrxUpdateItem::State::kUpdatingDiff); | 314 DCHECK(item->state == CrxUpdateItem::State::kUpdatingDiff); |
| 309 | 315 |
| 310 item->component.version = item->next_version; | 316 item->component.version = item->next_version; |
| 311 item->component.fingerprint = item->next_fp; | 317 item->component.fingerprint = item->next_fp; |
| 312 ChangeItemState(item, CrxUpdateItem::State::kUpdated); | 318 ChangeItemState(item, CrxUpdateItem::State::kUpdated); |
| 313 | 319 |
| 314 UpdateCrxComplete(item); | 320 UpdateCrxComplete(item); |
| 315 } | 321 } |
| 316 | 322 |
| 317 void ActionUpdateDiff::OnInstallError(CrxUpdateItem* item, | 323 void ActionUpdateDiff::OnInstallError(CrxUpdateItem* item, |
| 318 ErrorCategory error_category, | 324 UnpackerError error, |
| 319 int error, | |
| 320 int extended_error) { | 325 int extended_error) { |
| 321 DCHECK(thread_checker_.CalledOnValidThread()); | 326 DCHECK(thread_checker_.CalledOnValidThread()); |
| 322 | 327 |
| 323 item->diff_error_category = static_cast<int>(error_category); | 328 item->diff_error_category = |
| 324 item->diff_error_code = error; | 329 static_cast<int>(UnpackerErrorToErrorCategory(error)); |
| 330 item->diff_error_code = static_cast<int>(error); |
| 325 item->diff_extra_code1 = extended_error; | 331 item->diff_extra_code1 = extended_error; |
| 326 item->diff_update_failed = true; | 332 item->diff_update_failed = true; |
| 327 | 333 |
| 328 base::ThreadTaskRunnerHandle::Get()->PostTask( | 334 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 329 FROM_HERE, | 335 FROM_HERE, |
| 330 base::Bind(&ActionUpdateDiff::TryUpdateFull, base::Unretained(this))); | 336 base::Bind(&ActionUpdateDiff::TryUpdateFull, base::Unretained(this))); |
| 331 } | 337 } |
| 332 | 338 |
| 333 ActionUpdateFull::ActionUpdateFull() { | 339 ActionUpdateFull::ActionUpdateFull() { |
| 334 } | 340 } |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 401 DCHECK(item->state == CrxUpdateItem::State::kUpdating); | 407 DCHECK(item->state == CrxUpdateItem::State::kUpdating); |
| 402 | 408 |
| 403 item->component.version = item->next_version; | 409 item->component.version = item->next_version; |
| 404 item->component.fingerprint = item->next_fp; | 410 item->component.fingerprint = item->next_fp; |
| 405 ChangeItemState(item, CrxUpdateItem::State::kUpdated); | 411 ChangeItemState(item, CrxUpdateItem::State::kUpdated); |
| 406 | 412 |
| 407 UpdateCrxComplete(item); | 413 UpdateCrxComplete(item); |
| 408 } | 414 } |
| 409 | 415 |
| 410 void ActionUpdateFull::OnInstallError(CrxUpdateItem* item, | 416 void ActionUpdateFull::OnInstallError(CrxUpdateItem* item, |
| 411 ErrorCategory error_category, | 417 UnpackerError error, |
| 412 int error, | |
| 413 int extended_error) { | 418 int extended_error) { |
| 414 DCHECK(thread_checker_.CalledOnValidThread()); | 419 DCHECK(thread_checker_.CalledOnValidThread()); |
| 415 DCHECK(item->state == CrxUpdateItem::State::kUpdating); | 420 DCHECK(item->state == CrxUpdateItem::State::kUpdating); |
| 416 | 421 |
| 417 item->error_category = static_cast<int>(error_category); | 422 item->error_category = static_cast<int>(UnpackerErrorToErrorCategory(error)); |
| 418 item->error_code = error; | 423 item->error_code = static_cast<int>(error); |
| 419 item->extra_code1 = extended_error; | 424 item->extra_code1 = extended_error; |
| 420 ChangeItemState(item, CrxUpdateItem::State::kNoUpdate); | 425 ChangeItemState(item, CrxUpdateItem::State::kNoUpdate); |
| 421 | 426 |
| 422 UpdateCrxComplete(item); | 427 UpdateCrxComplete(item); |
| 423 } | 428 } |
| 424 | 429 |
| 425 } // namespace update_client | 430 } // namespace update_client |
| OLD | NEW |