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

Side by Side Diff: chrome/browser/engagement/site_engagement_helper.cc

Issue 1427913002: Implement media playing engagement detection for the site engagement service. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@user-input-event
Patch Set: Tests Created 5 years, 1 month 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 unified diff | Download patch
OLDNEW
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 #include "chrome/browser/engagement/site_engagement_helper.h" 5 #include "chrome/browser/engagement/site_engagement_helper.h"
6 6
7 #include "base/time/time.h" 7 #include "base/time/time.h"
8 #include "base/trace_event/trace_event.h" 8 #include "base/trace_event/trace_event.h"
9 #include "chrome/browser/engagement/site_engagement_service.h" 9 #include "chrome/browser/engagement/site_engagement_service.h"
10 #include "chrome/browser/engagement/site_engagement_service_factory.h" 10 #include "chrome/browser/engagement/site_engagement_service_factory.h"
11 #include "chrome/browser/profiles/profile.h" 11 #include "chrome/browser/profiles/profile.h"
12 #include "content/public/browser/navigation_entry.h" 12 #include "content/public/browser/navigation_entry.h"
13 #include "content/public/browser/web_contents.h" 13 #include "content/public/browser/web_contents.h"
14 14
15 namespace { 15 namespace {
16 16
17 int g_seconds_between_user_input_check = 10; 17 int g_seconds_to_pause_engagement_detection = 10;
18 int g_seconds_tracking_delay_after_navigation = 10; 18 int g_seconds_delay_after_navigation = 10;
19 int g_seconds_tracking_delay_after_show = 5; 19 int g_seconds_delay_after_show = 5;
20 20
21 } // anonymous namespace 21 } // anonymous namespace
22 22
23 DEFINE_WEB_CONTENTS_USER_DATA_KEY(SiteEngagementHelper); 23 DEFINE_WEB_CONTENTS_USER_DATA_KEY(SiteEngagementHelper);
24 24
25 SiteEngagementHelper::InputTracker::InputTracker( 25 SiteEngagementHelper::EngagementTracker::EngagementTracker(
26 content::WebContents* web_contents, 26 content::WebContents* web_contents,
27 SiteEngagementHelper* helper) 27 SiteEngagementHelper* helper)
28 : WebContentsObserver(web_contents), 28 : WebContentsObserver(web_contents),
29 helper_(helper), 29 helper_(helper),
30 pause_timer_(new base::Timer(true, false)), 30 pause_timer_(new base::Timer(true, false)),
31 is_tracking_(false) {} 31 is_tracking_(false) {}
32 32
33 SiteEngagementHelper::InputTracker::~InputTracker() {} 33 SiteEngagementHelper::EngagementTracker::~EngagementTracker() {}
34 34
35 void SiteEngagementHelper::InputTracker::Start(base::TimeDelta initial_delay) { 35 void SiteEngagementHelper::EngagementTracker::Start(
36 base::TimeDelta initial_delay) {
36 StartTimer(initial_delay); 37 StartTimer(initial_delay);
37 } 38 }
38 39
39 void SiteEngagementHelper::InputTracker::Pause() { 40 void SiteEngagementHelper::EngagementTracker::Pause() {
40 is_tracking_ = false; 41 is_tracking_ = false;
41 StartTimer(base::TimeDelta::FromSeconds(g_seconds_between_user_input_check)); 42 StartTimer(
43 base::TimeDelta::FromSeconds(g_seconds_to_pause_engagement_detection));
42 } 44 }
43 45
44 void SiteEngagementHelper::InputTracker::Stop() { 46 void SiteEngagementHelper::EngagementTracker::Stop() {
45 is_tracking_ = false; 47 is_tracking_ = false;
46 pause_timer_->Stop(); 48 pause_timer_->Stop();
47 } 49 }
48 50
49 void SiteEngagementHelper::InputTracker::SetPauseTimerForTesting( 51 void SiteEngagementHelper::EngagementTracker::SetPauseTimerForTesting(
50 scoped_ptr<base::Timer> timer) { 52 scoped_ptr<base::Timer> timer) {
51 pause_timer_ = timer.Pass(); 53 pause_timer_ = timer.Pass();
52 } 54 }
53 55
54 void SiteEngagementHelper::InputTracker::StartTimer(base::TimeDelta delay) { 56 void SiteEngagementHelper::EngagementTracker::StartTimer(
57 base::TimeDelta delay) {
55 pause_timer_->Start( 58 pause_timer_->Start(
56 FROM_HERE, delay, 59 FROM_HERE, delay,
57 base::Bind(&SiteEngagementHelper::InputTracker::StartTracking, 60 base::Bind(&SiteEngagementHelper::EngagementTracker::StartTracking,
58 base::Unretained(this))); 61 base::Unretained(this)));
59 } 62 }
60 63
61 void SiteEngagementHelper::InputTracker::StartTracking() { 64 void SiteEngagementHelper::EngagementTracker::StartTracking() {
62 is_tracking_ = true; 65 is_tracking_ = true;
63 } 66 }
64 67
68 SiteEngagementHelper::InputTracker::InputTracker(
69 content::WebContents* web_contents,
70 SiteEngagementHelper* helper)
71 : EngagementTracker(web_contents, helper) {}
72
65 // Record that there was some user input, and defer handling of the input event. 73 // Record that there was some user input, and defer handling of the input event.
66 // Once the timer finishes running, the callbacks detecting user input will be 74 // Once the timer finishes running, the callbacks detecting user input will be
67 // registered again. 75 // registered again.
68 void SiteEngagementHelper::InputTracker::DidGetUserInteraction( 76 void SiteEngagementHelper::InputTracker::DidGetUserInteraction(
69 const blink::WebInputEvent::Type type) { 77 const blink::WebInputEvent::Type type) {
70 // Only respond to raw key down to avoid multiple triggering on a single input 78 // Only respond to raw key down to avoid multiple triggering on a single input
71 // (e.g. keypress is a key down then key up). 79 // (e.g. keypress is a key down then key up).
72 if (!is_tracking_) 80 if (!is_tracking_)
73 return; 81 return;
74 82
(...skipping 12 matching lines...) Expand all
87 break; 95 break;
88 case blink::WebInputEvent::MouseWheel: 96 case blink::WebInputEvent::MouseWheel:
89 helper_->RecordUserInput(SiteEngagementMetrics::ENGAGEMENT_WHEEL); 97 helper_->RecordUserInput(SiteEngagementMetrics::ENGAGEMENT_WHEEL);
90 break; 98 break;
91 default: 99 default:
92 NOTREACHED(); 100 NOTREACHED();
93 } 101 }
94 Pause(); 102 Pause();
95 } 103 }
96 104
105 SiteEngagementHelper::MediaTracker::MediaTracker(
106 content::WebContents* web_contents,
107 SiteEngagementHelper* helper)
108 : EngagementTracker(web_contents, helper),
109 is_hidden_(false),
110 is_playing_(false) {}
111
112 void SiteEngagementHelper::MediaTracker::StartTracking() {
113 SiteEngagementHelper::EngagementTracker::StartTracking();
114
115 if (is_playing_)
116 helper_->RecordMediaPlaying(is_hidden_);
117
118 Pause();
calamity 2015/11/03 04:49:45 Okay, now that this is checking on a set interval,
dominickn 2015/11/03 07:03:54 Acknowledged.
119 }
120
121 void SiteEngagementHelper::MediaTracker::MediaStartedPlaying() {
122 is_playing_ = true;
123 }
124
125 void SiteEngagementHelper::MediaTracker::MediaPaused() {
126 is_playing_ = false;
127 }
128
129 void SiteEngagementHelper::MediaTracker::WasShown() {
130 is_hidden_ = false;
131 }
132
133 void SiteEngagementHelper::MediaTracker::WasHidden() {
134 is_hidden_ = true;
135 }
136
97 SiteEngagementHelper::~SiteEngagementHelper() { 137 SiteEngagementHelper::~SiteEngagementHelper() {
98 content::WebContents* contents = web_contents(); 138 content::WebContents* contents = web_contents();
99 if (contents) 139 if (contents) {
100 input_tracker_.Stop(); 140 input_tracker_.Stop();
141 media_tracker_.Stop();
142 }
101 } 143 }
102 144
103 SiteEngagementHelper::SiteEngagementHelper(content::WebContents* web_contents) 145 SiteEngagementHelper::SiteEngagementHelper(content::WebContents* web_contents)
104 : content::WebContentsObserver(web_contents), 146 : content::WebContentsObserver(web_contents),
105 input_tracker_(web_contents, this), 147 input_tracker_(web_contents, this),
148 media_tracker_(web_contents, this),
106 record_engagement_(false) {} 149 record_engagement_(false) {}
107 150
108 void SiteEngagementHelper::RecordUserInput( 151 void SiteEngagementHelper::RecordUserInput(
109 SiteEngagementMetrics::EngagementType type) { 152 SiteEngagementMetrics::EngagementType type) {
110 TRACE_EVENT0("SiteEngagement", "RecordUserInput"); 153 TRACE_EVENT0("SiteEngagement", "RecordUserInput");
111 content::WebContents* contents = web_contents(); 154 content::WebContents* contents = web_contents();
112 if (contents) { 155 if (contents) {
113 Profile* profile = 156 Profile* profile =
114 Profile::FromBrowserContext(contents->GetBrowserContext()); 157 Profile::FromBrowserContext(contents->GetBrowserContext());
115 SiteEngagementService* service = 158 SiteEngagementService* service =
116 SiteEngagementServiceFactory::GetForProfile(profile); 159 SiteEngagementServiceFactory::GetForProfile(profile);
117 160
118 // Service is null in incognito. 161 // Service is null in incognito.
119 if (service) 162 if (service)
120 service->HandleUserInput(contents->GetVisibleURL(), type); 163 service->HandleUserInput(contents->GetVisibleURL(), type);
121 } 164 }
122 } 165 }
123 166
167 void SiteEngagementHelper::RecordMediaPlaying(bool is_hidden) {
168 content::WebContents* contents = web_contents();
169 if (contents) {
170 Profile* profile =
171 Profile::FromBrowserContext(contents->GetBrowserContext());
172 SiteEngagementService* service =
173 SiteEngagementServiceFactory::GetForProfile(profile);
174
175 if (service) {
176 service->HandleMediaPlaying(contents->GetVisibleURL(), is_hidden);
177 }
calamity 2015/11/03 04:49:45 nit: remove curlies.
dominickn 2015/11/03 07:03:54 Done.
178 }
179 }
180
124 void SiteEngagementHelper::DidNavigateMainFrame( 181 void SiteEngagementHelper::DidNavigateMainFrame(
125 const content::LoadCommittedDetails& details, 182 const content::LoadCommittedDetails& details,
126 const content::FrameNavigateParams& params) { 183 const content::FrameNavigateParams& params) {
127 input_tracker_.Stop(); 184 input_tracker_.Stop();
185 media_tracker_.Stop();
128 186
129 record_engagement_ = params.url.SchemeIsHTTPOrHTTPS(); 187 record_engagement_ = params.url.SchemeIsHTTPOrHTTPS();
130 188
131 // Ignore all schemes except HTTP and HTTPS. 189 // Ignore all schemes except HTTP and HTTPS.
132 if (!record_engagement_) 190 if (!record_engagement_)
133 return; 191 return;
134 192
135 Profile* profile = 193 Profile* profile =
136 Profile::FromBrowserContext(web_contents()->GetBrowserContext()); 194 Profile::FromBrowserContext(web_contents()->GetBrowserContext());
137 SiteEngagementService* service = 195 SiteEngagementService* service =
138 SiteEngagementServiceFactory::GetForProfile(profile); 196 SiteEngagementServiceFactory::GetForProfile(profile);
139 197
140 if (service) 198 if (service)
141 service->HandleNavigation(params.url, params.transition); 199 service->HandleNavigation(params.url, params.transition);
142 200
143 input_tracker_.Start( 201 base::TimeDelta delay =
144 base::TimeDelta::FromSeconds(g_seconds_tracking_delay_after_navigation)); 202 base::TimeDelta::FromSeconds(g_seconds_delay_after_navigation);
203 input_tracker_.Start(delay);
204 media_tracker_.Start(delay);
145 } 205 }
146 206
147 void SiteEngagementHelper::WasShown() { 207 void SiteEngagementHelper::WasShown() {
148 // Ensure that the input callbacks are registered when we come into view. 208 // Ensure that the input callbacks are registered when we come into view.
149 if (record_engagement_) { 209 if (record_engagement_) {
150 input_tracker_.Start( 210 base::TimeDelta delay =
151 base::TimeDelta::FromSeconds(g_seconds_tracking_delay_after_show)); 211 base::TimeDelta::FromSeconds(g_seconds_delay_after_show);
212 input_tracker_.Start(delay);
213 media_tracker_.Start(delay);
152 } 214 }
153 } 215 }
154 216
155 void SiteEngagementHelper::WasHidden() { 217 void SiteEngagementHelper::WasHidden() {
156 // Ensure that the input callbacks are not registered when hidden. 218 // Ensure that the input callbacks are not registered when hidden.
157 input_tracker_.Stop(); 219 input_tracker_.Stop();
158 } 220 }
159 221
160 // static 222 // static
161 void SiteEngagementHelper::SetSecondsBetweenUserInputCheck(int seconds) { 223 void SiteEngagementHelper::SetSecondsBetweenUserInputCheck(int seconds) {
162 g_seconds_between_user_input_check = seconds; 224 g_seconds_to_pause_engagement_detection = seconds;
163 } 225 }
164 226
165 // static 227 // static
166 void SiteEngagementHelper::SetSecondsTrackingDelayAfterNavigation(int seconds) { 228 void SiteEngagementHelper::SetSecondsTrackingDelayAfterNavigation(int seconds) {
167 g_seconds_tracking_delay_after_navigation = seconds; 229 g_seconds_delay_after_navigation = seconds;
168 } 230 }
169 231
170 // static 232 // static
171 void SiteEngagementHelper::SetSecondsTrackingDelayAfterShow(int seconds) { 233 void SiteEngagementHelper::SetSecondsTrackingDelayAfterShow(int seconds) {
172 g_seconds_tracking_delay_after_show = seconds; 234 g_seconds_delay_after_show = seconds;
173 } 235 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698