Title: [108834] trunk/Source/WebCore
Revision
108834
Author
[email protected]
Date
2012-02-24 11:41:12 -0800 (Fri, 24 Feb 2012)

Log Message

Infinite repaint loop with SVGImageCache and deferred repaint timers
https://bugs.webkit.org/show_bug.cgi?id=78315
<rdar://problem/10651634>

Reviewed by Dean Jackson.

Only defer image redraw on a timer if we're in layout. This breaks
the repaint loop while still preventing us from drawing inside layout.

No new tests, as the problem only occurs in a nonstandard configuration.

* svg/graphics/SVGImage.cpp:
(WebCore::SVGImage::draw):
(WebCore::SVGImage::frameView):
(WebCore):
* svg/graphics/SVGImage.h:
(WebCore):
* svg/graphics/SVGImageCache.cpp:
(WebCore::SVGImageCache::imageContentChanged):
(WebCore::SVGImageCache::redraw):
(WebCore::SVGImageCache::redrawTimerFired):
(WebCore):
* svg/graphics/SVGImageCache.h:
(SVGImageCache):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (108833 => 108834)


--- trunk/Source/WebCore/ChangeLog	2012-02-24 19:40:00 UTC (rev 108833)
+++ trunk/Source/WebCore/ChangeLog	2012-02-24 19:41:12 UTC (rev 108834)
@@ -1,5 +1,32 @@
 2012-02-24  Tim Horton  <[email protected]>
 
+        Infinite repaint loop with SVGImageCache and deferred repaint timers
+        https://bugs.webkit.org/show_bug.cgi?id=78315
+        <rdar://problem/10651634>
+
+        Reviewed by Dean Jackson.
+
+        Only defer image redraw on a timer if we're in layout. This breaks
+        the repaint loop while still preventing us from drawing inside layout.
+
+        No new tests, as the problem only occurs in a nonstandard configuration.
+
+        * svg/graphics/SVGImage.cpp:
+        (WebCore::SVGImage::draw):
+        (WebCore::SVGImage::frameView):
+        (WebCore):
+        * svg/graphics/SVGImage.h:
+        (WebCore):
+        * svg/graphics/SVGImageCache.cpp:
+        (WebCore::SVGImageCache::imageContentChanged):
+        (WebCore::SVGImageCache::redraw):
+        (WebCore::SVGImageCache::redrawTimerFired):
+        (WebCore):
+        * svg/graphics/SVGImageCache.h:
+        (SVGImageCache):
+
+2012-02-24  Tim Horton  <[email protected]>
+
         SVG should be supported in Dashboard compatibility mode
         https://bugs.webkit.org/show_bug.cgi?id=78322
         <rdar://problem/5861278>

Modified: trunk/Source/WebCore/svg/graphics/SVGImage.cpp (108833 => 108834)


--- trunk/Source/WebCore/svg/graphics/SVGImage.cpp	2012-02-24 19:40:00 UTC (rev 108833)
+++ trunk/Source/WebCore/svg/graphics/SVGImage.cpp	2012-02-24 19:41:12 UTC (rev 108834)
@@ -210,7 +210,7 @@
     if (!m_page)
         return;
 
-    FrameView* view = m_page->mainFrame()->view();
+    FrameView* view = frameView();
 
     GraphicsContextStateSaver stateSaver(*context);
     context->setCompositeOperation(compositeOp);
@@ -255,6 +255,14 @@
     return toRenderBox(rootElement->renderer());
 }
 
+FrameView* SVGImage::frameView() const
+{
+    if (!m_page)
+        return 0;
+
+    return m_page->mainFrame()->view();
+}
+
 bool SVGImage::hasRelativeWidth() const
 {
     if (!m_page)

Modified: trunk/Source/WebCore/svg/graphics/SVGImage.h (108833 => 108834)


--- trunk/Source/WebCore/svg/graphics/SVGImage.h	2012-02-24 19:40:00 UTC (rev 108833)
+++ trunk/Source/WebCore/svg/graphics/SVGImage.h	2012-02-24 19:41:12 UTC (rev 108834)
@@ -34,6 +34,7 @@
 
 namespace WebCore {
 
+class FrameView;
 class ImageBuffer;
 class Page;
 class RenderBox;
@@ -53,6 +54,7 @@
 
     void drawSVGToImageBuffer(ImageBuffer*, const IntSize&, float zoom, ShouldClearBuffer);
     RenderBox* embeddedContentBox() const;
+    FrameView* frameView() const;
 
     virtual bool isSVGImage() const { return true; }
     virtual IntSize size() const;

Modified: trunk/Source/WebCore/svg/graphics/SVGImageCache.cpp (108833 => 108834)


--- trunk/Source/WebCore/svg/graphics/SVGImageCache.cpp	2012-02-24 19:40:00 UTC (rev 108833)
+++ trunk/Source/WebCore/svg/graphics/SVGImageCache.cpp	2012-02-24 19:41:12 UTC (rev 108834)
@@ -21,6 +21,7 @@
 #include "SVGImageCache.h"
 
 #if ENABLE(SVG)
+#include "FrameView.h"
 #include "GraphicsContext.h"
 #include "ImageBuffer.h"
 #include "RenderSVGRoot.h"
@@ -81,13 +82,18 @@
     for (ImageDataMap::iterator it = m_imageDataMap.begin(); it != end; ++it)
         it->second.imageNeedsUpdate = true;
 
-    // Start redrawing dirty images with a timer, as imageContentChanged() may be called
-    // by the FrameView of the SVGImage which is currently in FrameView::layout().
-    if (!m_redrawTimer.isActive())
-        m_redrawTimer.startOneShot(0);
+    // If we're in the middle of layout, start redrawing dirty
+    // images on a timer; otherwise it's safe to draw immediately.
+    
+    FrameView* frameView = m_svgImage->frameView();
+    if (frameView && frameView->needsLayout()) {
+        if (!m_redrawTimer.isActive())
+            m_redrawTimer.startOneShot(0);
+    } else
+        redraw();
 }
 
-void SVGImageCache::redrawTimerFired(Timer<SVGImageCache>*)
+void SVGImageCache::redraw()
 {
     ImageDataMap::iterator end = m_imageDataMap.end();
     for (ImageDataMap::iterator it = m_imageDataMap.begin(); it != end; ++it) {
@@ -105,6 +111,11 @@
     m_svgImage->imageObserver()->animationAdvanced(m_svgImage);
 }
 
+void SVGImageCache::redrawTimerFired(Timer<SVGImageCache>*)
+{
+    redraw();
+}
+
 Image* SVGImageCache::lookupOrCreateBitmapImageForRenderer(const RenderObject* renderer)
 {
     ASSERT(renderer);

Modified: trunk/Source/WebCore/svg/graphics/SVGImageCache.h (108833 => 108834)


--- trunk/Source/WebCore/svg/graphics/SVGImageCache.h	2012-02-24 19:40:00 UTC (rev 108833)
+++ trunk/Source/WebCore/svg/graphics/SVGImageCache.h	2012-02-24 19:41:12 UTC (rev 108834)
@@ -70,6 +70,7 @@
 
 private:
     SVGImageCache(SVGImage*);
+    void redraw();
     void redrawTimerFired(Timer<SVGImageCache>*);
 
     struct ImageData {
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to