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 57e7a497df221e5ce82cdc64b2340ed6c12d6d9c..beafff04f6fcd1482b844c2e1f6fbbda4fc7d554 100644 |
--- a/third_party/WebKit/Source/core/loader/resource/ImageResource.cpp |
+++ b/third_party/WebKit/Source/core/loader/resource/ImageResource.cpp |
@@ -239,8 +239,7 @@ void ImageResource::didAddClient(ResourceClient* client) { |
void ImageResource::destroyDecodedDataForFailedRevalidation() { |
// Clears the image, as we must create a new image for the failed |
// revalidation response. |
- getContent()->updateImage(nullptr, ImageResourceContent::ClearAndUpdateImage, |
- false); |
+ updateImage(nullptr, ImageResourceContent::ClearAndUpdateImage, false); |
setDecodedSize(0); |
} |
@@ -285,8 +284,7 @@ void ImageResource::appendData(const char* data, size_t length) { |
// Update the image immediately if needed. |
if (getContent()->shouldUpdateImageImmediately()) { |
- getContent()->updateImage(this->data(), ImageResourceContent::UpdateImage, |
- false); |
+ updateImage(this->data(), ImageResourceContent::UpdateImage, false); |
return; |
} |
@@ -314,8 +312,7 @@ void ImageResource::flushImageIfNeeded(TimerBase*) { |
// to call |updateImage()|. |
if (isLoading()) { |
m_lastFlushTime = WTF::monotonicallyIncreasingTime(); |
- getContent()->updateImage(this->data(), ImageResourceContent::UpdateImage, |
- false); |
+ updateImage(this->data(), ImageResourceContent::UpdateImage, false); |
} |
} |
@@ -340,8 +337,7 @@ void ImageResource::decodeError(bool allDataReceived) { |
} |
void ImageResource::updateImageAndClearBuffer() { |
- getContent()->updateImage(data(), ImageResourceContent::ClearAndUpdateImage, |
- true); |
+ updateImage(data(), ImageResourceContent::ClearAndUpdateImage, true); |
clearData(); |
} |
@@ -351,7 +347,7 @@ void ImageResource::finish(double loadFinishTime) { |
if (data()) |
updateImageAndClearBuffer(); |
} else { |
- getContent()->updateImage(data(), ImageResourceContent::UpdateImage, true); |
+ updateImage(data(), ImageResourceContent::UpdateImage, true); |
// As encoded image data can be created from m_image (see |
// ImageResource::resourceBuffer(), we don't have to keep m_data. Let's |
// clear this. As for the lifetimes of m_image and m_data, see this |
@@ -369,8 +365,7 @@ void ImageResource::error(const ResourceError& error) { |
// is really needed, or remove it otherwise. |
setEncodedSize(0); |
Resource::error(error); |
- getContent()->updateImage(nullptr, ImageResourceContent::ClearImageOnly, |
- true); |
+ updateImage(nullptr, ImageResourceContent::ClearImageOnly, true); |
} |
void ImageResource::responseReceived( |
@@ -439,8 +434,7 @@ void ImageResource::reloadIfLoFiOrPlaceholderImage( |
} else { |
clearData(); |
setEncodedSize(0); |
- getContent()->updateImage(nullptr, ImageResourceContent::ClearImageOnly, |
- false); |
+ updateImage(nullptr, ImageResourceContent::ClearImageOnly, false); |
} |
setStatus(NotStarted); |
@@ -462,6 +456,9 @@ void ImageResource::onePartInMultipartReceived( |
return; |
} |
updateImageAndClearBuffer(); |
+ // We should create a new image again when the data for the next part arrive, |
+ // so reset |m_isUpdateImageCalled| here. |
+ m_isUpdateImageCalled = false; |
if (m_multipartParsingState == MultipartParsingState::ParsingFirstPart) { |
m_multipartParsingState = MultipartParsingState::FinishedParsingFirstPart; |
@@ -510,4 +507,16 @@ ResourcePriority ImageResource::priorityFromObservers() { |
return getContent()->priorityFromObservers(); |
} |
+void ImageResource::updateImage( |
+ PassRefPtr<SharedBuffer> sharedBuffer, |
+ ImageResourceContent::UpdateImageOption updateImageOption, |
+ bool allDataReceived) { |
+ if (!m_isUpdateImageCalled && |
+ updateImageOption == ImageResourceContent::UpdateImage) |
+ updateImageOption = ImageResourceContent::ClearAndUpdateImage; |
+ m_isUpdateImageCalled = true; |
+ getContent()->updateImage(std::move(sharedBuffer), updateImageOption, |
+ allDataReceived); |
+} |
+ |
} // namespace blink |