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 36553ba304f6d24fecebb4fe0764a0c8ebe326d5..90aec7cb9a8abe23446957c3bc10a014e1bce17c 100644 |
--- a/third_party/WebKit/Source/core/fetch/ImageResource.cpp |
+++ b/third_party/WebKit/Source/core/fetch/ImageResource.cpp |
@@ -92,27 +92,27 @@ DEFINE_TRACE(ImageResource) |
MultipartImageResourceParser::Client::trace(visitor); |
} |
-void ImageResource::checkNotify() |
+void ImageResource::checkNotify(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(); |
+ Resource::checkNotify(markFinishedOption); |
} |
-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) |
@@ -145,11 +145,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); |
- } |
} |
} |
@@ -577,7 +574,9 @@ 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. |
+ checkNotify(MarkFinishedOption::DoNotMarkFinished); |
if (loader()) |
loader()->didFinishLoadingFirstPartInMultipart(); |
} |