Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(551)

Unified Diff: Source/core/html/canvas/CanvasRenderingContext2D.cpp

Issue 293963009: Fixing GraphicsContext state checks to support oilpan (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: updated test expectations Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/core/html/canvas/CanvasRenderingContext2D.cpp
diff --git a/Source/core/html/canvas/CanvasRenderingContext2D.cpp b/Source/core/html/canvas/CanvasRenderingContext2D.cpp
index 8456aba1db2b4de549857a809bf166dec4e1618a..1d019b94ba6dbf5646937aefe1220ec66dc967be 100644
--- a/Source/core/html/canvas/CanvasRenderingContext2D.cpp
+++ b/Source/core/html/canvas/CanvasRenderingContext2D.cpp
@@ -102,23 +102,21 @@ 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()) {
f(malita) 2014/05/27 20:28:22 Since we're asserting that m_stateStack.size() ==
Justin Novosad 2014/05/27 22:25:25 Good point. GC::unwindStateStack was my fist attem
- if (GraphicsContext* context = canvas()->existingDrawingContext()) {
- while (--stackSize)
- context->restore();
- }
+ if (GraphicsContext* context = canvas()->existingDrawingContext()) {
+ context->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 +224,15 @@ void CanvasRenderingContext2D::dispatchContextRestoredEvent(Timer<CanvasRenderin
void CanvasRenderingContext2D::reset()
{
+ validateStateStack();
unwindStateStack();
+ // Replace the save() held by HTMLCanvasElement::m_contextStateSaver
Stephen White 2014/05/27 18:11:32 Maybe it's jetlag, but I don't understand this com
+ if (GraphicsContext* context = canvas()->existingDrawingContext())
+ context->save();
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,
@@ -2372,7 +2382,7 @@ void CanvasRenderingContext2D::drawFocusRing(const Path& path)
c->setCompositeOperation(CompositeSourceOver, blink::WebBlendModeNormal);
c->drawFocusRing(path, focusRingWidth, focusRingOutline, focusRingColor);
c->restore();
-
+ validateStateStack();
didDraw(dirtyRect);
}

Powered by Google App Engine
This is Rietveld 408576698