Chromium Code Reviews| Index: third_party/WebKit/Source/core/svg/graphics/SVGImageChromeClient.cpp |
| diff --git a/third_party/WebKit/Source/core/svg/graphics/SVGImageChromeClient.cpp b/third_party/WebKit/Source/core/svg/graphics/SVGImageChromeClient.cpp |
| index fdca4432ebc892bc862a1644efaeca497300f317..eea5b0336ed59369875e7e125284d383ddec3a81 100644 |
| --- a/third_party/WebKit/Source/core/svg/graphics/SVGImageChromeClient.cpp |
| +++ b/third_party/WebKit/Source/core/svg/graphics/SVGImageChromeClient.cpp |
| @@ -87,22 +87,26 @@ void SVGImageChromeClient::animationTimerFired(Timer<SVGImageChromeClient>*) |
| { |
| if (!m_image) |
| return; |
| + |
| +#if ENABLE(OILPAN) |
| + // The SVGImageChromeClient object's lifetime is dependent on |
| + // the ImageObserver (an ImageResource) of its image. Should it |
| + // be dead and about to be lazily swept out, do not proceed. |
| + // |
| + // TODO(Oilpan): move (SVG)Image to the Oilpan heap, and avoid |
| + // this explicit lifetime check. |
| + if (Heap::willObjectBeLazilySwept(m_image->imageObserver())) |
|
haraken
2016/02/11 13:25:19
Can we avoid using Heap::willObjectBeLazilySwept b
sof
2016/02/11 13:27:41
ImageLoader already is, so it gets complex if Imag
haraken
2016/02/11 13:49:40
Would it be possible to make SVGImageChromeClient
|
| + return; |
| +#endif |
| + |
| // serviceScriptedAnimations runs requestAnimationFrame callbacks, but SVG |
| // images can't have any so we assert there's no script. |
| ScriptForbiddenScope forbidScript; |
| - // As neither SVGImage nor this chrome client object are on the Oilpan heap, |
| - // this object's reference to the SVGImage will not be traced should a GC |
| - // strike below. Hence, we must ensure that they both remain alive for |
| - // duration of this call. |
| - // |
| - // This is cannot arise non-Oilpan as an ImageResource is an owned object |
| - // and will be promptly released along with its (SVG)Image..and everything |
| - // below, including this object and its timer. For code simplicity, the |
| - // object protection isn't made the conditional on Oilpan. |
| - // |
| - // TODO(oilpan): move SVGImage to the Oilpan heap and remove this protection. |
| - RefPtr<SVGImage> protect(m_image); |
| + // The calls below may trigger GCs, so set up the required persistent |
| + // reference on the ImageResource which owns this SVGImage. By transitivity, |
| + // that will keep this SVGImageChromeClient object alive. |
| + RawPtrWillBePersistent<ImageObserver> protect(m_image->imageObserver()); |
| m_image->frameView()->page()->animator().serviceScriptedAnimations(monotonicallyIncreasingTime()); |
| m_image->frameView()->updateAllLifecyclePhases(); |
| } |