Chromium Code Reviews| 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; |