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 PassRefPtrWillBeRawPtr<BatteryManager> BatteryManager::create(ExecutionContext* context)
18 RefPtrWillBeRawPtr<BatteryManager> batteryManager(adoptRefWillBeRefCountedGarbageCollected(new BatteryManager(context)));
19 batteryManager->suspendIfNeeded();
20 return batteryManager.release();
23 BatteryManager::~BatteryManager()
28 BatteryManager::BatteryManager(ExecutionContext* context)
29 : ActiveDOMObject(context)
30 , PlatformEventController(toDocument(context)->page())
31 , m_batteryStatus(BatteryStatus::create())
34 ScriptWrappable::init(this);
37 ScriptPromise BatteryManager::startRequest(ScriptState* scriptState)
39 if (m_state == Pending)
40 return m_resolver->promise();
42 m_resolver = ScriptPromiseResolver::create(scriptState);
43 ScriptPromise promise = m_resolver->promise();
45 if (m_state == Resolved) {
46 // FIXME: Consider returning the same promise in this case. See crbug.com/385025.
47 m_resolver->resolve(this);
48 } else if (m_state == NotStarted) {
50 m_hasEventListener = true;
57 bool BatteryManager::charging()
59 return m_batteryStatus->charging();
62 double BatteryManager::chargingTime()
64 return m_batteryStatus->chargingTime();
67 double BatteryManager::dischargingTime()
69 return m_batteryStatus->dischargingTime();
72 double BatteryManager::level()
74 return m_batteryStatus->level();
77 void BatteryManager::didUpdateData()
79 ASSERT(RuntimeEnabledFeatures::batteryStatusEnabled());
80 ASSERT(m_state != NotStarted);
82 RefPtrWillBeRawPtr<BatteryStatus> oldStatus = m_batteryStatus;
83 m_batteryStatus = BatteryDispatcher::instance().latestData();
86 // BatteryDispatcher also holds a reference to m_batteryStatus.
87 ASSERT(m_batteryStatus->refCount() > 1);
90 if (m_state == Pending) {
93 m_resolver->resolve(this);
97 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 EventTargetWithInlineData::trace(visitor);