Changeset 108834 in webkit
- Timestamp:
- Feb 24, 2012 11:41:12 AM (12 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r108832 r108834 1 2012-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 1 28 2012-02-24 Tim Horton <timothy_horton@apple.com> 2 29 -
trunk/Source/WebCore/svg/graphics/SVGImage.cpp
r107518 r108834 211 211 return; 212 212 213 FrameView* view = m_page->mainFrame()->view();213 FrameView* view = frameView(); 214 214 215 215 GraphicsContextStateSaver stateSaver(*context); … … 254 254 return 0; 255 255 return toRenderBox(rootElement->renderer()); 256 } 257 258 FrameView* SVGImage::frameView() const 259 { 260 if (!m_page) 261 return 0; 262 263 return m_page->mainFrame()->view(); 256 264 } 257 265 -
trunk/Source/WebCore/svg/graphics/SVGImage.h
r107059 r108834 35 35 namespace WebCore { 36 36 37 class FrameView; 37 38 class ImageBuffer; 38 39 class Page; … … 54 55 void drawSVGToImageBuffer(ImageBuffer*, const IntSize&, float zoom, ShouldClearBuffer); 55 56 RenderBox* embeddedContentBox() const; 57 FrameView* frameView() const; 56 58 57 59 virtual bool isSVGImage() const { return true; } -
trunk/Source/WebCore/svg/graphics/SVGImageCache.cpp
r99539 r108834 22 22 23 23 #if ENABLE(SVG) 24 #include "FrameView.h" 24 25 #include "GraphicsContext.h" 25 26 #include "ImageBuffer.h" … … 82 83 it->second.imageNeedsUpdate = true; 83 84 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(); 88 94 } 89 95 90 void SVGImageCache::redraw TimerFired(Timer<SVGImageCache>*)96 void SVGImageCache::redraw() 91 97 { 92 98 ImageDataMap::iterator end = m_imageDataMap.end(); … … 104 110 ASSERT(m_svgImage->imageObserver()); 105 111 m_svgImage->imageObserver()->animationAdvanced(m_svgImage); 112 } 113 114 void SVGImageCache::redrawTimerFired(Timer<SVGImageCache>*) 115 { 116 redraw(); 106 117 } 107 118 -
trunk/Source/WebCore/svg/graphics/SVGImageCache.h
r99539 r108834 71 71 private: 72 72 SVGImageCache(SVGImage*); 73 void redraw(); 73 74 void redrawTimerFired(Timer<SVGImageCache>*); 74 75
Note: See TracChangeset
for help on using the changeset viewer.