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 9d49d113f60ecde90d37167e3f1fdeadbb0c09a3..516fed78f528dadcb49927b73ec2c0e43fcd3ecb 100644 |
--- a/third_party/WebKit/Source/core/fetch/ImageResource.cpp |
+++ b/third_party/WebKit/Source/core/fetch/ImageResource.cpp |
@@ -204,10 +204,23 @@ void ImageResource::destroyDecodedDataIfPossible() |
} |
} |
-void ImageResource::allClientsAndObserversRemoved() |
+void ImageResource::doResetAnimation() |
{ |
- if (m_image && !errorOccurred()) |
+ if (m_image) |
m_image->resetAnimation(); |
+} |
+ |
+void ImageResource::allClientsAndObserversRemoved() |
+{ |
+ if (m_image && !errorOccurred()) { |
+ // If possible, delay the resetting until back at the event loop. |
+ // Doing so after a conservative GC prevents resetAnimation() from |
+ // upsetting ongoing animation updates (crbug.com/613709) |
+ if (!ThreadHeap::willObjectBeLazilySwept(this)) |
+ Platform::current()->currentThread()->getWebTaskRunner()->postTask(BLINK_FROM_HERE, bind(&ImageResource::doResetAnimation, WeakPersistentThisPointer<ImageResource>(this))); |
+ else |
+ m_image->resetAnimation(); |
+ } |
if (m_multipartParser) |
m_multipartParser->cancel(); |
Resource::allClientsAndObserversRemoved(); |