| Index: chrome/browser/win/jumplist.cc | 
| diff --git a/chrome/browser/win/jumplist.cc b/chrome/browser/win/jumplist.cc | 
| index 14b6f870ca397a92d57d6b15c899bc5272e6ceb2..3c114eeab9aa26465d4946a0390a3ba229b22062 100644 | 
| --- a/chrome/browser/win/jumplist.cc | 
| +++ b/chrome/browser/win/jumplist.cc | 
| @@ -6,6 +6,7 @@ | 
|  | 
| #include "base/bind.h" | 
| #include "base/bind_helpers.h" | 
| +#include "base/callback_helpers.h" | 
| #include "base/command_line.h" | 
| #include "base/files/file_util.h" | 
| #include "base/macros.h" | 
| @@ -265,27 +266,39 @@ void RunUpdateOnFileThread( | 
| // This variable records the status of three folder operations. | 
| uint32_t folder_operation_status = FolderOperationResult::SUCCESS; | 
|  | 
| +  base::ScopedClosureRunner log_operation_status_when_done(base::Bind( | 
| +      [](uint32_t* folder_operation_status_ptr) { | 
| +        UMA_HISTOGRAM_ENUMERATION("WinJumplist.DetailedFolderResults", | 
| +                                  *folder_operation_status_ptr, | 
| +                                  FolderOperationResult::END); | 
| +      }, | 
| +      base::Unretained(&folder_operation_status))); | 
| + | 
| +  // If deletion of |icon_dir_old| fails, do not move |icon_dir| to | 
| +  // |icon_dir_old|, instead, delete |icon_dir| directly to avoid bloating | 
| +  // |icon_dir_old| by moving more things to it. | 
| if (!base::DeleteFile(icon_dir_old, true)) { | 
| folder_operation_status |= FolderOperationResult::DELETE_DEST_FAILED; | 
| -    // If deletion of |icon_dir_old| fails, do not move |icon_dir| to | 
| -    // |icon_dir_old|, instead, delete |icon_dir| directly to avoid bloating | 
| -    // |icon_dir_old| by moving more things to it. | 
| -    if (!base::DeleteFile(icon_dir, true)) | 
| +    // If deletion of |icon_dir| fails, exit early. This skips creating the same | 
| +    // directory and updating jumplist icons to avoid bloating the JumplistIcons | 
| +    // folder. | 
| +    if (!base::DeleteFile(icon_dir, true)) { | 
| folder_operation_status |= FolderOperationResult::DELETE_SRC_FAILED; | 
| +      return; | 
| +    } | 
| } else if (!base::Move(icon_dir, icon_dir_old)) { | 
| folder_operation_status |= FolderOperationResult::MOVE_FAILED; | 
| // If Move() fails, delete |icon_dir| to avoid file accumulation in this | 
| // directory, which can eventually lead the folder to be huge. | 
| -    if (!base::DeleteFile(icon_dir, true)) | 
| +    if (!base::DeleteFile(icon_dir, true)) { | 
| folder_operation_status |= FolderOperationResult::DELETE_SRC_FAILED; | 
| +      return; | 
| +    } | 
| } | 
| + | 
| if (!base::CreateDirectory(icon_dir)) | 
| folder_operation_status |= FolderOperationResult::CREATE_SRC_FAILED; | 
|  | 
| -  UMA_HISTOGRAM_ENUMERATION("WinJumplist.DetailedFolderResults", | 
| -                            folder_operation_status, | 
| -                            FolderOperationResult::END); | 
| - | 
| // Create temporary icon files for shortcuts in the "Most Visited" category. | 
| CreateIconFiles(icon_dir, local_most_visited_pages); | 
|  | 
| @@ -296,10 +309,8 @@ void RunUpdateOnFileThread( | 
| // We finished collecting all resources needed for updating an application | 
| // JumpList. So, create a new JumpList and replace the current JumpList | 
| // with it. | 
| -  UpdateJumpList(app_id.c_str(), | 
| -                 local_most_visited_pages, | 
| -                 local_recently_closed_pages, | 
| -                 incognito_availability); | 
| +  UpdateJumpList(app_id.c_str(), local_most_visited_pages, | 
| +                 local_recently_closed_pages, incognito_availability); | 
| } | 
|  | 
| }  // namespace | 
|  |