Index: Source/web/tests/Canvas2DLayerManagerTest.cpp |
diff --git a/Source/web/tests/Canvas2DLayerManagerTest.cpp b/Source/web/tests/Canvas2DLayerManagerTest.cpp |
index 8607ca5e2c55b6a223bb107214d48981b6853c9d..50400fc5c4778240b00c0972ad62106a2bc920e6 100644 |
--- a/Source/web/tests/Canvas2DLayerManagerTest.cpp |
+++ b/Source/web/tests/Canvas2DLayerManagerTest.cpp |
@@ -41,11 +41,22 @@ using testing::InSequence; |
using testing::Return; |
using testing::Test; |
+namespace { |
+ |
+class FakeCanvas2DLayerBridgeClient : public Canvas2DLayerBridgeClient { |
+public: |
+ FakeCanvas2DLayerBridgeClient() { m_hidden = false; } |
+ virtual ~FakeCanvas2DLayerBridgeClient() { } |
+ virtual bool hidden() const OVERRIDE { return m_hidden; } |
+ void fakeHidden(bool value) { m_hidden = value; } |
+private: |
+ bool m_hidden; |
+}; |
class FakeCanvas2DLayerBridge : public Canvas2DLayerBridge { |
public: |
FakeCanvas2DLayerBridge(PassRefPtr<GraphicsContext3D> context, PassOwnPtr<SkDeferredCanvas> canvas) |
- : Canvas2DLayerBridge(context, canvas, 0, NonOpaque) |
+ : Canvas2DLayerBridge(&m_client, context, canvas, 0, NonOpaque) |
, m_freeableBytes(0) |
, m_freeMemoryIfPossibleCount(0) |
, m_flushCount(0) |
@@ -72,18 +83,19 @@ public: |
size_t bytesFreed = size < m_freeableBytes ? size : m_freeableBytes; |
m_freeableBytes -= bytesFreed; |
if (bytesFreed) |
- Canvas2DLayerManager::get().layerAllocatedStorageChanged(this, -((intptr_t)bytesFreed)); |
- m_bytesAllocated -= bytesFreed; |
+ storageAllocatedForRecordingChanged(m_bytesAllocated - bytesFreed); |
return bytesFreed; |
} |
virtual void flush() OVERRIDE |
{ |
flushedDrawCommands(); |
+ m_freeableBytes = bytesAllocated(); |
m_flushCount++; |
} |
public: |
+ FakeCanvas2DLayerBridgeClient m_client; |
size_t m_freeableBytes; |
int m_freeMemoryIfPossibleCount; |
int m_flushCount; |
@@ -111,6 +123,8 @@ static PassOwnPtr<SkDeferredCanvas> createCanvas(GraphicsContext3D* context) |
return adoptPtr(SkDeferredCanvas::Create(SkSurface::NewRasterPMColor(1, 1))); |
} |
+} // unnamed namespace |
+ |
class Canvas2DLayerManagerTest : public Test { |
protected: |
void storageAllocationTrackingTest() |
@@ -160,6 +174,40 @@ protected: |
EXPECT_EQ((size_t)5, layer->bytesAllocated()); |
} |
+ void hiddenCanvasTest() |
+ { |
+ RefPtr<GraphicsContext3D> context = GraphicsContext3D::createGraphicsContextFromWebContext(adoptPtr(new blink::MockWebGraphicsContext3D)); |
+ Canvas2DLayerManager& manager = Canvas2DLayerManager::get(); |
+ manager.init(20, 5); |
+ OwnPtr<SkDeferredCanvas> canvas = createCanvas(context.get()); |
+ FakeCanvas2DLayerBridgePtr layer(adoptRef(new FakeCanvas2DLayerBridge(context, canvas.release()))); |
+ layer->fakeFreeableBytes(5); |
+ layer->storageAllocatedForRecordingChanged(10); |
+ manager.didHidePage(); // does nothing because no canvases are hidden |
+ EXPECT_EQ(0, layer->m_freeMemoryIfPossibleCount); |
+ EXPECT_EQ(0, layer->m_flushCount); |
+ layer->m_client.fakeHidden(true); |
+ manager.didHidePage(); |
+ EXPECT_EQ(1, layer->m_freeMemoryIfPossibleCount); |
+ EXPECT_EQ((size_t)0, layer->m_freeableBytes); |
+ EXPECT_EQ((size_t)0, layer->bytesAllocated()); |
+ EXPECT_EQ(1, layer->m_flushCount); |
+ } |
+ |
+ void addRemoveLayerTest() |
+ { |
+ RefPtr<GraphicsContext3D> context = GraphicsContext3D::createGraphicsContextFromWebContext(adoptPtr(new blink::MockWebGraphicsContext3D)); |
+ Canvas2DLayerManager& manager = Canvas2DLayerManager::get(); |
+ manager.init(10, 5); |
+ OwnPtr<SkDeferredCanvas> canvas = createCanvas(context.get()); |
+ FakeCanvas2DLayerBridgePtr layer(adoptRef(new FakeCanvas2DLayerBridge(context, canvas.release()))); |
+ EXPECT_FALSE(manager.isInList(layer.get())); |
+ layer->storageAllocatedForRecordingChanged(5); |
+ EXPECT_TRUE(manager.isInList(layer.get())); |
+ layer->storageAllocatedForRecordingChanged(0); |
+ EXPECT_FALSE(manager.isInList(layer.get())); |
+ } |
+ |
void flushEvictionTest() |
{ |
RefPtr<GraphicsContext3D> context = GraphicsContext3D::createGraphicsContextFromWebContext(adoptPtr(new blink::MockWebGraphicsContext3D)); |
@@ -172,10 +220,10 @@ protected: |
EXPECT_EQ(0, layer->m_freeMemoryIfPossibleCount); |
layer->storageAllocatedForRecordingChanged(12); // over the max |
EXPECT_EQ(2, layer->m_freeMemoryIfPossibleCount); // Two tries, one before flush, one after flush |
- EXPECT_EQ((size_t)0, layer->m_freeableBytes); |
+ EXPECT_EQ((size_t)5, layer->m_freeableBytes); |
EXPECT_EQ(1, layer->m_flushCount); // flush was attempted |
- EXPECT_EQ((size_t)11, layer->bytesAllocated()); // flush drops the layer from manager's tracking list |
- EXPECT_FALSE(manager.isInList(layer.get())); |
+ EXPECT_EQ((size_t)5, layer->bytesAllocated()); |
+ EXPECT_TRUE(manager.isInList(layer.get())); |
} |
void doDeferredFrameTestTask(FakeCanvas2DLayerBridge* layer, bool skipCommands) |
@@ -186,7 +234,6 @@ protected: |
EXPECT_TRUE(Canvas2DLayerManager::get().m_taskObserverActive); |
if (skipCommands) { |
layer->willUse(); |
- layer->storageAllocatedForRecordingChanged(0); |
layer->skippedPendingDrawCommands(); |
} |
blink::Platform::current()->currentThread()->exitRunLoop(); |
@@ -270,5 +317,15 @@ TEST_F(Canvas2DLayerManagerTest, testDeferredFrame) |
deferredFrameTest(); |
} |
-} // namespace |
+TEST_F(Canvas2DLayerManagerTest, testHiddenCanvas) |
+{ |
+ hiddenCanvasTest(); |
+} |
+ |
+TEST_F(Canvas2DLayerManagerTest, testAddRemoveLayer) |
+{ |
+ addRemoveLayerTest(); |
+} |
+ |
+} // unnamed namespace |