Index: content/browser/media/capture/desktop_capture_device.cc |
diff --git a/content/browser/media/capture/desktop_capture_device.cc b/content/browser/media/capture/desktop_capture_device.cc |
index 25cfdc6e27f85f4cd9dc462636538f202698bbfb..65b75f60c6b4e51774c5c654c2fe8e62cb901ea3 100644 |
--- a/content/browser/media/capture/desktop_capture_device.cc |
+++ b/content/browser/media/capture/desktop_capture_device.cc |
@@ -27,9 +27,13 @@ |
#include "content/public/browser/browser_thread.h" |
#include "content/public/browser/desktop_media_id.h" |
#include "content/public/common/content_switches.h" |
-#include "device/power_save_blocker/power_save_blocker.h" |
+#include "content/public/common/service_manager_connection.h" |
+#include "device/wake_lock/public/interfaces/wake_lock_provider.mojom.h" |
+#include "device/wake_lock/public/interfaces/wake_lock_service.mojom.h" |
#include "media/base/video_util.h" |
#include "media/capture/content/capture_resolution_chooser.h" |
+#include "services/device/public/interfaces/constants.mojom.h" |
+#include "services/service_manager/public/cpp/connector.h" |
#include "third_party/libyuv/include/libyuv/scale_argb.h" |
#include "third_party/webrtc/modules/desktop_capture/cropping_window_capturer.h" |
#include "third_party/webrtc/modules/desktop_capture/desktop_and_cursor_composer.h" |
@@ -63,6 +67,16 @@ bool IsFrameUnpackedOrInverted(webrtc::DesktopFrame* frame) { |
frame->size().width() * webrtc::DesktopFrame::kBytesPerPixel; |
} |
+std::unique_ptr<service_manager::Connector> GetServiceConnector() { |
+ DCHECK_CURRENTLY_ON(BrowserThread::UI); |
+ |
+ service_manager::Connector* connector = |
+ ServiceManagerConnection::GetForProcess()->GetConnector(); |
+ |
+ DCHECK(connector); |
+ return connector->Clone(); |
+} |
+ |
} // namespace |
#if defined(OS_WIN) |
@@ -99,6 +113,8 @@ class DesktopCaptureDevice::Core : public webrtc::DesktopCapturer::Callback { |
// Captures a single frame. |
void DoCapture(); |
+ void RequestWakeLock(std::unique_ptr<service_manager::Connector> connector); |
+ |
// Task runner used for capturing operations. |
scoped_refptr<base::SingleThreadTaskRunner> task_runner_; |
@@ -141,9 +157,11 @@ class DesktopCaptureDevice::Core : public webrtc::DesktopCapturer::Callback { |
std::unique_ptr<webrtc::BasicDesktopFrame> black_frame_; |
- // TODO(jiayl): Remove power_save_blocker_ when there is an API to keep the |
+ // TODO(jiayl): Remove wake_lock_ when there is an API to keep the |
// screen from sleeping for the drive-by web. |
- std::unique_ptr<device::PowerSaveBlocker> power_save_blocker_; |
+ device::mojom::WakeLockServicePtr wake_lock_; |
+ |
+ base::WeakPtrFactory<Core> weak_factory_; |
DISALLOW_COPY_AND_ASSIGN(Core); |
}; |
@@ -156,7 +174,8 @@ DesktopCaptureDevice::Core::Core( |
desktop_capturer_(std::move(capturer)), |
capture_in_progress_(false), |
first_capture_returned_(false), |
- capturer_type_(type) {} |
+ capturer_type_(type), |
+ weak_factory_(this) {} |
DesktopCaptureDevice::Core::~Core() { |
DCHECK(task_runner_->BelongsToCurrentThread()); |
@@ -182,11 +201,12 @@ void DesktopCaptureDevice::Core::AllocateAndStart( |
params.requested_format.frame_size, |
params.resolution_change_policy)); |
- power_save_blocker_.reset(new device::PowerSaveBlocker( |
- device::PowerSaveBlocker::kPowerSaveBlockPreventDisplaySleep, |
- device::PowerSaveBlocker::kReasonOther, "DesktopCaptureDevice is running", |
- BrowserThread::GetTaskRunnerForThread(BrowserThread::UI), |
- BrowserThread::GetTaskRunnerForThread(BrowserThread::FILE))); |
+ DCHECK(!wake_lock_); |
+ // Gets a service_manager::Connector first, then request a wake lock. |
+ BrowserThread::PostTaskAndReplyWithResult( |
+ BrowserThread::UI, FROM_HERE, base::BindOnce(&GetServiceConnector), |
+ base::BindOnce(&DesktopCaptureDevice::Core::RequestWakeLock, |
+ weak_factory_.GetWeakPtr())); |
desktop_capturer_->Start(this); |
// Assume it will be always started successfully for now. |
@@ -365,6 +385,19 @@ void DesktopCaptureDevice::Core::DoCapture() { |
DCHECK(!capture_in_progress_); |
} |
+void DesktopCaptureDevice::Core::RequestWakeLock( |
+ std::unique_ptr<service_manager::Connector> connector) { |
+ device::mojom::WakeLockProviderPtr wake_lock_provider; |
+ connector->BindInterface(device::mojom::kServiceName, |
+ mojo::MakeRequest(&wake_lock_provider)); |
+ wake_lock_provider->GetWakeLockWithoutContext( |
+ device::mojom::WakeLockType::PreventDisplaySleep, |
+ device::mojom::WakeLockReason::ReasonOther, "Desktop capture is running", |
+ mojo::MakeRequest(&wake_lock_)); |
+ |
+ wake_lock_->RequestWakeLock(); |
+} |
+ |
// static |
std::unique_ptr<media::VideoCaptureDevice> DesktopCaptureDevice::Create( |
const DesktopMediaID& source) { |
@@ -450,10 +483,8 @@ void DesktopCaptureDevice::SetNotificationWindowId( |
if (!core_) |
return; |
thread_.task_runner()->PostTask( |
- FROM_HERE, |
- base::Bind(&Core::SetNotificationWindowId, |
- base::Unretained(core_.get()), |
- window_id)); |
+ FROM_HERE, base::Bind(&Core::SetNotificationWindowId, |
+ base::Unretained(core_.get()), window_id)); |
} |
DesktopCaptureDevice::DesktopCaptureDevice( |