| Index: components/ntp_tiles/most_visited_sites.cc
|
| diff --git a/components/ntp_tiles/most_visited_sites.cc b/components/ntp_tiles/most_visited_sites.cc
|
| index 6f5504cf5792fe285357ef8244b746727b91b821..8ddd45ba66f579990548554fc52dbd6df2475961 100644
|
| --- a/components/ntp_tiles/most_visited_sites.cc
|
| +++ b/components/ntp_tiles/most_visited_sites.cc
|
| @@ -30,6 +30,8 @@ namespace ntp_tiles {
|
|
|
| namespace {
|
|
|
| +constexpr int kNumTilesForObservers = 12;
|
| +
|
| const base::Feature kDisplaySuggestionsServiceTiles{
|
| "DisplaySuggestionsServiceTiles", base::FEATURE_ENABLED_BY_DEFAULT};
|
|
|
| @@ -59,8 +61,6 @@ MostVisitedSites::MostVisitedSites(
|
| popular_sites_(std::move(popular_sites)),
|
| icon_cacher_(std::move(icon_cacher)),
|
| supervisor_(std::move(supervisor)),
|
| - observer_(nullptr),
|
| - num_sites_(0),
|
| top_sites_observer_(this),
|
| mv_source_(NTPTileSource::TOP_SITES),
|
| top_sites_weak_ptr_factory_(this) {
|
| @@ -70,22 +70,10 @@ MostVisitedSites::MostVisitedSites(
|
| DCHECK(suggestions_service_);
|
| if (supervisor_)
|
| supervisor_->SetObserver(this);
|
| -}
|
| -
|
| -MostVisitedSites::~MostVisitedSites() {
|
| - if (supervisor_)
|
| - supervisor_->SetObserver(nullptr);
|
| -}
|
| -
|
| -void MostVisitedSites::SetMostVisitedURLsObserver(Observer* observer,
|
| - int num_sites) {
|
| - DCHECK(observer);
|
| - observer_ = observer;
|
| - num_sites_ = num_sites;
|
|
|
| // The order for this condition is important, ShouldShowPopularSites() should
|
| // always be called last to keep metrics as relevant as possible.
|
| - if (popular_sites_ && NeedPopularSites(prefs_, num_sites_) &&
|
| + if (popular_sites_ && NeedPopularSites(prefs_, kNumTilesForObservers) &&
|
| ShouldShowPopularSites()) {
|
| popular_sites_->StartFetch(
|
| false, base::Bind(&MostVisitedSites::OnPopularSitesAvailable,
|
| @@ -93,10 +81,6 @@ void MostVisitedSites::SetMostVisitedURLsObserver(Observer* observer,
|
| }
|
|
|
| if (top_sites_) {
|
| - // TopSites updates itself after a delay. To ensure up-to-date results,
|
| - // force an update now.
|
| - top_sites_->SyncWithHistory();
|
| -
|
| // Register as TopSitesObserver so that we can update ourselves when the
|
| // TopSites changes.
|
| top_sites_observer_.Add(top_sites_.get());
|
| @@ -105,15 +89,33 @@ void MostVisitedSites::SetMostVisitedURLsObserver(Observer* observer,
|
| suggestions_subscription_ = suggestions_service_->AddCallback(
|
| base::Bind(&MostVisitedSites::OnSuggestionsProfileAvailable,
|
| base::Unretained(this)));
|
| +}
|
| +
|
| +MostVisitedSites::~MostVisitedSites() {
|
| + if (supervisor_)
|
| + supervisor_->SetObserver(nullptr);
|
| +}
|
| +
|
| +void MostVisitedSites::AddObserver(Observer* observer) {
|
| + observer_list_.AddObserver(observer);
|
| +}
|
| +
|
| +void MostVisitedSites::RemoveObserver(Observer* observer) {
|
| + observer_list_.RemoveObserver(observer);
|
| +}
|
| +
|
| +void MostVisitedSites::Refresh() {
|
| + // TODO(mastiz): Refresh PopularSites too if enabled.
|
| +
|
| + // TopSites updates itself after a delay. To ensure up-to-date results, force
|
| + // an update now.
|
| + if (top_sites_)
|
| + top_sites_->SyncWithHistory();
|
|
|
| // Immediately build the current set of tiles, getting suggestions from the
|
| // SuggestionsService's cache or, if that is empty, sites from TopSites.
|
| BuildCurrentTiles();
|
| // Also start a request for fresh suggestions.
|
| - Refresh();
|
| -}
|
| -
|
| -void MostVisitedSites::Refresh() {
|
| suggestions_service_->FetchSuggestionsData();
|
| }
|
|
|
| @@ -197,7 +199,7 @@ void MostVisitedSites::OnMostVisitedURLsAvailable(
|
|
|
| NTPTilesVector tiles;
|
| size_t num_tiles =
|
| - std::min(visited_list.size(), static_cast<size_t>(num_sites_));
|
| + std::min(visited_list.size(), static_cast<size_t>(kNumTilesForObservers));
|
| for (size_t i = 0; i < num_tiles; ++i) {
|
| const history::MostVisitedURL& visited = visited_list[i];
|
| if (visited.url.is_empty()) {
|
| @@ -218,7 +220,7 @@ void MostVisitedSites::OnMostVisitedURLsAvailable(
|
|
|
| mv_source_ = NTPTileSource::TOP_SITES;
|
| SaveNewTiles(std::move(tiles));
|
| - NotifyMostVisitedURLsObserver();
|
| + NotifyMostVisitedURLsObservers();
|
| }
|
|
|
| void MostVisitedSites::OnSuggestionsProfileAvailable(
|
| @@ -231,8 +233,8 @@ void MostVisitedSites::OnSuggestionsProfileAvailable(
|
| InitiateTopSitesQuery();
|
| return;
|
| }
|
| - if (num_sites_ < num_tiles)
|
| - num_tiles = num_sites_;
|
| + if (kNumTilesForObservers < num_tiles)
|
| + num_tiles = kNumTilesForObservers;
|
|
|
| NTPTilesVector tiles;
|
| for (int i = 0; i < num_tiles; ++i) {
|
| @@ -254,7 +256,7 @@ void MostVisitedSites::OnSuggestionsProfileAvailable(
|
|
|
| mv_source_ = NTPTileSource::SUGGESTIONS_SERVICE;
|
| SaveNewTiles(std::move(tiles));
|
| - NotifyMostVisitedURLsObserver();
|
| + NotifyMostVisitedURLsObservers();
|
| }
|
|
|
| NTPTilesVector MostVisitedSites::CreateWhitelistEntryPointTiles(
|
| @@ -264,9 +266,9 @@ NTPTilesVector MostVisitedSites::CreateWhitelistEntryPointTiles(
|
| }
|
|
|
| size_t num_personal_tiles = personal_tiles.size();
|
| - DCHECK_LE(num_personal_tiles, static_cast<size_t>(num_sites_));
|
| + DCHECK_LE(num_personal_tiles, static_cast<size_t>(kNumTilesForObservers));
|
|
|
| - size_t num_whitelist_tiles = num_sites_ - num_personal_tiles;
|
| + size_t num_whitelist_tiles = kNumTilesForObservers - num_personal_tiles;
|
| NTPTilesVector whitelist_tiles;
|
|
|
| std::set<std::string> personal_hosts;
|
| @@ -309,11 +311,11 @@ NTPTilesVector MostVisitedSites::CreatePopularSitesTiles(
|
| return NTPTilesVector();
|
|
|
| size_t num_tiles = personal_tiles.size() + whitelist_tiles.size();
|
| - DCHECK_LE(num_tiles, static_cast<size_t>(num_sites_));
|
| + DCHECK_LE(num_tiles, static_cast<size_t>(kNumTilesForObservers));
|
|
|
| // Collect non-blacklisted popular suggestions, skipping those already present
|
| // in the personal suggestions.
|
| - size_t num_popular_sites_tiles = num_sites_ - num_tiles;
|
| + size_t num_popular_sites_tiles = kNumTilesForObservers - num_tiles;
|
| NTPTilesVector popular_sites_tiles;
|
|
|
| if (num_popular_sites_tiles > 0 && popular_sites_) {
|
| @@ -355,7 +357,7 @@ void MostVisitedSites::SaveNewTiles(NTPTilesVector personal_tiles) {
|
|
|
| size_t num_actual_tiles = personal_tiles.size() + whitelist_tiles.size() +
|
| popular_sites_tiles.size();
|
| - DCHECK_LE(num_actual_tiles, static_cast<size_t>(num_sites_));
|
| + DCHECK_LE(num_actual_tiles, static_cast<size_t>(kNumTilesForObservers));
|
|
|
| current_tiles_ =
|
| MergeTiles(std::move(personal_tiles), std::move(whitelist_tiles),
|
| @@ -384,11 +386,9 @@ NTPTilesVector MostVisitedSites::MergeTiles(NTPTilesVector personal_tiles,
|
| return merged_tiles;
|
| }
|
|
|
| -void MostVisitedSites::NotifyMostVisitedURLsObserver() {
|
| - if (!observer_)
|
| - return;
|
| -
|
| - observer_->OnMostVisitedURLsAvailable(current_tiles_);
|
| +void MostVisitedSites::NotifyMostVisitedURLsObservers() {
|
| + for (Observer& observer : observer_list_)
|
| + observer.OnMostVisitedURLsAvailable(current_tiles_);
|
| }
|
|
|
| void MostVisitedSites::OnPopularSitesAvailable(bool success) {
|
| @@ -403,8 +403,8 @@ void MostVisitedSites::OnPopularSitesAvailable(bool success) {
|
|
|
| void MostVisitedSites::OnIconMadeAvailable(const GURL& site_url,
|
| bool newly_available) {
|
| - if (newly_available)
|
| - observer_->OnIconMadeAvailable(site_url);
|
| + for (Observer& observer : observer_list_)
|
| + observer.OnIconMadeAvailable(site_url);
|
| }
|
|
|
| void MostVisitedSites::TopSitesLoaded(TopSites* top_sites) {}
|
|
|