Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (c) 2013, Google Inc. All rights reserved. | 2 * Copyright (c) 2013, Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 87 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 87 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 88 0x00, 0xff, 0xc4, 0x00, 0x14, 0x11, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, | 88 0x00, 0xff, 0xc4, 0x00, 0x14, 0x11, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 89 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, | 89 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, |
| 90 0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, | 90 0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, |
| 91 0x00, 0xb2, 0xc0, 0x07, 0xff, 0xd9}; | 91 0x00, 0xb2, 0xc0, 0x07, 0xff, 0xd9}; |
| 92 | 92 |
| 93 constexpr int kJpegImageWidth = 1; | 93 constexpr int kJpegImageWidth = 1; |
| 94 | 94 |
| 95 constexpr size_t kJpegImageSubrangeWithDimensionsLength = | 95 constexpr size_t kJpegImageSubrangeWithDimensionsLength = |
| 96 sizeof(kJpegImage) - 1; | 96 sizeof(kJpegImage) - 1; |
| 97 constexpr size_t kJpegImageSubrangeWithoutDimensionsLength = 3; | |
| 97 | 98 |
| 98 // Ensure that the image decoder can determine the dimensions of kJpegImage from | 99 // Ensure that the image decoder can determine the dimensions of kJpegImage from |
| 99 // just the first kJpegImageSubrangeWithDimensionsLength bytes. If this test | 100 // just the first kJpegImageSubrangeWithDimensionsLength bytes. If this test |
| 100 // fails, then the test data here probably needs to be updated. | 101 // fails, then the test data here probably needs to be updated. |
| 101 TEST(ImageResourceTest, DimensionsDecodableFromPartialTestImage) { | 102 TEST(ImageResourceTest, DimensionsDecodableFromPartialTestImage) { |
| 102 RefPtr<Image> image = BitmapImage::create(); | 103 RefPtr<Image> image = BitmapImage::create(); |
| 103 EXPECT_EQ( | 104 EXPECT_EQ( |
| 104 Image::SizeAvailable, | 105 Image::SizeAvailable, |
| 105 image->setData(SharedBuffer::create( | 106 image->setData(SharedBuffer::create( |
| 106 kJpegImage, kJpegImageSubrangeWithDimensionsLength), | 107 kJpegImage, kJpegImageSubrangeWithDimensionsLength), |
| (...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 461 EXPECT_TRUE(observer->imageNotifyFinishedCalled()); | 462 EXPECT_TRUE(observer->imageNotifyFinishedCalled()); |
| 462 | 463 |
| 463 // The observer should not have been notified of completion again. | 464 // The observer should not have been notified of completion again. |
| 464 EXPECT_EQ(kJpegImageWidth, observer->imageWidthOnImageNotifyFinished()); | 465 EXPECT_EQ(kJpegImageWidth, observer->imageWidthOnImageNotifyFinished()); |
| 465 | 466 |
| 466 EXPECT_TRUE(imageResource->getContent()->getImage()->isBitmapImage()); | 467 EXPECT_TRUE(imageResource->getContent()->getImage()->isBitmapImage()); |
| 467 EXPECT_EQ(50, imageResource->getContent()->getImage()->width()); | 468 EXPECT_EQ(50, imageResource->getContent()->getImage()->width()); |
| 468 EXPECT_EQ(50, imageResource->getContent()->getImage()->height()); | 469 EXPECT_EQ(50, imageResource->getContent()->getImage()->height()); |
| 469 } | 470 } |
| 470 | 471 |
| 472 TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderViaResourceFetcher) { | |
| 473 ResourceFetcher* fetcher = | |
| 474 ResourceFetcher::create(ImageResourceTestMockFetchContext::create()); | |
| 475 | |
| 476 KURL testURL(ParsedURLString, "http://www.test.com/cancelTest2.html"); | |
| 477 ScopedRegisteredURL scopedRegisteredURL(testURL); | |
| 478 | |
| 479 ResourceRequest request = ResourceRequest(testURL); | |
| 480 request.setPreviewsState(WebURLRequest::ServerLoFiOn); | |
| 481 FetchRequest fetchRequest(request, FetchInitiatorInfo()); | |
| 482 ImageResource* imageResource = ImageResource::fetch(fetchRequest, fetcher); | |
| 483 ImageResourceContent* content = imageResource->getContent(); | |
| 484 | |
| 485 std::unique_ptr<MockImageResourceObserver> observer = | |
| 486 MockImageResourceObserver::create(content); | |
| 487 | |
| 488 // Send the image response. | |
| 489 ResourceResponse resourceResponse(KURL(), "image/jpeg", sizeof(kJpegImage), | |
| 490 nullAtom, String()); | |
| 491 resourceResponse.addHTTPHeaderField("chrome-proxy-content-transform", | |
| 492 "empty-image"); | |
| 493 | |
| 494 imageResource->loader()->didReceiveResponse( | |
| 495 WrappedResourceResponse(resourceResponse)); | |
| 496 imageResource->loader()->didReceiveData( | |
| 497 reinterpret_cast<const char*>(kJpegImage), sizeof(kJpegImage)); | |
| 498 imageResource->loader()->didFinishLoading(0.0, sizeof(kJpegImage), | |
| 499 sizeof(kJpegImage)); | |
| 500 | |
| 501 EXPECT_EQ(imageResource, fetcher->cachedResource(testURL)); | |
| 502 | |
| 503 fetcher->reloadLoFiImages(); | |
| 504 | |
| 505 EXPECT_FALSE(imageResource->errorOccurred()); | |
| 506 EXPECT_FALSE(imageResource->resourceBuffer()); | |
| 507 EXPECT_FALSE(imageResource->getContent()->hasImage()); | |
| 508 EXPECT_EQ(3, observer->imageChangedCount()); | |
| 509 EXPECT_TRUE(observer->imageNotifyFinishedCalled()); | |
| 510 | |
| 511 imageResource->loader()->didReceiveResponse( | |
| 512 WrappedResourceResponse(resourceResponse), nullptr); | |
| 513 imageResource->loader()->didReceiveData( | |
| 514 reinterpret_cast<const char*>(kJpegImage2), sizeof(kJpegImage2)); | |
| 515 imageResource->loader()->didFinishLoading(0.0, sizeof(kJpegImage2), | |
| 516 sizeof(kJpegImage2)); | |
| 517 EXPECT_FALSE(imageResource->errorOccurred()); | |
| 518 ASSERT_TRUE(imageResource->getContent()->hasImage()); | |
| 519 EXPECT_FALSE(imageResource->getContent()->getImage()->isNull()); | |
| 520 EXPECT_EQ(kJpegImage2Width, observer->imageWidthOnLastImageChanged()); | |
| 521 EXPECT_TRUE(observer->imageNotifyFinishedCalled()); | |
| 522 | |
| 523 // The observer should not have been notified of completion again. | |
| 524 EXPECT_EQ(kJpegImageWidth, observer->imageWidthOnImageNotifyFinished()); | |
| 525 | |
| 526 EXPECT_TRUE(imageResource->getContent()->getImage()->isBitmapImage()); | |
| 527 EXPECT_EQ(50, imageResource->getContent()->getImage()->width()); | |
| 528 EXPECT_EQ(50, imageResource->getContent()->getImage()->height()); | |
| 529 } | |
| 530 | |
| 471 TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderDuringFetch) { | 531 TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderDuringFetch) { |
| 472 KURL testURL(ParsedURLString, "http://www.test.com/cancelTest.html"); | 532 KURL testURL(ParsedURLString, "http://www.test.com/cancelTest.html"); |
| 473 ScopedRegisteredURL scopedRegisteredURL(testURL); | 533 ScopedRegisteredURL scopedRegisteredURL(testURL); |
| 474 | 534 |
| 475 ResourceRequest request(testURL); | 535 ResourceRequest request(testURL); |
| 476 request.setPreviewsState(WebURLRequest::ServerLoFiOn); | 536 request.setPreviewsState(WebURLRequest::ServerLoFiOn); |
| 477 FetchRequest fetchRequest(request, FetchInitiatorInfo()); | 537 FetchRequest fetchRequest(request, FetchInitiatorInfo()); |
| 478 ResourceFetcher* fetcher = | 538 ResourceFetcher* fetcher = |
| 479 ResourceFetcher::create(ImageResourceTestMockFetchContext::create()); | 539 ResourceFetcher::create(ImageResourceTestMockFetchContext::create()); |
| 480 | 540 |
| (...skipping 618 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1099 EXPECT_EQ(kJpegImageWidth, observer->imageWidthOnLastImageChanged()); | 1159 EXPECT_EQ(kJpegImageWidth, observer->imageWidthOnLastImageChanged()); |
| 1100 EXPECT_TRUE(observer->imageNotifyFinishedCalled()); | 1160 EXPECT_TRUE(observer->imageNotifyFinishedCalled()); |
| 1101 EXPECT_EQ(kJpegImageWidth, observer->imageWidthOnImageNotifyFinished()); | 1161 EXPECT_EQ(kJpegImageWidth, observer->imageWidthOnImageNotifyFinished()); |
| 1102 | 1162 |
| 1103 ASSERT_TRUE(imageResource->getContent()->hasImage()); | 1163 ASSERT_TRUE(imageResource->getContent()->hasImage()); |
| 1104 EXPECT_EQ(1, imageResource->getContent()->getImage()->width()); | 1164 EXPECT_EQ(1, imageResource->getContent()->getImage()->width()); |
| 1105 EXPECT_EQ(1, imageResource->getContent()->getImage()->height()); | 1165 EXPECT_EQ(1, imageResource->getContent()->getImage()->height()); |
| 1106 EXPECT_TRUE(imageResource->getContent()->getImage()->isBitmapImage()); | 1166 EXPECT_TRUE(imageResource->getContent()->getImage()->isBitmapImage()); |
| 1107 } | 1167 } |
| 1108 | 1168 |
| 1169 TEST(ImageResourceTest, FetchAllowPlaceholderPartialContentWithoutDimensions) { | |
| 1170 KURL testURL(ParsedURLString, "http://www.test.com/cancelTest.html"); | |
| 1171 ScopedRegisteredURL scopedRegisteredURL(testURL); | |
| 1172 | |
| 1173 FetchRequest request(testURL, FetchInitiatorInfo()); | |
| 1174 request.setAllowImagePlaceholder(); | |
| 1175 ImageResource* imageResource = ImageResource::fetch( | |
| 1176 request, | |
| 1177 ResourceFetcher::create(ImageResourceTestMockFetchContext::create())); | |
| 1178 EXPECT_EQ(FetchRequest::AllowPlaceholder, | |
| 1179 request.placeholderImageRequestType()); | |
| 1180 EXPECT_EQ("bytes=0-2047", | |
| 1181 imageResource->resourceRequest().httpHeaderField("range")); | |
| 1182 EXPECT_TRUE(imageResource->isPlaceholder()); | |
| 1183 std::unique_ptr<MockImageResourceObserver> observer = | |
| 1184 MockImageResourceObserver::create(imageResource->getContent()); | |
| 1185 | |
| 1186 ResourceResponse partialResponse(testURL, "image/jpeg", | |
| 1187 kJpegImageSubrangeWithoutDimensionsLength, | |
| 1188 nullAtom, String()); | |
| 1189 partialResponse.setHTTPStatusCode(206); | |
| 1190 partialResponse.setHTTPHeaderField( | |
| 1191 "content-range", | |
| 1192 buildContentRange(kJpegImageSubrangeWithoutDimensionsLength, | |
| 1193 sizeof(kJpegImage))); | |
| 1194 | |
| 1195 imageResource->loader()->didReceiveResponse( | |
| 1196 WrappedResourceResponse(partialResponse)); | |
| 1197 imageResource->loader()->didReceiveData( | |
| 1198 reinterpret_cast<const char*>(kJpegImage), | |
| 1199 kJpegImageSubrangeWithoutDimensionsLength); | |
| 1200 | |
| 1201 EXPECT_EQ(0, observer->imageChangedCount()); | |
| 1202 | |
| 1203 imageResource->loader()->didFinishLoading( | |
| 1204 0.0, kJpegImageSubrangeWithoutDimensionsLength, | |
| 1205 kJpegImageSubrangeWithoutDimensionsLength); | |
| 1206 | |
| 1207 // Decode error didn't occur but the dimensions could not be extracted, | |
| 1208 // so the full original image should be loading. | |
| 1209 EXPECT_EQ(ResourceStatus::Pending, imageResource->getStatus()); | |
| 1210 EXPECT_FALSE(imageResource->isPlaceholder()); | |
| 1211 EXPECT_EQ(nullAtom, | |
| 1212 imageResource->resourceRequest().httpHeaderField("range")); | |
| 1213 EXPECT_EQ( | |
| 1214 static_cast<int>(WebCachePolicy::BypassingCache), | |
| 1215 static_cast<int>(imageResource->resourceRequest().getCachePolicy())); | |
| 1216 EXPECT_FALSE(observer->imageNotifyFinishedCalled()); | |
| 1217 EXPECT_EQ(2, observer->imageChangedCount()); | |
| 1218 | |
| 1219 imageResource->loader()->didReceiveResponse( | |
| 1220 WrappedResourceResponse(ResourceResponse( | |
| 1221 testURL, "image/jpeg", sizeof(kJpegImage), nullAtom, String()))); | |
| 1222 imageResource->loader()->didReceiveData( | |
| 1223 reinterpret_cast<const char*>(kJpegImage), sizeof(kJpegImage)); | |
| 1224 imageResource->loader()->didFinishLoading(0.0, sizeof(kJpegImage), | |
| 1225 sizeof(kJpegImage)); | |
| 1226 | |
| 1227 EXPECT_EQ(ResourceStatus::Cached, imageResource->getStatus()); | |
| 1228 EXPECT_EQ(sizeof(kJpegImage), imageResource->encodedSize()); | |
| 1229 EXPECT_FALSE(imageResource->isPlaceholder()); | |
| 1230 EXPECT_LT(0, observer->imageChangedCount()); | |
| 1231 EXPECT_EQ(kJpegImageWidth, observer->imageWidthOnLastImageChanged()); | |
| 1232 EXPECT_TRUE(observer->imageNotifyFinishedCalled()); | |
| 1233 EXPECT_EQ(kJpegImageWidth, observer->imageWidthOnImageNotifyFinished()); | |
| 1234 | |
| 1235 ASSERT_TRUE(imageResource->getContent()->hasImage()); | |
| 1236 EXPECT_EQ(1, imageResource->getContent()->getImage()->width()); | |
| 1237 EXPECT_EQ(1, imageResource->getContent()->getImage()->height()); | |
| 1238 EXPECT_TRUE(imageResource->getContent()->getImage()->isBitmapImage()); | |
| 1239 } | |
| 1240 | |
| 1241 // Testing DecodeError that occurs in didFinishLoading(). | |
| 1242 // This is similar to DecodeErrorWithEmptyBody, but with non-empty body. | |
| 1243 TEST(ImageResourceTest, PartialContentWithoutDimensions) { | |
|
sclittle
2017/01/27 21:56:06
nit: Would it make sense to move this test up abov
hiroshige
2017/02/06 22:50:45
Done.
| |
| 1244 KURL testURL(ParsedURLString, "http://www.test.com/cancelTest.html"); | |
| 1245 ScopedRegisteredURL scopedRegisteredURL(testURL); | |
| 1246 | |
| 1247 FetchRequest request(testURL, FetchInitiatorInfo()); | |
| 1248 ResourceFetcher* fetcher = | |
| 1249 ResourceFetcher::create(ImageResourceTestMockFetchContext::create()); | |
| 1250 ImageResource* imageResource = ImageResource::fetch(request, fetcher); | |
| 1251 std::unique_ptr<MockImageResourceObserver> observer = | |
| 1252 MockImageResourceObserver::create(imageResource->getContent()); | |
| 1253 | |
| 1254 ResourceResponse partialResponse(testURL, "image/jpeg", | |
| 1255 kJpegImageSubrangeWithoutDimensionsLength, | |
| 1256 nullAtom, String()); | |
| 1257 partialResponse.setHTTPStatusCode(206); | |
| 1258 partialResponse.setHTTPHeaderField( | |
| 1259 "content-range", | |
| 1260 buildContentRange(kJpegImageSubrangeWithoutDimensionsLength, | |
| 1261 sizeof(kJpegImage))); | |
| 1262 | |
| 1263 imageResource->loader()->didReceiveResponse( | |
| 1264 WrappedResourceResponse(partialResponse)); | |
| 1265 imageResource->loader()->didReceiveData( | |
| 1266 reinterpret_cast<const char*>(kJpegImage), | |
| 1267 kJpegImageSubrangeWithoutDimensionsLength); | |
| 1268 | |
| 1269 EXPECT_EQ(ResourceStatus::Pending, imageResource->getStatus()); | |
| 1270 EXPECT_FALSE(observer->imageNotifyFinishedCalled()); | |
| 1271 EXPECT_EQ(0, observer->imageChangedCount()); | |
| 1272 | |
| 1273 imageResource->loader()->didFinishLoading( | |
| 1274 0.0, kJpegImageSubrangeWithoutDimensionsLength, | |
| 1275 kJpegImageSubrangeWithoutDimensionsLength); | |
| 1276 | |
| 1277 EXPECT_EQ(ResourceStatus::DecodeError, imageResource->getStatus()); | |
| 1278 EXPECT_TRUE(observer->imageNotifyFinishedCalled()); | |
| 1279 EXPECT_EQ(ResourceStatus::DecodeError, | |
| 1280 observer->statusOnImageNotifyFinished()); | |
| 1281 EXPECT_EQ(1, observer->imageChangedCount()); | |
| 1282 EXPECT_FALSE(imageResource->isLoading()); | |
| 1283 } | |
| 1284 | |
| 1109 TEST(ImageResourceTest, FetchAllowPlaceholderThenDisallowPlaceholder) { | 1285 TEST(ImageResourceTest, FetchAllowPlaceholderThenDisallowPlaceholder) { |
| 1110 KURL testURL(ParsedURLString, "http://www.test.com/cancelTest.html"); | 1286 KURL testURL(ParsedURLString, "http://www.test.com/cancelTest.html"); |
| 1111 ScopedRegisteredURL scopedRegisteredURL(testURL); | 1287 ScopedRegisteredURL scopedRegisteredURL(testURL); |
| 1112 | 1288 |
| 1113 ResourceFetcher* fetcher = | 1289 ResourceFetcher* fetcher = |
| 1114 ResourceFetcher::create(ImageResourceTestMockFetchContext::create()); | 1290 ResourceFetcher::create(ImageResourceTestMockFetchContext::create()); |
| 1115 FetchRequest placeholderRequest(testURL, FetchInitiatorInfo()); | 1291 FetchRequest placeholderRequest(testURL, FetchInitiatorInfo()); |
| 1116 placeholderRequest.setAllowImagePlaceholder(); | 1292 placeholderRequest.setAllowImagePlaceholder(); |
| 1117 ImageResource* imageResource = | 1293 ImageResource* imageResource = |
| 1118 ImageResource::fetch(placeholderRequest, fetcher); | 1294 ImageResource::fetch(placeholderRequest, fetcher); |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1269 EXPECT_TRUE(observer->imageNotifyFinishedCalled()); | 1445 EXPECT_TRUE(observer->imageNotifyFinishedCalled()); |
| 1270 EXPECT_TRUE(imageResource->getContent()->getImage()->isBitmapImage()); | 1446 EXPECT_TRUE(imageResource->getContent()->getImage()->isBitmapImage()); |
| 1271 EXPECT_EQ(50, imageResource->getContent()->getImage()->width()); | 1447 EXPECT_EQ(50, imageResource->getContent()->getImage()->width()); |
| 1272 EXPECT_EQ(50, imageResource->getContent()->getImage()->height()); | 1448 EXPECT_EQ(50, imageResource->getContent()->getImage()->height()); |
| 1273 | 1449 |
| 1274 WTF::setTimeFunctionsForTesting(nullptr); | 1450 WTF::setTimeFunctionsForTesting(nullptr); |
| 1275 } | 1451 } |
| 1276 | 1452 |
| 1277 } // namespace | 1453 } // namespace |
| 1278 } // namespace blink | 1454 } // namespace blink |
| OLD | NEW |