Index: third_party/WebKit/Source/core/loader/ImageLoader.cpp |
diff --git a/third_party/WebKit/Source/core/loader/ImageLoader.cpp b/third_party/WebKit/Source/core/loader/ImageLoader.cpp |
index e618c96e42f89bfb969d01e2ac426d2e613210fb..4d2c38b1d8d2a9aa776a5c1cb4280e41dbf3df68 100644 |
--- a/third_party/WebKit/Source/core/loader/ImageLoader.cpp |
+++ b/third_party/WebKit/Source/core/loader/ImageLoader.cpp |
@@ -176,6 +176,7 @@ void ImageLoader::dispose() { |
if (m_image) { |
m_image->removeObserver(this); |
m_image = nullptr; |
+ m_loadDelayCounter2 = nullptr; |
} |
} |
@@ -200,6 +201,7 @@ void ImageLoader::setImageWithoutConsideringPendingLoadEvent( |
ImageResourceContent* oldImage = m_image.get(); |
if (newImage != oldImage) { |
m_image = newImage; |
+ m_loadDelayCounter2 = nullptr; |
if (m_hasPendingLoadEvent) { |
loadEventSender().cancelEvent(this); |
m_hasPendingLoadEvent = false; |
@@ -359,17 +361,18 @@ void ImageLoader::doUpdateFromElement(BypassMainWorldBehavior bypassBehavior, |
m_image = newImage; |
m_hasPendingLoadEvent = newImage; |
m_imageComplete = !newImage; |
+ m_loadDelayCounter2 = nullptr; |
updateLayoutObject(); |
// If newImage exists and is cached, addObserver() will result in the load |
// event being queued to fire. Ensure this happens after beforeload is |
// dispatched. |
- if (newImage) { |
- newImage->addObserver(this); |
- } |
if (oldImage) { |
oldImage->removeObserver(this); |
} |
+ if (newImage) { |
fs
2017/03/15 14:22:17
This shuffle is non-obvious, what are the side-eff
hiroshige
2017/05/04 22:50:50
Oh, this was my mistake (unintentionally changed t
|
+ newImage->addObserver(this); |
+ } |
} |
if (LayoutImageResource* imageResource = layoutImageResource()) |
@@ -423,10 +426,10 @@ void ImageLoader::updateFromElement(UpdateFromElementBehavior updateBehavior, |
// asynchronous load completes. |
if (imageSourceURL.isEmpty()) { |
ImageResourceContent* image = m_image.get(); |
- if (image) { |
+ if (image) |
image->removeObserver(this); |
- } |
m_image = nullptr; |
+ m_loadDelayCounter2 = nullptr; |
} |
// Don't load images for inactive documents. We don't want to slow down the |
@@ -469,6 +472,18 @@ bool ImageLoader::shouldLoadImmediately(const KURL& url) const { |
return (isHTMLObjectElement(m_element) || isHTMLEmbedElement(m_element)); |
} |
+void ImageLoader::imageChanged(ImageResourceContent* content, const IntRect*) { |
+ DCHECK_EQ(content, m_image.get()); |
+ if (m_imageComplete || !content->isLoading() || m_loadDelayCounter2) |
+ return; |
+ |
+ Document& document = m_element->document(); |
+ if (!document.isActive()) |
+ return; |
+ |
+ m_loadDelayCounter2 = IncrementLoadEventDelayCount::create(document); |
+} |
+ |
void ImageLoader::imageNotifyFinished(ImageResourceContent* resource) { |
RESOURCE_LOADING_DVLOG(1) |
<< "ImageLoader::imageNotifyFinished " << this |
@@ -478,6 +493,7 @@ void ImageLoader::imageNotifyFinished(ImageResourceContent* resource) { |
DCHECK_EQ(resource, m_image.get()); |
m_imageComplete = true; |
+ m_loadDelayCounter2 = nullptr; |
// Update ImageAnimationPolicy for m_image. |
if (m_image) |
@@ -636,6 +652,8 @@ void ImageLoader::dispatchPendingErrorEvents() { |
void ImageLoader::elementDidMoveToNewDocument() { |
if (m_loadDelayCounter) |
m_loadDelayCounter->documentChanged(m_element->document()); |
+ if (m_loadDelayCounter2) |
+ m_loadDelayCounter2->documentChanged(m_element->document()); |
clearFailedLoadURL(); |
setImage(0); |
} |