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 3d99402b794544421ef05dfd7f9795b205fcf83e..a3864818a1d36ac624e406e21bd15ccdc3452c31 100644 |
--- a/third_party/WebKit/Source/core/loader/resource/ImageResourceTest.cpp |
+++ b/third_party/WebKit/Source/core/loader/resource/ImageResourceTest.cpp |
@@ -551,7 +551,8 @@ TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderAfterFinished) { |
// The observer should have been notified that the image load completed. |
EXPECT_TRUE(observer->ImageNotifyFinishedCalled()); |
EXPECT_EQ(kJpegImageWidth, observer->ImageWidthOnImageNotifyFinished()); |
- EXPECT_TRUE(image_resource->GetContent()->GetImage()->IsBitmapImage()); |
+ EXPECT_FALSE(image_resource->GetContent()->GetImage()->IsBitmapImage()); |
+ EXPECT_TRUE(image_resource->ShouldShowPlaceholder()); |
EXPECT_EQ(kJpegImageWidth, image_resource->GetContent()->GetImage()->width()); |
EXPECT_EQ(kJpegImageHeight, |
image_resource->GetContent()->GetImage()->height()); |
@@ -595,7 +596,8 @@ TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderAfterFinishedWithOldHeaders) { |
// The observer should have been notified that the image load completed. |
EXPECT_TRUE(observer->ImageNotifyFinishedCalled()); |
EXPECT_EQ(kJpegImageWidth, observer->ImageWidthOnImageNotifyFinished()); |
- EXPECT_TRUE(image_resource->GetContent()->GetImage()->IsBitmapImage()); |
+ EXPECT_FALSE(image_resource->GetContent()->GetImage()->IsBitmapImage()); |
+ EXPECT_TRUE(image_resource->ShouldShowPlaceholder()); |
EXPECT_EQ(kJpegImageWidth, image_resource->GetContent()->GetImage()->width()); |
EXPECT_EQ(kJpegImageHeight, |
image_resource->GetContent()->GetImage()->height()); |
@@ -696,7 +698,38 @@ TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderViaResourceFetcher) { |
GetMemoryCache()->Remove(image_resource); |
} |
-TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderDuringFetch) { |
+TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderBeforeResponse) { |
+ KURL test_url(kParsedURLString, kTestURL); |
+ ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath()); |
+ |
+ ResourceRequest request(test_url); |
+ request.SetPreviewsState(WebURLRequest::kServerLoFiOn); |
+ FetchParameters fetch_params(request); |
+ ResourceFetcher* fetcher = CreateFetcher(); |
+ |
+ ImageResource* image_resource = ImageResource::Fetch(fetch_params, fetcher); |
+ std::unique_ptr<MockImageResourceObserver> observer = |
+ MockImageResourceObserver::Create(image_resource->GetContent()); |
+ |
+ EXPECT_FALSE(image_resource->ErrorOccurred()); |
+ EXPECT_TRUE(image_resource->ShouldShowPlaceholder()); |
+ |
+ // Call reloadIfLoFiOrPlaceholderImage() while the image is still loading. |
+ image_resource->ReloadIfLoFiOrPlaceholderImage(fetcher, |
+ Resource::kReloadAlways); |
+ |
+ EXPECT_EQ(1, observer->ImageChangedCount()); |
+ EXPECT_EQ(0, observer->ImageWidthOnLastImageChanged()); |
+ // The observer should not have been notified of completion yet, since the |
+ // image is still loading. |
+ EXPECT_FALSE(observer->ImageNotifyFinishedCalled()); |
+ |
+ TestThatReloadIsStartedThenServeReload( |
+ test_url, image_resource, image_resource->GetContent(), observer.get(), |
+ WebCachePolicy::kBypassingCache); |
+} |
+ |
+TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderDuringResponse) { |
KURL test_url(kParsedURLString, kTestURL); |
ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath()); |
@@ -710,9 +743,13 @@ TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderDuringFetch) { |
MockImageResourceObserver::Create(image_resource->GetContent()); |
// Send the image response. |
+ ResourceResponse resource_response(test_url, "image/jpeg", sizeof(kJpegImage), |
+ g_null_atom); |
+ resource_response.AddHTTPHeaderField("chrome-proxy-content-transform", |
+ "empty-image"); |
+ |
image_resource->Loader()->DidReceiveResponse( |
- WrappedResourceResponse(ResourceResponse( |
- test_url, "image/jpeg", sizeof(kJpegImage), g_null_atom))); |
+ WrappedResourceResponse(resource_response)); |
image_resource->Loader()->DidReceiveData( |
reinterpret_cast<const char*>(kJpegImage), sizeof(kJpegImage)); |
@@ -722,7 +759,7 @@ TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderDuringFetch) { |
EXPECT_EQ(1, observer->ImageChangedCount()); |
EXPECT_EQ(kJpegImageWidth, observer->ImageWidthOnLastImageChanged()); |
EXPECT_FALSE(observer->ImageNotifyFinishedCalled()); |
- EXPECT_TRUE(image_resource->GetContent()->GetImage()->IsBitmapImage()); |
+ EXPECT_TRUE(image_resource->ShouldShowPlaceholder()); |
EXPECT_EQ(kJpegImageWidth, image_resource->GetContent()->GetImage()->width()); |
EXPECT_EQ(kJpegImageHeight, |
image_resource->GetContent()->GetImage()->height()); |
@@ -1608,7 +1645,6 @@ TEST(ImageResourceTest, PeriodicFlushTest) { |
// Send the image response. |
ResourceResponse resource_response(KURL(), "image/jpeg", sizeof(kJpegImage2), |
g_null_atom); |
- resource_response.AddHTTPHeaderField("chrome-proxy", "q=low"); |
image_resource->ResponseReceived(resource_response, nullptr); |
@@ -1679,5 +1715,151 @@ TEST(ImageResourceTest, PeriodicFlushTest) { |
WTF::SetTimeFunctionsForTesting(nullptr); |
} |
+TEST(ImageResourceTest, ShowPlaceholderForServerLoFiWithBitAndHeaders) { |
+ KURL test_url(kParsedURLString, kTestURL); |
+ ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath()); |
+ |
+ ResourceRequest request(test_url); |
+ request.SetPreviewsState(WebURLRequest::kServerLoFiOn); |
+ FetchParameters params{request}; |
+ ImageResource* image_resource = ImageResource::Fetch(params, CreateFetcher()); |
+ EXPECT_EQ(FetchParameters::kDisallowPlaceholder, |
+ params.GetPlaceholderImageRequestType()); |
+ EXPECT_EQ(g_null_atom, |
+ image_resource->GetResourceRequest().HttpHeaderField("range")); |
+ |
+ EXPECT_TRUE(image_resource->ShouldShowPlaceholder()); |
+ std::unique_ptr<MockImageResourceObserver> observer = |
+ MockImageResourceObserver::Create(image_resource->GetContent()); |
+ |
+ // Send the Server Lo-Fi image response, complete with Server Lo-Fi response |
+ // headers. |
+ ResourceResponse response(test_url, "image/jpeg", sizeof(kJpegImage), |
+ g_null_atom); |
+ response.AddHTTPHeaderField("chrome-proxy-content-transform", "empty-image"); |
+ |
+ image_resource->Loader()->DidReceiveResponse( |
+ WrappedResourceResponse(response)); |
+ image_resource->Loader()->DidReceiveData( |
+ reinterpret_cast<const char*>(kJpegImage), sizeof(kJpegImage)); |
+ image_resource->Loader()->DidFinishLoading( |
+ 0.0, sizeof(kJpegImage), sizeof(kJpegImage), sizeof(kJpegImage)); |
+ |
+ EXPECT_EQ(ResourceStatus::kCached, image_resource->GetStatus()); |
+ EXPECT_TRUE(image_resource->ShouldShowPlaceholder()); |
+ EXPECT_LT(0, observer->ImageChangedCount()); |
+ EXPECT_EQ(kJpegImageWidth, observer->ImageWidthOnLastImageChanged()); |
+ EXPECT_TRUE(observer->ImageNotifyFinishedCalled()); |
+ EXPECT_EQ(kJpegImageWidth, observer->ImageWidthOnImageNotifyFinished()); |
+ |
+ ASSERT_TRUE(image_resource->GetContent()->HasImage()); |
+ EXPECT_EQ(kJpegImageWidth, image_resource->GetContent()->GetImage()->width()); |
+ EXPECT_EQ(kJpegImageHeight, |
+ image_resource->GetContent()->GetImage()->height()); |
+ EXPECT_FALSE(image_resource->GetContent()->GetImage()->IsBitmapImage()); |
+} |
+ |
+TEST(ImageResourceTest, DoNotShowPlaceholderForServerLoFiWithoutHeaders) { |
+ KURL test_url(kParsedURLString, kTestURL); |
+ ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath()); |
+ |
+ ResourceRequest request(test_url); |
+ request.SetPreviewsState(WebURLRequest::kServerLoFiOn); |
+ FetchParameters params{request}; |
+ ImageResource* image_resource = ImageResource::Fetch(params, CreateFetcher()); |
+ EXPECT_EQ(FetchParameters::kDisallowPlaceholder, |
+ params.GetPlaceholderImageRequestType()); |
+ EXPECT_EQ(g_null_atom, |
+ image_resource->GetResourceRequest().HttpHeaderField("range")); |
+ |
+ EXPECT_TRUE(image_resource->ShouldShowPlaceholder()); |
+ std::unique_ptr<MockImageResourceObserver> observer = |
+ MockImageResourceObserver::Create(image_resource->GetContent()); |
+ |
+ // Send the image response without any Server Lo-Fi response headers. |
+ image_resource->Loader()->DidReceiveResponse( |
+ WrappedResourceResponse(ResourceResponse( |
+ test_url, "image/jpeg", sizeof(kJpegImage), g_null_atom))); |
+ image_resource->Loader()->DidReceiveData( |
+ reinterpret_cast<const char*>(kJpegImage), sizeof(kJpegImage)); |
+ image_resource->Loader()->DidFinishLoading( |
+ 0.0, sizeof(kJpegImage), sizeof(kJpegImage), sizeof(kJpegImage)); |
+ |
+ EXPECT_EQ(WebURLRequest::kPreviewsOff, |
+ image_resource->GetResourceRequest().GetPreviewsState()); |
+ EXPECT_FALSE(image_resource->ShouldShowPlaceholder()); |
+ |
+ EXPECT_EQ(ResourceStatus::kCached, image_resource->GetStatus()); |
+ EXPECT_LT(0, observer->ImageChangedCount()); |
+ EXPECT_EQ(kJpegImageWidth, observer->ImageWidthOnLastImageChanged()); |
+ EXPECT_TRUE(observer->ImageNotifyFinishedCalled()); |
+ EXPECT_EQ(kJpegImageWidth, observer->ImageWidthOnImageNotifyFinished()); |
+ |
+ ASSERT_TRUE(image_resource->GetContent()->HasImage()); |
+ EXPECT_EQ(kJpegImageWidth, image_resource->GetContent()->GetImage()->width()); |
+ EXPECT_EQ(kJpegImageHeight, |
+ image_resource->GetContent()->GetImage()->height()); |
+ EXPECT_TRUE(image_resource->GetContent()->GetImage()->IsBitmapImage()); |
+} |
+ |
+TEST(ImageResourceTest, ShowPlaceholderForServerLoFiWithHeadersButWithoutBit) { |
+ const struct { |
+ const char* header_name; |
+ const char* header_value; |
+ } tests[] = { |
+ // New-style Server Lo-Fi response header. |
+ {"chrome-proxy-content-transform", "empty-image"}, |
+ // Legacy Server Lo-Fi response header. |
+ {"chrome-proxy", "q=low"}, |
+ }; |
+ |
+ for (const auto& test : tests) { |
+ KURL test_url(kParsedURLString, kTestURL); |
+ ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath()); |
+ |
+ FetchParameters params{ResourceRequest(test_url)}; |
+ ImageResource* image_resource = |
+ ImageResource::Fetch(params, CreateFetcher()); |
+ EXPECT_EQ(FetchParameters::kDisallowPlaceholder, |
+ params.GetPlaceholderImageRequestType()); |
+ EXPECT_EQ(g_null_atom, |
+ image_resource->GetResourceRequest().HttpHeaderField("range")); |
+ |
+ EXPECT_FALSE(image_resource->ShouldShowPlaceholder()); |
+ std::unique_ptr<MockImageResourceObserver> observer = |
+ MockImageResourceObserver::Create(image_resource->GetContent()); |
+ |
+ // Send a Server Lo-Fi image response, complete with Server Lo-Fi response |
+ // headers. |
+ ResourceResponse response(test_url, "image/jpeg", sizeof(kJpegImage), |
+ g_null_atom); |
+ response.AddHTTPHeaderField(test.header_name, test.header_value); |
+ |
+ image_resource->Loader()->DidReceiveResponse( |
+ WrappedResourceResponse(response)); |
+ image_resource->Loader()->DidReceiveData( |
+ reinterpret_cast<const char*>(kJpegImage), sizeof(kJpegImage)); |
+ image_resource->Loader()->DidFinishLoading( |
+ 0.0, sizeof(kJpegImage), sizeof(kJpegImage), sizeof(kJpegImage)); |
+ |
+ EXPECT_TRUE(image_resource->GetResourceRequest().GetPreviewsState() & |
+ WebURLRequest::kServerLoFiOn); |
+ EXPECT_TRUE(image_resource->ShouldShowPlaceholder()); |
+ |
+ EXPECT_EQ(ResourceStatus::kCached, image_resource->GetStatus()); |
+ EXPECT_LT(0, observer->ImageChangedCount()); |
+ EXPECT_EQ(kJpegImageWidth, observer->ImageWidthOnLastImageChanged()); |
+ EXPECT_TRUE(observer->ImageNotifyFinishedCalled()); |
+ EXPECT_EQ(kJpegImageWidth, observer->ImageWidthOnImageNotifyFinished()); |
+ |
+ ASSERT_TRUE(image_resource->GetContent()->HasImage()); |
+ EXPECT_EQ(kJpegImageWidth, |
+ image_resource->GetContent()->GetImage()->width()); |
+ EXPECT_EQ(kJpegImageHeight, |
+ image_resource->GetContent()->GetImage()->height()); |
+ EXPECT_FALSE(image_resource->GetContent()->GetImage()->IsBitmapImage()); |
+ } |
+} |
+ |
} // namespace |
} // namespace blink |