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