Flash: Use better APIs for preventing sleep
The API that this was using on Mac has been deprecated, and is
preventing us from upgrading our SDK version. We have a cross-platform
sleep-preventation API. Use that instead.
The Flash API for preventing power is a bit idiosyncratic in that it
doesn't create and destroy power blockers, but rather says "please don't
go to sleep for a while", where "a while" is not defined. Empirically,
twitch.tv called this method every 10 seconds. Use a timeout of 45
seconds to be safe.
BUG=650797
Review-Url: https://codereview.chromium.org/2388313004
Cr-Commit-Position: refs/heads/master@{#425843}
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 99a41ebc..d00f3bfe 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -1419,6 +1419,7 @@
"//crypto:platform",
"//device/base",
"//device/bluetooth:mojo",
+ "//device/power_save_blocker",
"//device/usb/mojo",
"//device/usb/public/interfaces",
"//google_apis",
diff --git a/chrome/browser/DEPS b/chrome/browser/DEPS
index 4da1a9a..ee71baa 100644
--- a/chrome/browser/DEPS
+++ b/chrome/browser/DEPS
@@ -18,6 +18,7 @@
"+device/geolocation",
"+device/hid",
"+device/media_transfer_protocol",
+ "+device/power_save_blocker",
"+device/usb",
"+extensions/browser",
"+extensions/common",
diff --git a/chrome/browser/renderer_host/pepper/pepper_flash_browser_host.cc b/chrome/browser/renderer_host/pepper/pepper_flash_browser_host.cc
index 5ce66503..662544a 100644
--- a/chrome/browser/renderer_host/pepper/pepper_flash_browser_host.cc
+++ b/chrome/browser/renderer_host/pepper/pepper_flash_browser_host.cc
@@ -13,6 +13,7 @@
#include "content/public/browser/browser_ppapi_host.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/render_process_host.h"
+#include "device/power_save_blocker/power_save_blocker.h"
#include "ipc/ipc_message_macros.h"
#include "ppapi/c/pp_errors.h"
#include "ppapi/c/private/ppb_flash.h"
@@ -57,6 +58,8 @@
PP_Resource resource)
: ResourceHost(host->GetPpapiHost(), instance, resource),
host_(host),
+ delay_timer_(FROM_HERE, base::TimeDelta::FromSeconds(45), this,
+ &PepperFlashBrowserHost::OnDelayTimerFired),
weak_factory_(this) {
int unused;
host->GetRenderFrameIDsForInstance(instance, &render_process_id_, &unused);
@@ -78,21 +81,24 @@
return PP_ERROR_FAILED;
}
+void PepperFlashBrowserHost::OnDelayTimerFired() {
+ power_save_blocker_.reset();
+}
+
int32_t PepperFlashBrowserHost::OnUpdateActivity(
ppapi::host::HostMessageContext* host_context) {
-#if defined(OS_WIN)
- // Reading then writing back the same value to the screensaver timeout system
- // setting resets the countdown which prevents the screensaver from turning
- // on "for a while". As long as the plugin pings us with this message faster
- // than the screensaver timeout, it won't go on.
- int value = 0;
- if (SystemParametersInfo(SPI_GETSCREENSAVETIMEOUT, 0, &value, 0))
- SystemParametersInfo(SPI_SETSCREENSAVETIMEOUT, value, NULL, 0);
-#elif defined(OS_MACOSX)
- UpdateSystemActivity(OverallAct);
-#else
-// TODO(brettw) implement this for other platforms.
-#endif
+ if (!power_save_blocker_) {
+ power_save_blocker_.reset(new device::PowerSaveBlocker(
+ device::PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension,
+ device::PowerSaveBlocker::kReasonOther, "Requested By PepperFlash",
+ BrowserThread::GetTaskRunnerForThread(BrowserThread::UI),
+ BrowserThread::GetTaskRunnerForThread(BrowserThread::FILE)));
+ }
+ // There is no specification for how long OnUpdateActivity should prevent the
+ // screen from going to sleep. Empirically, twitch.tv calls this method every
+ // 10 seconds. Be conservative and allow 45 seconds (set in |delay_timer_|'s
+ // ctor) before deleting the block.
+ delay_timer_.Reset();
return PP_OK;
}
diff --git a/chrome/browser/renderer_host/pepper/pepper_flash_browser_host.h b/chrome/browser/renderer_host/pepper/pepper_flash_browser_host.h
index 50308a2..65f0a61a 100644
--- a/chrome/browser/renderer_host/pepper/pepper_flash_browser_host.h
+++ b/chrome/browser/renderer_host/pepper/pepper_flash_browser_host.h
@@ -10,6 +10,7 @@
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
+#include "base/timer/timer.h"
#include "ppapi/host/host_message_context.h"
#include "ppapi/host/resource_host.h"
@@ -26,6 +27,10 @@
class CookieSettings;
}
+namespace device {
+class PowerSaveBlocker;
+}
+
class GURL;
namespace chrome {
@@ -43,6 +48,7 @@
ppapi::host::HostMessageContext* context) override;
private:
+ void OnDelayTimerFired();
int32_t OnUpdateActivity(ppapi::host::HostMessageContext* host_context);
int32_t OnGetLocalTimeZoneOffset(
ppapi::host::HostMessageContext* host_context,
@@ -57,6 +63,12 @@
content::BrowserPpapiHost* host_;
int render_process_id_;
+
+ // A power save blocker to prevent going to sleep, and a timer to destroy it
+ // after a certain amount of time has elapsed without an UpdateActivity.
+ std::unique_ptr<device::PowerSaveBlocker> power_save_blocker_;
+ base::DelayTimer delay_timer_;
+
// For fetching the Flash LSO settings.
scoped_refptr<content_settings::CookieSettings> cookie_settings_;
base::WeakPtrFactory<PepperFlashBrowserHost> weak_factory_;