Skip to content

Commit 693d01d

Browse files
committed
[Media Engagement] Track AudioContext playbacks
Adds AudioContext player tracking to MediaEngagementContentsObserver with it's own page level timer. On MediaEngagementSession this CL seperates significant playback into media element playback and audio context playback. Since we may record a playback we need to disable committing on significant playback and just record on destroy or navigate instead. BUG=878460 Change-Id: Ic66152f8cb5b3a6338804c04de7dd0bf5c1cb154 Reviewed-on: https://chromium-review.googlesource.com/1194992 Commit-Queue: Becca Hughes <[email protected]> Reviewed-by: Mounir Lamouri <[email protected]> Cr-Original-Commit-Position: refs/heads/master@{#587899}(cherry picked from commit e4555db) Reviewed-on: https://chromium-review.googlesource.com/1211874 Reviewed-by: Becca Hughes <[email protected]> Cr-Commit-Position: refs/branch-heads/3538@{#110} Cr-Branched-From: 79f7c91-refs/heads/master@{#587811}
1 parent a44bdb1 commit 693d01d

12 files changed

+711
-145
lines changed

chrome/browser/media/media_engagement_browsertest.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ class MediaEngagementPreloadBrowserTest : public InProcessBrowserTest {
337337
IN_PROC_BROWSER_TEST_F(MediaEngagementBrowserTest, RecordEngagement) {
338338
LoadTestPageAndWaitForPlayAndAudible("engagement_test.html", false);
339339
AdvanceMeaningfulPlaybackTime();
340-
ExpectScores(1, 1, 0, 0);
340+
ExpectScores(0, 0, 0, 0);
341341
CloseTab();
342342
ExpectScores(1, 1, 1, 1);
343343
}

chrome/browser/media/media_engagement_contents_observer.cc

Lines changed: 63 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,8 @@ void MediaEngagementContentsObserver::ClearPlayerStates() {
122122
playback_timer_.Stop();
123123
player_states_.clear();
124124
significant_players_.clear();
125+
audio_context_players_.clear();
126+
audio_context_timer_.Stop();
125127
}
126128

127129
void MediaEngagementContentsObserver::RegisterAudiblePlayersWithSession() {
@@ -270,8 +272,21 @@ void MediaEngagementContentsObserver::MediaStoppedPlaying(
270272
UpdatePlayerTimer(media_player_id);
271273
}
272274

275+
void MediaEngagementContentsObserver::AudioContextPlaybackStarted(
276+
const AudioContextId& audio_context_id) {
277+
audio_context_players_.insert(audio_context_id);
278+
UpdateAudioContextTimer();
279+
}
280+
281+
void MediaEngagementContentsObserver::AudioContextPlaybackStopped(
282+
const AudioContextId& audio_context_id) {
283+
audio_context_players_.erase(audio_context_id);
284+
UpdateAudioContextTimer();
285+
}
286+
273287
void MediaEngagementContentsObserver::DidUpdateAudioMutingState(bool muted) {
274288
UpdatePageTimer();
289+
UpdateAudioContextTimer();
275290
}
276291

277292
std::vector<MediaEngagementContentsObserver::InsignificantPlaybackReason>
@@ -330,7 +345,23 @@ void MediaEngagementContentsObserver::OnSignificantMediaPlaybackTimeForPlayer(
330345
void MediaEngagementContentsObserver::OnSignificantMediaPlaybackTimeForPage() {
331346
DCHECK(session_);
332347

333-
if (session_->significant_playback_recorded())
348+
if (session_->significant_media_element_playback_recorded())
349+
return;
350+
351+
// Do not record significant playback if the tab did not make
352+
// a sound recently.
353+
auto* audible_helper = RecentlyAudibleHelper::FromWebContents(web_contents());
354+
if (!audible_helper->WasRecentlyAudible())
355+
return;
356+
357+
session_->RecordSignificantMediaElementPlayback();
358+
}
359+
360+
void MediaEngagementContentsObserver::
361+
OnSignificantAudioContextPlaybackTimeForPage() {
362+
DCHECK(session_);
363+
364+
if (session_->significant_audio_context_playback_recorded())
334365
return;
335366

336367
// Do not record significant playback if the tab did not make
@@ -339,7 +370,7 @@ void MediaEngagementContentsObserver::OnSignificantMediaPlaybackTimeForPage() {
339370
if (!audible_helper->WasRecentlyAudible())
340371
return;
341372

342-
session_->RecordSignificantPlayback();
373+
session_->RecordSignificantAudioContextPlayback();
343374
}
344375

345376
void MediaEngagementContentsObserver::RecordInsignificantReasons(
@@ -474,7 +505,7 @@ bool MediaEngagementContentsObserver::AreConditionsMet() const {
474505
}
475506

476507
void MediaEngagementContentsObserver::UpdatePageTimer() {
477-
if (!session_ || session_->significant_playback_recorded())
508+
if (!session_ || session_->significant_media_element_playback_recorded())
478509
return;
479510

480511
if (AreConditionsMet()) {
@@ -497,6 +528,35 @@ void MediaEngagementContentsObserver::UpdatePageTimer() {
497528
}
498529
}
499530

531+
bool MediaEngagementContentsObserver::AreAudioContextConditionsMet() const {
532+
if (audio_context_players_.empty())
533+
return false;
534+
535+
return !web_contents()->IsAudioMuted();
536+
}
537+
538+
void MediaEngagementContentsObserver::UpdateAudioContextTimer() {
539+
if (!session_ || session_->significant_audio_context_playback_recorded())
540+
return;
541+
542+
if (AreAudioContextConditionsMet()) {
543+
if (audio_context_timer_.IsRunning())
544+
return;
545+
546+
if (task_runner_)
547+
audio_context_timer_.SetTaskRunner(task_runner_);
548+
549+
audio_context_timer_.Start(
550+
FROM_HERE,
551+
MediaEngagementContentsObserver::kSignificantMediaPlaybackTime,
552+
base::Bind(&MediaEngagementContentsObserver::
553+
OnSignificantAudioContextPlaybackTimeForPage,
554+
base::Unretained(this)));
555+
} else if (audio_context_timer_.IsRunning()) {
556+
audio_context_timer_.Stop();
557+
}
558+
}
559+
500560
void MediaEngagementContentsObserver::SetTaskRunnerForTest(
501561
scoped_refptr<base::SequencedTaskRunner> task_runner) {
502562
task_runner_ = std::move(task_runner);

chrome/browser/media/media_engagement_contents_observer.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ class MediaEngagementContentsObserver : public content::WebContentsObserver {
3939
void DidUpdateAudioMutingState(bool muted) override;
4040
void MediaMutedStatusChanged(const MediaPlayerId& id, bool muted) override;
4141
void MediaResized(const gfx::Size& size, const MediaPlayerId& id) override;
42+
void AudioContextPlaybackStarted(
43+
const AudioContextId& audio_context_id) override;
44+
void AudioContextPlaybackStopped(
45+
const AudioContextId& audio_context_id) override;
4246

4347
static const gfx::Size kSignificantSize;
4448
static const char* const kHistogramScoreAtPlaybackName;
@@ -96,9 +100,14 @@ class MediaEngagementContentsObserver : public content::WebContentsObserver {
96100

97101
void OnSignificantMediaPlaybackTimeForPlayer(const MediaPlayerId& id);
98102
void OnSignificantMediaPlaybackTimeForPage();
103+
void OnSignificantAudioContextPlaybackTimeForPage();
104+
99105
void UpdatePlayerTimer(const MediaPlayerId&);
100106
void UpdatePageTimer();
107+
void UpdateAudioContextTimer();
108+
101109
bool AreConditionsMet() const;
110+
bool AreAudioContextConditionsMet() const;
102111

103112
void SetTaskRunnerForTest(scoped_refptr<base::SequencedTaskRunner>);
104113

@@ -114,6 +123,13 @@ class MediaEngagementContentsObserver : public content::WebContentsObserver {
114123
// significant playback.
115124
std::set<MediaPlayerId> significant_players_;
116125

126+
// Timer that will fire when the playback time of any audio context reaches
127+
// the minimum for significant media playback.
128+
base::OneShotTimer audio_context_timer_;
129+
130+
// Set of active audio contexts that can produce a significant playback.
131+
std::set<AudioContextId> audio_context_players_;
132+
117133
// Measures playback time for a player.
118134
class PlaybackTimer {
119135
public:

0 commit comments

Comments
 (0)