summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/apps/ephemeral_app_browsertest.cc3
-rw-r--r--chrome/browser/drive/drive_uploader.cc4
-rw-r--r--chrome/browser/media/cast_transport_host_filter.cc8
-rw-r--r--chromeos/dbus/power_policy_controller.cc93
-rw-r--r--chromeos/dbus/power_policy_controller.h57
-rw-r--r--chromeos/dbus/power_policy_controller_unittest.cc84
-rw-r--r--content/browser/devtools/render_frame_devtools_agent_host.cc9
-rw-r--r--content/browser/download/download_browsertest.cc14
-rw-r--r--content/browser/download/download_resource_handler.cc2
-rw-r--r--content/browser/loader/power_save_block_resource_throttle.cc2
-rw-r--r--content/browser/media/capture/desktop_capture_device.cc8
-rw-r--r--content/browser/media/capture/desktop_capture_device_aura.cc8
-rw-r--r--content/browser/media/webrtc_internals.cc8
-rw-r--r--content/browser/power_save_blocker_android.cc3
-rw-r--r--content/browser/power_save_blocker_chromeos.cc41
-rw-r--r--content/browser/power_save_blocker_impl.cc6
-rw-r--r--content/browser/power_save_blocker_impl.h6
-rw-r--r--content/browser/power_save_blocker_mac.cc23
-rw-r--r--content/browser/power_save_blocker_ozone.cc3
-rw-r--r--content/browser/power_save_blocker_win.cc21
-rw-r--r--content/browser/power_save_blocker_x11.cc19
-rw-r--r--content/browser/web_contents/web_contents_impl.cc12
-rw-r--r--content/public/browser/power_save_blocker.h17
-rw-r--r--extensions/browser/api/power/power_api_manager.cc6
-rw-r--r--extensions/browser/api/power/power_api_manager.h1
-rw-r--r--extensions/browser/api/power/power_api_unittest.cc3
26 files changed, 328 insertions, 133 deletions
diff --git a/chrome/browser/apps/ephemeral_app_browsertest.cc b/chrome/browser/apps/ephemeral_app_browsertest.cc
index da8e8bf..04c96fe 100644
--- a/chrome/browser/apps/ephemeral_app_browsertest.cc
+++ b/chrome/browser/apps/ephemeral_app_browsertest.cc
@@ -160,7 +160,8 @@ class PowerSaveBlockerStub : public content::PowerSaveBlocker {
static scoped_ptr<PowerSaveBlocker> Create(PowerSettingsMock* power_settings,
PowerSaveBlockerType type,
- const std::string& reason) {
+ Reason reason,
+ const std::string& description) {
return scoped_ptr<PowerSaveBlocker>(
new PowerSaveBlockerStub(power_settings));
}
diff --git a/chrome/browser/drive/drive_uploader.cc b/chrome/browser/drive/drive_uploader.cc
index a298eaf..76709fd 100644
--- a/chrome/browser/drive/drive_uploader.cc
+++ b/chrome/browser/drive/drive_uploader.cc
@@ -59,10 +59,10 @@ struct DriveUploader::UploadFileInfo {
next_start_position(-1),
power_save_blocker(content::PowerSaveBlocker::Create(
content::PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension,
+ content::PowerSaveBlocker::kReasonOther,
"Upload in progress")),
cancelled(false),
- weak_ptr_factory_(this) {
- }
+ weak_ptr_factory_(this) {}
~UploadFileInfo() {
}
diff --git a/chrome/browser/media/cast_transport_host_filter.cc b/chrome/browser/media/cast_transport_host_filter.cc
index 40e4396..fde9078 100644
--- a/chrome/browser/media/cast_transport_host_filter.cc
+++ b/chrome/browser/media/cast_transport_host_filter.cc
@@ -90,9 +90,11 @@ void CastTransportHostFilter::OnNew(
if (!power_save_blocker_) {
DVLOG(1) << ("Preventing the application from being suspended while one or "
"more transports are active for Cast Streaming.");
- power_save_blocker_ = content::PowerSaveBlocker::Create(
- content::PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension,
- "Cast is streaming content to a remote receiver.").Pass();
+ power_save_blocker_ =
+ content::PowerSaveBlocker::Create(
+ content::PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension,
+ content::PowerSaveBlocker::kReasonOther,
+ "Cast is streaming content to a remote receiver").Pass();
}
if (id_map_.Lookup(channel_id)) {
diff --git a/chromeos/dbus/power_policy_controller.cc b/chromeos/dbus/power_policy_controller.cc
index 40621c8..e934275 100644
--- a/chromeos/dbus/power_policy_controller.cc
+++ b/chromeos/dbus/power_policy_controller.cc
@@ -4,6 +4,8 @@
#include "chromeos/dbus/power_policy_controller.h"
+#include <utility>
+
#include "base/format_macros.h"
#include "base/logging.h"
#include "base/strings/string_util.h"
@@ -57,9 +59,24 @@ power_manager::PowerManagementPolicy_Action GetProtoAction(
}
}
+// Returns false if |use_audio_activity| and |use_audio_activity| prevent wake
+// locks created for |reason| from being honored or true otherwise.
+bool IsWakeLockReasonHonored(PowerPolicyController::WakeLockReason reason,
+ bool use_audio_activity,
+ bool use_video_activity) {
+ if (reason == PowerPolicyController::REASON_AUDIO_PLAYBACK &&
+ !use_audio_activity)
+ return false;
+ if (reason == PowerPolicyController::REASON_VIDEO_PLAYBACK &&
+ !use_video_activity)
+ return false;
+ return true;
+}
+
} // namespace
const int PowerPolicyController::kScreenLockAfterOffDelayMs = 10000; // 10 sec.
+const char PowerPolicyController::kPrefsReason[] = "Prefs";
// -1 is interpreted as "unset" by powerd, resulting in powerd's default
// delays being used instead. There are no similarly-interpreted values
@@ -224,22 +241,18 @@ void PowerPolicyController::ApplyPrefs(const PrefValues& values) {
SendCurrentPolicy();
}
-int PowerPolicyController::AddScreenWakeLock(const std::string& reason) {
- int id = next_wake_lock_id_++;
- screen_wake_locks_[id] = reason;
- SendCurrentPolicy();
- return id;
+int PowerPolicyController::AddScreenWakeLock(WakeLockReason reason,
+ const std::string& description) {
+ return AddWakeLockInternal(WakeLock::TYPE_SCREEN, reason, description);
}
-int PowerPolicyController::AddSystemWakeLock(const std::string& reason) {
- int id = next_wake_lock_id_++;
- system_wake_locks_[id] = reason;
- SendCurrentPolicy();
- return id;
+int PowerPolicyController::AddSystemWakeLock(WakeLockReason reason,
+ const std::string& description) {
+ return AddWakeLockInternal(WakeLock::TYPE_SYSTEM, reason, description);
}
void PowerPolicyController::RemoveWakeLock(int id) {
- if (!screen_wake_locks_.erase(id) && !system_wake_locks_.erase(id))
+ if (!wake_locks_.erase(id))
LOG(WARNING) << "Ignoring request to remove nonexistent wake lock " << id;
else
SendCurrentPolicy();
@@ -262,14 +275,51 @@ PowerPolicyController::~PowerPolicyController() {
client_->RemoveObserver(this);
}
+PowerPolicyController::WakeLock::WakeLock(Type type,
+ WakeLockReason reason,
+ const std::string& description)
+ : type(type), reason(reason), description(description) {
+}
+
+PowerPolicyController::WakeLock::~WakeLock() {
+}
+
+int PowerPolicyController::AddWakeLockInternal(WakeLock::Type type,
+ WakeLockReason reason,
+ const std::string& description) {
+ const int id = next_wake_lock_id_++;
+ wake_locks_.insert(std::make_pair(id, WakeLock(type, reason, description)));
+ SendCurrentPolicy();
+ return id;
+}
+
void PowerPolicyController::SendCurrentPolicy() {
- std::string reason;
+ std::string causes;
power_manager::PowerManagementPolicy policy = prefs_policy_;
if (prefs_were_set_)
- reason = "Prefs";
+ causes = kPrefsReason;
+
+ bool have_screen_wake_locks = false;
+ bool have_system_wake_locks = false;
+ for (const auto& it : wake_locks_) {
+ // Skip audio and video locks that should be ignored due to policy.
+ if (!IsWakeLockReasonHonored(it.second.reason, policy.use_audio_activity(),
+ policy.use_video_activity()))
+ continue;
+
+ switch (it.second.type) {
+ case WakeLock::TYPE_SCREEN:
+ have_screen_wake_locks = true;
+ break;
+ case WakeLock::TYPE_SYSTEM:
+ have_system_wake_locks = true;
+ break;
+ }
+ causes += (causes.empty() ? "" : ", ") + it.second.description;
+ }
- if (honor_screen_wake_locks_ && !screen_wake_locks_.empty()) {
+ if (honor_screen_wake_locks_ && have_screen_wake_locks) {
policy.mutable_ac_delays()->set_screen_dim_ms(0);
policy.mutable_ac_delays()->set_screen_off_ms(0);
policy.mutable_ac_delays()->set_screen_lock_ms(0);
@@ -278,7 +328,7 @@ void PowerPolicyController::SendCurrentPolicy() {
policy.mutable_battery_delays()->set_screen_lock_ms(0);
}
- if (!screen_wake_locks_.empty() || !system_wake_locks_.empty()) {
+ if (have_screen_wake_locks || have_system_wake_locks) {
if (!policy.has_ac_idle_action() || policy.ac_idle_action() ==
power_manager::PowerManagementPolicy_Action_SUSPEND) {
policy.set_ac_idle_action(
@@ -291,17 +341,8 @@ void PowerPolicyController::SendCurrentPolicy() {
}
}
- for (WakeLockMap::const_iterator it = screen_wake_locks_.begin();
- it != screen_wake_locks_.end(); ++it) {
- reason += (reason.empty() ? "" : ", ") + it->second;
- }
- for (WakeLockMap::const_iterator it = system_wake_locks_.begin();
- it != system_wake_locks_.end(); ++it) {
- reason += (reason.empty() ? "" : ", ") + it->second;
- }
-
- if (!reason.empty())
- policy.set_reason(reason);
+ if (!causes.empty())
+ policy.set_reason(causes);
client_->SetPolicy(policy);
}
diff --git a/chromeos/dbus/power_policy_controller.h b/chromeos/dbus/power_policy_controller.h
index 142892b..5437cd4 100644
--- a/chromeos/dbus/power_policy_controller.h
+++ b/chromeos/dbus/power_policy_controller.h
@@ -32,6 +32,13 @@ class CHROMEOS_EXPORT PowerPolicyController
// Returns the global instance. Initialize() must be called first.
static PowerPolicyController* Get();
+ // Reasons why a wake lock may be added.
+ enum WakeLockReason {
+ REASON_AUDIO_PLAYBACK,
+ REASON_VIDEO_PLAYBACK,
+ REASON_OTHER,
+ };
+
// Note: Do not change these values; they are used by preferences.
enum Action {
ACTION_SUSPEND = 0,
@@ -79,16 +86,20 @@ class CHROMEOS_EXPORT PowerPolicyController
// constant would imply.
static const int kScreenLockAfterOffDelayMs;
+ // String added to a PowerManagementPolicy |reason| field if the policy has
+ // been modified by preferences.
+ static const char kPrefsReason[];
+
// Updates |prefs_policy_| with |values| and sends an updated policy.
void ApplyPrefs(const PrefValues& values);
- // Registers a request to temporarily prevent the screen from getting
- // dimmed or turned off or the system from suspending in response to user
- // inactivity and sends an updated policy. |reason| is a human-readable
- // description of the reason the lock was created. Returns a unique ID
- // that can be passed to RemoveWakeLock() later.
- int AddScreenWakeLock(const std::string& reason);
- int AddSystemWakeLock(const std::string& reason);
+ // Registers a request to temporarily prevent the screen from getting dimmed
+ // or turned off or the system from suspending in response to user inactivity
+ // and sends an updated policy. |description| is a human-readable description
+ // of the reason the lock was created. Returns a unique ID that can be passed
+ // to RemoveWakeLock() later.
+ int AddScreenWakeLock(WakeLockReason reason, const std::string& description);
+ int AddSystemWakeLock(WakeLockReason reason, const std::string& description);
// Unregisters a request previously created via AddScreenWakeLock() or
// AddSystemWakeLock() and sends an updated policy.
@@ -103,7 +114,28 @@ class CHROMEOS_EXPORT PowerPolicyController
friend class PowerPrefsTest;
- typedef std::map<int, std::string> WakeLockMap;
+ // Details about a wake lock added via AddScreenWakeLock() or
+ // AddSystemWakeLock().
+ struct WakeLock {
+ enum Type {
+ TYPE_SCREEN,
+ TYPE_SYSTEM,
+ };
+
+ WakeLock(Type type, WakeLockReason reason, const std::string& description);
+ ~WakeLock();
+
+ const Type type;
+ const WakeLockReason reason;
+ const std::string description;
+ };
+
+ using WakeLockMap = std::map<int, WakeLock>;
+
+ // Helper method for AddScreenWakeLock() and AddSystemWakeLock().
+ int AddWakeLockInternal(WakeLock::Type type,
+ WakeLockReason reason,
+ const std::string& description);
// Sends a policy based on |prefs_policy_| to the power manager.
void SendCurrentPolicy();
@@ -118,12 +150,11 @@ class CHROMEOS_EXPORT PowerPolicyController
// Maps from an ID representing a request to prevent the screen from
// getting dimmed or turned off or to prevent the system from suspending
- // to the reason for the request.
- WakeLockMap screen_wake_locks_;
- WakeLockMap system_wake_locks_;
+ // to details about the request.
+ WakeLockMap wake_locks_;
- // Should entries in |screen_wake_locks_| be honored? If false, screen
- // wake locks are just treated as system wake locks instead.
+ // Should TYPE_SCREEN entries in |wake_locks_| be honored? If false, screen
+ // wake locks are just treated as TYPE_SYSTEM instead.
bool honor_screen_wake_locks_;
// Next ID to be used by AddScreenWakeLock() or AddSystemWakeLock().
diff --git a/chromeos/dbus/power_policy_controller_unittest.cc b/chromeos/dbus/power_policy_controller_unittest.cc
index 3d05c0b..3352f21 100644
--- a/chromeos/dbus/power_policy_controller_unittest.cc
+++ b/chromeos/dbus/power_policy_controller_unittest.cc
@@ -82,7 +82,7 @@ TEST_F(PowerPolicyControllerTest, Prefs) {
expected_policy.set_user_activity_screen_dim_delay_factor(2.0);
expected_policy.set_wait_for_initial_user_activity(true);
expected_policy.set_force_nonzero_brightness_for_user_activity(false);
- expected_policy.set_reason("Prefs");
+ expected_policy.set_reason(PowerPolicyController::kPrefsReason);
EXPECT_EQ(PowerPolicyController::GetPolicyDebugString(expected_policy),
PowerPolicyController::GetPolicyDebugString(
fake_power_client_->policy()));
@@ -151,10 +151,12 @@ TEST_F(PowerPolicyControllerTest, Prefs) {
// pref-supplied screen-related delays should be left untouched.
prefs.allow_screen_wake_locks = false;
policy_controller_->ApplyPrefs(prefs);
- policy_controller_->AddScreenWakeLock("Screen");
+ policy_controller_->AddScreenWakeLock(PowerPolicyController::REASON_OTHER,
+ "Screen");
expected_policy.set_ac_idle_action(
power_manager::PowerManagementPolicy_Action_DO_NOTHING);
- expected_policy.set_reason("Prefs, Screen");
+ expected_policy.set_reason(std::string(PowerPolicyController::kPrefsReason) +
+ ", Screen");
EXPECT_EQ(PowerPolicyController::GetPolicyDebugString(expected_policy),
PowerPolicyController::GetPolicyDebugString(
fake_power_client_->policy()));
@@ -162,8 +164,8 @@ TEST_F(PowerPolicyControllerTest, Prefs) {
TEST_F(PowerPolicyControllerTest, WakeLocks) {
const char kSystemWakeLockReason[] = "system";
- const int system_id =
- policy_controller_->AddSystemWakeLock(kSystemWakeLockReason);
+ const int system_id = policy_controller_->AddSystemWakeLock(
+ PowerPolicyController::REASON_OTHER, kSystemWakeLockReason);
power_manager::PowerManagementPolicy expected_policy;
expected_policy.set_ac_idle_action(
power_manager::PowerManagementPolicy_Action_DO_NOTHING);
@@ -176,15 +178,15 @@ TEST_F(PowerPolicyControllerTest, WakeLocks) {
const char kScreenWakeLockReason[] = "screen";
const int screen_id = policy_controller_->AddScreenWakeLock(
- kScreenWakeLockReason);
+ PowerPolicyController::REASON_OTHER, kScreenWakeLockReason);
expected_policy.mutable_ac_delays()->set_screen_dim_ms(0);
expected_policy.mutable_ac_delays()->set_screen_off_ms(0);
expected_policy.mutable_ac_delays()->set_screen_lock_ms(0);
expected_policy.mutable_battery_delays()->set_screen_dim_ms(0);
expected_policy.mutable_battery_delays()->set_screen_off_ms(0);
expected_policy.mutable_battery_delays()->set_screen_lock_ms(0);
- expected_policy.set_reason(
- std::string(kScreenWakeLockReason) + ", " + kSystemWakeLockReason);
+ expected_policy.set_reason(std::string(kSystemWakeLockReason) + ", " +
+ kScreenWakeLockReason);
EXPECT_EQ(PowerPolicyController::GetPolicyDebugString(expected_policy),
PowerPolicyController::GetPolicyDebugString(
fake_power_client_->policy()));
@@ -202,6 +204,72 @@ TEST_F(PowerPolicyControllerTest, WakeLocks) {
fake_power_client_->policy()));
}
+TEST_F(PowerPolicyControllerTest, IgnoreMediaWakeLocksWhenRequested) {
+ PowerPolicyController::PrefValues prefs;
+ policy_controller_->ApplyPrefs(prefs);
+ const power_manager::PowerManagementPolicy kDefaultPolicy =
+ fake_power_client_->policy();
+
+ // Wake locks created for audio or video playback should be ignored when the
+ // |use_audio_activity| or |use_video_activity| prefs are unset.
+ prefs.use_audio_activity = false;
+ prefs.use_video_activity = false;
+ policy_controller_->ApplyPrefs(prefs);
+
+ const int audio_id = policy_controller_->AddSystemWakeLock(
+ PowerPolicyController::REASON_AUDIO_PLAYBACK, "audio");
+ const int video_id = policy_controller_->AddScreenWakeLock(
+ PowerPolicyController::REASON_VIDEO_PLAYBACK, "video");
+
+ power_manager::PowerManagementPolicy expected_policy = kDefaultPolicy;
+ expected_policy.set_use_audio_activity(false);
+ expected_policy.set_use_video_activity(false);
+ expected_policy.set_reason(PowerPolicyController::kPrefsReason);
+ EXPECT_EQ(PowerPolicyController::GetPolicyDebugString(expected_policy),
+ PowerPolicyController::GetPolicyDebugString(
+ fake_power_client_->policy()));
+
+ // Non-media screen wake locks should still be honored.
+ const int other_id = policy_controller_->AddScreenWakeLock(
+ PowerPolicyController::REASON_OTHER, "other");
+
+ expected_policy.set_ac_idle_action(
+ power_manager::PowerManagementPolicy_Action_DO_NOTHING);
+ expected_policy.set_battery_idle_action(
+ power_manager::PowerManagementPolicy_Action_DO_NOTHING);
+ expected_policy.mutable_ac_delays()->set_screen_dim_ms(0);
+ expected_policy.mutable_ac_delays()->set_screen_off_ms(0);
+ expected_policy.mutable_ac_delays()->set_screen_lock_ms(0);
+ expected_policy.mutable_battery_delays()->set_screen_dim_ms(0);
+ expected_policy.mutable_battery_delays()->set_screen_off_ms(0);
+ expected_policy.mutable_battery_delays()->set_screen_lock_ms(0);
+ expected_policy.set_reason(std::string(PowerPolicyController::kPrefsReason) +
+ ", other");
+ EXPECT_EQ(PowerPolicyController::GetPolicyDebugString(expected_policy),
+ PowerPolicyController::GetPolicyDebugString(
+ fake_power_client_->policy()));
+
+ // Start honoring audio activity and check that the audio wake lock is used.
+ policy_controller_->RemoveWakeLock(other_id);
+ prefs.use_audio_activity = true;
+ policy_controller_->ApplyPrefs(prefs);
+
+ expected_policy = kDefaultPolicy;
+ expected_policy.set_use_video_activity(false);
+ expected_policy.set_ac_idle_action(
+ power_manager::PowerManagementPolicy_Action_DO_NOTHING);
+ expected_policy.set_battery_idle_action(
+ power_manager::PowerManagementPolicy_Action_DO_NOTHING);
+ expected_policy.set_reason(std::string(PowerPolicyController::kPrefsReason) +
+ ", audio");
+ EXPECT_EQ(PowerPolicyController::GetPolicyDebugString(expected_policy),
+ PowerPolicyController::GetPolicyDebugString(
+ fake_power_client_->policy()));
+
+ policy_controller_->RemoveWakeLock(audio_id);
+ policy_controller_->RemoveWakeLock(video_id);
+}
+
TEST_F(PowerPolicyControllerTest, AvoidSendingEmptyPolicies) {
// Check that empty policies aren't sent when PowerPolicyController is created
// or destroyed.
diff --git a/content/browser/devtools/render_frame_devtools_agent_host.cc b/content/browser/devtools/render_frame_devtools_agent_host.cc
index da04255..c9f046b 100644
--- a/content/browser/devtools/render_frame_devtools_agent_host.cc
+++ b/content/browser/devtools/render_frame_devtools_agent_host.cc
@@ -211,11 +211,10 @@ void RenderFrameDevToolsAgentHost::InnerOnClientAttached() {
render_frame_host_->GetProcess()->GetID());
#if defined(OS_ANDROID)
- power_save_blocker_.reset(
- static_cast<PowerSaveBlockerImpl*>(
- PowerSaveBlocker::Create(
- PowerSaveBlocker::kPowerSaveBlockPreventDisplaySleep,
- "DevTools").release()));
+ power_save_blocker_.reset(static_cast<PowerSaveBlockerImpl*>(
+ PowerSaveBlocker::Create(
+ PowerSaveBlocker::kPowerSaveBlockPreventDisplaySleep,
+ PowerSaveBlocker::kReasonOther, "DevTools").release()));
RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>(
render_frame_host_->GetRenderViewHost());
if (rvh->GetView()) {
diff --git a/content/browser/download/download_browsertest.cc b/content/browser/download/download_browsertest.cc
index b39e04e..a129f23 100644
--- a/content/browser/download/download_browsertest.cc
+++ b/content/browser/download/download_browsertest.cc
@@ -242,10 +242,9 @@ DownloadFile* DownloadFileWithDelayFactory::CreateFile(
scoped_ptr<ByteStreamReader> stream,
const net::BoundNetLog& bound_net_log,
base::WeakPtr<DownloadDestinationObserver> observer) {
- scoped_ptr<PowerSaveBlocker> psb(
- PowerSaveBlocker::Create(
- PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension,
- "Download in progress"));
+ scoped_ptr<PowerSaveBlocker> psb(PowerSaveBlocker::Create(
+ PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension,
+ PowerSaveBlocker::kReasonOther, "Download in progress"));
return new DownloadFileWithDelay(
save_info.Pass(), default_download_directory, url, referrer_url,
calculate_hash, stream.Pass(), bound_net_log,
@@ -342,10 +341,9 @@ class CountingDownloadFileFactory : public DownloadFileFactory {
scoped_ptr<ByteStreamReader> stream,
const net::BoundNetLog& bound_net_log,
base::WeakPtr<DownloadDestinationObserver> observer) override {
- scoped_ptr<PowerSaveBlocker> psb(
- PowerSaveBlocker::Create(
- PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension,
- "Download in progress"));
+ scoped_ptr<PowerSaveBlocker> psb(PowerSaveBlocker::Create(
+ PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension,
+ PowerSaveBlocker::kReasonOther, "Download in progress"));
return new CountingDownloadFile(
save_info.Pass(), default_downloads_directory, url, referrer_url,
calculate_hash, stream.Pass(), bound_net_log,
diff --git a/content/browser/download/download_resource_handler.cc b/content/browser/download/download_resource_handler.cc
index c970d07..224f45c 100644
--- a/content/browser/download/download_resource_handler.cc
+++ b/content/browser/download/download_resource_handler.cc
@@ -131,7 +131,7 @@ DownloadResourceHandler::DownloadResourceHandler(
tab_info_));
power_save_blocker_ = PowerSaveBlocker::Create(
PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension,
- "Download in progress");
+ PowerSaveBlocker::kReasonOther, "Download in progress");
}
bool DownloadResourceHandler::OnUploadProgress(uint64 position,
diff --git a/content/browser/loader/power_save_block_resource_throttle.cc b/content/browser/loader/power_save_block_resource_throttle.cc
index f99cedb..23f2002 100644
--- a/content/browser/loader/power_save_block_resource_throttle.cc
+++ b/content/browser/loader/power_save_block_resource_throttle.cc
@@ -47,7 +47,7 @@ const char* PowerSaveBlockResourceThrottle::GetNameForLogging() const {
void PowerSaveBlockResourceThrottle::ActivatePowerSaveBlocker() {
power_save_blocker_ = PowerSaveBlocker::Create(
PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension,
- "Uploading data.");
+ PowerSaveBlocker::kReasonOther, "Uploading data");
}
} // namespace content
diff --git a/content/browser/media/capture/desktop_capture_device.cc b/content/browser/media/capture/desktop_capture_device.cc
index bb546c2..410a224 100644
--- a/content/browser/media/capture/desktop_capture_device.cc
+++ b/content/browser/media/capture/desktop_capture_device.cc
@@ -174,9 +174,11 @@ void DesktopCaptureDevice::Core::AllocateAndStart(
// This capturer always outputs ARGB, non-interlaced.
capture_format_.pixel_format = media::PIXEL_FORMAT_ARGB;
- power_save_blocker_.reset(PowerSaveBlocker::Create(
- PowerSaveBlocker::kPowerSaveBlockPreventDisplaySleep,
- "DesktopCaptureDevice is running").release());
+ power_save_blocker_.reset(
+ PowerSaveBlocker::Create(
+ PowerSaveBlocker::kPowerSaveBlockPreventDisplaySleep,
+ PowerSaveBlocker::kReasonOther,
+ "DesktopCaptureDevice is running").release());
desktop_capturer_->Start(this);
diff --git a/content/browser/media/capture/desktop_capture_device_aura.cc b/content/browser/media/capture/desktop_capture_device_aura.cc
index 3a9ef40..640ad24 100644
--- a/content/browser/media/capture/desktop_capture_device_aura.cc
+++ b/content/browser/media/capture/desktop_capture_device_aura.cc
@@ -218,9 +218,11 @@ bool DesktopVideoCaptureMachine::Start(
if (desktop_window_->GetHost())
desktop_window_->GetHost()->compositor()->AddObserver(this);
- power_save_blocker_.reset(PowerSaveBlocker::Create(
- PowerSaveBlocker::kPowerSaveBlockPreventDisplaySleep,
- "DesktopCaptureDevice is running").release());
+ power_save_blocker_.reset(
+ PowerSaveBlocker::Create(
+ PowerSaveBlocker::kPowerSaveBlockPreventDisplaySleep,
+ PowerSaveBlocker::kReasonOther,
+ "DesktopCaptureDevice is running").release());
// Starts timer.
timer_.Start(FROM_HERE, oracle_proxy_->min_capture_period(),
diff --git a/content/browser/media/webrtc_internals.cc b/content/browser/media/webrtc_internals.cc
index 56078a1..693c4db 100644
--- a/content/browser/media/webrtc_internals.cc
+++ b/content/browser/media/webrtc_internals.cc
@@ -377,9 +377,11 @@ void WebRTCInternals::CreateOrReleasePowerSaveBlocker() {
} else if (!peer_connection_data_.empty() && !power_save_blocker_) {
DVLOG(1) << ("Preventing the application from being suspended while one or "
"more PeerConnections are active.");
- power_save_blocker_ = content::PowerSaveBlocker::Create(
- content::PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension,
- "WebRTC has active PeerConnections.").Pass();
+ power_save_blocker_ =
+ content::PowerSaveBlocker::Create(
+ PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension,
+ PowerSaveBlocker::kReasonOther,
+ "WebRTC has active PeerConnections").Pass();
}
}
diff --git a/content/browser/power_save_blocker_android.cc b/content/browser/power_save_blocker_android.cc
index 2f79ef9..19a4963 100644
--- a/content/browser/power_save_blocker_android.cc
+++ b/content/browser/power_save_blocker_android.cc
@@ -57,7 +57,8 @@ void PowerSaveBlockerImpl::Delegate::RemoveBlock() {
}
PowerSaveBlockerImpl::PowerSaveBlockerImpl(PowerSaveBlockerType type,
- const std::string& reason) {
+ Reason reason,
+ const std::string& description) {
// Don't support kPowerSaveBlockPreventAppSuspension
}
diff --git a/content/browser/power_save_blocker_chromeos.cc b/content/browser/power_save_blocker_chromeos.cc
index ae99975..854a1ef 100644
--- a/content/browser/power_save_blocker_chromeos.cc
+++ b/content/browser/power_save_blocker_chromeos.cc
@@ -16,13 +16,32 @@
namespace content {
+namespace {
+
+// Converts a PowerSaveBlocker::Reason to a
+// chromeos::PowerPolicyController::WakeLockReason.
+chromeos::PowerPolicyController::WakeLockReason GetWakeLockReason(
+ PowerSaveBlocker::Reason reason) {
+ switch (reason) {
+ case PowerSaveBlocker::kReasonAudioPlayback:
+ return chromeos::PowerPolicyController::REASON_AUDIO_PLAYBACK;
+ case PowerSaveBlocker::kReasonVideoPlayback:
+ return chromeos::PowerPolicyController::REASON_VIDEO_PLAYBACK;
+ case PowerSaveBlocker::kReasonOther:
+ return chromeos::PowerPolicyController::REASON_OTHER;
+ }
+ return chromeos::PowerPolicyController::REASON_OTHER;
+}
+
+} // namespace
+
class PowerSaveBlockerImpl::Delegate
: public base::RefCountedThreadSafe<PowerSaveBlockerImpl::Delegate> {
public:
- Delegate(PowerSaveBlockerType type, const std::string& reason)
- : type_(type),
- reason_(reason),
- block_id_(0) {}
+ Delegate(PowerSaveBlockerType type,
+ Reason reason,
+ const std::string& description)
+ : type_(type), reason_(reason), description_(description), block_id_(0) {}
void ApplyBlock() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
@@ -32,10 +51,12 @@ class PowerSaveBlockerImpl::Delegate
auto* controller = chromeos::PowerPolicyController::Get();
switch (type_) {
case kPowerSaveBlockPreventAppSuspension:
- block_id_ = controller->AddSystemWakeLock(reason_);
+ block_id_ = controller->AddSystemWakeLock(GetWakeLockReason(reason_),
+ description_);
break;
case kPowerSaveBlockPreventDisplaySleep:
- block_id_ = controller->AddScreenWakeLock(reason_);
+ block_id_ = controller->AddScreenWakeLock(GetWakeLockReason(reason_),
+ description_);
break;
default:
NOTREACHED() << "Unhandled block type " << type_;
@@ -55,7 +76,8 @@ class PowerSaveBlockerImpl::Delegate
virtual ~Delegate() {}
PowerSaveBlockerType type_;
- std::string reason_;
+ Reason reason_;
+ std::string description_;
// ID corresponding to the block request in PowerPolicyController.
int block_id_;
@@ -64,8 +86,9 @@ class PowerSaveBlockerImpl::Delegate
};
PowerSaveBlockerImpl::PowerSaveBlockerImpl(PowerSaveBlockerType type,
- const std::string& reason)
- : delegate_(new Delegate(type, reason)) {
+ Reason reason,
+ const std::string& description)
+ : delegate_(new Delegate(type, reason, description)) {
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
base::Bind(&Delegate::ApplyBlock, delegate_));
}
diff --git a/content/browser/power_save_blocker_impl.cc b/content/browser/power_save_blocker_impl.cc
index 01007ad..416ddb3 100644
--- a/content/browser/power_save_blocker_impl.cc
+++ b/content/browser/power_save_blocker_impl.cc
@@ -11,8 +11,10 @@ PowerSaveBlocker::~PowerSaveBlocker() {}
// static
scoped_ptr<PowerSaveBlocker> PowerSaveBlocker::Create(
PowerSaveBlockerType type,
- const std::string& reason) {
- return scoped_ptr<PowerSaveBlocker>(new PowerSaveBlockerImpl(type, reason));
+ Reason reason,
+ const std::string& description) {
+ return scoped_ptr<PowerSaveBlocker>(
+ new PowerSaveBlockerImpl(type, reason, description));
}
} // namespace content
diff --git a/content/browser/power_save_blocker_impl.h b/content/browser/power_save_blocker_impl.h
index 39ba8f2..7ba0b54 100644
--- a/content/browser/power_save_blocker_impl.h
+++ b/content/browser/power_save_blocker_impl.h
@@ -5,6 +5,8 @@
#ifndef CONTENT_BROWSER_POWER_SAVE_BLOCKER_IMPL_H_
#define CONTENT_BROWSER_POWER_SAVE_BLOCKER_IMPL_H_
+#include <string>
+
#include "base/memory/ref_counted.h"
#include "content/public/browser/power_save_blocker.h"
#include "ui/gfx/native_widget_types.h"
@@ -13,7 +15,9 @@ namespace content {
class PowerSaveBlockerImpl : public PowerSaveBlocker {
public:
- PowerSaveBlockerImpl(PowerSaveBlockerType type, const std::string& reason);
+ PowerSaveBlockerImpl(PowerSaveBlockerType type,
+ Reason reason,
+ const std::string& description);
~PowerSaveBlockerImpl() override;
#if defined(OS_ANDROID)
diff --git a/content/browser/power_save_blocker_mac.cc b/content/browser/power_save_blocker_mac.cc
index 9b3fe09..ca46660 100644
--- a/content/browser/power_save_blocker_mac.cc
+++ b/content/browser/power_save_blocker_mac.cc
@@ -41,8 +41,10 @@ base::LazyInstance<base::Thread, PowerSaveBlockerLazyInstanceTraits>
class PowerSaveBlockerImpl::Delegate
: public base::RefCountedThreadSafe<PowerSaveBlockerImpl::Delegate> {
public:
- Delegate(PowerSaveBlockerType type, const std::string& reason)
- : type_(type), reason_(reason), assertion_(kIOPMNullAssertionID) {}
+ Delegate(PowerSaveBlockerType type, const std::string& description)
+ : type_(type),
+ description_(description),
+ assertion_(kIOPMNullAssertionID) {}
// Does the actual work to apply or remove the desired power save block.
void ApplyBlock();
@@ -52,7 +54,7 @@ class PowerSaveBlockerImpl::Delegate
friend class base::RefCountedThreadSafe<Delegate>;
~Delegate() {}
PowerSaveBlockerType type_;
- std::string reason_;
+ std::string description_;
IOPMAssertionID assertion_;
};
@@ -75,12 +77,10 @@ void PowerSaveBlockerImpl::Delegate::ApplyBlock() {
break;
}
if (level) {
- base::ScopedCFTypeRef<CFStringRef> cf_reason(
- base::SysUTF8ToCFStringRef(reason_));
- IOReturn result = IOPMAssertionCreateWithName(level,
- kIOPMAssertionLevelOn,
- cf_reason,
- &assertion_);
+ base::ScopedCFTypeRef<CFStringRef> cf_description(
+ base::SysUTF8ToCFStringRef(description_));
+ IOReturn result = IOPMAssertionCreateWithName(level, kIOPMAssertionLevelOn,
+ cf_description, &assertion_);
LOG_IF(ERROR, result != kIOReturnSuccess)
<< "IOPMAssertionCreate: " << result;
}
@@ -98,8 +98,9 @@ void PowerSaveBlockerImpl::Delegate::RemoveBlock() {
}
PowerSaveBlockerImpl::PowerSaveBlockerImpl(PowerSaveBlockerType type,
- const std::string& reason)
- : delegate_(new Delegate(type, reason)) {
+ Reason reason,
+ const std::string& description)
+ : delegate_(new Delegate(type, description)) {
g_power_thread.Pointer()->message_loop()->PostTask(
FROM_HERE,
base::Bind(&Delegate::ApplyBlock, delegate_));
diff --git a/content/browser/power_save_blocker_ozone.cc b/content/browser/power_save_blocker_ozone.cc
index f21f414..de7562c 100644
--- a/content/browser/power_save_blocker_ozone.cc
+++ b/content/browser/power_save_blocker_ozone.cc
@@ -24,7 +24,8 @@ class PowerSaveBlockerImpl::Delegate
};
PowerSaveBlockerImpl::PowerSaveBlockerImpl(PowerSaveBlockerType type,
- const std::string& reason)
+ Reason reason,
+ const std::string& description)
: delegate_(new Delegate()) {
NOTIMPLEMENTED();
}
diff --git a/content/browser/power_save_blocker_win.cc b/content/browser/power_save_blocker_win.cc
index 4cbecf4..75b8e00 100644
--- a/content/browser/power_save_blocker_win.cc
+++ b/content/browser/power_save_blocker_win.cc
@@ -17,7 +17,8 @@ namespace {
int g_blocker_count[2];
-HANDLE CreatePowerRequest(POWER_REQUEST_TYPE type, const std::string& reason) {
+HANDLE CreatePowerRequest(POWER_REQUEST_TYPE type,
+ const std::string& description) {
typedef HANDLE (WINAPI* PowerCreateRequestPtr)(PREASON_CONTEXT);
typedef BOOL (WINAPI* PowerSetRequestPtr)(HANDLE, POWER_REQUEST_TYPE);
@@ -39,11 +40,12 @@ HANDLE CreatePowerRequest(POWER_REQUEST_TYPE type, const std::string& reason) {
if (!PowerCreateRequestFn || !PowerSetRequestFn)
return INVALID_HANDLE_VALUE;
}
- base::string16 wide_reason = base::ASCIIToUTF16(reason);
+ base::string16 wide_description = base::ASCIIToUTF16(description);
REASON_CONTEXT context = {0};
context.Version = POWER_REQUEST_CONTEXT_VERSION;
context.Flags = POWER_REQUEST_CONTEXT_SIMPLE_STRING;
- context.Reason.SimpleReasonString = const_cast<wchar_t*>(wide_reason.c_str());
+ context.Reason.SimpleReasonString =
+ const_cast<wchar_t*>(wide_description.c_str());
base::win::ScopedHandle handle(PowerCreateRequestFn(&context));
if (!handle.IsValid())
@@ -110,8 +112,8 @@ void ApplySimpleBlock(PowerSaveBlocker::PowerSaveBlockerType type,
class PowerSaveBlockerImpl::Delegate
: public base::RefCountedThreadSafe<PowerSaveBlockerImpl::Delegate> {
public:
- Delegate(PowerSaveBlockerType type, const std::string& reason)
- : type_(type), reason_(reason) {}
+ Delegate(PowerSaveBlockerType type, const std::string& description)
+ : type_(type), description_(description) {}
// Does the actual work to apply or remove the desired power save block.
void ApplyBlock();
@@ -125,7 +127,7 @@ class PowerSaveBlockerImpl::Delegate
~Delegate() {}
PowerSaveBlockerType type_;
- const std::string reason_;
+ const std::string description_;
base::win::ScopedHandle handle_;
DISALLOW_COPY_AND_ASSIGN(Delegate);
@@ -136,7 +138,7 @@ void PowerSaveBlockerImpl::Delegate::ApplyBlock() {
if (base::win::GetVersion() < base::win::VERSION_WIN7)
return ApplySimpleBlock(type_, 1);
- handle_.Set(CreatePowerRequest(RequestType(), reason_));
+ handle_.Set(CreatePowerRequest(RequestType(), description_));
}
void PowerSaveBlockerImpl::Delegate::RemoveBlock() {
@@ -158,8 +160,9 @@ POWER_REQUEST_TYPE PowerSaveBlockerImpl::Delegate::RequestType() {
}
PowerSaveBlockerImpl::PowerSaveBlockerImpl(PowerSaveBlockerType type,
- const std::string& reason)
- : delegate_(new Delegate(type, reason)) {
+ Reason reason,
+ const std::string& description)
+ : delegate_(new Delegate(type, description)) {
BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE,
base::Bind(&Delegate::ApplyBlock, delegate_));
diff --git a/content/browser/power_save_blocker_x11.cc b/content/browser/power_save_blocker_x11.cc
index f1d028c..58e1e49 100644
--- a/content/browser/power_save_blocker_x11.cc
+++ b/content/browser/power_save_blocker_x11.cc
@@ -67,7 +67,7 @@ class PowerSaveBlockerImpl::Delegate
: public base::RefCountedThreadSafe<PowerSaveBlockerImpl::Delegate> {
public:
// Picks an appropriate D-Bus API to use based on the desktop environment.
- Delegate(PowerSaveBlockerType type, const std::string& reason);
+ Delegate(PowerSaveBlockerType type, const std::string& description);
// Post a task to initialize the delegate on the UI thread, which will itself
// then post a task to apply the power save block on the FILE thread.
@@ -104,7 +104,7 @@ class PowerSaveBlockerImpl::Delegate
static DBusAPI SelectAPI();
const PowerSaveBlockerType type_;
- const std::string reason_;
+ const std::string description_;
// Initially, we post a message to the UI thread to select an API. When it
// finishes, it will post a message to the FILE thread to perform the actual
@@ -125,9 +125,9 @@ class PowerSaveBlockerImpl::Delegate
};
PowerSaveBlockerImpl::Delegate::Delegate(PowerSaveBlockerType type,
- const std::string& reason)
+ const std::string& description)
: type_(type),
- reason_(reason),
+ description_(description),
api_(NO_API),
enqueue_apply_(false),
inhibit_cookie_(0) {
@@ -202,7 +202,7 @@ void PowerSaveBlockerImpl::Delegate::ApplyBlock(DBusAPI api) {
message_writer->AppendString(
base::CommandLine::ForCurrentProcess()->GetProgram().value());
message_writer->AppendUint32(0); // should be toplevel_xid
- message_writer->AppendString(reason_);
+ message_writer->AppendString(description_);
{
uint32 flags = 0;
switch (type_) {
@@ -229,7 +229,7 @@ void PowerSaveBlockerImpl::Delegate::ApplyBlock(DBusAPI api) {
// reason: The reason for the inhibit
message_writer->AppendString(
base::CommandLine::ForCurrentProcess()->GetProgram().value());
- message_writer->AppendString(reason_);
+ message_writer->AppendString(description_);
break;
}
@@ -325,9 +325,10 @@ DBusAPI PowerSaveBlockerImpl::Delegate::SelectAPI() {
return NO_API;
}
-PowerSaveBlockerImpl::PowerSaveBlockerImpl(
- PowerSaveBlockerType type, const std::string& reason)
- : delegate_(new Delegate(type, reason)) {
+PowerSaveBlockerImpl::PowerSaveBlockerImpl(PowerSaveBlockerType type,
+ Reason reason,
+ const std::string& description)
+ : delegate_(new Delegate(type, description)) {
delegate_->Init();
}
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index e248fe0..b12ae21 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -3172,26 +3172,22 @@ void WebContentsImpl::OnUpdateFaviconURL(
}
void WebContentsImpl::CreateAudioPowerSaveBlocker() {
- // ChromeOS has its own way of handling power save blocks for media.
-#if !defined(OS_CHROMEOS)
DCHECK(!audio_power_save_blocker_);
audio_power_save_blocker_ = PowerSaveBlocker::Create(
- PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension, "Playing Audio");
-#endif
+ PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension,
+ PowerSaveBlocker::kReasonAudioPlayback, "Playing audio");
}
void WebContentsImpl::CreateVideoPowerSaveBlocker() {
- // ChromeOS has its own way of handling power save blocks for media.
-#if !defined(OS_CHROMEOS)
DCHECK(!video_power_save_blocker_);
DCHECK(!active_video_players_.empty());
video_power_save_blocker_ = PowerSaveBlocker::Create(
- PowerSaveBlocker::kPowerSaveBlockPreventDisplaySleep, "Playing Video");
+ PowerSaveBlocker::kPowerSaveBlockPreventDisplaySleep,
+ PowerSaveBlocker::kReasonVideoPlayback, "Playing video");
#if defined(OS_ANDROID)
static_cast<PowerSaveBlockerImpl*>(video_power_save_blocker_.get())
->InitDisplaySleepBlocker(GetView()->GetNativeView());
#endif
-#endif
}
void WebContentsImpl::MaybeReleasePowerSaveBlockers() {
diff --git a/content/public/browser/power_save_blocker.h b/content/public/browser/power_save_blocker.h
index fe9f966..813c878 100644
--- a/content/public/browser/power_save_blocker.h
+++ b/content/public/browser/power_save_blocker.h
@@ -32,13 +32,26 @@ class CONTENT_EXPORT PowerSaveBlocker {
kPowerSaveBlockPreventDisplaySleep,
};
+ // Reasons why power-saving features may be blocked.
+ enum Reason {
+ // Audio is being played.
+ kReasonAudioPlayback,
+ // Video is being played.
+ kReasonVideoPlayback,
+ // Power-saving is blocked for some other reason.
+ kReasonOther,
+ };
+
virtual ~PowerSaveBlocker() = 0;
// Pass in the type of power save blocking desired. If multiple types of
// blocking are desired, instantiate one PowerSaveBlocker for each type.
- // |reason| may be provided to the underlying system APIs on some platforms.
+ // |reason| and |description| (a more-verbose, human-readable justification of
+ // the blocking) may be provided to the underlying system APIs on some
+ // platforms.
static scoped_ptr<PowerSaveBlocker> Create(PowerSaveBlockerType type,
- const std::string& reason);
+ Reason reason,
+ const std::string& description);
};
} // namespace content
diff --git a/extensions/browser/api/power/power_api_manager.cc b/extensions/browser/api/power/power_api_manager.cc
index 9a8d0d5..642e794 100644
--- a/extensions/browser/api/power/power_api_manager.cc
+++ b/extensions/browser/api/power/power_api_manager.cc
@@ -13,7 +13,7 @@ namespace extensions {
namespace {
-const char kPowerSaveBlockerReason[] = "extension";
+const char kPowerSaveBlockerDescription[] = "extension";
content::PowerSaveBlocker::PowerSaveBlockerType
LevelToPowerSaveBlockerType(core_api::power::Level level) {
@@ -98,7 +98,9 @@ void PowerApiManager::UpdatePowerSaveBlocker() {
content::PowerSaveBlocker::PowerSaveBlockerType type =
LevelToPowerSaveBlockerType(new_level);
scoped_ptr<content::PowerSaveBlocker> new_blocker(
- create_blocker_function_.Run(type, kPowerSaveBlockerReason));
+ create_blocker_function_.Run(type,
+ content::PowerSaveBlocker::kReasonOther,
+ kPowerSaveBlockerDescription));
power_save_blocker_.swap(new_blocker);
current_level_ = new_level;
}
diff --git a/extensions/browser/api/power/power_api_manager.h b/extensions/browser/api/power/power_api_manager.h
index a213f40..4037811 100644
--- a/extensions/browser/api/power/power_api_manager.h
+++ b/extensions/browser/api/power/power_api_manager.h
@@ -30,6 +30,7 @@ class PowerApiManager : public BrowserContextKeyedAPI,
public:
typedef base::Callback<scoped_ptr<content::PowerSaveBlocker>(
content::PowerSaveBlocker::PowerSaveBlockerType,
+ content::PowerSaveBlocker::Reason,
const std::string&)> CreateBlockerFunction;
static PowerApiManager* Get(content::BrowserContext* context);
diff --git a/extensions/browser/api/power/power_api_unittest.cc b/extensions/browser/api/power/power_api_unittest.cc
index 3e7d8d4..e4e0a07 100644
--- a/extensions/browser/api/power/power_api_unittest.cc
+++ b/extensions/browser/api/power/power_api_unittest.cc
@@ -91,7 +91,8 @@ class PowerSaveBlockerStubManager {
// Creates a new PowerSaveBlockerStub of type |type|.
scoped_ptr<content::PowerSaveBlocker> CreateStub(
content::PowerSaveBlocker::PowerSaveBlockerType type,
- const std::string& reason) {
+ content::PowerSaveBlocker::Reason reason,
+ const std::string& description) {
Request unblock_request = NONE;
switch (type) {
case content::PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension: