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

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

Issue 2210473002: Mark ResourceClient/ImageResourceObserver finished just before notifying (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Wrap by 80 cols and Rebase. Created 4 years, 4 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 c2ae4de0dcbc4abf3d499fc4c26480ec2e38f351..58b6e34a0e29919b14e6826b89ebf84157c80fae 100644
--- a/third_party/WebKit/Source/core/fetch/ImageResource.cpp
+++ b/third_party/WebKit/Source/core/fetch/ImageResource.cpp
@@ -95,25 +95,29 @@ DEFINE_TRACE(ImageResource)
void ImageResource::checkNotify()
{
+ notifyObserversInternal(MarkFinishedOption::ShouldMarkFinished);
+ Resource::checkNotify();
+}
+
+void ImageResource::notifyObserversInternal(MarkFinishedOption markFinishedOption)
+{
if (isLoading())
return;
ImageResourceObserverWalker walker(m_observers);
while (auto* observer = walker.next()) {
+ if (markFinishedOption == MarkFinishedOption::ShouldMarkFinished)
+ markObserverFinished(observer);
observer->imageNotifyFinished(this);
}
-
- Resource::checkNotify();
}
-void ImageResource::markClientsAndObserversFinished()
+void ImageResource::markObserverFinished(ImageResourceObserver* observer)
{
- HashCountedSet<ImageResourceObserver*> observers;
- m_observers.swap(observers);
- for (const auto& it : observers)
- m_finishedObservers.add(it.key, it.value);
-
- Resource::markClientsAndObserversFinished();
+ if (m_observers.contains(observer)) {
+ m_finishedObservers.add(observer);
+ m_observers.remove(observer);
+ }
}
void ImageResource::didAddClient(ResourceClient* client)
@@ -146,11 +150,8 @@ void ImageResource::addObserver(ImageResourceObserver* observer)
}
if (isLoaded()) {
+ markObserverFinished(observer);
observer->imageNotifyFinished(this);
- if (m_observers.contains(observer)) {
- m_finishedObservers.add(observer);
- m_observers.remove(observer);
- }
}
}
@@ -581,7 +582,10 @@ void ImageResource::onePartInMultipartReceived(const ResourceResponse& response)
// Notify finished when the first part ends.
if (!errorOccurred())
setStatus(Cached);
- checkNotify();
+ // We will also notify clients/observers of the finish in
+ // Resource::finish()/error() so we don't mark them finished here.
+ notifyObserversInternal(MarkFinishedOption::DoNotMarkFinished);
+ notifyClientsInternal(MarkFinishedOption::DoNotMarkFinished);
if (loader())
loader()->didFinishLoadingFirstPartInMultipart();
}
« no previous file with comments | « third_party/WebKit/Source/core/fetch/ImageResource.h ('k') | third_party/WebKit/Source/core/fetch/Resource.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698