| 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 4b9d1b738a11b8854d9b389e9e0127a53c7899a6..aef5863c0a437377a4ace835bc339dcda54f06ad 100644
|
| --- a/third_party/WebKit/Source/platform/graphics/ImageFrameGeneratorTest.cpp
|
| +++ b/third_party/WebKit/Source/platform/graphics/ImageFrameGeneratorTest.cpp
|
| @@ -29,7 +29,6 @@
|
| #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"
|
| @@ -55,9 +54,8 @@
|
| void SetUp() override
|
| {
|
| ImageDecodingStore::instance().setCacheLimitInBytes(1024 * 1024);
|
| - m_generator = ImageFrameGenerator::create(fullSize(), false);
|
| m_data = SharedBuffer::create();
|
| - m_segmentReader = SegmentReader::createFromSharedBuffer(m_data);
|
| + m_generator = ImageFrameGenerator::create(fullSize(), m_data, false);
|
| useMockImageDecoderFactory();
|
| m_decodersDestroyed = 0;
|
| m_decodeRequestCount = 0;
|
| @@ -103,9 +101,10 @@
|
| m_generator->setImageDecoderFactory(MockImageDecoderFactory::create(this, fullSize()));
|
| }
|
|
|
| - void addNewData()
|
| + void addNewData(bool allDataReceived = false)
|
| {
|
| m_data->append("g", 1u);
|
| + m_generator->setData(m_data, allDataReceived);
|
| }
|
|
|
| void setFrameStatus(ImageFrame::Status status) { m_status = m_nextFrameStatus = status; }
|
| @@ -115,13 +114,12 @@
|
| m_frameCount = count;
|
| if (count > 1) {
|
| m_generator.clear();
|
| - m_generator = ImageFrameGenerator::create(fullSize(), true);
|
| + m_generator = ImageFrameGenerator::create(fullSize(), m_data, true, true);
|
| useMockImageDecoderFactory();
|
| }
|
| }
|
|
|
| RefPtr<SharedBuffer> m_data;
|
| - RefPtr<SegmentReader> m_segmentReader;
|
| RefPtr<ImageFrameGenerator> m_generator;
|
| int m_decodersDestroyed;
|
| int m_decodeRequestCount;
|
| @@ -136,11 +134,11 @@
|
| setFrameStatus(ImageFrame::FramePartial);
|
|
|
| char buffer[100 * 100 * 4];
|
| - m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4);
|
| + m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
|
| EXPECT_EQ(1, m_decodeRequestCount);
|
|
|
| addNewData();
|
| - m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4);
|
| + m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
|
| EXPECT_EQ(2, m_decodeRequestCount);
|
| EXPECT_EQ(0, m_decodersDestroyed);
|
| }
|
| @@ -150,26 +148,35 @@
|
| setFrameStatus(ImageFrame::FramePartial);
|
|
|
| char buffer[100 * 100 * 4];
|
| - m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4);
|
| + m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
|
| EXPECT_EQ(1, m_decodeRequestCount);
|
| EXPECT_EQ(0, m_decodersDestroyed);
|
|
|
| setFrameStatus(ImageFrame::FrameComplete);
|
| addNewData();
|
|
|
| - m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4);
|
| + m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
|
| EXPECT_EQ(2, m_decodeRequestCount);
|
| EXPECT_EQ(1, m_decodersDestroyed);
|
|
|
| // Decoder created again.
|
| - m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4);
|
| - EXPECT_EQ(3, m_decodeRequestCount);
|
| -}
|
| -
|
| -static void decodeThreadMain(ImageFrameGenerator* generator, SegmentReader* segmentReader)
|
| -{
|
| - char buffer[100 * 100 * 4];
|
| - generator->decodeAndScale(segmentReader, false, 0, imageInfo(), buffer, 100 * 4);
|
| + m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
|
| + EXPECT_EQ(3, m_decodeRequestCount);
|
| +}
|
| +
|
| +static void decodeThreadMain(ImageFrameGenerator* generator)
|
| +{
|
| + 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();
|
| }
|
|
|
| TEST_F(ImageFrameGeneratorTest, incompleteDecodeBecomesCompleteMultiThreaded)
|
| @@ -177,27 +184,52 @@
|
| setFrameStatus(ImageFrame::FramePartial);
|
|
|
| char buffer[100 * 100 * 4];
|
| - m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4);
|
| - EXPECT_EQ(1, m_decodeRequestCount);
|
| - EXPECT_EQ(0, m_decodersDestroyed);
|
| + m_generator->decodeAndScale(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()), AllowCrossThreadAccess(m_segmentReader.get())));
|
| + thread->getWebTaskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(&decodeThreadMain, AllowCrossThreadAccess(m_generator.get())));
|
| thread.clear();
|
| EXPECT_EQ(2, m_decodeRequestCount);
|
| EXPECT_EQ(1, m_decodersDestroyed);
|
|
|
| // Decoder created again.
|
| - m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4);
|
| - EXPECT_EQ(3, m_decodeRequestCount);
|
| -
|
| - addNewData();
|
| -
|
| - // Delete generator.
|
| + m_generator->decodeAndScale(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());
|
| +
|
| + // Delete generator, and SkData should have the only reference.
|
| m_generator = nullptr;
|
| + ASSERT_TRUE(data->unique());
|
| + data->unref();
|
| }
|
|
|
| TEST_F(ImageFrameGeneratorTest, frameHasAlpha)
|
| @@ -205,7 +237,7 @@
|
| setFrameStatus(ImageFrame::FramePartial);
|
|
|
| char buffer[100 * 100 * 4];
|
| - m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4);
|
| + m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
|
| EXPECT_TRUE(m_generator->hasAlpha(0));
|
| EXPECT_EQ(1, m_decodeRequestCount);
|
|
|
| @@ -217,7 +249,7 @@
|
| EXPECT_EQ(2, m_decodeRequestCount);
|
|
|
| setFrameStatus(ImageFrame::FrameComplete);
|
| - m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4);
|
| + m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
|
| EXPECT_EQ(3, m_decodeRequestCount);
|
| EXPECT_FALSE(m_generator->hasAlpha(0));
|
| }
|
| @@ -228,14 +260,14 @@
|
| setFrameStatus(ImageFrame::FrameComplete);
|
|
|
| char buffer[100 * 100 * 4];
|
| - m_generator->decodeAndScale(m_segmentReader.get(), true, 0, imageInfo(), buffer, 100 * 4);
|
| + m_generator->decodeAndScale(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(m_segmentReader.get(), true, 1, imageInfo(), buffer, 100 * 4);
|
| + m_generator->decodeAndScale(1, imageInfo(), buffer, 100 * 4);
|
| EXPECT_EQ(2, m_decodeRequestCount);
|
| EXPECT_EQ(0, m_decodersDestroyed);
|
| EXPECT_EQ(1U, m_requestedClearExceptFrame);
|
| @@ -245,7 +277,7 @@
|
| // 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(m_segmentReader.get(), true, 2, imageInfo(), buffer, 100 * 4);
|
| + m_generator->decodeAndScale(2, imageInfo(), buffer, 100 * 4);
|
| EXPECT_EQ(3, m_decodeRequestCount);
|
| EXPECT_EQ(0, m_decodersDestroyed);
|
| EXPECT_EQ(kNotFound, m_requestedClearExceptFrame);
|
|
|