Chromium Code Reviews| Index: chrome/browser/win/jumplist.cc |
| diff --git a/chrome/browser/win/jumplist.cc b/chrome/browser/win/jumplist.cc |
| index 24ac405c820d75e2c19b92784cc03fe21829bc8d..8e79909d34daad51f5bc05d60ceba9ab33b86d54 100644 |
| --- a/chrome/browser/win/jumplist.cc |
| +++ b/chrome/browser/win/jumplist.cc |
| @@ -55,6 +55,10 @@ using JumpListData = JumpList::JumpListData; |
| namespace { |
| +// JumpList "Most Visited" category is forced to sync with the TopSites service |
| +// only after this number of tabs are closed after Chrome launches. |
| +constexpr int kTabClosedCountToDelayTopSitesSync = 3; |
| + |
| // The delay before updating the JumpList to prevent update storms. |
| constexpr base::TimeDelta kDelayForJumplistUpdate = |
| base::TimeDelta::FromMilliseconds(3500); |
| @@ -181,6 +185,8 @@ JumpList::JumpList(Profile* profile) |
| : RefcountedKeyedService(content::BrowserThread::GetTaskRunnerForThread( |
| content::BrowserThread::UI)), |
| profile_(profile), |
| + tab_closed_count_(0), |
| + initial_most_visited_update_done_(false), |
| jumplist_data_(new base::RefCountedData<JumpListData>), |
| task_id_(base::CancelableTaskTracker::kBadTaskId), |
| update_jumplist_task_runner_(base::CreateCOMSTATaskRunnerWithTraits( |
| @@ -208,12 +214,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); |
| @@ -270,9 +273,9 @@ void JumpList::OnMostVisitedURLsAvailable( |
| const history::MostVisitedURLList& urls) { |
| DCHECK(CalledOnValidThread()); |
| - // At most 9 JumpList items can be displayed for the "Most Visited" |
| + // At most 5 JumpList items can be displayed for the "Most Visited" |
| // category. |
| - const int kMostVistedCount = 9; |
| + const int kMostVistedCount = 5; |
| { |
| JumpListData* data = &jumplist_data_->data; |
| base::AutoLock auto_lock(data->list_lock_); |
| @@ -303,6 +306,8 @@ void JumpList::TabRestoreServiceChanged(sessions::TabRestoreService* service) { |
| // if we have a pending favicon request, cancel it here (it is out of date). |
| CancelPendingUpdate(); |
| + ++tab_closed_count_; |
| + |
| // Initialize the one-shot timer to update the the "Recently Closed" category |
| // in a while. If there is already a request queued then cancel it and post |
| // the new request. This ensures that JumpList update of the "Recently Closed" |
| @@ -514,6 +519,9 @@ void JumpList::TopSitesChanged(history::TopSites* top_sites, |
| } |
| void JumpList::DeferredTopSitesChanged() { |
| + if (tab_closed_count_ < kTabClosedCountToDelayTopSitesSync) |
| + return; |
| + |
| scoped_refptr<history::TopSites> top_sites = |
| TopSitesFactory::GetForProfile(profile_); |
| if (top_sites) { |
| @@ -525,6 +533,17 @@ void JumpList::DeferredTopSitesChanged() { |
| } |
| void JumpList::DeferredTabRestoreServiceChanged() { |
| + if (tab_closed_count_ < kTabClosedCountToDelayTopSitesSync) { |
| + return; |
| + } else if (!initial_most_visited_update_done_) { |
| + scoped_refptr<history::TopSites> top_sites = |
| + TopSitesFactory::GetForProfile(profile_); |
| + if (top_sites) { |
| + top_sites->SyncWithHistory(); |
| + } |
| + initial_most_visited_update_done_ = true; |
| + } |
| + |
| // Create a list of ShellLinkItems from the "Recently Closed" pages. |
| // As noted above, we create a ShellLinkItem objects with the following |
| // parameters. |
| @@ -630,20 +649,12 @@ bool JumpList::UpdateJumpList( |
| 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; |
| + // Adjust the available jumplist slots to account for the two category titles. |
| + size_t user_max_items_adjusted = jumplist_updater.user_max_items() - 2; |
| size_t most_visited_items = |
| MulDiv(user_max_items_adjusted, kMostVisited, kTotal); |
|
gab
2017/05/12 18:13:35
Can we just make this 5 and recently closed 3. i.e
chengx
2017/05/18 00:51:00
I stopped load-balancing, and limited these two ca
|
| 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; |