OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 #ifndef CHROME_BROWSER_ENGAGEMENT_SITE_ENGAGEMENT_SERVICE_H_ | 5 #ifndef CHROME_BROWSER_ENGAGEMENT_SITE_ENGAGEMENT_SERVICE_H_ |
6 #define CHROME_BROWSER_ENGAGEMENT_SITE_ENGAGEMENT_SERVICE_H_ | 6 #define CHROME_BROWSER_ENGAGEMENT_SITE_ENGAGEMENT_SERVICE_H_ |
7 | 7 |
8 #include <map> | 8 #include <map> |
9 #include <memory> | 9 #include <memory> |
10 #include <set> | 10 #include <set> |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
119 FRIEND_TEST_ALL_PREFIXES(SiteEngagementServiceTest, ClearHistoryForURLs); | 119 FRIEND_TEST_ALL_PREFIXES(SiteEngagementServiceTest, ClearHistoryForURLs); |
120 FRIEND_TEST_ALL_PREFIXES(SiteEngagementServiceTest, GetMedianEngagement); | 120 FRIEND_TEST_ALL_PREFIXES(SiteEngagementServiceTest, GetMedianEngagement); |
121 FRIEND_TEST_ALL_PREFIXES(SiteEngagementServiceTest, GetTotalNavigationPoints); | 121 FRIEND_TEST_ALL_PREFIXES(SiteEngagementServiceTest, GetTotalNavigationPoints); |
122 FRIEND_TEST_ALL_PREFIXES(SiteEngagementServiceTest, GetTotalUserInputPoints); | 122 FRIEND_TEST_ALL_PREFIXES(SiteEngagementServiceTest, GetTotalUserInputPoints); |
123 FRIEND_TEST_ALL_PREFIXES(SiteEngagementServiceTest, LastShortcutLaunch); | 123 FRIEND_TEST_ALL_PREFIXES(SiteEngagementServiceTest, LastShortcutLaunch); |
124 FRIEND_TEST_ALL_PREFIXES(SiteEngagementServiceTest, | 124 FRIEND_TEST_ALL_PREFIXES(SiteEngagementServiceTest, |
125 CleanupOriginsOnHistoryDeletion); | 125 CleanupOriginsOnHistoryDeletion); |
126 FRIEND_TEST_ALL_PREFIXES(SiteEngagementServiceTest, IsBootstrapped); | 126 FRIEND_TEST_ALL_PREFIXES(SiteEngagementServiceTest, IsBootstrapped); |
127 FRIEND_TEST_ALL_PREFIXES(SiteEngagementServiceTest, EngagementLevel); | 127 FRIEND_TEST_ALL_PREFIXES(SiteEngagementServiceTest, EngagementLevel); |
128 FRIEND_TEST_ALL_PREFIXES(SiteEngagementServiceTest, ScoreDecayHistograms); | 128 FRIEND_TEST_ALL_PREFIXES(SiteEngagementServiceTest, ScoreDecayHistograms); |
| 129 FRIEND_TEST_ALL_PREFIXES(SiteEngagementServiceTest, |
| 130 PersistLastEngagementTime); |
129 FRIEND_TEST_ALL_PREFIXES(AppBannerSettingsHelperTest, SiteEngagementTrigger); | 131 FRIEND_TEST_ALL_PREFIXES(AppBannerSettingsHelperTest, SiteEngagementTrigger); |
130 | 132 |
131 // Only used in tests. | 133 // Only used in tests. |
132 SiteEngagementService(Profile* profile, std::unique_ptr<base::Clock> clock); | 134 SiteEngagementService(Profile* profile, std::unique_ptr<base::Clock> clock); |
133 | 135 |
134 // Adds the specified number of points to the given origin, respecting the | 136 // Adds the specified number of points to the given origin, respecting the |
135 // maximum limits for the day and overall. | 137 // maximum limits for the day and overall. |
136 void AddPoints(const GURL& url, double points); | 138 void AddPoints(const GURL& url, double points); |
137 | 139 |
138 // Retrieves the SiteEngagementScore object for |origin|. | 140 // Retrieves the SiteEngagementScore object for |origin|. |
139 SiteEngagementScore CreateEngagementScore(const GURL& origin); | 141 SiteEngagementScore CreateEngagementScore(const GURL& origin); |
140 const SiteEngagementScore CreateEngagementScore(const GURL& origin) const; | 142 const SiteEngagementScore CreateEngagementScore(const GURL& origin) const; |
141 | 143 |
142 // Post startup tasks: cleaning up origins which have decayed to 0, and | 144 // Runs site engagement maintenance tasks. |
143 // logging UMA statistics. | |
144 void AfterStartupTask(); | 145 void AfterStartupTask(); |
145 void CleanupEngagementScores(); | 146 |
| 147 // Removes any origins which have decayed to 0 engagement. If |
| 148 // |update_last_engagement_time| is true, the last engagement time of all |
| 149 // origins is reset by calculating the delta between the last engagement event |
| 150 // recorded by the site engagement service and the origin. The origin's last |
| 151 // engagement time is then set to clock_->Now() - delta. |
| 152 // |
| 153 // If a user does not use the browser at all for some period of time, |
| 154 // engagement is not decayed, and the state is restored equivalent to how they |
| 155 // left it once they return. |
| 156 void CleanupEngagementScores(bool update_last_engagement_time); |
| 157 |
| 158 // Records UMA metrics. |
146 void RecordMetrics(); | 159 void RecordMetrics(); |
147 | 160 |
148 // Returns the median engagement score of all recorded origins. | 161 // Returns the median engagement score of all recorded origins. |
149 double GetMedianEngagement(const std::map<GURL, double>& score_map) const; | 162 double GetMedianEngagement(const std::map<GURL, double>& score_map) const; |
150 | 163 |
151 // Update the engagement score of the origin loaded in |web_contents| for | 164 // Update the engagement score of the origin loaded in |web_contents| for |
152 // media playing. The points awarded are discounted if the media is being | 165 // media playing. The points awarded are discounted if the media is being |
153 // played in a non-visible tab. | 166 // played in a non-visible tab. |
154 void HandleMediaPlaying(content::WebContents* web_contents, bool is_hidden); | 167 void HandleMediaPlaying(content::WebContents* web_contents, bool is_hidden); |
155 | 168 |
156 // Update the engagement score of the origin loaded in |web_contents| for | 169 // Update the engagement score of the origin loaded in |web_contents| for |
157 // navigation. | 170 // navigation. |
158 void HandleNavigation(content::WebContents* web_contents, | 171 void HandleNavigation(content::WebContents* web_contents, |
159 ui::PageTransition transition); | 172 ui::PageTransition transition); |
160 | 173 |
161 // Update the engagement score of the origin loaded in |web_contents| for | 174 // Update the engagement score of the origin loaded in |web_contents| for |
162 // time-on-site, based on user input. | 175 // time-on-site, based on user input. |
163 void HandleUserInput(content::WebContents* web_contents, | 176 void HandleUserInput(content::WebContents* web_contents, |
164 SiteEngagementMetrics::EngagementType type); | 177 SiteEngagementMetrics::EngagementType type); |
165 | 178 |
| 179 // Returns true if the last engagement increasing event seen by the site |
| 180 // engagement service was sufficiently long ago that we need to reset all |
| 181 // scores to be relative to now. This ensures that users who do not use Chrome |
| 182 // at all for an extended period of time do not have their engagement decay. |
| 183 bool IsLastEngagementObsolete(); |
| 184 |
166 // Overridden from history::HistoryServiceObserver: | 185 // Overridden from history::HistoryServiceObserver: |
167 void OnURLsDeleted(history::HistoryService* history_service, | 186 void OnURLsDeleted(history::HistoryService* history_service, |
168 bool all_history, | 187 bool all_history, |
169 bool expired, | 188 bool expired, |
170 const history::URLRows& deleted_rows, | 189 const history::URLRows& deleted_rows, |
171 const std::set<GURL>& favicon_urls) override; | 190 const std::set<GURL>& favicon_urls) override; |
172 | 191 |
173 // Returns the number of origins with maximum daily and total engagement | 192 // Returns the number of origins with maximum daily and total engagement |
174 // respectively. | 193 // respectively. |
175 int OriginsWithMaxDailyEngagement() const; | 194 int OriginsWithMaxDailyEngagement() const; |
(...skipping 12 matching lines...) Expand all Loading... |
188 // The clock used to vend times. | 207 // The clock used to vend times. |
189 std::unique_ptr<base::Clock> clock_; | 208 std::unique_ptr<base::Clock> clock_; |
190 | 209 |
191 // Metrics are recorded at non-incognito browser startup, and then | 210 // Metrics are recorded at non-incognito browser startup, and then |
192 // approximately once per hour thereafter. Store the local time at which | 211 // approximately once per hour thereafter. Store the local time at which |
193 // metrics were previously uploaded: the first event which affects any | 212 // metrics were previously uploaded: the first event which affects any |
194 // origin's engagement score after an hour has elapsed triggers the next | 213 // origin's engagement score after an hour has elapsed triggers the next |
195 // upload. | 214 // upload. |
196 base::Time last_metrics_time_; | 215 base::Time last_metrics_time_; |
197 | 216 |
| 217 // Keep track of the last time any engagement was recorded. If this date is |
| 218 // too far in the past, assume that the user has not been using Chrome, and |
| 219 // ensure that scores are not decayed as usual. |
| 220 base::Time last_engagement_time_; |
| 221 |
198 base::WeakPtrFactory<SiteEngagementService> weak_factory_; | 222 base::WeakPtrFactory<SiteEngagementService> weak_factory_; |
199 | 223 |
200 DISALLOW_COPY_AND_ASSIGN(SiteEngagementService); | 224 DISALLOW_COPY_AND_ASSIGN(SiteEngagementService); |
201 }; | 225 }; |
202 | 226 |
203 #endif // CHROME_BROWSER_ENGAGEMENT_SITE_ENGAGEMENT_SERVICE_H_ | 227 #endif // CHROME_BROWSER_ENGAGEMENT_SITE_ENGAGEMENT_SERVICE_H_ |
OLD | NEW |