Chromium Code Reviews| 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 |