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; |
} |