Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(163)

Unified Diff: third_party/WebKit/Source/core/loader/resource/ImageResourceTest.cpp

Issue 2648073002: Add more unit tests for placeholder reloading (Closed)
Patch Set: Rebase fix Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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());
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698