| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/ntp_tiles/most_visited_sites.h" | 5 #include "components/ntp_tiles/most_visited_sites.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <set> | 8 #include <set> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 56 std::unique_ptr<MostVisitedSitesSupervisor> supervisor) | 56 std::unique_ptr<MostVisitedSitesSupervisor> supervisor) |
| 57 : prefs_(prefs), | 57 : prefs_(prefs), |
| 58 top_sites_(top_sites), | 58 top_sites_(top_sites), |
| 59 suggestions_service_(suggestions), | 59 suggestions_service_(suggestions), |
| 60 popular_sites_(std::move(popular_sites)), | 60 popular_sites_(std::move(popular_sites)), |
| 61 icon_cacher_(std::move(icon_cacher)), | 61 icon_cacher_(std::move(icon_cacher)), |
| 62 supervisor_(std::move(supervisor)), | 62 supervisor_(std::move(supervisor)), |
| 63 observer_(nullptr), | 63 observer_(nullptr), |
| 64 num_sites_(0), | 64 num_sites_(0), |
| 65 top_sites_observer_(this), | 65 top_sites_observer_(this), |
| 66 mv_source_(NTPTileSource::TOP_SITES), | 66 mv_source_(TileSource::TOP_SITES), |
| 67 top_sites_weak_ptr_factory_(this) { | 67 top_sites_weak_ptr_factory_(this) { |
| 68 DCHECK(prefs_); | 68 DCHECK(prefs_); |
| 69 // top_sites_ can be null in tests. | 69 // top_sites_ can be null in tests. |
| 70 // TODO(sfiera): have iOS use a dummy TopSites in its tests. | 70 // TODO(sfiera): have iOS use a dummy TopSites in its tests. |
| 71 DCHECK(suggestions_service_); | 71 DCHECK(suggestions_service_); |
| 72 if (supervisor_) | 72 if (supervisor_) |
| 73 supervisor_->SetObserver(this); | 73 supervisor_->SetObserver(this); |
| 74 } | 74 } |
| 75 | 75 |
| 76 MostVisitedSites::~MostVisitedSites() { | 76 MostVisitedSites::~MostVisitedSites() { |
| 77 if (supervisor_) | 77 if (supervisor_) |
| 78 supervisor_->SetObserver(nullptr); | 78 supervisor_->SetObserver(nullptr); |
| 79 } | 79 } |
| 80 | 80 |
| 81 bool MostVisitedSites::DoesSourceExist(NTPTileSource source) const { | 81 bool MostVisitedSites::DoesSourceExist(TileSource source) const { |
| 82 switch (source) { | 82 switch (source) { |
| 83 case NTPTileSource::TOP_SITES: | 83 case TileSource::TOP_SITES: |
| 84 return top_sites_ != nullptr; | 84 return top_sites_ != nullptr; |
| 85 case NTPTileSource::SUGGESTIONS_SERVICE: | 85 case TileSource::SUGGESTIONS_SERVICE: |
| 86 return suggestions_service_ != nullptr; | 86 return suggestions_service_ != nullptr; |
| 87 case NTPTileSource::POPULAR: | 87 case TileSource::POPULAR: |
| 88 return popular_sites_ != nullptr; | 88 return popular_sites_ != nullptr; |
| 89 case NTPTileSource::WHITELIST: | 89 case TileSource::WHITELIST: |
| 90 return supervisor_ != nullptr; | 90 return supervisor_ != nullptr; |
| 91 } | 91 } |
| 92 NOTREACHED(); | 92 NOTREACHED(); |
| 93 return false; | 93 return false; |
| 94 } | 94 } |
| 95 | 95 |
| 96 void MostVisitedSites::SetMostVisitedURLsObserver(Observer* observer, | 96 void MostVisitedSites::SetMostVisitedURLsObserver(Observer* observer, |
| 97 int num_sites) { | 97 int num_sites) { |
| 98 DCHECK(observer); | 98 DCHECK(observer); |
| 99 observer_ = observer; | 99 observer_ = observer; |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 136 bool add_url) { | 136 bool add_url) { |
| 137 if (top_sites_) { | 137 if (top_sites_) { |
| 138 // Always blacklist in the local TopSites. | 138 // Always blacklist in the local TopSites. |
| 139 if (add_url) | 139 if (add_url) |
| 140 top_sites_->AddBlacklistedURL(url); | 140 top_sites_->AddBlacklistedURL(url); |
| 141 else | 141 else |
| 142 top_sites_->RemoveBlacklistedURL(url); | 142 top_sites_->RemoveBlacklistedURL(url); |
| 143 } | 143 } |
| 144 | 144 |
| 145 // Only blacklist in the server-side suggestions service if it's active. | 145 // Only blacklist in the server-side suggestions service if it's active. |
| 146 if (mv_source_ == NTPTileSource::SUGGESTIONS_SERVICE) { | 146 if (mv_source_ == TileSource::SUGGESTIONS_SERVICE) { |
| 147 if (add_url) | 147 if (add_url) |
| 148 suggestions_service_->BlacklistURL(url); | 148 suggestions_service_->BlacklistURL(url); |
| 149 else | 149 else |
| 150 suggestions_service_->UndoBlacklistURL(url); | 150 suggestions_service_->UndoBlacklistURL(url); |
| 151 } | 151 } |
| 152 } | 152 } |
| 153 | 153 |
| 154 void MostVisitedSites::ClearBlacklistedUrls() { | 154 void MostVisitedSites::ClearBlacklistedUrls() { |
| 155 if (top_sites_) { | 155 if (top_sites_) { |
| 156 // Always update the blacklist in the local TopSites. | 156 // Always update the blacklist in the local TopSites. |
| 157 top_sites_->ClearBlacklistedURLs(); | 157 top_sites_->ClearBlacklistedURLs(); |
| 158 } | 158 } |
| 159 | 159 |
| 160 // Only update the server-side blacklist if it's active. | 160 // Only update the server-side blacklist if it's active. |
| 161 if (mv_source_ == NTPTileSource::SUGGESTIONS_SERVICE) { | 161 if (mv_source_ == TileSource::SUGGESTIONS_SERVICE) { |
| 162 suggestions_service_->ClearBlacklist(); | 162 suggestions_service_->ClearBlacklist(); |
| 163 } | 163 } |
| 164 } | 164 } |
| 165 | 165 |
| 166 void MostVisitedSites::OnBlockedSitesChanged() { | 166 void MostVisitedSites::OnBlockedSitesChanged() { |
| 167 BuildCurrentTiles(); | 167 BuildCurrentTiles(); |
| 168 } | 168 } |
| 169 | 169 |
| 170 // static | 170 // static |
| 171 void MostVisitedSites::RegisterProfilePrefs( | 171 void MostVisitedSites::RegisterProfilePrefs( |
| (...skipping 19 matching lines...) Expand all Loading... |
| 191 return whitelist.large_icon_path; | 191 return whitelist.large_icon_path; |
| 192 } | 192 } |
| 193 } | 193 } |
| 194 return base::FilePath(); | 194 return base::FilePath(); |
| 195 } | 195 } |
| 196 | 196 |
| 197 void MostVisitedSites::OnMostVisitedURLsAvailable( | 197 void MostVisitedSites::OnMostVisitedURLsAvailable( |
| 198 const history::MostVisitedURLList& visited_list) { | 198 const history::MostVisitedURLList& visited_list) { |
| 199 // Ignore the event if tiles provided by the Suggestions Service, which take | 199 // Ignore the event if tiles provided by the Suggestions Service, which take |
| 200 // precedence. | 200 // precedence. |
| 201 if (mv_source_ == NTPTileSource::SUGGESTIONS_SERVICE) { | 201 if (mv_source_ == TileSource::SUGGESTIONS_SERVICE) { |
| 202 return; | 202 return; |
| 203 } | 203 } |
| 204 | 204 |
| 205 NTPTilesVector tiles; | 205 NTPTilesVector tiles; |
| 206 size_t num_tiles = | 206 size_t num_tiles = |
| 207 std::min(visited_list.size(), static_cast<size_t>(num_sites_)); | 207 std::min(visited_list.size(), static_cast<size_t>(num_sites_)); |
| 208 for (size_t i = 0; i < num_tiles; ++i) { | 208 for (size_t i = 0; i < num_tiles; ++i) { |
| 209 const history::MostVisitedURL& visited = visited_list[i]; | 209 const history::MostVisitedURL& visited = visited_list[i]; |
| 210 if (visited.url.is_empty()) | 210 if (visited.url.is_empty()) |
| 211 break; // This is the signal that there are no more real visited sites. | 211 break; // This is the signal that there are no more real visited sites. |
| 212 if (supervisor_ && supervisor_->IsBlocked(visited.url)) | 212 if (supervisor_ && supervisor_->IsBlocked(visited.url)) |
| 213 continue; | 213 continue; |
| 214 | 214 |
| 215 NTPTile tile; | 215 NTPTile tile; |
| 216 tile.title = visited.title; | 216 tile.title = visited.title; |
| 217 tile.url = visited.url; | 217 tile.url = visited.url; |
| 218 tile.source = NTPTileSource::TOP_SITES; | 218 tile.source = TileSource::TOP_SITES; |
| 219 tile.whitelist_icon_path = GetWhitelistLargeIconPath(visited.url); | 219 tile.whitelist_icon_path = GetWhitelistLargeIconPath(visited.url); |
| 220 | 220 |
| 221 tiles.push_back(std::move(tile)); | 221 tiles.push_back(std::move(tile)); |
| 222 } | 222 } |
| 223 | 223 |
| 224 mv_source_ = NTPTileSource::TOP_SITES; | 224 mv_source_ = TileSource::TOP_SITES; |
| 225 SaveNewTilesAndNotify(std::move(tiles)); | 225 SaveNewTilesAndNotify(std::move(tiles)); |
| 226 } | 226 } |
| 227 | 227 |
| 228 void MostVisitedSites::OnSuggestionsProfileChanged( | 228 void MostVisitedSites::OnSuggestionsProfileChanged( |
| 229 const SuggestionsProfile& suggestions_profile) { | 229 const SuggestionsProfile& suggestions_profile) { |
| 230 if (suggestions_profile.suggestions_size() == 0 && | 230 if (suggestions_profile.suggestions_size() == 0 && |
| 231 mv_source_ != NTPTileSource::SUGGESTIONS_SERVICE) { | 231 mv_source_ != TileSource::SUGGESTIONS_SERVICE) { |
| 232 return; | 232 return; |
| 233 } | 233 } |
| 234 | 234 |
| 235 BuildCurrentTilesGivenSuggestionsProfile(suggestions_profile); | 235 BuildCurrentTilesGivenSuggestionsProfile(suggestions_profile); |
| 236 } | 236 } |
| 237 | 237 |
| 238 void MostVisitedSites::BuildCurrentTiles() { | 238 void MostVisitedSites::BuildCurrentTiles() { |
| 239 BuildCurrentTilesGivenSuggestionsProfile( | 239 BuildCurrentTilesGivenSuggestionsProfile( |
| 240 suggestions_service_->GetSuggestionsDataFromCache().value_or( | 240 suggestions_service_->GetSuggestionsDataFromCache().value_or( |
| 241 SuggestionsProfile())); | 241 SuggestionsProfile())); |
| 242 } | 242 } |
| 243 | 243 |
| 244 void MostVisitedSites::BuildCurrentTilesGivenSuggestionsProfile( | 244 void MostVisitedSites::BuildCurrentTilesGivenSuggestionsProfile( |
| 245 const suggestions::SuggestionsProfile& suggestions_profile) { | 245 const suggestions::SuggestionsProfile& suggestions_profile) { |
| 246 int num_tiles = suggestions_profile.suggestions_size(); | 246 int num_tiles = suggestions_profile.suggestions_size(); |
| 247 // With no server suggestions, fall back to local TopSites. | 247 // With no server suggestions, fall back to local TopSites. |
| 248 if (num_tiles == 0 || | 248 if (num_tiles == 0 || |
| 249 !base::FeatureList::IsEnabled(kDisplaySuggestionsServiceTiles)) { | 249 !base::FeatureList::IsEnabled(kDisplaySuggestionsServiceTiles)) { |
| 250 mv_source_ = NTPTileSource::TOP_SITES; | 250 mv_source_ = TileSource::TOP_SITES; |
| 251 InitiateTopSitesQuery(); | 251 InitiateTopSitesQuery(); |
| 252 return; | 252 return; |
| 253 } | 253 } |
| 254 if (num_sites_ < num_tiles) | 254 if (num_sites_ < num_tiles) |
| 255 num_tiles = num_sites_; | 255 num_tiles = num_sites_; |
| 256 | 256 |
| 257 NTPTilesVector tiles; | 257 NTPTilesVector tiles; |
| 258 for (int i = 0; i < num_tiles; ++i) { | 258 for (int i = 0; i < num_tiles; ++i) { |
| 259 const ChromeSuggestion& suggestion_pb = suggestions_profile.suggestions(i); | 259 const ChromeSuggestion& suggestion_pb = suggestions_profile.suggestions(i); |
| 260 GURL url(suggestion_pb.url()); | 260 GURL url(suggestion_pb.url()); |
| 261 if (supervisor_ && supervisor_->IsBlocked(url)) | 261 if (supervisor_ && supervisor_->IsBlocked(url)) |
| 262 continue; | 262 continue; |
| 263 | 263 |
| 264 NTPTile tile; | 264 NTPTile tile; |
| 265 tile.title = base::UTF8ToUTF16(suggestion_pb.title()); | 265 tile.title = base::UTF8ToUTF16(suggestion_pb.title()); |
| 266 tile.url = url; | 266 tile.url = url; |
| 267 tile.source = NTPTileSource::SUGGESTIONS_SERVICE; | 267 tile.source = TileSource::SUGGESTIONS_SERVICE; |
| 268 tile.whitelist_icon_path = GetWhitelistLargeIconPath(url); | 268 tile.whitelist_icon_path = GetWhitelistLargeIconPath(url); |
| 269 tile.thumbnail_url = GURL(suggestion_pb.thumbnail()); | 269 tile.thumbnail_url = GURL(suggestion_pb.thumbnail()); |
| 270 tile.favicon_url = GURL(suggestion_pb.favicon_url()); | 270 tile.favicon_url = GURL(suggestion_pb.favicon_url()); |
| 271 | 271 |
| 272 tiles.push_back(std::move(tile)); | 272 tiles.push_back(std::move(tile)); |
| 273 } | 273 } |
| 274 | 274 |
| 275 mv_source_ = NTPTileSource::SUGGESTIONS_SERVICE; | 275 mv_source_ = TileSource::SUGGESTIONS_SERVICE; |
| 276 SaveNewTilesAndNotify(std::move(tiles)); | 276 SaveNewTilesAndNotify(std::move(tiles)); |
| 277 } | 277 } |
| 278 | 278 |
| 279 NTPTilesVector MostVisitedSites::CreateWhitelistEntryPointTiles( | 279 NTPTilesVector MostVisitedSites::CreateWhitelistEntryPointTiles( |
| 280 const NTPTilesVector& personal_tiles) { | 280 const NTPTilesVector& personal_tiles) { |
| 281 if (!supervisor_) { | 281 if (!supervisor_) { |
| 282 return NTPTilesVector(); | 282 return NTPTilesVector(); |
| 283 } | 283 } |
| 284 | 284 |
| 285 size_t num_personal_tiles = personal_tiles.size(); | 285 size_t num_personal_tiles = personal_tiles.size(); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 305 personal_hosts.end()) | 305 personal_hosts.end()) |
| 306 continue; | 306 continue; |
| 307 | 307 |
| 308 // Skip whitelist entry points that are manually blocked. | 308 // Skip whitelist entry points that are manually blocked. |
| 309 if (supervisor_->IsBlocked(whitelist.entry_point)) | 309 if (supervisor_->IsBlocked(whitelist.entry_point)) |
| 310 continue; | 310 continue; |
| 311 | 311 |
| 312 NTPTile tile; | 312 NTPTile tile; |
| 313 tile.title = whitelist.title; | 313 tile.title = whitelist.title; |
| 314 tile.url = whitelist.entry_point; | 314 tile.url = whitelist.entry_point; |
| 315 tile.source = NTPTileSource::WHITELIST; | 315 tile.source = TileSource::WHITELIST; |
| 316 tile.whitelist_icon_path = whitelist.large_icon_path; | 316 tile.whitelist_icon_path = whitelist.large_icon_path; |
| 317 whitelist_tiles.push_back(std::move(tile)); | 317 whitelist_tiles.push_back(std::move(tile)); |
| 318 } | 318 } |
| 319 | 319 |
| 320 return whitelist_tiles; | 320 return whitelist_tiles; |
| 321 } | 321 } |
| 322 | 322 |
| 323 NTPTilesVector MostVisitedSites::CreatePopularSitesTiles( | 323 NTPTilesVector MostVisitedSites::CreatePopularSitesTiles( |
| 324 const NTPTilesVector& personal_tiles, | 324 const NTPTilesVector& personal_tiles, |
| 325 const NTPTilesVector& whitelist_tiles) { | 325 const NTPTilesVector& whitelist_tiles) { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 347 if (top_sites_ && top_sites_->IsBlacklisted(popular_site.url)) | 347 if (top_sites_ && top_sites_->IsBlacklisted(popular_site.url)) |
| 348 continue; | 348 continue; |
| 349 std::string host = popular_site.url.host(); | 349 std::string host = popular_site.url.host(); |
| 350 // Skip tiles already present in personal or whitelists. | 350 // Skip tiles already present in personal or whitelists. |
| 351 if (hosts.find(host) != hosts.end()) | 351 if (hosts.find(host) != hosts.end()) |
| 352 continue; | 352 continue; |
| 353 | 353 |
| 354 NTPTile tile; | 354 NTPTile tile; |
| 355 tile.title = popular_site.title; | 355 tile.title = popular_site.title; |
| 356 tile.url = GURL(popular_site.url); | 356 tile.url = GURL(popular_site.url); |
| 357 tile.source = NTPTileSource::POPULAR; | 357 tile.source = TileSource::POPULAR; |
| 358 | 358 |
| 359 popular_sites_tiles.push_back(std::move(tile)); | 359 popular_sites_tiles.push_back(std::move(tile)); |
| 360 base::Closure icon_available = | 360 base::Closure icon_available = |
| 361 base::Bind(&MostVisitedSites::OnIconMadeAvailable, | 361 base::Bind(&MostVisitedSites::OnIconMadeAvailable, |
| 362 base::Unretained(this), popular_site.url); | 362 base::Unretained(this), popular_site.url); |
| 363 icon_cacher_->StartFetch(popular_site, icon_available, icon_available); | 363 icon_cacher_->StartFetch(popular_site, icon_available, icon_available); |
| 364 if (popular_sites_tiles.size() >= num_popular_sites_tiles) | 364 if (popular_sites_tiles.size() >= num_popular_sites_tiles) |
| 365 break; | 365 break; |
| 366 } | 366 } |
| 367 } | 367 } |
| (...skipping 15 matching lines...) Expand all Loading... |
| 383 std::move(popular_sites_tiles)); | 383 std::move(popular_sites_tiles)); |
| 384 if (current_tiles_.has_value() && (*current_tiles_ == new_tiles)) { | 384 if (current_tiles_.has_value() && (*current_tiles_ == new_tiles)) { |
| 385 return; | 385 return; |
| 386 } | 386 } |
| 387 | 387 |
| 388 current_tiles_.emplace(std::move(new_tiles)); | 388 current_tiles_.emplace(std::move(new_tiles)); |
| 389 DCHECK_EQ(num_actual_tiles, current_tiles_->size()); | 389 DCHECK_EQ(num_actual_tiles, current_tiles_->size()); |
| 390 | 390 |
| 391 int num_personal_tiles = 0; | 391 int num_personal_tiles = 0; |
| 392 for (const auto& tile : *current_tiles_) { | 392 for (const auto& tile : *current_tiles_) { |
| 393 if (tile.source != NTPTileSource::POPULAR) | 393 if (tile.source != TileSource::POPULAR) |
| 394 num_personal_tiles++; | 394 num_personal_tiles++; |
| 395 } | 395 } |
| 396 prefs_->SetInteger(prefs::kNumPersonalTiles, num_personal_tiles); | 396 prefs_->SetInteger(prefs::kNumPersonalTiles, num_personal_tiles); |
| 397 | 397 |
| 398 if (!observer_) | 398 if (!observer_) |
| 399 return; | 399 return; |
| 400 observer_->OnMostVisitedURLsAvailable(*current_tiles_); | 400 observer_->OnMostVisitedURLsAvailable(*current_tiles_); |
| 401 } | 401 } |
| 402 | 402 |
| 403 // static | 403 // static |
| (...skipping 23 matching lines...) Expand all Loading... |
| 427 } | 427 } |
| 428 | 428 |
| 429 void MostVisitedSites::OnIconMadeAvailable(const GURL& site_url) { | 429 void MostVisitedSites::OnIconMadeAvailable(const GURL& site_url) { |
| 430 observer_->OnIconMadeAvailable(site_url); | 430 observer_->OnIconMadeAvailable(site_url); |
| 431 } | 431 } |
| 432 | 432 |
| 433 void MostVisitedSites::TopSitesLoaded(TopSites* top_sites) {} | 433 void MostVisitedSites::TopSitesLoaded(TopSites* top_sites) {} |
| 434 | 434 |
| 435 void MostVisitedSites::TopSitesChanged(TopSites* top_sites, | 435 void MostVisitedSites::TopSitesChanged(TopSites* top_sites, |
| 436 ChangeReason change_reason) { | 436 ChangeReason change_reason) { |
| 437 if (mv_source_ == NTPTileSource::TOP_SITES) { | 437 if (mv_source_ == TileSource::TOP_SITES) { |
| 438 // The displayed tiles are invalidated. | 438 // The displayed tiles are invalidated. |
| 439 InitiateTopSitesQuery(); | 439 InitiateTopSitesQuery(); |
| 440 } | 440 } |
| 441 } | 441 } |
| 442 | 442 |
| 443 } // namespace ntp_tiles | 443 } // namespace ntp_tiles |
| OLD | NEW |