| 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 962a51741d3c46f07a10a764fc513fce9bb5ec95..7b1dc30199cfdc35d4c7c127b25bfdc122c7984f 100644
|
| --- a/third_party/WebKit/Source/core/loader/resource/ImageResourceTest.cpp
|
| +++ b/third_party/WebKit/Source/core/loader/resource/ImageResourceTest.cpp
|
| @@ -175,16 +175,22 @@ void receiveResponse(ImageResource* imageResource,
|
| imageResource->finish();
|
| }
|
|
|
| -void testThatReloadIsStartedThenServeReload(const KURL& testURL,
|
| - ImageResource* imageResource,
|
| - ImageResourceContent* content,
|
| - MockImageResourceObserver* observer,
|
| - WebCachePolicy policyForReload) {
|
| +void testThatReloadIsStartedThenServeReload(
|
| + const KURL& testURL,
|
| + ImageResource* originalImageResource,
|
| + 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 |originalImageResource| is detached.
|
| + EXPECT_NE(originalImageResource, imageResource);
|
| + EXPECT_FALSE(originalImageResource->getContent());
|
| +
|
| // Checks that |imageResource| and |content| are ready for non-placeholder
|
| // reloading.
|
| EXPECT_EQ(ResourceStatus::Pending, imageResource->getStatus());
|
| @@ -195,6 +201,7 @@ void testThatReloadIsStartedThenServeReload(const KURL& testURL,
|
| EXPECT_EQ(policyForReload, imageResource->resourceRequest().getCachePolicy());
|
| EXPECT_EQ(content, imageResource->getContent());
|
| EXPECT_FALSE(content->hasImage());
|
| + EXPECT_EQ(imageResource, memoryCache()->resourceForURL(testURL));
|
|
|
| // Checks |observer| before reloading.
|
| const int originalImageChangedCount = observer->imageChangedCount();
|
| @@ -509,6 +516,7 @@ TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderAfterFinished) {
|
| ResourceRequest request = ResourceRequest(testURL);
|
| request.setPreviewsState(WebURLRequest::ServerLoFiOn);
|
| ImageResource* imageResource = ImageResource::create(request);
|
| + ImageResourceContent* content = imageResource->getContent();
|
| imageResource->setStatus(ResourceStatus::Pending);
|
|
|
| std::unique_ptr<MockImageResourceObserver> observer =
|
| @@ -526,25 +534,27 @@ TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderAfterFinished) {
|
| sizeof(kJpegImage));
|
| imageResource->finish();
|
| EXPECT_FALSE(imageResource->errorOccurred());
|
| - ASSERT_TRUE(imageResource->getContent()->hasImage());
|
| - EXPECT_FALSE(imageResource->getContent()->getImage()->isNull());
|
| + ASSERT_TRUE(content->hasImage());
|
| + EXPECT_FALSE(content->getImage()->isNull());
|
| EXPECT_EQ(2, observer->imageChangedCount());
|
| EXPECT_EQ(kJpegImageWidth, observer->imageWidthOnLastImageChanged());
|
| // The observer should have been notified that the image load completed.
|
| EXPECT_TRUE(observer->imageNotifyFinishedCalled());
|
| EXPECT_EQ(kJpegImageWidth, observer->imageWidthOnImageNotifyFinished());
|
| - EXPECT_TRUE(imageResource->getContent()->getImage()->isBitmapImage());
|
| - EXPECT_EQ(kJpegImageWidth, imageResource->getContent()->getImage()->width());
|
| - EXPECT_EQ(kJpegImageHeight,
|
| - imageResource->getContent()->getImage()->height());
|
| + EXPECT_TRUE(content->getImage()->isBitmapImage());
|
| + EXPECT_EQ(kJpegImageWidth, content->getImage()->width());
|
| + EXPECT_EQ(kJpegImageHeight, content->getImage()->height());
|
|
|
| // Call reloadIfLoFiOrPlaceholderImage() after the image has finished loading.
|
| - imageResource->reloadIfLoFiOrPlaceholderImage(fetcher,
|
| - Resource::kReloadAlways);
|
| -
|
| + ImageResource* reloadingResource =
|
| + imageResource->reloadIfLoFiOrPlaceholderImage(fetcher,
|
| + Resource::kReloadAlways);
|
| EXPECT_EQ(3, observer->imageChangedCount());
|
| + ASSERT_TRUE(reloadingResource);
|
| + EXPECT_EQ(reloadingResource, fetcher->cachedResource(testURL));
|
| +
|
| testThatReloadIsStartedThenServeReload(
|
| - testURL, imageResource, imageResource->getContent(), observer.get(),
|
| + testURL, imageResource, reloadingResource, content, observer.get(),
|
| WebCachePolicy::BypassingCache);
|
| }
|
|
|
| @@ -583,9 +593,13 @@ TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderViaResourceFetcher) {
|
|
|
| EXPECT_EQ(3, observer->imageChangedCount());
|
|
|
| - testThatReloadIsStartedThenServeReload(testURL, imageResource, content,
|
| - observer.get(),
|
| - WebCachePolicy::BypassingCache);
|
| + ImageResource* reloadingResource =
|
| + toImageResource(fetcher->cachedResource(testURL));
|
| + ASSERT_TRUE(reloadingResource);
|
| +
|
| + testThatReloadIsStartedThenServeReload(
|
| + testURL, imageResource, reloadingResource, content, observer.get(),
|
| + WebCachePolicy::BypassingCache);
|
|
|
| memoryCache()->remove(imageResource);
|
| }
|
| @@ -600,8 +614,9 @@ TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderDuringFetch) {
|
| ResourceFetcher* fetcher = createFetcher();
|
|
|
| ImageResource* imageResource = ImageResource::fetch(fetchRequest, fetcher);
|
| + ImageResourceContent* content = imageResource->getContent();
|
| std::unique_ptr<MockImageResourceObserver> observer =
|
| - MockImageResourceObserver::create(imageResource->getContent());
|
| + MockImageResourceObserver::create(content);
|
|
|
| // Send the image response.
|
| ResourceResponse initialResourceResponse(testURL, "image/jpeg",
|
| @@ -614,20 +629,22 @@ TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderDuringFetch) {
|
| reinterpret_cast<const char*>(kJpegImage), sizeof(kJpegImage));
|
|
|
| EXPECT_FALSE(imageResource->errorOccurred());
|
| - ASSERT_TRUE(imageResource->getContent()->hasImage());
|
| - EXPECT_FALSE(imageResource->getContent()->getImage()->isNull());
|
| + ASSERT_TRUE(content->hasImage());
|
| + EXPECT_FALSE(content->getImage()->isNull());
|
| EXPECT_EQ(1, observer->imageChangedCount());
|
| EXPECT_EQ(kJpegImageWidth, observer->imageWidthOnLastImageChanged());
|
| EXPECT_FALSE(observer->imageNotifyFinishedCalled());
|
| - EXPECT_TRUE(imageResource->getContent()->getImage()->isBitmapImage());
|
| - EXPECT_EQ(kJpegImageWidth, imageResource->getContent()->getImage()->width());
|
| - EXPECT_EQ(kJpegImageHeight,
|
| - imageResource->getContent()->getImage()->height());
|
| + EXPECT_TRUE(content->getImage()->isBitmapImage());
|
| + EXPECT_EQ(kJpegImageWidth, content->getImage()->width());
|
| + EXPECT_EQ(kJpegImageHeight, content->getImage()->height());
|
|
|
| // Call reloadIfLoFiOrPlaceholderImage() while the image is still loading.
|
| - imageResource->reloadIfLoFiOrPlaceholderImage(fetcher,
|
| - Resource::kReloadAlways);
|
| + ImageResource* reloadingResource =
|
| + imageResource->reloadIfLoFiOrPlaceholderImage(fetcher,
|
| + Resource::kReloadAlways);
|
|
|
| + ASSERT_TRUE(reloadingResource);
|
| + EXPECT_EQ(reloadingResource, fetcher->cachedResource(testURL));
|
| EXPECT_EQ(2, observer->imageChangedCount());
|
| EXPECT_EQ(0, observer->imageWidthOnLastImageChanged());
|
| // The observer should not have been notified of completion yet, since the
|
| @@ -635,8 +652,14 @@ TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderDuringFetch) {
|
| EXPECT_FALSE(observer->imageNotifyFinishedCalled());
|
|
|
| testThatReloadIsStartedThenServeReload(
|
| - testURL, imageResource, imageResource->getContent(), observer.get(),
|
| + testURL, imageResource, reloadingResource, content, observer.get(),
|
| WebCachePolicy::BypassingCache);
|
| +
|
| + // Trigger the cancel timer, ensure the load for the first ImageResource
|
| + // was cancelled because reloading is started using another ImageResource.
|
| + EXPECT_EQ(ResourceStatus::Pending, imageResource->getStatus());
|
| + blink::testing::runPendingTasks();
|
| + EXPECT_EQ(ResourceStatus::LoadError, imageResource->getStatus());
|
| }
|
|
|
| TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderForPlaceholder) {
|
| @@ -647,19 +670,24 @@ TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderForPlaceholder) {
|
| FetchRequest request(testURL, FetchInitiatorInfo());
|
| request.setAllowImagePlaceholder();
|
| ImageResource* imageResource = ImageResource::fetch(request, fetcher);
|
| + ImageResourceContent* content = imageResource->getContent();
|
| + ASSERT_TRUE(content);
|
| EXPECT_EQ(FetchRequest::AllowPlaceholder,
|
| request.placeholderImageRequestType());
|
| std::unique_ptr<MockImageResourceObserver> observer =
|
| - MockImageResourceObserver::create(imageResource->getContent());
|
| + MockImageResourceObserver::create(content);
|
|
|
| testThatIsPlaceholderRequestAndServeResponse(testURL, imageResource,
|
| observer.get());
|
|
|
| - imageResource->reloadIfLoFiOrPlaceholderImage(fetcher,
|
| - Resource::kReloadAlways);
|
| + ImageResource* reloadingResource =
|
| + imageResource->reloadIfLoFiOrPlaceholderImage(fetcher,
|
| + Resource::kReloadAlways);
|
| + ASSERT_TRUE(reloadingResource);
|
| + EXPECT_EQ(reloadingResource, fetcher->cachedResource(testURL));
|
|
|
| testThatReloadIsStartedThenServeReload(
|
| - testURL, imageResource, imageResource->getContent(), observer.get(),
|
| + testURL, imageResource, reloadingResource, content, observer.get(),
|
| WebCachePolicy::BypassingCache);
|
| }
|
|
|
| @@ -1116,7 +1144,9 @@ TEST(ImageResourceTest, FetchAllowPlaceholderUnsuccessful) {
|
|
|
| FetchRequest request(testURL, FetchInitiatorInfo());
|
| request.setAllowImagePlaceholder();
|
| - ImageResource* imageResource = ImageResource::fetch(request, createFetcher());
|
| + ResourceFetcher* fetcher = createFetcher();
|
| + ImageResource* imageResource = ImageResource::fetch(request, fetcher);
|
| + ImageResourceContent* content = imageResource->getContent();
|
| EXPECT_EQ(FetchRequest::AllowPlaceholder,
|
| request.placeholderImageRequestType());
|
| EXPECT_EQ("bytes=0-2047",
|
| @@ -1140,13 +1170,17 @@ TEST(ImageResourceTest, FetchAllowPlaceholderUnsuccessful) {
|
|
|
| imageResource->loader()->didReceiveData(kBadData, sizeof(kBadData));
|
|
|
| + ImageResource* reloadingResource =
|
| + toImageResource(fetcher->cachedResource(testURL));
|
| + ASSERT_TRUE(reloadingResource);
|
| +
|
| // The dimensions could not be extracted, so the full original image should be
|
| // loading.
|
| EXPECT_FALSE(observer->imageNotifyFinishedCalled());
|
| - EXPECT_EQ(2, observer->imageChangedCount());
|
| + EXPECT_EQ(1, observer->imageChangedCount());
|
|
|
| testThatReloadIsStartedThenServeReload(
|
| - testURL, imageResource, imageResource->getContent(), observer.get(),
|
| + testURL, imageResource, reloadingResource, content, observer.get(),
|
| WebCachePolicy::BypassingCache);
|
| }
|
|
|
| @@ -1156,7 +1190,9 @@ TEST(ImageResourceTest, FetchAllowPlaceholderPartialContentWithoutDimensions) {
|
|
|
| FetchRequest request(testURL, FetchInitiatorInfo());
|
| request.setAllowImagePlaceholder();
|
| - ImageResource* imageResource = ImageResource::fetch(request, createFetcher());
|
| + ResourceFetcher* fetcher = createFetcher();
|
| + ImageResource* imageResource = ImageResource::fetch(request, fetcher);
|
| + ImageResourceContent* content = imageResource->getContent();
|
| EXPECT_EQ(FetchRequest::AllowPlaceholder,
|
| request.placeholderImageRequestType());
|
| EXPECT_EQ("bytes=0-2047",
|
| @@ -1189,10 +1225,14 @@ TEST(ImageResourceTest, FetchAllowPlaceholderPartialContentWithoutDimensions) {
|
| kJpegImageSubrangeWithoutDimensionsLength);
|
|
|
| EXPECT_FALSE(observer->imageNotifyFinishedCalled());
|
| - EXPECT_EQ(2, observer->imageChangedCount());
|
| + EXPECT_EQ(1, observer->imageChangedCount());
|
| +
|
| + ImageResource* reloadingResource =
|
| + toImageResource(fetcher->cachedResource(testURL));
|
| + ASSERT_TRUE(reloadingResource);
|
|
|
| testThatReloadIsStartedThenServeReload(
|
| - testURL, imageResource, imageResource->getContent(), observer.get(),
|
| + testURL, imageResource, reloadingResource, content, observer.get(),
|
| WebCachePolicy::BypassingCache);
|
| }
|
|
|
| @@ -1206,8 +1246,9 @@ TEST(ImageResourceTest, FetchAllowPlaceholderThenDisallowPlaceholder) {
|
| placeholderRequest.setAllowImagePlaceholder();
|
| ImageResource* imageResource =
|
| ImageResource::fetch(placeholderRequest, fetcher);
|
| + ImageResourceContent* content = imageResource->getContent();
|
| std::unique_ptr<MockImageResourceObserver> observer =
|
| - MockImageResourceObserver::create(imageResource->getContent());
|
| + MockImageResourceObserver::create(content);
|
|
|
| FetchRequest nonPlaceholderRequest(testURL, FetchInitiatorInfo());
|
| ImageResource* imageResource2 =
|
| @@ -1256,8 +1297,9 @@ TEST(ImageResourceTest,
|
| placeholderRequest.setAllowImagePlaceholder();
|
| ImageResource* imageResource =
|
| ImageResource::fetch(placeholderRequest, fetcher);
|
| + ImageResourceContent* content = imageResource->getContent();
|
| std::unique_ptr<MockImageResourceObserver> observer =
|
| - MockImageResourceObserver::create(imageResource->getContent());
|
| + MockImageResourceObserver::create(content);
|
|
|
| testThatIsPlaceholderRequestAndServeResponse(testURL, imageResource,
|
| observer.get());
|
| @@ -1378,7 +1420,10 @@ TEST(ImageResourceTest,
|
| WrappedResourceResponse(response));
|
| imageResource->loader()->didReceiveData(kBadImageData, test.dataSize);
|
|
|
| + // Reloading does not occur and loading finishes as DecodeError.
|
| EXPECT_EQ(ResourceStatus::DecodeError, imageResource->getStatus());
|
| + EXPECT_FALSE(imageResource->isLoading());
|
| + EXPECT_TRUE(imageResource->getContent());
|
| EXPECT_FALSE(imageResource->shouldShowPlaceholder());
|
| }
|
| }
|
| @@ -1392,15 +1437,16 @@ TEST(ImageResourceTest,
|
|
|
| FetchRequest request(testURL, FetchInitiatorInfo());
|
| request.setAllowImagePlaceholder();
|
| - ImageResource* imageResource =
|
| - ImageResource::fetch(request, createFetcher());
|
| + ResourceFetcher* fetcher = createFetcher();
|
| + ImageResource* imageResource = ImageResource::fetch(request, fetcher);
|
| + ImageResourceContent* content = imageResource->getContent();
|
| EXPECT_EQ(FetchRequest::AllowPlaceholder,
|
| request.placeholderImageRequestType());
|
| EXPECT_EQ("bytes=0-2047",
|
| imageResource->resourceRequest().httpHeaderField("range"));
|
| EXPECT_TRUE(imageResource->shouldShowPlaceholder());
|
| std::unique_ptr<MockImageResourceObserver> observer =
|
| - MockImageResourceObserver::create(imageResource->getContent());
|
| + MockImageResourceObserver::create(content);
|
|
|
| static const char kBadImageData[] = "bad image data";
|
|
|
| @@ -1414,10 +1460,14 @@ TEST(ImageResourceTest,
|
|
|
| EXPECT_FALSE(observer->imageNotifyFinishedCalled());
|
|
|
| + ImageResource* reloadingResource =
|
| + toImageResource(fetcher->cachedResource(testURL));
|
| + ASSERT_TRUE(reloadingResource);
|
| +
|
| // 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(),
|
| + testURL, imageResource, reloadingResource, content, observer.get(),
|
| WebCachePolicy::BypassingCache);
|
| }
|
| }
|
|
|