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(); |
} |