blob: 4c92f17a9701ce65c865b36a1b92f686c390a887 [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 "core/dom/Document.h"
#include "core/events/Event.h"
#include "modules/battery/BatteryDispatcher.h"
#include "modules/battery/BatteryStatus.h"
namespace blink {
BatteryManager* BatteryManager::create(ExecutionContext* context)
{
BatteryManager* batteryManager = new BatteryManager(context);
batteryManager->suspendIfNeeded();
return batteryManager;
}
BatteryManager::~BatteryManager()
{
#if !ENABLE(OILPAN)
stopUpdating();
#endif
}
BatteryManager::BatteryManager(ExecutionContext* context)
: ActiveDOMObject(context)
, PlatformEventController(toDocument(context)->page())
, m_batteryStatus(BatteryStatus::create())
{
}
ScriptPromise BatteryManager::startRequest(ScriptState* scriptState)
{
if (!m_batteryProperty) {
m_batteryProperty = new BatteryProperty(scriptState->executionContext(), this, BatteryProperty::Ready);
// If the context is in a stopped state already, do not start updating.
if (!executionContext() || executionContext()->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->chargingTime();
}
double BatteryManager::dischargingTime()
{
return m_batteryStatus->dischargingTime();
}
double BatteryManager::level()
{
return m_batteryStatus->level();
}
void BatteryManager::didUpdateData()
{
ASSERT(m_batteryProperty);
BatteryStatus* oldStatus = m_batteryStatus;
m_batteryStatus = BatteryDispatcher::instance().latestData();
if (m_batteryProperty->state() == ScriptPromisePropertyBase::Pending) {
m_batteryProperty->resolve(this);
return;
}
Document* document = toDocument(executionContext());
ASSERT(document);
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;
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);
visitor->trace(m_batteryStatus);
PlatformEventController::trace(visitor);
RefCountedGarbageCollectedEventTargetWithInlineData<BatteryManager>::trace(visitor);
ActiveDOMObject::trace(visitor);
}
} // namespace blink