// Copyright 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CCSchedulerTestCommon_h #define CCSchedulerTestCommon_h #include "CCDelayBasedTimeSource.h" #include "CCFrameRateController.h" #include "CCThread.h" #include #include namespace WebKitTests { class FakeCCTimeSourceClient : public WebCore::CCTimeSourceClient { public: FakeCCTimeSourceClient() { reset(); } void reset() { m_tickCalled = false; } bool tickCalled() const { return m_tickCalled; } virtual void onTimerTick() OVERRIDE { m_tickCalled = true; } protected: bool m_tickCalled; }; class FakeCCThread : public WebCore::CCThread { public: FakeCCThread() { reset(); } void reset() { m_pendingTaskDelay = 0; m_pendingTask.clear(); m_runPendingTaskOnOverwrite = false; } void runPendingTaskOnOverwrite(bool enable) { m_runPendingTaskOnOverwrite = enable; } bool hasPendingTask() const { return m_pendingTask; } void runPendingTask() { ASSERT(m_pendingTask); OwnPtr task = m_pendingTask.release(); task->performTask(); } long long pendingDelayMs() const { EXPECT_TRUE(hasPendingTask()); return m_pendingTaskDelay; } virtual void postTask(PassOwnPtr) { ASSERT_NOT_REACHED(); } virtual void postDelayedTask(PassOwnPtr task, long long delay) { if (m_runPendingTaskOnOverwrite && hasPendingTask()) runPendingTask(); EXPECT_TRUE(!hasPendingTask()); m_pendingTask = task; m_pendingTaskDelay = delay; } virtual WTF::ThreadIdentifier threadID() const { return 0; } protected: OwnPtr m_pendingTask; long long m_pendingTaskDelay; bool m_runPendingTaskOnOverwrite; }; class FakeCCTimeSource : public WebCore::CCTimeSource { public: FakeCCTimeSource() : m_active(false) , m_nextTickTime(0) , m_client(0) { } virtual ~FakeCCTimeSource() { } virtual void setClient(WebCore::CCTimeSourceClient* client) OVERRIDE { m_client = client; } virtual void setActive(bool b) OVERRIDE { m_active = b; } virtual bool active() const OVERRIDE { return m_active; } virtual void setTimebaseAndInterval(double timebase, double interval) OVERRIDE { } virtual double lastTickTime() OVERRIDE { return 0; } virtual double nextTickTimeIfActivated() OVERRIDE { return 0; } void tick() { ASSERT(m_active); if (m_client) m_client->onTimerTick(); } void setNextTickTime(double nextTickTime) { m_nextTickTime = nextTickTime; } protected: bool m_active; double m_nextTickTime; WebCore::CCTimeSourceClient* m_client; }; class FakeCCDelayBasedTimeSource : public WebCore::CCDelayBasedTimeSource { public: static PassRefPtr create(double interval, WebCore::CCThread* thread) { return adoptRef(new FakeCCDelayBasedTimeSource(interval, thread)); } void setMonotonicTimeNow(double time) { m_monotonicTimeNow = time; } virtual double monotonicTimeNow() const OVERRIDE { return m_monotonicTimeNow; } protected: FakeCCDelayBasedTimeSource(double interval, WebCore::CCThread* thread) : CCDelayBasedTimeSource(interval, thread) , m_monotonicTimeNow(0) { } double m_monotonicTimeNow; }; class FakeCCFrameRateController : public WebCore::CCFrameRateController { public: FakeCCFrameRateController(PassRefPtr timer) : WebCore::CCFrameRateController(timer) { } int numFramesPending() const { return m_numFramesPending; } }; } #endif // CCSchedulerTestCommon_h