#include "config.h"
#include "PageThrottler.h"
#include "Page.h"
namespace WebCore {
static const double PageLoadHysteresisSeconds = 10;
PageThrottler::PageThrottler(Page& page)
: m_page(page)
, m_userInputHysteresis([this](HysteresisState state) { setActivityFlag(PageActivityState::UserInputActivity, state == HysteresisState::Started); })
, m_mediaActivityHysteresis([this](HysteresisState state) { setActivityFlag(PageActivityState::MediaActivity, state == HysteresisState::Started); })
, m_pageLoadActivityHysteresis([this](HysteresisState state) { setActivityFlag(PageActivityState::PageLoadActivity, state == HysteresisState::Started); }, PageLoadHysteresisSeconds)
, m_mediaActivityCounter([this](RefCounterEvent) { mediaActivityCounterChanged(); })
, m_pageLoadActivityCounter([this](RefCounterEvent) { pageLoadActivityCounterChanged(); })
{
}
PageActivityAssertionToken PageThrottler::mediaActivityToken()
{
return m_mediaActivityCounter.count();
}
PageActivityAssertionToken PageThrottler::pageLoadActivityToken()
{
return m_pageLoadActivityCounter.count();
}
void PageThrottler::mediaActivityCounterChanged()
{
if (m_mediaActivityCounter.value())
m_mediaActivityHysteresis.start();
else
m_mediaActivityHysteresis.stop();
}
void PageThrottler::pageLoadActivityCounterChanged()
{
if (m_pageLoadActivityCounter.value())
m_pageLoadActivityHysteresis.start();
else
m_pageLoadActivityHysteresis.stop();
}
void PageThrottler::setActivityFlag(PageActivityState::Flags flag, bool value)
{
PageActivityState::Flags activityState = m_activityState;
if (value)
activityState |= flag;
else
activityState &= ~flag;
if (m_activityState == activityState)
return;
m_activityState = activityState;
m_page.setPageActivityState(m_activityState);
}
}