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

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: remove dependency, code rebase Created 3 years, 7 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..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(
« no previous file with comments | « content/browser/media/media_web_contents_observer.h ('k') | content/browser/web_contents/web_contents_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698