| 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..5e2e8389956931efcbdcc3811f745bd4471a89ad 100644
|
| --- a/Source/WebKit/chromium/tests/Canvas2DLayerBridgeTest.cpp
|
| +++ b/Source/WebKit/chromium/tests/Canvas2DLayerBridgeTest.cpp
|
| @@ -58,6 +58,32 @@ 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, opacityMode, threadMode)
|
| + {
|
| + m_fakeSharedContext = m_context;
|
| + }
|
| +
|
| + RefPtr<GraphicsContext3D> m_fakeSharedContext;
|
| +};
|
| +
|
| } // namespace
|
|
|
| class Canvas2DLayerBridgeTest : public Test {
|
| @@ -75,7 +101,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 +116,37 @@ protected:
|
| ::testing::Mock::VerifyAndClearExpectations(&mainMock);
|
| ::testing::Mock::VerifyAndClearExpectations(&updater);
|
| }
|
| +
|
| + void contextLostTest()
|
| + {
|
| + // This test fakes a context loss by substituting the shared context for a new one.
|
| + // This simulates what happens when the shared context successfully recovers
|
| + // after a graphics reset.
|
| + 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 +161,9 @@ TEST_F(Canvas2DLayerBridgeTest, testFullLifecycleThreaded)
|
| fullLifecycleTest(Canvas2DLayerBridge::Threaded);
|
| }
|
|
|
| +TEST_F(Canvas2DLayerBridgeTest, testContextLost)
|
| +{
|
| + contextLostTest();
|
| +}
|
| +
|
| } // namespace
|
|
|