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 "chrome/browser/android/ntp/most_visited_sites.h" | 5 #include "chrome/browser/android/ntp/most_visited_sites.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/callback.h" | 9 #include "base/callback.h" |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
11 #include "base/metrics/field_trial.h" | 11 #include "base/metrics/field_trial.h" |
12 #include "base/metrics/histogram.h" | 12 #include "base/metrics/histogram.h" |
13 #include "base/metrics/sparse_histogram.h" | 13 #include "base/metrics/sparse_histogram.h" |
14 #include "base/strings/string_number_conversions.h" | 14 #include "base/strings/string_number_conversions.h" |
15 #include "base/strings/string_util.h" | 15 #include "base/strings/string_util.h" |
16 #include "base/strings/stringprintf.h" | 16 #include "base/strings/stringprintf.h" |
17 #include "base/strings/utf_string_conversions.h" | 17 #include "base/strings/utf_string_conversions.h" |
18 #include "base/time/time.h" | 18 #include "base/time/time.h" |
19 #include "chrome/browser/history/top_sites_factory.h" | |
20 #include "chrome/browser/profiles/profile.h" | |
21 #include "chrome/browser/search/suggestions/suggestions_service_factory.h" | |
22 #include "chrome/browser/search_engines/template_url_service_factory.h" | |
23 #include "chrome/browser/supervised_user/supervised_user_service.h" | 19 #include "chrome/browser/supervised_user/supervised_user_service.h" |
24 #include "chrome/browser/supervised_user/supervised_user_service_factory.h" | 20 #include "chrome/browser/supervised_user/supervised_user_service_factory.h" |
25 #include "chrome/browser/supervised_user/supervised_user_url_filter.h" | 21 #include "chrome/browser/supervised_user/supervised_user_url_filter.h" |
26 #include "chrome/browser/thumbnails/thumbnail_list_source.h" | |
27 #include "components/history/core/browser/top_sites.h" | 22 #include "components/history/core/browser/top_sites.h" |
28 #include "components/ntp_tiles/pref_names.h" | 23 #include "components/ntp_tiles/pref_names.h" |
29 #include "components/ntp_tiles/switches.h" | 24 #include "components/ntp_tiles/switches.h" |
30 #include "components/pref_registry/pref_registry_syncable.h" | 25 #include "components/pref_registry/pref_registry_syncable.h" |
31 #include "components/prefs/pref_service.h" | 26 #include "components/prefs/pref_service.h" |
32 #include "components/variations/variations_associated_data.h" | 27 #include "components/variations/variations_associated_data.h" |
33 #include "content/public/browser/browser_thread.h" | 28 #include "content/public/browser/browser_thread.h" |
34 #include "content/public/browser/url_data_source.h" | |
35 #include "third_party/skia/include/core/SkBitmap.h" | 29 #include "third_party/skia/include/core/SkBitmap.h" |
36 #include "ui/gfx/codec/jpeg_codec.h" | 30 #include "ui/gfx/codec/jpeg_codec.h" |
37 #include "url/gurl.h" | 31 #include "url/gurl.h" |
38 | 32 |
39 using content::BrowserThread; | 33 using content::BrowserThread; |
40 using history::TopSites; | 34 using history::TopSites; |
41 using suggestions::ChromeSuggestion; | 35 using suggestions::ChromeSuggestion; |
42 using suggestions::SuggestionsProfile; | 36 using suggestions::SuggestionsProfile; |
43 using suggestions::SuggestionsServiceFactory; | 37 using suggestions::SuggestionsService; |
44 | 38 |
45 namespace { | 39 namespace { |
46 | 40 |
47 // Identifiers for the various tile sources. | 41 // Identifiers for the various tile sources. |
48 const char kHistogramClientName[] = "client"; | 42 const char kHistogramClientName[] = "client"; |
49 const char kHistogramServerName[] = "server"; | 43 const char kHistogramServerName[] = "server"; |
50 const char kHistogramServerFormat[] = "server%d"; | 44 const char kHistogramServerFormat[] = "server%d"; |
51 const char kHistogramPopularName[] = "popular"; | 45 const char kHistogramPopularName[] = "popular"; |
52 const char kHistogramWhitelistName[] = "whitelist"; | 46 const char kHistogramWhitelistName[] = "whitelist"; |
53 | 47 |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
171 | 165 |
172 MostVisitedSites::Suggestion::Suggestion() : provider_index(-1) {} | 166 MostVisitedSites::Suggestion::Suggestion() : provider_index(-1) {} |
173 | 167 |
174 MostVisitedSites::Suggestion::~Suggestion() {} | 168 MostVisitedSites::Suggestion::~Suggestion() {} |
175 | 169 |
176 MostVisitedSites::Suggestion::Suggestion(Suggestion&&) = default; | 170 MostVisitedSites::Suggestion::Suggestion(Suggestion&&) = default; |
177 MostVisitedSites::Suggestion& | 171 MostVisitedSites::Suggestion& |
178 MostVisitedSites::Suggestion::operator=(Suggestion&&) = default; | 172 MostVisitedSites::Suggestion::operator=(Suggestion&&) = default; |
179 | 173 |
180 MostVisitedSites::MostVisitedSites( | 174 MostVisitedSites::MostVisitedSites( |
181 Profile* profile, | 175 PrefService* prefs, |
182 variations::VariationsService* variations_service) | 176 const TemplateURLService* template_url_service, |
183 : profile_(profile), variations_service_(variations_service), | 177 variations::VariationsService* variations_service, |
184 top_sites_(TopSitesFactory::GetForProfile(profile)), | 178 net::URLRequestContextGetter* download_context, |
185 suggestions_service_(SuggestionsServiceFactory::GetForProfile(profile_)), | 179 scoped_refptr<history::TopSites> top_sites, |
186 observer_(nullptr), num_sites_(0), | 180 SuggestionsService* suggestions, |
181 bool is_child, | |
182 Profile* profile) | |
183 : profile_(profile), download_context_(download_context), | |
184 top_sites_(top_sites), suggestions_service_(suggestions), | |
185 is_child_(is_child), observer_(nullptr), num_sites_(0), | |
187 received_most_visited_sites_(false), received_popular_sites_(false), | 186 received_most_visited_sites_(false), received_popular_sites_(false), |
188 recorded_uma_(false), scoped_observer_(this), | 187 recorded_uma_(false), |
189 mv_source_(SUGGESTIONS_SERVICE), weak_ptr_factory_(this) { | 188 scoped_observer_(this), mv_source_(SUGGESTIONS_SERVICE), |
Marc Treib
2016/05/02 11:30:40
nit: I think we can save a line here.
sfiera
2016/05/03 13:26:12
Done.
| |
190 // Register the thumbnails debugging page. | 189 weak_ptr_factory_(this) { |
191 content::URLDataSource::Add(profile_, new ThumbnailListSource(profile_)); | |
192 | |
193 SupervisedUserService* supervised_user_service = | 190 SupervisedUserService* supervised_user_service = |
194 SupervisedUserServiceFactory::GetForProfile(profile_); | 191 SupervisedUserServiceFactory::GetForProfile(profile_); |
195 supervised_user_service->AddObserver(this); | 192 supervised_user_service->AddObserver(this); |
196 } | 193 } |
197 | 194 |
198 MostVisitedSites::~MostVisitedSites() { | 195 MostVisitedSites::~MostVisitedSites() { |
199 SupervisedUserService* supervised_user_service = | 196 SupervisedUserService* supervised_user_service = |
200 SupervisedUserServiceFactory::GetForProfile(profile_); | 197 SupervisedUserServiceFactory::GetForProfile(profile_); |
201 supervised_user_service->RemoveObserver(this); | 198 supervised_user_service->RemoveObserver(this); |
202 } | 199 } |
203 | 200 |
204 void MostVisitedSites::SetMostVisitedURLsObserver( | 201 void MostVisitedSites::SetMostVisitedURLsObserver( |
205 MostVisitedSites::Observer* observer, int num_sites) { | 202 MostVisitedSites::Observer* observer, int num_sites) { |
206 DCHECK(observer); | 203 DCHECK(observer); |
207 observer_ = observer; | 204 observer_ = observer; |
208 num_sites_ = num_sites; | 205 num_sites_ = num_sites; |
209 | 206 |
210 if (ShouldShowPopularSites() && | 207 if (ShouldShowPopularSites() && |
211 NeedPopularSites(profile_->GetPrefs(), num_sites_)) { | 208 NeedPopularSites(prefs_, num_sites_)) { |
212 popular_sites_.reset(new PopularSites( | 209 popular_sites_.reset(new PopularSites( |
213 profile_->GetPrefs(), | 210 prefs_, |
214 TemplateURLServiceFactory::GetForProfile(profile_), | 211 template_url_service_, |
215 variations_service_, | 212 variations_service_, |
216 profile_->GetRequestContext(), | 213 download_context_, |
217 GetPopularSitesCountry(), | 214 GetPopularSitesCountry(), |
218 GetPopularSitesVersion(), | 215 GetPopularSitesVersion(), |
219 false, | 216 false, |
220 base::Bind(&MostVisitedSites::OnPopularSitesAvailable, | 217 base::Bind(&MostVisitedSites::OnPopularSitesAvailable, |
221 base::Unretained(this)))); | 218 base::Unretained(this)))); |
222 } else { | 219 } else { |
223 received_popular_sites_ = true; | 220 received_popular_sites_ = true; |
224 } | 221 } |
225 | 222 |
226 if (top_sites_) { | 223 if (top_sites_) { |
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
512 } | 509 } |
513 | 510 |
514 return whitelist_suggestions; | 511 return whitelist_suggestions; |
515 } | 512 } |
516 | 513 |
517 MostVisitedSites::SuggestionsPtrVector | 514 MostVisitedSites::SuggestionsPtrVector |
518 MostVisitedSites::CreatePopularSitesSuggestions( | 515 MostVisitedSites::CreatePopularSitesSuggestions( |
519 const MostVisitedSites::SuggestionsPtrVector& personal_suggestions, | 516 const MostVisitedSites::SuggestionsPtrVector& personal_suggestions, |
520 const MostVisitedSites::SuggestionsPtrVector& whitelist_suggestions) { | 517 const MostVisitedSites::SuggestionsPtrVector& whitelist_suggestions) { |
521 // For child accounts popular sites suggestions will not be added. | 518 // For child accounts popular sites suggestions will not be added. |
522 if (profile_->IsChild()) | 519 if (is_child_) |
523 return MostVisitedSites::SuggestionsPtrVector(); | 520 return MostVisitedSites::SuggestionsPtrVector(); |
524 | 521 |
525 size_t num_suggestions = | 522 size_t num_suggestions = |
526 personal_suggestions.size() + whitelist_suggestions.size(); | 523 personal_suggestions.size() + whitelist_suggestions.size(); |
527 DCHECK_LE(num_suggestions, static_cast<size_t>(num_sites_)); | 524 DCHECK_LE(num_suggestions, static_cast<size_t>(num_sites_)); |
528 | 525 |
529 // Collect non-blacklisted popular suggestions, skipping those already present | 526 // Collect non-blacklisted popular suggestions, skipping those already present |
530 // in the personal suggestions. | 527 // in the personal suggestions. |
531 size_t num_popular_sites_suggestions = num_sites_ - num_suggestions; | 528 size_t num_popular_sites_suggestions = num_sites_ - num_suggestions; |
532 MostVisitedSites::SuggestionsPtrVector popular_sites_suggestions; | 529 MostVisitedSites::SuggestionsPtrVector popular_sites_suggestions; |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
635 // Insert leftover popular suggestions. | 632 // Insert leftover popular suggestions. |
636 InsertAllSuggestions(filled_so_far, new_popular_suggestions, | 633 InsertAllSuggestions(filled_so_far, new_popular_suggestions, |
637 popular_suggestions, &merged_suggestions); | 634 popular_suggestions, &merged_suggestions); |
638 return merged_suggestions; | 635 return merged_suggestions; |
639 } | 636 } |
640 | 637 |
641 void MostVisitedSites::GetPreviousNTPSites( | 638 void MostVisitedSites::GetPreviousNTPSites( |
642 size_t num_tiles, | 639 size_t num_tiles, |
643 std::vector<std::string>* old_sites_url, | 640 std::vector<std::string>* old_sites_url, |
644 std::vector<bool>* old_sites_is_personal) const { | 641 std::vector<bool>* old_sites_is_personal) const { |
645 const PrefService* prefs = profile_->GetPrefs(); | 642 const base::ListValue* url_list = prefs_->GetList( |
646 const base::ListValue* url_list = prefs->GetList( | |
647 ntp_tiles::prefs::kNTPSuggestionsURL); | 643 ntp_tiles::prefs::kNTPSuggestionsURL); |
648 const base::ListValue* source_list = | 644 const base::ListValue* source_list = |
649 prefs->GetList(ntp_tiles::prefs::kNTPSuggestionsIsPersonal); | 645 prefs_->GetList(ntp_tiles::prefs::kNTPSuggestionsIsPersonal); |
650 DCHECK_EQ(url_list->GetSize(), source_list->GetSize()); | 646 DCHECK_EQ(url_list->GetSize(), source_list->GetSize()); |
651 if (url_list->GetSize() < num_tiles) | 647 if (url_list->GetSize() < num_tiles) |
652 num_tiles = url_list->GetSize(); | 648 num_tiles = url_list->GetSize(); |
653 if (num_tiles == 0) { | 649 if (num_tiles == 0) { |
654 // No fallback required as Personal suggestions take precedence anyway. | 650 // No fallback required as Personal suggestions take precedence anyway. |
655 return; | 651 return; |
656 } | 652 } |
657 old_sites_url->reserve(num_tiles); | 653 old_sites_url->reserve(num_tiles); |
658 old_sites_is_personal->reserve(num_tiles); | 654 old_sites_is_personal->reserve(num_tiles); |
659 for (size_t i = 0; i < num_tiles; ++i) { | 655 for (size_t i = 0; i < num_tiles; ++i) { |
660 std::string url_string; | 656 std::string url_string; |
661 bool success = url_list->GetString(i, &url_string); | 657 bool success = url_list->GetString(i, &url_string); |
662 DCHECK(success); | 658 DCHECK(success); |
663 old_sites_url->push_back(url_string); | 659 old_sites_url->push_back(url_string); |
664 bool is_personal; | 660 bool is_personal; |
665 success = source_list->GetBoolean(i, &is_personal); | 661 success = source_list->GetBoolean(i, &is_personal); |
666 DCHECK(success); | 662 DCHECK(success); |
667 old_sites_is_personal->push_back(is_personal); | 663 old_sites_is_personal->push_back(is_personal); |
668 } | 664 } |
669 } | 665 } |
670 | 666 |
671 void MostVisitedSites::SaveCurrentNTPSites() { | 667 void MostVisitedSites::SaveCurrentNTPSites() { |
672 base::ListValue url_list; | 668 base::ListValue url_list; |
673 base::ListValue source_list; | 669 base::ListValue source_list; |
674 for (const auto& suggestion : current_suggestions_) { | 670 for (const auto& suggestion : current_suggestions_) { |
675 url_list.AppendString(suggestion.url.spec()); | 671 url_list.AppendString(suggestion.url.spec()); |
676 source_list.AppendBoolean(suggestion.source != MostVisitedSites::POPULAR); | 672 source_list.AppendBoolean(suggestion.source != MostVisitedSites::POPULAR); |
677 } | 673 } |
678 PrefService* prefs = profile_->GetPrefs(); | 674 prefs_->Set(ntp_tiles::prefs::kNTPSuggestionsIsPersonal, source_list); |
679 prefs->Set(ntp_tiles::prefs::kNTPSuggestionsIsPersonal, source_list); | 675 prefs_->Set(ntp_tiles::prefs::kNTPSuggestionsURL, url_list); |
680 prefs->Set(ntp_tiles::prefs::kNTPSuggestionsURL, url_list); | |
681 } | 676 } |
682 | 677 |
683 // static | 678 // static |
684 std::vector<size_t> MostVisitedSites::InsertMatchingSuggestions( | 679 std::vector<size_t> MostVisitedSites::InsertMatchingSuggestions( |
685 MostVisitedSites::SuggestionsPtrVector* src_suggestions, | 680 MostVisitedSites::SuggestionsPtrVector* src_suggestions, |
686 MostVisitedSites::SuggestionsPtrVector* dst_suggestions, | 681 MostVisitedSites::SuggestionsPtrVector* dst_suggestions, |
687 const std::vector<std::string>& match_urls, | 682 const std::vector<std::string>& match_urls, |
688 const std::vector<std::string>& match_hosts) { | 683 const std::vector<std::string>& match_hosts) { |
689 std::vector<size_t> unmatched_suggestions; | 684 std::vector<size_t> unmatched_suggestions; |
690 size_t num_src_suggestions = src_suggestions->size(); | 685 size_t num_src_suggestions = src_suggestions->size(); |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
776 | 771 |
777 void MostVisitedSites::TopSitesLoaded(TopSites* top_sites) {} | 772 void MostVisitedSites::TopSitesLoaded(TopSites* top_sites) {} |
778 | 773 |
779 void MostVisitedSites::TopSitesChanged(TopSites* top_sites, | 774 void MostVisitedSites::TopSitesChanged(TopSites* top_sites, |
780 ChangeReason change_reason) { | 775 ChangeReason change_reason) { |
781 if (mv_source_ == TOP_SITES) { | 776 if (mv_source_ == TOP_SITES) { |
782 // The displayed suggestions are invalidated. | 777 // The displayed suggestions are invalidated. |
783 InitiateTopSitesQuery(); | 778 InitiateTopSitesQuery(); |
784 } | 779 } |
785 } | 780 } |
OLD | NEW |