| Index: chrome/browser/win/jumplist.cc
|
| diff --git a/chrome/browser/win/jumplist.cc b/chrome/browser/win/jumplist.cc
|
| index 15e75a3ae0651448380ef6e17b1bb77cfbb2f799..74abc8c6c0affafb89b3d9280a6c4d94278756f1 100644
|
| --- a/chrome/browser/win/jumplist.cc
|
| +++ b/chrome/browser/win/jumplist.cc
|
| @@ -64,11 +64,12 @@ using JumpListData = JumpList::JumpListData;
|
|
|
| namespace {
|
|
|
| -// Delay jumplist updates to allow collapsing of redundant update requests.
|
| +// The delay before updating the JumpList to prevent update storms.
|
| constexpr base::TimeDelta kDelayForJumplistUpdate =
|
| base::TimeDelta::FromMilliseconds(3500);
|
|
|
| -// Timeout jumplist updates for users with extremely slow OS.
|
| +// The maximum allowed time for JumpListUpdater::BeginUpdate. Updates taking
|
| +// longer than this are discarded to prevent bogging down slow machines.
|
| constexpr base::TimeDelta kTimeOutForJumplistUpdate =
|
| base::TimeDelta::FromMilliseconds(500);
|
|
|
| @@ -126,8 +127,7 @@ bool CreateIconFile(const gfx::ImageSkia& image_skia,
|
| return true;
|
| }
|
|
|
| -// Helper method for RunUpdate to create icon files for the asynchrounously
|
| -// loaded icons.
|
| +// Creates icon files for the asynchrounously loaded icons.
|
| void CreateIconFiles(const base::FilePath& icon_dir,
|
| const ShellLinkItemList& item_list,
|
| size_t max_items) {
|
| @@ -142,6 +142,18 @@ void CreateIconFiles(const base::FilePath& icon_dir,
|
| }
|
| }
|
|
|
| +// Updates icon files in |icon_dir|, which includes deleting old icons and
|
| +// creating at most |slot_limit| new icons for |page_list|.
|
| +void UpdateIconFiles(const base::FilePath& icon_dir,
|
| + const ShellLinkItemList& page_list,
|
| + size_t slot_limit) {
|
| + DeleteDirectoryContentAndLogRuntime(icon_dir, kFileDeleteLimit);
|
| +
|
| + // Create new icons only when the directory exists and is empty.
|
| + if (base::CreateDirectory(icon_dir) && base::IsDirectoryEmpty(icon_dir))
|
| + CreateIconFiles(icon_dir, page_list, slot_limit);
|
| +}
|
| +
|
| // Updates the "Tasks" category of the JumpList.
|
| bool UpdateTaskCategory(
|
| JumpListUpdater* jumplist_updater,
|
| @@ -200,15 +212,16 @@ bool UpdateJumpList(const wchar_t* app_id,
|
| if (!JumpListUpdater::IsEnabled())
|
| return true;
|
|
|
| - // Records the time cost of starting a JumpListUpdater.
|
| + JumpListUpdater jumplist_updater(app_id);
|
| +
|
| base::ElapsedTimer begin_update_timer;
|
|
|
| - JumpListUpdater jumplist_updater(app_id);
|
| if (!jumplist_updater.BeginUpdate())
|
| return false;
|
|
|
| - // Stops jumplist update if JumpListUpdater's start times out, as it's very
|
| - // likely the following update steps will also take a long time.
|
| + // Discard this JumpList update if JumpListUpdater::BeginUpdate takes longer
|
| + // than the maximum allowed time, as it's very likely the following update
|
| + // steps will also take a long time.
|
| if (begin_update_timer.Elapsed() >= kTimeOutForJumplistUpdate)
|
| return false;
|
|
|
| @@ -246,49 +259,27 @@ bool UpdateJumpList(const wchar_t* app_id,
|
| // Record the desired number of icons to create in this JumpList update.
|
| int icons_to_create = 0;
|
|
|
| + // Update the icons for "Most Visisted" category of the JumpList if needed.
|
| if (most_visited_pages_have_updates) {
|
| - // Delete the content in JumpListIconsMostVisited folder and log the results
|
| - // to UMA.
|
| base::FilePath icon_dir_most_visited = icon_dir.DirName().Append(
|
| icon_dir.BaseName().value() + FILE_PATH_LITERAL("MostVisited"));
|
|
|
| - DeleteDirectoryContentAndLogResults(icon_dir_most_visited,
|
| - kFileDeleteLimit);
|
| -
|
| - // If the directory doesn't exist (we have tried to create it in
|
| - // DeleteDirectoryContentAndLogResults) or is not empty, skip updating the
|
| - // jumplist icons. The jumplist links should be updated anyway, as it
|
| - // doesn't involve disk IO. In this case, Chrome's icon will be used for the
|
| - // new links.
|
| - if (base::DirectoryExists(icon_dir_most_visited) &&
|
| - base::IsDirectoryEmpty(icon_dir_most_visited)) {
|
| - // Create icon files for shortcuts in the "Most Visited" category.
|
| - CreateIconFiles(icon_dir_most_visited, most_visited_pages,
|
| - most_visited_items);
|
| -
|
| - icons_to_create +=
|
| - std::min(most_visited_pages.size(), most_visited_items);
|
| - }
|
| + UpdateIconFiles(icon_dir_most_visited, most_visited_pages,
|
| + most_visited_items);
|
| +
|
| + icons_to_create += std::min(most_visited_pages.size(), most_visited_items);
|
| }
|
|
|
| + // Update the icons for "Recently Closed" category of the JumpList if needed.
|
| if (recently_closed_pages_have_updates) {
|
| - // Delete the content in JumpListIconsRecentClosed folder and log the
|
| - // results to UMA.
|
| base::FilePath icon_dir_recent_closed = icon_dir.DirName().Append(
|
| icon_dir.BaseName().value() + FILE_PATH_LITERAL("RecentClosed"));
|
|
|
| - DeleteDirectoryContentAndLogResults(icon_dir_recent_closed,
|
| - kFileDeleteLimit);
|
| -
|
| - if (base::DirectoryExists(icon_dir_recent_closed) &&
|
| - base::IsDirectoryEmpty(icon_dir_recent_closed)) {
|
| - // Create icon files for shortcuts in the "Recently Closed" category.
|
| - CreateIconFiles(icon_dir_recent_closed, recently_closed_pages,
|
| - recently_closed_items);
|
| + UpdateIconFiles(icon_dir_recent_closed, recently_closed_pages,
|
| + recently_closed_items);
|
|
|
| - icons_to_create +=
|
| - std::min(recently_closed_pages.size(), recently_closed_items);
|
| - }
|
| + icons_to_create +=
|
| + std::min(recently_closed_pages.size(), recently_closed_items);
|
| }
|
|
|
| // TODO(chengx): Remove the UMA histogram after fixing http://crbug.com/40407.
|
| @@ -355,7 +346,7 @@ void RunUpdateJumpList(IncognitoModePrefs::Availability incognito_availability,
|
| if (!most_visited_pages_have_updates && !recently_closed_pages_have_updates)
|
| return;
|
|
|
| - // Updates the application JumpList. If it fails, reset the flags to true if
|
| + // Update the application JumpList. If it fails, reset the flags to true if
|
| // they were so that the corresponding JumpList categories will be tried to
|
| // update again in the next run.
|
| if (!UpdateJumpList(
|
| @@ -701,16 +692,15 @@ void JumpList::DeferredRunUpdate() {
|
| // Now we have JumpListIconsMostVisited folder and JumpListIconsRecentClosed
|
| // folder instead.
|
| delete_jumplisticons_task_runner_->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&DeleteDirectoryAndLogResults, icon_dir_, kFileDeleteLimit));
|
| + FROM_HERE, base::Bind(&DeleteDirectory, icon_dir_, kFileDeleteLimit));
|
|
|
| // Post a task to delete JumpListIconsOld folder as it's no longer needed.
|
| base::FilePath icon_dir_old = icon_dir_.DirName().Append(
|
| icon_dir_.BaseName().value() + FILE_PATH_LITERAL("Old"));
|
|
|
| delete_jumplisticons_task_runner_->PostTask(
|
| - FROM_HERE, base::Bind(&DeleteDirectoryAndLogResults,
|
| - std::move(icon_dir_old), kFileDeleteLimit));
|
| + FROM_HERE,
|
| + base::Bind(&DeleteDirectory, std::move(icon_dir_old), kFileDeleteLimit));
|
| }
|
|
|
| void JumpList::TopSitesLoaded(history::TopSites* top_sites) {
|
|
|