blob: 7be6038a26e2b292c02067a2ccb9ba33c8e96dd1 [file] [log] [blame]
// 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> BatteryManager::create(ExecutionContext* context)
{
RefPtrWillBeRawPtr<BatteryManager> 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<BatteryStatus> 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