Chromium Code Reviews| Index: Source/core/html/canvas/CanvasRenderingContext2D.cpp |
| diff --git a/Source/core/html/canvas/CanvasRenderingContext2D.cpp b/Source/core/html/canvas/CanvasRenderingContext2D.cpp |
| index eb9dee1de7b0eab5599ca78987e5a8e36e991242..0d3633e2c3909873de91b5fa7271853e662e9d5e 100644 |
| --- a/Source/core/html/canvas/CanvasRenderingContext2D.cpp |
| +++ b/Source/core/html/canvas/CanvasRenderingContext2D.cpp |
| @@ -102,9 +102,6 @@ CanvasRenderingContext2D::CanvasRenderingContext2D(HTMLCanvasElement* canvas, co |
| void CanvasRenderingContext2D::unwindStateStack() |
| { |
| - // Ensure that the state stack in the ImageBuffer's context |
| - // is cleared before destruction, to avoid assertions in the |
| - // GraphicsContext dtor. |
| if (size_t stackSize = m_stateStack.size()) { |
| if (GraphicsContext* context = canvas()->existingDrawingContext()) { |
| while (--stackSize) |
| @@ -115,10 +112,14 @@ void CanvasRenderingContext2D::unwindStateStack() |
| CanvasRenderingContext2D::~CanvasRenderingContext2D() |
| { |
| -#if !ENABLE(OILPAN) |
| +} |
| + |
| +void CanvasRenderingContext2D::validateStateStack() |
| +{ |
| #if !ASSERT_DISABLED |
| - unwindStateStack(); |
| -#endif |
| + GraphicsContext* context = canvas()->existingDrawingContext(); |
| + if (context && !context->contextDisabled()) |
| + ASSERT(context->saveCount() == m_stateStack.size()); |
| #endif |
| } |
| @@ -226,10 +227,12 @@ void CanvasRenderingContext2D::dispatchContextRestoredEvent(Timer<CanvasRenderin |
| void CanvasRenderingContext2D::reset() |
| { |
| + validateStateStack(); |
| unwindStateStack(); |
|
Stephen White
2014/05/28 13:23:34
Just so I understand: there was no bug in reset(),
|
| m_stateStack.resize(1); |
| m_stateStack.first() = adoptPtrWillBeNoop(new State()); |
| m_path.clear(); |
| + validateStateStack(); |
| } |
| // Important: Several of these properties are also stored in GraphicsContext's |
| @@ -348,6 +351,7 @@ void CanvasRenderingContext2D::State::fontsNeedUpdate(CSSFontSelector* fontSelec |
| void CanvasRenderingContext2D::realizeSaves() |
| { |
| + validateStateStack(); |
| if (state().m_unrealizedSaveCount) { |
| ASSERT(m_stateStack.size() >= 1); |
| // Reduce the current state's unrealized count by one now, |
| @@ -360,13 +364,16 @@ void CanvasRenderingContext2D::realizeSaves() |
| // turn necessary to support correct resizing and unwinding of the stack). |
| m_stateStack.last()->m_unrealizedSaveCount = 0; |
| GraphicsContext* context = drawingContext(); |
| + ASSERT(context); |
| if (context) |
| context->save(); |
| + validateStateStack(); |
| } |
| } |
| void CanvasRenderingContext2D::restore() |
| { |
| + validateStateStack(); |
| if (state().m_unrealizedSaveCount) { |
| // We never realized the save, so just record that it was unnecessary. |
| --m_stateStack.last()->m_unrealizedSaveCount; |
| @@ -381,6 +388,7 @@ void CanvasRenderingContext2D::restore() |
| GraphicsContext* c = drawingContext(); |
| if (c) |
| c->restore(); |
| + validateStateStack(); |
| } |
| CanvasStyle* CanvasRenderingContext2D::strokeStyle() const |
| @@ -1240,6 +1248,7 @@ void CanvasRenderingContext2D::clearRect(float x, float y, float width, float he |
| if (saved) |
| context->restore(); |
| + validateStateStack(); |
| didDraw(dirtyRect); |
| } |
| @@ -1535,6 +1544,7 @@ void CanvasRenderingContext2D::drawVideo(HTMLVideoElement* video, FloatRect srcR |
| c->translate(-srcRect.x(), -srcRect.y()); |
| video->paintCurrentFrameInContext(c, IntRect(IntPoint(), IntSize(video->videoWidth(), video->videoHeight()))); |
| stateSaver.restore(); |
| + validateStateStack(); |
| } |
| void CanvasRenderingContext2D::drawImageFromRect(HTMLImageElement* image, |
| @@ -2387,7 +2397,7 @@ void CanvasRenderingContext2D::drawFocusRing(const Path& path) |
| c->setCompositeOperation(CompositeSourceOver, blink::WebBlendModeNormal); |
| c->drawFocusRing(path, focusRingWidth, focusRingOutline, focusRingColor); |
| c->restore(); |
| - |
| + validateStateStack(); |
| didDraw(dirtyRect); |
| } |