Index: chrome/browser/win/jumplist.cc |
diff --git a/chrome/browser/win/jumplist.cc b/chrome/browser/win/jumplist.cc |
index ae1ee8d2ec5d6a563bf3aa133f3acbe0ef865c2a..914b6c930f72a92d2752ebd385c973fed83afd10 100644 |
--- a/chrome/browser/win/jumplist.cc |
+++ b/chrome/browser/win/jumplist.cc |
@@ -56,6 +56,14 @@ using JumpListData = JumpList::JumpListData; |
namespace { |
+// The default maximum number of items to display in JumpList is 10. |
+// https://msdn.microsoft.com/library/windows/desktop/dd378398.aspx |
+// The "Most visited" and "Recently closed" category titles always take 2 slots. |
+// For the remaining 8 slots, we allocate 5 slots to "most-visited" items and 3 |
+// slots to"recently-closed" items, respectively. |
+constexpr size_t kMostVisitedItems = 5; |
+constexpr size_t kRecentlyClosedItems = 3; |
+ |
// The number of updates to skip to alleviate the machine when a previous update |
// was too slow. |
constexpr int kUpdatesToSkipUnderHeavyLoad = 10; |
@@ -222,12 +230,9 @@ JumpList::JumpList(Profile* profile) |
scoped_refptr<history::TopSites> top_sites = |
TopSitesFactory::GetForProfile(profile_); |
if (top_sites) { |
- // TopSites updates itself after a delay. This is especially noticable when |
- // your profile is empty. Ask TopSites to update itself when jumplist is |
- // initialized. |
- top_sites->SyncWithHistory(); |
// Register as TopSitesObserver so that we can update ourselves when the |
- // TopSites changes. |
+ // TopSites changes. TopSites updates itself after a delay. This is |
+ // especially noticable when your profile is empty. |
top_sites->AddObserver(this); |
} |
tab_restore_service->AddObserver(this); |
@@ -284,15 +289,12 @@ void JumpList::OnMostVisitedURLsAvailable( |
const history::MostVisitedURLList& urls) { |
DCHECK(CalledOnValidThread()); |
- // At most 9 JumpList items can be displayed for the "Most Visited" |
- // category. |
- const int kMostVistedCount = 9; |
{ |
JumpListData* data = &jumplist_data_->data; |
base::AutoLock auto_lock(data->list_lock_); |
data->most_visited_pages_.clear(); |
- for (size_t i = 0; i < urls.size() && i < kMostVistedCount; i++) { |
+ for (size_t i = 0; i < urls.size() && i < kMostVisitedItems; i++) { |
const history::MostVisitedURL& url = urls[i]; |
scoped_refptr<ShellLinkItem> link = CreateShellLink(); |
std::string url_string = url.url.spec(); |
@@ -530,11 +532,19 @@ void JumpList::TopSitesChanged(history::TopSites* top_sites, |
} |
void JumpList::DeferredTopSitesChanged() { |
+ DCHECK(CalledOnValidThread()); |
+ |
if (updates_to_skip_ > 0) { |
--updates_to_skip_; |
return; |
} |
+ // Opening the first tab in one session triggers a TopSite history sync. |
+ // Delay this sync till the first tab is closed to allow the "recently closed" |
+ // category from last session to stay longer. |
+ if (!has_tab_closed_) |
+ return; |
+ |
scoped_refptr<history::TopSites> top_sites = |
TopSitesFactory::GetForProfile(profile_); |
if (top_sites) { |
@@ -546,11 +556,22 @@ void JumpList::DeferredTopSitesChanged() { |
} |
void JumpList::DeferredTabRestoreServiceChanged() { |
+ DCHECK(CalledOnValidThread()); |
+ |
if (updates_to_skip_ > 0) { |
--updates_to_skip_; |
return; |
} |
+ // Force a TopSite history sync when closing a first tab in one session. |
+ if (!has_tab_closed_) { |
+ has_tab_closed_ = true; |
+ scoped_refptr<history::TopSites> top_sites = |
+ TopSitesFactory::GetForProfile(profile_); |
+ if (top_sites) |
+ top_sites->SyncWithHistory(); |
+ } |
+ |
// Create a list of ShellLinkItems from the "Recently Closed" pages. |
// As noted above, we create a ShellLinkItem objects with the following |
// parameters. |
@@ -560,7 +581,7 @@ void JumpList::DeferredTabRestoreServiceChanged() { |
// The title of the last URL. |
// * icon |
// An empty string. This value is to be updated in OnFaviconDataAvailable(). |
- const int kRecentlyClosedCount = 3; |
+ |
sessions::TabRestoreService* tab_restore_service = |
TabRestoreServiceFactory::GetForProfile(profile_); |
@@ -570,17 +591,17 @@ void JumpList::DeferredTabRestoreServiceChanged() { |
data->recently_closed_pages_.clear(); |
for (const auto& entry : tab_restore_service->entries()) { |
- if (data->recently_closed_pages_.size() >= kRecentlyClosedCount) |
+ if (data->recently_closed_pages_.size() >= kRecentlyClosedItems) |
break; |
switch (entry->type) { |
case sessions::TabRestoreService::TAB: |
AddTab(static_cast<const sessions::TabRestoreService::Tab&>(*entry), |
- kRecentlyClosedCount, data); |
+ kRecentlyClosedItems, data); |
break; |
case sessions::TabRestoreService::WINDOW: |
AddWindow( |
static_cast<const sessions::TabRestoreService::Window&>(*entry), |
- kRecentlyClosedCount, data); |
+ kRecentlyClosedItems, data); |
break; |
} |
} |
@@ -711,37 +732,6 @@ bool JumpList::UpdateJumpList( |
return false; |
} |
- // The default maximum number of items to display in JumpList is 10. |
- // https://msdn.microsoft.com/library/windows/desktop/dd378398.aspx |
- // The "Most visited" category title always takes 1 of the JumpList slots if |
- // |most_visited_pages| isn't empty. |
- // The "Recently closed" category title will also take 1 if |
- // |recently_closed_pages| isn't empty. |
- // For the remaining slots, we allocate 5/8 (i.e., 5 slots if both categories |
- // present) to "most-visited" items and 3/8 (i.e., 3 slots if both categories |
- // present) to "recently-closed" items, respectively. |
- // Nevertheless, if there are not so many items in |recently_closed_pages|, |
- // we give the remaining slots to "most-visited" items. |
- |
- const int kMostVisited = 50; |
- const int kRecentlyClosed = 30; |
- const int kTotal = kMostVisited + kRecentlyClosed; |
- |
- // Adjust the available jumplist slots to account for the category titles. |
- size_t user_max_items_adjusted = jumplist_updater.user_max_items(); |
- if (!most_visited_pages.empty()) |
- --user_max_items_adjusted; |
- if (!recently_closed_pages.empty()) |
- --user_max_items_adjusted; |
- |
- size_t most_visited_items = |
- MulDiv(user_max_items_adjusted, kMostVisited, kTotal); |
- size_t recently_closed_items = user_max_items_adjusted - most_visited_items; |
- if (recently_closed_pages.size() < recently_closed_items) { |
- most_visited_items += recently_closed_items - recently_closed_pages.size(); |
- recently_closed_items = recently_closed_pages.size(); |
- } |
- |
// Record the desired number of icons to create in this JumpList update. |
int icons_to_create = 0; |
@@ -751,9 +741,9 @@ bool JumpList::UpdateJumpList( |
profile_dir, FILE_PATH_LITERAL("MostVisited")); |
UpdateIconFiles(icon_dir_most_visited, most_visited_pages, |
- most_visited_items, JumpListCategory::kMostVisited); |
+ kMostVisitedItems, JumpListCategory::kMostVisited); |
- icons_to_create += std::min(most_visited_pages.size(), most_visited_items); |
+ icons_to_create += std::min(most_visited_pages.size(), kMostVisitedItems); |
} |
// Update the icons for "Recently Closed" category of the JumpList if needed. |
@@ -762,10 +752,10 @@ bool JumpList::UpdateJumpList( |
profile_dir, FILE_PATH_LITERAL("RecentClosed")); |
UpdateIconFiles(icon_dir_recent_closed, recently_closed_pages, |
- recently_closed_items, JumpListCategory::kRecentlyClosed); |
+ kRecentlyClosedItems, JumpListCategory::kRecentlyClosed); |
icons_to_create += |
- std::min(recently_closed_pages.size(), recently_closed_items); |
+ std::min(recently_closed_pages.size(), kRecentlyClosedItems); |
} |
// TODO(chengx): Remove the UMA histogram after fixing http://crbug.com/40407. |
@@ -781,14 +771,14 @@ bool JumpList::UpdateJumpList( |
// transaction. |
if (!jumplist_updater.AddCustomCategory( |
l10n_util::GetStringUTF16(IDS_NEW_TAB_MOST_VISITED), |
- most_visited_pages, most_visited_items)) { |
+ most_visited_pages, kMostVisitedItems)) { |
return false; |
} |
// Update the "Recently Closed" category of the JumpList. |
if (!jumplist_updater.AddCustomCategory( |
l10n_util::GetStringUTF16(IDS_RECENTLY_CLOSED), recently_closed_pages, |
- recently_closed_items)) { |
+ kRecentlyClosedItems)) { |
return false; |
} |