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

Unified Diff: third_party/WebKit/Source/core/fetch/ImageResourceTest.cpp

Issue 2423683002: Add Blink support for showing image placeholders using range requests. (Closed)
Patch Set: Addressed comments Created 4 years, 2 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
Index: third_party/WebKit/Source/core/fetch/ImageResourceTest.cpp
diff --git a/third_party/WebKit/Source/core/fetch/ImageResourceTest.cpp b/third_party/WebKit/Source/core/fetch/ImageResourceTest.cpp
index 00c2c99dcdcfd5fe9fc4039bd927f388303bd5fe..e979eaa9dea29748be55ac75dc29495b9418fd2d 100644
--- a/third_party/WebKit/Source/core/fetch/ImageResourceTest.cpp
+++ b/third_party/WebKit/Source/core/fetch/ImageResourceTest.cpp
@@ -39,16 +39,19 @@
#include "core/fetch/UniqueIdentifier.h"
#include "platform/SharedBuffer.h"
#include "platform/exported/WrappedResourceResponse.h"
+#include "platform/graphics/BitmapImage.h"
#include "platform/graphics/Image.h"
#include "platform/scheduler/test/fake_web_task_runner.h"
#include "platform/testing/URLTestHelpers.h"
#include "platform/testing/UnitTestHelpers.h"
#include "public/platform/Platform.h"
+#include "public/platform/WebCachePolicy.h"
#include "public/platform/WebURL.h"
#include "public/platform/WebURLLoaderMockFactory.h"
#include "public/platform/WebURLResponse.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "wtf/PtrUtil.h"
+#include "wtf/text/Base64.h"
#include <memory>
namespace blink {
@@ -56,112 +59,103 @@ namespace blink {
namespace {
// An image of size 1x1.
-static Vector<unsigned char> jpegImage() {
- Vector<unsigned char> jpeg;
-
- static const unsigned char data[] = {
- 0xff, 0xd8, 0xff, 0xe0, 0x00, 0x10, 0x4a, 0x46, 0x49, 0x46, 0x00, 0x01,
- 0x01, 0x01, 0x00, 0x48, 0x00, 0x48, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x13,
- 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68,
- 0x20, 0x47, 0x49, 0x4d, 0x50, 0xff, 0xdb, 0x00, 0x43, 0x00, 0x05, 0x03,
- 0x04, 0x04, 0x04, 0x03, 0x05, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x06,
- 0x07, 0x0c, 0x08, 0x07, 0x07, 0x07, 0x07, 0x0f, 0x0b, 0x0b, 0x09, 0x0c,
- 0x11, 0x0f, 0x12, 0x12, 0x11, 0x0f, 0x11, 0x11, 0x13, 0x16, 0x1c, 0x17,
- 0x13, 0x14, 0x1a, 0x15, 0x11, 0x11, 0x18, 0x21, 0x18, 0x1a, 0x1d, 0x1d,
- 0x1f, 0x1f, 0x1f, 0x13, 0x17, 0x22, 0x24, 0x22, 0x1e, 0x24, 0x1c, 0x1e,
- 0x1f, 0x1e, 0xff, 0xdb, 0x00, 0x43, 0x01, 0x05, 0x05, 0x05, 0x07, 0x06,
- 0x07, 0x0e, 0x08, 0x08, 0x0e, 0x1e, 0x14, 0x11, 0x14, 0x1e, 0x1e, 0x1e,
- 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e,
- 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e,
- 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e,
- 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0xff,
- 0xc0, 0x00, 0x11, 0x08, 0x00, 0x01, 0x00, 0x01, 0x03, 0x01, 0x22, 0x00,
- 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xff, 0xc4, 0x00, 0x15, 0x00, 0x01,
- 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xc4, 0x00, 0x14, 0x10, 0x01, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0xff, 0xc4, 0x00, 0x14, 0x01, 0x01, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0xff, 0xc4, 0x00, 0x14, 0x11, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
- 0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f,
- 0x00, 0xb2, 0xc0, 0x07, 0xff, 0xd9};
-
- jpeg.append(data, sizeof(data));
- return jpeg;
+const char kJpegImage[] = {
+ 0xff, 0xd8, 0xff, 0xe0, 0x00, 0x10, 0x4a, 0x46, 0x49, 0x46, 0x00, 0x01,
+ 0x01, 0x01, 0x00, 0x48, 0x00, 0x48, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x13,
+ 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68,
+ 0x20, 0x47, 0x49, 0x4d, 0x50, 0xff, 0xdb, 0x00, 0x43, 0x00, 0x05, 0x03,
+ 0x04, 0x04, 0x04, 0x03, 0x05, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x06,
+ 0x07, 0x0c, 0x08, 0x07, 0x07, 0x07, 0x07, 0x0f, 0x0b, 0x0b, 0x09, 0x0c,
+ 0x11, 0x0f, 0x12, 0x12, 0x11, 0x0f, 0x11, 0x11, 0x13, 0x16, 0x1c, 0x17,
+ 0x13, 0x14, 0x1a, 0x15, 0x11, 0x11, 0x18, 0x21, 0x18, 0x1a, 0x1d, 0x1d,
+ 0x1f, 0x1f, 0x1f, 0x13, 0x17, 0x22, 0x24, 0x22, 0x1e, 0x24, 0x1c, 0x1e,
+ 0x1f, 0x1e, 0xff, 0xdb, 0x00, 0x43, 0x01, 0x05, 0x05, 0x05, 0x07, 0x06,
+ 0x07, 0x0e, 0x08, 0x08, 0x0e, 0x1e, 0x14, 0x11, 0x14, 0x1e, 0x1e, 0x1e,
+ 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e,
+ 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e,
+ 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e,
+ 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0xff,
+ 0xc0, 0x00, 0x11, 0x08, 0x00, 0x01, 0x00, 0x01, 0x03, 0x01, 0x22, 0x00,
+ 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xff, 0xc4, 0x00, 0x15, 0x00, 0x01,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xc4, 0x00, 0x14, 0x10, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0xc4, 0x00, 0x14, 0x01, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xc4, 0x00, 0x14, 0x11, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
+ 0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f,
+ 0x00, 0xb2, 0xc0, 0x07, 0xff, 0xd9};
+
+const size_t kJpegImageSubrangeWithDimensionsLength = sizeof(kJpegImage) - 1;
+
+// Ensure that the image decoder can determine the dimensions of kJpegImage from
+// just the first kJpegImageSubrangeWithDimensionsLength bytes. If this test
+// fails, then the test data here probably needs to be updated.
+TEST(ImageResourceTest, DimensionsDecodableFromPartialTestImage) {
+ RefPtr<Image> image = BitmapImage::create();
+ EXPECT_EQ(
+ Image::SizeAvailable,
+ image->setData(SharedBuffer::create(
+ kJpegImage, kJpegImageSubrangeWithDimensionsLength),
+ true));
+ EXPECT_TRUE(image->isBitmapImage());
+ EXPECT_EQ(1, image->width());
+ EXPECT_EQ(1, image->height());
}
// An image of size 50x50.
-static Vector<unsigned char> jpegImage2() {
- Vector<unsigned char> jpeg;
-
- static const unsigned char data[] = {
- 0xff, 0xd8, 0xff, 0xe0, 0x00, 0x10, 0x4a, 0x46, 0x49, 0x46, 0x00, 0x01,
- 0x01, 0x01, 0x00, 0x48, 0x00, 0x48, 0x00, 0x00, 0xff, 0xdb, 0x00, 0x43,
- 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x00, 0x43, 0x01, 0xff, 0xff,
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
- 0xff, 0xff, 0xff, 0xc0, 0x00, 0x11, 0x08, 0x00, 0x32, 0x00, 0x32, 0x03,
- 0x01, 0x22, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xff, 0xc4, 0x00,
- 0x14, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc4, 0x00, 0x14, 0x10,
- 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc4, 0x00, 0x15, 0x01, 0x01, 0x01,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x00, 0x14, 0x11, 0x01, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0xff, 0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03,
- 0x11, 0x00, 0x3f, 0x00, 0x00, 0x94, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xd9};
-
- jpeg.append(data, sizeof(data));
- return jpeg;
-}
-
-static Vector<unsigned char> svgImage() {
- static const char data[] =
- "<svg width=\"200\" height=\"200\" xmlns=\"http://www.w3.org/2000/svg\" "
- "xmlns:xlink=\"http://www.w3.org/1999/xlink\">"
- "<rect x=\"0\" y=\"0\" width=\"100px\" height=\"100px\" fill=\"red\"/>"
- "</svg>";
-
- Vector<unsigned char> svg;
- svg.append(data, strlen(data));
- return svg;
-}
-
-static Vector<unsigned char> svgImage2() {
- static const char data[] =
- "<svg width=\"300\" height=\"300\" xmlns=\"http://www.w3.org/2000/svg\" "
- "xmlns:xlink=\"http://www.w3.org/1999/xlink\">"
- "<rect x=\"0\" y=\"0\" width=\"200px\" height=\"200px\" fill=\"green\"/>"
- "</svg>";
-
- Vector<unsigned char> svg;
- svg.append(data, strlen(data));
- return svg;
-}
+const char kJpegImage2[] = {
+ 0xff, 0xd8, 0xff, 0xe0, 0x00, 0x10, 0x4a, 0x46, 0x49, 0x46, 0x00, 0x01,
+ 0x01, 0x01, 0x00, 0x48, 0x00, 0x48, 0x00, 0x00, 0xff, 0xdb, 0x00, 0x43,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x00, 0x43, 0x01, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xc0, 0x00, 0x11, 0x08, 0x00, 0x32, 0x00, 0x32, 0x03,
+ 0x01, 0x22, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xff, 0xc4, 0x00,
+ 0x14, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc4, 0x00, 0x14, 0x10,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc4, 0x00, 0x15, 0x01, 0x01, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x00, 0x14, 0x11, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03,
+ 0x11, 0x00, 0x3f, 0x00, 0x00, 0x94, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xd9};
+
+const char kSvgImage[] =
+ "<svg width=\"200\" height=\"200\" xmlns=\"http://www.w3.org/2000/svg\" "
+ "xmlns:xlink=\"http://www.w3.org/1999/xlink\">"
+ "<rect x=\"0\" y=\"0\" width=\"100px\" height=\"100px\" fill=\"red\"/>"
+ "</svg>";
+
+const char kSvgImage2[] =
+ "<svg width=\"300\" height=\"300\" xmlns=\"http://www.w3.org/2000/svg\" "
+ "xmlns:xlink=\"http://www.w3.org/1999/xlink\">"
+ "<rect x=\"0\" y=\"0\" width=\"200px\" height=\"200px\" fill=\"green\"/>"
+ "</svg>";
void receiveResponse(ImageResource* imageResource,
const KURL& url,
const AtomicString& mimeType,
- const Vector<unsigned char>& data) {
+ const char* data,
+ size_t dataSize) {
ResourceResponse response;
response.setURL(url);
response.setHTTPStatusCode(200);
response.setMimeType(mimeType);
imageResource->responseReceived(response, nullptr);
- imageResource->appendData(reinterpret_cast<const char*>(data.data()),
- data.size());
+ imageResource->appendData(data, dataSize);
imageResource->finish();
}
@@ -216,7 +210,10 @@ class ScopedRegisteredURL {
KURL m_url;
};
-} // namespace
+AtomicString buildContentRange(size_t rangeLength, size_t totalLength) {
+ return AtomicString(String("bytes 0-" + String::number(rangeLength) + "/" +
+ String::number(totalLength)));
+}
TEST(ImageResourceTest, MultipartImage) {
ResourceFetcher* fetcher =
@@ -342,12 +339,11 @@ TEST(ImageResourceTest, DecodedDataRemainsWhileHasClients) {
String()),
nullptr);
- Vector<unsigned char> jpeg = jpegImage();
cachedImage->responseReceived(
- ResourceResponse(KURL(), "image/jpeg", jpeg.size(), nullAtom, String()),
+ ResourceResponse(KURL(), "image/jpeg", sizeof(kJpegImage), nullAtom,
+ String()),
nullptr);
- cachedImage->appendData(reinterpret_cast<const char*>(jpeg.data()),
- jpeg.size());
+ cachedImage->appendData(kJpegImage, sizeof(kJpegImage));
cachedImage->finish();
EXPECT_FALSE(cachedImage->errorOccurred());
ASSERT_TRUE(cachedImage->hasImage());
@@ -379,12 +375,11 @@ TEST(ImageResourceTest, UpdateBitmapImages) {
new MockImageResourceClient(cachedImage);
// Send the image response.
- Vector<unsigned char> jpeg = jpegImage();
cachedImage->responseReceived(
- ResourceResponse(KURL(), "image/jpeg", jpeg.size(), nullAtom, String()),
+ ResourceResponse(KURL(), "image/jpeg", sizeof(kJpegImage), nullAtom,
+ String()),
nullptr);
- cachedImage->appendData(reinterpret_cast<const char*>(jpeg.data()),
- jpeg.size());
+ cachedImage->appendData(kJpegImage, sizeof(kJpegImage));
cachedImage->finish();
EXPECT_FALSE(cachedImage->errorOccurred());
ASSERT_TRUE(cachedImage->hasImage());
@@ -394,7 +389,7 @@ TEST(ImageResourceTest, UpdateBitmapImages) {
EXPECT_TRUE(cachedImage->getImage()->isBitmapImage());
}
-TEST(ImageResourceTest, ReloadIfLoFiAfterFinished) {
+TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderAfterFinished) {
KURL testURL(ParsedURLString, "http://www.test.com/cancelTest.html");
ScopedRegisteredURL scopedRegisteredURL(testURL);
ResourceRequest request = ResourceRequest(testURL);
@@ -408,56 +403,53 @@ TEST(ImageResourceTest, ReloadIfLoFiAfterFinished) {
ResourceFetcher::create(ImageResourceTestMockFetchContext::create());
// Send the image response.
- Vector<unsigned char> jpeg = jpegImage();
- ResourceResponse resourceResponse(KURL(), "image/jpeg", jpeg.size(), nullAtom,
- String());
+ ResourceResponse resourceResponse(KURL(), "image/jpeg", sizeof(kJpegImage),
+ nullAtom, String());
resourceResponse.addHTTPHeaderField("chrome-proxy", "q=low");
cachedImage->responseReceived(resourceResponse, nullptr);
- cachedImage->appendData(reinterpret_cast<const char*>(jpeg.data()),
- jpeg.size());
+ cachedImage->appendData(kJpegImage, sizeof(kJpegImage));
cachedImage->finish();
EXPECT_FALSE(cachedImage->errorOccurred());
ASSERT_TRUE(cachedImage->hasImage());
EXPECT_FALSE(cachedImage->getImage()->isNull());
EXPECT_EQ(2, client->imageChangedCount());
- EXPECT_EQ(jpeg.size(), client->encodedSizeOnLastImageChanged());
+ EXPECT_EQ(sizeof(kJpegImage), client->encodedSizeOnLastImageChanged());
// The client should have been notified that the image load completed.
EXPECT_TRUE(client->notifyFinishedCalled());
- EXPECT_EQ(jpeg.size(), client->encodedSizeOnNotifyFinished());
- EXPECT_EQ(jpeg.size(), client->encodedSizeOnImageNotifyFinished());
+ EXPECT_EQ(sizeof(kJpegImage), client->encodedSizeOnNotifyFinished());
+ EXPECT_EQ(sizeof(kJpegImage), client->encodedSizeOnImageNotifyFinished());
EXPECT_TRUE(cachedImage->getImage()->isBitmapImage());
EXPECT_EQ(1, cachedImage->getImage()->width());
EXPECT_EQ(1, cachedImage->getImage()->height());
- // Call reloadIfLoFi() after the image has finished loading.
- cachedImage->reloadIfLoFi(fetcher);
+ // Call reloadIfLoFiOrPlaceholder() after the image has finished loading.
+ cachedImage->reloadIfLoFiOrPlaceholder(fetcher);
EXPECT_FALSE(cachedImage->errorOccurred());
EXPECT_FALSE(cachedImage->resourceBuffer());
EXPECT_FALSE(cachedImage->hasImage());
EXPECT_EQ(3, client->imageChangedCount());
- Vector<unsigned char> jpeg2 = jpegImage2();
cachedImage->loader()->didReceiveResponse(
nullptr, WrappedResourceResponse(resourceResponse), nullptr);
cachedImage->loader()->didReceiveData(
- nullptr, reinterpret_cast<const char*>(jpeg2.data()), jpeg2.size(),
- jpeg2.size(), jpeg2.size());
- cachedImage->loader()->didFinishLoading(nullptr, 0.0, jpeg2.size());
+ nullptr, kJpegImage2, sizeof(kJpegImage2), sizeof(kJpegImage2),
+ sizeof(kJpegImage2));
+ cachedImage->loader()->didFinishLoading(nullptr, 0.0, sizeof(kJpegImage2));
EXPECT_FALSE(cachedImage->errorOccurred());
ASSERT_TRUE(cachedImage->hasImage());
EXPECT_FALSE(cachedImage->getImage()->isNull());
- EXPECT_EQ(jpeg2.size(), client->encodedSizeOnLastImageChanged());
+ EXPECT_EQ(sizeof(kJpegImage2), client->encodedSizeOnLastImageChanged());
EXPECT_TRUE(client->notifyFinishedCalled());
// The client should not have been notified of completion again.
- EXPECT_EQ(jpeg.size(), client->encodedSizeOnNotifyFinished());
- EXPECT_EQ(jpeg.size(), client->encodedSizeOnImageNotifyFinished());
+ EXPECT_EQ(sizeof(kJpegImage), client->encodedSizeOnNotifyFinished());
+ EXPECT_EQ(sizeof(kJpegImage), client->encodedSizeOnImageNotifyFinished());
EXPECT_TRUE(cachedImage->getImage()->isBitmapImage());
EXPECT_EQ(50, cachedImage->getImage()->width());
EXPECT_EQ(50, cachedImage->getImage()->height());
}
-TEST(ImageResourceTest, ReloadIfLoFiDuringFetch) {
+TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderDuringFetch) {
KURL testURL(ParsedURLString, "http://www.test.com/cancelTest.html");
ScopedRegisteredURL scopedRegisteredURL(testURL);
@@ -472,30 +464,27 @@ TEST(ImageResourceTest, ReloadIfLoFiDuringFetch) {
new MockImageResourceClient(cachedImage);
// Send the image response.
- Vector<unsigned char> jpeg = jpegImage();
-
- ResourceResponse initialResourceResponse(testURL, "image/jpeg", jpeg.size(),
- nullAtom, String());
+ ResourceResponse initialResourceResponse(
+ testURL, "image/jpeg", sizeof(kJpegImage), nullAtom, String());
initialResourceResponse.addHTTPHeaderField("chrome-proxy", "q=low");
cachedImage->loader()->didReceiveResponse(
nullptr, WrappedResourceResponse(initialResourceResponse));
- cachedImage->loader()->didReceiveData(
- nullptr, reinterpret_cast<const char*>(jpeg.data()), jpeg.size(),
- jpeg.size(), jpeg.size());
+ cachedImage->loader()->didReceiveData(nullptr, kJpegImage, sizeof(kJpegImage),
+ sizeof(kJpegImage), sizeof(kJpegImage));
EXPECT_FALSE(cachedImage->errorOccurred());
ASSERT_TRUE(cachedImage->hasImage());
EXPECT_FALSE(cachedImage->getImage()->isNull());
EXPECT_EQ(1, client->imageChangedCount());
- EXPECT_EQ(jpeg.size(), client->encodedSizeOnLastImageChanged());
+ EXPECT_EQ(sizeof(kJpegImage), client->encodedSizeOnLastImageChanged());
EXPECT_FALSE(client->notifyFinishedCalled());
EXPECT_TRUE(cachedImage->getImage()->isBitmapImage());
EXPECT_EQ(1, cachedImage->getImage()->width());
EXPECT_EQ(1, cachedImage->getImage()->height());
- // Call reloadIfLoFi() while the image is still loading.
- cachedImage->reloadIfLoFi(fetcher);
+ // Call reloadIfLoFiOrPlaceholder() while the image is still loading.
+ cachedImage->reloadIfLoFiOrPlaceholder(fetcher);
EXPECT_FALSE(cachedImage->errorOccurred());
EXPECT_FALSE(cachedImage->resourceBuffer());
EXPECT_FALSE(cachedImage->hasImage());
@@ -505,37 +494,83 @@ TEST(ImageResourceTest, ReloadIfLoFiDuringFetch) {
// is still loading.
EXPECT_FALSE(client->notifyFinishedCalled());
- Vector<unsigned char> jpeg2 = jpegImage2();
cachedImage->loader()->didReceiveResponse(
- nullptr, WrappedResourceResponse(ResourceResponse(
- testURL, "image/jpeg", jpeg.size(), nullAtom, String())),
+ nullptr,
+ WrappedResourceResponse(ResourceResponse(
+ testURL, "image/jpeg", sizeof(kJpegImage2), nullAtom, String())),
nullptr);
cachedImage->loader()->didReceiveData(
- nullptr, reinterpret_cast<const char*>(jpeg2.data()), jpeg2.size(),
- jpeg2.size(), jpeg2.size());
- cachedImage->loader()->didFinishLoading(nullptr, 0.0, jpeg2.size());
+ nullptr, kJpegImage2, sizeof(kJpegImage2), sizeof(kJpegImage2),
+ sizeof(kJpegImage2));
+ cachedImage->loader()->didFinishLoading(nullptr, 0.0, sizeof(kJpegImage2));
EXPECT_FALSE(cachedImage->errorOccurred());
ASSERT_TRUE(cachedImage->hasImage());
EXPECT_FALSE(cachedImage->getImage()->isNull());
- EXPECT_EQ(jpeg2.size(), client->encodedSizeOnLastImageChanged());
+ EXPECT_EQ(sizeof(kJpegImage2), client->encodedSizeOnLastImageChanged());
// The client should have been notified of completion only after the reload
// completed.
EXPECT_TRUE(client->notifyFinishedCalled());
- EXPECT_EQ(jpeg2.size(), client->encodedSizeOnNotifyFinished());
- EXPECT_EQ(jpeg2.size(), client->encodedSizeOnImageNotifyFinished());
+ EXPECT_EQ(sizeof(kJpegImage2), client->encodedSizeOnNotifyFinished());
+ EXPECT_EQ(sizeof(kJpegImage2), client->encodedSizeOnImageNotifyFinished());
EXPECT_TRUE(cachedImage->getImage()->isBitmapImage());
EXPECT_EQ(50, cachedImage->getImage()->width());
EXPECT_EQ(50, cachedImage->getImage()->height());
}
+TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderForPlaceholder) {
+ KURL testURL(ParsedURLString, "http://www.test.com/cancelTest.html");
+ ScopedRegisteredURL scopedRegisteredURL(testURL);
+
+ ResourceFetcher* fetcher =
+ ResourceFetcher::create(ImageResourceTestMockFetchContext::create());
+ FetchRequest request(testURL, FetchInitiatorInfo());
+ request.setAllowImagePlaceholder();
+ ImageResource* image = ImageResource::fetch(request, fetcher);
+ EXPECT_EQ(FetchRequest::AllowPlaceholder,
+ request.placeholderImageRequestType());
+ EXPECT_EQ("bytes=0-2047", image->resourceRequest().httpHeaderField("range"));
+ Persistent<MockImageResourceClient> client =
+ new MockImageResourceClient(image);
+
+ ResourceResponse response(testURL, "image/jpeg",
+ kJpegImageSubrangeWithDimensionsLength, nullAtom,
+ String());
+ response.setHTTPStatusCode(206);
+ response.setHTTPHeaderField(
+ "content-range", buildContentRange(kJpegImageSubrangeWithDimensionsLength,
+ sizeof(kJpegImage)));
+ image->loader()->didReceiveResponse(nullptr,
+ WrappedResourceResponse(response));
+ image->loader()->didReceiveData(nullptr, kJpegImage,
+ kJpegImageSubrangeWithDimensionsLength,
+ kJpegImageSubrangeWithDimensionsLength,
+ kJpegImageSubrangeWithDimensionsLength);
+ image->loader()->didFinishLoading(nullptr, 0.0,
+ kJpegImageSubrangeWithDimensionsLength);
+
+ EXPECT_EQ(Resource::Cached, image->getStatus());
+ EXPECT_TRUE(image->isPlaceholder());
+
+ image->reloadIfLoFiOrPlaceholder(fetcher);
+
+ EXPECT_EQ(Resource::Pending, image->getStatus());
+ EXPECT_FALSE(image->isPlaceholder());
+ EXPECT_EQ(nullAtom, image->resourceRequest().httpHeaderField("range"));
+ EXPECT_EQ(static_cast<int>(WebCachePolicy::BypassingCache),
+ static_cast<int>(image->resourceRequest().getCachePolicy()));
+
+ image->loader()->cancel();
+}
+
TEST(ImageResourceTest, SVGImage) {
KURL url(ParsedURLString, "http://127.0.0.1:8000/foo");
ImageResource* imageResource = ImageResource::create(ResourceRequest(url));
Persistent<MockImageResourceClient> client =
new MockImageResourceClient(imageResource);
- receiveResponse(imageResource, url, "image/svg+xml", svgImage());
+ receiveResponse(imageResource, url, "image/svg+xml", kSvgImage,
+ strlen(kSvgImage));
EXPECT_FALSE(imageResource->errorOccurred());
ASSERT_TRUE(imageResource->hasImage());
@@ -551,7 +586,8 @@ TEST(ImageResourceTest, SuccessfulRevalidationJpeg) {
Persistent<MockImageResourceClient> client =
new MockImageResourceClient(imageResource);
- receiveResponse(imageResource, url, "image/jpeg", jpegImage());
+ receiveResponse(imageResource, url, "image/jpeg", kJpegImage,
+ sizeof(kJpegImage));
EXPECT_FALSE(imageResource->errorOccurred());
ASSERT_TRUE(imageResource->hasImage());
@@ -585,7 +621,8 @@ TEST(ImageResourceTest, SuccessfulRevalidationSvg) {
Persistent<MockImageResourceClient> client =
new MockImageResourceClient(imageResource);
- receiveResponse(imageResource, url, "image/svg+xml", svgImage());
+ receiveResponse(imageResource, url, "image/svg+xml", kSvgImage,
+ strlen(kSvgImage));
EXPECT_FALSE(imageResource->errorOccurred());
ASSERT_TRUE(imageResource->hasImage());
@@ -618,7 +655,8 @@ TEST(ImageResourceTest, FailedRevalidationJpegToJpeg) {
Persistent<MockImageResourceClient> client =
new MockImageResourceClient(imageResource);
- receiveResponse(imageResource, url, "image/jpeg", jpegImage());
+ receiveResponse(imageResource, url, "image/jpeg", kJpegImage,
+ sizeof(kJpegImage));
EXPECT_FALSE(imageResource->errorOccurred());
ASSERT_TRUE(imageResource->hasImage());
@@ -630,7 +668,8 @@ TEST(ImageResourceTest, FailedRevalidationJpegToJpeg) {
EXPECT_EQ(1, imageResource->getImage()->height());
imageResource->setRevalidatingRequest(ResourceRequest(url));
- receiveResponse(imageResource, url, "image/jpeg", jpegImage2());
+ receiveResponse(imageResource, url, "image/jpeg", kJpegImage2,
+ sizeof(kJpegImage2));
EXPECT_FALSE(imageResource->errorOccurred());
ASSERT_TRUE(imageResource->hasImage());
@@ -648,7 +687,8 @@ TEST(ImageResourceTest, FailedRevalidationJpegToSvg) {
Persistent<MockImageResourceClient> client =
new MockImageResourceClient(imageResource);
- receiveResponse(imageResource, url, "image/jpeg", jpegImage());
+ receiveResponse(imageResource, url, "image/jpeg", kJpegImage,
+ sizeof(kJpegImage));
EXPECT_FALSE(imageResource->errorOccurred());
ASSERT_TRUE(imageResource->hasImage());
@@ -660,7 +700,8 @@ TEST(ImageResourceTest, FailedRevalidationJpegToSvg) {
EXPECT_EQ(1, imageResource->getImage()->height());
imageResource->setRevalidatingRequest(ResourceRequest(url));
- receiveResponse(imageResource, url, "image/svg+xml", svgImage());
+ receiveResponse(imageResource, url, "image/svg+xml", kSvgImage,
+ strlen(kSvgImage));
EXPECT_FALSE(imageResource->errorOccurred());
ASSERT_TRUE(imageResource->hasImage());
@@ -678,7 +719,8 @@ TEST(ImageResourceTest, FailedRevalidationSvgToJpeg) {
Persistent<MockImageResourceClient> client =
new MockImageResourceClient(imageResource);
- receiveResponse(imageResource, url, "image/svg+xml", svgImage());
+ receiveResponse(imageResource, url, "image/svg+xml", kSvgImage,
+ strlen(kSvgImage));
EXPECT_FALSE(imageResource->errorOccurred());
ASSERT_TRUE(imageResource->hasImage());
@@ -690,7 +732,8 @@ TEST(ImageResourceTest, FailedRevalidationSvgToJpeg) {
EXPECT_EQ(200, imageResource->getImage()->height());
imageResource->setRevalidatingRequest(ResourceRequest(url));
- receiveResponse(imageResource, url, "image/jpeg", jpegImage());
+ receiveResponse(imageResource, url, "image/jpeg", kJpegImage,
+ sizeof(kJpegImage));
EXPECT_FALSE(imageResource->errorOccurred());
ASSERT_TRUE(imageResource->hasImage());
@@ -708,7 +751,8 @@ TEST(ImageResourceTest, FailedRevalidationSvgToSvg) {
Persistent<MockImageResourceClient> client =
new MockImageResourceClient(imageResource);
- receiveResponse(imageResource, url, "image/svg+xml", svgImage());
+ receiveResponse(imageResource, url, "image/svg+xml", kSvgImage,
+ strlen(kSvgImage));
EXPECT_FALSE(imageResource->errorOccurred());
ASSERT_TRUE(imageResource->hasImage());
@@ -720,7 +764,8 @@ TEST(ImageResourceTest, FailedRevalidationSvgToSvg) {
EXPECT_EQ(200, imageResource->getImage()->height());
imageResource->setRevalidatingRequest(ResourceRequest(url));
- receiveResponse(imageResource, url, "image/svg+xml", svgImage2());
+ receiveResponse(imageResource, url, "image/svg+xml", kSvgImage2,
+ strlen(kSvgImage2));
EXPECT_FALSE(imageResource->errorOccurred());
ASSERT_TRUE(imageResource->hasImage());
@@ -742,7 +787,8 @@ TEST(ImageResourceTest, AddClientAfterPrune) {
Persistent<MockResourceClient> client1 =
new MockResourceClient(imageResource);
- receiveResponse(imageResource, url, "image/jpeg", jpegImage());
+ receiveResponse(imageResource, url, "image/jpeg", kJpegImage,
+ sizeof(kJpegImage));
EXPECT_FALSE(imageResource->errorOccurred());
ASSERT_TRUE(imageResource->hasImage());
@@ -789,4 +835,277 @@ TEST(ImageResourceTest, CancelOnDecodeError) {
EXPECT_FALSE(cachedImage->isLoading());
}
+TEST(ImageResourceTest, FetchDisallowPlaceholder) {
+ KURL testURL(ParsedURLString, "http://www.test.com/cancelTest.html");
+ ScopedRegisteredURL scopedRegisteredURL(testURL);
+
+ FetchRequest request(testURL, FetchInitiatorInfo());
+ ImageResource* image = ImageResource::fetch(
+ request,
+ ResourceFetcher::create(ImageResourceTestMockFetchContext::create()));
+ EXPECT_EQ(FetchRequest::DisallowPlaceholder,
+ request.placeholderImageRequestType());
+ EXPECT_EQ(nullAtom, image->resourceRequest().httpHeaderField("range"));
+ EXPECT_FALSE(image->isPlaceholder());
+ Persistent<MockImageResourceClient> client =
+ new MockImageResourceClient(image);
+
+ image->loader()->didReceiveResponse(
+ nullptr,
+ WrappedResourceResponse(ResourceResponse(
+ testURL, "image/jpeg", sizeof(kJpegImage), nullAtom, String())));
+ image->loader()->didReceiveData(nullptr, kJpegImage, sizeof(kJpegImage),
+ sizeof(kJpegImage), sizeof(kJpegImage));
+ image->loader()->didFinishLoading(nullptr, 0.0, sizeof(kJpegImage));
+
+ EXPECT_EQ(Resource::Cached, image->getStatus());
+ EXPECT_EQ(sizeof(kJpegImage), image->encodedSize());
+ EXPECT_FALSE(image->isPlaceholder());
+ EXPECT_LT(0, client->imageChangedCount());
+ EXPECT_EQ(sizeof(kJpegImage), client->encodedSizeOnLastImageChanged());
+ EXPECT_TRUE(client->notifyFinishedCalled());
+ EXPECT_EQ(sizeof(kJpegImage), client->encodedSizeOnNotifyFinished());
+ EXPECT_EQ(sizeof(kJpegImage), client->encodedSizeOnImageNotifyFinished());
+
+ ASSERT_TRUE(image->hasImage());
+ EXPECT_EQ(1, image->getImage()->width());
+ EXPECT_EQ(1, image->getImage()->height());
+ EXPECT_TRUE(image->getImage()->isBitmapImage());
+}
+
+TEST(ImageResourceTest, FetchAllowPlaceholderDataURL) {
+ KURL testURL(
+ ParsedURLString,
+ "data:image/jpeg;base64," + base64Encode(kJpegImage, sizeof(kJpegImage)));
+ FetchRequest request(testURL, FetchInitiatorInfo());
+ request.setAllowImagePlaceholder();
+ ImageResource* image = ImageResource::fetch(
+ request,
+ ResourceFetcher::create(ImageResourceTestMockFetchContext::create()));
+ EXPECT_EQ(FetchRequest::DisallowPlaceholder,
+ request.placeholderImageRequestType());
+ EXPECT_EQ(nullAtom, image->resourceRequest().httpHeaderField("range"));
+ EXPECT_FALSE(image->isPlaceholder());
+}
+
+TEST(ImageResourceTest, FetchAllowPlaceholderPostRequest) {
+ KURL testURL(ParsedURLString, "http://www.test.com/cancelTest.html");
+ ScopedRegisteredURL scopedRegisteredURL(testURL);
+ ResourceRequest resourceRequest(testURL);
+ resourceRequest.setHTTPMethod("POST");
+ FetchRequest request(resourceRequest, FetchInitiatorInfo());
+ request.setAllowImagePlaceholder();
+ ImageResource* image = ImageResource::fetch(
+ request,
+ ResourceFetcher::create(ImageResourceTestMockFetchContext::create()));
+ EXPECT_EQ(FetchRequest::DisallowPlaceholder,
+ request.placeholderImageRequestType());
+ EXPECT_EQ(nullAtom, image->resourceRequest().httpHeaderField("range"));
+ EXPECT_FALSE(image->isPlaceholder());
+
+ image->loader()->cancel();
+}
+
+TEST(ImageResourceTest, FetchAllowPlaceholderExistingRangeHeader) {
+ KURL testURL(ParsedURLString, "http://www.test.com/cancelTest.html");
+ ScopedRegisteredURL scopedRegisteredURL(testURL);
+ ResourceRequest resourceRequest(testURL);
+ resourceRequest.setHTTPHeaderField("range", "bytes=128-255");
+ FetchRequest request(resourceRequest, FetchInitiatorInfo());
+ request.setAllowImagePlaceholder();
+ ImageResource* image = ImageResource::fetch(
+ request,
+ ResourceFetcher::create(ImageResourceTestMockFetchContext::create()));
+ EXPECT_EQ(FetchRequest::DisallowPlaceholder,
+ request.placeholderImageRequestType());
+ EXPECT_EQ("bytes=128-255", image->resourceRequest().httpHeaderField("range"));
+ EXPECT_FALSE(image->isPlaceholder());
+
+ image->loader()->cancel();
+}
+
+TEST(ImageResourceTest, FetchAllowPlaceholderSuccessful) {
+ KURL testURL(ParsedURLString, "http://www.test.com/cancelTest.html");
+ ScopedRegisteredURL scopedRegisteredURL(testURL);
+
+ FetchRequest request(testURL, FetchInitiatorInfo());
+ request.setAllowImagePlaceholder();
+ ImageResource* image = ImageResource::fetch(
+ request,
+ ResourceFetcher::create(ImageResourceTestMockFetchContext::create()));
+ EXPECT_EQ(FetchRequest::AllowPlaceholder,
+ request.placeholderImageRequestType());
+ EXPECT_EQ("bytes=0-2047", image->resourceRequest().httpHeaderField("range"));
+ EXPECT_TRUE(image->isPlaceholder());
+ Persistent<MockImageResourceClient> client =
+ new MockImageResourceClient(image);
+
+ ResourceResponse response(testURL, "image/jpeg",
+ kJpegImageSubrangeWithDimensionsLength, nullAtom,
+ String());
+ response.setHTTPStatusCode(206);
+ response.setHTTPHeaderField(
+ "content-range", buildContentRange(kJpegImageSubrangeWithDimensionsLength,
+ sizeof(kJpegImage)));
+ image->loader()->didReceiveResponse(nullptr,
+ WrappedResourceResponse(response));
+ image->loader()->didReceiveData(nullptr, kJpegImage,
+ kJpegImageSubrangeWithDimensionsLength,
+ kJpegImageSubrangeWithDimensionsLength,
+ kJpegImageSubrangeWithDimensionsLength);
+ image->loader()->didFinishLoading(nullptr, 0.0,
+ kJpegImageSubrangeWithDimensionsLength);
+
+ EXPECT_EQ(Resource::Cached, image->getStatus());
+ EXPECT_EQ(kJpegImageSubrangeWithDimensionsLength, image->encodedSize());
+ EXPECT_TRUE(image->isPlaceholder());
+ EXPECT_LT(0, client->imageChangedCount());
+ EXPECT_EQ(kJpegImageSubrangeWithDimensionsLength,
+ client->encodedSizeOnLastImageChanged());
+ EXPECT_TRUE(client->notifyFinishedCalled());
+ EXPECT_EQ(kJpegImageSubrangeWithDimensionsLength,
+ client->encodedSizeOnNotifyFinished());
+ EXPECT_EQ(kJpegImageSubrangeWithDimensionsLength,
+ client->encodedSizeOnImageNotifyFinished());
+
+ ASSERT_TRUE(image->hasImage());
+ EXPECT_EQ(1, image->getImage()->width());
+ EXPECT_EQ(1, image->getImage()->height());
+ EXPECT_FALSE(image->getImage()->isBitmapImage());
+ EXPECT_FALSE(image->getImage()->isSVGImage());
+}
+
+TEST(ImageResourceTest, FetchAllowPlaceholderUnsuccessful) {
+ KURL testURL(ParsedURLString, "http://www.test.com/cancelTest.html");
+ ScopedRegisteredURL scopedRegisteredURL(testURL);
+
+ FetchRequest request(testURL, FetchInitiatorInfo());
+ request.setAllowImagePlaceholder();
+ ImageResource* image = ImageResource::fetch(
+ request,
+ ResourceFetcher::create(ImageResourceTestMockFetchContext::create()));
+ EXPECT_EQ(FetchRequest::AllowPlaceholder,
+ request.placeholderImageRequestType());
+ EXPECT_EQ("bytes=0-2047", image->resourceRequest().httpHeaderField("range"));
+ EXPECT_TRUE(image->isPlaceholder());
+ Persistent<MockImageResourceClient> client =
+ new MockImageResourceClient(image);
+
+ const char kBadData[] = "notanimageresponse";
+
+ image->loader()->didReceiveResponse(
+ nullptr,
+ WrappedResourceResponse(ResourceResponse(
+ testURL, "image/jpeg", sizeof(kBadData), nullAtom, String())));
+ image->loader()->didReceiveData(nullptr, kBadData, sizeof(kBadData),
+ sizeof(kBadData), sizeof(kBadData));
+
+ // The dimensions could not be extracted, so the full original image should be
+ // loading.
+ EXPECT_EQ(Resource::Pending, image->getStatus());
+ EXPECT_FALSE(image->isPlaceholder());
+ EXPECT_EQ(nullAtom, image->resourceRequest().httpHeaderField("range"));
+ EXPECT_EQ(static_cast<int>(WebCachePolicy::BypassingCache),
+ static_cast<int>(image->resourceRequest().getCachePolicy()));
+ EXPECT_FALSE(client->notifyFinishedCalled());
+
+ image->loader()->didReceiveResponse(
+ nullptr,
+ WrappedResourceResponse(ResourceResponse(
+ testURL, "image/jpeg", sizeof(kJpegImage), nullAtom, String())));
+ image->loader()->didReceiveData(nullptr, kJpegImage, sizeof(kJpegImage),
+ sizeof(kJpegImage), sizeof(kJpegImage));
+ image->loader()->didFinishLoading(nullptr, 0.0, sizeof(kJpegImage));
+
+ EXPECT_EQ(Resource::Cached, image->getStatus());
+ EXPECT_EQ(sizeof(kJpegImage), image->encodedSize());
+ EXPECT_FALSE(image->isPlaceholder());
+ EXPECT_LT(0, client->imageChangedCount());
+ EXPECT_EQ(sizeof(kJpegImage), client->encodedSizeOnLastImageChanged());
+ EXPECT_TRUE(client->notifyFinishedCalled());
+ EXPECT_EQ(sizeof(kJpegImage), client->encodedSizeOnNotifyFinished());
+ EXPECT_EQ(sizeof(kJpegImage), client->encodedSizeOnImageNotifyFinished());
+
+ ASSERT_TRUE(image->hasImage());
+ EXPECT_EQ(1, image->getImage()->width());
+ EXPECT_EQ(1, image->getImage()->height());
+ EXPECT_TRUE(image->getImage()->isBitmapImage());
+}
+
+TEST(ImageResourceTest, FetchAllowPlaceholderThenDisallowPlaceholder) {
+ KURL testURL(ParsedURLString, "http://www.test.com/cancelTest.html");
+ ScopedRegisteredURL scopedRegisteredURL(testURL);
+
+ ResourceFetcher* fetcher =
+ ResourceFetcher::create(ImageResourceTestMockFetchContext::create());
+ FetchRequest placeholderRequest(testURL, FetchInitiatorInfo());
+ placeholderRequest.setAllowImagePlaceholder();
+ ImageResource* image = ImageResource::fetch(placeholderRequest, fetcher);
+ Persistent<MockImageResourceClient> client =
+ new MockImageResourceClient(image);
+
+ FetchRequest nonPlaceholderRequest(testURL, FetchInitiatorInfo());
+ ImageResource* secondImage =
+ ImageResource::fetch(nonPlaceholderRequest, fetcher);
+ EXPECT_EQ(image, secondImage);
+ EXPECT_EQ(Resource::Pending, image->getStatus());
+ EXPECT_FALSE(image->isPlaceholder());
+ EXPECT_EQ(nullAtom, image->resourceRequest().httpHeaderField("range"));
+ EXPECT_EQ(static_cast<int>(WebCachePolicy::UseProtocolCachePolicy),
+ static_cast<int>(image->resourceRequest().getCachePolicy()));
+ EXPECT_FALSE(client->notifyFinishedCalled());
+
+ image->loader()->cancel();
+}
+
+TEST(ImageResourceTest,
+ FetchAllowPlaceholderThenDisallowPlaceholderAfterLoaded) {
+ KURL testURL(ParsedURLString, "http://www.test.com/cancelTest.html");
+ ScopedRegisteredURL scopedRegisteredURL(testURL);
+
+ ResourceFetcher* fetcher =
+ ResourceFetcher::create(ImageResourceTestMockFetchContext::create());
+ FetchRequest placeholderRequest(testURL, FetchInitiatorInfo());
+ placeholderRequest.setAllowImagePlaceholder();
+ ImageResource* image = ImageResource::fetch(placeholderRequest, fetcher);
+ Persistent<MockImageResourceClient> client =
+ new MockImageResourceClient(image);
+
+ ResourceResponse response(testURL, "image/jpeg",
+ kJpegImageSubrangeWithDimensionsLength, nullAtom,
+ String());
+ response.setHTTPStatusCode(206);
+ response.setHTTPHeaderField(
+ "content-range", buildContentRange(kJpegImageSubrangeWithDimensionsLength,
+ sizeof(kJpegImage)));
+ image->loader()->didReceiveResponse(nullptr,
+ WrappedResourceResponse(response));
+ image->loader()->didReceiveData(nullptr, kJpegImage,
+ kJpegImageSubrangeWithDimensionsLength,
+ kJpegImageSubrangeWithDimensionsLength,
+ kJpegImageSubrangeWithDimensionsLength);
+ image->loader()->didFinishLoading(nullptr, 0.0,
+ kJpegImageSubrangeWithDimensionsLength);
+
+ EXPECT_EQ(Resource::Cached, image->getStatus());
+ EXPECT_EQ(kJpegImageSubrangeWithDimensionsLength, image->encodedSize());
+ EXPECT_TRUE(image->isPlaceholder());
+ EXPECT_LT(0, client->imageChangedCount());
+ EXPECT_TRUE(client->notifyFinishedCalled());
+
+ FetchRequest nonPlaceholderRequest(testURL, FetchInitiatorInfo());
+ ImageResource* secondImage =
+ ImageResource::fetch(nonPlaceholderRequest, fetcher);
+ EXPECT_EQ(image, secondImage);
+ EXPECT_EQ(Resource::Pending, image->getStatus());
+ EXPECT_FALSE(image->isPlaceholder());
+ EXPECT_EQ(nullAtom, image->resourceRequest().httpHeaderField("range"));
+ EXPECT_EQ(static_cast<int>(WebCachePolicy::UseProtocolCachePolicy),
+ static_cast<int>(image->resourceRequest().getCachePolicy()));
+
+ image->loader()->cancel();
+}
+
+} // namespace
+
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698