Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1475)

Unified Diff: content/browser/media/media_web_contents_observer.cc

Issue 2846813002: Convert MediaWebContentsObsever to be the client of WakeLock mojo interface. (Closed)
Patch Set: Convert MediaWebContentsObsever to be the client of WakeLock mojo interface. Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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(

Powered by Google App Engine
This is Rietveld 408576698