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( |