| 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..96d29bd81f158ca9a94078f9142fa321723a6dc3 100644
|
| --- a/content/browser/media/media_web_contents_observer.cc
|
| +++ b/content/browser/media/media_web_contents_observer.cc
|
| @@ -13,8 +13,9 @@
|
| #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 "device/wake_lock/public/interfaces/wake_lock_context.mojom.h"
|
| #include "ipc/ipc_message_macros.h"
|
| +#include "mojo/public/cpp/bindings/interface_request.h"
|
|
|
| namespace content {
|
|
|
| @@ -29,6 +30,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 +42,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)
|
| @@ -50,12 +53,10 @@ void MediaWebContentsObserver::MaybeUpdateAudibleState() {
|
| AudioStreamMonitor* audio_stream_monitor =
|
| static_cast<WebContentsImpl*>(web_contents())->audio_stream_monitor();
|
|
|
| - if (audio_stream_monitor->WasRecentlyAudible()) {
|
| - if (!audio_power_save_blocker_)
|
| - CreateAudioPowerSaveBlocker();
|
| - } else {
|
| - audio_power_save_blocker_.reset();
|
| - }
|
| + if (audio_stream_monitor->WasRecentlyAudible())
|
| + LockAudio();
|
| + else
|
| + CancelAudioLock();
|
|
|
| GetAudibleMetrics()->UpdateAudibleWebContentsState(
|
| web_contents(), audio_stream_monitor->IsCurrentlyAudible());
|
| @@ -95,16 +96,18 @@ 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())
|
| + 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();
|
| + has_video_wake_lock_for_testing_ = false;
|
| + }
|
| }
|
|
|
| void MediaWebContentsObserver::RequestPersistentVideo(bool value) {
|
| @@ -132,7 +135,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,11 +170,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())
|
| + LockVideo();
|
| }
|
|
|
| if (!session_controllers_manager_.RequestPlay(
|
| @@ -201,7 +202,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 +210,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 +222,65 @@ 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::WakeLockService* MediaWebContentsObserver::GetAudioWakeLock() {
|
| + // Here is a lazy binding, and will not reconnect after connection error.
|
| + if (!audio_wake_lock_) {
|
| + device::mojom::WakeLockServiceRequest request =
|
| + mojo::MakeRequest(&audio_wake_lock_);
|
| + device::mojom::WakeLockContext* wake_lock_context =
|
| + web_contents()->GetWakeLockContext();
|
| + if (wake_lock_context) {
|
| + wake_lock_context->GetWakeLock(
|
| + device::mojom::WakeLockType::PreventAppSuspension,
|
| + device::mojom::WakeLockReason::ReasonAudioPlayback, "Playing audio",
|
| + std::move(request));
|
| + }
|
| + }
|
| + return audio_wake_lock_.get();
|
| }
|
|
|
| -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::WakeLockService* 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::mojom::WakeLockType::PreventDisplaySleep,
|
| + device::mojom::WakeLockReason::ReasonVideoPlayback, "Playing video",
|
| + std::move(request));
|
| + }
|
| }
|
| -#endif
|
| + return video_wake_lock_.get();
|
| +}
|
| +
|
| +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::LockVideo() {
|
| + DCHECK(!active_video_players_.empty());
|
| + GetVideoWakeLock()->RequestWakeLock();
|
| + has_video_wake_lock_for_testing_ = true;
|
| +}
|
| +
|
| +void MediaWebContentsObserver::CancelVideoLock() {
|
| + GetVideoWakeLock()->CancelWakeLock();
|
| + has_video_wake_lock_for_testing_ = false;
|
| }
|
|
|
| -void MediaWebContentsObserver::MaybeReleasePowerSaveBlockers() {
|
| - // If there are no more video players, clear the video power save blocker.
|
| +void MediaWebContentsObserver::MaybeCancelVideoLock() {
|
| + // If there are no more video players, cancel the video wake lock.
|
| if (active_video_players_.empty())
|
| - video_power_save_blocker_.reset();
|
| + CancelVideoLock();
|
| }
|
|
|
| void MediaWebContentsObserver::AddMediaPlayerEntry(
|
|
|