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

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

Issue 1843533005: Call imageNotifyFinished() just before ResourceClient::notifyFinished() (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase, Reflect yhirano's comment Created 4 years, 8 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/ImageResource.cpp
diff --git a/third_party/WebKit/Source/core/fetch/ImageResource.cpp b/third_party/WebKit/Source/core/fetch/ImageResource.cpp
index 4599b0eef83eec423fa9f4b92dd90f8c9dfa2c0b..786cf3fa5c09c0088e3f9252e812d7da2d67062a 100644
--- a/third_party/WebKit/Source/core/fetch/ImageResource.cpp
+++ b/third_party/WebKit/Source/core/fetch/ImageResource.cpp
@@ -101,17 +101,30 @@ DEFINE_TRACE(ImageResource)
MultipartImageResourceParser::Client::trace(visitor);
}
-void ImageResource::notifyObserver(ImageResourceObserver* observer, bool isNotifyingFinish, const IntRect* changeRect)
+void ImageResource::checkNotify()
{
- if (isNotifyingFinish) {
+ if (isLoading())
+ return;
+
+ ImageResourceObserverWalker walker(m_observers);
+ while (auto* observer = walker.next()) {
observer->imageNotifyFinished(this);
- if (m_observers.contains(observer)) {
- m_finishedObservers.add(observer);
- m_observers.remove(observer);
+ }
+
+ Resource::checkNotify();
+}
+
+void ImageResource::markClientsAndObserversFinished()
+{
+ while (!m_observers.isEmpty()) {
+ HashCountedSet<ImageResourceObserver*>::iterator it = m_observers.begin();
+ for (int i = it->value; i; i--) {
+ m_finishedObservers.add(it->key);
+ m_observers.remove(it);
}
}
- observer->imageChanged(this, changeRect);
+ Resource::markClientsAndObserversFinished();
}
void ImageResource::addObserver(ImageResourceObserver* observer)
@@ -129,8 +142,15 @@ void ImageResource::addObserver(ImageResourceObserver* observer)
}
if (m_image && !m_image->isNull()) {
- bool isNotifyingFinish = !isLoading() && !stillNeedsLoad();
- notifyObserver(observer, isNotifyingFinish);
+ observer->imageChanged(this);
+ }
+
+ if (isLoaded()) {
+ observer->imageNotifyFinished(this);
+ if (m_observers.contains(observer)) {
+ m_finishedObservers.add(observer);
+ m_observers.remove(observer);
+ }
}
}
@@ -292,16 +312,16 @@ LayoutSize ImageResource::imageSize(RespectImageOrientationEnum shouldRespectIma
return size;
}
-void ImageResource::notifyObservers(bool isNotifyingFinish, const IntRect* changeRect)
+void ImageResource::notifyObservers(const IntRect* changeRect)
{
ImageResourceObserverWalker finishedWalker(m_finishedObservers);
while (auto* observer = finishedWalker.next()) {
- notifyObserver(observer, false, changeRect);
+ observer->imageChanged(this, changeRect);
}
ImageResourceObserverWalker walker(m_observers);
while (auto* observer = walker.next()) {
- notifyObserver(observer, isNotifyingFinish, changeRect);
+ observer->imageChanged(this, changeRect);
}
}
@@ -371,7 +391,7 @@ void ImageResource::updateImage(bool allDataReceived)
// 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);
+ notifyObservers();
}
}
@@ -396,7 +416,7 @@ void ImageResource::error(Resource::Status status)
m_multipartParser->cancel();
clear();
Resource::error(status);
- notifyObservers(true);
+ notifyObservers();
}
void ImageResource::responseReceived(const ResourceResponse& response, PassOwnPtr<WebDataConsumerHandle> handle)
@@ -462,7 +482,7 @@ void ImageResource::animationAdvanced(const blink::Image* image)
{
if (!image || image != m_image)
return;
- notifyObservers(false);
+ notifyObservers();
}
void ImageResource::updateImageAnimationPolicy()
@@ -504,7 +524,7 @@ void ImageResource::changedInRect(const blink::Image* image, const IntRect& rect
{
if (!image || image != m_image)
return;
- notifyObservers(false, &rect);
+ notifyObservers(&rect);
}
void ImageResource::onePartInMultipartReceived(const ResourceResponse& response)
« no previous file with comments | « third_party/WebKit/Source/core/fetch/ImageResource.h ('k') | third_party/WebKit/Source/core/fetch/ImageResourceObserver.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698