SuspendableTimer.cpp [plain text]
#include "config.h"
#include "SuspendableTimer.h"
#include "ScriptExecutionContext.h"
namespace WebCore {
SuspendableTimer::SuspendableTimer(ScriptExecutionContext& context)
: ActiveDOMObject(&context)
{
}
SuspendableTimer::~SuspendableTimer()
{
}
bool SuspendableTimer::hasPendingActivity() const
{
return isActive();
}
void SuspendableTimer::stop()
{
if (!m_suspended)
TimerBase::stop();
m_suspended = true;
m_savedIsActive = false;
didStop();
}
void SuspendableTimer::suspend(ReasonForSuspension)
{
ASSERT(!m_suspended);
m_suspended = true;
m_savedIsActive = TimerBase::isActive();
if (m_savedIsActive) {
m_savedNextFireInterval = TimerBase::nextUnalignedFireInterval();
m_savedRepeatInterval = TimerBase::repeatInterval();
TimerBase::stop();
}
}
void SuspendableTimer::resume()
{
ASSERT(m_suspended);
m_suspended = false;
if (m_savedIsActive)
start(m_savedNextFireInterval, m_savedRepeatInterval);
}
bool SuspendableTimer::canSuspendForDocumentSuspension() const
{
return true;
}
void SuspendableTimer::didStop()
{
}
void SuspendableTimer::cancel()
{
if (!m_suspended)
TimerBase::stop();
else
m_suspended = false;
}
void SuspendableTimer::startRepeating(Seconds repeatInterval)
{
if (!m_suspended)
TimerBase::startRepeating(repeatInterval);
else {
m_savedIsActive = true;
m_savedNextFireInterval = repeatInterval;
m_savedRepeatInterval = repeatInterval;
}
}
void SuspendableTimer::startOneShot(Seconds interval)
{
if (!m_suspended)
TimerBase::startOneShot(interval);
else {
m_savedIsActive = true;
m_savedNextFireInterval = interval;
m_savedRepeatInterval = 0_s;
}
}
Seconds SuspendableTimer::repeatInterval() const
{
if (!m_suspended)
return TimerBase::repeatInterval();
if (m_savedIsActive)
return m_savedRepeatInterval;
return 0_s;
}
void SuspendableTimer::augmentFireInterval(Seconds delta)
{
if (!m_suspended)
TimerBase::augmentFireInterval(delta);
else if (m_savedIsActive) {
m_savedNextFireInterval += delta;
} else {
m_savedIsActive = true;
m_savedNextFireInterval = delta;
m_savedRepeatInterval = 0_s;
}
}
void SuspendableTimer::augmentRepeatInterval(Seconds delta)
{
if (!m_suspended)
TimerBase::augmentRepeatInterval(delta);
else if (m_savedIsActive) {
m_savedNextFireInterval += delta;
m_savedRepeatInterval += delta;
} else {
m_savedIsActive = true;
m_savedNextFireInterval = delta;
m_savedRepeatInterval = delta;
}
}
}