// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "config.h" #include "modules/battery/BatteryManager.h" #include "modules/battery/BatteryDispatcher.h" #include "modules/battery/BatteryStatus.h" #include "platform/RuntimeEnabledFeatures.h" namespace WebCore { PassRefPtrWillBeRawPtr BatteryManager::create(ExecutionContext* context) { RefPtrWillBeRawPtr batteryManager(adoptRefWillBeRefCountedGarbageCollected(new BatteryManager(context))); batteryManager->suspendIfNeeded(); return batteryManager.release(); } BatteryManager::~BatteryManager() { stopUpdating(); } BatteryManager::BatteryManager(ExecutionContext* context) : ActiveDOMObject(context) , DeviceEventControllerBase(toDocument(context)->page()) , m_batteryStatus(BatteryStatus::create()) , m_state(NotStarted) { } ScriptPromise BatteryManager::startRequest(ScriptState* scriptState) { if (m_state == Pending) return m_resolver->promise(); m_resolver = ScriptPromiseResolverWithContext::create(scriptState); ScriptPromise promise = m_resolver->promise(); if (m_state == Resolved) { // FIXME: Consider returning the same promise in this case. See crbug.com/385025. m_resolver->resolve(this); } else if (m_state == NotStarted) { m_state = Pending; m_hasEventListener = true; startUpdating(); } return promise; } bool BatteryManager::charging() { return m_batteryStatus->charging(); } double BatteryManager::chargingTime() { return m_batteryStatus->chargingTime(); } double BatteryManager::dischargingTime() { return m_batteryStatus->dischargingTime(); } double BatteryManager::level() { return m_batteryStatus->level(); } void BatteryManager::didUpdateData() { ASSERT(RuntimeEnabledFeatures::batteryStatusEnabled()); ASSERT(m_state != NotStarted); RefPtrWillBeRawPtr oldStatus = m_batteryStatus; m_batteryStatus = BatteryDispatcher::instance().latestData(); #if !ENABLE(OILPAN) // BatteryDispatcher also holds a reference to m_batteryStatus. ASSERT(m_batteryStatus->refCount() > 1); #endif if (m_state == Pending) { ASSERT(m_resolver); m_state = Resolved; m_resolver->resolve(this); return; } Document* document = toDocument(executionContext()); if (document->activeDOMObjectsAreSuspended() || document->activeDOMObjectsAreStopped()) return; ASSERT(oldStatus); if (m_batteryStatus->charging() != oldStatus->charging()) dispatchEvent(Event::create(EventTypeNames::chargingchange)); if (m_batteryStatus->chargingTime() != oldStatus->chargingTime()) dispatchEvent(Event::create(EventTypeNames::chargingtimechange)); if (m_batteryStatus->dischargingTime() != oldStatus->dischargingTime()) dispatchEvent(Event::create(EventTypeNames::dischargingtimechange)); if (m_batteryStatus->level() != oldStatus->level()) dispatchEvent(Event::create(EventTypeNames::levelchange)); } void BatteryManager::registerWithDispatcher() { BatteryDispatcher::instance().addController(this); } void BatteryManager::unregisterWithDispatcher() { BatteryDispatcher::instance().removeController(this); } bool BatteryManager::hasLastData() { return BatteryDispatcher::instance().latestData(); } void BatteryManager::suspend() { m_hasEventListener = false; stopUpdating(); } void BatteryManager::resume() { m_hasEventListener = true; startUpdating(); } void BatteryManager::stop() { m_hasEventListener = false; stopUpdating(); } void BatteryManager::trace(Visitor* visitor) { visitor->trace(m_batteryStatus); EventTargetWithInlineData::trace(visitor); } } // namespace WebCore