OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |