Index: Source/modules/battery/BatteryManager.cpp |
diff --git a/Source/modules/battery/BatteryManager.cpp b/Source/modules/battery/BatteryManager.cpp |
index 4e6d5a94fa6e329c96e74f6ed5f775a3f46a775a..4eaa7539af1d4f40937a1e1d33484439a3bb6aaf 100644 |
--- a/Source/modules/battery/BatteryManager.cpp |
+++ b/Source/modules/battery/BatteryManager.cpp |
@@ -27,9 +27,28 @@ BatteryManager::BatteryManager(ExecutionContext* context) |
: ActiveDOMObject(context) |
, DeviceEventControllerBase(toDocument(context)->page()) |
, m_batteryStatus(BatteryStatus::create()) |
+ , m_state(NotStarted) |
{ |
- m_hasEventListener = true; |
- startUpdating(); |
+} |
+ |
+ScriptPromise BatteryManager::startRequest(ScriptState* scriptState) |
+{ |
+ if (m_state == Pending) |
+ return m_resolver->promise(); |
+ |
+ m_resolver = ScriptPromiseResolverWithContext::create(scriptState); |
+ ScriptPromise promise = m_resolver->promise(); |
+ |
+ if (m_state == Resolved) { |
+ // FIXME: Consider returning the same promise in this case. See crbug.com/385025. |
+ m_resolver->resolve(this); |
+ } else if (m_state == NotStarted) { |
+ m_state = Pending; |
+ m_hasEventListener = true; |
+ startUpdating(); |
+ } |
+ |
+ return promise; |
} |
bool BatteryManager::charging() |
@@ -55,6 +74,7 @@ double BatteryManager::level() |
void BatteryManager::didUpdateData() |
{ |
ASSERT(RuntimeEnabledFeatures::batteryStatusEnabled()); |
+ ASSERT(m_state != NotStarted); |
RefPtr<BatteryStatus> oldStatus = m_batteryStatus; |
m_batteryStatus = BatteryDispatcher::instance().latestData(); |
@@ -62,6 +82,13 @@ void BatteryManager::didUpdateData() |
// BatteryDispatcher also holds a reference to m_batteryStatus. |
ASSERT(m_batteryStatus->refCount() > 1); |
+ if (m_state == Pending) { |
+ ASSERT(m_resolver); |
+ m_state = Resolved; |
+ m_resolver->resolve(this); |
+ return; |
+ } |
+ |
Document* document = toDocument(executionContext()); |
if (document->activeDOMObjectsAreSuspended() || document->activeDOMObjectsAreStopped()) |
return; |