Commit b6ef1c3e authored by Weiyong Yao's avatar Weiyong Yao Committed by Commit Bot

desktopCapture: prevent display sleeping for web-contents capturer.

The new web-contents capturers don't request wake lock as the old
version does, given the thought it's the applications responsibility to
do so. But the fact is there are many consumers of the video stream
from tab capturing and none of them is doing wake-lock.
So it seems it's most convenient to re-do the wake lock requesting
in the new web-contents capturers for now.

This cl is to fix the regressions. We may revisit this if all the
remoting impls have wake lock applied.

Bug: 917529
Change-Id: I6ce726dcd3e45666079e9e856b5eff2914237e96
Reviewed-on: https://chromium-review.googlesource.com/c/1401844
Commit-Queue: Yuri Wiitala <miu@chromium.org>
Reviewed-by: default avatarYuri Wiitala <miu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#625109}
parent 28c4ca75
...@@ -21,8 +21,11 @@ ...@@ -21,8 +21,11 @@
#include "content/browser/compositor/surface_utils.h" #include "content/browser/compositor/surface_utils.h"
#include "content/browser/media/capture/mouse_cursor_overlay_controller.h" #include "content/browser/media/capture/mouse_cursor_overlay_controller.h"
#include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_task_traits.h"
#include "content/public/common/service_manager_connection.h"
#include "media/base/bind_to_current_loop.h" #include "media/base/bind_to_current_loop.h"
#include "media/capture/mojom/video_capture_types.mojom.h" #include "media/capture/mojom/video_capture_types.mojom.h"
#include "services/device/public/mojom/constants.mojom.h"
#include "services/device/public/mojom/wake_lock_provider.mojom.h"
namespace content { namespace content {
...@@ -51,6 +54,18 @@ class ScopedFrameDoneHelper ...@@ -51,6 +54,18 @@ class ScopedFrameDoneHelper
~ScopedFrameDoneHelper() final = default; ~ScopedFrameDoneHelper() final = default;
}; };
std::unique_ptr<service_manager::Connector> MaybeGetServiceConnector() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
// In some testing contexts, the service manager connection isn't initialized.
if (auto* connection = ServiceManagerConnection::GetForProcess()) {
service_manager::Connector* connector = connection->GetConnector();
DCHECK(connector);
return connector->Clone(); // Clone for use on a different thread.
}
return nullptr;
}
} // namespace } // namespace
FrameSinkVideoCaptureDevice::FrameSinkVideoCaptureDevice() FrameSinkVideoCaptureDevice::FrameSinkVideoCaptureDevice()
...@@ -119,6 +134,13 @@ void FrameSinkVideoCaptureDevice::AllocateAndStartWithReceiver( ...@@ -119,6 +134,13 @@ void FrameSinkVideoCaptureDevice::AllocateAndStartWithReceiver(
if (!suspend_requested_) { if (!suspend_requested_) {
MaybeStartConsuming(); MaybeStartConsuming();
} }
DCHECK(!wake_lock_);
// Gets a service_manager::Connector first, then request a wake lock.
base::PostTaskWithTraitsAndReplyWithResult(
FROM_HERE, {BrowserThread::UI}, base::BindOnce(&MaybeGetServiceConnector),
base::BindOnce(&FrameSinkVideoCaptureDevice::RequestWakeLock,
weak_factory_.GetWeakPtr()));
} }
void FrameSinkVideoCaptureDevice::AllocateAndStart( void FrameSinkVideoCaptureDevice::AllocateAndStart(
...@@ -155,6 +177,11 @@ void FrameSinkVideoCaptureDevice::Resume() { ...@@ -155,6 +177,11 @@ void FrameSinkVideoCaptureDevice::Resume() {
void FrameSinkVideoCaptureDevice::StopAndDeAllocate() { void FrameSinkVideoCaptureDevice::StopAndDeAllocate() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
if (wake_lock_) {
wake_lock_->CancelWakeLock();
wake_lock_.reset();
}
base::PostTaskWithTraits(FROM_HERE, {BrowserThread::UI}, base::PostTaskWithTraits(FROM_HERE, {BrowserThread::UI},
base::BindOnce(&MouseCursorOverlayController::Stop, base::BindOnce(&MouseCursorOverlayController::Stop,
cursor_controller_->GetWeakPtr())); cursor_controller_->GetWeakPtr()));
...@@ -339,4 +366,23 @@ void FrameSinkVideoCaptureDevice::OnFatalError(std::string message) { ...@@ -339,4 +366,23 @@ void FrameSinkVideoCaptureDevice::OnFatalError(std::string message) {
StopAndDeAllocate(); StopAndDeAllocate();
} }
void FrameSinkVideoCaptureDevice::RequestWakeLock(
std::unique_ptr<service_manager::Connector> connector) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
if (!connector) {
return;
}
device::mojom::WakeLockProviderPtr wake_lock_provider;
connector->BindInterface(device::mojom::kServiceName,
mojo::MakeRequest(&wake_lock_provider));
wake_lock_provider->GetWakeLockWithoutContext(
device::mojom::WakeLockType::kPreventDisplaySleep,
device::mojom::WakeLockReason::kOther, "screen capture",
mojo::MakeRequest(&wake_lock_));
wake_lock_->RequestWakeLock();
}
} // namespace content } // namespace content
...@@ -23,6 +23,8 @@ ...@@ -23,6 +23,8 @@
#include "media/capture/video/video_frame_receiver.h" #include "media/capture/video/video_frame_receiver.h"
#include "media/capture/video_capture_types.h" #include "media/capture/video_capture_types.h"
#include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/bindings/binding.h"
#include "services/device/public/mojom/wake_lock.mojom.h"
#include "services/service_manager/public/cpp/connector.h"
namespace content { namespace content {
...@@ -121,6 +123,10 @@ class CONTENT_EXPORT FrameSinkVideoCaptureDevice ...@@ -121,6 +123,10 @@ class CONTENT_EXPORT FrameSinkVideoCaptureDevice
// stops capture and this VideoCaptureDevice. // stops capture and this VideoCaptureDevice.
void OnFatalError(std::string message); void OnFatalError(std::string message);
// Helper that requests wake lock to prevent the display from sleeping while
// capturing is going on.
void RequestWakeLock(std::unique_ptr<service_manager::Connector> connector);
// Current capture target. This is cached to resolve a race where // Current capture target. This is cached to resolve a race where
// OnTargetChanged() can be called before the |capturer_| is created in // OnTargetChanged() can be called before the |capturer_| is created in
// OnCapturerCreated(). // OnCapturerCreated().
...@@ -159,6 +165,9 @@ class CONTENT_EXPORT FrameSinkVideoCaptureDevice ...@@ -159,6 +165,9 @@ class CONTENT_EXPORT FrameSinkVideoCaptureDevice
BrowserThread::DeleteOnUIThread> BrowserThread::DeleteOnUIThread>
cursor_controller_; cursor_controller_;
// Prevent display sleeping while content capture is in progress.
device::mojom::WakeLockPtr wake_lock_;
// Creates WeakPtrs for use on the device thread. // Creates WeakPtrs for use on the device thread.
base::WeakPtrFactory<FrameSinkVideoCaptureDevice> weak_factory_; base::WeakPtrFactory<FrameSinkVideoCaptureDevice> weak_factory_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment