| Index: third_party/WebKit/Source/core/loader/resource/ImageResource.cpp
|
| diff --git a/third_party/WebKit/Source/core/loader/resource/ImageResource.cpp b/third_party/WebKit/Source/core/loader/resource/ImageResource.cpp
|
| index 472011ecc1d4f824c1980053de6f0114e20a7220..a1b73735413d1be4917acfa03b03278310a31b8c 100644
|
| --- a/third_party/WebKit/Source/core/loader/resource/ImageResource.cpp
|
| +++ b/third_party/WebKit/Source/core/loader/resource/ImageResource.cpp
|
| @@ -48,11 +48,22 @@
|
| #include "v8/include/v8.h"
|
|
|
| namespace blink {
|
| +
|
| namespace {
|
| +
|
| // The amount of time to wait before informing the clients that the image has
|
| // been updated (in seconds). This effectively throttles invalidations that
|
| // result from new data arriving for this image.
|
| constexpr double kFlushDelaySeconds = 1.;
|
| +
|
| +bool HasServerLoFiResponseHeaders(const ResourceResponse& response) {
|
| + return response.HttpHeaderField("chrome-proxy-content-transform")
|
| + .Contains("empty-image") ||
|
| + // Check for the legacy Server Lo-Fi response headers, since it's
|
| + // possible that an old Lo-Fi image could be served from the cache.
|
| + response.HttpHeaderField("chrome-proxy").Contains("q=low");
|
| +}
|
| +
|
| } // namespace
|
|
|
| class ImageResource::ImageResourceInfoImpl final
|
| @@ -456,9 +467,44 @@ void ImageResource::ResponseReceived(
|
| placeholder_option_ = PlaceholderOption::kReloadPlaceholderOnDecodeError;
|
| }
|
| }
|
| +
|
| + if (HasServerLoFiResponseHeaders(this->GetResponse())) {
|
| + // Ensure that the PreviewsState bit for Server Lo-Fi is set iff Chrome
|
| + // received the appropriate Server Lo-Fi response headers for this image.
|
| + //
|
| + // Normally, the |kServerLoFiOn| bit should already be set if Server Lo-Fi
|
| + // response headers are coming back, but it's possible for legacy Lo-Fi
|
| + // images to be served from the cache even if Chrome isn't in Lo-Fi mode.
|
| + // This also serves as a nice last line of defence to ensure that Server
|
| + // Lo-Fi images can be reloaded to show the original even if e.g. a server
|
| + // bug causes Lo-Fi images to be sent when they aren't expected.
|
| + SetPreviewsState(GetResourceRequest().GetPreviewsState() |
|
| + WebURLRequest::kServerLoFiOn);
|
| + } else if (GetResourceRequest().GetPreviewsState() &
|
| + WebURLRequest::kServerLoFiOn) {
|
| + // If Chrome expects a Lo-Fi response, but the server decided to send the
|
| + // full image, then clear the Server Lo-Fi Previews state bit.
|
| + WebURLRequest::PreviewsState new_previews_state =
|
| + GetResourceRequest().GetPreviewsState();
|
| +
|
| + new_previews_state &= ~WebURLRequest::kServerLoFiOn;
|
| + if (new_previews_state == WebURLRequest::kPreviewsUnspecified)
|
| + new_previews_state = WebURLRequest::kPreviewsOff;
|
| +
|
| + SetPreviewsState(new_previews_state);
|
| + }
|
| }
|
|
|
| bool ImageResource::ShouldShowPlaceholder() const {
|
| + if (RuntimeEnabledFeatures::ShowClientPlaceholdersForServerLoFiEnabled() &&
|
| + (GetResourceRequest().GetPreviewsState() &
|
| + WebURLRequest::kServerLoFiOn)) {
|
| + // If the runtime feature is enabled, show Client Lo-Fi placeholder images
|
| + // in place of Server Lo-Fi responses. This is done so that all Lo-Fi images
|
| + // have a consistent appearance.
|
| + return true;
|
| + }
|
| +
|
| switch (placeholder_option_) {
|
| case PlaceholderOption::kShowAndReloadPlaceholderAlways:
|
| case PlaceholderOption::kShowAndDoNotReloadPlaceholder:
|
| @@ -485,27 +531,21 @@ bool ImageResource::ShouldReloadBrokenPlaceholder() const {
|
| return false;
|
| }
|
|
|
| -static bool IsLoFiImage(const ImageResource& resource) {
|
| - if (resource.IsLoaded()) {
|
| - return resource.GetResponse()
|
| - .HttpHeaderField("chrome-proxy-content-transform")
|
| - .Contains("empty-image") ||
|
| - resource.GetResponse()
|
| - .HttpHeaderField("chrome-proxy")
|
| - .Contains("q=low");
|
| - }
|
| - return resource.GetResourceRequest().GetPreviewsState() &
|
| - WebURLRequest::kServerLoFiOn;
|
| -}
|
| -
|
| void ImageResource::ReloadIfLoFiOrPlaceholderImage(
|
| ResourceFetcher* fetcher,
|
| ReloadLoFiOrPlaceholderPolicy policy) {
|
| if (policy == kReloadIfNeeded && !ShouldReloadBrokenPlaceholder())
|
| return;
|
|
|
| + // If the image is loaded, then the |PreviewsState::kServerLoFiOn| bit should
|
| + // be set iff the image has Server Lo-Fi response headers.
|
| + DCHECK(!IsLoaded() ||
|
| + HasServerLoFiResponseHeaders(GetResponse()) ==
|
| + static_cast<bool>(GetResourceRequest().GetPreviewsState() &
|
| + WebURLRequest::kServerLoFiOn));
|
| +
|
| if (placeholder_option_ == PlaceholderOption::kDoNotReloadPlaceholder &&
|
| - !IsLoFiImage(*this))
|
| + !(GetResourceRequest().GetPreviewsState() & WebURLRequest::kServerLoFiOn))
|
| return;
|
|
|
| // Prevent clients and observers from being notified of completion while the
|
|
|