Index: chrome/browser/win/jumplist.cc |
diff --git a/chrome/browser/win/jumplist.cc b/chrome/browser/win/jumplist.cc |
index 9054e20864d8e2a1c324c721d904440b9fabaf9f..ae1ee8d2ec5d6a563bf3aa133f3acbe0ef865c2a 100644 |
--- a/chrome/browser/win/jumplist.cc |
+++ b/chrome/browser/win/jumplist.cc |
@@ -8,6 +8,7 @@ |
#include "base/bind.h" |
#include "base/bind_helpers.h" |
#include "base/command_line.h" |
+#include "base/containers/flat_set.h" |
#include "base/files/file_util.h" |
#include "base/metrics/histogram_macros.h" |
#include "base/path_service.h" |
@@ -300,6 +301,7 @@ void JumpList::OnMostVisitedURLsAvailable( |
link->GetCommandLine()->AppendSwitchASCII( |
switches::kWinJumplistAction, jumplist::kMostVisitedCategory); |
link->set_title(!url.title.empty() ? url.title : url_string_wide); |
+ link->set_url(url_string); |
data->most_visited_pages_.push_back(link); |
data->icon_urls_.push_back(std::make_pair(url_string, link)); |
} |
@@ -352,6 +354,7 @@ bool JumpList::AddTab(const sessions::TabRestoreService::Tab& tab, |
link->GetCommandLine()->AppendSwitchASCII(switches::kWinJumplistAction, |
jumplist::kRecentlyClosedCategory); |
link->set_title(current_navigation.title()); |
+ link->set_url(url); |
data->recently_closed_pages_.push_back(link); |
data->icon_urls_.push_back(std::make_pair(std::move(url), std::move(link))); |
@@ -589,28 +592,96 @@ void JumpList::DeferredTabRestoreServiceChanged() { |
StartLoadingFavicon(); |
} |
+void JumpList::DeleteIconFiles(const base::FilePath& icon_dir, |
+ JumpListCategory category) { |
+ base::flat_map<std::string, base::FilePath>* source_map = nullptr; |
+ switch (category) { |
+ case JumpListCategory::kMostVisited: |
+ source_map = &most_visited_icons_; |
+ break; |
+ case JumpListCategory::kRecentlyClosed: |
+ source_map = &recently_closed_icons_; |
+ break; |
+ } |
+ |
+ // Put all cached icon file paths into a set. |
+ base::flat_set<base::FilePath> cached_files; |
+ cached_files.reserve(source_map->size()); |
+ |
+ for (const auto& url_path_pair : *source_map) |
+ cached_files.insert(url_path_pair.second); |
+ |
+ DeleteNonCachedFiles(icon_dir, cached_files); |
+} |
+ |
void JumpList::CreateIconFiles(const base::FilePath& icon_dir, |
const ShellLinkItemList& item_list, |
- size_t max_items) { |
+ size_t max_items, |
+ JumpListCategory category) { |
// TODO(chengx): Remove the UMA histogram after fixing http://crbug.com/40407. |
SCOPED_UMA_HISTOGRAM_TIMER("WinJumplist.CreateIconFilesDuration"); |
- for (ShellLinkItemList::const_iterator item = item_list.begin(); |
- item != item_list.end() && max_items > 0; ++item, --max_items) { |
- base::FilePath icon_path; |
- if (CreateIconFile((*item)->icon_image(), icon_dir, &icon_path)) |
- (*item)->set_icon(icon_path.value(), 0); |
+ // Reuse icons for urls that were already present in the jumplist for this |
+ // category. |
+ |
+ base::flat_map<std::string, base::FilePath>* source_map = nullptr; |
+ switch (category) { |
+ case JumpListCategory::kMostVisited: |
+ source_map = &most_visited_icons_; |
+ break; |
+ case JumpListCategory::kRecentlyClosed: |
+ source_map = &recently_closed_icons_; |
+ break; |
} |
+ |
+ base::flat_map<std::string, base::FilePath> updated_map; |
+ |
+ for (ShellLinkItemList::const_iterator iter = item_list.begin(); |
+ iter != item_list.end() && max_items > 0; ++iter, --max_items) { |
+ ShellLinkItem* item = iter->get(); |
+ auto cache_iter = source_map->find(item->url()); |
+ if (cache_iter != source_map->end()) { |
+ item->set_icon(cache_iter->second.value(), 0); |
+ updated_map[item->url()] = cache_iter->second; |
+ } else { |
+ base::FilePath icon_path; |
+ if (CreateIconFile(item->icon_image(), icon_dir, &icon_path)) { |
+ item->set_icon(icon_path.value(), 0); |
+ updated_map[item->url()] = icon_path; |
+ } |
+ } |
+ } |
+ source_map->swap(updated_map); |
} |
void JumpList::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); |
+ size_t slot_limit, |
+ JumpListCategory category) { |
+ // Maximum number of icon files that each JumpList icon folder may hold. |
+ size_t icon_limit = (category == JumpListCategory::kMostVisited) ? 10 : 6; |
+ |
+ // Clear the JumpList icon folder at |icon_dir| and the cache when |
+ // 1) "Most visited" category updates for the 1st time after Chrome is |
+ // launched. This actually happens right after Chrome is launched. |
+ // 2) "Recently closed" category updates for the 1st time after Chrome is |
+ // launched. |
+ // 3) The number of icons in |icon_dir| has exceeded the limit. |
+ if ((category == JumpListCategory::kMostVisited && |
+ most_visited_icons_.empty()) || |
+ (category == JumpListCategory::kRecentlyClosed && |
+ recently_closed_icons_.empty()) || |
+ FilesExceedLimitInDir(icon_dir, icon_limit)) { |
+ DeleteDirectoryContentAndLogRuntime(icon_dir, kFileDeleteLimit); |
+ most_visited_icons_.clear(); |
+ recently_closed_icons_.clear(); |
+ // 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, category); |
+ } else if (base::CreateDirectory(icon_dir)) { |
+ CreateIconFiles(icon_dir, page_list, slot_limit, category); |
+ DeleteIconFiles(icon_dir, category); |
+ } |
} |
bool JumpList::UpdateJumpList( |
@@ -680,7 +751,7 @@ bool JumpList::UpdateJumpList( |
profile_dir, FILE_PATH_LITERAL("MostVisited")); |
UpdateIconFiles(icon_dir_most_visited, most_visited_pages, |
- most_visited_items); |
+ most_visited_items, JumpListCategory::kMostVisited); |
icons_to_create += std::min(most_visited_pages.size(), most_visited_items); |
} |
@@ -691,7 +762,7 @@ bool JumpList::UpdateJumpList( |
profile_dir, FILE_PATH_LITERAL("RecentClosed")); |
UpdateIconFiles(icon_dir_recent_closed, recently_closed_pages, |
- recently_closed_items); |
+ recently_closed_items, JumpListCategory::kRecentlyClosed); |
icons_to_create += |
std::min(recently_closed_pages.size(), recently_closed_items); |