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