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

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: Removed the PowerObserver logic, revised metrics descriptions 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 char* const action) {
20 content::RenderThread::Get()->RecordAction(base::UserMetricsAction(action));
Ilya Sherman 2016/08/17 01:17:14 The purpose of base::UserMetricsAction is to help
whywhat 2016/08/17 18:03:34 Got it. It actually helped to catch a mismatch bet
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("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("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("Media.RemoteControls.Pause");
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("Media.RemoteControls.Play");
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 #if defined(OS_ANDROID)
220 if (is_playing_background_video_) {
221 UMA_HISTOGRAM_LONG_TIMES(
222 "Media.Session.BackgroundTime",
223 base::TimeTicks::Now() - background_video_playing_start_time_);
224 RecordAction("Media.Session.BackgroundSuspend");
225 } else {
226 background_video_playing_start_time_ = base::TimeTicks::Now();
227 RecordAction("Media.Session.BackgroundResume");
228 }
229 #endif // OS_ANDROID
230
231 is_playing_background_video_ = is_playing;
232 }
233
196 void RendererWebMediaPlayerDelegate::OnDestruct() { 234 void RendererWebMediaPlayerDelegate::OnDestruct() {
197 delete this; 235 delete this;
198 } 236 }
199 237
200 } // namespace media 238 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698