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 @@
#include "ui/snapshot/snapshot.h"
#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"
#endif
......@@ -1284,6 +1286,20 @@ void RenderWidgetHostImpl::NotifyScreenInfoChanged() {
void RenderWidgetHostImpl::GetSnapshotFromBrowser(
const GetSnapshotFromBrowserCallback& callback) {
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));
Send(new ViewMsg_ForceRedraw(GetRoutingID(), id));
}
......@@ -2143,6 +2159,10 @@ void RenderWidgetHostImpl::OnSnapshotDataReceived(int snapshot_id,
++it;
}
}
#if defined(OS_MACOSX)
if (pending_browser_snapshots_.empty())
power_save_blocker_.reset();
#endif
}
void RenderWidgetHostImpl::OnSnapshotDataReceivedAsync(
......
......@@ -87,6 +87,10 @@ struct EditCommand;
struct ResizeParams;
struct TextInputState;
#if defined(OS_MACOSX)
class PowerSaveBlocker;
#endif
// This implements the RenderWidgetHost interface that is exposed to
// embedders of content, and adds things only visible to content.
class CONTENT_EXPORT RenderWidgetHostImpl : public RenderWidgetHost,
......@@ -821,6 +825,10 @@ class CONTENT_EXPORT RenderWidgetHostImpl : public RenderWidgetHost,
// renderer process before clearing any previously displayed content.
base::TimeDelta new_content_rendering_delay_;
#if defined(OS_MACOSX)
std::unique_ptr<PowerSaveBlocker> power_save_blocker_;
#endif
base::WeakPtrFactory<RenderWidgetHostImpl> weak_factory_;
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