| 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..360d90b1b8f08e0e4b484fd084b45a609c2a0e7a 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,36 @@ 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);
|
| - settings_map->GetSettingsForOneType(CONTENT_SETTINGS_TYPE_SITE_ENGAGEMENT,
|
| - std::string(), engagement_settings.get());
|
| - return engagement_settings;
|
| +// Helper for fetching content settings for one type.
|
| +ContentSettingsForOneType GetContentSettingsFromProfile(
|
| + Profile* profile,
|
| + ContentSettingsType type) {
|
| + ContentSettingsForOneType content_settings;
|
| + HostContentSettingsMapFactory::GetForProfile(profile)->GetSettingsForOneType(
|
| + type, content_settings::ResourceIdentifier(), &content_settings);
|
| + return content_settings;
|
| +}
|
| +
|
| +// 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) {
|
| + std::set<GURL> urls;
|
| +
|
| + // Fetch URLs of sites with engagement details stored.
|
| + for (const auto& site : GetContentSettingsFromProfile(
|
| + profile, CONTENT_SETTINGS_TYPE_SITE_ENGAGEMENT)) {
|
| + urls.insert(GURL(site.primary_pattern.ToString()));
|
| + }
|
| +
|
| + // Fetch URLs of sites for which notifications are allowed.
|
| + for (const auto& site : GetContentSettingsFromProfile(
|
| + profile, CONTENT_SETTINGS_TYPE_NOTIFICATIONS)) {
|
| + if (site.setting != CONTENT_SETTING_ALLOW)
|
| + continue;
|
| + urls.insert(GURL(site.primary_pattern.ToString()));
|
| + }
|
| +
|
| + return urls;
|
| }
|
|
|
| // Only accept a navigation event for engagement if it is one of:
|
| @@ -104,8 +126,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 +160,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 +272,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 +350,6 @@ void SiteEngagementService::AfterStartupTask() {
|
|
|
| void SiteEngagementService::CleanupEngagementScores(
|
| 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,7 +369,10 @@ void SiteEngagementService::CleanupEngagementScores(
|
| if (last_engagement_time > now)
|
| last_engagement_time = now;
|
|
|
| - for (const auto& site : *engagement_settings) {
|
| + HostContentSettingsMap* settings_map =
|
| + HostContentSettingsMapFactory::GetForProfile(profile_);
|
| + for (const auto& site : GetContentSettingsFromProfile(
|
| + profile_, CONTENT_SETTINGS_TYPE_SITE_ENGAGEMENT)) {
|
| GURL origin(site.primary_pattern.ToString());
|
|
|
| if (origin.is_valid()) {
|
| @@ -376,14 +407,15 @@ void SiteEngagementService::CleanupEngagementScores(
|
| score.Commit();
|
| }
|
|
|
| - if (score.GetScore() > SiteEngagementScore::GetScoreCleanupThreshold())
|
| + if (score.GetTotalScore() >
|
| + SiteEngagementScore::GetScoreCleanupThreshold())
|
| continue;
|
| }
|
|
|
| // This origin has a score of 0. Wipe it from content settings.
|
| settings_map->SetWebsiteSettingDefaultScope(
|
| - origin, GURL(), CONTENT_SETTINGS_TYPE_SITE_ENGAGEMENT, std::string(),
|
| - nullptr);
|
| + origin, GURL(), CONTENT_SETTINGS_TYPE_SITE_ENGAGEMENT,
|
| + content_settings::ResourceIdentifier(), nullptr);
|
| }
|
|
|
| // Set the last engagement time to be consistent with the scores. This will
|
| @@ -577,16 +609,13 @@ 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) {
|
| + for (const auto& site : GetContentSettingsFromProfile(
|
| + profile_, CONTENT_SETTINGS_TYPE_SITE_ENGAGEMENT)) {
|
| GURL origin(site.primary_pattern.ToString());
|
| +
|
| if (!origin.is_valid())
|
| continue;
|
|
|
| @@ -653,9 +682,11 @@ void SiteEngagementService::GetCountsAndLastVisitForOriginsComplete(
|
| // engagement is next accessed, it will decay back to the proportionally
|
| // reduced value rather than being decayed once here, and then once again
|
| // when it is next accessed.
|
| + // TODO(703848): Move the proportional decay logic into SiteEngagementScore,
|
| + // so it can decay raw_score_ directly, without the double-decay issue.
|
| SiteEngagementScore engagement_score = CreateEngagementScore(origin);
|
|
|
| - double new_score = proportion_remaining * engagement_score.GetScore();
|
| + double new_score = proportion_remaining * engagement_score.GetTotalScore();
|
| int hours_since_engagement = (now - last_visit).InHours();
|
| int periods =
|
| hours_since_engagement / SiteEngagementScore::GetDecayPeriodInHours();
|
|
|