Index: extensions/browser/api/power/power_api.cc |
diff --git a/extensions/browser/api/power/power_api.cc b/extensions/browser/api/power/power_api.cc |
index d731b9f6796e02260beff9166b22cdec9ea711f9..c8611c138f55f945dc59cb3cd81629f6d8681155 100644 |
--- a/extensions/browser/api/power/power_api.cc |
+++ b/extensions/browser/api/power/power_api.cc |
@@ -4,8 +4,11 @@ |
#include "extensions/browser/api/power/power_api.h" |
-#include "extensions/browser/api/power/power_api_manager.h" |
+#include "base/bind.h" |
+#include "base/lazy_instance.h" |
+#include "extensions/browser/extension_registry.h" |
#include "extensions/common/api/power.h" |
+#include "extensions/common/extension.h" |
namespace extensions { |
@@ -14,14 +17,115 @@ bool PowerRequestKeepAwakeFunction::RunSync() { |
core_api::power::RequestKeepAwake::Params::Create(*args_)); |
EXTENSION_FUNCTION_VALIDATE(params); |
EXTENSION_FUNCTION_VALIDATE(params->level != core_api::power::LEVEL_NONE); |
- PowerApiManager::Get(browser_context())->AddRequest( |
- extension_id(), params->level); |
+ PowerApi::Get(browser_context())->AddRequest(extension_id(), params->level); |
return true; |
} |
bool PowerReleaseKeepAwakeFunction::RunSync() { |
- PowerApiManager::Get(browser_context())->RemoveRequest(extension_id()); |
+ PowerApi::Get(browser_context())->RemoveRequest(extension_id()); |
return true; |
} |
+namespace { |
Daniel Erat
2015/02/27 13:58:39
this anonymous namespace should be moved just afte
zhuoyu.qian
2015/02/28 01:46:42
Done.
|
+ |
+const char kPowerSaveBlockerDescription[] = "extension"; |
+ |
+content::PowerSaveBlocker::PowerSaveBlockerType LevelToPowerSaveBlockerType( |
+ core_api::power::Level level) { |
+ switch (level) { |
+ case core_api::power::LEVEL_SYSTEM: |
+ return content::PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension; |
+ case core_api::power::LEVEL_DISPLAY: // fallthrough |
+ case core_api::power::LEVEL_NONE: |
+ return content::PowerSaveBlocker::kPowerSaveBlockPreventDisplaySleep; |
+ } |
+ NOTREACHED() << "Unhandled level " << level; |
+ return content::PowerSaveBlocker::kPowerSaveBlockPreventDisplaySleep; |
+} |
+ |
+base::LazyInstance<BrowserContextKeyedAPIFactory<PowerApi>> g_factory = |
+ LAZY_INSTANCE_INITIALIZER; |
+ |
+} // namespace |
+ |
+// static |
+PowerApi* PowerApi::Get(content::BrowserContext* context) { |
+ return BrowserContextKeyedAPIFactory<PowerApi>::Get(context); |
+} |
+ |
+// static |
+BrowserContextKeyedAPIFactory<PowerApi>* PowerApi::GetFactoryInstance() { |
+ return g_factory.Pointer(); |
+} |
+ |
+void PowerApi::AddRequest(const std::string& extension_id, |
+ core_api::power::Level level) { |
+ extension_levels_[extension_id] = level; |
+ UpdatePowerSaveBlocker(); |
+} |
+ |
+void PowerApi::RemoveRequest(const std::string& extension_id) { |
+ extension_levels_.erase(extension_id); |
+ UpdatePowerSaveBlocker(); |
+} |
+ |
+void PowerApi::SetCreateBlockerFunctionForTesting( |
+ CreateBlockerFunction function) { |
+ create_blocker_function_ = |
+ !function.is_null() ? function |
+ : base::Bind(&content::PowerSaveBlocker::Create); |
+} |
+ |
+void PowerApi::OnExtensionUnloaded(content::BrowserContext* browser_context, |
+ const Extension* extension, |
+ UnloadedExtensionInfo::Reason reason) { |
+ RemoveRequest(extension->id()); |
+ UpdatePowerSaveBlocker(); |
+} |
+ |
+PowerApi::PowerApi(content::BrowserContext* context) |
+ : browser_context_(context), |
+ create_blocker_function_(base::Bind(&content::PowerSaveBlocker::Create)), |
+ current_level_(core_api::power::LEVEL_SYSTEM) { |
+ ExtensionRegistry::Get(browser_context_)->AddObserver(this); |
+} |
+ |
+PowerApi::~PowerApi() { |
+} |
+ |
+void PowerApi::UpdatePowerSaveBlocker() { |
+ if (extension_levels_.empty()) { |
+ power_save_blocker_.reset(); |
+ return; |
+ } |
+ |
+ core_api::power::Level new_level = core_api::power::LEVEL_SYSTEM; |
+ for (ExtensionLevelMap::const_iterator it = extension_levels_.begin(); |
+ it != extension_levels_.end(); ++it) { |
+ if (it->second == core_api::power::LEVEL_DISPLAY) |
+ new_level = it->second; |
+ } |
+ |
+ // If the level changed and we need to create a new blocker, do a swap |
+ // to ensure that there isn't a brief period where power management is |
+ // unblocked. |
+ if (!power_save_blocker_ || new_level != current_level_) { |
+ content::PowerSaveBlocker::PowerSaveBlockerType type = |
+ LevelToPowerSaveBlockerType(new_level); |
+ scoped_ptr<content::PowerSaveBlocker> new_blocker( |
+ create_blocker_function_.Run(type, |
+ content::PowerSaveBlocker::kReasonOther, |
+ kPowerSaveBlockerDescription)); |
+ power_save_blocker_.swap(new_blocker); |
+ current_level_ = new_level; |
+ } |
+} |
+ |
+void PowerApi::Shutdown() { |
+ // Unregister here rather than in the d'tor; otherwise this call will recreate |
+ // the already-deleted ExtensionRegistry. |
+ ExtensionRegistry::Get(browser_context_)->RemoveObserver(this); |
+ power_save_blocker_.reset(); |
+} |
+ |
} // namespace extensions |