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

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

Issue 2681863005: [Video] MediaSession API event handlers can resume background video. (Closed)
Patch Set: Updated the comment in ComputePlayState Created 3 years, 10 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" 10 #include "base/metrics/histogram_macros.h"
11 #include "base/metrics/user_metrics_action.h" 11 #include "base/metrics/user_metrics_action.h"
12 #include "base/sys_info.h" 12 #include "base/sys_info.h"
13 #include "content/common/media/media_player_delegate_messages.h" 13 #include "content/common/media/media_player_delegate_messages.h"
14 #include "content/public/renderer/render_frame.h" 14 #include "content/public/renderer/render_frame.h"
15 #include "content/public/renderer/render_thread.h" 15 #include "content/public/renderer/render_thread.h"
16 #include "third_party/WebKit/public/platform/WebMediaPlayer.h" 16 #include "third_party/WebKit/public/platform/WebMediaPlayer.h"
17 #include "third_party/WebKit/public/web/WebScopedUserGesture.h"
17 18
18 #if defined(OS_ANDROID) 19 #if defined(OS_ANDROID)
19 #include "base/android/build_info.h" 20 #include "base/android/build_info.h"
20 #endif 21 #endif
21 22
22 namespace { 23 namespace {
23 24
24 void RecordAction(const base::UserMetricsAction& action) { 25 void RecordAction(const base::UserMetricsAction& action) {
25 content::RenderThread::Get()->RecordAction(action); 26 content::RenderThread::Get()->RecordAction(action);
26 } 27 }
(...skipping 27 matching lines...) Expand all
54 if (is_frame_hidden_for_testing_) 55 if (is_frame_hidden_for_testing_)
55 return true; 56 return true;
56 57
57 return (render_frame() && render_frame()->IsHidden()) || is_frame_closed_; 58 return (render_frame() && render_frame()->IsHidden()) || is_frame_closed_;
58 } 59 }
59 60
60 bool RendererWebMediaPlayerDelegate::IsFrameClosed() { 61 bool RendererWebMediaPlayerDelegate::IsFrameClosed() {
61 return is_frame_closed_; 62 return is_frame_closed_;
62 } 63 }
63 64
64 bool RendererWebMediaPlayerDelegate::IsBackgroundVideoPlaybackUnlocked() {
65 // TODO(sandersd): Include a check for kResumeBackgroundVideo?
66 return background_video_allowed_;
67 }
68
69 int RendererWebMediaPlayerDelegate::AddObserver(Observer* observer) { 65 int RendererWebMediaPlayerDelegate::AddObserver(Observer* observer) {
70 return id_map_.Add(observer); 66 return id_map_.Add(observer);
71 } 67 }
72 68
73 void RendererWebMediaPlayerDelegate::RemoveObserver(int player_id) { 69 void RendererWebMediaPlayerDelegate::RemoveObserver(int player_id) {
74 DCHECK(id_map_.Lookup(player_id)); 70 DCHECK(id_map_.Lookup(player_id));
75 id_map_.Remove(player_id); 71 id_map_.Remove(player_id);
76 idle_player_map_.erase(player_id); 72 idle_player_map_.erase(player_id);
77 stale_players_.erase(player_id); 73 stale_players_.erase(player_id);
78 playing_videos_.erase(player_id); 74 playing_videos_.erase(player_id);
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
173 169
174 for (IDMap<Observer*>::iterator it(&id_map_); !it.IsAtEnd(); it.Advance()) 170 for (IDMap<Observer*>::iterator it(&id_map_); !it.IsAtEnd(); it.Advance())
175 it.GetCurrentValue()->OnFrameHidden(); 171 it.GetCurrentValue()->OnFrameHidden();
176 172
177 ScheduleUpdateTask(); 173 ScheduleUpdateTask();
178 } 174 }
179 175
180 void RendererWebMediaPlayerDelegate::WasShown() { 176 void RendererWebMediaPlayerDelegate::WasShown() {
181 RecordAction(base::UserMetricsAction("Media.Shown")); 177 RecordAction(base::UserMetricsAction("Media.Shown"));
182 is_frame_closed_ = false; 178 is_frame_closed_ = false;
183 background_video_allowed_ = false;
184 179
185 for (IDMap<Observer*>::iterator it(&id_map_); !it.IsAtEnd(); it.Advance()) 180 for (IDMap<Observer*>::iterator it(&id_map_); !it.IsAtEnd(); it.Advance())
186 it.GetCurrentValue()->OnFrameShown(); 181 it.GetCurrentValue()->OnFrameShown();
187 182
188 ScheduleUpdateTask(); 183 ScheduleUpdateTask();
189 } 184 }
190 185
191 bool RendererWebMediaPlayerDelegate::OnMessageReceived( 186 bool RendererWebMediaPlayerDelegate::OnMessageReceived(
192 const IPC::Message& msg) { 187 const IPC::Message& msg) {
193 IPC_BEGIN_MESSAGE_MAP(RendererWebMediaPlayerDelegate, msg) 188 IPC_BEGIN_MESSAGE_MAP(RendererWebMediaPlayerDelegate, msg)
(...skipping 20 matching lines...) Expand all
214 209
215 bool RendererWebMediaPlayerDelegate::IsIdleCleanupTimerRunningForTesting() 210 bool RendererWebMediaPlayerDelegate::IsIdleCleanupTimerRunningForTesting()
216 const { 211 const {
217 return idle_cleanup_timer_.IsRunning(); 212 return idle_cleanup_timer_.IsRunning();
218 } 213 }
219 214
220 void RendererWebMediaPlayerDelegate::SetFrameHiddenForTesting(bool is_hidden) { 215 void RendererWebMediaPlayerDelegate::SetFrameHiddenForTesting(bool is_hidden) {
221 if (is_hidden == is_frame_hidden_for_testing_) 216 if (is_hidden == is_frame_hidden_for_testing_)
222 return; 217 return;
223 218
224 if (is_hidden) { 219 is_frame_hidden_for_testing_ = is_hidden;
225 is_frame_hidden_for_testing_ = true;
226 } else {
227 is_frame_hidden_for_testing_ = false;
228 background_video_allowed_ = false;
229 }
230 220
231 ScheduleUpdateTask(); 221 ScheduleUpdateTask();
232 } 222 }
233 223
234 void RendererWebMediaPlayerDelegate::OnMediaDelegatePause(int player_id) { 224 void RendererWebMediaPlayerDelegate::OnMediaDelegatePause(int player_id) {
235 RecordAction(base::UserMetricsAction("Media.Controls.RemotePause")); 225 RecordAction(base::UserMetricsAction("Media.Controls.RemotePause"));
236 226
237 Observer* observer = id_map_.Lookup(player_id); 227 Observer* observer = id_map_.Lookup(player_id);
238 if (observer) { 228 if (observer) {
239 background_video_allowed_ = false; 229 // TODO(avayvod): remove when default play/pause is handled via
230 // the MediaSession code path.
231 std::unique_ptr<blink::WebScopedUserGesture> gesture(
232 render_frame()
233 ? new blink::WebScopedUserGesture(render_frame()->GetWebFrame())
234 : nullptr);
240 observer->OnPause(); 235 observer->OnPause();
241 } 236 }
242 } 237 }
243 238
244 void RendererWebMediaPlayerDelegate::OnMediaDelegatePlay(int player_id) { 239 void RendererWebMediaPlayerDelegate::OnMediaDelegatePlay(int player_id) {
245 RecordAction(base::UserMetricsAction("Media.Controls.RemotePlay")); 240 RecordAction(base::UserMetricsAction("Media.Controls.RemotePlay"));
246 241
247 Observer* observer = id_map_.Lookup(player_id); 242 Observer* observer = id_map_.Lookup(player_id);
248 if (observer) { 243 if (observer) {
249 // TODO(sandersd): Ideally we would only set the flag if the player has 244 // TODO(avayvod): remove when default play/pause is handled via
250 // video, but we don't reliably know if a paused player has video. 245 // the MediaSession code path.
251 if (IsFrameHidden() && !IsFrameClosed()) 246 std::unique_ptr<blink::WebScopedUserGesture> gesture(
252 background_video_allowed_ = true; 247 render_frame()
248 ? new blink::WebScopedUserGesture(render_frame()->GetWebFrame())
249 : nullptr);
253 observer->OnPlay(); 250 observer->OnPlay();
254 } 251 }
255 } 252 }
256 253
257 void RendererWebMediaPlayerDelegate::OnMediaDelegateSuspendAllMediaPlayers() { 254 void RendererWebMediaPlayerDelegate::OnMediaDelegateSuspendAllMediaPlayers() {
258 is_frame_closed_ = true; 255 is_frame_closed_ = true;
259 256
260 for (IDMap<Observer*>::iterator it(&id_map_); !it.IsAtEnd(); it.Advance()) 257 for (IDMap<Observer*>::iterator it(&id_map_); !it.IsAtEnd(); it.Advance())
261 it.GetCurrentValue()->OnFrameClosed(); 258 it.GetCurrentValue()->OnFrameClosed();
262 } 259 }
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
364 player->OnIdleTimeout(); 361 player->OnIdleTimeout();
365 } 362 }
366 } 363 }
367 } 364 }
368 365
369 void RendererWebMediaPlayerDelegate::OnDestruct() { 366 void RendererWebMediaPlayerDelegate::OnDestruct() {
370 delete this; 367 delete this;
371 } 368 }
372 369
373 } // namespace media 370 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698