Commit 2d6574bd authored by caseq's avatar caseq Committed by Commit bot

Prevent display going to sleep while taking a screenshot

On MacOS, GrabViewSnapshot() call would block for the duration of
display/GPU sleep which leads to protocol client to wait and tests
to time out when power saving is engaged. This prevents power saving
while there are pending screenshot requests.

BUG=599776

Review-Url: https://codereview.chromium.org/2044783002
Cr-Commit-Position: refs/heads/master@{#398245}
parent 6d47f4e6
...@@ -82,6 +82,8 @@ ...@@ -82,6 +82,8 @@
#include "ui/snapshot/snapshot.h" #include "ui/snapshot/snapshot.h"
#if defined(OS_MACOSX) #if defined(OS_MACOSX)
#include "content/public/browser/power_save_blocker.h"
#include "content/public/browser/power_save_blocker_factory.h"
#include "ui/accelerated_widget_mac/window_resize_helper_mac.h" #include "ui/accelerated_widget_mac/window_resize_helper_mac.h"
#endif #endif
...@@ -1284,6 +1286,20 @@ void RenderWidgetHostImpl::NotifyScreenInfoChanged() { ...@@ -1284,6 +1286,20 @@ void RenderWidgetHostImpl::NotifyScreenInfoChanged() {
void RenderWidgetHostImpl::GetSnapshotFromBrowser( void RenderWidgetHostImpl::GetSnapshotFromBrowser(
const GetSnapshotFromBrowserCallback& callback) { const GetSnapshotFromBrowserCallback& callback) {
int id = next_browser_snapshot_id_++; int id = next_browser_snapshot_id_++;
#if defined(OS_MACOSX)
// MacOS version of underlying GrabViewSnapshot() blocks while
// display/GPU are in a power-saving mode, so make sure display
// does not go to sleep for the duration of reading a snapshot.
if (pending_browser_snapshots_.empty()) {
DCHECK(!power_save_blocker_);
power_save_blocker_.reset(
CreatePowerSaveBlocker(
PowerSaveBlocker::kPowerSaveBlockPreventDisplaySleep,
PowerSaveBlocker::kReasonOther, "GetSnapshot")
.release());
}
#endif
pending_browser_snapshots_.insert(std::make_pair(id, callback)); pending_browser_snapshots_.insert(std::make_pair(id, callback));
Send(new ViewMsg_ForceRedraw(GetRoutingID(), id)); Send(new ViewMsg_ForceRedraw(GetRoutingID(), id));
} }
...@@ -2143,6 +2159,10 @@ void RenderWidgetHostImpl::OnSnapshotDataReceived(int snapshot_id, ...@@ -2143,6 +2159,10 @@ void RenderWidgetHostImpl::OnSnapshotDataReceived(int snapshot_id,
++it; ++it;
} }
} }
#if defined(OS_MACOSX)
if (pending_browser_snapshots_.empty())
power_save_blocker_.reset();
#endif
} }
void RenderWidgetHostImpl::OnSnapshotDataReceivedAsync( void RenderWidgetHostImpl::OnSnapshotDataReceivedAsync(
......
...@@ -87,6 +87,10 @@ struct EditCommand; ...@@ -87,6 +87,10 @@ struct EditCommand;
struct ResizeParams; struct ResizeParams;
struct TextInputState; struct TextInputState;
#if defined(OS_MACOSX)
class PowerSaveBlocker;
#endif
// This implements the RenderWidgetHost interface that is exposed to // This implements the RenderWidgetHost interface that is exposed to
// embedders of content, and adds things only visible to content. // embedders of content, and adds things only visible to content.
class CONTENT_EXPORT RenderWidgetHostImpl : public RenderWidgetHost, class CONTENT_EXPORT RenderWidgetHostImpl : public RenderWidgetHost,
...@@ -821,6 +825,10 @@ class CONTENT_EXPORT RenderWidgetHostImpl : public RenderWidgetHost, ...@@ -821,6 +825,10 @@ class CONTENT_EXPORT RenderWidgetHostImpl : public RenderWidgetHost,
// renderer process before clearing any previously displayed content. // renderer process before clearing any previously displayed content.
base::TimeDelta new_content_rendering_delay_; base::TimeDelta new_content_rendering_delay_;
#if defined(OS_MACOSX)
std::unique_ptr<PowerSaveBlocker> power_save_blocker_;
#endif
base::WeakPtrFactory<RenderWidgetHostImpl> weak_factory_; base::WeakPtrFactory<RenderWidgetHostImpl> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostImpl); DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostImpl);
......
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