blob: fe51e1d5952a8c883e49b3c539178af0267e7c71 [file] [log] [blame]
[email protected]c764b2822013-07-03 04:16:481// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
sfiera3ff01c0d2016-06-13 15:33:385#include "components/ntp_tiles/most_visited_sites.h"
[email protected]c764b2822013-07-03 04:16:486
sfiera3ff01c0d2016-06-13 15:33:387#include <algorithm>
8#include <set>
treibd2698222016-07-14 11:32:449#include <string>
dchengbc6125d2015-12-30 01:54:0710#include <utility>
11
[email protected]d33adb40d2014-06-03 21:38:4612#include "base/callback.h"
mastizf3468a82016-06-15 11:05:4113#include "base/feature_list.h"
[email protected]bc093e82014-03-04 21:49:1114#include "base/strings/utf_string_conversions.h"
sdefresne0da3bc02015-01-29 18:26:3515#include "components/history/core/browser/top_sites.h"
treibdb416392016-06-29 17:20:5016#include "components/ntp_tiles/constants.h"
Eric Noyau4793d932016-11-16 16:19:2317#include "components/ntp_tiles/field_trial.h"
sfieraae1ae692016-10-24 18:19:1518#include "components/ntp_tiles/icon_cacher.h"
sfiera0dc4da52016-04-29 09:23:0519#include "components/ntp_tiles/pref_names.h"
20#include "components/ntp_tiles/switches.h"
knncbbd754d2015-09-09 15:43:4021#include "components/pref_registry/pref_registry_syncable.h"
brettwb1fc1b82016-02-02 00:19:0822#include "components/prefs/pref_service.h"
[email protected]c764b2822013-07-03 04:16:4823
[email protected]c764b2822013-07-03 04:16:4824using history::TopSites;
[email protected]bc093e82014-03-04 21:49:1125using suggestions::ChromeSuggestion;
26using suggestions::SuggestionsProfile;
sfiera7e952d42016-05-04 17:56:3327using suggestions::SuggestionsService;
[email protected]c764b2822013-07-03 04:16:4828
sfiera08009fe2016-06-15 17:07:2629namespace ntp_tiles {
30
[email protected]c764b2822013-07-03 04:16:4831namespace {
32
mastizf3468a82016-06-15 11:05:4133const base::Feature kDisplaySuggestionsServiceTiles{
34 "DisplaySuggestionsServiceTiles", base::FEATURE_ENABLED_BY_DEFAULT};
35
sfiera635d21d2016-08-04 07:56:0936// Determine whether we need any tiles from PopularSites to fill up a grid of
treibf79ed40d2015-09-22 12:38:0637// |num_tiles| tiles.
treibcd3d2ef2016-07-13 16:53:3138bool NeedPopularSites(const PrefService* prefs, int num_tiles) {
treib41b5968d2016-10-13 08:14:2239 return prefs->GetInteger(prefs::kNumPersonalTiles) < num_tiles;
treibf79ed40d2015-09-22 12:38:0640}
41
atanasova9c0dda602016-03-22 17:41:1342bool AreURLsEquivalent(const GURL& url1, const GURL& url2) {
csharrison88b3b712016-11-14 23:12:3543 return url1.host_piece() == url2.host_piece() &&
44 url1.path_piece() == url2.path_piece();
atanasova9c0dda602016-03-22 17:41:1345}
46
sfiera8df7b382016-04-26 14:06:3347} // namespace
48
sfiera635d21d2016-08-04 07:56:0949MostVisitedSites::MostVisitedSites(PrefService* prefs,
50 scoped_refptr<history::TopSites> top_sites,
51 SuggestionsService* suggestions,
sfiera96c03252016-09-14 18:58:1652 std::unique_ptr<PopularSites> popular_sites,
sfieraae1ae692016-10-24 18:19:1553 std::unique_ptr<IconCacher> icon_cacher,
sfiera635d21d2016-08-04 07:56:0954 MostVisitedSitesSupervisor* supervisor)
sfiera79e643b2016-05-13 16:52:4955 : prefs_(prefs),
sfiera685a987e2016-05-12 17:08:4756 top_sites_(top_sites),
57 suggestions_service_(suggestions),
sfiera96c03252016-09-14 18:58:1658 popular_sites_(std::move(popular_sites)),
sfieraae1ae692016-10-24 18:19:1559 icon_cacher_(std::move(icon_cacher)),
sfiera79e643b2016-05-13 16:52:4960 supervisor_(supervisor),
sfiera685a987e2016-05-12 17:08:4761 observer_(nullptr),
62 num_sites_(0),
treibbaada0f2016-08-01 11:30:3363 top_sites_observer_(this),
sfiera635d21d2016-08-04 07:56:0964 mv_source_(NTPTileSource::SUGGESTIONS_SERVICE),
sfiera7e952d42016-05-04 17:56:3365 weak_ptr_factory_(this) {
sfiera87db8582016-08-05 10:46:4266 DCHECK(prefs_);
sfieraaa1b8862016-10-04 16:09:2367 // top_sites_ can be null in tests.
68 // TODO(sfiera): have iOS use a dummy TopSites in its tests.
mastizc60d74e2016-06-14 14:02:4969 DCHECK(suggestions_service_);
sfiera87db8582016-08-05 10:46:4270 if (supervisor_)
71 supervisor_->SetObserver(this);
[email protected]7ceb4e32013-12-06 04:13:0472}
[email protected]c764b2822013-07-03 04:16:4873
[email protected]7ceb4e32013-12-06 04:13:0474MostVisitedSites::~MostVisitedSites() {
sfiera87db8582016-08-05 10:46:4275 if (supervisor_)
76 supervisor_->SetObserver(nullptr);
[email protected]7ceb4e32013-12-06 04:13:0477}
[email protected]c764b2822013-07-03 04:16:4878
treib5a59f542016-05-18 12:17:2979void MostVisitedSites::SetMostVisitedURLsObserver(Observer* observer,
80 int num_sites) {
treibc1bd1f12016-04-29 15:06:0581 DCHECK(observer);
sfiera929502f32016-04-21 12:52:4882 observer_ = observer;
[email protected]7ceb4e32013-12-06 04:13:0483 num_sites_ = num_sites;
[email protected]852fc792013-10-04 04:15:1284
treib99f6b992016-11-23 13:59:5085 // The order for this condition is important, ShouldShowPopularSites() should
Eric Noyau4793d932016-11-16 16:19:2386 // always be called last to keep metrics as relevant as possible.
87 if (popular_sites_ && NeedPopularSites(prefs_, num_sites_) &&
88 ShouldShowPopularSites()) {
sfiera00a58ab2016-07-28 10:20:4989 popular_sites_->StartFetch(
90 false, base::Bind(&MostVisitedSites::OnPopularSitesAvailable,
91 base::Unretained(this)));
treibf79ed40d2015-09-22 12:38:0692 }
93
treibf7d11512016-06-29 09:06:1594 if (top_sites_) {
95 // TopSites updates itself after a delay. To ensure up-to-date results,
96 // force an update now.
97 top_sites_->SyncWithHistory();
[email protected]7ceb4e32013-12-06 04:13:0498
treibf7d11512016-06-29 09:06:1599 // Register as TopSitesObserver so that we can update ourselves when the
100 // TopSites changes.
treibbaada0f2016-08-01 11:30:33101 top_sites_observer_.Add(top_sites_.get());
treibf7d11512016-06-29 09:06:15102 }
treibcb9c93b2016-04-01 13:22:52103
sfiera728962f2016-04-29 11:04:02104 suggestions_subscription_ = suggestions_service_->AddCallback(
treibcb9c93b2016-04-01 13:22:52105 base::Bind(&MostVisitedSites::OnSuggestionsProfileAvailable,
106 base::Unretained(this)));
107
sfiera635d21d2016-08-04 07:56:09108 // Immediately build the current set of tiles, getting suggestions from the
109 // SuggestionsService's cache or, if that is empty, sites from TopSites.
110 BuildCurrentTiles();
treibcb9c93b2016-04-01 13:22:52111 // Also start a request for fresh suggestions.
sfiera728962f2016-04-29 11:04:02112 suggestions_service_->FetchSuggestionsData();
[email protected]c764b2822013-07-03 04:16:48113}
114
treib5a59f542016-05-18 12:17:29115void MostVisitedSites::AddOrRemoveBlacklistedUrl(const GURL& url,
116 bool add_url) {
treibf7d11512016-06-29 09:06:15117 if (top_sites_) {
118 // Always blacklist in the local TopSites.
119 if (add_url)
120 top_sites_->AddBlacklistedURL(url);
121 else
122 top_sites_->RemoveBlacklistedURL(url);
123 }
[email protected]d4975242014-06-02 18:16:20124
treibfac75192015-08-17 13:21:24125 // Only blacklist in the server-side suggestions service if it's active.
sfiera635d21d2016-08-04 07:56:09126 if (mv_source_ == NTPTileSource::SUGGESTIONS_SERVICE) {
treib16070ce2016-03-11 11:57:40127 if (add_url)
sfiera728962f2016-04-29 11:04:02128 suggestions_service_->BlacklistURL(url);
treib16070ce2016-03-11 11:57:40129 else
sfiera728962f2016-04-29 11:04:02130 suggestions_service_->UndoBlacklistURL(url);
[email protected]d4975242014-06-02 18:16:20131 }
[email protected]a4c2f282013-07-20 05:26:05132}
[email protected]7ceb4e32013-12-06 04:13:04133
sfiera79e643b2016-05-13 16:52:49134void MostVisitedSites::OnBlockedSitesChanged() {
sfiera635d21d2016-08-04 07:56:09135 BuildCurrentTiles();
atanasova9572aaf2016-02-26 18:08:26136}
137
[email protected]7ceb4e32013-12-06 04:13:04138// static
knncbbd754d2015-09-09 15:43:40139void MostVisitedSites::RegisterProfilePrefs(
140 user_prefs::PrefRegistrySyncable* registry) {
sfiera635d21d2016-08-04 07:56:09141 registry->RegisterIntegerPref(prefs::kNumPersonalTiles, 0);
knncbbd754d2015-09-09 15:43:40142}
143
sfiera635d21d2016-08-04 07:56:09144void MostVisitedSites::BuildCurrentTiles() {
treibc1bd1f12016-04-29 15:06:05145 // Get the current suggestions from cache. If the cache is empty, this will
146 // fall back to TopSites.
treibba0dee72016-03-31 13:25:59147 OnSuggestionsProfileAvailable(
sfiera728962f2016-04-29 11:04:02148 suggestions_service_->GetSuggestionsDataFromCache());
[email protected]bc093e82014-03-04 21:49:11149}
150
151void MostVisitedSites::InitiateTopSitesQuery() {
treibf7d11512016-06-29 09:06:15152 if (!top_sites_)
153 return;
sfiera728962f2016-04-29 11:04:02154 top_sites_->GetMostVisitedURLs(
knn6cf777fc2015-05-06 13:21:48155 base::Bind(&MostVisitedSites::OnMostVisitedURLsAvailable,
156 weak_ptr_factory_.GetWeakPtr()),
[email protected]7ceb4e32013-12-06 04:13:04157 false);
158}
159
atanasova9c0dda602016-03-22 17:41:13160base::FilePath MostVisitedSites::GetWhitelistLargeIconPath(const GURL& url) {
sfiera87db8582016-08-05 10:46:42161 if (supervisor_) {
162 for (const auto& whitelist : supervisor_->whitelists()) {
163 if (AreURLsEquivalent(whitelist.entry_point, url))
164 return whitelist.large_icon_path;
165 }
atanasova9c0dda602016-03-22 17:41:13166 }
167 return base::FilePath();
168}
169
[email protected]d4975242014-06-02 18:16:20170void MostVisitedSites::OnMostVisitedURLsAvailable(
[email protected]d4975242014-06-02 18:16:20171 const history::MostVisitedURLList& visited_list) {
sfiera635d21d2016-08-04 07:56:09172 NTPTilesVector tiles;
knncbbd754d2015-09-09 15:43:40173 size_t num_tiles =
174 std::min(visited_list.size(), static_cast<size_t>(num_sites_));
175 for (size_t i = 0; i < num_tiles; ++i) {
knn6cf777fc2015-05-06 13:21:48176 const history::MostVisitedURL& visited = visited_list[i];
177 if (visited.url.is_empty()) {
178 num_tiles = i;
179 break; // This is the signal that there are no more real visited sites.
180 }
sfiera87db8582016-08-05 10:46:42181 if (supervisor_ && supervisor_->IsBlocked(visited.url))
atanasova9514b302016-02-26 23:09:28182 continue;
atanasova9514b302016-02-26 23:09:28183
sfiera635d21d2016-08-04 07:56:09184 NTPTile tile;
185 tile.title = visited.title;
186 tile.url = visited.url;
187 tile.source = NTPTileSource::TOP_SITES;
188 tile.whitelist_icon_path = GetWhitelistLargeIconPath(visited.url);
atanasovac3c25d12016-03-17 18:33:57189
sfiera635d21d2016-08-04 07:56:09190 tiles.push_back(std::move(tile));
knn6cf777fc2015-05-06 13:21:48191 }
[email protected]d4975242014-06-02 18:16:20192
sfiera635d21d2016-08-04 07:56:09193 mv_source_ = NTPTileSource::TOP_SITES;
194 SaveNewTiles(std::move(tiles));
knncbbd754d2015-09-09 15:43:40195 NotifyMostVisitedURLsObserver();
[email protected]d4975242014-06-02 18:16:20196}
197
[email protected]bc093e82014-03-04 21:49:11198void MostVisitedSites::OnSuggestionsProfileAvailable(
[email protected]bc093e82014-03-04 21:49:11199 const SuggestionsProfile& suggestions_profile) {
knn6cf777fc2015-05-06 13:21:48200 int num_tiles = suggestions_profile.suggestions_size();
treibc1bd1f12016-04-29 15:06:05201 // With no server suggestions, fall back to local TopSites.
mastizf3468a82016-06-15 11:05:41202 if (num_tiles == 0 ||
203 !base::FeatureList::IsEnabled(kDisplaySuggestionsServiceTiles)) {
[email protected]bc093e82014-03-04 21:49:11204 InitiateTopSitesQuery();
205 return;
206 }
knn6cf777fc2015-05-06 13:21:48207 if (num_sites_ < num_tiles)
208 num_tiles = num_sites_;
[email protected]bc093e82014-03-04 21:49:11209
sfiera635d21d2016-08-04 07:56:09210 NTPTilesVector tiles;
knn6cf777fc2015-05-06 13:21:48211 for (int i = 0; i < num_tiles; ++i) {
treibd2698222016-07-14 11:32:44212 const ChromeSuggestion& suggestion_pb = suggestions_profile.suggestions(i);
213 GURL url(suggestion_pb.url());
sfiera87db8582016-08-05 10:46:42214 if (supervisor_ && supervisor_->IsBlocked(url))
atanasova9514b302016-02-26 23:09:28215 continue;
atanasova9514b302016-02-26 23:09:28216
sfiera635d21d2016-08-04 07:56:09217 NTPTile tile;
218 tile.title = base::UTF8ToUTF16(suggestion_pb.title());
219 tile.url = url;
220 tile.source = NTPTileSource::SUGGESTIONS_SERVICE;
221 tile.whitelist_icon_path = GetWhitelistLargeIconPath(url);
atanasovac3c25d12016-03-17 18:33:57222
sfiera635d21d2016-08-04 07:56:09223 tiles.push_back(std::move(tile));
[email protected]bc093e82014-03-04 21:49:11224 }
treib783a3372015-08-25 16:24:39225
sfiera635d21d2016-08-04 07:56:09226 mv_source_ = NTPTileSource::SUGGESTIONS_SERVICE;
227 SaveNewTiles(std::move(tiles));
knncbbd754d2015-09-09 15:43:40228 NotifyMostVisitedURLsObserver();
knn6cf777fc2015-05-06 13:21:48229}
[email protected]d4975242014-06-02 18:16:20230
sfiera635d21d2016-08-04 07:56:09231NTPTilesVector MostVisitedSites::CreateWhitelistEntryPointTiles(
232 const NTPTilesVector& personal_tiles) {
sfiera87db8582016-08-05 10:46:42233 if (!supervisor_) {
234 return NTPTilesVector();
235 }
236
sfiera635d21d2016-08-04 07:56:09237 size_t num_personal_tiles = personal_tiles.size();
238 DCHECK_LE(num_personal_tiles, static_cast<size_t>(num_sites_));
treibcffa6502015-08-06 09:12:27239
sfiera635d21d2016-08-04 07:56:09240 size_t num_whitelist_tiles = num_sites_ - num_personal_tiles;
241 NTPTilesVector whitelist_tiles;
atanasova9572aaf2016-02-26 18:08:26242
atanasova9514b302016-02-26 23:09:28243 std::set<std::string> personal_hosts;
sfiera635d21d2016-08-04 07:56:09244 for (const auto& tile : personal_tiles)
245 personal_hosts.insert(tile.url.host());
atanasova9572aaf2016-02-26 18:08:26246
sfiera79e643b2016-05-13 16:52:49247 for (const auto& whitelist : supervisor_->whitelists()) {
atanasova9514b302016-02-26 23:09:28248 // Skip blacklisted sites.
treibf7d11512016-06-29 09:06:15249 if (top_sites_ && top_sites_->IsBlacklisted(whitelist.entry_point))
atanasova9514b302016-02-26 23:09:28250 continue;
251
sfiera635d21d2016-08-04 07:56:09252 // Skip tiles already present.
sfiera79e643b2016-05-13 16:52:49253 if (personal_hosts.find(whitelist.entry_point.host()) !=
atanasova9514b302016-02-26 23:09:28254 personal_hosts.end())
255 continue;
256
257 // Skip whitelist entry points that are manually blocked.
sfiera79e643b2016-05-13 16:52:49258 if (supervisor_->IsBlocked(whitelist.entry_point))
atanasova9514b302016-02-26 23:09:28259 continue;
atanasova9514b302016-02-26 23:09:28260
sfiera635d21d2016-08-04 07:56:09261 NTPTile tile;
262 tile.title = whitelist.title;
263 tile.url = whitelist.entry_point;
264 tile.source = NTPTileSource::WHITELIST;
265 tile.whitelist_icon_path = whitelist.large_icon_path;
atanasovac3c25d12016-03-17 18:33:57266
sfiera635d21d2016-08-04 07:56:09267 whitelist_tiles.push_back(std::move(tile));
268 if (whitelist_tiles.size() >= num_whitelist_tiles)
atanasova9572aaf2016-02-26 18:08:26269 break;
270 }
271
sfiera635d21d2016-08-04 07:56:09272 return whitelist_tiles;
atanasova9572aaf2016-02-26 18:08:26273}
274
sfiera635d21d2016-08-04 07:56:09275NTPTilesVector MostVisitedSites::CreatePopularSitesTiles(
276 const NTPTilesVector& personal_tiles,
277 const NTPTilesVector& whitelist_tiles) {
278 // For child accounts popular sites tiles will not be added.
sfiera87db8582016-08-05 10:46:42279 if (supervisor_ && supervisor_->IsChildProfile())
sfiera635d21d2016-08-04 07:56:09280 return NTPTilesVector();
atanasova9514b302016-02-26 23:09:28281
sfiera635d21d2016-08-04 07:56:09282 size_t num_tiles = personal_tiles.size() + whitelist_tiles.size();
283 DCHECK_LE(num_tiles, static_cast<size_t>(num_sites_));
atanasova9572aaf2016-02-26 18:08:26284
knncbbd754d2015-09-09 15:43:40285 // Collect non-blacklisted popular suggestions, skipping those already present
286 // in the personal suggestions.
sfiera635d21d2016-08-04 07:56:09287 size_t num_popular_sites_tiles = num_sites_ - num_tiles;
288 NTPTilesVector popular_sites_tiles;
treibcffa6502015-08-06 09:12:27289
sfiera635d21d2016-08-04 07:56:09290 if (num_popular_sites_tiles > 0 && popular_sites_) {
atanasova9514b302016-02-26 23:09:28291 std::set<std::string> hosts;
sfiera635d21d2016-08-04 07:56:09292 for (const auto& tile : personal_tiles)
293 hosts.insert(tile.url.host());
294 for (const auto& tile : whitelist_tiles)
295 hosts.insert(tile.url.host());
knncbbd754d2015-09-09 15:43:40296 for (const PopularSites::Site& popular_site : popular_sites_->sites()) {
297 // Skip blacklisted sites.
treibf7d11512016-06-29 09:06:15298 if (top_sites_ && top_sites_->IsBlacklisted(popular_site.url))
knncbbd754d2015-09-09 15:43:40299 continue;
300 std::string host = popular_site.url.host();
sfiera635d21d2016-08-04 07:56:09301 // Skip tiles already present in personal or whitelists.
atanasova9514b302016-02-26 23:09:28302 if (hosts.find(host) != hosts.end())
knncbbd754d2015-09-09 15:43:40303 continue;
treibcffa6502015-08-06 09:12:27304
sfiera635d21d2016-08-04 07:56:09305 NTPTile tile;
306 tile.title = popular_site.title;
307 tile.url = GURL(popular_site.url);
308 tile.source = NTPTileSource::POPULAR;
atanasovac3c25d12016-03-17 18:33:57309
sfiera635d21d2016-08-04 07:56:09310 popular_sites_tiles.push_back(std::move(tile));
sfieraae1ae692016-10-24 18:19:15311 icon_cacher_->StartFetch(
312 popular_site, base::Bind(&MostVisitedSites::OnIconMadeAvailable,
313 base::Unretained(this), popular_site.url));
sfiera635d21d2016-08-04 07:56:09314 if (popular_sites_tiles.size() >= num_popular_sites_tiles)
knncbbd754d2015-09-09 15:43:40315 break;
316 }
treibcffa6502015-08-06 09:12:27317 }
sfiera635d21d2016-08-04 07:56:09318 return popular_sites_tiles;
atanasova9572aaf2016-02-26 18:08:26319}
320
sfiera635d21d2016-08-04 07:56:09321void MostVisitedSites::SaveNewTiles(NTPTilesVector personal_tiles) {
322 NTPTilesVector whitelist_tiles =
323 CreateWhitelistEntryPointTiles(personal_tiles);
324 NTPTilesVector popular_sites_tiles =
325 CreatePopularSitesTiles(personal_tiles, whitelist_tiles);
treib5a59f542016-05-18 12:17:29326
sfiera635d21d2016-08-04 07:56:09327 size_t num_actual_tiles = personal_tiles.size() + whitelist_tiles.size() +
328 popular_sites_tiles.size();
treib5a59f542016-05-18 12:17:29329 DCHECK_LE(num_actual_tiles, static_cast<size_t>(num_sites_));
330
sfiera635d21d2016-08-04 07:56:09331 current_tiles_ =
332 MergeTiles(std::move(personal_tiles), std::move(whitelist_tiles),
333 std::move(popular_sites_tiles));
334 DCHECK_EQ(num_actual_tiles, current_tiles_.size());
treib5a59f542016-05-18 12:17:29335
sfiera635d21d2016-08-04 07:56:09336 int num_personal_tiles = 0;
337 for (const auto& tile : current_tiles_) {
338 if (tile.source != NTPTileSource::POPULAR)
339 num_personal_tiles++;
treibcd3d2ef2016-07-13 16:53:31340 }
sfiera635d21d2016-08-04 07:56:09341 prefs_->SetInteger(prefs::kNumPersonalTiles, num_personal_tiles);
treibcf674e62015-08-17 15:43:01342}
343
344// static
sfiera635d21d2016-08-04 07:56:09345NTPTilesVector MostVisitedSites::MergeTiles(NTPTilesVector personal_tiles,
346 NTPTilesVector whitelist_tiles,
347 NTPTilesVector popular_tiles) {
348 NTPTilesVector merged_tiles;
349 std::move(personal_tiles.begin(), personal_tiles.end(),
350 std::back_inserter(merged_tiles));
351 std::move(whitelist_tiles.begin(), whitelist_tiles.end(),
352 std::back_inserter(merged_tiles));
353 std::move(popular_tiles.begin(), popular_tiles.end(),
354 std::back_inserter(merged_tiles));
355 return merged_tiles;
treibcffa6502015-08-06 09:12:27356}
357
knncbbd754d2015-09-09 15:43:40358void MostVisitedSites::NotifyMostVisitedURLsObserver() {
sfiera1e7993c62016-04-18 09:43:26359 if (!observer_)
treib16070ce2016-03-11 11:57:40360 return;
361
sfiera635d21d2016-08-04 07:56:09362 observer_->OnMostVisitedURLsAvailable(current_tiles_);
[email protected]bc093e82014-03-04 21:49:11363}
364
treibcffa6502015-08-06 09:12:27365void MostVisitedSites::OnPopularSitesAvailable(bool success) {
treibcffa6502015-08-06 09:12:27366 if (!success) {
367 LOG(WARNING) << "Download of popular sites failed";
368 return;
369 }
370
sfiera635d21d2016-08-04 07:56:09371 // Re-build the tile list. Once done, this will notify the observer.
372 BuildCurrentTiles();
treibcffa6502015-08-06 09:12:27373}
374
sfieraae1ae692016-10-24 18:19:15375void MostVisitedSites::OnIconMadeAvailable(const GURL& site_url,
376 bool newly_available) {
377 if (newly_available)
378 observer_->OnIconMadeAvailable(site_url);
379}
380
treib16070ce2016-03-11 11:57:40381void MostVisitedSites::TopSitesLoaded(TopSites* top_sites) {}
sdefresneedf9e01f2015-01-13 19:45:41382
treib16070ce2016-03-11 11:57:40383void MostVisitedSites::TopSitesChanged(TopSites* top_sites,
fserbdb575112015-06-29 21:31:59384 ChangeReason change_reason) {
sfiera635d21d2016-08-04 07:56:09385 if (mv_source_ == NTPTileSource::TOP_SITES) {
386 // The displayed tiles are invalidated.
newt2a47ce72015-10-01 20:09:49387 InitiateTopSitesQuery();
sdefresneedf9e01f2015-01-13 19:45:41388 }
389}
sfiera08009fe2016-06-15 17:07:26390
391} // namespace ntp_tiles