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

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: has_session is true on desktop 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 "media/base/media_switches.h"
16 #include "third_party/WebKit/public/platform/WebMediaPlayer.h" 17 #include "third_party/WebKit/public/platform/WebMediaPlayer.h"
18 #include "third_party/WebKit/public/web/WebUserGestureIndicator.h"
17 19
18 #if defined(OS_ANDROID) 20 #if defined(OS_ANDROID)
19 #include "base/android/build_info.h" 21 #include "base/android/build_info.h"
20 #endif 22 #endif
21 23
22 namespace { 24 namespace {
23 25
24 void RecordAction(const base::UserMetricsAction& action) { 26 void RecordAction(const base::UserMetricsAction& action) {
25 content::RenderThread::Get()->RecordAction(action); 27 content::RenderThread::Get()->RecordAction(action);
26 } 28 }
(...skipping 28 matching lines...) Expand all
55 return true; 57 return true;
56 58
57 return (render_frame() && render_frame()->IsHidden()) || is_frame_closed_; 59 return (render_frame() && render_frame()->IsHidden()) || is_frame_closed_;
58 } 60 }
59 61
60 bool RendererWebMediaPlayerDelegate::IsFrameClosed() { 62 bool RendererWebMediaPlayerDelegate::IsFrameClosed() {
61 return is_frame_closed_; 63 return is_frame_closed_;
62 } 64 }
63 65
64 bool RendererWebMediaPlayerDelegate::IsBackgroundVideoPlaybackUnlocked() { 66 bool RendererWebMediaPlayerDelegate::IsBackgroundVideoPlaybackUnlocked() {
65 // TODO(sandersd): Include a check for kResumeBackgroundVideo? 67 return base::FeatureList::IsEnabled(kResumeBackgroundVideo) &&
66 return background_video_allowed_; 68 (background_video_allowed_ ||
69 blink::WebUserGestureIndicator::isProcessingUserGesture());
67 } 70 }
68 71
69 int RendererWebMediaPlayerDelegate::AddObserver(Observer* observer) { 72 int RendererWebMediaPlayerDelegate::AddObserver(Observer* observer) {
70 return id_map_.Add(observer); 73 return id_map_.Add(observer);
71 } 74 }
72 75
73 void RendererWebMediaPlayerDelegate::RemoveObserver(int player_id) { 76 void RendererWebMediaPlayerDelegate::RemoveObserver(int player_id) {
74 DCHECK(id_map_.Lookup(player_id)); 77 DCHECK(id_map_.Lookup(player_id));
75 id_map_.Remove(player_id); 78 id_map_.Remove(player_id);
76 idle_player_map_.erase(player_id); 79 idle_player_map_.erase(player_id);
(...skipping 14 matching lines...) Expand all
91 DVLOG(2) << __func__ << "(" << player_id << ", " << has_video << ", " 94 DVLOG(2) << __func__ << "(" << player_id << ", " << has_video << ", "
92 << has_audio << ", " << static_cast<int>(media_content_type) << ")"; 95 << has_audio << ", " << static_cast<int>(media_content_type) << ")";
93 DCHECK(id_map_.Lookup(player_id)); 96 DCHECK(id_map_.Lookup(player_id));
94 97
95 has_played_media_ = true; 98 has_played_media_ = true;
96 if (has_video) { 99 if (has_video) {
97 if (!playing_videos_.count(player_id)) { 100 if (!playing_videos_.count(player_id)) {
98 playing_videos_.insert(player_id); 101 playing_videos_.insert(player_id);
99 has_played_video_ = true; 102 has_played_video_ = true;
100 } 103 }
104 if (IsFrameHidden() && !IsFrameClosed())
105 background_video_allowed_ = true;
101 } else { 106 } else {
102 playing_videos_.erase(player_id); 107 playing_videos_.erase(player_id);
103 } 108 }
104 109
105 Send(new MediaPlayerDelegateHostMsg_OnMediaPlaying( 110 Send(new MediaPlayerDelegateHostMsg_OnMediaPlaying(
106 routing_id(), player_id, has_video, has_audio, false, 111 routing_id(), player_id, has_video, has_audio, false,
107 media_content_type)); 112 media_content_type));
108 113
109 ScheduleUpdateTask(); 114 ScheduleUpdateTask();
110 } 115 }
111 116
112 void RendererWebMediaPlayerDelegate::DidPause(int player_id) { 117 void RendererWebMediaPlayerDelegate::DidPause(int player_id) {
113 DVLOG(2) << __func__ << "(" << player_id << ")"; 118 DVLOG(2) << __func__ << "(" << player_id << ")";
114 DCHECK(id_map_.Lookup(player_id)); 119 DCHECK(id_map_.Lookup(player_id));
120
121 // If user explicitly paused the video playing in the background, don't allow
122 // the page to resume background playback without user's intent.
123 if (blink::WebUserGestureIndicator::isProcessingUserGesture() &&
124 playing_videos_.count(player_id) && IsFrameHidden() && !IsFrameClosed()) {
DaleCurtis 2017/02/16 02:47:38 Is playing_videos_.count() what you want? If the p
whywhat 2017/02/16 13:19:31 If the page is paused, the user shouldn't be able
125 background_video_allowed_ = false;
126 }
127
115 playing_videos_.erase(player_id); 128 playing_videos_.erase(player_id);
116 Send(new MediaPlayerDelegateHostMsg_OnMediaPaused(routing_id(), player_id, 129 Send(new MediaPlayerDelegateHostMsg_OnMediaPaused(routing_id(), player_id,
117 false)); 130 false));
118 131
119 // Required to keep background playback statistics up to date. 132 // Required to keep background playback statistics up to date.
120 ScheduleUpdateTask(); 133 ScheduleUpdateTask();
121 } 134 }
122 135
123 void RendererWebMediaPlayerDelegate::PlayerGone(int player_id) { 136 void RendererWebMediaPlayerDelegate::PlayerGone(int player_id) {
124 DVLOG(2) << __func__ << "(" << player_id << ")"; 137 DVLOG(2) << __func__ << "(" << player_id << ")";
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
364 player->OnIdleTimeout(); 377 player->OnIdleTimeout();
365 } 378 }
366 } 379 }
367 } 380 }
368 381
369 void RendererWebMediaPlayerDelegate::OnDestruct() { 382 void RendererWebMediaPlayerDelegate::OnDestruct() {
370 delete this; 383 delete this;
371 } 384 }
372 385
373 } // namespace media 386 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698