Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(611)

Unified Diff: components/ntp_tiles/most_visited_sites.cc

Issue 2619993002: ntp_tiles: Migrate to multi-observer model
Patch Set: Fixed build. Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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) {}

Powered by Google App Engine
This is Rietveld 408576698