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 4e87f14100f19507812766336c81d512a47f11cd..00abd8a6a88fd29853511f74b5e85afc957e08df 100644 |
--- a/third_party/WebKit/Source/core/loader/resource/ImageResourceTest.cpp |
+++ b/third_party/WebKit/Source/core/loader/resource/ImageResourceTest.cpp |
@@ -96,6 +96,7 @@ constexpr int kJpegImageWidth = 1; |
constexpr size_t kJpegImageSubrangeWithDimensionsLength = |
sizeof(kJpegImage) - 1; |
+constexpr size_t kJpegImageSubrangeWithoutDimensionsLength = 3; |
// Ensure that the image decoder can determine the dimensions of kJpegImage from |
// just the first kJpegImageSubrangeWithDimensionsLength bytes. If this test |
@@ -451,6 +452,67 @@ TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderAfterFinished) { |
EXPECT_EQ(50, imageResource->getContent()->getImage()->height()); |
} |
+TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderViaResourceFetcher) { |
+ ResourceFetcher* fetcher = |
+ ResourceFetcher::create(ImageResourceTestMockFetchContext::create()); |
+ |
+ KURL testURL(ParsedURLString, kTestURL); |
+ ScopedMockedURLLoad scopedMockedURLLoad(testURL, GetTestFilePath()); |
+ |
+ ResourceRequest request = ResourceRequest(testURL); |
+ request.setPreviewsState(WebURLRequest::ServerLoFiOn); |
+ FetchRequest fetchRequest(request, FetchInitiatorInfo()); |
+ ImageResource* imageResource = ImageResource::fetch(fetchRequest, fetcher); |
+ ImageResourceContent* content = imageResource->getContent(); |
+ |
+ std::unique_ptr<MockImageResourceObserver> observer = |
+ MockImageResourceObserver::create(content); |
+ |
+ // Send the image response. |
+ ResourceResponse resourceResponse(KURL(), "image/jpeg", sizeof(kJpegImage), |
+ nullAtom); |
+ resourceResponse.addHTTPHeaderField("chrome-proxy-content-transform", |
+ "empty-image"); |
+ |
+ imageResource->loader()->didReceiveResponse( |
+ WrappedResourceResponse(resourceResponse)); |
+ imageResource->loader()->didReceiveData( |
+ reinterpret_cast<const char*>(kJpegImage), sizeof(kJpegImage)); |
+ imageResource->loader()->didFinishLoading(0.0, sizeof(kJpegImage), |
+ sizeof(kJpegImage)); |
+ |
+ 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()); |
+ |
+ memoryCache()->remove(imageResource); |
+} |
+ |
TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderDuringFetch) { |
KURL testURL(ParsedURLString, kTestURL); |
ScopedMockedURLLoad scopedMockedURLLoad(testURL, GetTestFilePath()); |
@@ -885,6 +947,52 @@ TEST(ImageResourceTest, DecodeErrorWithEmptyBody) { |
EXPECT_FALSE(imageResource->isLoading()); |
} |
+// Testing DecodeError that occurs in didFinishLoading(). |
+// This is similar to DecodeErrorWithEmptyBody, but with non-empty body. |
+TEST(ImageResourceTest, PartialContentWithoutDimensions) { |
+ KURL testURL(ParsedURLString, kTestURL); |
+ ScopedMockedURLLoad scopedMockedURLLoad(testURL, GetTestFilePath()); |
+ |
+ ResourceRequest resourceRequest(testURL); |
+ resourceRequest.setHTTPHeaderField("range", "bytes=0-2"); |
+ FetchRequest request(resourceRequest, FetchInitiatorInfo()); |
+ ResourceFetcher* fetcher = |
+ ResourceFetcher::create(ImageResourceTestMockFetchContext::create()); |
+ ImageResource* imageResource = ImageResource::fetch(request, fetcher); |
+ std::unique_ptr<MockImageResourceObserver> observer = |
+ MockImageResourceObserver::create(imageResource->getContent()); |
+ |
+ ResourceResponse partialResponse(testURL, "image/jpeg", |
+ kJpegImageSubrangeWithoutDimensionsLength, |
+ nullAtom); |
+ partialResponse.setHTTPStatusCode(206); |
+ partialResponse.setHTTPHeaderField( |
+ "content-range", |
+ buildContentRange(kJpegImageSubrangeWithoutDimensionsLength, |
+ sizeof(kJpegImage))); |
+ |
+ imageResource->loader()->didReceiveResponse( |
+ WrappedResourceResponse(partialResponse)); |
+ imageResource->loader()->didReceiveData( |
+ reinterpret_cast<const char*>(kJpegImage), |
+ kJpegImageSubrangeWithoutDimensionsLength); |
+ |
+ EXPECT_EQ(ResourceStatus::Pending, imageResource->getStatus()); |
+ EXPECT_FALSE(observer->imageNotifyFinishedCalled()); |
+ EXPECT_EQ(0, observer->imageChangedCount()); |
+ |
+ imageResource->loader()->didFinishLoading( |
+ 0.0, kJpegImageSubrangeWithoutDimensionsLength, |
+ kJpegImageSubrangeWithoutDimensionsLength); |
+ |
+ EXPECT_EQ(ResourceStatus::DecodeError, imageResource->getStatus()); |
+ EXPECT_TRUE(observer->imageNotifyFinishedCalled()); |
+ EXPECT_EQ(ResourceStatus::DecodeError, |
+ observer->statusOnImageNotifyFinished()); |
+ EXPECT_EQ(1, observer->imageChangedCount()); |
+ EXPECT_FALSE(imageResource->isLoading()); |
+} |
+ |
TEST(ImageResourceTest, FetchDisallowPlaceholder) { |
KURL testURL(ParsedURLString, kTestURL); |
ScopedMockedURLLoad scopedMockedURLLoad(testURL, GetTestFilePath()); |
@@ -1084,6 +1192,79 @@ TEST(ImageResourceTest, FetchAllowPlaceholderUnsuccessful) { |
EXPECT_TRUE(imageResource->getContent()->getImage()->isBitmapImage()); |
} |
+TEST(ImageResourceTest, FetchAllowPlaceholderPartialContentWithoutDimensions) { |
+ KURL testURL(ParsedURLString, kTestURL); |
+ ScopedMockedURLLoad scopedMockedURLLoad(testURL, GetTestFilePath()); |
+ |
+ FetchRequest request(testURL, FetchInitiatorInfo()); |
+ request.setAllowImagePlaceholder(); |
+ ImageResource* imageResource = ImageResource::fetch( |
+ request, |
+ ResourceFetcher::create(ImageResourceTestMockFetchContext::create())); |
+ EXPECT_EQ(FetchRequest::AllowPlaceholder, |
+ request.placeholderImageRequestType()); |
+ EXPECT_EQ("bytes=0-2047", |
+ imageResource->resourceRequest().httpHeaderField("range")); |
+ EXPECT_TRUE(imageResource->isPlaceholder()); |
+ std::unique_ptr<MockImageResourceObserver> observer = |
+ MockImageResourceObserver::create(imageResource->getContent()); |
+ |
+ // TODO(hiroshige): Make the range request header and partial content length |
+ // consistent. https://crbug.com/689760. |
+ ResourceResponse partialResponse(testURL, "image/jpeg", |
+ kJpegImageSubrangeWithoutDimensionsLength, |
+ nullAtom); |
+ partialResponse.setHTTPStatusCode(206); |
+ partialResponse.setHTTPHeaderField( |
+ "content-range", |
+ buildContentRange(kJpegImageSubrangeWithoutDimensionsLength, |
+ sizeof(kJpegImage))); |
+ |
+ imageResource->loader()->didReceiveResponse( |
+ WrappedResourceResponse(partialResponse)); |
+ imageResource->loader()->didReceiveData( |
+ reinterpret_cast<const char*>(kJpegImage), |
+ kJpegImageSubrangeWithoutDimensionsLength); |
+ |
+ EXPECT_EQ(0, observer->imageChangedCount()); |
+ |
+ imageResource->loader()->didFinishLoading( |
+ 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()); |
+} |
+ |
TEST(ImageResourceTest, FetchAllowPlaceholderThenDisallowPlaceholder) { |
KURL testURL(ParsedURLString, kTestURL); |
ScopedMockedURLLoad scopedMockedURLLoad(testURL, GetTestFilePath()); |