Index: Source/modules/battery/BatteryManager.cpp |
diff --git a/Source/modules/battery/BatteryManager.cpp b/Source/modules/battery/BatteryManager.cpp |
index 4e6d5a94fa6e329c96e74f6ed5f775a3f46a775a..577ddc0e713f4ffc3956e9e936b124443c5b5001 100644 |
--- a/Source/modules/battery/BatteryManager.cpp |
+++ b/Source/modules/battery/BatteryManager.cpp |
@@ -18,6 +18,29 @@ PassRefPtrWillBeRawPtr<BatteryManager> BatteryManager::create(ExecutionContext* |
return batteryManager.release(); |
} |
+class BatteryManager::ThenFunction FINAL : public ScriptFunction { |
+public: |
+ static PassOwnPtr<ScriptFunction> create(PassRefPtr<BatteryManager> observer) |
+ { |
+ ExecutionContext* executionContext = observer->executionContext(); |
+ return adoptPtr(new ThenFunction(toIsolate(executionContext), observer)); |
+ } |
+private: |
+ ThenFunction(v8::Isolate* isolate, PassRefPtr<BatteryManager> observer) |
+ : ScriptFunction(isolate) |
+ , m_observer(observer) |
+ { |
+ } |
+ |
+ virtual ScriptValue call(ScriptValue value) OVERRIDE |
+ { |
+ m_observer->onPromiseResolved(); |
+ return value; |
+ } |
+ |
+ RefPtr<BatteryManager> m_observer; |
+}; |
+ |
BatteryManager::~BatteryManager() |
{ |
stopUpdating(); |
@@ -27,9 +50,34 @@ BatteryManager::BatteryManager(ExecutionContext* context) |
: ActiveDOMObject(context) |
, DeviceEventControllerBase(toDocument(context)->page()) |
, m_batteryStatus(BatteryStatus::create()) |
+ , m_state(NotStarted) |
+{ |
+} |
+ |
+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) { |
+ m_resolver->resolve(this); |
+ return promise; |
+ } |
abarth-chromium
2014/06/11 19:44:34
Why not just return m_resolver->promise(); at this
timvolodine
2014/06/12 16:38:45
slightly refactored this code. Done.
|
+ |
+ m_state = Pending; |
m_hasEventListener = true; |
+ promise.then(ThenFunction::create(this)); |
abarth-chromium
2014/06/11 19:44:34
Why do we need to create a ThenFunction instead of
timvolodine
2014/06/12 16:38:45
yeah on second thought the "ThenFunction" seems li
|
startUpdating(); |
+ return promise; |
+} |
+ |
+void BatteryManager::onPromiseResolved() |
+{ |
+ ASSERT(m_state == Pending); |
+ m_state = Resolved; |
} |
bool BatteryManager::charging() |
@@ -55,6 +103,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 +111,12 @@ void BatteryManager::didUpdateData() |
// BatteryDispatcher also holds a reference to m_batteryStatus. |
ASSERT(m_batteryStatus->refCount() > 1); |
+ if (m_state == Pending && m_resolver) { |
+ ASSERT(m_resolver); |
+ m_resolver->resolve(this); |
+ return; |
+ } |
+ |
Document* document = toDocument(executionContext()); |
if (document->activeDOMObjectsAreSuspended() || document->activeDOMObjectsAreStopped()) |
return; |