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

Unified Diff: third_party/WebKit/Source/core/loader/resource/ImageResourceContent.cpp

Issue 2746343002: Phase III Step 1: Make ImageResourceContent manage its own ResourceStatus (Closed)
Patch Set: Rewind Created 3 years, 9 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/loader/resource/ImageResourceContent.cpp
diff --git a/third_party/WebKit/Source/core/loader/resource/ImageResourceContent.cpp b/third_party/WebKit/Source/core/loader/resource/ImageResourceContent.cpp
index 55e30a9458c597141ed503e0c09865edb4d96b3c..db851d2367c627f346455ca32ebf160a56daf3ad 100644
--- a/third_party/WebKit/Source/core/loader/resource/ImageResourceContent.cpp
+++ b/third_party/WebKit/Source/core/loader/resource/ImageResourceContent.cpp
@@ -38,7 +38,6 @@ class NullImageResourceInfo final
bool hasDevicePixelRatioHeaderValue() const override { return false; }
float devicePixelRatioHeaderValue() const override { return 1.0; }
const ResourceResponse& response() const override { return m_response; }
- ResourceStatus getStatus() const override { return ResourceStatus::Cached; }
bool shouldShowPlaceholder() const override { return false; }
bool isCacheValidator() const override { return false; }
bool isAccessAllowed(
@@ -291,8 +290,36 @@ void ImageResourceContent::clearImage() {
m_sizeAvailable = Image::SizeUnavailable;
}
+// |status| is the status of corresponding ImageResource.
+void ImageResourceContent::updateStatus(ResourceStatus status,
+ NotifyFinishOption notifyFinishOption) {
+ switch (notifyFinishOption) {
+ case ShouldNotifyFinish:
+ // When |ShouldNotifyFinish|, we set |m_status| to a loaded
kouhei (in TOK) 2017/03/15 11:18:53 Can we have switch(status) here to ensure all stat
hiroshige 2017/05/04 20:21:57 Done.
+ // ResourceStatus.
+ if (status == ResourceStatus::LoadError ||
+ status == ResourceStatus::DecodeError) {
+ // In case of error, Resource's status is set to an error status before
+ // updateImage() and thus we use the error status also as
+ // ImageResourceContent's status.
+ m_status = status;
+ } else {
+ // In case of successful load, Resource's status might not be set to
+ // Cached here. Therefore we set |m_status| to Cached, regardless of
+ // |status|.
+ m_status = ResourceStatus::Cached;
+ }
+ break;
+ case DoNotNotifyFinish:
+ if (m_status == ResourceStatus::NotStarted)
kouhei (in TOK) 2017/03/15 11:18:53 Ditto
yhirano 2017/03/17 13:47:25 Can you tell me why this is needed? Setting the st
yhirano 2017/03/17 13:47:25 Is |status| arbitrary here? Can we put some DCHECK
hiroshige 2017/05/04 20:21:57 Right. I removed the transition in DoNotNotifyFini
hiroshige 2017/05/04 20:21:57 |status| shouldn't be kNotStarted. Also, |status|
hiroshige 2017/05/04 20:21:57 Removed.
+ m_status = ResourceStatus::Pending;
+ break;
+ }
+}
+
ImageResourceContent::UpdateImageResult ImageResourceContent::updateImage(
PassRefPtr<SharedBuffer> data,
+ ResourceStatus status,
UpdateImageOption updateImageOption,
bool allDataReceived) {
TRACE_EVENT0("blink", "ImageResourceContent::updateImage");
@@ -333,8 +360,10 @@ ImageResourceContent::UpdateImageResult ImageResourceContent::updateImage(
// Go ahead and tell our observers to try to draw if we have either
// received all the data or the size is known. Each chunk from the network
// causes observers to repaint, which will force that chunk to decode.
- if (m_sizeAvailable == Image::SizeUnavailable && !allDataReceived)
+ if (m_sizeAvailable == Image::SizeUnavailable && !allDataReceived) {
+ updateStatus(status, DoNotNotifyFinish);
return UpdateImageResult::NoDecodeError;
+ }
if (m_info->shouldShowPlaceholder() && allDataReceived) {
if (m_image && !m_image->isNull()) {
@@ -346,6 +375,7 @@ ImageResourceContent::UpdateImageResult ImageResourceContent::updateImage(
if (!m_image || m_image->isNull()) {
clearImage();
+ updateStatus(status, DoNotNotifyFinish);
return UpdateImageResult::ShouldDecodeError;
}
break;
@@ -354,10 +384,18 @@ ImageResourceContent::UpdateImageResult ImageResourceContent::updateImage(
// Notifies the observers.
// It would be nice to only redraw the decoded band of the image, but with the
// current design (decoding delayed until painting) that seems hard.
- notifyObservers(allDataReceived ? ShouldNotifyFinish : DoNotNotifyFinish);
+
+ NotifyFinishOption notifyFinishOption =
+ allDataReceived ? ShouldNotifyFinish : DoNotNotifyFinish;
+ updateStatus(status, notifyFinishOption);
+ notifyObservers(notifyFinishOption);
return UpdateImageResult::NoDecodeError;
}
+void ImageResourceContent::notifyStartLoad() {
yhirano 2017/03/17 13:47:25 DCHECK_EQ(m_status, NotStarted)?
hiroshige 2017/05/04 20:21:57 Not necessarily NotStarted, e.g. in the case of re
+ m_status = ResourceStatus::Pending;
kouhei (in TOK) 2017/03/15 11:18:53 Can we always update status via updateStatus?
hiroshige 2017/05/04 20:21:57 I removed UpdateStatus(kDoNotNotifyFinish) case an
+}
+
void ImageResourceContent::decodedSizeChangedTo(const blink::Image* image,
size_t newSize) {
if (!image || image != m_image)
@@ -450,7 +488,7 @@ bool ImageResourceContent::loadFailedOrCanceled() const {
}
ResourceStatus ImageResourceContent::getStatus() const {
- return m_info->getStatus();
+ return m_status;
}
const KURL& ImageResourceContent::url() const {

Powered by Google App Engine
This is Rietveld 408576698