Index: Source/platform/graphics/RecordingImageBufferSurfaceTest.cpp |
diff --git a/Source/platform/graphics/RecordingImageBufferSurfaceTest.cpp b/Source/platform/graphics/RecordingImageBufferSurfaceTest.cpp |
index ca7a88880d15b7deb823a09f662fcf56644e7208..738ee070a19ce71368bb318bc666f0a811acab8b 100644 |
--- a/Source/platform/graphics/RecordingImageBufferSurfaceTest.cpp |
+++ b/Source/platform/graphics/RecordingImageBufferSurfaceTest.cpp |
@@ -8,6 +8,8 @@ |
#include "platform/graphics/GraphicsContext.h" |
#include "platform/graphics/ImageBuffer.h" |
+#include "public/platform/Platform.h" |
+#include "public/platform/WebThread.h" |
#include "third_party/skia/include/core/SkCanvas.h" |
#include "third_party/skia/include/core/SkPictureRecorder.h" |
#include "wtf/OwnPtr.h" |
@@ -31,6 +33,7 @@ protected: |
m_imageBuffer = ImageBuffer::create(testSurface.release()); |
} |
+public: |
void testEmptyPicture() |
{ |
m_testSurface->initializeCurrentFrame(); |
@@ -60,23 +63,42 @@ protected: |
{ |
m_testSurface->initializeCurrentFrame(); |
m_testSurface->getPicture(); |
- m_testSurface->willUse(); |
+ m_testSurface->didDraw(); |
expectDisplayListEnabled(true); |
// This will trigger fallback |
m_testSurface->getPicture(); |
expectDisplayListEnabled(false); |
} |
+ void testFrameFinalizedByTaskObserver1() |
+ { |
+ m_testSurface->initializeCurrentFrame(); |
+ expectDisplayListEnabled(true); |
+ m_testSurface->getPicture(); |
+ expectDisplayListEnabled(true); |
+ m_testSurface->didDraw(); |
+ expectDisplayListEnabled(true); |
+ // Display list will be disabled only after exiting the runLoop |
+ } |
+ void testFrameFinalizedByTaskObserver2() |
+ { |
+ expectDisplayListEnabled(false); |
+ m_testSurface->getPicture(); |
+ expectDisplayListEnabled(false); |
+ m_testSurface->didDraw(); |
+ expectDisplayListEnabled(false); |
+ } |
+ |
void testAnimatedWithClear() |
{ |
m_testSurface->initializeCurrentFrame(); |
m_testSurface->getPicture(); |
m_testSurface->didClearCanvas(); |
- m_testSurface->willUse(); |
+ m_testSurface->didDraw(); |
m_testSurface->getPicture(); |
expectDisplayListEnabled(true); |
// clear after use |
- m_testSurface->willUse(); |
+ m_testSurface->didDraw(); |
m_testSurface->didClearCanvas(); |
m_testSurface->getPicture(); |
expectDisplayListEnabled(true); |
@@ -87,23 +109,123 @@ protected: |
m_testSurface->initializeCurrentFrame(); |
m_testSurface->getPicture(); |
m_imageBuffer->context()->clearRect(FloatRect(FloatPoint(0, 0), FloatSize(m_testSurface->size()))); |
- m_testSurface->willUse(); |
+ m_testSurface->didDraw(); |
m_testSurface->getPicture(); |
expectDisplayListEnabled(true); |
} |
-private: |
+ |
void expectDisplayListEnabled(bool displayListEnabled) |
{ |
EXPECT_EQ(displayListEnabled, (bool)m_testSurface->m_currentFrame.get()); |
EXPECT_EQ(!displayListEnabled, (bool)m_testSurface->m_rasterCanvas.get()); |
} |
+private: |
RecordingImageBufferSurface* m_testSurface; |
OwnPtr<ImageBuffer> m_imageBuffer; |
}; |
namespace { |
+// The following test helper class installs a mock platform that provides a mock WebThread |
+// for the current thread. The Mock thread is capable of queuing a single non-delyaed task |
Stephen White
2014/07/29 18:38:55
Nit: non-delayed
|
+// and registering a single task observer. The run loop exits immediately after running |
+// the single task. |
+class AutoInstallCurrentThreadPlatformMock { |
+public: |
+ AutoInstallCurrentThreadPlatformMock() |
+ { |
+ m_oldPlatform = blink::Platform::current(); |
+ blink::Platform::initialize(&m_mockPlatform); |
+ } |
+ |
+ ~AutoInstallCurrentThreadPlatformMock() |
+ { |
+ blink::Platform::initialize(m_oldPlatform); |
+ } |
+ |
+private: |
+ class CurrentThreadMock : public WebThread { |
+ public: |
+ CurrentThreadMock() : m_taskObserver(0), m_task(0) { } |
+ |
+ virtual ~CurrentThreadMock() |
+ { |
+ EXPECT_EQ((Task*)0, m_task); |
+ } |
+ |
+ virtual void postTask(Task* task) |
+ { |
+ EXPECT_EQ((Task*)0, m_task); |
+ m_task = task; |
+ } |
+ |
+ virtual void postDelayedTask(Task*, long long delayMs) OVERRIDE { ASSERT_NOT_REACHED(); }; |
+ |
+ virtual bool isCurrentThread() const OVERRIDE { return true; } |
+ |
+ virtual void addTaskObserver(TaskObserver* taskObserver) OVERRIDE |
+ { |
+ EXPECT_EQ((TaskObserver*)0, m_taskObserver); |
+ m_taskObserver = taskObserver; |
+ } |
+ |
+ virtual void removeTaskObserver(TaskObserver* taskObserver) OVERRIDE |
+ { |
+ EXPECT_EQ(m_taskObserver, taskObserver); |
+ m_taskObserver = 0; |
+ } |
+ |
+ virtual void enterRunLoop() OVERRIDE |
+ { |
+ if (m_taskObserver) |
+ m_taskObserver->willProcessTask(); |
+ if (m_task) { |
+ m_task->run(); |
+ delete m_task; |
+ m_task = 0; |
+ } |
+ if (m_taskObserver) |
+ m_taskObserver->didProcessTask(); |
+ } |
+ |
+ virtual void exitRunLoop() OVERRIDE { ASSERT_NOT_REACHED(); } |
+ |
+ private: |
+ TaskObserver* m_taskObserver; |
+ Task* m_task; |
+ }; |
+ |
+ class CurrentThreadPlatformMock : public blink::Platform { |
+ public: |
+ CurrentThreadPlatformMock() { } |
+ virtual void cryptographicallyRandomValues(unsigned char* buffer, size_t length) { ASSERT_NOT_REACHED(); } |
+ virtual WebThread* currentThread() OVERRIDE { return &m_currentThread; } |
+ private: |
+ CurrentThreadMock m_currentThread; |
+ }; |
+ |
+ CurrentThreadPlatformMock m_mockPlatform; |
+ blink::Platform* m_oldPlatform; |
+}; |
+ |
+ |
+#define DEFINE_TEST_TASK_WRAPPER_CLASS(TEST_METHOD) \ |
+class TestWrapperTask_ ## TEST_METHOD : public blink::WebThread::Task { \ |
+ public: \ |
+ TestWrapperTask_ ## TEST_METHOD(RecordingImageBufferSurfaceTest* test) : m_test(test) { } \ |
+ virtual void run() OVERRIDE { m_test->TEST_METHOD(); } \ |
+ private: \ |
+ RecordingImageBufferSurfaceTest* m_test; \ |
+}; |
+ |
+#define CALL_TEST_TASK_WRAPPER(TEST_METHOD) \ |
+ { \ |
+ AutoInstallCurrentThreadPlatformMock ctpm; \ |
+ blink::Platform::current()->currentThread()->postTask(new TestWrapperTask_ ## TEST_METHOD(this)); \ |
+ blink::Platform::current()->currentThread()->enterRunLoop(); \ |
+ } |
+ |
TEST_F(RecordingImageBufferSurfaceTest, testEmptyPicture) |
{ |
testEmptyPicture(); |
@@ -119,19 +241,35 @@ TEST_F(RecordingImageBufferSurfaceTest, testNonAnimatedCanvasUpdate) |
testNonAnimatedCanvasUpdate(); |
} |
+DEFINE_TEST_TASK_WRAPPER_CLASS(testAnimatedWithoutClear) |
TEST_F(RecordingImageBufferSurfaceTest, testAnimatedWithoutClear) |
{ |
- testAnimatedWithoutClear(); |
+ CALL_TEST_TASK_WRAPPER(testAnimatedWithoutClear) |
+ expectDisplayListEnabled(false); |
+} |
+ |
+DEFINE_TEST_TASK_WRAPPER_CLASS(testFrameFinalizedByTaskObserver1) |
+DEFINE_TEST_TASK_WRAPPER_CLASS(testFrameFinalizedByTaskObserver2) |
+TEST_F(RecordingImageBufferSurfaceTest, testFrameFinalizedByTaskObserver) |
+{ |
+ CALL_TEST_TASK_WRAPPER(testFrameFinalizedByTaskObserver1) |
+ expectDisplayListEnabled(false); |
+ CALL_TEST_TASK_WRAPPER(testFrameFinalizedByTaskObserver2) |
+ expectDisplayListEnabled(false); |
} |
+DEFINE_TEST_TASK_WRAPPER_CLASS(testAnimatedWithClear) |
TEST_F(RecordingImageBufferSurfaceTest, testAnimatedWithClear) |
{ |
- testAnimatedWithClear(); |
+ CALL_TEST_TASK_WRAPPER(testAnimatedWithClear) |
+ expectDisplayListEnabled(true); |
} |
+DEFINE_TEST_TASK_WRAPPER_CLASS(testClearRect) |
TEST_F(RecordingImageBufferSurfaceTest, testClearRect) |
{ |
- testClearRect(); |
+ CALL_TEST_TASK_WRAPPER(testClearRect); |
+ expectDisplayListEnabled(true); |
} |
} // namespace |