Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(153)

Unified Diff: Source/WebKit/chromium/tests/Canvas2DLayerBridgeTest.cpp

Issue 16032003: Fixing Canvas2DLayerBridge to handle lost graphics contexts (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Added assertions on m_layer to verify that init was called Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698