Chromium Code Reviews| Index: content/browser/media/media_web_contents_observer.cc |
| diff --git a/content/browser/media/media_web_contents_observer.cc b/content/browser/media/media_web_contents_observer.cc |
| index 2098facfba14bcc742a7d8407a4fbeceb03a0f31..10900705026dcc447796d5842dfcd79ae96a658e 100644 |
| --- a/content/browser/media/media_web_contents_observer.cc |
| +++ b/content/browser/media/media_web_contents_observer.cc |
| @@ -13,8 +13,8 @@ |
| #include "content/common/media/media_player_delegate_messages.h" |
| #include "content/public/browser/render_frame_host.h" |
| #include "content/public/browser/web_contents.h" |
| -#include "device/power_save_blocker/power_save_blocker.h" |
| #include "ipc/ipc_message_macros.h" |
| +#include "mojo/public/cpp/bindings/interface_request.h" |
| namespace content { |
| @@ -29,6 +29,8 @@ AudibleMetrics* GetAudibleMetrics() { |
| MediaWebContentsObserver::MediaWebContentsObserver(WebContents* web_contents) |
| : WebContentsObserver(web_contents), |
| + has_audio_wake_lock_for_testing_(false), |
| + has_video_wake_lock_for_testing_(false), |
| session_controllers_manager_(this) {} |
| MediaWebContentsObserver::~MediaWebContentsObserver() = default; |
| @@ -39,7 +41,7 @@ void MediaWebContentsObserver::WebContentsDestroyed() { |
| void MediaWebContentsObserver::RenderFrameDeleted( |
| RenderFrameHost* render_frame_host) { |
| - ClearPowerSaveBlockers(render_frame_host); |
| + ClearWakeLocks(render_frame_host); |
| session_controllers_manager_.RenderFrameDeleted(render_frame_host); |
| if (fullscreen_player_ && fullscreen_player_->first == render_frame_host) |
| @@ -51,10 +53,9 @@ void MediaWebContentsObserver::MaybeUpdateAudibleState() { |
| static_cast<WebContentsImpl*>(web_contents())->audio_stream_monitor(); |
| if (audio_stream_monitor->WasRecentlyAudible()) { |
|
DaleCurtis
2017/05/02 17:08:42
{} not necessary for single-line if.
ke.he
2017/05/04 11:58:23
Done.
|
| - if (!audio_power_save_blocker_) |
| - CreateAudioPowerSaveBlocker(); |
| + LockAudio(); |
| } else { |
| - audio_power_save_blocker_.reset(); |
| + CancelAudioLock(); |
| } |
| GetAudibleMetrics()->UpdateAudibleWebContentsState( |
| @@ -95,16 +96,19 @@ bool MediaWebContentsObserver::OnMessageReceived( |
| } |
| void MediaWebContentsObserver::WasShown() { |
| - // Restore power save blocker if there are active video players running. |
| - if (!active_video_players_.empty() && !video_power_save_blocker_) |
| - CreateVideoPowerSaveBlocker(); |
| + // Restore wake lock if there are active video players running. |
| + if (!active_video_players_.empty()) { |
|
DaleCurtis
2017/05/02 17:08:42
Ditto
ke.he
2017/05/04 11:58:23
Done.
|
| + LockVideo(); |
| + } |
| } |
| void MediaWebContentsObserver::WasHidden() { |
| // If there are entities capturing screenshots or video (e.g., mirroring), |
| - // don't release the power save blocker. |
| - if (!web_contents()->GetCapturerCount()) |
| - video_power_save_blocker_.reset(); |
| + // don't release the wake lock. |
| + if (!web_contents()->GetCapturerCount()) { |
| + GetVideoWakeLock()->CancelWakeLock(); |
|
DaleCurtis
2017/05/02 17:08:42
Put in CancelVideoLock() function like the audio o
ke.he
2017/05/04 11:58:23
Done.
|
| + has_video_wake_lock_for_testing_ = false; |
| + } |
| } |
| void MediaWebContentsObserver::RequestPersistentVideo(bool value) { |
| @@ -132,7 +136,7 @@ void MediaWebContentsObserver::OnMediaPaused(RenderFrameHost* render_frame_host, |
| RemoveMediaPlayerEntry(player_id, &active_audio_players_); |
| const bool removed_video = |
| RemoveMediaPlayerEntry(player_id, &active_video_players_); |
| - MaybeReleasePowerSaveBlockers(); |
| + MaybeCancelVideoLock(); |
| if (removed_audio || removed_video) { |
| // Notify observers the player has been "paused". |
| @@ -167,10 +171,9 @@ void MediaWebContentsObserver::OnMediaPlaying( |
| if (has_video) { |
| AddMediaPlayerEntry(id, &active_video_players_); |
| - // If we're not hidden and have just created a player, create a blocker. |
| - if (!video_power_save_blocker_ && |
| - !static_cast<WebContentsImpl*>(web_contents())->IsHidden()) { |
| - CreateVideoPowerSaveBlocker(); |
| + // If we're not hidden and have just created a player, create a wakelock. |
| + if (!static_cast<WebContentsImpl*>(web_contents())->IsHidden()) { |
|
DaleCurtis
2017/05/02 17:08:42
no {} necessary.
ke.he
2017/05/04 11:58:23
Done.
|
| + LockVideo(); |
| } |
| } |
| @@ -201,7 +204,7 @@ void MediaWebContentsObserver::OnMediaEffectivelyFullscreenChange( |
| fullscreen_player_ = id; |
| } |
| -void MediaWebContentsObserver::ClearPowerSaveBlockers( |
| +void MediaWebContentsObserver::ClearWakeLocks( |
| RenderFrameHost* render_frame_host) { |
| std::set<MediaPlayerId> removed_players; |
| RemoveAllMediaPlayerEntries(render_frame_host, &active_video_players_, |
| @@ -209,7 +212,7 @@ void MediaWebContentsObserver::ClearPowerSaveBlockers( |
| std::set<MediaPlayerId> video_players(removed_players); |
| RemoveAllMediaPlayerEntries(render_frame_host, &active_audio_players_, |
| &removed_players); |
| - MaybeReleasePowerSaveBlockers(); |
| + MaybeCancelVideoLock(); |
| // Notify all observers the player has been "paused". |
| WebContentsImpl* wci = static_cast<WebContentsImpl*>(web_contents()); |
| @@ -221,35 +224,64 @@ void MediaWebContentsObserver::ClearPowerSaveBlockers( |
| } |
| } |
| -void MediaWebContentsObserver::CreateAudioPowerSaveBlocker() { |
| - DCHECK(!audio_power_save_blocker_); |
| - audio_power_save_blocker_.reset(new device::PowerSaveBlocker( |
| - device::PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension, |
| - device::PowerSaveBlocker::kReasonAudioPlayback, "Playing audio", |
| - BrowserThread::GetTaskRunnerForThread(BrowserThread::UI), |
| - BrowserThread::GetTaskRunnerForThread(BrowserThread::FILE))); |
| +device::mojom::WakeLockServicePtr& |
| +MediaWebContentsObserver::GetAudioWakeLock() { |
| + // Here is a lazy binding, and will not reconnect after connection error. |
| + if (!audio_wake_lock_) { |
|
DaleCurtis
2017/05/02 17:08:42
if (audio_wake_lock_) return audio_wake_lock_.get(
|
| + device::mojom::WakeLockServiceRequest request = |
| + mojo::MakeRequest(&audio_wake_lock_); |
|
DaleCurtis
2017/05/02 17:08:42
Inline into the call below?
ke.he
2017/05/04 11:58:23
See comments below:)
|
| + device::mojom::WakeLockContext* wake_lock_context = |
|
DaleCurtis
2017/05/02 17:08:42
could be written:
if (auto* context = web_content
ke.he
2017/05/04 11:58:23
It is safe that context to be null. the "mojo::Mak
|
| + web_contents()->GetWakeLockContext(); |
| + if (wake_lock_context) { |
| + wake_lock_context->GetWakeLock( |
| + device::PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension, |
| + device::PowerSaveBlocker::kReasonAudioPlayback, "Playing audio", |
| + std::move(request)); |
| + } |
| + } |
| + return audio_wake_lock_; |
|
DaleCurtis
2017/05/02 17:08:42
It's possible this will return nullptr if there's
ke.he
2017/05/04 11:58:23
The GetAudioWakeLock() never returns nullptr as co
|
| } |
| -void MediaWebContentsObserver::CreateVideoPowerSaveBlocker() { |
| - DCHECK(!video_power_save_blocker_); |
| - DCHECK(!active_video_players_.empty()); |
| - video_power_save_blocker_.reset(new device::PowerSaveBlocker( |
| - device::PowerSaveBlocker::kPowerSaveBlockPreventDisplaySleep, |
| - device::PowerSaveBlocker::kReasonVideoPlayback, "Playing video", |
| - BrowserThread::GetTaskRunnerForThread(BrowserThread::UI), |
| - BrowserThread::GetTaskRunnerForThread(BrowserThread::FILE))); |
| -#if defined(OS_ANDROID) |
| - if (web_contents()->GetNativeView()) { |
| - video_power_save_blocker_.get()->InitDisplaySleepBlocker( |
| - web_contents()->GetNativeView()); |
| +device::mojom::WakeLockServicePtr& |
| +MediaWebContentsObserver::GetVideoWakeLock() { |
| + // Here is a lazy binding, and will not reconnect after connection error. |
| + if (!video_wake_lock_) { |
| + device::mojom::WakeLockServiceRequest request = |
| + mojo::MakeRequest(&video_wake_lock_); |
| + device::mojom::WakeLockContext* wake_lock_context = |
| + web_contents()->GetWakeLockContext(); |
| + if (wake_lock_context) { |
| + wake_lock_context->GetWakeLock( |
| + device::PowerSaveBlocker::kPowerSaveBlockPreventDisplaySleep, |
| + device::PowerSaveBlocker::kReasonVideoPlayback, "Playing video", |
| + std::move(request)); |
| + } |
| } |
| -#endif |
| + return video_wake_lock_; |
| +} |
| + |
| +void MediaWebContentsObserver::LockAudio() { |
| + GetAudioWakeLock()->RequestWakeLock(); |
| + has_audio_wake_lock_for_testing_ = true; |
| +} |
| + |
| +void MediaWebContentsObserver::CancelAudioLock() { |
| + GetAudioWakeLock()->CancelWakeLock(); |
| + has_audio_wake_lock_for_testing_ = false; |
| } |
| -void MediaWebContentsObserver::MaybeReleasePowerSaveBlockers() { |
| - // If there are no more video players, clear the video power save blocker. |
| - if (active_video_players_.empty()) |
| - video_power_save_blocker_.reset(); |
| +void MediaWebContentsObserver::LockVideo() { |
| + DCHECK(!active_video_players_.empty()); |
| + GetVideoWakeLock()->RequestWakeLock(); |
| + has_video_wake_lock_for_testing_ = true; |
| +} |
| + |
| +void MediaWebContentsObserver::MaybeCancelVideoLock() { |
| + // If there are no more video players, cancel the video wake lock. |
| + if (active_video_players_.empty()) { |
| + GetVideoWakeLock()->CancelWakeLock(); |
| + has_video_wake_lock_for_testing_ = false; |
| + } |
| } |
| void MediaWebContentsObserver::AddMediaPlayerEntry( |