blob: ad0017b2550ca0491afa7e2cb66e7b1538170c66 [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 "modules/battery/BatteryManager.h"
#include "core/dom/DOMException.h"
#include "core/dom/Document.h"
#include "core/events/Event.h"
#include "modules/battery/BatteryDispatcher.h"
#include "wtf/Assertions.h"
namespace blink {
BatteryManager* BatteryManager::create(ExecutionContext* context)
{
BatteryManager* batteryManager = new BatteryManager(context);
batteryManager->suspendIfNeeded();
return batteryManager;
}
BatteryManager::~BatteryManager()
{
}
BatteryManager::BatteryManager(ExecutionContext* context)
: ActiveScriptWrappable(this)
, ActiveDOMObject(context)
, PlatformEventController(toDocument(context)->page())
{
}
ScriptPromise BatteryManager::startRequest(ScriptState* scriptState)
{
if (!m_batteryProperty) {
m_batteryProperty = new BatteryProperty(scriptState->getExecutionContext(), this, BatteryProperty::Ready);
// If the context is in a stopped state already, do not start updating.
if (!getExecutionContext() || getExecutionContext()->activeDOMObjectsAreStopped()) {
m_batteryProperty->resolve(this);
} else {
m_hasEventListener = true;
startUpdating();
}
}
return m_batteryProperty->promise(scriptState->world());
}
bool BatteryManager::charging()
{
return m_batteryStatus.charging();
}
double BatteryManager::chargingTime()
{
return m_batteryStatus.charging_time();
}
double BatteryManager::dischargingTime()
{
return m_batteryStatus.discharging_time();
}
double BatteryManager::level()
{
return m_batteryStatus.level();
}
void BatteryManager::didUpdateData()
{
DCHECK(m_batteryProperty);
BatteryStatus oldStatus = m_batteryStatus;
m_batteryStatus = *BatteryDispatcher::instance().latestData();
if (m_batteryProperty->getState() == ScriptPromisePropertyBase::Pending) {
m_batteryProperty->resolve(this);
return;
}
Document* document = toDocument(getExecutionContext());
DCHECK(document);
if (document->activeDOMObjectsAreSuspended() || document->activeDOMObjectsAreStopped())
return;
if (m_batteryStatus.charging() != oldStatus.charging())
dispatchEvent(Event::create(EventTypeNames::chargingchange));
if (m_batteryStatus.charging_time() != oldStatus.charging_time())
dispatchEvent(Event::create(EventTypeNames::chargingtimechange));
if (m_batteryStatus.discharging_time() != oldStatus.discharging_time())
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;
m_batteryProperty.clear();
stopUpdating();
}
bool BatteryManager::hasPendingActivity() const
{
// Prevent V8 from garbage collecting the wrapper object if there are
// event listeners attached to it.
return hasEventListeners();
}
DEFINE_TRACE(BatteryManager)
{
visitor->trace(m_batteryProperty);
PlatformEventController::trace(visitor);
EventTargetWithInlineData::trace(visitor);
ActiveDOMObject::trace(visitor);
}
} // namespace blink