Index: third_party/WebKit/Source/core/loader/resource/ImageResourceTest.cpp |
diff --git a/third_party/WebKit/Source/core/loader/resource/ImageResourceTest.cpp b/third_party/WebKit/Source/core/loader/resource/ImageResourceTest.cpp |
index d3a651d84589bef2aec65c93ac72ff6a8a573272..2fd9e7a7bc0f57121cb50e16295736b195443738 100644 |
--- a/third_party/WebKit/Source/core/loader/resource/ImageResourceTest.cpp |
+++ b/third_party/WebKit/Source/core/loader/resource/ImageResourceTest.cpp |
@@ -142,8 +142,6 @@ constexpr unsigned char kJpegImage2[] = { |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xd9}; |
-constexpr int kJpegImage2Width = 50; |
- |
constexpr char kSvgImage[] = |
"<svg width=\"200\" height=\"200\" xmlns=\"http://www.w3.org/2000/svg\" " |
"xmlns:xlink=\"http://www.w3.org/1999/xlink\">" |
@@ -176,6 +174,64 @@ void receiveResponse(ImageResource* imageResource, |
imageResource->finish(); |
} |
+void testThatReloadIsStartedThenServeReload(const KURL& testURL, |
+ ImageResource* imageResource, |
+ ImageResourceContent* content, |
+ MockImageResourceObserver* observer, |
+ WebCachePolicy policyForReload) { |
+ const char* data = reinterpret_cast<const char*>(kJpegImage2); |
+ constexpr size_t dataLength = sizeof(kJpegImage2); |
+ constexpr int imageWidth = 50; |
+ constexpr int imageHeight = 50; |
+ |
+ // Checks that |imageResource| and |content| are ready for non-placeholder |
+ // reloading. |
+ EXPECT_EQ(ResourceStatus::Pending, imageResource->getStatus()); |
+ EXPECT_FALSE(imageResource->resourceBuffer()); |
+ EXPECT_FALSE(imageResource->isPlaceholder()); |
+ EXPECT_EQ(nullAtom, |
+ imageResource->resourceRequest().httpHeaderField("range")); |
+ EXPECT_EQ(policyForReload, imageResource->resourceRequest().getCachePolicy()); |
+ EXPECT_EQ(content, imageResource->getContent()); |
+ EXPECT_FALSE(content->hasImage()); |
+ |
+ // Checks |observer| before reloading. |
+ const int originalImageChangedCount = observer->imageChangedCount(); |
+ const bool alreadyNotifiedFinish = observer->imageNotifyFinishedCalled(); |
+ const int imageWidthOnImageNotifyFinished = |
+ observer->imageWidthOnImageNotifyFinished(); |
+ ASSERT_NE(imageWidth, imageWidthOnImageNotifyFinished); |
+ |
+ // Does Reload. |
+ imageResource->loader()->didReceiveResponse(WrappedResourceResponse( |
+ ResourceResponse(testURL, "image/jpeg", dataLength, nullAtom))); |
+ imageResource->loader()->didReceiveData(data, dataLength); |
+ imageResource->loader()->didFinishLoading(0.0, dataLength, dataLength); |
+ |
+ // Checks |imageResource|'s status after reloading. |
+ EXPECT_EQ(ResourceStatus::Cached, imageResource->getStatus()); |
+ EXPECT_FALSE(imageResource->errorOccurred()); |
+ EXPECT_EQ(dataLength, imageResource->encodedSize()); |
+ |
+ // Checks |observer| after reloading that it is notified of updates/finish. |
+ EXPECT_LT(originalImageChangedCount, observer->imageChangedCount()); |
+ EXPECT_EQ(imageWidth, observer->imageWidthOnLastImageChanged()); |
+ EXPECT_TRUE(observer->imageNotifyFinishedCalled()); |
+ if (!alreadyNotifiedFinish) { |
+ // If imageNotifyFinished() has not been called before the reloaded |
+ // response is served, then imageNotifyFinished() should be called with |
+ // the new image (of width |imageWidth|). |
+ EXPECT_EQ(imageWidth, observer->imageWidthOnImageNotifyFinished()); |
+ } |
+ |
+ // Checks |content| receives the correct image. |
+ EXPECT_TRUE(content->hasImage()); |
+ EXPECT_FALSE(content->getImage()->isNull()); |
+ EXPECT_EQ(imageWidth, content->getImage()->width()); |
+ EXPECT_EQ(imageHeight, content->getImage()->height()); |
+ EXPECT_TRUE(content->getImage()->isBitmapImage()); |
+} |
+ |
AtomicString buildContentRange(size_t rangeLength, size_t totalLength) { |
return AtomicString(String("bytes 0-" + String::number(rangeLength - 1) + |
"/" + String::number(totalLength))); |
@@ -398,30 +454,11 @@ TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderAfterFinished) { |
// Call reloadIfLoFiOrPlaceholderImage() after the image has finished loading. |
imageResource->reloadIfLoFiOrPlaceholderImage(fetcher, |
Resource::kReloadAlways); |
- EXPECT_FALSE(imageResource->errorOccurred()); |
- EXPECT_FALSE(imageResource->resourceBuffer()); |
- EXPECT_FALSE(imageResource->getContent()->hasImage()); |
- EXPECT_EQ(3, observer->imageChangedCount()); |
- EXPECT_TRUE(observer->imageNotifyFinishedCalled()); |
- |
- imageResource->loader()->didReceiveResponse( |
- WrappedResourceResponse(resourceResponse), nullptr); |
- imageResource->loader()->didReceiveData( |
- reinterpret_cast<const char*>(kJpegImage2), sizeof(kJpegImage2)); |
- imageResource->loader()->didFinishLoading(0.0, sizeof(kJpegImage2), |
- sizeof(kJpegImage2)); |
- EXPECT_FALSE(imageResource->errorOccurred()); |
- ASSERT_TRUE(imageResource->getContent()->hasImage()); |
- EXPECT_FALSE(imageResource->getContent()->getImage()->isNull()); |
- EXPECT_EQ(kJpegImage2Width, observer->imageWidthOnLastImageChanged()); |
- EXPECT_TRUE(observer->imageNotifyFinishedCalled()); |
- |
- // The observer should not have been notified of completion again. |
- EXPECT_EQ(kJpegImageWidth, observer->imageWidthOnImageNotifyFinished()); |
- EXPECT_TRUE(imageResource->getContent()->getImage()->isBitmapImage()); |
- EXPECT_EQ(50, imageResource->getContent()->getImage()->width()); |
- EXPECT_EQ(50, imageResource->getContent()->getImage()->height()); |
+ EXPECT_EQ(3, observer->imageChangedCount()); |
+ testThatReloadIsStartedThenServeReload( |
+ testURL, imageResource, imageResource->getContent(), observer.get(), |
+ WebCachePolicy::BypassingCache); |
} |
TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderViaResourceFetcher) { |
@@ -452,34 +489,16 @@ TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderViaResourceFetcher) { |
imageResource->loader()->didFinishLoading(0.0, sizeof(kJpegImage), |
sizeof(kJpegImage)); |
+ EXPECT_TRUE(observer->imageNotifyFinishedCalled()); |
EXPECT_EQ(imageResource, fetcher->cachedResource(testURL)); |
fetcher->reloadLoFiImages(); |
- EXPECT_FALSE(imageResource->errorOccurred()); |
- EXPECT_FALSE(imageResource->resourceBuffer()); |
- EXPECT_FALSE(imageResource->getContent()->hasImage()); |
EXPECT_EQ(3, observer->imageChangedCount()); |
- EXPECT_TRUE(observer->imageNotifyFinishedCalled()); |
- imageResource->loader()->didReceiveResponse( |
- WrappedResourceResponse(resourceResponse), nullptr); |
- imageResource->loader()->didReceiveData( |
- reinterpret_cast<const char*>(kJpegImage2), sizeof(kJpegImage2)); |
- imageResource->loader()->didFinishLoading(0.0, sizeof(kJpegImage2), |
- sizeof(kJpegImage2)); |
- EXPECT_FALSE(imageResource->errorOccurred()); |
- ASSERT_TRUE(imageResource->getContent()->hasImage()); |
- EXPECT_FALSE(imageResource->getContent()->getImage()->isNull()); |
- EXPECT_EQ(kJpegImage2Width, observer->imageWidthOnLastImageChanged()); |
- EXPECT_TRUE(observer->imageNotifyFinishedCalled()); |
- |
- // The observer should not have been notified of completion again. |
- EXPECT_EQ(kJpegImageWidth, observer->imageWidthOnImageNotifyFinished()); |
- |
- EXPECT_TRUE(imageResource->getContent()->getImage()->isBitmapImage()); |
- EXPECT_EQ(50, imageResource->getContent()->getImage()->width()); |
- EXPECT_EQ(50, imageResource->getContent()->getImage()->height()); |
+ testThatReloadIsStartedThenServeReload(testURL, imageResource, content, |
+ observer.get(), |
+ WebCachePolicy::BypassingCache); |
memoryCache()->remove(imageResource); |
} |
@@ -520,36 +539,16 @@ TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderDuringFetch) { |
// Call reloadIfLoFiOrPlaceholderImage() while the image is still loading. |
imageResource->reloadIfLoFiOrPlaceholderImage(fetcher, |
Resource::kReloadAlways); |
- EXPECT_FALSE(imageResource->errorOccurred()); |
- EXPECT_FALSE(imageResource->resourceBuffer()); |
- EXPECT_FALSE(imageResource->getContent()->hasImage()); |
+ |
EXPECT_EQ(2, observer->imageChangedCount()); |
EXPECT_EQ(0, observer->imageWidthOnLastImageChanged()); |
// The observer should not have been notified of completion yet, since the |
- // image |
- // is still loading. |
+ // image is still loading. |
EXPECT_FALSE(observer->imageNotifyFinishedCalled()); |
- imageResource->loader()->didReceiveResponse( |
- WrappedResourceResponse(ResourceResponse(testURL, "image/jpeg", |
- sizeof(kJpegImage2), nullAtom)), |
- nullptr); |
- imageResource->loader()->didReceiveData( |
- reinterpret_cast<const char*>(kJpegImage2), sizeof(kJpegImage2)); |
- imageResource->loader()->didFinishLoading(0.0, sizeof(kJpegImage2), |
- sizeof(kJpegImage2)); |
- |
- EXPECT_FALSE(imageResource->errorOccurred()); |
- ASSERT_TRUE(imageResource->getContent()->hasImage()); |
- EXPECT_FALSE(imageResource->getContent()->getImage()->isNull()); |
- EXPECT_EQ(kJpegImage2Width, observer->imageWidthOnLastImageChanged()); |
- // The observer should have been notified of completion only after the reload |
- // completed. |
- EXPECT_TRUE(observer->imageNotifyFinishedCalled()); |
- EXPECT_EQ(kJpegImage2Width, observer->imageWidthOnImageNotifyFinished()); |
- EXPECT_TRUE(imageResource->getContent()->getImage()->isBitmapImage()); |
- EXPECT_EQ(50, imageResource->getContent()->getImage()->width()); |
- EXPECT_EQ(50, imageResource->getContent()->getImage()->height()); |
+ testThatReloadIsStartedThenServeReload( |
+ testURL, imageResource, imageResource->getContent(), observer.get(), |
+ WebCachePolicy::BypassingCache); |
} |
TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderForPlaceholder) { |
@@ -584,19 +583,14 @@ TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderForPlaceholder) { |
EXPECT_EQ(ResourceStatus::Cached, imageResource->getStatus()); |
EXPECT_TRUE(imageResource->isPlaceholder()); |
+ EXPECT_TRUE(observer->imageNotifyFinishedCalled()); |
imageResource->reloadIfLoFiOrPlaceholderImage(fetcher, |
Resource::kReloadAlways); |
- EXPECT_EQ(ResourceStatus::Pending, imageResource->getStatus()); |
- EXPECT_FALSE(imageResource->isPlaceholder()); |
- EXPECT_EQ(nullAtom, |
- imageResource->resourceRequest().httpHeaderField("range")); |
- EXPECT_EQ( |
- static_cast<int>(WebCachePolicy::BypassingCache), |
- static_cast<int>(imageResource->resourceRequest().getCachePolicy())); |
- |
- imageResource->loader()->cancel(); |
+ testThatReloadIsStartedThenServeReload( |
+ testURL, imageResource, imageResource->getContent(), observer.get(), |
+ WebCachePolicy::BypassingCache); |
} |
TEST(ImageResourceTest, SVGImage) { |
@@ -1121,35 +1115,12 @@ TEST(ImageResourceTest, FetchAllowPlaceholderUnsuccessful) { |
// The dimensions could not be extracted, so the full original image should be |
// loading. |
- EXPECT_EQ(ResourceStatus::Pending, imageResource->getStatus()); |
- EXPECT_FALSE(imageResource->isPlaceholder()); |
- EXPECT_EQ(nullAtom, |
- imageResource->resourceRequest().httpHeaderField("range")); |
- EXPECT_EQ( |
- static_cast<int>(WebCachePolicy::BypassingCache), |
- static_cast<int>(imageResource->resourceRequest().getCachePolicy())); |
EXPECT_FALSE(observer->imageNotifyFinishedCalled()); |
EXPECT_EQ(3, observer->imageChangedCount()); |
- imageResource->loader()->didReceiveResponse(WrappedResourceResponse( |
- ResourceResponse(testURL, "image/jpeg", sizeof(kJpegImage), nullAtom))); |
- imageResource->loader()->didReceiveData( |
- reinterpret_cast<const char*>(kJpegImage), sizeof(kJpegImage)); |
- imageResource->loader()->didFinishLoading(0.0, sizeof(kJpegImage), |
- sizeof(kJpegImage)); |
- |
- EXPECT_EQ(ResourceStatus::Cached, imageResource->getStatus()); |
- EXPECT_EQ(sizeof(kJpegImage), imageResource->encodedSize()); |
- EXPECT_FALSE(imageResource->isPlaceholder()); |
- EXPECT_LT(3, observer->imageChangedCount()); |
- EXPECT_EQ(kJpegImageWidth, observer->imageWidthOnLastImageChanged()); |
- EXPECT_TRUE(observer->imageNotifyFinishedCalled()); |
- EXPECT_EQ(kJpegImageWidth, observer->imageWidthOnImageNotifyFinished()); |
- |
- ASSERT_TRUE(imageResource->getContent()->hasImage()); |
- EXPECT_EQ(1, imageResource->getContent()->getImage()->width()); |
- EXPECT_EQ(1, imageResource->getContent()->getImage()->height()); |
- EXPECT_TRUE(imageResource->getContent()->getImage()->isBitmapImage()); |
+ testThatReloadIsStartedThenServeReload( |
+ testURL, imageResource, imageResource->getContent(), observer.get(), |
+ WebCachePolicy::BypassingCache); |
} |
TEST(ImageResourceTest, FetchAllowPlaceholderPartialContentWithoutDimensions) { |
@@ -1190,37 +1161,12 @@ TEST(ImageResourceTest, FetchAllowPlaceholderPartialContentWithoutDimensions) { |
0.0, kJpegImageSubrangeWithoutDimensionsLength, |
kJpegImageSubrangeWithoutDimensionsLength); |
- // Decode error didn't occur but the dimensions could not be extracted, |
- // so the full original image should be loading. |
- EXPECT_EQ(ResourceStatus::Pending, imageResource->getStatus()); |
- EXPECT_FALSE(imageResource->isPlaceholder()); |
- EXPECT_EQ(nullAtom, |
- imageResource->resourceRequest().httpHeaderField("range")); |
- EXPECT_EQ( |
- static_cast<int>(WebCachePolicy::BypassingCache), |
- static_cast<int>(imageResource->resourceRequest().getCachePolicy())); |
EXPECT_FALSE(observer->imageNotifyFinishedCalled()); |
EXPECT_EQ(2, observer->imageChangedCount()); |
- imageResource->loader()->didReceiveResponse(WrappedResourceResponse( |
- ResourceResponse(testURL, "image/jpeg", sizeof(kJpegImage), nullAtom))); |
- imageResource->loader()->didReceiveData( |
- reinterpret_cast<const char*>(kJpegImage), sizeof(kJpegImage)); |
- imageResource->loader()->didFinishLoading(0.0, sizeof(kJpegImage), |
- sizeof(kJpegImage)); |
- |
- EXPECT_EQ(ResourceStatus::Cached, imageResource->getStatus()); |
- EXPECT_EQ(sizeof(kJpegImage), imageResource->encodedSize()); |
- EXPECT_FALSE(imageResource->isPlaceholder()); |
- EXPECT_LT(0, observer->imageChangedCount()); |
- EXPECT_EQ(kJpegImageWidth, observer->imageWidthOnLastImageChanged()); |
- EXPECT_TRUE(observer->imageNotifyFinishedCalled()); |
- EXPECT_EQ(kJpegImageWidth, observer->imageWidthOnImageNotifyFinished()); |
- |
- ASSERT_TRUE(imageResource->getContent()->hasImage()); |
- EXPECT_EQ(1, imageResource->getContent()->getImage()->width()); |
- EXPECT_EQ(1, imageResource->getContent()->getImage()->height()); |
- EXPECT_TRUE(imageResource->getContent()->getImage()->isBitmapImage()); |
+ testThatReloadIsStartedThenServeReload( |
+ testURL, imageResource, imageResource->getContent(), observer.get(), |
+ WebCachePolicy::BypassingCache); |
} |
TEST(ImageResourceTest, FetchAllowPlaceholderThenDisallowPlaceholder) { |
@@ -1238,17 +1184,13 @@ TEST(ImageResourceTest, FetchAllowPlaceholderThenDisallowPlaceholder) { |
FetchRequest nonPlaceholderRequest(testURL, FetchInitiatorInfo()); |
ImageResource* secondImageResource = |
ImageResource::fetch(nonPlaceholderRequest, fetcher); |
+ |
EXPECT_EQ(imageResource, secondImageResource); |
- EXPECT_EQ(ResourceStatus::Pending, imageResource->getStatus()); |
- EXPECT_FALSE(imageResource->isPlaceholder()); |
- EXPECT_EQ(nullAtom, |
- imageResource->resourceRequest().httpHeaderField("range")); |
- EXPECT_EQ( |
- static_cast<int>(WebCachePolicy::UseProtocolCachePolicy), |
- static_cast<int>(imageResource->resourceRequest().getCachePolicy())); |
EXPECT_FALSE(observer->imageNotifyFinishedCalled()); |
- imageResource->loader()->cancel(); |
+ testThatReloadIsStartedThenServeReload( |
+ testURL, imageResource, imageResource->getContent(), observer.get(), |
+ WebCachePolicy::UseProtocolCachePolicy); |
} |
TEST(ImageResourceTest, |
@@ -1290,15 +1232,10 @@ TEST(ImageResourceTest, |
ImageResource* secondImageResource = |
ImageResource::fetch(nonPlaceholderRequest, fetcher); |
EXPECT_EQ(imageResource, secondImageResource); |
- EXPECT_EQ(ResourceStatus::Pending, imageResource->getStatus()); |
- EXPECT_FALSE(imageResource->isPlaceholder()); |
- EXPECT_EQ(nullAtom, |
- imageResource->resourceRequest().httpHeaderField("range")); |
- EXPECT_EQ( |
- static_cast<int>(WebCachePolicy::UseProtocolCachePolicy), |
- static_cast<int>(imageResource->resourceRequest().getCachePolicy())); |
- imageResource->loader()->cancel(); |
+ testThatReloadIsStartedThenServeReload( |
+ testURL, imageResource, imageResource->getContent(), observer.get(), |
+ WebCachePolicy::UseProtocolCachePolicy); |
} |
TEST(ImageResourceTest, FetchAllowPlaceholderFullResponseDecodeSuccess) { |
@@ -1425,36 +1362,13 @@ TEST(ImageResourceTest, |
imageResource->loader()->didReceiveData(kBadImageData, |
sizeof(kBadImageData)); |
- // The dimensions could not be extracted, and the response code was a 4xx |
- // error, so the full original image should be loading. |
- EXPECT_EQ(ResourceStatus::Pending, imageResource->getStatus()); |
- EXPECT_FALSE(imageResource->isPlaceholder()); |
- EXPECT_EQ(nullAtom, |
- imageResource->resourceRequest().httpHeaderField("range")); |
- EXPECT_EQ( |
- static_cast<int>(WebCachePolicy::BypassingCache), |
- static_cast<int>(imageResource->resourceRequest().getCachePolicy())); |
EXPECT_FALSE(observer->imageNotifyFinishedCalled()); |
- imageResource->loader()->didReceiveResponse(WrappedResourceResponse( |
- ResourceResponse(testURL, "image/jpeg", sizeof(kJpegImage), nullAtom))); |
- imageResource->loader()->didReceiveData( |
- reinterpret_cast<const char*>(kJpegImage), sizeof(kJpegImage)); |
- imageResource->loader()->didFinishLoading(0.0, sizeof(kJpegImage), |
- sizeof(kJpegImage)); |
- |
- EXPECT_EQ(ResourceStatus::Cached, imageResource->getStatus()); |
- EXPECT_EQ(sizeof(kJpegImage), imageResource->encodedSize()); |
- EXPECT_FALSE(imageResource->isPlaceholder()); |
- EXPECT_LT(0, observer->imageChangedCount()); |
- EXPECT_EQ(kJpegImageWidth, observer->imageWidthOnLastImageChanged()); |
- EXPECT_TRUE(observer->imageNotifyFinishedCalled()); |
- EXPECT_EQ(kJpegImageWidth, observer->imageWidthOnImageNotifyFinished()); |
- |
- ASSERT_TRUE(imageResource->getContent()->hasImage()); |
- EXPECT_EQ(1, imageResource->getContent()->getImage()->width()); |
- EXPECT_EQ(1, imageResource->getContent()->getImage()->height()); |
- EXPECT_TRUE(imageResource->getContent()->getImage()->isBitmapImage()); |
+ // The dimensions could not be extracted, and the response code was a 4xx |
+ // error, so the full original image should be loading. |
+ testThatReloadIsStartedThenServeReload( |
+ testURL, imageResource, imageResource->getContent(), observer.get(), |
+ WebCachePolicy::BypassingCache); |
} |
} |