Chromium Code Reviews| Index: chrome/browser/engagement/site_engagement_service.cc |
| diff --git a/chrome/browser/engagement/site_engagement_service.cc b/chrome/browser/engagement/site_engagement_service.cc |
| index 43b83532572753245b9cc3450ba3c21d540158c9..7c0c534fd41c2c64bef40c2503ba21d0cdd05df9 100644 |
| --- a/chrome/browser/engagement/site_engagement_service.cc |
| +++ b/chrome/browser/engagement/site_engagement_service.cc |
| @@ -8,7 +8,6 @@ |
| #include <algorithm> |
| #include <utility> |
| -#include <vector> |
| #include "base/command_line.h" |
| #include "base/memory/ptr_util.h" |
| @@ -52,13 +51,34 @@ bool g_updated_from_variations = false; |
| // Length of time between metrics logging. |
| const int kMetricsIntervalInMinutes = 60; |
| -std::unique_ptr<ContentSettingsForOneType> GetEngagementContentSettings( |
| - HostContentSettingsMap* settings_map) { |
| - std::unique_ptr<ContentSettingsForOneType> engagement_settings( |
| - new ContentSettingsForOneType); |
| +// Returns the combined list of origins which either have site engagement |
| +// data stored, or have other settings that would provide a score bonus. |
| +std::set<GURL> GetEngagementOriginsFromContentSettings(Profile* profile) { |
| + HostContentSettingsMap* settings_map = |
| + HostContentSettingsMapFactory::GetForProfile(profile); |
| + |
| + ContentSettingsForOneType content_settings_list; |
| + std::set<GURL> urls; |
| + |
| + // Fetch site engagement content settings. |
| settings_map->GetSettingsForOneType(CONTENT_SETTINGS_TYPE_SITE_ENGAGEMENT, |
| - std::string(), engagement_settings.get()); |
| - return engagement_settings; |
| + content_settings::ResourceIdentifier(), |
| + &content_settings_list); |
| + for (const auto& site : content_settings_list) { |
|
dominickn
2017/04/10 04:41:26
Nit: no braces
Wez
2017/04/10 21:18:09
Done, though note that other areas of Chromium ten
|
| + urls.insert(GURL(site.primary_pattern.ToString())); |
| + } |
| + |
| + // Fetch notifications allowed content settings. |
| + settings_map->GetSettingsForOneType(CONTENT_SETTINGS_TYPE_NOTIFICATIONS, |
| + content_settings::ResourceIdentifier(), |
| + &content_settings_list); |
| + for (const auto& site : content_settings_list) { |
| + if (site.setting == CONTENT_SETTING_ALLOW) |
|
dominickn
2017/04/10 04:41:26
Should this be != ?
Wez
2017/04/10 21:18:09
Yup; and of course my simple test wouldn't catch t
|
| + continue; |
| + urls.insert(GURL(site.primary_pattern.ToString())); |
| + } |
| + |
| + return urls; |
| } |
| // Only accept a navigation event for engagement if it is one of: |
| @@ -104,8 +124,7 @@ double SiteEngagementService::GetScoreFromSettings( |
| HostContentSettingsMap* settings, |
| const GURL& origin) { |
| auto clock = base::MakeUnique<base::DefaultClock>(); |
| - return SiteEngagementScore(clock.get(), origin, settings) |
| - .GetScore(); |
| + return SiteEngagementScore(clock.get(), origin, settings).GetTotalScore(); |
| } |
| SiteEngagementService::SiteEngagementService(Profile* profile) |
| @@ -139,21 +158,28 @@ SiteEngagementService::GetEngagementLevel(const GURL& url) const { |
| return CreateEngagementScore(url).GetEngagementLevel(); |
| } |
| -std::map<GURL, double> SiteEngagementService::GetScoreMap() const { |
| - HostContentSettingsMap* settings_map = |
| - HostContentSettingsMapFactory::GetForProfile(profile_); |
| - std::unique_ptr<ContentSettingsForOneType> engagement_settings = |
| - GetEngagementContentSettings(settings_map); |
| +std::vector<mojom::SiteEngagementDetails> SiteEngagementService::GetAllDetails() |
| + const { |
| + std::set<GURL> origins = GetEngagementOriginsFromContentSettings(profile_); |
| - std::map<GURL, double> score_map; |
| - for (const auto& site : *engagement_settings) { |
| - GURL origin(site.primary_pattern.ToString()); |
| + std::vector<mojom::SiteEngagementDetails> details; |
| + details.reserve(origins.size()); |
| + for (const GURL& origin : origins) { |
| if (!origin.is_valid()) |
| continue; |
| + details.push_back(GetDetails(origin)); |
| + } |
| + |
| + return details; |
| +} |
| +std::map<GURL, double> SiteEngagementService::GetScoreMap() const { |
| + std::map<GURL, double> score_map; |
| + for (const GURL& origin : GetEngagementOriginsFromContentSettings(profile_)) { |
| + if (!origin.is_valid()) |
| + continue; |
| score_map[origin] = GetScore(origin); |
| } |
| - |
| return score_map; |
| } |
| @@ -244,12 +270,17 @@ void SiteEngagementService::HelperDeleted( |
| } |
| double SiteEngagementService::GetScore(const GURL& url) const { |
| + return GetDetails(url).total_score; |
| +} |
| + |
| +mojom::SiteEngagementDetails SiteEngagementService::GetDetails( |
| + const GURL& url) const { |
| // Ensure that if engagement is stale, we clean things up before fetching the |
| // score. |
| if (IsLastEngagementStale()) |
| CleanupEngagementScores(true); |
| - return CreateEngagementScore(url).GetScore(); |
| + return CreateEngagementScore(url).GetDetails(); |
| } |
| double SiteEngagementService::GetTotalEngagementPoints() const { |
| @@ -317,11 +348,6 @@ void SiteEngagementService::AfterStartupTask() { |
| void SiteEngagementService::CleanupEngagementScores( |
|
dominickn
2017/04/10 04:41:26
This cleanup method doesn't need to iterate over o
Wez
2017/04/10 21:18:09
Done.
|
| bool update_last_engagement_time) const { |
| - HostContentSettingsMap* settings_map = |
| - HostContentSettingsMapFactory::GetForProfile(profile_); |
| - std::unique_ptr<ContentSettingsForOneType> engagement_settings = |
| - GetEngagementContentSettings(settings_map); |
| - |
| // We want to rebase last engagement times relative to MaxDecaysPerScore |
| // periods of decay in the past. |
| base::Time now = clock_->Now(); |
| @@ -341,9 +367,9 @@ void SiteEngagementService::CleanupEngagementScores( |
| if (last_engagement_time > now) |
| last_engagement_time = now; |
| - for (const auto& site : *engagement_settings) { |
| - GURL origin(site.primary_pattern.ToString()); |
| - |
| + HostContentSettingsMap* settings_map = |
| + HostContentSettingsMapFactory::GetForProfile(profile_); |
| + for (const GURL& origin : GetEngagementOriginsFromContentSettings(profile_)) { |
| if (origin.is_valid()) { |
| SiteEngagementScore score = CreateEngagementScore(origin); |
| if (update_last_engagement_time) { |
| @@ -376,7 +402,8 @@ void SiteEngagementService::CleanupEngagementScores( |
| score.Commit(); |
| } |
| - if (score.GetScore() > SiteEngagementScore::GetScoreCleanupThreshold()) |
| + if (score.GetTotalScore() > |
| + SiteEngagementScore::GetScoreCleanupThreshold()) |
| continue; |
| } |
| @@ -577,16 +604,10 @@ SiteEngagementScore SiteEngagementService::CreateEngagementScore( |
| } |
| int SiteEngagementService::OriginsWithMaxDailyEngagement() const { |
| - HostContentSettingsMap* settings_map = |
| - HostContentSettingsMapFactory::GetForProfile(profile_); |
| - std::unique_ptr<ContentSettingsForOneType> engagement_settings = |
| - GetEngagementContentSettings(settings_map); |
| - |
| int total_origins = 0; |
| // We cannot call GetScoreMap as we need the score objects, not raw scores. |
| - for (const auto& site : *engagement_settings) { |
| - GURL origin(site.primary_pattern.ToString()); |
| + for (const GURL& origin : GetEngagementOriginsFromContentSettings(profile_)) { |
|
dominickn
2017/04/10 04:41:26
An origin can't possibly get maximum daily engagem
Wez
2017/04/10 21:18:09
Done.
|
| if (!origin.is_valid()) |
| continue; |
| @@ -655,7 +676,7 @@ void SiteEngagementService::GetCountsAndLastVisitForOriginsComplete( |
| // when it is next accessed. |
| SiteEngagementScore engagement_score = CreateEngagementScore(origin); |
| - double new_score = proportion_remaining * engagement_score.GetScore(); |
| + double new_score = proportion_remaining * engagement_score.raw_score(); |
| int hours_since_engagement = (now - last_visit).InHours(); |
| int periods = |
| hours_since_engagement / SiteEngagementScore::GetDecayPeriodInHours(); |