1d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// found in the LICENSE file.
4d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "config.h"
6d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "modules/battery/BatteryManager.h"
7d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
8197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/dom/Document.h"
9197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/events/Event.h"
1010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch#include "modules/battery/BatteryDispatcher.h"
11d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "modules/battery/BatteryStatus.h"
1276c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)#include "platform/RuntimeEnabledFeatures.h"
13d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
14c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
15d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
169e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)BatteryManager* BatteryManager::create(ExecutionContext* context)
17d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
189e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    BatteryManager* batteryManager = new BatteryManager(context);
1910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    batteryManager->suspendIfNeeded();
209e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    return batteryManager;
21d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
22d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
23d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)BatteryManager::~BatteryManager()
24d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
255d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    stopUpdating();
26d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
27d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
28d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)BatteryManager::BatteryManager(ExecutionContext* context)
2910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    : ActiveDOMObject(context)
30c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    , PlatformEventController(toDocument(context)->page())
315d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    , m_batteryStatus(BatteryStatus::create())
325d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    , m_state(NotStarted)
33d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
34d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
35d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
365d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)ScriptPromise BatteryManager::startRequest(ScriptState* scriptState)
37d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
385d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    if (m_state == Pending)
395d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        return m_resolver->promise();
4010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
41197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    m_resolver = ScriptPromiseResolver::create(scriptState);
425d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    ScriptPromise promise = m_resolver->promise();
435d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
445d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    if (m_state == Resolved) {
455d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        // FIXME: Consider returning the same promise in this case. See crbug.com/385025.
465d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        m_resolver->resolve(this);
475d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    } else if (m_state == NotStarted) {
485d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        m_state = Pending;
495d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        m_hasEventListener = true;
505d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        startUpdating();
515d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    }
525d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
535d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    return promise;
54d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
55d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
565d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)bool BatteryManager::charging()
57d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
585d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    return m_batteryStatus->charging();
595d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)}
60d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
615d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)double BatteryManager::chargingTime()
625d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles){
635d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    return m_batteryStatus->chargingTime();
64d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
65d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
66d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)double BatteryManager::dischargingTime()
67d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
685d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    return m_batteryStatus->dischargingTime();
69d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
70d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
71d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)double BatteryManager::level()
72d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
735d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    return m_batteryStatus->level();
74d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
75d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
765d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void BatteryManager::didUpdateData()
77d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
78d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(RuntimeEnabledFeatures::batteryStatusEnabled());
795d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    ASSERT(m_state != NotStarted);
80d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
819e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    BatteryStatus* oldStatus = m_batteryStatus;
825d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    m_batteryStatus = BatteryDispatcher::instance().latestData();
83d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
845d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    if (m_state == Pending) {
855d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        ASSERT(m_resolver);
865d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        m_state = Resolved;
875d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        m_resolver->resolve(this);
885d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        return;
895d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    }
9010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
915d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    Document* document = toDocument(executionContext());
925d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    if (document->activeDOMObjectsAreSuspended() || document->activeDOMObjectsAreStopped())
935d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        return;
945d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
955d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    ASSERT(oldStatus);
965d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
975d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    if (m_batteryStatus->charging() != oldStatus->charging())
985d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        dispatchEvent(Event::create(EventTypeNames::chargingchange));
995d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    if (m_batteryStatus->chargingTime() != oldStatus->chargingTime())
1005d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        dispatchEvent(Event::create(EventTypeNames::chargingtimechange));
1015d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    if (m_batteryStatus->dischargingTime() != oldStatus->dischargingTime())
1025d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        dispatchEvent(Event::create(EventTypeNames::dischargingtimechange));
1035d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    if (m_batteryStatus->level() != oldStatus->level())
1045d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        dispatchEvent(Event::create(EventTypeNames::levelchange));
10510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
10610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
1075d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void BatteryManager::registerWithDispatcher()
10810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
1095d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    BatteryDispatcher::instance().addController(this);
11010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
11110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
1125d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void BatteryManager::unregisterWithDispatcher()
11310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
1145d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    BatteryDispatcher::instance().removeController(this);
11510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
11610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
1175d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)bool BatteryManager::hasLastData()
118f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu{
1195d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    return BatteryDispatcher::instance().latestData();
120f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu}
121f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
12210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid BatteryManager::suspend()
12310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
12410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    m_hasEventListener = false;
12510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    stopUpdating();
12610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
12710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
12810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid BatteryManager::resume()
12910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
13010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    m_hasEventListener = true;
13110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    startUpdating();
13210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
13310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
13410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid BatteryManager::stop()
13510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
13610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    m_hasEventListener = false;
137c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    m_state = NotStarted;
13810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    stopUpdating();
13910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
14010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
141c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)bool BatteryManager::hasPendingActivity() const
142c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
143c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    // Prevent V8 from garbage collecting the wrapper object if there are
144c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    // event listeners attached to it.
145c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return m_state == Resolved && hasEventListeners();
146c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
147c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
14876c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)void BatteryManager::trace(Visitor* visitor)
14976c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles){
15076c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    visitor->trace(m_batteryStatus);
15176c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    EventTargetWithInlineData::trace(visitor);
15276c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)}
15376c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)
154c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
155