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_HELPER_H_ | 5 #ifndef CHROME_BROWSER_ENGAGEMENT_SITE_ENGAGEMENT_HELPER_H_ |
6 #define CHROME_BROWSER_ENGAGEMENT_SITE_ENGAGEMENT_HELPER_H_ | 6 #define CHROME_BROWSER_ENGAGEMENT_SITE_ENGAGEMENT_HELPER_H_ |
7 | 7 |
8 #include "base/macros.h" | 8 #include "base/macros.h" |
9 #include "base/timer/timer.h" | 9 #include "base/timer/timer.h" |
10 #include "chrome/browser/engagement/site_engagement_metrics.h" | 10 #include "chrome/browser/engagement/site_engagement_metrics.h" |
(...skipping 19 matching lines...) Expand all Loading... | |
30 static void SetSecondsTrackingDelayAfterShow(int seconds); | 30 static void SetSecondsTrackingDelayAfterShow(int seconds); |
31 | 31 |
32 // content::WebContentsObserver overrides. | 32 // content::WebContentsObserver overrides. |
33 void DidNavigateMainFrame( | 33 void DidNavigateMainFrame( |
34 const content::LoadCommittedDetails& details, | 34 const content::LoadCommittedDetails& details, |
35 const content::FrameNavigateParams& params) override; | 35 const content::FrameNavigateParams& params) override; |
36 void WasShown() override; | 36 void WasShown() override; |
37 void WasHidden() override; | 37 void WasHidden() override; |
38 | 38 |
39 private: | 39 private: |
40 // Class to encapsulate the user input listening. | 40 // Class to encapsulate the detection of site engagement. |
41 // | 41 // |
42 // Time on site is recorded by detecting any user input (mouse click, | 42 // All engagement detection begins at some constant time delta following |
43 // keypress, or touch gesture tap) per some discrete time unit. If there is | 43 // navigation or tab activation. Once engagement is recorded, detection is |
44 // user input, then record a positive site engagement. | 44 // suspended for another constant time delta. For sites to continually record |
45 // engagement, this overall design requires: | |
45 // | 46 // |
46 // When input is detected, SiteEngagementHelper::RecordUserInput is called, | 47 // 1. engagement at a non-trivial time after a site loads |
47 // and the input detection callbacks are paused for | 48 // 2. continual engagement over a non-trivial length of time |
48 // g_seconds_between_user_input_check. This ensures that there is minimal | 49 class EngagementTracker : public content::WebContentsObserver { |
calamity
2015/11/03 04:49:46
I think the subclasses should be made into WebCont
dominickn
2015/11/03 07:03:54
Done.
| |
49 // overhead in input listening, and that input over an extended length of time | |
50 // is required to continually increase the engagement score. | |
51 class InputTracker : public content::WebContentsObserver { | |
52 public: | 50 public: |
53 explicit InputTracker(content::WebContents* web_contents, | 51 explicit EngagementTracker(content::WebContents* web_contents, |
calamity
2015/11/03 04:49:46
This class is not so much a generic engagement tra
dominickn
2015/11/03 07:03:54
Great call. Done.
| |
54 SiteEngagementHelper* helper); | 52 SiteEngagementHelper* helper); |
55 ~InputTracker() override; | 53 ~EngagementTracker() override; |
56 | 54 |
57 // Begin tracking input after |initial_delay|. | 55 // Begin tracking input after |initial_delay|. |
58 void Start(base::TimeDelta initial_delay); | 56 void Start(base::TimeDelta initial_delay); |
59 | 57 |
60 // Pause listening for user input, restarting listening after a delay. | 58 // Pause listening for user input, restarting listening after a delay. |
61 void Pause(); | 59 void Pause(); |
62 | 60 |
63 // Stop listening for user input. | 61 // Stop listening for user input. |
64 void Stop(); | 62 void Stop(); |
65 | 63 |
66 // Returns whether the tracker will respond to user input via | 64 // Returns whether the tracker will respond to user input via |
67 // DidGetUserInteraction. | 65 // DidGetUserInteraction. |
68 bool is_tracking() const { return is_tracking_; } | 66 bool is_tracking() const { return is_tracking_; } |
69 | 67 |
70 // Set the timer object for testing purposes. | 68 // Set the timer object for testing purposes. |
71 void SetPauseTimerForTesting(scoped_ptr<base::Timer> timer); | 69 void SetPauseTimerForTesting(scoped_ptr<base::Timer> timer); |
72 | 70 |
73 private: | 71 protected: |
74 friend class SiteEngagementHelperTest; | 72 friend class SiteEngagementHelperTest; |
75 | 73 |
76 // Starts the timer for detecting user interaction. | 74 // Starts the timer for detecting user interaction. |
calamity
2015/11/03 04:49:46
nit: Update all comments.
dominickn
2015/11/03 07:03:54
Done.
| |
77 void StartTimer(base::TimeDelta delay); | 75 void StartTimer(base::TimeDelta delay); |
78 | 76 |
79 // Callback for StartTimer that activates the user input tracking. | 77 // Callback for StartTimer that activates the user input tracking. |
80 void StartTracking(); | 78 virtual void StartTracking(); |
81 | |
82 // content::WebContentsObserver overrides. | |
83 void DidGetUserInteraction(const blink::WebInputEvent::Type type) override; | |
84 | 79 |
calamity
2015/11/03 04:49:46
Data members should be private. Add accessors as n
dominickn
2015/11/03 07:03:54
Done.
| |
85 SiteEngagementHelper* helper_; | 80 SiteEngagementHelper* helper_; |
86 scoped_ptr<base::Timer> pause_timer_; | 81 scoped_ptr<base::Timer> pause_timer_; |
87 bool is_tracking_; | 82 bool is_tracking_; |
88 }; | 83 }; |
89 | 84 |
85 // Class to encapsulate time-on-site engagement. Time-on-site is recorded by | |
86 // detecting user input on a focused WebContents (mouse click, keypress, or | |
87 // touch gesture tap) over time. | |
calamity
2015/11/03 04:49:46
Comments for these concrete tracker classes should
dominickn
2015/11/03 07:03:54
Done.
| |
88 class InputTracker : public EngagementTracker { | |
89 public: | |
90 explicit InputTracker(content::WebContents* web_contents, | |
calamity
2015/11/03 04:49:46
nit: explicit only for single argument constructor
dominickn
2015/11/03 07:03:54
Done.
| |
91 SiteEngagementHelper* helper); | |
92 | |
93 private: | |
94 friend class SiteEngagementHelperTest; | |
95 | |
96 // content::WebContentsObserver overrides. | |
97 void DidGetUserInteraction(const blink::WebInputEvent::Type type) override; | |
98 }; | |
99 | |
100 // Class to encapsulate media detection. Any media playing in a WebContents | |
101 // (focused or not) will accumulate engagement points. Media in a hidden | |
102 // WebContents will accumulate engagement more slowly than in an active | |
103 // WebContents. Media which has been muted will also accumulate engagement | |
104 // more slowly. | |
105 class MediaTracker : public EngagementTracker { | |
106 public: | |
107 explicit MediaTracker(content::WebContents* web_contents, | |
108 SiteEngagementHelper* helper); | |
109 | |
110 private: | |
111 friend class SiteEngagementHelperTest; | |
112 | |
113 void StartTracking() override; | |
114 | |
115 // content::WebContentsObserver overrides. | |
116 void MediaStartedPlaying() override; | |
117 void MediaPaused() override; | |
118 void WasShown() override; | |
119 void WasHidden() override; | |
120 | |
121 bool is_hidden_; | |
122 bool is_playing_; | |
123 }; | |
124 | |
90 explicit SiteEngagementHelper(content::WebContents* web_contents); | 125 explicit SiteEngagementHelper(content::WebContents* web_contents); |
91 friend class content::WebContentsUserData<SiteEngagementHelper>; | 126 friend class content::WebContentsUserData<SiteEngagementHelper>; |
92 friend class SiteEngagementHelperTest; | 127 friend class SiteEngagementHelperTest; |
93 | 128 |
94 // Ask the SiteEngagementService to record engagement via user input at the | 129 // Ask the SiteEngagementService to record engagement via user input at the |
95 // current contents location. | 130 // current WebContents URL. |
96 void RecordUserInput(SiteEngagementMetrics::EngagementType type); | 131 void RecordUserInput(SiteEngagementMetrics::EngagementType type); |
97 | 132 |
133 // Ask the SiteEngagementService to record engagement via media playing at the | |
134 // current WebContents URL. | |
135 void RecordMediaPlaying(bool is_hidden); | |
136 | |
98 InputTracker input_tracker_; | 137 InputTracker input_tracker_; |
138 MediaTracker media_tracker_; | |
99 bool record_engagement_; | 139 bool record_engagement_; |
100 | 140 |
101 DISALLOW_COPY_AND_ASSIGN(SiteEngagementHelper); | 141 DISALLOW_COPY_AND_ASSIGN(SiteEngagementHelper); |
102 }; | 142 }; |
103 | 143 |
104 #endif // CHROME_BROWSER_ENGAGEMENT_SITE_ENGAGEMENT_HELPER_H_ | 144 #endif // CHROME_BROWSER_ENGAGEMENT_SITE_ENGAGEMENT_HELPER_H_ |
OLD | NEW |