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 df709189e6bfac5542aad42bf67fcacb6e6c1e24..64531715876c21ea6904e95c6ab57df98a6a34e3 100644 |
--- a/chrome/browser/engagement/site_engagement_service.cc |
+++ b/chrome/browser/engagement/site_engagement_service.cc |
@@ -271,18 +271,12 @@ void SiteEngagementScore::AddPoints(double points) { |
last_engagement_time_ = now; |
} |
-void SiteEngagementScore::Reset(double points, const base::Time* updated_time) { |
+void SiteEngagementScore::Reset(double points, |
+ const base::Time last_engagement_time) { |
raw_score_ = points; |
points_added_today_ = 0; |
- // This must be set in order to prevent the score from decaying when read. |
- if (updated_time) { |
- last_engagement_time_ = *updated_time; |
- if (!last_shortcut_launch_time_.is_null()) |
- last_shortcut_launch_time_ = *updated_time; |
- } else { |
- last_engagement_time_ = clock_->Now(); |
- } |
+ last_engagement_time_ = last_engagement_time; |
} |
bool SiteEngagementScore::MaxPointsPerDayAdded() const { |
@@ -455,7 +449,9 @@ void SiteEngagementService::HandleMediaPlaying(const GURL& url, |
} |
void SiteEngagementService::ResetScoreForURL(const GURL& url, double score) { |
- ResetScoreAndAccessTimesForURL(url, score, nullptr); |
+ // Set the last engagement time to Now in order to prevent the newly set |
+ // score from decaying when read. |
+ ResetScoreAndAccessTimesForURL(url, score, clock_->Now(), nullptr); |
} |
void SiteEngagementService::OnURLsDeleted( |
@@ -478,16 +474,12 @@ void SiteEngagementService::OnURLsDeleted( |
} |
void SiteEngagementService::SetLastShortcutLaunchTime(const GURL& url) { |
- HostContentSettingsMap* settings_map = |
- HostContentSettingsMapFactory::GetForProfile(profile_); |
- std::unique_ptr<base::DictionaryValue> score_dict = |
- GetScoreDictForOrigin(settings_map, url); |
- SiteEngagementScore score(clock_.get(), *score_dict); |
+ std::unique_ptr<ScopedEngagementScore> score = GetEngagementScore(url, true); |
// Record the number of days since the last launch in UMA. If the user's clock |
// has changed back in time, set this to 0. |
base::Time now = clock_->Now(); |
- base::Time last_launch = score.last_shortcut_launch_time(); |
+ base::Time last_launch = score->get()->last_shortcut_launch_time(); |
if (!last_launch.is_null()) { |
SiteEngagementMetrics::RecordDaysSinceLastShortcutLaunch( |
std::max(0, (now - last_launch).InDays())); |
@@ -495,22 +487,11 @@ void SiteEngagementService::SetLastShortcutLaunchTime(const GURL& url) { |
SiteEngagementMetrics::RecordEngagement( |
SiteEngagementMetrics::ENGAGEMENT_WEBAPP_SHORTCUT_LAUNCH); |
- score.set_last_shortcut_launch_time(now); |
- if (score.UpdateScoreDict(score_dict.get())) { |
- settings_map->SetWebsiteSettingDefaultScope( |
- url, GURL(), CONTENT_SETTINGS_TYPE_SITE_ENGAGEMENT, std::string(), |
- score_dict.release()); |
- } |
+ score->get()->set_last_shortcut_launch_time(now); |
} |
double SiteEngagementService::GetScore(const GURL& url) const { |
- HostContentSettingsMap* settings_map = |
- HostContentSettingsMapFactory::GetForProfile(profile_); |
- std::unique_ptr<base::DictionaryValue> score_dict = |
- GetScoreDictForOrigin(settings_map, url); |
- SiteEngagementScore score(clock_.get(), *score_dict); |
- |
- return score.Score(); |
+ return GetEngagementScore(url)->get()->Score(); |
} |
double SiteEngagementService::GetTotalEngagementPoints() const { |
@@ -535,10 +516,7 @@ std::map<GURL, double> SiteEngagementService::GetScoreMap() const { |
if (!origin.is_valid()) |
continue; |
- std::unique_ptr<base::DictionaryValue> score_dict = |
- GetScoreDictForOrigin(settings_map, origin); |
- SiteEngagementScore score(clock_.get(), *score_dict); |
- score_map[origin] = score.Score(); |
+ score_map[origin] = GetEngagementScore(origin)->get()->Score(); |
} |
return score_map; |
@@ -591,6 +569,34 @@ bool SiteEngagementService::IsEngagementAtLeast( |
return false; |
} |
+SiteEngagementService::ScopedEngagementScore::ScopedEngagementScore( |
+ HostContentSettingsMap* settings_map, |
+ const GURL& url, |
+ base::Clock* clock, |
+ bool update) |
+ : score_dict_(GetScoreDictForOrigin(settings_map, url)), |
+ score_(clock, *score_dict_), |
+ update_(update), |
+ url_(url), |
+ settings_map_(settings_map) {} |
+ |
+SiteEngagementService::ScopedEngagementScore::~ScopedEngagementScore() { |
+ if (update_) { |
+ if (score_.Score() == 0) { |
+ settings_map_->SetWebsiteSettingDefaultScope( |
+ url_, GURL(), CONTENT_SETTINGS_TYPE_SITE_ENGAGEMENT, std::string(), |
+ nullptr); |
+ return; |
+ } |
+ |
+ if (score_.UpdateScoreDict(score_dict_.get())) { |
+ settings_map_->SetWebsiteSettingDefaultScope( |
+ url_, GURL(), CONTENT_SETTINGS_TYPE_SITE_ENGAGEMENT, std::string(), |
+ score_dict_.release()); |
+ } |
+ } |
+} |
+ |
SiteEngagementService::SiteEngagementService(Profile* profile, |
std::unique_ptr<base::Clock> clock) |
: profile_(profile), clock_(std::move(clock)), weak_factory_(this) { |
@@ -601,19 +607,23 @@ SiteEngagementService::SiteEngagementService(Profile* profile, |
history->AddObserver(this); |
} |
+std::unique_ptr<SiteEngagementService::ScopedEngagementScore> |
+SiteEngagementService::GetEngagementScore(const GURL& url, bool update) { |
+ return base::WrapUnique(new ScopedEngagementScore( |
+ HostContentSettingsMapFactory::GetForProfile(profile_), url, clock_.get(), |
+ update)); |
+} |
+ |
+std::unique_ptr<SiteEngagementService::ScopedEngagementScore> |
+SiteEngagementService::GetEngagementScore(const GURL& url) const { |
+ return base::WrapUnique(new ScopedEngagementScore( |
+ HostContentSettingsMapFactory::GetForProfile(profile_), url, clock_.get(), |
+ false)); |
+} |
+ |
void SiteEngagementService::AddPoints(const GURL& url, double points) { |
- HostContentSettingsMap* settings_map = |
- HostContentSettingsMapFactory::GetForProfile(profile_); |
- std::unique_ptr<base::DictionaryValue> score_dict = |
- GetScoreDictForOrigin(settings_map, url); |
- SiteEngagementScore score(clock_.get(), *score_dict); |
- |
- score.AddPoints(points); |
- if (score.UpdateScoreDict(score_dict.get())) { |
- settings_map->SetWebsiteSettingDefaultScope( |
- url, GURL(), CONTENT_SETTINGS_TYPE_SITE_ENGAGEMENT, std::string(), |
- score_dict.release()); |
- } |
+ std::unique_ptr<ScopedEngagementScore> score = GetEngagementScore(url, true); |
+ score->get()->AddPoints(points); |
dominickn
2016/05/02 21:13:49
Nit: if you're not going to null check, then GetEn
|
} |
void SiteEngagementService::AfterStartupTask() { |
@@ -630,16 +640,9 @@ void SiteEngagementService::CleanupEngagementScores() { |
for (const auto& site : *engagement_settings) { |
GURL origin(site.primary_pattern.ToString()); |
if (origin.is_valid()) { |
- std::unique_ptr<base::DictionaryValue> score_dict = |
- GetScoreDictForOrigin(settings_map, origin); |
- SiteEngagementScore score(clock_.get(), *score_dict); |
- if (score.Score() != 0) |
- continue; |
+ // When this goes out of scope, the update will trigger a delete. |
+ GetEngagementScore(origin, true); |
} |
- |
- settings_map->SetWebsiteSettingDefaultScope( |
- origin, GURL(), CONTENT_SETTINGS_TYPE_SITE_ENGAGEMENT, std::string(), |
- nullptr); |
} |
} |
@@ -711,10 +714,7 @@ int SiteEngagementService::OriginsWithMaxDailyEngagement() const { |
if (!origin.is_valid()) |
continue; |
- std::unique_ptr<base::DictionaryValue> score_dict = |
- GetScoreDictForOrigin(settings_map, origin); |
- SiteEngagementScore score(clock_.get(), *score_dict); |
- if (score.MaxPointsPerDayAdded()) |
+ if (GetEngagementScore(origin)->get()->MaxPointsPerDayAdded()) |
++total_origins; |
} |
@@ -784,33 +784,29 @@ void SiteEngagementService::GetCountsAndLastVisitForOriginsComplete( |
double score = |
std::min(SiteEngagementScore::kMaxPoints, |
(proportion_remaining * GetScore(origin)) + undecay); |
- ResetScoreAndAccessTimesForURL(origin, score, &last_visit); |
+ base::Time last_shortcut_launch_time = |
+ GetEngagementScore(origin, false)->get()->last_shortcut_launch_time(); |
+ std::unique_ptr<base::Time> new_last_shortcut_time; |
+ if (last_shortcut_launch_time > last_visit) |
+ new_last_shortcut_time.reset(new base::Time(last_visit)); |
+ ResetScoreAndAccessTimesForURL(origin, score, last_visit, |
+ new_last_shortcut_time.get()); |
} |
} |
void SiteEngagementService::ResetScoreAndAccessTimesForURL( |
- const GURL& url, double score, const base::Time* updated_time) { |
+ const GURL& url, |
+ double score, |
+ const base::Time last_engagement_time, |
+ const base::Time* last_shortcut_launch_time) { |
DCHECK(url.is_valid()); |
DCHECK_GE(score, 0); |
DCHECK_LE(score, SiteEngagementScore::kMaxPoints); |
- HostContentSettingsMap* settings_map = |
- HostContentSettingsMapFactory::GetForProfile(profile_); |
- std::unique_ptr<base::DictionaryValue> score_dict = |
- GetScoreDictForOrigin(settings_map, url); |
- SiteEngagementScore engagement_score(clock_.get(), *score_dict); |
- |
- engagement_score.Reset(score, updated_time); |
- if (score == 0) { |
- settings_map->SetWebsiteSettingDefaultScope( |
- url, GURL(), CONTENT_SETTINGS_TYPE_SITE_ENGAGEMENT, std::string(), |
- nullptr); |
- return; |
- } |
- |
- if (engagement_score.UpdateScoreDict(score_dict.get())) { |
- settings_map->SetWebsiteSettingDefaultScope( |
- url, GURL(), CONTENT_SETTINGS_TYPE_SITE_ENGAGEMENT, std::string(), |
- score_dict.release()); |
- } |
+ std::unique_ptr<ScopedEngagementScore> engagement_score = |
+ GetEngagementScore(url, true); |
+ engagement_score->get()->Reset(score, last_engagement_time); |
+ if (last_shortcut_launch_time) |
+ engagement_score->get()->set_last_shortcut_launch_time( |
+ *last_shortcut_launch_time); |
} |