| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 29 */ | 29 */ |
| 30 | 30 |
| 31 #include "platform/image-decoders/ImageDecoder.h" | 31 #include "platform/image-decoders/ImageDecoder.h" |
| 32 | 32 |
| 33 #include "platform/image-decoders/ImageFrame.h" | 33 #include "platform/image-decoders/ImageFrame.h" |
| 34 #include "testing/gtest/include/gtest/gtest.h" | 34 #include "testing/gtest/include/gtest/gtest.h" |
| 35 #include "wtf/OwnPtr.h" | 35 #include "wtf/PtrUtil.h" |
| 36 #include "wtf/PassOwnPtr.h" | |
| 37 #include "wtf/Vector.h" | 36 #include "wtf/Vector.h" |
| 37 #include <memory> |
| 38 | 38 |
| 39 namespace blink { | 39 namespace blink { |
| 40 | 40 |
| 41 class TestImageDecoder : public ImageDecoder { | 41 class TestImageDecoder : public ImageDecoder { |
| 42 public: | 42 public: |
| 43 TestImageDecoder() | 43 TestImageDecoder() |
| 44 : ImageDecoder(AlphaNotPremultiplied, GammaAndColorProfileApplied, noDec
odedImageByteLimit) | 44 : ImageDecoder(AlphaNotPremultiplied, GammaAndColorProfileApplied, noDec
odedImageByteLimit) |
| 45 { | 45 { |
| 46 } | 46 } |
| 47 | 47 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 66 m_frameBufferCache[i].setOriginalFrameRect(IntRect(0, 0, width, heig
ht)); | 66 m_frameBufferCache[i].setOriginalFrameRect(IntRect(0, 0, width, heig
ht)); |
| 67 } | 67 } |
| 68 | 68 |
| 69 private: | 69 private: |
| 70 void decodeSize() override { } | 70 void decodeSize() override { } |
| 71 void decode(size_t index) override { } | 71 void decode(size_t index) override { } |
| 72 }; | 72 }; |
| 73 | 73 |
| 74 TEST(ImageDecoderTest, sizeCalculationMayOverflow) | 74 TEST(ImageDecoderTest, sizeCalculationMayOverflow) |
| 75 { | 75 { |
| 76 OwnPtr<TestImageDecoder> decoder(adoptPtr(new TestImageDecoder())); | 76 std::unique_ptr<TestImageDecoder> decoder(wrapUnique(new TestImageDecoder())
); |
| 77 EXPECT_FALSE(decoder->setSize(1 << 29, 1)); | 77 EXPECT_FALSE(decoder->setSize(1 << 29, 1)); |
| 78 EXPECT_FALSE(decoder->setSize(1, 1 << 29)); | 78 EXPECT_FALSE(decoder->setSize(1, 1 << 29)); |
| 79 EXPECT_FALSE(decoder->setSize(1 << 15, 1 << 15)); | 79 EXPECT_FALSE(decoder->setSize(1 << 15, 1 << 15)); |
| 80 EXPECT_TRUE(decoder->setSize(1 << 28, 1)); | 80 EXPECT_TRUE(decoder->setSize(1 << 28, 1)); |
| 81 EXPECT_TRUE(decoder->setSize(1, 1 << 28)); | 81 EXPECT_TRUE(decoder->setSize(1, 1 << 28)); |
| 82 EXPECT_TRUE(decoder->setSize(1 << 14, 1 << 14)); | 82 EXPECT_TRUE(decoder->setSize(1 << 14, 1 << 14)); |
| 83 } | 83 } |
| 84 | 84 |
| 85 TEST(ImageDecoderTest, requiredPreviousFrameIndex) | 85 TEST(ImageDecoderTest, requiredPreviousFrameIndex) |
| 86 { | 86 { |
| 87 OwnPtr<TestImageDecoder> decoder(adoptPtr(new TestImageDecoder())); | 87 std::unique_ptr<TestImageDecoder> decoder(wrapUnique(new TestImageDecoder())
); |
| 88 decoder->initFrames(6); | 88 decoder->initFrames(6); |
| 89 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); | 89 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); |
| 90 | 90 |
| 91 frameBuffers[1].setDisposalMethod(ImageFrame::DisposeKeep); | 91 frameBuffers[1].setDisposalMethod(ImageFrame::DisposeKeep); |
| 92 frameBuffers[2].setDisposalMethod(ImageFrame::DisposeOverwritePrevious); | 92 frameBuffers[2].setDisposalMethod(ImageFrame::DisposeOverwritePrevious); |
| 93 frameBuffers[3].setDisposalMethod(ImageFrame::DisposeOverwritePrevious); | 93 frameBuffers[3].setDisposalMethod(ImageFrame::DisposeOverwritePrevious); |
| 94 frameBuffers[4].setDisposalMethod(ImageFrame::DisposeKeep); | 94 frameBuffers[4].setDisposalMethod(ImageFrame::DisposeKeep); |
| 95 | 95 |
| 96 decoder->resetRequiredPreviousFrames(); | 96 decoder->resetRequiredPreviousFrames(); |
| 97 | 97 |
| 98 // The first frame doesn't require any previous frame. | 98 // The first frame doesn't require any previous frame. |
| 99 EXPECT_EQ(kNotFound, frameBuffers[0].requiredPreviousFrameIndex()); | 99 EXPECT_EQ(kNotFound, frameBuffers[0].requiredPreviousFrameIndex()); |
| 100 // The previous DisposeNotSpecified frame is required. | 100 // The previous DisposeNotSpecified frame is required. |
| 101 EXPECT_EQ(0u, frameBuffers[1].requiredPreviousFrameIndex()); | 101 EXPECT_EQ(0u, frameBuffers[1].requiredPreviousFrameIndex()); |
| 102 // DisposeKeep is treated as DisposeNotSpecified. | 102 // DisposeKeep is treated as DisposeNotSpecified. |
| 103 EXPECT_EQ(1u, frameBuffers[2].requiredPreviousFrameIndex()); | 103 EXPECT_EQ(1u, frameBuffers[2].requiredPreviousFrameIndex()); |
| 104 // Previous DisposeOverwritePrevious frames are skipped. | 104 // Previous DisposeOverwritePrevious frames are skipped. |
| 105 EXPECT_EQ(1u, frameBuffers[3].requiredPreviousFrameIndex()); | 105 EXPECT_EQ(1u, frameBuffers[3].requiredPreviousFrameIndex()); |
| 106 EXPECT_EQ(1u, frameBuffers[4].requiredPreviousFrameIndex()); | 106 EXPECT_EQ(1u, frameBuffers[4].requiredPreviousFrameIndex()); |
| 107 EXPECT_EQ(4u, frameBuffers[5].requiredPreviousFrameIndex()); | 107 EXPECT_EQ(4u, frameBuffers[5].requiredPreviousFrameIndex()); |
| 108 } | 108 } |
| 109 | 109 |
| 110 TEST(ImageDecoderTest, requiredPreviousFrameIndexDisposeOverwriteBgcolor) | 110 TEST(ImageDecoderTest, requiredPreviousFrameIndexDisposeOverwriteBgcolor) |
| 111 { | 111 { |
| 112 OwnPtr<TestImageDecoder> decoder(adoptPtr(new TestImageDecoder())); | 112 std::unique_ptr<TestImageDecoder> decoder(wrapUnique(new TestImageDecoder())
); |
| 113 decoder->initFrames(3); | 113 decoder->initFrames(3); |
| 114 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); | 114 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); |
| 115 | 115 |
| 116 // Fully covering DisposeOverwriteBgcolor previous frame resets the starting
state. | 116 // Fully covering DisposeOverwriteBgcolor previous frame resets the starting
state. |
| 117 frameBuffers[1].setDisposalMethod(ImageFrame::DisposeOverwriteBgcolor); | 117 frameBuffers[1].setDisposalMethod(ImageFrame::DisposeOverwriteBgcolor); |
| 118 decoder->resetRequiredPreviousFrames(); | 118 decoder->resetRequiredPreviousFrames(); |
| 119 EXPECT_EQ(kNotFound, frameBuffers[2].requiredPreviousFrameIndex()); | 119 EXPECT_EQ(kNotFound, frameBuffers[2].requiredPreviousFrameIndex()); |
| 120 | 120 |
| 121 // Partially covering DisposeOverwriteBgcolor previous frame is required by
this frame. | 121 // Partially covering DisposeOverwriteBgcolor previous frame is required by
this frame. |
| 122 frameBuffers[1].setOriginalFrameRect(IntRect(50, 50, 50, 50)); | 122 frameBuffers[1].setOriginalFrameRect(IntRect(50, 50, 50, 50)); |
| 123 decoder->resetRequiredPreviousFrames(); | 123 decoder->resetRequiredPreviousFrames(); |
| 124 EXPECT_EQ(1u, frameBuffers[2].requiredPreviousFrameIndex()); | 124 EXPECT_EQ(1u, frameBuffers[2].requiredPreviousFrameIndex()); |
| 125 } | 125 } |
| 126 | 126 |
| 127 TEST(ImageDecoderTest, requiredPreviousFrameIndexForFrame1) | 127 TEST(ImageDecoderTest, requiredPreviousFrameIndexForFrame1) |
| 128 { | 128 { |
| 129 OwnPtr<TestImageDecoder> decoder(adoptPtr(new TestImageDecoder())); | 129 std::unique_ptr<TestImageDecoder> decoder(wrapUnique(new TestImageDecoder())
); |
| 130 decoder->initFrames(2); | 130 decoder->initFrames(2); |
| 131 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); | 131 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); |
| 132 | 132 |
| 133 decoder->resetRequiredPreviousFrames(); | 133 decoder->resetRequiredPreviousFrames(); |
| 134 EXPECT_EQ(0u, frameBuffers[1].requiredPreviousFrameIndex()); | 134 EXPECT_EQ(0u, frameBuffers[1].requiredPreviousFrameIndex()); |
| 135 | 135 |
| 136 // The first frame with DisposeOverwritePrevious or DisposeOverwriteBgcolor | 136 // The first frame with DisposeOverwritePrevious or DisposeOverwriteBgcolor |
| 137 // resets the starting state. | 137 // resets the starting state. |
| 138 frameBuffers[0].setDisposalMethod(ImageFrame::DisposeOverwritePrevious); | 138 frameBuffers[0].setDisposalMethod(ImageFrame::DisposeOverwritePrevious); |
| 139 decoder->resetRequiredPreviousFrames(); | 139 decoder->resetRequiredPreviousFrames(); |
| 140 EXPECT_EQ(kNotFound, frameBuffers[1].requiredPreviousFrameIndex()); | 140 EXPECT_EQ(kNotFound, frameBuffers[1].requiredPreviousFrameIndex()); |
| 141 frameBuffers[0].setDisposalMethod(ImageFrame::DisposeOverwriteBgcolor); | 141 frameBuffers[0].setDisposalMethod(ImageFrame::DisposeOverwriteBgcolor); |
| 142 decoder->resetRequiredPreviousFrames(); | 142 decoder->resetRequiredPreviousFrames(); |
| 143 EXPECT_EQ(kNotFound, frameBuffers[1].requiredPreviousFrameIndex()); | 143 EXPECT_EQ(kNotFound, frameBuffers[1].requiredPreviousFrameIndex()); |
| 144 | 144 |
| 145 // ... even if it partially covers. | 145 // ... even if it partially covers. |
| 146 frameBuffers[0].setOriginalFrameRect(IntRect(50, 50, 50, 50)); | 146 frameBuffers[0].setOriginalFrameRect(IntRect(50, 50, 50, 50)); |
| 147 | 147 |
| 148 frameBuffers[0].setDisposalMethod(ImageFrame::DisposeOverwritePrevious); | 148 frameBuffers[0].setDisposalMethod(ImageFrame::DisposeOverwritePrevious); |
| 149 decoder->resetRequiredPreviousFrames(); | 149 decoder->resetRequiredPreviousFrames(); |
| 150 EXPECT_EQ(kNotFound, frameBuffers[1].requiredPreviousFrameIndex()); | 150 EXPECT_EQ(kNotFound, frameBuffers[1].requiredPreviousFrameIndex()); |
| 151 frameBuffers[0].setDisposalMethod(ImageFrame::DisposeOverwriteBgcolor); | 151 frameBuffers[0].setDisposalMethod(ImageFrame::DisposeOverwriteBgcolor); |
| 152 decoder->resetRequiredPreviousFrames(); | 152 decoder->resetRequiredPreviousFrames(); |
| 153 EXPECT_EQ(kNotFound, frameBuffers[1].requiredPreviousFrameIndex()); | 153 EXPECT_EQ(kNotFound, frameBuffers[1].requiredPreviousFrameIndex()); |
| 154 } | 154 } |
| 155 | 155 |
| 156 TEST(ImageDecoderTest, requiredPreviousFrameIndexBlendAtopBgcolor) | 156 TEST(ImageDecoderTest, requiredPreviousFrameIndexBlendAtopBgcolor) |
| 157 { | 157 { |
| 158 OwnPtr<TestImageDecoder> decoder(adoptPtr(new TestImageDecoder())); | 158 std::unique_ptr<TestImageDecoder> decoder(wrapUnique(new TestImageDecoder())
); |
| 159 decoder->initFrames(3); | 159 decoder->initFrames(3); |
| 160 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); | 160 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); |
| 161 | 161 |
| 162 frameBuffers[1].setOriginalFrameRect(IntRect(25, 25, 50, 50)); | 162 frameBuffers[1].setOriginalFrameRect(IntRect(25, 25, 50, 50)); |
| 163 frameBuffers[2].setAlphaBlendSource(ImageFrame::BlendAtopBgcolor); | 163 frameBuffers[2].setAlphaBlendSource(ImageFrame::BlendAtopBgcolor); |
| 164 | 164 |
| 165 // A full frame with 'blending method == BlendAtopBgcolor' doesn't depend on
any prior frames. | 165 // A full frame with 'blending method == BlendAtopBgcolor' doesn't depend on
any prior frames. |
| 166 for (int disposeMethod = ImageFrame::DisposeNotSpecified; disposeMethod <= I
mageFrame::DisposeOverwritePrevious; ++disposeMethod) { | 166 for (int disposeMethod = ImageFrame::DisposeNotSpecified; disposeMethod <= I
mageFrame::DisposeOverwritePrevious; ++disposeMethod) { |
| 167 frameBuffers[1].setDisposalMethod(static_cast<ImageFrame::DisposalMethod
>(disposeMethod)); | 167 frameBuffers[1].setDisposalMethod(static_cast<ImageFrame::DisposalMethod
>(disposeMethod)); |
| 168 decoder->resetRequiredPreviousFrames(); | 168 decoder->resetRequiredPreviousFrames(); |
| 169 EXPECT_EQ(kNotFound, frameBuffers[2].requiredPreviousFrameIndex()); | 169 EXPECT_EQ(kNotFound, frameBuffers[2].requiredPreviousFrameIndex()); |
| 170 } | 170 } |
| 171 | 171 |
| 172 // A non-full frame with 'blending method == BlendAtopBgcolor' does depend o
n a prior frame. | 172 // A non-full frame with 'blending method == BlendAtopBgcolor' does depend o
n a prior frame. |
| 173 frameBuffers[2].setOriginalFrameRect(IntRect(50, 50, 50, 50)); | 173 frameBuffers[2].setOriginalFrameRect(IntRect(50, 50, 50, 50)); |
| 174 for (int disposeMethod = ImageFrame::DisposeNotSpecified; disposeMethod <= I
mageFrame::DisposeOverwritePrevious; ++disposeMethod) { | 174 for (int disposeMethod = ImageFrame::DisposeNotSpecified; disposeMethod <= I
mageFrame::DisposeOverwritePrevious; ++disposeMethod) { |
| 175 frameBuffers[1].setDisposalMethod(static_cast<ImageFrame::DisposalMethod
>(disposeMethod)); | 175 frameBuffers[1].setDisposalMethod(static_cast<ImageFrame::DisposalMethod
>(disposeMethod)); |
| 176 decoder->resetRequiredPreviousFrames(); | 176 decoder->resetRequiredPreviousFrames(); |
| 177 EXPECT_NE(kNotFound, frameBuffers[2].requiredPreviousFrameIndex()); | 177 EXPECT_NE(kNotFound, frameBuffers[2].requiredPreviousFrameIndex()); |
| 178 } | 178 } |
| 179 } | 179 } |
| 180 | 180 |
| 181 TEST(ImageDecoderTest, requiredPreviousFrameIndexKnownOpaque) | 181 TEST(ImageDecoderTest, requiredPreviousFrameIndexKnownOpaque) |
| 182 { | 182 { |
| 183 OwnPtr<TestImageDecoder> decoder(adoptPtr(new TestImageDecoder())); | 183 std::unique_ptr<TestImageDecoder> decoder(wrapUnique(new TestImageDecoder())
); |
| 184 decoder->initFrames(3); | 184 decoder->initFrames(3); |
| 185 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); | 185 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); |
| 186 | 186 |
| 187 frameBuffers[1].setOriginalFrameRect(IntRect(25, 25, 50, 50)); | 187 frameBuffers[1].setOriginalFrameRect(IntRect(25, 25, 50, 50)); |
| 188 | 188 |
| 189 // A full frame that is known to be opaque doesn't depend on any prior frame
s. | 189 // A full frame that is known to be opaque doesn't depend on any prior frame
s. |
| 190 for (int disposeMethod = ImageFrame::DisposeNotSpecified; disposeMethod <= I
mageFrame::DisposeOverwritePrevious; ++disposeMethod) { | 190 for (int disposeMethod = ImageFrame::DisposeNotSpecified; disposeMethod <= I
mageFrame::DisposeOverwritePrevious; ++disposeMethod) { |
| 191 frameBuffers[1].setDisposalMethod(static_cast<ImageFrame::DisposalMethod
>(disposeMethod)); | 191 frameBuffers[1].setDisposalMethod(static_cast<ImageFrame::DisposalMethod
>(disposeMethod)); |
| 192 decoder->resetRequiredPreviousFrames(true); | 192 decoder->resetRequiredPreviousFrames(true); |
| 193 EXPECT_EQ(kNotFound, frameBuffers[2].requiredPreviousFrameIndex()); | 193 EXPECT_EQ(kNotFound, frameBuffers[2].requiredPreviousFrameIndex()); |
| 194 } | 194 } |
| 195 | 195 |
| 196 // A non-full frame that is known to be opaque does depend on a prior frame. | 196 // A non-full frame that is known to be opaque does depend on a prior frame. |
| 197 frameBuffers[2].setOriginalFrameRect(IntRect(50, 50, 50, 50)); | 197 frameBuffers[2].setOriginalFrameRect(IntRect(50, 50, 50, 50)); |
| 198 for (int disposeMethod = ImageFrame::DisposeNotSpecified; disposeMethod <= I
mageFrame::DisposeOverwritePrevious; ++disposeMethod) { | 198 for (int disposeMethod = ImageFrame::DisposeNotSpecified; disposeMethod <= I
mageFrame::DisposeOverwritePrevious; ++disposeMethod) { |
| 199 frameBuffers[1].setDisposalMethod(static_cast<ImageFrame::DisposalMethod
>(disposeMethod)); | 199 frameBuffers[1].setDisposalMethod(static_cast<ImageFrame::DisposalMethod
>(disposeMethod)); |
| 200 decoder->resetRequiredPreviousFrames(true); | 200 decoder->resetRequiredPreviousFrames(true); |
| 201 EXPECT_NE(kNotFound, frameBuffers[2].requiredPreviousFrameIndex()); | 201 EXPECT_NE(kNotFound, frameBuffers[2].requiredPreviousFrameIndex()); |
| 202 } | 202 } |
| 203 } | 203 } |
| 204 | 204 |
| 205 TEST(ImageDecoderTest, clearCacheExceptFrameDoNothing) | 205 TEST(ImageDecoderTest, clearCacheExceptFrameDoNothing) |
| 206 { | 206 { |
| 207 OwnPtr<TestImageDecoder> decoder(adoptPtr(new TestImageDecoder())); | 207 std::unique_ptr<TestImageDecoder> decoder(wrapUnique(new TestImageDecoder())
); |
| 208 decoder->clearCacheExceptFrame(0); | 208 decoder->clearCacheExceptFrame(0); |
| 209 | 209 |
| 210 // This should not crash. | 210 // This should not crash. |
| 211 decoder->initFrames(20); | 211 decoder->initFrames(20); |
| 212 decoder->clearCacheExceptFrame(kNotFound); | 212 decoder->clearCacheExceptFrame(kNotFound); |
| 213 } | 213 } |
| 214 | 214 |
| 215 TEST(ImageDecoderTest, clearCacheExceptFrameAll) | 215 TEST(ImageDecoderTest, clearCacheExceptFrameAll) |
| 216 { | 216 { |
| 217 const size_t numFrames = 10; | 217 const size_t numFrames = 10; |
| 218 OwnPtr<TestImageDecoder> decoder(adoptPtr(new TestImageDecoder())); | 218 std::unique_ptr<TestImageDecoder> decoder(wrapUnique(new TestImageDecoder())
); |
| 219 decoder->initFrames(numFrames); | 219 decoder->initFrames(numFrames); |
| 220 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); | 220 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); |
| 221 for (size_t i = 0; i < numFrames; ++i) | 221 for (size_t i = 0; i < numFrames; ++i) |
| 222 frameBuffers[i].setStatus(i % 2 ? ImageFrame::FramePartial : ImageFrame:
:FrameComplete); | 222 frameBuffers[i].setStatus(i % 2 ? ImageFrame::FramePartial : ImageFrame:
:FrameComplete); |
| 223 | 223 |
| 224 decoder->clearCacheExceptFrame(kNotFound); | 224 decoder->clearCacheExceptFrame(kNotFound); |
| 225 | 225 |
| 226 for (size_t i = 0; i < numFrames; ++i) { | 226 for (size_t i = 0; i < numFrames; ++i) { |
| 227 SCOPED_TRACE(testing::Message() << i); | 227 SCOPED_TRACE(testing::Message() << i); |
| 228 EXPECT_EQ(ImageFrame::FrameEmpty, frameBuffers[i].getStatus()); | 228 EXPECT_EQ(ImageFrame::FrameEmpty, frameBuffers[i].getStatus()); |
| 229 } | 229 } |
| 230 } | 230 } |
| 231 | 231 |
| 232 TEST(ImageDecoderTest, clearCacheExceptFramePreverveClearExceptFrame) | 232 TEST(ImageDecoderTest, clearCacheExceptFramePreverveClearExceptFrame) |
| 233 { | 233 { |
| 234 const size_t numFrames = 10; | 234 const size_t numFrames = 10; |
| 235 OwnPtr<TestImageDecoder> decoder(adoptPtr(new TestImageDecoder())); | 235 std::unique_ptr<TestImageDecoder> decoder(wrapUnique(new TestImageDecoder())
); |
| 236 decoder->initFrames(numFrames); | 236 decoder->initFrames(numFrames); |
| 237 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); | 237 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); |
| 238 for (size_t i = 0; i < numFrames; ++i) | 238 for (size_t i = 0; i < numFrames; ++i) |
| 239 frameBuffers[i].setStatus(ImageFrame::FrameComplete); | 239 frameBuffers[i].setStatus(ImageFrame::FrameComplete); |
| 240 | 240 |
| 241 decoder->resetRequiredPreviousFrames(); | 241 decoder->resetRequiredPreviousFrames(); |
| 242 decoder->clearCacheExceptFrame(5); | 242 decoder->clearCacheExceptFrame(5); |
| 243 for (size_t i = 0; i < numFrames; ++i) { | 243 for (size_t i = 0; i < numFrames; ++i) { |
| 244 SCOPED_TRACE(testing::Message() << i); | 244 SCOPED_TRACE(testing::Message() << i); |
| 245 if (i == 5) | 245 if (i == 5) |
| 246 EXPECT_EQ(ImageFrame::FrameComplete, frameBuffers[i].getStatus()); | 246 EXPECT_EQ(ImageFrame::FrameComplete, frameBuffers[i].getStatus()); |
| 247 else | 247 else |
| 248 EXPECT_EQ(ImageFrame::FrameEmpty, frameBuffers[i].getStatus()); | 248 EXPECT_EQ(ImageFrame::FrameEmpty, frameBuffers[i].getStatus()); |
| 249 } | 249 } |
| 250 } | 250 } |
| 251 | 251 |
| 252 } // namespace blink | 252 } // namespace blink |
| OLD | NEW |