Chromium Code Reviews| 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 <set> | 9 #include <set> |
| 10 | 10 |
| 11 #include "base/gtest_prod_util.h" | 11 #include "base/gtest_prod_util.h" |
| 12 #include "base/macros.h" | 12 #include "base/macros.h" |
| 13 #include "base/memory/weak_ptr.h" | 13 #include "base/memory/weak_ptr.h" |
| 14 #include "base/time/time.h" | 14 #include "base/time/time.h" |
| 15 #include "chrome/browser/engagement/site_engagement_metrics.h" | 15 #include "chrome/browser/engagement/site_engagement_metrics.h" |
| 16 #include "components/history/core/browser/history_service_observer.h" | 16 #include "components/history/core/browser/history_service_observer.h" |
| 17 #include "components/keyed_service/core/keyed_service.h" | 17 #include "components/keyed_service/core/keyed_service.h" |
| 18 #include "ui/base/page_transition_types.h" | 18 #include "ui/base/page_transition_types.h" |
| 19 | 19 |
| 20 namespace base { | 20 namespace base { |
| 21 class DictionaryValue; | 21 class DictionaryValue; |
| 22 class Clock; | 22 class Clock; |
| 23 } | 23 } |
| 24 | 24 |
| 25 namespace history { | 25 namespace history { |
| 26 class HistoryService; | 26 class HistoryService; |
| 27 } | 27 } |
| 28 | 28 |
| 29 class GURL; | 29 class GURL; |
| 30 class HostContentSettingsMap; | |
| 30 class Profile; | 31 class Profile; |
| 31 | 32 |
| 32 class SiteEngagementScore { | 33 class SiteEngagementScore { |
| 33 public: | 34 public: |
| 34 // The parameters which can be varied via field trial. All "points" values | 35 // The parameters which can be varied via field trial. All "points" values |
| 35 // should be appended to the end of the enum prior to MAX_VARIATION. | 36 // should be appended to the end of the enum prior to MAX_VARIATION. |
| 36 enum Variation { | 37 enum Variation { |
| 37 // The maximum number of points that can be accrued in one day. | 38 // The maximum number of points that can be accrued in one day. |
| 38 MAX_POINTS_PER_DAY = 0, | 39 MAX_POINTS_PER_DAY = 0, |
| 39 | 40 |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 98 // The SiteEngagementService does not take ownership of |clock|. It is the | 99 // The SiteEngagementService does not take ownership of |clock|. It is the |
| 99 // responsibility of the caller to make sure |clock| outlives this | 100 // responsibility of the caller to make sure |clock| outlives this |
| 100 // SiteEngagementScore. | 101 // SiteEngagementScore. |
| 101 SiteEngagementScore(base::Clock* clock, | 102 SiteEngagementScore(base::Clock* clock, |
| 102 const base::DictionaryValue& score_dict); | 103 const base::DictionaryValue& score_dict); |
| 103 ~SiteEngagementScore(); | 104 ~SiteEngagementScore(); |
| 104 | 105 |
| 105 double Score() const; | 106 double Score() const; |
| 106 void AddPoints(double points); | 107 void AddPoints(double points); |
| 107 | 108 |
| 108 // Resets the score to |points| and resets the daily point limit. If | 109 // Resets the score to |points|, resets the daily point limit and sets the |
| 109 // |updated_time| is non-null, sets the last engagement time and last | 110 // last engagement time to |last_engagement_time|. |
| 110 // shortcut launch time (if it is non-null) to |updated_time|. Otherwise, last | 111 void Reset(double points, const base::Time last_engagement_time); |
| 111 // engagement time is set to the current time and last shortcut launch time is | |
| 112 // left unchanged. | |
| 113 // TODO(calamity): Ideally, all SiteEngagementScore methods should take a | |
| 114 // base::Time argument like this one does rather than each Score hold a | |
| 115 // pointer to a base::Clock. Then SiteEngagementScore doesn't need to worry | |
| 116 // about clock vending. See crbug.com/604305 | |
| 117 void Reset(double points, const base::Time* updated_time); | |
| 118 | 112 |
| 119 // Returns true if the maximum number of points today has been added. | 113 // Returns true if the maximum number of points today has been added. |
| 120 bool MaxPointsPerDayAdded() const; | 114 bool MaxPointsPerDayAdded() const; |
| 121 | 115 |
| 122 // Get/set the last time this origin was launched from an installed shortcut. | 116 // Get/set the last time this origin was launched from an installed shortcut. |
| 123 base::Time last_shortcut_launch_time() const { | 117 base::Time last_shortcut_launch_time() const { |
| 124 return last_shortcut_launch_time_; | 118 return last_shortcut_launch_time_; |
| 125 } | 119 } |
| 126 void set_last_shortcut_launch_time(const base::Time& time) { | 120 void set_last_shortcut_launch_time(const base::Time& time) { |
| 127 last_shortcut_launch_time_ = time; | 121 last_shortcut_launch_time_ = time; |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 284 FRIEND_TEST_ALL_PREFIXES(SiteEngagementServiceTest, GetTotalUserInputPoints); | 278 FRIEND_TEST_ALL_PREFIXES(SiteEngagementServiceTest, GetTotalUserInputPoints); |
| 285 FRIEND_TEST_ALL_PREFIXES(SiteEngagementServiceTest, LastShortcutLaunch); | 279 FRIEND_TEST_ALL_PREFIXES(SiteEngagementServiceTest, LastShortcutLaunch); |
| 286 FRIEND_TEST_ALL_PREFIXES(SiteEngagementServiceTest, | 280 FRIEND_TEST_ALL_PREFIXES(SiteEngagementServiceTest, |
| 287 CleanupOriginsOnHistoryDeletion); | 281 CleanupOriginsOnHistoryDeletion); |
| 288 FRIEND_TEST_ALL_PREFIXES(SiteEngagementServiceTest, IsBootstrapped); | 282 FRIEND_TEST_ALL_PREFIXES(SiteEngagementServiceTest, IsBootstrapped); |
| 289 FRIEND_TEST_ALL_PREFIXES(SiteEngagementServiceTest, EngagementLevel); | 283 FRIEND_TEST_ALL_PREFIXES(SiteEngagementServiceTest, EngagementLevel); |
| 290 FRIEND_TEST_ALL_PREFIXES(SiteEngagementServiceTest, ScoreDecayHistograms); | 284 FRIEND_TEST_ALL_PREFIXES(SiteEngagementServiceTest, ScoreDecayHistograms); |
| 291 FRIEND_TEST_ALL_PREFIXES(AppBannerSettingsHelperTest, SiteEngagementTrigger); | 285 FRIEND_TEST_ALL_PREFIXES(AppBannerSettingsHelperTest, SiteEngagementTrigger); |
| 292 FRIEND_TEST_ALL_PREFIXES(ImportantSitesUtilTest, NotificationsThenEngagement); | 286 FRIEND_TEST_ALL_PREFIXES(ImportantSitesUtilTest, NotificationsThenEngagement); |
| 293 | 287 |
| 288 class ScopedEngagementScore { | |
| 289 public: | |
| 290 ScopedEngagementScore(HostContentSettingsMap* settings_map, | |
| 291 const GURL& url, | |
| 292 base::Clock* clock, | |
| 293 bool update); | |
| 294 ~ScopedEngagementScore(); | |
| 295 | |
| 296 SiteEngagementScore* get() { return &score_; } | |
| 297 | |
| 298 private: | |
| 299 std::unique_ptr<base::DictionaryValue> score_dict_; | |
| 300 SiteEngagementScore score_; | |
| 301 bool update_; | |
| 302 GURL url_; | |
| 303 | |
| 304 HostContentSettingsMap* settings_map_; | |
| 305 | |
| 306 DISALLOW_COPY_AND_ASSIGN(ScopedEngagementScore); | |
| 307 }; | |
| 308 | |
| 294 // Only used in tests. | 309 // Only used in tests. |
| 295 SiteEngagementService(Profile* profile, std::unique_ptr<base::Clock> clock); | 310 SiteEngagementService(Profile* profile, std::unique_ptr<base::Clock> clock); |
| 296 | 311 |
| 312 std::unique_ptr<ScopedEngagementScore> GetEngagementScore(const GURL& url, | |
| 313 bool update); | |
|
dominickn
2016/05/02 21:13:49
I don't really like this ScopedEngagementScore.
-
| |
| 314 | |
| 315 std::unique_ptr<ScopedEngagementScore> GetEngagementScore( | |
| 316 const GURL& url) const; | |
| 317 | |
| 297 // Adds the specified number of points to the given origin, respecting the | 318 // Adds the specified number of points to the given origin, respecting the |
| 298 // maximum limits for the day and overall. | 319 // maximum limits for the day and overall. |
| 299 void AddPoints(const GURL& url, double points); | 320 void AddPoints(const GURL& url, double points); |
| 300 | 321 |
| 301 // Post startup tasks: cleaning up origins which have decayed to 0, and | 322 // Post startup tasks: cleaning up origins which have decayed to 0, and |
| 302 // logging UMA statistics. | 323 // logging UMA statistics. |
| 303 void AfterStartupTask(); | 324 void AfterStartupTask(); |
| 304 void CleanupEngagementScores(); | 325 void CleanupEngagementScores(); |
| 305 void RecordMetrics(); | 326 void RecordMetrics(); |
| 306 | 327 |
| 307 // Returns the median engagement score of all recorded origins. | 328 // Returns the median engagement score of all recorded origins. |
| 308 double GetMedianEngagement(const std::map<GURL, double>& score_map) const; | 329 double GetMedianEngagement(const std::map<GURL, double>& score_map) const; |
| 309 | 330 |
| 310 // Returns the number of origins with maximum daily and total engagement | 331 // Returns the number of origins with maximum daily and total engagement |
| 311 // respectively. | 332 // respectively. |
| 312 int OriginsWithMaxDailyEngagement() const; | 333 int OriginsWithMaxDailyEngagement() const; |
| 313 int OriginsWithMaxEngagement(const std::map<GURL, double>& score_map) const; | 334 int OriginsWithMaxEngagement(const std::map<GURL, double>& score_map) const; |
| 314 | 335 |
| 315 void GetCountsAndLastVisitForOriginsComplete( | 336 void GetCountsAndLastVisitForOriginsComplete( |
| 316 history::HistoryService* history_service, | 337 history::HistoryService* history_service, |
| 317 const std::multiset<GURL>& deleted_url_origins, | 338 const std::multiset<GURL>& deleted_url_origins, |
| 318 bool expired, | 339 bool expired, |
| 319 const history::OriginCountAndLastVisitMap& remaining_origin_counts); | 340 const history::OriginCountAndLastVisitMap& remaining_origin_counts); |
| 320 | 341 |
| 321 // Resets the engagement score for |url| to |score|, and sets the last | 342 // Resets the engagement score for |url| to |score|, and sets the last |
| 322 // engagement time and last shortcut launch time (if it is non-null) to | 343 // engagement time and last shortcut launch time (if it is non-null). Clears |
| 323 // |updated_time|. Clears daily limits. | 344 // daily maximum point limits. |
| 324 void ResetScoreAndAccessTimesForURL(const GURL& url, | 345 void ResetScoreAndAccessTimesForURL( |
| 325 double score, | 346 const GURL& url, |
| 326 const base::Time* updated_time); | 347 double score, |
| 348 const base::Time last_engagement_time, | |
| 349 const base::Time* last_shortcut_launch_time); | |
|
dominickn
2016/05/02 21:13:49
Having one argument be the raw time and a second a
| |
| 327 | 350 |
| 328 Profile* profile_; | 351 Profile* profile_; |
| 329 | 352 |
| 330 // The clock used to vend times. | 353 // The clock used to vend times. |
| 331 std::unique_ptr<base::Clock> clock_; | 354 std::unique_ptr<base::Clock> clock_; |
| 332 | 355 |
| 333 // Metrics are recorded at non-incognito browser startup, and then | 356 // Metrics are recorded at non-incognito browser startup, and then |
| 334 // approximately once per hour thereafter. Store the local time at which | 357 // approximately once per hour thereafter. Store the local time at which |
| 335 // metrics were previously uploaded: the first event which affects any | 358 // metrics were previously uploaded: the first event which affects any |
| 336 // origin's engagement score after an hour has elapsed triggers the next | 359 // origin's engagement score after an hour has elapsed triggers the next |
| 337 // upload. | 360 // upload. |
| 338 base::Time last_metrics_time_; | 361 base::Time last_metrics_time_; |
| 339 | 362 |
| 340 base::WeakPtrFactory<SiteEngagementService> weak_factory_; | 363 base::WeakPtrFactory<SiteEngagementService> weak_factory_; |
| 341 | 364 |
| 342 DISALLOW_COPY_AND_ASSIGN(SiteEngagementService); | 365 DISALLOW_COPY_AND_ASSIGN(SiteEngagementService); |
| 343 }; | 366 }; |
| 344 | 367 |
| 345 #endif // CHROME_BROWSER_ENGAGEMENT_SITE_ENGAGEMENT_SERVICE_H_ | 368 #endif // CHROME_BROWSER_ENGAGEMENT_SITE_ENGAGEMENT_SERVICE_H_ |
| OLD | NEW |