| Index: third_party/WebKit/Source/platform/graphics/ImageFrameGeneratorTest.cpp
|
| diff --git a/third_party/WebKit/Source/platform/graphics/ImageFrameGeneratorTest.cpp b/third_party/WebKit/Source/platform/graphics/ImageFrameGeneratorTest.cpp
|
| index aef5863c0a437377a4ace835bc339dcda54f06ad..4b9d1b738a11b8854d9b389e9e0127a53c7899a6 100644
|
| --- a/third_party/WebKit/Source/platform/graphics/ImageFrameGeneratorTest.cpp
|
| +++ b/third_party/WebKit/Source/platform/graphics/ImageFrameGeneratorTest.cpp
|
| @@ -29,6 +29,7 @@
|
| #include "platform/ThreadSafeFunctional.h"
|
| #include "platform/graphics/ImageDecodingStore.h"
|
| #include "platform/graphics/test/MockImageDecoder.h"
|
| +#include "platform/image-decoders/SegmentReader.h"
|
| #include "public/platform/Platform.h"
|
| #include "public/platform/WebTaskRunner.h"
|
| #include "public/platform/WebThread.h"
|
| @@ -54,8 +55,9 @@ public:
|
| void SetUp() override
|
| {
|
| ImageDecodingStore::instance().setCacheLimitInBytes(1024 * 1024);
|
| + m_generator = ImageFrameGenerator::create(fullSize(), false);
|
| m_data = SharedBuffer::create();
|
| - m_generator = ImageFrameGenerator::create(fullSize(), m_data, false);
|
| + m_segmentReader = SegmentReader::createFromSharedBuffer(m_data);
|
| useMockImageDecoderFactory();
|
| m_decodersDestroyed = 0;
|
| m_decodeRequestCount = 0;
|
| @@ -101,10 +103,9 @@ protected:
|
| m_generator->setImageDecoderFactory(MockImageDecoderFactory::create(this, fullSize()));
|
| }
|
|
|
| - void addNewData(bool allDataReceived = false)
|
| + void addNewData()
|
| {
|
| m_data->append("g", 1u);
|
| - m_generator->setData(m_data, allDataReceived);
|
| }
|
|
|
| void setFrameStatus(ImageFrame::Status status) { m_status = m_nextFrameStatus = status; }
|
| @@ -114,12 +115,13 @@ protected:
|
| m_frameCount = count;
|
| if (count > 1) {
|
| m_generator.clear();
|
| - m_generator = ImageFrameGenerator::create(fullSize(), m_data, true, true);
|
| + m_generator = ImageFrameGenerator::create(fullSize(), true);
|
| useMockImageDecoderFactory();
|
| }
|
| }
|
|
|
| RefPtr<SharedBuffer> m_data;
|
| + RefPtr<SegmentReader> m_segmentReader;
|
| RefPtr<ImageFrameGenerator> m_generator;
|
| int m_decodersDestroyed;
|
| int m_decodeRequestCount;
|
| @@ -134,11 +136,11 @@ TEST_F(ImageFrameGeneratorTest, incompleteDecode)
|
| setFrameStatus(ImageFrame::FramePartial);
|
|
|
| char buffer[100 * 100 * 4];
|
| - m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
|
| + m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4);
|
| EXPECT_EQ(1, m_decodeRequestCount);
|
|
|
| addNewData();
|
| - m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
|
| + m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4);
|
| EXPECT_EQ(2, m_decodeRequestCount);
|
| EXPECT_EQ(0, m_decodersDestroyed);
|
| }
|
| @@ -148,35 +150,26 @@ TEST_F(ImageFrameGeneratorTest, incompleteDecodeBecomesComplete)
|
| setFrameStatus(ImageFrame::FramePartial);
|
|
|
| char buffer[100 * 100 * 4];
|
| - m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
|
| + m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4);
|
| EXPECT_EQ(1, m_decodeRequestCount);
|
| EXPECT_EQ(0, m_decodersDestroyed);
|
|
|
| setFrameStatus(ImageFrame::FrameComplete);
|
| addNewData();
|
|
|
| - m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
|
| + m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4);
|
| EXPECT_EQ(2, m_decodeRequestCount);
|
| EXPECT_EQ(1, m_decodersDestroyed);
|
|
|
| // Decoder created again.
|
| - m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
|
| + m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4);
|
| EXPECT_EQ(3, m_decodeRequestCount);
|
| }
|
|
|
| -static void decodeThreadMain(ImageFrameGenerator* generator)
|
| +static void decodeThreadMain(ImageFrameGenerator* generator, SegmentReader* segmentReader)
|
| {
|
| char buffer[100 * 100 * 4];
|
| - generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
|
| -}
|
| -
|
| -static void decodeThreadWithRefEncodedMain(ImageFrameGenerator* generator)
|
| -{
|
| - // Image must be complete - refEncodedData otherwise returns null.
|
| - char buffer[100 * 100 * 4];
|
| - SkData* data = generator->refEncodedData();
|
| - generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
|
| - data->unref();
|
| + generator->decodeAndScale(segmentReader, false, 0, imageInfo(), buffer, 100 * 4);
|
| }
|
|
|
| TEST_F(ImageFrameGeneratorTest, incompleteDecodeBecomesCompleteMultiThreaded)
|
| @@ -184,52 +177,27 @@ TEST_F(ImageFrameGeneratorTest, incompleteDecodeBecomesCompleteMultiThreaded)
|
| setFrameStatus(ImageFrame::FramePartial);
|
|
|
| char buffer[100 * 100 * 4];
|
| - m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
|
| + m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4);
|
| EXPECT_EQ(1, m_decodeRequestCount);
|
| EXPECT_EQ(0, m_decodersDestroyed);
|
| - SkData* data = m_generator->refEncodedData();
|
| - EXPECT_EQ(nullptr, data);
|
|
|
| // LocalFrame can now be decoded completely.
|
| setFrameStatus(ImageFrame::FrameComplete);
|
| addNewData();
|
| - // addNewData is calling m_generator->setData with allDataReceived == false, which means that
|
| - // refEncodedData should return null.
|
| - data = m_generator->refEncodedData();
|
| - EXPECT_EQ(nullptr, data);
|
| OwnPtr<WebThread> thread = adoptPtr(Platform::current()->createThread("DecodeThread"));
|
| - thread->getWebTaskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(&decodeThreadMain, AllowCrossThreadAccess(m_generator.get())));
|
| + thread->getWebTaskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(&decodeThreadMain, AllowCrossThreadAccess(m_generator.get()), AllowCrossThreadAccess(m_segmentReader.get())));
|
| thread.clear();
|
| EXPECT_EQ(2, m_decodeRequestCount);
|
| EXPECT_EQ(1, m_decodersDestroyed);
|
|
|
| // Decoder created again.
|
| - m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
|
| + m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4);
|
| EXPECT_EQ(3, m_decodeRequestCount);
|
|
|
| - addNewData(true);
|
| - data = m_generator->refEncodedData();
|
| - ASSERT_TRUE(data);
|
| - // To prevent data writting, SkData::unique() should be false.
|
| - ASSERT_TRUE(!data->unique());
|
| -
|
| - // Thread will also ref and unref the data.
|
| - thread = adoptPtr(Platform::current()->createThread("RefEncodedDataThread"));
|
| - thread->getWebTaskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(&decodeThreadWithRefEncodedMain, AllowCrossThreadAccess(m_generator.get())));
|
| - thread.clear();
|
| - EXPECT_EQ(4, m_decodeRequestCount);
|
| -
|
| - data->unref();
|
| - // m_generator is holding the only reference to SkData now.
|
| - ASSERT_TRUE(data->unique());
|
| -
|
| - data = m_generator->refEncodedData();
|
| - ASSERT_TRUE(data && !data->unique());
|
| + addNewData();
|
|
|
| - // Delete generator, and SkData should have the only reference.
|
| + // Delete generator.
|
| m_generator = nullptr;
|
| - ASSERT_TRUE(data->unique());
|
| - data->unref();
|
| }
|
|
|
| TEST_F(ImageFrameGeneratorTest, frameHasAlpha)
|
| @@ -237,7 +205,7 @@ TEST_F(ImageFrameGeneratorTest, frameHasAlpha)
|
| setFrameStatus(ImageFrame::FramePartial);
|
|
|
| char buffer[100 * 100 * 4];
|
| - m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
|
| + m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4);
|
| EXPECT_TRUE(m_generator->hasAlpha(0));
|
| EXPECT_EQ(1, m_decodeRequestCount);
|
|
|
| @@ -249,7 +217,7 @@ TEST_F(ImageFrameGeneratorTest, frameHasAlpha)
|
| EXPECT_EQ(2, m_decodeRequestCount);
|
|
|
| setFrameStatus(ImageFrame::FrameComplete);
|
| - m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
|
| + m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4);
|
| EXPECT_EQ(3, m_decodeRequestCount);
|
| EXPECT_FALSE(m_generator->hasAlpha(0));
|
| }
|
| @@ -260,14 +228,14 @@ TEST_F(ImageFrameGeneratorTest, clearMultiFrameDecoder)
|
| setFrameStatus(ImageFrame::FrameComplete);
|
|
|
| char buffer[100 * 100 * 4];
|
| - m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
|
| + m_generator->decodeAndScale(m_segmentReader.get(), true, 0, imageInfo(), buffer, 100 * 4);
|
| EXPECT_EQ(1, m_decodeRequestCount);
|
| EXPECT_EQ(0, m_decodersDestroyed);
|
| EXPECT_EQ(0U, m_requestedClearExceptFrame);
|
|
|
| setFrameStatus(ImageFrame::FrameComplete);
|
|
|
| - m_generator->decodeAndScale(1, imageInfo(), buffer, 100 * 4);
|
| + m_generator->decodeAndScale(m_segmentReader.get(), true, 1, imageInfo(), buffer, 100 * 4);
|
| EXPECT_EQ(2, m_decodeRequestCount);
|
| EXPECT_EQ(0, m_decodersDestroyed);
|
| EXPECT_EQ(1U, m_requestedClearExceptFrame);
|
| @@ -277,7 +245,7 @@ TEST_F(ImageFrameGeneratorTest, clearMultiFrameDecoder)
|
| // Decoding the last frame of a multi-frame images should trigger clearing
|
| // all the frame data, but not destroying the decoder. See comments in
|
| // ImageFrameGenerator::tryToResumeDecode().
|
| - m_generator->decodeAndScale(2, imageInfo(), buffer, 100 * 4);
|
| + m_generator->decodeAndScale(m_segmentReader.get(), true, 2, imageInfo(), buffer, 100 * 4);
|
| EXPECT_EQ(3, m_decodeRequestCount);
|
| EXPECT_EQ(0, m_decodersDestroyed);
|
| EXPECT_EQ(kNotFound, m_requestedClearExceptFrame);
|
|
|