diff options
Diffstat (limited to 'Source/WebKit2/UIProcess/ResponsivenessTimer.cpp')
-rw-r--r-- | Source/WebKit2/UIProcess/ResponsivenessTimer.cpp | 33 |
1 files changed, 24 insertions, 9 deletions
diff --git a/Source/WebKit2/UIProcess/ResponsivenessTimer.cpp b/Source/WebKit2/UIProcess/ResponsivenessTimer.cpp index 9739fa3a1..feb469f08 100644 --- a/Source/WebKit2/UIProcess/ResponsivenessTimer.cpp +++ b/Source/WebKit2/UIProcess/ResponsivenessTimer.cpp @@ -30,7 +30,7 @@ namespace WebKit { static const double responsivenessTimeout = 3; -ResponsivenessTimer::ResponsivenessTimer(ResponsivenessTimer::Client* client) +ResponsivenessTimer::ResponsivenessTimer(ResponsivenessTimer::Client& client) : m_client(client) , m_isResponsive(true) , m_timer(RunLoop::main(), this, &ResponsivenessTimer::timerFired) @@ -49,13 +49,19 @@ void ResponsivenessTimer::invalidate() void ResponsivenessTimer::timerFired() { - if (m_isResponsive) { - m_isResponsive = false; - m_client->didBecomeUnresponsive(this); - } else { - // The timer fired while unresponsive. - m_client->interactionOccurredWhileUnresponsive(this); + if (!m_isResponsive) + return; + + if (!m_client.mayBecomeUnresponsive()) { + m_timer.startOneShot(responsivenessTimeout); + return; } + + m_client.willChangeIsResponsive(); + m_isResponsive = false; + m_client.didChangeIsResponsive(); + + m_client.didBecomeUnresponsive(); } void ResponsivenessTimer::start() @@ -69,12 +75,21 @@ void ResponsivenessTimer::start() void ResponsivenessTimer::stop() { if (!m_isResponsive) { - // We got a life sign from the web process! - m_client->didBecomeResponsive(this); + // We got a life sign from the web process. + m_client.willChangeIsResponsive(); m_isResponsive = true; + m_client.didChangeIsResponsive(); + + m_client.didBecomeResponsive(); } m_timer.stop(); } +void ResponsivenessTimer::processTerminated() +{ + // Since there is no web process, we must not be waiting for it anymore. + stop(); +} + } // namespace WebKit |