summaryrefslogtreecommitdiff
path: root/chromium/components/ntp_tiles/most_visited_sites.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/components/ntp_tiles/most_visited_sites.cc')
-rw-r--r--chromium/components/ntp_tiles/most_visited_sites.cc196
1 files changed, 132 insertions, 64 deletions
diff --git a/chromium/components/ntp_tiles/most_visited_sites.cc b/chromium/components/ntp_tiles/most_visited_sites.cc
index 6809aa4dcbd..19c2f957f89 100644
--- a/chromium/components/ntp_tiles/most_visited_sites.cc
+++ b/chromium/components/ntp_tiles/most_visited_sites.cc
@@ -5,13 +5,12 @@
#include "components/ntp_tiles/most_visited_sites.h"
#include <algorithm>
-#include <set>
-#include <string>
#include <utility>
#include "base/bind.h"
#include "base/callback.h"
#include "base/feature_list.h"
+#include "base/metrics/user_metrics.h"
#include "base/strings/utf_string_conversions.h"
#include "components/history/core/browser/top_sites.h"
#include "components/ntp_tiles/constants.h"
@@ -53,15 +52,17 @@ MostVisitedSites::MostVisitedSites(
SuggestionsService* suggestions,
std::unique_ptr<PopularSites> popular_sites,
std::unique_ptr<IconCacher> icon_cacher,
- std::unique_ptr<MostVisitedSitesSupervisor> supervisor)
+ std::unique_ptr<MostVisitedSitesSupervisor> supervisor,
+ std::unique_ptr<HomePageClient> home_page_client)
: prefs_(prefs),
top_sites_(top_sites),
suggestions_service_(suggestions),
popular_sites_(std::move(popular_sites)),
icon_cacher_(std::move(icon_cacher)),
supervisor_(std::move(supervisor)),
+ home_page_client_(std::move(home_page_client)),
observer_(nullptr),
- num_sites_(0),
+ num_sites_(0u),
top_sites_observer_(this),
mv_source_(TileSource::TOP_SITES),
top_sites_weak_ptr_factory_(this) {
@@ -73,6 +74,21 @@ MostVisitedSites::MostVisitedSites(
supervisor_->SetObserver(this);
}
+MostVisitedSites::MostVisitedSites(
+ PrefService* prefs,
+ scoped_refptr<history::TopSites> top_sites,
+ SuggestionsService* suggestions,
+ std::unique_ptr<PopularSites> popular_sites,
+ std::unique_ptr<IconCacher> icon_cacher,
+ std::unique_ptr<MostVisitedSitesSupervisor> supervisor)
+ : MostVisitedSites(prefs,
+ top_sites,
+ suggestions,
+ std::move(popular_sites),
+ std::move(icon_cacher),
+ std::move(supervisor),
+ nullptr) {}
+
MostVisitedSites::~MostVisitedSites() {
if (supervisor_)
supervisor_->SetObserver(nullptr);
@@ -88,13 +104,15 @@ bool MostVisitedSites::DoesSourceExist(TileSource source) const {
return popular_sites_ != nullptr;
case TileSource::WHITELIST:
return supervisor_ != nullptr;
+ case TileSource::HOMEPAGE:
+ return home_page_client_ != nullptr;
}
NOTREACHED();
return false;
}
void MostVisitedSites::SetMostVisitedURLsObserver(Observer* observer,
- int num_sites) {
+ size_t num_sites) {
DCHECK(observer);
observer_ = observer;
num_sites_ = num_sites;
@@ -134,6 +152,13 @@ void MostVisitedSites::Refresh() {
void MostVisitedSites::AddOrRemoveBlacklistedUrl(const GURL& url,
bool add_url) {
+ if (add_url) {
+ base::RecordAction(base::UserMetricsAction("Suggestions.Site.Removed"));
+ } else {
+ base::RecordAction(
+ base::UserMetricsAction("Suggestions.Site.RemovalUndone"));
+ }
+
if (top_sites_) {
// Always blacklist in the local TopSites.
if (add_url)
@@ -203,8 +228,7 @@ void MostVisitedSites::OnMostVisitedURLsAvailable(
}
NTPTilesVector tiles;
- size_t num_tiles =
- std::min(visited_list.size(), static_cast<size_t>(num_sites_));
+ size_t num_tiles = std::min(visited_list.size(), num_sites_);
for (size_t i = 0; i < num_tiles; ++i) {
const history::MostVisitedURL& visited = visited_list[i];
if (visited.url.is_empty())
@@ -243,7 +267,7 @@ void MostVisitedSites::BuildCurrentTiles() {
void MostVisitedSites::BuildCurrentTilesGivenSuggestionsProfile(
const suggestions::SuggestionsProfile& suggestions_profile) {
- int num_tiles = suggestions_profile.suggestions_size();
+ size_t num_tiles = suggestions_profile.suggestions_size();
// With no server suggestions, fall back to local TopSites.
if (num_tiles == 0 ||
!base::FeatureList::IsEnabled(kDisplaySuggestionsServiceTiles)) {
@@ -255,7 +279,7 @@ void MostVisitedSites::BuildCurrentTilesGivenSuggestionsProfile(
num_tiles = num_sites_;
NTPTilesVector tiles;
- for (int i = 0; i < num_tiles; ++i) {
+ for (size_t i = 0; i < num_tiles; ++i) {
const ChromeSuggestion& suggestion_pb = suggestions_profile.suggestions(i);
GURL url(suggestion_pb.url());
if (supervisor_ && supervisor_->IsBlocked(url))
@@ -268,6 +292,11 @@ void MostVisitedSites::BuildCurrentTilesGivenSuggestionsProfile(
tile.whitelist_icon_path = GetWhitelistLargeIconPath(url);
tile.thumbnail_url = GURL(suggestion_pb.thumbnail());
tile.favicon_url = GURL(suggestion_pb.favicon_url());
+ if (AreNtpMostLikelyFaviconsFromServerEnabled()) {
+ icon_cacher_->StartFetchMostLikely(
+ url, base::Bind(&MostVisitedSites::OnIconMadeAvailable,
+ base::Unretained(this), url));
+ }
tiles.push_back(std::move(tile));
}
@@ -277,23 +306,15 @@ void MostVisitedSites::BuildCurrentTilesGivenSuggestionsProfile(
}
NTPTilesVector MostVisitedSites::CreateWhitelistEntryPointTiles(
- const NTPTilesVector& personal_tiles) {
+ const std::set<std::string>& used_hosts,
+ size_t num_actual_tiles) {
if (!supervisor_) {
return NTPTilesVector();
}
- size_t num_personal_tiles = personal_tiles.size();
- DCHECK_LE(num_personal_tiles, static_cast<size_t>(num_sites_));
-
- size_t num_whitelist_tiles = num_sites_ - num_personal_tiles;
NTPTilesVector whitelist_tiles;
-
- std::set<std::string> personal_hosts;
- for (const auto& tile : personal_tiles)
- personal_hosts.insert(tile.url.host());
-
for (const auto& whitelist : supervisor_->whitelists()) {
- if (whitelist_tiles.size() >= num_whitelist_tiles)
+ if (whitelist_tiles.size() + num_actual_tiles >= num_sites_)
break;
// Skip blacklisted sites.
@@ -301,8 +322,7 @@ NTPTilesVector MostVisitedSites::CreateWhitelistEntryPointTiles(
continue;
// Skip tiles already present.
- if (personal_hosts.find(whitelist.entry_point.host()) !=
- personal_hosts.end())
+ if (used_hosts.find(whitelist.entry_point.host()) != used_hosts.end())
continue;
// Skip whitelist entry points that are manually blocked.
@@ -321,62 +341,90 @@ NTPTilesVector MostVisitedSites::CreateWhitelistEntryPointTiles(
}
NTPTilesVector MostVisitedSites::CreatePopularSitesTiles(
- const NTPTilesVector& personal_tiles,
- const NTPTilesVector& whitelist_tiles) {
+ const std::set<std::string>& used_hosts,
+ size_t num_actual_tiles) {
// For child accounts popular sites tiles will not be added.
- if (supervisor_ && supervisor_->IsChildProfile())
+ if (supervisor_ && supervisor_->IsChildProfile()) {
return NTPTilesVector();
+ }
- size_t num_tiles = personal_tiles.size() + whitelist_tiles.size();
- DCHECK_LE(num_tiles, static_cast<size_t>(num_sites_));
+ if (!popular_sites_ || !ShouldShowPopularSites()) {
+ return NTPTilesVector();
+ }
// Collect non-blacklisted popular suggestions, skipping those already present
// in the personal suggestions.
- size_t num_popular_sites_tiles = num_sites_ - num_tiles;
NTPTilesVector popular_sites_tiles;
+ for (const PopularSites::Site& popular_site : popular_sites_->sites()) {
+ if (popular_sites_tiles.size() + num_actual_tiles >= num_sites_)
+ break;
- if (num_popular_sites_tiles > 0 && popular_sites_ &&
- ShouldShowPopularSites()) {
- std::set<std::string> hosts;
- for (const auto& tile : personal_tiles)
- hosts.insert(tile.url.host());
- for (const auto& tile : whitelist_tiles)
- hosts.insert(tile.url.host());
- for (const PopularSites::Site& popular_site : popular_sites_->sites()) {
- // Skip blacklisted sites.
- if (top_sites_ && top_sites_->IsBlacklisted(popular_site.url))
- continue;
- std::string host = popular_site.url.host();
- // Skip tiles already present in personal or whitelists.
- if (hosts.find(host) != hosts.end())
- continue;
-
- NTPTile tile;
- tile.title = popular_site.title;
- tile.url = GURL(popular_site.url);
- tile.source = TileSource::POPULAR;
-
- popular_sites_tiles.push_back(std::move(tile));
- base::Closure icon_available =
- base::Bind(&MostVisitedSites::OnIconMadeAvailable,
- base::Unretained(this), popular_site.url);
- icon_cacher_->StartFetch(popular_site, icon_available, icon_available);
- if (popular_sites_tiles.size() >= num_popular_sites_tiles)
- break;
- }
+ // Skip blacklisted sites.
+ if (top_sites_ && top_sites_->IsBlacklisted(popular_site.url))
+ continue;
+
+ const std::string& host = popular_site.url.host();
+ // Skip tiles already present in personal or whitelists.
+ if (used_hosts.find(host) != used_hosts.end())
+ continue;
+
+ NTPTile tile;
+ tile.title = popular_site.title;
+ tile.url = GURL(popular_site.url);
+ tile.source = TileSource::POPULAR;
+ popular_sites_tiles.push_back(std::move(tile));
+ base::Closure icon_available =
+ base::Bind(&MostVisitedSites::OnIconMadeAvailable,
+ base::Unretained(this), popular_site.url);
+ icon_cacher_->StartFetchPopularSites(popular_site, icon_available,
+ icon_available);
}
return popular_sites_tiles;
}
+NTPTilesVector MostVisitedSites::CreatePersonalTilesWithHomeTile(
+ NTPTilesVector tiles) const {
+ DCHECK(home_page_client_);
+ DCHECK_GT(num_sites_, 0u);
+
+ const GURL& home_page_url = home_page_client_->GetHomepageUrl();
+ NTPTilesVector new_tiles;
+ // Add the home tile as first tile.
+ NTPTile home_tile;
+ home_tile.url = home_page_url;
+ home_tile.source = TileSource::HOMEPAGE;
+ new_tiles.push_back(std::move(home_tile));
+
+ for (auto& tile : tiles) {
+ if (new_tiles.size() >= num_sites_) {
+ break;
+ }
+
+ if (tile.url.host() == home_page_url.host()) {
+ continue;
+ }
+
+ new_tiles.push_back(std::move(tile));
+ }
+ return new_tiles;
+}
+
void MostVisitedSites::SaveNewTilesAndNotify(NTPTilesVector personal_tiles) {
+ std::set<std::string> used_hosts;
+ size_t num_actual_tiles = 0u;
+
+ if (ShouldAddHomeTile()) {
+ personal_tiles = CreatePersonalTilesWithHomeTile(std::move(personal_tiles));
+ }
+ AddToHostsAndTotalCount(personal_tiles, &used_hosts, &num_actual_tiles);
+
NTPTilesVector whitelist_tiles =
- CreateWhitelistEntryPointTiles(personal_tiles);
- NTPTilesVector popular_sites_tiles =
- CreatePopularSitesTiles(personal_tiles, whitelist_tiles);
+ CreateWhitelistEntryPointTiles(used_hosts, num_actual_tiles);
+ AddToHostsAndTotalCount(whitelist_tiles, &used_hosts, &num_actual_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_));
+ NTPTilesVector popular_sites_tiles =
+ CreatePopularSitesTiles(used_hosts, num_actual_tiles);
+ AddToHostsAndTotalCount(popular_sites_tiles, &used_hosts, &num_actual_tiles);
NTPTilesVector new_tiles =
MergeTiles(std::move(personal_tiles), std::move(whitelist_tiles),
@@ -422,7 +470,8 @@ void MostVisitedSites::OnPopularSitesDownloaded(bool success) {
for (const PopularSites::Site& popular_site : popular_sites_->sites()) {
// Ignore callback; these icons will be seen on the *next* NTP.
- icon_cacher_->StartFetch(popular_site, base::Closure(), base::Closure());
+ icon_cacher_->StartFetchPopularSites(popular_site, base::Closure(),
+ base::Closure());
}
}
@@ -440,4 +489,23 @@ void MostVisitedSites::TopSitesChanged(TopSites* top_sites,
}
}
+bool MostVisitedSites::ShouldAddHomeTile() const {
+ return base::FeatureList::IsEnabled(kPinHomePageAsTileFeature) &&
+ num_sites_ > 0u && home_page_client_ &&
+ home_page_client_->IsHomePageEnabled() &&
+ !home_page_client_->IsNewTabPageUsedAsHomePage() &&
+ !(top_sites_ &&
+ top_sites_->IsBlacklisted(home_page_client_->GetHomepageUrl()));
+}
+
+void MostVisitedSites::AddToHostsAndTotalCount(const NTPTilesVector& new_tiles,
+ std::set<std::string>* hosts,
+ size_t* total_tile_count) const {
+ for (const auto& tile : new_tiles) {
+ hosts->insert(tile.url.host());
+ }
+ *total_tile_count += new_tiles.size();
+ DCHECK_LE(*total_tile_count, num_sites_);
+}
+
} // namespace ntp_tiles