Index: Source/core/frame/SuspendableTimer.cpp |
diff --git a/Source/core/frame/SuspendableTimer.cpp b/Source/core/frame/SuspendableTimer.cpp |
index 64f082928ced7822dc69e77401c7c0d37b002ea7..8a9d0485fad87b493ee2d9790b50393e7fa28e1e 100644 |
--- a/Source/core/frame/SuspendableTimer.cpp |
+++ b/Source/core/frame/SuspendableTimer.cpp |
@@ -29,11 +29,15 @@ |
namespace blink { |
+namespace { |
+// The lowest value returned by TimerBase::nextUnalignedFireInterval is 0.0 |
+const double kNextFireIntervalInvalid = -1.0; |
+} |
+ |
SuspendableTimer::SuspendableTimer(ExecutionContext* context) |
: ActiveDOMObject(context) |
- , m_nextFireInterval(0) |
+ , m_nextFireInterval(kNextFireIntervalInvalid) |
, m_repeatInterval(0) |
- , m_active(false) |
#if ENABLE(ASSERT) |
, m_suspended(false) |
#endif |
@@ -51,6 +55,7 @@ bool SuspendableTimer::hasPendingActivity() const |
void SuspendableTimer::stop() |
{ |
+ m_nextFireInterval = kNextFireIntervalInvalid; |
TimerBase::stop(); |
} |
@@ -60,9 +65,9 @@ void SuspendableTimer::suspend() |
ASSERT(!m_suspended); |
m_suspended = true; |
#endif |
- m_active = isActive(); |
- if (m_active) { |
+ if (isActive()) { |
m_nextFireInterval = nextUnalignedFireInterval(); |
+ ASSERT(m_nextFireInterval >= 0.0); |
m_repeatInterval = repeatInterval(); |
TimerBase::stop(); |
} |
@@ -74,9 +79,12 @@ void SuspendableTimer::resume() |
ASSERT(m_suspended); |
m_suspended = false; |
#endif |
- // FIXME: FROM_HERE is wrong here. |
- if (m_active) |
- start(m_nextFireInterval, m_repeatInterval, FROM_HERE); |
+ if (m_nextFireInterval >= 0.0) { |
+ // start() was called before, therefore location() is already set. |
+ // m_nextFireInterval is only set in suspend() if the Timer was active. |
+ start(m_nextFireInterval, m_repeatInterval, location()); |
+ m_nextFireInterval = kNextFireIntervalInvalid; |
+ } |
} |
} // namespace blink |