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