SuspendableTimer.cpp [plain text]
#include "config.h"
#include "SuspendableTimer.h"
#include "ScriptExecutionContext.h"
namespace WebCore {
SuspendableTimerBase::SuspendableTimerBase(ScriptExecutionContext* context)
: ActiveDOMObject(context)
{
}
SuspendableTimerBase::~SuspendableTimerBase() = default;
bool SuspendableTimerBase::virtualHasPendingActivity() const
{
return isActive();
}
void SuspendableTimerBase::stop()
{
if (!m_suspended)
TimerBase::stop();
m_suspended = true;
m_savedIsActive = false;
didStop();
}
void SuspendableTimerBase::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 SuspendableTimerBase::resume()
{
ASSERT(m_suspended);
m_suspended = false;
if (m_savedIsActive)
start(m_savedNextFireInterval, m_savedRepeatInterval);
}
void SuspendableTimerBase::didStop()
{
}
void SuspendableTimerBase::cancel()
{
if (!m_suspended)
TimerBase::stop();
else
m_suspended = false;
}
void SuspendableTimerBase::startRepeating(Seconds repeatInterval)
{
if (!m_suspended)
TimerBase::startRepeating(repeatInterval);
else {
m_savedIsActive = true;
m_savedNextFireInterval = repeatInterval;
m_savedRepeatInterval = repeatInterval;
}
}
void SuspendableTimerBase::startOneShot(Seconds interval)
{
if (!m_suspended)
TimerBase::startOneShot(interval);
else {
m_savedIsActive = true;
m_savedNextFireInterval = interval;
m_savedRepeatInterval = 0_s;
}
}
Seconds SuspendableTimerBase::repeatInterval() const
{
if (!m_suspended)
return TimerBase::repeatInterval();
if (m_savedIsActive)
return m_savedRepeatInterval;
return 0_s;
}
void SuspendableTimerBase::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 SuspendableTimerBase::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;
}
}
const char* SuspendableTimer::activeDOMObjectName() const
{
return "SuspendableTimer";
}
}