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