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(); |
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); |
} |