Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3191)

Unified Diff: chrome/browser/engagement/site_engagement_service.h

Issue 1986033002: Implement an observer interface for the site engagement service. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@site-engagement-refactor
Patch Set: Squash race condition in unit test which leads to a leak Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/engagement/site_engagement_service.h
diff --git a/chrome/browser/engagement/site_engagement_service.h b/chrome/browser/engagement/site_engagement_service.h
index 1d733322e887cced1264f0a6ac062984c06b8a99..66bd8e5da86aa81f1ba387d7d36f7f2a9a8d6829 100644
--- a/chrome/browser/engagement/site_engagement_service.h
+++ b/chrome/browser/engagement/site_engagement_service.h
@@ -9,6 +9,7 @@
#include <memory>
#include <set>
+#include "base/callback_forward.h"
#include "base/gtest_prod_util.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
@@ -58,6 +59,14 @@ class SiteEngagementService : public KeyedService,
// the service of them.
class Helper;
+ // Callback used by the site engagement service to signal that a given origin
+ // has reached a given engagement score. When invoked, the callback will be
+ // passed the score for |url|'s origin at the time of invocation, and the URL
+ // which led to the engagement reaching that score (or the origin if the score
+ // was already at the requested level).
+ using EngagementCallback = base::Callback<void(const GURL&, double)>;
+ using EngagementCallbacks = std::vector<EngagementCallback>;
+
enum EngagementLevel {
ENGAGEMENT_LEVEL_NONE,
ENGAGEMENT_LEVEL_LOW,
@@ -97,6 +106,18 @@ class SiteEngagementService : public KeyedService,
// Returns whether |url| has at least the given |level| of engagement.
bool IsEngagementAtLeast(const GURL& url, EngagementLevel level) const;
+ // Register |callback| to be run on the UI thread when the engagement for
+ // |url|'s origin reaches |level| or |score|. Callbacks for origins which have
calamity 2016/05/19 03:28:22 It's not obvious that this only happens when engag
dominickn 2016/05/19 04:36:15 I've made this comment more explicit - it's equal
+ // already reached the requested score will be dispatched as soon as they are
+ // registered. Callers are responsible for ensuring that |callback| is safe to
+ // run at any time.
+ void RegisterCallback(const EngagementCallback& callback,
+ const GURL& url,
+ EngagementLevel level);
+ void RegisterCallback(const EngagementCallback& callback,
+ const GURL& url,
+ double score);
+
// Resets the engagement score |url| to |score|, clearing daily limits.
void ResetScoreForURL(const GURL& url, double score);
@@ -109,6 +130,13 @@ class SiteEngagementService : public KeyedService,
double GetTotalEngagementPoints() const override;
private:
+ // Wrapping struct for callbacks.
+ struct EngagementCallbackWrapper {
+ EngagementCallback* callback;
+ GURL origin;
+ double score;
+ };
+
FRIEND_TEST_ALL_PREFIXES(SiteEngagementServiceTest, CheckHistograms);
FRIEND_TEST_ALL_PREFIXES(SiteEngagementServiceTest, CleanupEngagementScores);
FRIEND_TEST_ALL_PREFIXES(SiteEngagementServiceTest, ClearHistoryForURLs);
@@ -120,6 +148,7 @@ class SiteEngagementService : public KeyedService,
CleanupOriginsOnHistoryDeletion);
FRIEND_TEST_ALL_PREFIXES(SiteEngagementServiceTest, IsBootstrapped);
FRIEND_TEST_ALL_PREFIXES(SiteEngagementServiceTest, EngagementLevel);
+ FRIEND_TEST_ALL_PREFIXES(SiteEngagementServiceTest, RegisterCallbacks);
FRIEND_TEST_ALL_PREFIXES(SiteEngagementServiceTest, ScoreDecayHistograms);
FRIEND_TEST_ALL_PREFIXES(AppBannerSettingsHelperTest, SiteEngagementTrigger);
@@ -139,6 +168,9 @@ class SiteEngagementService : public KeyedService,
// Returns the median engagement score of all recorded origins.
double GetMedianEngagement(const std::map<GURL, double>& score_map) const;
+ // Returns the minimum engagement score corresponding to |level|.
+ double GetScoreForEngagementLevel(EngagementLevel level) const;
+
// Update the engagement score of the origin matching |url| for media playing.
// The points awarded are discounted if the media is being played in a non-
// visible tab.
@@ -172,6 +204,16 @@ class SiteEngagementService : public KeyedService,
bool expired,
const history::OriginCountAndLastVisitMap& remaining_origin_counts);
+ // Runs any callbacks in |engagement_callbacks_| which have been registered to
+ // listen to |url|'s origin reaching at least |score| engagement.
+ void ProcessCallbacks(const GURL& url, double score);
+
+ // Dispatches |callback| to be run on the UI thread, and deletes it once it
+ // has finished running.
+ void PostCallback(const EngagementCallback* callback,
+ const GURL& url,
+ double score);
+
// Resets the engagement score for |url| to |score|, and sets the last
// engagement time and last shortcut launch time (if it is non-null) to
// |updated_time|. Clears daily limits.
@@ -179,6 +221,11 @@ class SiteEngagementService : public KeyedService,
double score,
const base::Time* updated_time);
+ // Runs |callback| and deletes it once it has finished execution.
+ void RunAndDeleteCallback(const EngagementCallback* callback,
+ const GURL& origin,
+ double score) const;
+
Profile* profile_;
// The clock used to vend times.
@@ -191,6 +238,10 @@ class SiteEngagementService : public KeyedService,
// upload.
base::Time last_metrics_time_;
+ // A list of callbacks, registered with an origin and an engagement score.
+ // Once a callback is dispatched, its wrapper will be removed from the list.
+ std::vector<EngagementCallbackWrapper> engagement_callbacks_;
+
base::WeakPtrFactory<SiteEngagementService> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(SiteEngagementService);

Powered by Google App Engine
This is Rietveld 408576698