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

Side by Side Diff: content/renderer/media/renderer_webmediaplayer_delegate.cc

Issue 2218963003: Added metrics for background video playback. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Updated the browser test Created 4 years, 4 months 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 "content/renderer/media/renderer_webmediaplayer_delegate.h" 5 #include "content/renderer/media/renderer_webmediaplayer_delegate.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include "base/auto_reset.h" 9 #include "base/auto_reset.h"
10 #include "base/metrics/histogram_macros.h"
11 #include "base/metrics/user_metrics_action.h"
10 #include "content/common/media/media_player_delegate_messages.h" 12 #include "content/common/media/media_player_delegate_messages.h"
11 #include "content/public/renderer/render_frame.h" 13 #include "content/public/renderer/render_frame.h"
14 #include "content/public/renderer/render_thread.h"
12 #include "third_party/WebKit/public/platform/WebMediaPlayer.h" 15 #include "third_party/WebKit/public/platform/WebMediaPlayer.h"
13 16
17 namespace {
18
19 void RecordAction(const base::UserMetricsAction& action) {
20 content::RenderThread::Get()->RecordAction(action);
21 }
22
23 } // namespace
24
14 namespace media { 25 namespace media {
15 26
16 RendererWebMediaPlayerDelegate::RendererWebMediaPlayerDelegate( 27 RendererWebMediaPlayerDelegate::RendererWebMediaPlayerDelegate(
17 content::RenderFrame* render_frame) 28 content::RenderFrame* render_frame)
18 : RenderFrameObserver(render_frame), 29 : RenderFrameObserver(render_frame),
19 default_tick_clock_(new base::DefaultTickClock()), 30 default_tick_clock_(new base::DefaultTickClock()),
20 tick_clock_(default_tick_clock_.get()) { 31 tick_clock_(default_tick_clock_.get()) {
21 idle_cleanup_interval_ = base::TimeDelta::FromSeconds(5); 32 idle_cleanup_interval_ = base::TimeDelta::FromSeconds(5);
22 idle_timeout_ = base::TimeDelta::FromSeconds(15); 33 idle_timeout_ = base::TimeDelta::FromSeconds(15);
23 } 34 }
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
73 return render_frame()->IsHidden(); 84 return render_frame()->IsHidden();
74 } 85 }
75 86
76 bool RendererWebMediaPlayerDelegate::IsPlayingBackgroundVideo() { 87 bool RendererWebMediaPlayerDelegate::IsPlayingBackgroundVideo() {
77 return is_playing_background_video_; 88 return is_playing_background_video_;
78 } 89 }
79 90
80 void RendererWebMediaPlayerDelegate::WasHidden() { 91 void RendererWebMediaPlayerDelegate::WasHidden() {
81 for (IDMap<Observer>::iterator it(&id_map_); !it.IsAtEnd(); it.Advance()) 92 for (IDMap<Observer>::iterator it(&id_map_); !it.IsAtEnd(); it.Advance())
82 it.GetCurrentValue()->OnHidden(); 93 it.GetCurrentValue()->OnHidden();
94
95 RecordAction(base::UserMetricsAction("Media.Hidden"));
83 } 96 }
84 97
85 void RendererWebMediaPlayerDelegate::WasShown() { 98 void RendererWebMediaPlayerDelegate::WasShown() {
86 is_playing_background_video_ = false; 99 SetIsPlayingBackgroundVideo(false);
87 for (IDMap<Observer>::iterator it(&id_map_); !it.IsAtEnd(); it.Advance()) 100 for (IDMap<Observer>::iterator it(&id_map_); !it.IsAtEnd(); it.Advance())
88 it.GetCurrentValue()->OnShown(); 101 it.GetCurrentValue()->OnShown();
102
103 RecordAction(base::UserMetricsAction("Media.Shown"));
89 } 104 }
90 105
91 bool RendererWebMediaPlayerDelegate::OnMessageReceived( 106 bool RendererWebMediaPlayerDelegate::OnMessageReceived(
92 const IPC::Message& msg) { 107 const IPC::Message& msg) {
93 bool handled = true; 108 bool handled = true;
94 IPC_BEGIN_MESSAGE_MAP(RendererWebMediaPlayerDelegate, msg) 109 IPC_BEGIN_MESSAGE_MAP(RendererWebMediaPlayerDelegate, msg)
95 IPC_MESSAGE_HANDLER(MediaPlayerDelegateMsg_Pause, OnMediaDelegatePause) 110 IPC_MESSAGE_HANDLER(MediaPlayerDelegateMsg_Pause, OnMediaDelegatePause)
96 IPC_MESSAGE_HANDLER(MediaPlayerDelegateMsg_Play, OnMediaDelegatePlay) 111 IPC_MESSAGE_HANDLER(MediaPlayerDelegateMsg_Play, OnMediaDelegatePlay)
97 IPC_MESSAGE_HANDLER(MediaPlayerDelegateMsg_SuspendAllMediaPlayers, 112 IPC_MESSAGE_HANDLER(MediaPlayerDelegateMsg_SuspendAllMediaPlayers,
98 OnMediaDelegateSuspendAllMediaPlayers) 113 OnMediaDelegateSuspendAllMediaPlayers)
99 IPC_MESSAGE_HANDLER(MediaPlayerDelegateMsg_UpdateVolumeMultiplier, 114 IPC_MESSAGE_HANDLER(MediaPlayerDelegateMsg_UpdateVolumeMultiplier,
100 OnMediaDelegateVolumeMultiplierUpdate) 115 OnMediaDelegateVolumeMultiplierUpdate)
101 IPC_MESSAGE_UNHANDLED(handled = false) 116 IPC_MESSAGE_UNHANDLED(handled = false)
102 IPC_END_MESSAGE_MAP() 117 IPC_END_MESSAGE_MAP()
103 return handled; 118 return handled;
104 } 119 }
105 120
106 void RendererWebMediaPlayerDelegate::SetIdleCleanupParamsForTesting( 121 void RendererWebMediaPlayerDelegate::SetIdleCleanupParamsForTesting(
107 base::TimeDelta idle_timeout, 122 base::TimeDelta idle_timeout,
108 base::TickClock* tick_clock) { 123 base::TickClock* tick_clock) {
109 idle_cleanup_interval_ = base::TimeDelta(); 124 idle_cleanup_interval_ = base::TimeDelta();
110 idle_timeout_ = idle_timeout; 125 idle_timeout_ = idle_timeout;
111 tick_clock_ = tick_clock; 126 tick_clock_ = tick_clock;
112 } 127 }
113 128
114 void RendererWebMediaPlayerDelegate::OnMediaDelegatePause(int delegate_id) { 129 void RendererWebMediaPlayerDelegate::OnMediaDelegatePause(int delegate_id) {
115 Observer* observer = id_map_.Lookup(delegate_id); 130 Observer* observer = id_map_.Lookup(delegate_id);
116 if (observer) { 131 if (observer) {
117 if (playing_videos_.find(delegate_id) != playing_videos_.end()) 132 if (playing_videos_.find(delegate_id) != playing_videos_.end())
118 is_playing_background_video_ = false; 133 SetIsPlayingBackgroundVideo(false);
119 observer->OnPause(); 134 observer->OnPause();
120 } 135 }
136
137 RecordAction(base::UserMetricsAction("Media.Controls.RemotePause"));
121 } 138 }
122 139
123 void RendererWebMediaPlayerDelegate::OnMediaDelegatePlay(int delegate_id) { 140 void RendererWebMediaPlayerDelegate::OnMediaDelegatePlay(int delegate_id) {
124 Observer* observer = id_map_.Lookup(delegate_id); 141 Observer* observer = id_map_.Lookup(delegate_id);
125 if (observer) { 142 if (observer) {
126 if (playing_videos_.find(delegate_id) != playing_videos_.end()) 143 if (playing_videos_.find(delegate_id) != playing_videos_.end())
127 is_playing_background_video_ = IsHidden(); 144 SetIsPlayingBackgroundVideo(IsHidden());
128 observer->OnPlay(); 145 observer->OnPlay();
129 } 146 }
147
148 RecordAction(base::UserMetricsAction("Media.Controls.RemotePlay"));
130 } 149 }
131 150
132 void RendererWebMediaPlayerDelegate::OnMediaDelegateSuspendAllMediaPlayers() { 151 void RendererWebMediaPlayerDelegate::OnMediaDelegateSuspendAllMediaPlayers() {
133 for (IDMap<Observer>::iterator it(&id_map_); !it.IsAtEnd(); it.Advance()) 152 for (IDMap<Observer>::iterator it(&id_map_); !it.IsAtEnd(); it.Advance())
134 it.GetCurrentValue()->OnSuspendRequested(true); 153 it.GetCurrentValue()->OnSuspendRequested(true);
135 } 154 }
136 155
137 void RendererWebMediaPlayerDelegate::OnMediaDelegateVolumeMultiplierUpdate( 156 void RendererWebMediaPlayerDelegate::OnMediaDelegateVolumeMultiplierUpdate(
138 int delegate_id, 157 int delegate_id,
139 double multiplier) { 158 double multiplier) {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
186 it = idle_delegate_map_.erase(it); 205 it = idle_delegate_map_.erase(it);
187 else 206 else
188 ++it; 207 ++it;
189 } 208 }
190 209
191 // Shutdown the timer if no delegates are left. 210 // Shutdown the timer if no delegates are left.
192 if (idle_delegate_map_.empty()) 211 if (idle_delegate_map_.empty())
193 idle_cleanup_timer_.Stop(); 212 idle_cleanup_timer_.Stop();
194 } 213 }
195 214
215 void RendererWebMediaPlayerDelegate::SetIsPlayingBackgroundVideo(
216 bool is_playing) {
217 if (is_playing_background_video_ == is_playing) return;
218
219 // TODO(avayvod): This would be useful to collect on desktop too and express in
220 // actual media watch time vs. just elapsed time. See https://crbug.com/638726.
221 #if defined(OS_ANDROID)
222 if (is_playing_background_video_) {
223 UMA_HISTOGRAM_CUSTOM_TIMES(
224 "Media.Android.BackgroundVideoTime",
225 base::TimeTicks::Now() - background_video_playing_start_time_,
226 base::TimeDelta::FromSeconds(7), base::TimeDelta::FromHours(10), 50);
227 RecordAction(base::UserMetricsAction("Media.Session.BackgroundSuspend"));
228 } else {
229 background_video_playing_start_time_ = base::TimeTicks::Now();
230 RecordAction(base::UserMetricsAction("Media.Session.BackgroundResume"));
231 }
232 #endif // OS_ANDROID
233
234 is_playing_background_video_ = is_playing;
235 }
236
196 void RendererWebMediaPlayerDelegate::OnDestruct() { 237 void RendererWebMediaPlayerDelegate::OnDestruct() {
197 delete this; 238 delete this;
198 } 239 }
199 240
200 } // namespace media 241 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698