| Index: Source/platform/Timer.h | 
| diff --git a/Source/platform/Timer.h b/Source/platform/Timer.h | 
| index e8015b6d5ca0cc4461b54fde74fad7fd1251f1a4..abab891a6f57406405240015b8042b3930be961b 100644 | 
| --- a/Source/platform/Timer.h | 
| +++ b/Source/platform/Timer.h | 
| @@ -63,44 +63,50 @@ public: | 
| double repeatInterval() const { return m_repeatInterval; } | 
|  | 
| void augmentRepeatInterval(double delta) { | 
| -        setNextFireTime(m_nextFireTime + delta); | 
| m_repeatInterval += delta; | 
| +        setNextFireTime(monotonicallyIncreasingTime(), m_repeatInterval); | 
| } | 
|  | 
| -    void didChangeAlignmentInterval(); | 
| +    void didChangeAlignmentInterval(double now); | 
|  | 
| private: | 
| virtual void fired() = 0; | 
|  | 
| virtual double alignedFireTime(double fireTime) const { return fireTime; } | 
|  | 
| -    void checkConsistency() const; | 
| -    void checkHeapIndex() const; | 
| +    void setNextFireTime(double now, double delay); | 
|  | 
| -    void setNextFireTime(double); | 
| +    void runInternal(); | 
|  | 
| -    bool inHeap() const { return m_heapIndex != -1; } | 
| +    class CancellableTimerTask : public WebThread::Task { | 
| +        WTF_MAKE_NONCOPYABLE(CancellableTimerTask); | 
|  | 
| -    bool hasValidHeapPosition() const; | 
| -    void updateHeapIfNeeded(double oldTime); | 
| +    public: | 
| +        explicit CancellableTimerTask(TimerBase* timer) : m_timer(timer) { } | 
|  | 
| -    void heapDecreaseKey(); | 
| -    void heapDelete(); | 
| -    void heapDeleteMin(); | 
| -    void heapIncreaseKey(); | 
| -    void heapInsert(); | 
| -    void heapPop(); | 
| -    void heapPopMin(); | 
| +        virtual ~CancellableTimerTask() | 
| +        { | 
| +            if (m_timer) | 
| +                m_timer->m_cancellableTimerTask = nullptr; | 
| +        } | 
|  | 
| -    Vector<TimerBase*>& timerHeap() const { ASSERT(m_cachedThreadGlobalTimerHeap); return *m_cachedThreadGlobalTimerHeap; } | 
| +        void run() override; | 
| + | 
| +        void cancel() | 
| +        { | 
| +            m_timer = nullptr; | 
| +        } | 
| + | 
| +    private: | 
| +        TimerBase* m_timer; // NOT OWNED | 
| +    }; | 
|  | 
| double m_nextFireTime; // 0 if inactive | 
| double m_unalignedNextFireTime; // m_nextFireTime not considering alignment interval | 
| double m_repeatInterval; // 0 if not repeating | 
| -    int m_heapIndex; // -1 if not in heap | 
| -    unsigned m_heapInsertionOrder; // Used to keep order among equal-fire-time timers | 
| -    Vector<TimerBase*>* m_cachedThreadGlobalTimerHeap; | 
| WebTraceLocation m_location; | 
| +    CancellableTimerTask* m_cancellableTimerTask; // NOT OWNED | 
| +    WebScheduler* m_webScheduler; // NOT OWNED | 
|  | 
| #if ENABLE(ASSERT) | 
| ThreadIdentifier m_thread; | 
| @@ -157,7 +163,7 @@ private: | 
| inline bool TimerBase::isActive() const | 
| { | 
| ASSERT(m_thread == currentThread()); | 
| -    return m_nextFireTime; | 
| +    return m_cancellableTimerTask; | 
| } | 
|  | 
| } | 
|  |