Index: Source/platform/graphics/ImageFrameGeneratorTest.cpp |
diff --git a/Source/platform/graphics/ImageFrameGeneratorTest.cpp b/Source/platform/graphics/ImageFrameGeneratorTest.cpp |
index e49be9b60581d1cf76f96d6f1e1251709b8e6013..129dfd67b79fe0b3fc7545cf0abe28600a5a1a41 100644 |
--- a/Source/platform/graphics/ImageFrameGeneratorTest.cpp |
+++ b/Source/platform/graphics/ImageFrameGeneratorTest.cpp |
@@ -59,6 +59,7 @@ public: |
m_decodersDestroyed = 0; |
m_frameBufferRequestCount = 0; |
m_status = ImageFrame::FrameEmpty; |
+ m_frameCount = 1; |
} |
virtual void TearDown() override |
@@ -83,8 +84,8 @@ public: |
return currentStatus; |
} |
- virtual size_t frameCount() override { return 1; } |
- virtual int repetitionCount() const override { return cAnimationNone; } |
+ virtual size_t frameCount() override { return m_frameCount; } |
+ virtual int repetitionCount() const override { return m_frameCount == 1 ? cAnimationNone:cAnimationLoopOnce; } |
virtual float frameDuration() const override { return 0; } |
protected: |
@@ -101,6 +102,15 @@ protected: |
void setFrameStatus(ImageFrame::Status status) { m_status = m_nextFrameStatus = status; } |
void setNextFrameStatus(ImageFrame::Status status) { m_nextFrameStatus = status; } |
+ void setFrameCount(size_t count) |
+ { |
+ m_frameCount = count; |
+ if (count > 1) { |
+ m_generator.clear(); |
+ m_generator = ImageFrameGenerator::create(fullSize(), m_data, true, true); |
+ useMockImageDecoderFactory(); |
+ } |
+ } |
RefPtr<SharedBuffer> m_data; |
RefPtr<ImageFrameGenerator> m_generator; |
@@ -108,6 +118,7 @@ protected: |
int m_frameBufferRequestCount; |
ImageFrame::Status m_status; |
ImageFrame::Status m_nextFrameStatus; |
+ size_t m_frameCount; |
}; |
TEST_F(ImageFrameGeneratorTest, incompleteDecode) |
@@ -179,8 +190,8 @@ TEST_F(ImageFrameGeneratorTest, frameHasAlpha) |
setFrameStatus(ImageFrame::FramePartial); |
char buffer[100 * 100 * 4]; |
- m_generator->decodeAndScale(imageInfo(), 1, buffer, 100 * 4); |
- EXPECT_TRUE(m_generator->hasAlpha(1)); |
+ m_generator->decodeAndScale(imageInfo(), 0, buffer, 100 * 4); |
+ EXPECT_TRUE(m_generator->hasAlpha(0)); |
EXPECT_EQ(1, m_frameBufferRequestCount); |
ImageDecoder* tempDecoder = 0; |
@@ -190,9 +201,33 @@ TEST_F(ImageFrameGeneratorTest, frameHasAlpha) |
ImageDecodingStore::instance()->unlockDecoder(m_generator.get(), tempDecoder); |
setFrameStatus(ImageFrame::FrameComplete); |
+ m_generator->decodeAndScale(imageInfo(), 0, buffer, 100 * 4); |
+ EXPECT_EQ(2, m_frameBufferRequestCount); |
+ EXPECT_FALSE(m_generator->hasAlpha(0)); |
+} |
+ |
+TEST_F(ImageFrameGeneratorTest, removeMultiFrameDecoder) |
+{ |
+ setFrameCount(3); |
+ setFrameStatus(ImageFrame::FrameComplete); |
+ |
+ char buffer[100 * 100 * 4]; |
+ m_generator->decodeAndScale(imageInfo(), 0, buffer, 100 * 4); |
+ EXPECT_EQ(1, m_frameBufferRequestCount); |
+ EXPECT_EQ(0, m_decodersDestroyed); |
+ |
+ setFrameStatus(ImageFrame::FrameComplete); |
+ |
m_generator->decodeAndScale(imageInfo(), 1, buffer, 100 * 4); |
EXPECT_EQ(2, m_frameBufferRequestCount); |
- EXPECT_FALSE(m_generator->hasAlpha(1)); |
+ EXPECT_EQ(0, m_decodersDestroyed); |
+ |
+ setFrameStatus(ImageFrame::FrameComplete); |
+ |
+ // Multi frame decoder should be removed. |
+ m_generator->decodeAndScale(imageInfo(), 2, buffer, 100 * 4); |
+ EXPECT_EQ(3, m_frameBufferRequestCount); |
+ EXPECT_EQ(1, m_decodersDestroyed); |
} |
} // namespace blink |