| Index: third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp
|
| diff --git a/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp b/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp
|
| index 8e4b279b3fa0fdc786943babf6627663822abd35..929d51a269a23cb05691dc633b7201ab0df1662b 100644
|
| --- a/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp
|
| +++ b/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp
|
| @@ -480,6 +480,30 @@ void ResourceFetcher::updateMemoryCacheStats(Resource* resource,
|
| }
|
| }
|
|
|
| +static void modifyRequestForPlaceholderImageRequest(FetchRequest& request,
|
| + Resource::Type type) {
|
| + if (request.placeholderImageRequestType() != FetchRequest::AllowPlaceholder)
|
| + return;
|
| + DCHECK_EQ(Resource::Image, type);
|
| +
|
| + if (!request.url().protocolIsInHTTPFamily() ||
|
| + request.resourceRequest().httpMethod() != "GET" ||
|
| + !request.resourceRequest().httpHeaderField("range").isNull()) {
|
| + request.setPlaceholderImageRequestType(FetchRequest::DisallowPlaceholder);
|
| + return;
|
| + }
|
| +
|
| + // Fetch the first few bytes of the image. This number is tuned to both (a)
|
| + // likely capture the entire image for small images and (b) likely contain
|
| + // the dimensions for larger images.
|
| + // TODO(sclittle): Calculate the optimal value for this number.
|
| + request.mutableResourceRequest().setHTTPHeaderField("range", "bytes=0-2047");
|
| +
|
| + // TODO(sclittle): Indicate somehow (e.g. through a new request bit) to the
|
| + // embedder that it should return the full resource if the entire resource is
|
| + // fresh in the cache.
|
| +}
|
| +
|
| Resource* ResourceFetcher::requestResource(
|
| FetchRequest& request,
|
| const ResourceFactory& factory,
|
| @@ -516,6 +540,9 @@ Resource* ResourceFetcher::requestResource(
|
| factory.type(), request, ResourcePriority::NotVisible));
|
| initializeResourceRequest(request.mutableResourceRequest(), factory.type(),
|
| request.defer());
|
| +
|
| + modifyRequestForPlaceholderImageRequest(request, factory.type());
|
| +
|
| context().willStartLoadingResource(
|
| identifier, request.mutableResourceRequest(), factory.type());
|
| if (!request.url().isValid())
|
| @@ -1162,6 +1189,11 @@ void ResourceFetcher::didFinishLoading(Resource* resource,
|
| if (finishReason == DidFinishLoading)
|
| resource->finish(finishTime);
|
| context().didLoadResource(resource);
|
| +
|
| + if (resource->isImage() &&
|
| + toImageResource(resource)->shouldReloadBrokenPlaceholder()) {
|
| + toImageResource(resource)->reloadIfLoFi(this);
|
| + }
|
| }
|
|
|
| void ResourceFetcher::didFailLoading(Resource* resource,
|
| @@ -1174,6 +1206,11 @@ void ResourceFetcher::didFailLoading(Resource* resource,
|
| context().dispatchDidFail(resource->identifier(), error, isInternalRequest);
|
| resource->error(error);
|
| context().didLoadResource(resource);
|
| +
|
| + if (resource->isImage() &&
|
| + toImageResource(resource)->shouldReloadBrokenPlaceholder()) {
|
| + toImageResource(resource)->reloadIfLoFi(this);
|
| + }
|
| }
|
|
|
| void ResourceFetcher::didReceiveResponse(Resource* resource,
|
|
|