1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
6 #include "modules/battery/BatteryManager.h"
8 #include "core/dom/Document.h"
9 #include "core/events/Event.h"
10 #include "modules/battery/BatteryDispatcher.h"
11 #include "modules/battery/BatteryStatus.h"
12 #include "platform/RuntimeEnabledFeatures.h"
16 BatteryManager* BatteryManager::create(ExecutionContext* context)
18 BatteryManager* batteryManager = new BatteryManager(context);
19 batteryManager->suspendIfNeeded();
20 return batteryManager;
23 BatteryManager::~BatteryManager()
30 BatteryManager::BatteryManager(ExecutionContext* context)
31 : ActiveDOMObject(context)
32 , PlatformEventController(toDocument(context)->page())
33 , m_batteryStatus(BatteryStatus::create())
38 ScriptPromise BatteryManager::startRequest(ScriptState* scriptState)
40 if (m_state == Pending)
41 return m_resolver->promise();
43 m_resolver = ScriptPromiseResolver::create(scriptState);
44 ScriptPromise promise = m_resolver->promise();
46 ASSERT(executionContext());
47 // If the context is in a stopped state already, do not start updating.
48 if (m_state == Resolved || executionContext()->activeDOMObjectsAreStopped()) {
49 // FIXME: Consider returning the same promise in this case. See crbug.com/385025.
51 m_resolver->resolve(this);
52 } else if (m_state == NotStarted) {
54 m_hasEventListener = true;
61 bool BatteryManager::charging()
63 return m_batteryStatus->charging();
66 double BatteryManager::chargingTime()
68 return m_batteryStatus->chargingTime();
71 double BatteryManager::dischargingTime()
73 return m_batteryStatus->dischargingTime();
76 double BatteryManager::level()
78 return m_batteryStatus->level();
81 void BatteryManager::didUpdateData()
83 ASSERT(RuntimeEnabledFeatures::batteryStatusEnabled());
84 ASSERT(m_state != NotStarted);
86 BatteryStatus* oldStatus = m_batteryStatus;
87 m_batteryStatus = BatteryDispatcher::instance().latestData();
89 if (m_state == Pending) {
92 m_resolver->resolve(this);
96 Document* document = toDocument(executionContext());
98 if (document->activeDOMObjectsAreSuspended() || document->activeDOMObjectsAreStopped())
103 if (m_batteryStatus->charging() != oldStatus->charging())
104 dispatchEvent(Event::create(EventTypeNames::chargingchange));
105 if (m_batteryStatus->chargingTime() != oldStatus->chargingTime())
106 dispatchEvent(Event::create(EventTypeNames::chargingtimechange));
107 if (m_batteryStatus->dischargingTime() != oldStatus->dischargingTime())
108 dispatchEvent(Event::create(EventTypeNames::dischargingtimechange));
109 if (m_batteryStatus->level() != oldStatus->level())
110 dispatchEvent(Event::create(EventTypeNames::levelchange));
113 void BatteryManager::registerWithDispatcher()
115 BatteryDispatcher::instance().addController(this);
118 void BatteryManager::unregisterWithDispatcher()
120 BatteryDispatcher::instance().removeController(this);
123 bool BatteryManager::hasLastData()
125 return BatteryDispatcher::instance().latestData();
128 void BatteryManager::suspend()
130 m_hasEventListener = false;
134 void BatteryManager::resume()
136 m_hasEventListener = true;
140 void BatteryManager::stop()
142 m_hasEventListener = false;
143 m_state = NotStarted;
147 bool BatteryManager::hasPendingActivity() const
149 // Prevent V8 from garbage collecting the wrapper object if there are
150 // event listeners attached to it.
151 return m_state == Resolved && hasEventListeners();
154 void BatteryManager::trace(Visitor* visitor)
156 visitor->trace(m_batteryStatus);
157 PlatformEventController::trace(visitor);
158 EventTargetWithInlineData::trace(visitor);