Index: Source/platform/image-decoders/gif/GIFImageDecoderTest.cpp |
diff --git a/Source/platform/image-decoders/gif/GIFImageDecoderTest.cpp b/Source/platform/image-decoders/gif/GIFImageDecoderTest.cpp |
index db39a29bfc4c3c35fdb767c8285ea3a882eae7cd..756b4acb23a6eab8b0a5a3a9e869f71e8ca0c117 100644 |
--- a/Source/platform/image-decoders/gif/GIFImageDecoderTest.cpp |
+++ b/Source/platform/image-decoders/gif/GIFImageDecoderTest.cpp |
@@ -47,9 +47,16 @@ using namespace blink; |
namespace { |
-PassRefPtr<SharedBuffer> readFile(const char* fileName) |
+const char decodersTestingDir[] = "Source/platform/image-decoders/testing"; |
+const char layoutTestResourcesDir[] = "LayoutTests/fast/images/resources"; |
+const char webTestsDataDir[] = "Source/web/tests/data"; |
+ |
+PassRefPtr<SharedBuffer> readFile(const char* dir, const char* fileName) |
{ |
String filePath = Platform::current()->unitTestSupport()->webKitRootDir(); |
+ filePath.append("/"); |
+ filePath.append(dir); |
+ filePath.append("/"); |
filePath.append(fileName); |
return Platform::current()->unitTestSupport()->readFromFile(filePath); |
@@ -76,11 +83,11 @@ void createDecodingBaseline(SharedBuffer* data, Vector<unsigned>* baselineHashes |
} |
} |
-void testRandomFrameDecode(const char* gifFile) |
+void testRandomFrameDecode(const char* dir, const char* gifFile) |
{ |
SCOPED_TRACE(gifFile); |
- RefPtr<SharedBuffer> fullData = readFile(gifFile); |
+ RefPtr<SharedBuffer> fullData = readFile(dir, gifFile); |
ASSERT_TRUE(fullData.get()); |
Vector<unsigned> baselineHashes; |
createDecodingBaseline(fullData.get(), &baselineHashes); |
@@ -108,11 +115,11 @@ void testRandomFrameDecode(const char* gifFile) |
} |
} |
-void testRandomDecodeAfterClearFrameBufferCache(const char* gifFile) |
+void testRandomDecodeAfterClearFrameBufferCache(const char* dir, const char* gifFile) |
{ |
SCOPED_TRACE(gifFile); |
- RefPtr<SharedBuffer> data = readFile(gifFile); |
+ RefPtr<SharedBuffer> data = readFile(dir, gifFile); |
ASSERT_TRUE(data.get()); |
Vector<unsigned> baselineHashes; |
createDecodingBaseline(data.get(), &baselineHashes); |
@@ -139,7 +146,7 @@ TEST(GIFImageDecoderTest, decodeTwoFrames) |
{ |
OwnPtr<GIFImageDecoder> decoder = createDecoder(); |
- RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/animated.gif"); |
+ RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif"); |
ASSERT_TRUE(data.get()); |
decoder->setData(data.get(), true); |
EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); |
@@ -165,7 +172,7 @@ TEST(GIFImageDecoderTest, parseAndDecode) |
{ |
OwnPtr<GIFImageDecoder> decoder = createDecoder(); |
- RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/animated.gif"); |
+ RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif"); |
ASSERT_TRUE(data.get()); |
decoder->setData(data.get(), true); |
EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); |
@@ -189,7 +196,7 @@ TEST(GIFImageDecoderTest, parseByteByByte) |
{ |
OwnPtr<GIFImageDecoder> decoder = createDecoder(); |
- RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/animated.gif"); |
+ RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif"); |
ASSERT_TRUE(data.get()); |
size_t frameCount = 0; |
@@ -214,7 +221,7 @@ TEST(GIFImageDecoderTest, parseAndDecodeByteByByte) |
{ |
OwnPtr<GIFImageDecoder> decoder = createDecoder(); |
- RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/animated-gif-with-offsets.gif"); |
+ RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated-gif-with-offsets.gif"); |
ASSERT_TRUE(data.get()); |
size_t frameCount = 0; |
@@ -242,7 +249,7 @@ TEST(GIFImageDecoderTest, brokenSecondFrame) |
{ |
OwnPtr<GIFImageDecoder> decoder = createDecoder(); |
- RefPtr<SharedBuffer> data = readFile("/Source/web/tests/data/broken.gif"); |
+ RefPtr<SharedBuffer> data = readFile(webTestsDataDir, "broken.gif"); |
ASSERT_TRUE(data.get()); |
decoder->setData(data.get(), true); |
@@ -254,7 +261,7 @@ TEST(GIFImageDecoderTest, brokenSecondFrame) |
TEST(GIFImageDecoderTest, progressiveDecode) |
{ |
- RefPtr<SharedBuffer> fullData = readFile("/Source/web/tests/data/radient.gif"); |
+ RefPtr<SharedBuffer> fullData = readFile(webTestsDataDir, "radient.gif"); |
ASSERT_TRUE(fullData.get()); |
const size_t fullLength = fullData->size(); |
@@ -307,7 +314,7 @@ TEST(GIFImageDecoderTest, allDataReceivedTruncation) |
{ |
OwnPtr<GIFImageDecoder> decoder = createDecoder(); |
- RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/animated.gif"); |
+ RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif"); |
ASSERT_TRUE(data.get()); |
ASSERT_GE(data->size(), 10u); |
@@ -327,7 +334,7 @@ TEST(GIFImageDecoderTest, frameIsComplete) |
{ |
OwnPtr<GIFImageDecoder> decoder = createDecoder(); |
- RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/animated.gif"); |
+ RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif"); |
ASSERT_TRUE(data.get()); |
decoder->setData(data.get(), true); |
@@ -342,7 +349,7 @@ TEST(GIFImageDecoderTest, frameIsCompleteLoading) |
{ |
OwnPtr<GIFImageDecoder> decoder = createDecoder(); |
- RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/animated.gif"); |
+ RefPtr<SharedBuffer> data = readFile(layoutTestResourcesDir, "animated.gif"); |
ASSERT_TRUE(data.get()); |
ASSERT_GE(data->size(), 10u); |
@@ -362,8 +369,8 @@ TEST(GIFImageDecoderTest, frameIsCompleteLoading) |
TEST(GIFImageDecoderTest, badTerminator) |
{ |
- RefPtr<SharedBuffer> referenceData = readFile("/Source/web/tests/data/radient.gif"); |
- RefPtr<SharedBuffer> testData = readFile("/Source/web/tests/data/radient-bad-terminator.gif"); |
+ RefPtr<SharedBuffer> referenceData = readFile(webTestsDataDir, "radient.gif"); |
+ RefPtr<SharedBuffer> testData = readFile(webTestsDataDir, "radient-bad-terminator.gif"); |
ASSERT_TRUE(referenceData.get()); |
ASSERT_TRUE(testData.get()); |
@@ -386,7 +393,7 @@ TEST(GIFImageDecoderTest, updateRequiredPreviousFrameAfterFirstDecode) |
{ |
OwnPtr<GIFImageDecoder> decoder = createDecoder(); |
- RefPtr<SharedBuffer> fullData = readFile("/LayoutTests/fast/images/resources/animated-10color.gif"); |
+ RefPtr<SharedBuffer> fullData = readFile(layoutTestResourcesDir, "animated-10color.gif"); |
ASSERT_TRUE(fullData.get()); |
// Give it data that is enough to parse but not decode in order to check the status |
@@ -411,24 +418,24 @@ TEST(GIFImageDecoderTest, updateRequiredPreviousFrameAfterFirstDecode) |
TEST(GIFImageDecoderTest, randomFrameDecode) |
{ |
// Single frame image. |
- testRandomFrameDecode("/Source/web/tests/data/radient.gif"); |
+ testRandomFrameDecode(webTestsDataDir, "radient.gif"); |
// Multiple frame images. |
- testRandomFrameDecode("/LayoutTests/fast/images/resources/animated-gif-with-offsets.gif"); |
- testRandomFrameDecode("/LayoutTests/fast/images/resources/animated-10color.gif"); |
+ testRandomFrameDecode(layoutTestResourcesDir, "animated-gif-with-offsets.gif"); |
+ testRandomFrameDecode(layoutTestResourcesDir, "animated-10color.gif"); |
} |
TEST(GIFImageDecoderTest, randomDecodeAfterClearFrameBufferCache) |
{ |
// Single frame image. |
- testRandomDecodeAfterClearFrameBufferCache("/Source/web/tests/data/radient.gif"); |
+ testRandomDecodeAfterClearFrameBufferCache(webTestsDataDir, "radient.gif"); |
// Multiple frame images. |
- testRandomDecodeAfterClearFrameBufferCache("/LayoutTests/fast/images/resources/animated-gif-with-offsets.gif"); |
- testRandomDecodeAfterClearFrameBufferCache("/LayoutTests/fast/images/resources/animated-10color.gif"); |
+ testRandomDecodeAfterClearFrameBufferCache(layoutTestResourcesDir, "animated-gif-with-offsets.gif"); |
+ testRandomDecodeAfterClearFrameBufferCache(layoutTestResourcesDir, "animated-10color.gif"); |
} |
TEST(GIFImageDecoderTest, resumePartialDecodeAfterClearFrameBufferCache) |
{ |
- RefPtr<SharedBuffer> fullData = readFile("/LayoutTests/fast/images/resources/animated-10color.gif"); |
+ RefPtr<SharedBuffer> fullData = readFile(layoutTestResourcesDir, "animated-10color.gif"); |
ASSERT_TRUE(fullData.get()); |
Vector<unsigned> baselineHashes; |
createDecodingBaseline(fullData.get(), &baselineHashes); |
@@ -461,7 +468,7 @@ TEST(GIFImageDecoderTest, resumePartialDecodeAfterClearFrameBufferCache) |
// in the dictionary. Decoding should fail, but not infinitely loop or corrupt memory. |
TEST(GIFImageDecoderTest, badInitialCode) |
{ |
- RefPtr<SharedBuffer> testData = readFile("/Source/platform/image-decoders/testing/bad-initial-code.gif"); |
+ RefPtr<SharedBuffer> testData = readFile(decodersTestingDir, "bad-initial-code.gif"); |
ASSERT_TRUE(testData.get()); |
OwnPtr<GIFImageDecoder> testDecoder(createDecoder()); |
@@ -474,7 +481,7 @@ TEST(GIFImageDecoderTest, badInitialCode) |
// The image has an invalid LZW code that exceeds dictionary size. Decoding should fail. |
TEST(GIFImageDecoderTest, badCode) |
{ |
- RefPtr<SharedBuffer> testData = readFile("/Source/platform/image-decoders/testing/bad-code.gif"); |
+ RefPtr<SharedBuffer> testData = readFile(decodersTestingDir, "bad-code.gif"); |
ASSERT_TRUE(testData.get()); |
OwnPtr<GIFImageDecoder> testDecoder(createDecoder()); |
@@ -489,7 +496,7 @@ TEST(GIFImageDecoderTest, invalidDisposalMethod) |
OwnPtr<GIFImageDecoder> decoder = createDecoder(); |
// The image has 2 frames, with disposal method 4 and 5, respectively. |
- RefPtr<SharedBuffer> data = readFile("/Source/web/tests/data/invalid-disposal-method.gif"); |
+ RefPtr<SharedBuffer> data = readFile(webTestsDataDir, "invalid-disposal-method.gif"); |
ASSERT_TRUE(data.get()); |
decoder->setData(data.get(), true); |
@@ -499,3 +506,27 @@ TEST(GIFImageDecoderTest, invalidDisposalMethod) |
// Disposal method 5 is ignored. |
EXPECT_EQ(ImageFrame::DisposeNotSpecified, decoder->frameBufferAtIndex(1)->disposalMethod()); |
} |
+ |
+TEST(GIFImageDecoderTest, firstFrameHasGreaterSizeThanScreenSize) |
+{ |
+ RefPtr<SharedBuffer> fullData = readFile(decodersTestingDir, "first-frame-has-greater-size-than-screen-size.gif"); |
+ ASSERT_TRUE(fullData.get()); |
+ |
+ OwnPtr<GIFImageDecoder> decoder; |
+ IntSize frameSize; |
+ |
+ // Compute hashes when the file is truncated. |
+ for (size_t i = 1; i <= fullData->size(); ++i) { |
+ decoder = createDecoder(); |
+ RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), i); |
+ decoder->setData(data.get(), i == fullData->size()); |
+ |
+ if (decoder->isSizeAvailable() && !frameSize.width() && !frameSize.height()) { |
+ frameSize = decoder->decodedSize(); |
+ continue; |
+ } |
+ |
+ ASSERT_EQ(frameSize.width(), decoder->decodedSize().width()); |
+ ASSERT_EQ(frameSize.height(), decoder->decodedSize().height()); |
+ } |
+} |