Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2016 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 | |
| 5 #include "chrome/browser/android/preferences/important_sites_util.h" | |
| 6 | |
| 7 #include <algorithm> | |
| 8 #include <map> | |
| 9 #include <set> | |
| 10 | |
| 11 #include "chrome/browser/content_settings/host_content_settings_map_factory.h" | |
| 12 #include "chrome/browser/engagement/site_engagement_service.h" | |
| 13 #include "components/content_settings/core/browser/host_content_settings_map.h" | |
| 14 #include "components/content_settings/core/common/content_settings.h" | |
| 15 #include "net/base/registry_controlled_domains/registry_controlled_domain.h" | |
| 16 #include "url/gurl.h" | |
| 17 | |
| 18 namespace { | |
| 19 | |
| 20 std::vector<std::pair<GURL, double>> GetSortedTopEngagementOrigins( | |
| 21 const SiteEngagementService* site_engagement_service, | |
| 22 const std::map<GURL, double>& engagement_map, | |
| 23 SiteEngagementService::EngagementLevel minimum_engagement) { | |
| 24 std::vector<std::pair<GURL, double>> top_ranking_origins; | |
| 25 for (const auto& url_engagement_pair : engagement_map) { | |
| 26 if (!site_engagement_service->IsEngagementAtLeast(url_engagement_pair.first, | |
| 27 minimum_engagement)) { | |
| 28 continue; | |
| 29 } | |
| 30 top_ranking_origins.push_back(url_engagement_pair); | |
| 31 } | |
| 32 std::sort( | |
| 33 top_ranking_origins.begin(), top_ranking_origins.end(), | |
| 34 [](const std::pair<GURL, double>& a, const std::pair<GURL, double>& b) { | |
| 35 return a.second > b.second; | |
| 36 }); | |
| 37 return top_ranking_origins; | |
| 38 } | |
| 39 | |
| 40 std::vector<std::pair<GURL, double>> GenerateSortedOriginsForContentTypeAllowed( | |
| 41 Profile* profile, | |
| 42 ContentSettingsType content_type, | |
| 43 const std::map<GURL, double>& score_map) { | |
| 44 // Grab our content settings list. | |
| 45 ContentSettingsForOneType content_settings_list; | |
| 46 HostContentSettingsMapFactory::GetForProfile(profile)->GetSettingsForOneType( | |
| 47 content_type, content_settings::ResourceIdentifier(), | |
| 48 &content_settings_list); | |
| 49 // Extract a set of urls, using the primary pattern. We don't handle wildcard | |
| 50 // patterns. | |
| 51 std::set<GURL> content_origins; | |
| 52 for (const ContentSettingPatternSource& site : content_settings_list) { | |
| 53 GURL origin(site.primary_pattern.ToString()); | |
| 54 if (!origin.is_valid() || site.setting != CONTENT_SETTING_ALLOW) | |
|
Ted C
2016/04/21 20:18:16
I would check the setting before the GURL conversi
dmurph
2016/04/22 18:06:22
Done.
| |
| 55 continue; | |
| 56 content_origins.insert(origin); | |
| 57 } | |
| 58 std::vector<std::pair<GURL, double>> top_ranking_origins; | |
| 59 for (const GURL& notification_origin : content_origins) { | |
| 60 double score = 0; | |
| 61 auto score_it = score_map.find(notification_origin); | |
| 62 if (score_it != score_map.end()) | |
| 63 score = score_it->second; | |
| 64 top_ranking_origins.push_back(std::make_pair(notification_origin, score)); | |
| 65 } | |
| 66 std::sort( | |
| 67 top_ranking_origins.begin(), top_ranking_origins.end(), | |
| 68 [](const std::pair<GURL, double>& a, const std::pair<GURL, double>& b) { | |
| 69 return a.second > b.second; | |
| 70 }); | |
| 71 return top_ranking_origins; | |
| 72 } | |
| 73 | |
| 74 void FillTopRegisterableDomains( | |
| 75 const std::vector<std::pair<GURL, double>>& sorted_new_origins, | |
| 76 size_t max_important_domains, | |
| 77 std::vector<std::string>* final_list) { | |
| 78 for (const auto& pair : sorted_new_origins) { | |
| 79 if (final_list->size() >= max_important_domains) | |
| 80 return; | |
| 81 std::string registerable_domain = | |
| 82 net::registry_controlled_domains::GetDomainAndRegistry( | |
| 83 pair.first, | |
| 84 net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES); | |
| 85 // Just iterate to find, as we assume our size is small. | |
| 86 if (std::find(final_list->begin(), final_list->end(), | |
| 87 registerable_domain) == final_list->end()) { | |
| 88 final_list->push_back(registerable_domain); | |
| 89 } | |
| 90 } | |
| 91 } | |
| 92 | |
| 93 } // namespace | |
| 94 | |
| 95 std::vector<std::string> ImportantSitesUtil::GetImportantRegisterableDomains( | |
| 96 Profile* profile, | |
| 97 size_t max_results) { | |
| 98 // First get data from site engagement. | |
| 99 SiteEngagementService* site_engagement_service = | |
| 100 SiteEngagementService::Get(profile); | |
| 101 // Engagement data. | |
| 102 std::map<GURL, double> engagement_map = | |
| 103 site_engagement_service->GetScoreMap(); | |
| 104 std::vector<std::pair<GURL, double>> sorted_engagement_origins = | |
| 105 GetSortedTopEngagementOrigins( | |
| 106 site_engagement_service, engagement_map, | |
| 107 SiteEngagementService::ENGAGEMENT_LEVEL_MEDIUM); | |
| 108 | |
| 109 // Second we grab origins with push notifications. | |
| 110 std::vector<std::pair<GURL, double>> sorted_notification_origins = | |
| 111 GenerateSortedOriginsForContentTypeAllowed( | |
| 112 profile, CONTENT_SETTINGS_TYPE_NOTIFICATIONS, engagement_map); | |
| 113 | |
| 114 // Now we transform them into registerable domains, and add them into our | |
| 115 // final list. Since our # is small, we just iterate our vector to de-dup. | |
| 116 // Otherwise we can add a set later. | |
| 117 std::vector<std::string> final_list; | |
| 118 // We start with notifications. | |
| 119 FillTopRegisterableDomains(sorted_notification_origins, max_results, | |
| 120 &final_list); | |
| 121 // And now we fill the rest with high engagement sites. | |
| 122 FillTopRegisterableDomains(sorted_engagement_origins, max_results, | |
| 123 &final_list); | |
| 124 return final_list; | |
| 125 } | |
| OLD | NEW |