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

Unified 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: Addressing nits 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/engagement/site_engagement_helper.cc
diff --git a/chrome/browser/engagement/site_engagement_helper.cc b/chrome/browser/engagement/site_engagement_helper.cc
index b1ead5f5db1109f6fa474bb2fa5762cabfdf0a20..4e9ac8d229be474deea713f2b76a9c3a618f56ce 100644
--- a/chrome/browser/engagement/site_engagement_helper.cc
+++ b/chrome/browser/engagement/site_engagement_helper.cc
@@ -14,54 +14,62 @@
namespace {
-int g_seconds_between_user_input_check = 10;
-int g_seconds_tracking_delay_after_navigation = 10;
-int g_seconds_tracking_delay_after_show = 5;
+int g_seconds_to_pause_engagement_detection = 10;
+int g_seconds_delay_after_navigation = 10;
+int g_seconds_delay_after_show = 5;
} // anonymous namespace
DEFINE_WEB_CONTENTS_USER_DATA_KEY(SiteEngagementHelper);
-SiteEngagementHelper::InputTracker::InputTracker(
- content::WebContents* web_contents,
+SiteEngagementHelper::PeriodicTracker::PeriodicTracker(
SiteEngagementHelper* helper)
- : WebContentsObserver(web_contents),
- helper_(helper),
- pause_timer_(new base::Timer(true, false)),
- is_tracking_(false) {}
+ : helper_(helper), pause_timer_(new base::Timer(true, false)) {}
-SiteEngagementHelper::InputTracker::~InputTracker() {}
+SiteEngagementHelper::PeriodicTracker::~PeriodicTracker() {}
-void SiteEngagementHelper::InputTracker::Start(base::TimeDelta initial_delay) {
+void SiteEngagementHelper::PeriodicTracker::Start(
+ base::TimeDelta initial_delay) {
StartTimer(initial_delay);
}
-void SiteEngagementHelper::InputTracker::Pause() {
- is_tracking_ = false;
- StartTimer(base::TimeDelta::FromSeconds(g_seconds_between_user_input_check));
+void SiteEngagementHelper::PeriodicTracker::Pause() {
+ TrackingStopped();
+ StartTimer(
+ base::TimeDelta::FromSeconds(g_seconds_to_pause_engagement_detection));
}
-void SiteEngagementHelper::InputTracker::Stop() {
- is_tracking_ = false;
+void SiteEngagementHelper::PeriodicTracker::Stop() {
+ TrackingStopped();
pause_timer_->Stop();
}
-void SiteEngagementHelper::InputTracker::SetPauseTimerForTesting(
+void SiteEngagementHelper::PeriodicTracker::SetPauseTimerForTesting(
scoped_ptr<base::Timer> timer) {
pause_timer_ = timer.Pass();
}
-void SiteEngagementHelper::InputTracker::StartTimer(base::TimeDelta delay) {
+void SiteEngagementHelper::PeriodicTracker::StartTimer(
+ base::TimeDelta delay) {
pause_timer_->Start(
FROM_HERE, delay,
- base::Bind(&SiteEngagementHelper::InputTracker::StartTracking,
+ base::Bind(&SiteEngagementHelper::PeriodicTracker::TrackingStarted,
base::Unretained(this)));
}
-void SiteEngagementHelper::InputTracker::StartTracking() {
+SiteEngagementHelper::InputTracker::InputTracker(
+ SiteEngagementHelper* helper,
+ content::WebContents* web_contents)
+ : PeriodicTracker(helper), content::WebContentsObserver(web_contents) {}
+
+void SiteEngagementHelper::InputTracker::TrackingStarted() {
is_tracking_ = true;
}
+void SiteEngagementHelper::InputTracker::TrackingStopped() {
+ is_tracking_ = false;
+}
+
// Record that there was some user input, and defer handling of the input event.
// Once the timer finishes running, the callbacks detecting user input will be
// registered again.
@@ -77,16 +85,17 @@ void SiteEngagementHelper::InputTracker::DidGetUserInteraction(
// compiler verifying that all cases are covered).
switch (type) {
case blink::WebInputEvent::RawKeyDown:
- helper_->RecordUserInput(SiteEngagementMetrics::ENGAGEMENT_KEYPRESS);
+ helper()->RecordUserInput(SiteEngagementMetrics::ENGAGEMENT_KEYPRESS);
break;
case blink::WebInputEvent::MouseDown:
- helper_->RecordUserInput(SiteEngagementMetrics::ENGAGEMENT_MOUSE);
+ helper()->RecordUserInput(SiteEngagementMetrics::ENGAGEMENT_MOUSE);
break;
case blink::WebInputEvent::GestureTapDown:
- helper_->RecordUserInput(SiteEngagementMetrics::ENGAGEMENT_TOUCH_GESTURE);
+ helper()->RecordUserInput(
+ SiteEngagementMetrics::ENGAGEMENT_TOUCH_GESTURE);
break;
case blink::WebInputEvent::MouseWheel:
- helper_->RecordUserInput(SiteEngagementMetrics::ENGAGEMENT_WHEEL);
+ helper()->RecordUserInput(SiteEngagementMetrics::ENGAGEMENT_WHEEL);
break;
default:
NOTREACHED();
@@ -94,15 +103,48 @@ void SiteEngagementHelper::InputTracker::DidGetUserInteraction(
Pause();
}
+SiteEngagementHelper::MediaTracker::MediaTracker(
+ SiteEngagementHelper* helper,
+ content::WebContents* web_contents)
+ : PeriodicTracker(helper), content::WebContentsObserver(web_contents),
+ is_hidden_(false),
+ is_playing_(false) {}
+
+void SiteEngagementHelper::MediaTracker::TrackingStarted() {
+ if (is_playing_)
+ helper()->RecordMediaPlaying(is_hidden_);
+
+ Pause();
+}
+
+void SiteEngagementHelper::MediaTracker::MediaStartedPlaying() {
+ is_playing_ = true;
+}
+
+void SiteEngagementHelper::MediaTracker::MediaPaused() {
+ is_playing_ = false;
+}
+
+void SiteEngagementHelper::MediaTracker::WasShown() {
+ is_hidden_ = false;
+}
+
+void SiteEngagementHelper::MediaTracker::WasHidden() {
+ is_hidden_ = true;
+}
+
SiteEngagementHelper::~SiteEngagementHelper() {
content::WebContents* contents = web_contents();
- if (contents)
+ if (contents) {
input_tracker_.Stop();
+ media_tracker_.Stop();
+ }
}
SiteEngagementHelper::SiteEngagementHelper(content::WebContents* web_contents)
: content::WebContentsObserver(web_contents),
- input_tracker_(web_contents, this),
+ input_tracker_(this, web_contents),
+ media_tracker_(this, web_contents),
record_engagement_(false) {}
void SiteEngagementHelper::RecordUserInput(
@@ -121,10 +163,24 @@ void SiteEngagementHelper::RecordUserInput(
}
}
+void SiteEngagementHelper::RecordMediaPlaying(bool is_hidden) {
+ content::WebContents* contents = web_contents();
+ if (contents) {
+ Profile* profile =
+ Profile::FromBrowserContext(contents->GetBrowserContext());
+ SiteEngagementService* service =
+ SiteEngagementServiceFactory::GetForProfile(profile);
+
+ if (service)
+ service->HandleMediaPlaying(contents->GetVisibleURL(), is_hidden);
+ }
+}
+
void SiteEngagementHelper::DidNavigateMainFrame(
const content::LoadCommittedDetails& details,
const content::FrameNavigateParams& params) {
input_tracker_.Stop();
+ media_tracker_.Stop();
record_engagement_ = params.url.SchemeIsHTTPOrHTTPS();
@@ -140,15 +196,19 @@ void SiteEngagementHelper::DidNavigateMainFrame(
if (service)
service->HandleNavigation(params.url, params.transition);
- input_tracker_.Start(
- base::TimeDelta::FromSeconds(g_seconds_tracking_delay_after_navigation));
+ base::TimeDelta delay =
+ base::TimeDelta::FromSeconds(g_seconds_delay_after_navigation);
+ input_tracker_.Start(delay);
+ media_tracker_.Start(delay);
}
void SiteEngagementHelper::WasShown() {
// Ensure that the input callbacks are registered when we come into view.
if (record_engagement_) {
- input_tracker_.Start(
- base::TimeDelta::FromSeconds(g_seconds_tracking_delay_after_show));
+ base::TimeDelta delay =
+ base::TimeDelta::FromSeconds(g_seconds_delay_after_show);
+ input_tracker_.Start(delay);
+ media_tracker_.Start(delay);
}
}
@@ -159,15 +219,15 @@ void SiteEngagementHelper::WasHidden() {
// static
void SiteEngagementHelper::SetSecondsBetweenUserInputCheck(int seconds) {
- g_seconds_between_user_input_check = seconds;
+ g_seconds_to_pause_engagement_detection = seconds;
}
// static
void SiteEngagementHelper::SetSecondsTrackingDelayAfterNavigation(int seconds) {
- g_seconds_tracking_delay_after_navigation = seconds;
+ g_seconds_delay_after_navigation = seconds;
}
// static
void SiteEngagementHelper::SetSecondsTrackingDelayAfterShow(int seconds) {
- g_seconds_tracking_delay_after_show = seconds;
+ g_seconds_delay_after_show = seconds;
}
« no previous file with comments | « chrome/browser/engagement/site_engagement_helper.h ('k') | chrome/browser/engagement/site_engagement_helper_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698