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()
28 BatteryManager::BatteryManager(ExecutionContext* context)
29 : ActiveDOMObject(context)
30 , PlatformEventController(toDocument(context)->page())
31 , m_batteryStatus(BatteryStatus::create())
36 ScriptPromise BatteryManager::startRequest(ScriptState* scriptState)
38 if (m_state == Pending)
39 return m_resolver->promise();
41 m_resolver = ScriptPromiseResolver::create(scriptState);
42 ScriptPromise promise = m_resolver->promise();
44 if (m_state == Resolved) {
45 // FIXME: Consider returning the same promise in this case. See crbug.com/385025.
46 m_resolver->resolve(this);
47 } else if (m_state == NotStarted) {
49 m_hasEventListener = true;
56 bool BatteryManager::charging()
58 return m_batteryStatus->charging();
61 double BatteryManager::chargingTime()
63 return m_batteryStatus->chargingTime();
66 double BatteryManager::dischargingTime()
68 return m_batteryStatus->dischargingTime();
71 double BatteryManager::level()
73 return m_batteryStatus->level();
76 void BatteryManager::didUpdateData()
78 ASSERT(RuntimeEnabledFeatures::batteryStatusEnabled());
79 ASSERT(m_state != NotStarted);
81 BatteryStatus* oldStatus = m_batteryStatus;
82 m_batteryStatus = BatteryDispatcher::instance().latestData();
84 if (m_state == Pending) {
87 m_resolver->resolve(this);
91 Document* document = toDocument(executionContext());
92 if (document->activeDOMObjectsAreSuspended() || document->activeDOMObjectsAreStopped())
97 if (m_batteryStatus->charging() != oldStatus->charging())
98 dispatchEvent(Event::create(EventTypeNames::chargingchange));
99 if (m_batteryStatus->chargingTime() != oldStatus->chargingTime())
100 dispatchEvent(Event::create(EventTypeNames::chargingtimechange));
101 if (m_batteryStatus->dischargingTime() != oldStatus->dischargingTime())
102 dispatchEvent(Event::create(EventTypeNames::dischargingtimechange));
103 if (m_batteryStatus->level() != oldStatus->level())
104 dispatchEvent(Event::create(EventTypeNames::levelchange));
107 void BatteryManager::registerWithDispatcher()
109 BatteryDispatcher::instance().addController(this);
112 void BatteryManager::unregisterWithDispatcher()
114 BatteryDispatcher::instance().removeController(this);
117 bool BatteryManager::hasLastData()
119 return BatteryDispatcher::instance().latestData();
122 void BatteryManager::suspend()
124 m_hasEventListener = false;
128 void BatteryManager::resume()
130 m_hasEventListener = true;
134 void BatteryManager::stop()
136 m_hasEventListener = false;
137 m_state = NotStarted;
141 bool BatteryManager::hasPendingActivity() const
143 // Prevent V8 from garbage collecting the wrapper object if there are
144 // event listeners attached to it.
145 return m_state == Resolved && hasEventListeners();
148 void BatteryManager::trace(Visitor* visitor)
150 visitor->trace(m_batteryStatus);
151 EventTargetWithInlineData::trace(visitor);