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

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: Added PowerObserver 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"
12 #include "base/power_monitor/power_monitor.h"
10 #include "content/common/media/media_player_delegate_messages.h" 13 #include "content/common/media/media_player_delegate_messages.h"
11 #include "content/public/renderer/render_frame.h" 14 #include "content/public/renderer/render_frame.h"
15 #include "content/public/renderer/render_thread.h"
12 #include "third_party/WebKit/public/platform/WebMediaPlayer.h" 16 #include "third_party/WebKit/public/platform/WebMediaPlayer.h"
13 17
18 namespace {
19
20 void RecordAction(const base::UserMetricsAction& action) {
21 content::RenderThread::Get()->RecordAction(action);
mlamouri (slow - plz ping) 2016/08/08 13:19:30 You could also make it take a std::string and do t
whywhat 2016/08/11 21:51:04 Done. I don't think extract_actions.py would extra
22 }
23
24 } // namespace
25
14 namespace media { 26 namespace media {
15 27
16 RendererWebMediaPlayerDelegate::RendererWebMediaPlayerDelegate( 28 RendererWebMediaPlayerDelegate::RendererWebMediaPlayerDelegate(
17 content::RenderFrame* render_frame) 29 content::RenderFrame* render_frame)
18 : RenderFrameObserver(render_frame), 30 : RenderFrameObserver(render_frame),
19 default_tick_clock_(new base::DefaultTickClock()), 31 default_tick_clock_(new base::DefaultTickClock()),
20 tick_clock_(default_tick_clock_.get()) { 32 tick_clock_(default_tick_clock_.get()) {
21 idle_cleanup_interval_ = base::TimeDelta::FromSeconds(5); 33 idle_cleanup_interval_ = base::TimeDelta::FromSeconds(5);
22 idle_timeout_ = base::TimeDelta::FromSeconds(15); 34 idle_timeout_ = base::TimeDelta::FromSeconds(15);
35 base::PowerMonitor::Get()->AddObserver(this);
23 } 36 }
24 37
25 RendererWebMediaPlayerDelegate::~RendererWebMediaPlayerDelegate() {} 38 RendererWebMediaPlayerDelegate::~RendererWebMediaPlayerDelegate() {
39 SetIsPlayingBackgroundVideo(false);
40 base::PowerMonitor::Get()->RemoveObserver(this);
41 }
42
43 void RendererWebMediaPlayerDelegate::OnSuspend() {
44 if (is_playing_background_video_)
45 power_suspended_time_ = base::TimeTicks::Now();
mlamouri (slow - plz ping) 2016/08/08 13:19:30 I'm a bit confused about this change. If I underst
DaleCurtis 2016/08/08 18:26:45 Yes, suspend behaves differently on other platform
whywhat 2016/08/11 21:51:04 #ifdef'ed with OS_ANDROID, if that's what you mean
46 }
47
48 void RendererWebMediaPlayerDelegate::OnResume() {
49 if (is_playing_background_video_) {
mlamouri (slow - plz ping) 2016/08/08 13:19:30 nit: here and above, you could do an early return.
whywhat 2016/08/11 21:51:04 N/A
50 background_video_playing_start_time_ +=
51 base::TimeTicks::Now() - power_suspended_time_;
52 }
53 }
26 54
27 int RendererWebMediaPlayerDelegate::AddObserver(Observer* observer) { 55 int RendererWebMediaPlayerDelegate::AddObserver(Observer* observer) {
28 return id_map_.Add(observer); 56 return id_map_.Add(observer);
29 } 57 }
30 58
31 void RendererWebMediaPlayerDelegate::RemoveObserver(int delegate_id) { 59 void RendererWebMediaPlayerDelegate::RemoveObserver(int delegate_id) {
32 DCHECK(id_map_.Lookup(delegate_id)); 60 DCHECK(id_map_.Lookup(delegate_id));
33 id_map_.Remove(delegate_id); 61 id_map_.Remove(delegate_id);
34 RemoveIdleDelegate(delegate_id); 62 RemoveIdleDelegate(delegate_id);
35 playing_videos_.erase(delegate_id); 63 playing_videos_.erase(delegate_id);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
73 return render_frame()->IsHidden(); 101 return render_frame()->IsHidden();
74 } 102 }
75 103
76 bool RendererWebMediaPlayerDelegate::IsPlayingBackgroundVideo() { 104 bool RendererWebMediaPlayerDelegate::IsPlayingBackgroundVideo() {
77 return is_playing_background_video_; 105 return is_playing_background_video_;
78 } 106 }
79 107
80 void RendererWebMediaPlayerDelegate::WasHidden() { 108 void RendererWebMediaPlayerDelegate::WasHidden() {
81 for (IDMap<Observer>::iterator it(&id_map_); !it.IsAtEnd(); it.Advance()) 109 for (IDMap<Observer>::iterator it(&id_map_); !it.IsAtEnd(); it.Advance())
82 it.GetCurrentValue()->OnHidden(); 110 it.GetCurrentValue()->OnHidden();
111
112 RecordAction(base::UserMetricsAction("Media.Hidden"));
83 } 113 }
84 114
85 void RendererWebMediaPlayerDelegate::WasShown() { 115 void RendererWebMediaPlayerDelegate::WasShown() {
86 is_playing_background_video_ = false; 116 SetIsPlayingBackgroundVideo(false);
87 for (IDMap<Observer>::iterator it(&id_map_); !it.IsAtEnd(); it.Advance()) 117 for (IDMap<Observer>::iterator it(&id_map_); !it.IsAtEnd(); it.Advance())
88 it.GetCurrentValue()->OnShown(); 118 it.GetCurrentValue()->OnShown();
119
120 RecordAction(base::UserMetricsAction("Media.Shown"));
89 } 121 }
90 122
91 bool RendererWebMediaPlayerDelegate::OnMessageReceived( 123 bool RendererWebMediaPlayerDelegate::OnMessageReceived(
92 const IPC::Message& msg) { 124 const IPC::Message& msg) {
93 bool handled = true; 125 bool handled = true;
94 IPC_BEGIN_MESSAGE_MAP(RendererWebMediaPlayerDelegate, msg) 126 IPC_BEGIN_MESSAGE_MAP(RendererWebMediaPlayerDelegate, msg)
95 IPC_MESSAGE_HANDLER(MediaPlayerDelegateMsg_Pause, OnMediaDelegatePause) 127 IPC_MESSAGE_HANDLER(MediaPlayerDelegateMsg_Pause, OnMediaDelegatePause)
96 IPC_MESSAGE_HANDLER(MediaPlayerDelegateMsg_Play, OnMediaDelegatePlay) 128 IPC_MESSAGE_HANDLER(MediaPlayerDelegateMsg_Play, OnMediaDelegatePlay)
97 IPC_MESSAGE_HANDLER(MediaPlayerDelegateMsg_SuspendAllMediaPlayers, 129 IPC_MESSAGE_HANDLER(MediaPlayerDelegateMsg_SuspendAllMediaPlayers,
98 OnMediaDelegateSuspendAllMediaPlayers) 130 OnMediaDelegateSuspendAllMediaPlayers)
99 IPC_MESSAGE_HANDLER(MediaPlayerDelegateMsg_UpdateVolumeMultiplier, 131 IPC_MESSAGE_HANDLER(MediaPlayerDelegateMsg_UpdateVolumeMultiplier,
100 OnMediaDelegateVolumeMultiplierUpdate) 132 OnMediaDelegateVolumeMultiplierUpdate)
101 IPC_MESSAGE_UNHANDLED(handled = false) 133 IPC_MESSAGE_UNHANDLED(handled = false)
102 IPC_END_MESSAGE_MAP() 134 IPC_END_MESSAGE_MAP()
103 return handled; 135 return handled;
104 } 136 }
105 137
106 void RendererWebMediaPlayerDelegate::SetIdleCleanupParamsForTesting( 138 void RendererWebMediaPlayerDelegate::SetIdleCleanupParamsForTesting(
107 base::TimeDelta idle_timeout, 139 base::TimeDelta idle_timeout,
108 base::TickClock* tick_clock) { 140 base::TickClock* tick_clock) {
109 idle_cleanup_interval_ = base::TimeDelta(); 141 idle_cleanup_interval_ = base::TimeDelta();
110 idle_timeout_ = idle_timeout; 142 idle_timeout_ = idle_timeout;
111 tick_clock_ = tick_clock; 143 tick_clock_ = tick_clock;
112 } 144 }
113 145
114 void RendererWebMediaPlayerDelegate::OnMediaDelegatePause(int delegate_id) { 146 void RendererWebMediaPlayerDelegate::OnMediaDelegatePause(int delegate_id) {
115 Observer* observer = id_map_.Lookup(delegate_id); 147 Observer* observer = id_map_.Lookup(delegate_id);
116 if (observer) { 148 if (observer) {
117 if (playing_videos_.find(delegate_id) != playing_videos_.end()) 149 if (playing_videos_.find(delegate_id) != playing_videos_.end())
118 is_playing_background_video_ = false; 150 SetIsPlayingBackgroundVideo(false);
119 observer->OnPause(); 151 observer->OnPause();
120 } 152 }
153
154 RecordAction(base::UserMetricsAction("Media.RemoteControls.Pause"));
121 } 155 }
122 156
123 void RendererWebMediaPlayerDelegate::OnMediaDelegatePlay(int delegate_id) { 157 void RendererWebMediaPlayerDelegate::OnMediaDelegatePlay(int delegate_id) {
124 Observer* observer = id_map_.Lookup(delegate_id); 158 Observer* observer = id_map_.Lookup(delegate_id);
125 if (observer) { 159 if (observer) {
126 if (playing_videos_.find(delegate_id) != playing_videos_.end()) 160 if (playing_videos_.find(delegate_id) != playing_videos_.end())
127 is_playing_background_video_ = IsHidden(); 161 SetIsPlayingBackgroundVideo(IsHidden());
128 observer->OnPlay(); 162 observer->OnPlay();
129 } 163 }
164
165 RecordAction(base::UserMetricsAction("Media.RemoteControls.Play"));
130 } 166 }
131 167
132 void RendererWebMediaPlayerDelegate::OnMediaDelegateSuspendAllMediaPlayers() { 168 void RendererWebMediaPlayerDelegate::OnMediaDelegateSuspendAllMediaPlayers() {
133 for (IDMap<Observer>::iterator it(&id_map_); !it.IsAtEnd(); it.Advance()) 169 for (IDMap<Observer>::iterator it(&id_map_); !it.IsAtEnd(); it.Advance())
134 it.GetCurrentValue()->OnSuspendRequested(true); 170 it.GetCurrentValue()->OnSuspendRequested(true);
135 } 171 }
136 172
137 void RendererWebMediaPlayerDelegate::OnMediaDelegateVolumeMultiplierUpdate( 173 void RendererWebMediaPlayerDelegate::OnMediaDelegateVolumeMultiplierUpdate(
138 int delegate_id, 174 int delegate_id,
139 double multiplier) { 175 double multiplier) {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
186 it = idle_delegate_map_.erase(it); 222 it = idle_delegate_map_.erase(it);
187 else 223 else
188 ++it; 224 ++it;
189 } 225 }
190 226
191 // Shutdown the timer if no delegates are left. 227 // Shutdown the timer if no delegates are left.
192 if (idle_delegate_map_.empty()) 228 if (idle_delegate_map_.empty())
193 idle_cleanup_timer_.Stop(); 229 idle_cleanup_timer_.Stop();
194 } 230 }
195 231
232 void RendererWebMediaPlayerDelegate::SetIsPlayingBackgroundVideo(
233 bool is_playing) {
234 if (is_playing_background_video_ == is_playing) return;
235
236 if (is_playing_background_video_) {
237 UMA_HISTOGRAM_LONG_TIMES(
238 "Media.Session.BackgroundTime",
239 base::TimeTicks::Now() - background_video_playing_start_time_);
240 RecordAction(base::UserMetricsAction("Media.Session.BackgroundSuspend"));
241 } else {
242 background_video_playing_start_time_ = base::TimeTicks::Now();
243 RecordAction(base::UserMetricsAction("Media.Session.BackgroundResume"));
244 }
245 is_playing_background_video_ = is_playing;
246 }
247
196 void RendererWebMediaPlayerDelegate::OnDestruct() { 248 void RendererWebMediaPlayerDelegate::OnDestruct() {
197 delete this; 249 delete this;
198 } 250 }
199 251
200 } // namespace media 252 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698