Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1185)

Unified Diff: Source/modules/battery/BatteryManager.cpp

Issue 329723005: Battery Status API: blink promise implementation and layout tests. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: fix fast/dom/Window/property-access-on-cached* tests. Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;

Powered by Google App Engine
This is Rietveld 408576698