Changeset 108834 in webkit


Ignore:
Timestamp:
Feb 24, 2012 11:41:12 AM (12 years ago)
Author:
timothy_horton@apple.com
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):

Location:
trunk/Source/WebCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r108832 r108834  
     12012-02-24  Tim Horton  <timothy_horton@apple.com>
     2
     3        Infinite repaint loop with SVGImageCache and deferred repaint timers
     4        https://bugs.webkit.org/show_bug.cgi?id=78315
     5        <rdar://problem/10651634>
     6
     7        Reviewed by Dean Jackson.
     8
     9        Only defer image redraw on a timer if we're in layout. This breaks
     10        the repaint loop while still preventing us from drawing inside layout.
     11
     12        No new tests, as the problem only occurs in a nonstandard configuration.
     13
     14        * svg/graphics/SVGImage.cpp:
     15        (WebCore::SVGImage::draw):
     16        (WebCore::SVGImage::frameView):
     17        (WebCore):
     18        * svg/graphics/SVGImage.h:
     19        (WebCore):
     20        * svg/graphics/SVGImageCache.cpp:
     21        (WebCore::SVGImageCache::imageContentChanged):
     22        (WebCore::SVGImageCache::redraw):
     23        (WebCore::SVGImageCache::redrawTimerFired):
     24        (WebCore):
     25        * svg/graphics/SVGImageCache.h:
     26        (SVGImageCache):
     27
    1282012-02-24  Tim Horton  <timothy_horton@apple.com>
    229
  • trunk/Source/WebCore/svg/graphics/SVGImage.cpp

    r107518 r108834  
    211211        return;
    212212
    213     FrameView* view = m_page->mainFrame()->view();
     213    FrameView* view = frameView();
    214214
    215215    GraphicsContextStateSaver stateSaver(*context);
     
    254254        return 0;
    255255    return toRenderBox(rootElement->renderer());
     256}
     257
     258FrameView* SVGImage::frameView() const
     259{
     260    if (!m_page)
     261        return 0;
     262
     263    return m_page->mainFrame()->view();
    256264}
    257265
  • trunk/Source/WebCore/svg/graphics/SVGImage.h

    r107059 r108834  
    3535namespace WebCore {
    3636
     37class FrameView;
    3738class ImageBuffer;
    3839class Page;
     
    5455    void drawSVGToImageBuffer(ImageBuffer*, const IntSize&, float zoom, ShouldClearBuffer);
    5556    RenderBox* embeddedContentBox() const;
     57    FrameView* frameView() const;
    5658
    5759    virtual bool isSVGImage() const { return true; }
  • trunk/Source/WebCore/svg/graphics/SVGImageCache.cpp

    r99539 r108834  
    2222
    2323#if ENABLE(SVG)
     24#include "FrameView.h"
    2425#include "GraphicsContext.h"
    2526#include "ImageBuffer.h"
     
    8283        it->second.imageNeedsUpdate = true;
    8384
    84     // Start redrawing dirty images with a timer, as imageContentChanged() may be called
    85     // by the FrameView of the SVGImage which is currently in FrameView::layout().
    86     if (!m_redrawTimer.isActive())
    87         m_redrawTimer.startOneShot(0);
     85    // If we're in the middle of layout, start redrawing dirty
     86    // images on a timer; otherwise it's safe to draw immediately.
     87   
     88    FrameView* frameView = m_svgImage->frameView();
     89    if (frameView && frameView->needsLayout()) {
     90        if (!m_redrawTimer.isActive())
     91            m_redrawTimer.startOneShot(0);
     92    } else
     93        redraw();
    8894}
    8995
    90 void SVGImageCache::redrawTimerFired(Timer<SVGImageCache>*)
     96void SVGImageCache::redraw()
    9197{
    9298    ImageDataMap::iterator end = m_imageDataMap.end();
     
    104110    ASSERT(m_svgImage->imageObserver());
    105111    m_svgImage->imageObserver()->animationAdvanced(m_svgImage);
     112}
     113
     114void SVGImageCache::redrawTimerFired(Timer<SVGImageCache>*)
     115{
     116    redraw();
    106117}
    107118
  • trunk/Source/WebCore/svg/graphics/SVGImageCache.h

    r99539 r108834  
    7171private:
    7272    SVGImageCache(SVGImage*);
     73    void redraw();
    7374    void redrawTimerFired(Timer<SVGImageCache>*);
    7475
Note: See TracChangeset for help on using the changeset viewer.