Chromium Code Reviews| Index: Source/WebKit/chromium/tests/Canvas2DLayerBridgeTest.cpp |
| diff --git a/Source/WebKit/chromium/tests/Canvas2DLayerBridgeTest.cpp b/Source/WebKit/chromium/tests/Canvas2DLayerBridgeTest.cpp |
| index b1cc9829d8cb2f6f82c428037fa4da0cf8d375dc..ab039a43ccc1c411815a395d32e26f873033de9b 100644 |
| --- a/Source/WebKit/chromium/tests/Canvas2DLayerBridgeTest.cpp |
| +++ b/Source/WebKit/chromium/tests/Canvas2DLayerBridgeTest.cpp |
| @@ -58,6 +58,33 @@ public: |
| MOCK_METHOD3(appendCopy, void(unsigned, unsigned, WebSize)); |
| }; |
| +class FakeCanvas2DLayerBridge : public Canvas2DLayerBridge { |
| +public: |
| + static PassOwnPtr<FakeCanvas2DLayerBridge> create(PassRefPtr<GraphicsContext3D> context, SkDeferredCanvas* canvas, OpacityMode opacityMode, ThreadMode threadMode) |
| + { |
| + return adoptPtr(new FakeCanvas2DLayerBridge(context, canvas, opacityMode, threadMode)); |
| + } |
| + |
| + void setFakeSharedContext(PassRefPtr<GraphicsContext3D> context) |
| + { |
| + m_fakeSharedContext = context; |
| + } |
| +protected: |
| + virtual PassRefPtr<GraphicsContext3D> getSharedContext() const OVERRIDE |
| + { |
| + return m_fakeSharedContext; |
| + } |
| + |
| + FakeCanvas2DLayerBridge(PassRefPtr<GraphicsContext3D> context, SkDeferredCanvas* canvas, OpacityMode opacityMode, ThreadMode threadMode) : |
| + Canvas2DLayerBridge(context, canvas) |
| + { |
| + m_fakeSharedContext = m_context; |
| + init(opacityMode, threadMode); |
| + } |
| + |
| + RefPtr<GraphicsContext3D> m_fakeSharedContext; |
| +}; |
| + |
| } // namespace |
| class Canvas2DLayerBridgeTest : public Test { |
| @@ -75,7 +102,7 @@ protected: |
| ::testing::Mock::VerifyAndClearExpectations(&mainMock); |
| - OwnPtr<Canvas2DLayerBridge> bridge = Canvas2DLayerBridge::create(mainContext.release(), &canvas, Canvas2DLayerBridge::NonOpaque, threadMode); |
| + OwnPtr<Canvas2DLayerBridge> bridge = FakeCanvas2DLayerBridge::create(mainContext.release(), &canvas, Canvas2DLayerBridge::NonOpaque, threadMode); |
| ::testing::Mock::VerifyAndClearExpectations(&mainMock); |
| @@ -90,6 +117,37 @@ protected: |
| ::testing::Mock::VerifyAndClearExpectations(&mainMock); |
| ::testing::Mock::VerifyAndClearExpectations(&updater); |
| } |
| + |
| + void contextLostTest() |
|
Stephen White
2013/05/31 15:06:18
Thanks for the new test!
|
| + { |
| + // This test fakes a context loss by substituting the shared context for a new, |
| + // Which simulated what happens when the shared context successfully recoveres |
|
Stephen White
2013/05/31 15:06:18
Nit: "for a new, Which simulated what happens" i c
|
| + // after a lost context. |
| + RefPtr<GraphicsContext3D> mainContext = GraphicsContext3D::createGraphicsContextFromWebContext(adoptPtr(new MockCanvasContext)); |
| + MockCanvasContext& mainMock = *static_cast<MockCanvasContext*>(mainContext->webContext()); |
| + |
| + RefPtr<GraphicsContext3D> substituteContext = GraphicsContext3D::createGraphicsContextFromWebContext(adoptPtr(new MockCanvasContext)); |
| + MockCanvasContext& substituteMock = *static_cast<MockCanvasContext*>(mainContext->webContext()); |
| + |
| + MockWebTextureUpdater updater; |
| + |
| + SkDevice device(SkBitmap::kARGB_8888_Config, 300, 150); |
| + SkDeferredCanvas canvas(&device); |
| + OwnPtr<FakeCanvas2DLayerBridge> bridge = FakeCanvas2DLayerBridge::create(mainContext, &canvas, Canvas2DLayerBridge::NonOpaque, Canvas2DLayerBridge::SingleThread); |
| + |
| + EXPECT_TRUE(bridge->m_context == mainContext); |
| + bridge->prepareForDraw(); |
| + EXPECT_TRUE(bridge->m_context == mainContext); |
| + |
| + bridge->setFakeSharedContext(substituteContext); // installing an alternat |
| + bridge->prepareForDraw(); |
| + // m_context set to 0 shows that bridge detected lost context and attempted |
| + // to recover. Recovery aborts because the fake context does not provide a grContext. |
| + EXPECT_EQ(bridge->m_context.get(), (WebCore::GraphicsContext3D*)0); |
| + |
| + ::testing::Mock::VerifyAndClearExpectations(&mainMock); |
| + ::testing::Mock::VerifyAndClearExpectations(&substituteMock); |
| + } |
| }; |
| namespace { |
| @@ -104,4 +162,9 @@ TEST_F(Canvas2DLayerBridgeTest, testFullLifecycleThreaded) |
| fullLifecycleTest(Canvas2DLayerBridge::Threaded); |
| } |
| +TEST_F(Canvas2DLayerBridgeTest, testContextLost) |
| +{ |
| + contextLostTest(); |
| +} |
| + |
| } // namespace |