diff options
Diffstat (limited to 'Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp')
-rw-r--r-- | Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp b/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp index 829e7b356..b87f68ee4 100644 --- a/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp +++ b/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp @@ -350,12 +350,25 @@ inline void CanvasRenderingContext2D::FontProxy::drawBidiText(GraphicsContext& c context.drawBidiText(m_font, run, point, action); } +void CanvasRenderingContext2D::realizeSaves() +{ + if (m_unrealizedSaveCount) + realizeSavesLoop(); + + if (m_unrealizedSaveCount) { + static NeverDestroyed<String> consoleMessage(ASCIILiteral("CanvasRenderingContext2D.save() has been called without a matching restore() too many times. Ignoring save().")); + canvas()->document().addConsoleMessage(MessageSource::Rendering, MessageLevel::Error, consoleMessage); + } +} + void CanvasRenderingContext2D::realizeSavesLoop() { ASSERT(m_unrealizedSaveCount); ASSERT(m_stateStack.size() >= 1); GraphicsContext* context = drawingContext(); do { + if (m_stateStack.size() > MaxSaveCount) + break; m_stateStack.append(state()); if (context) context->save(); @@ -1458,7 +1471,7 @@ void CanvasRenderingContext2D::drawImage(HTMLImageElement* imageElement, const F if (image->isSVGImage()) { image->setImageObserver(nullptr); - image->setContainerSize(normalizedSrcRect.size()); + image->setContainerSize(imageRect.size()); } if (rectContainsCanvas(normalizedDstRect)) { @@ -2090,8 +2103,17 @@ RefPtr<ImageData> CanvasRenderingContext2D::getImageData(ImageBuffer::Coordinate return createEmptyImageData(imageDataRect.size()); RefPtr<Uint8ClampedArray> byteArray = buffer->getUnmultipliedImageData(imageDataRect, coordinateSystem); - if (!byteArray) + if (!byteArray) { + StringBuilder consoleMessage; + consoleMessage.appendLiteral("Unable to get image data from canvas. Requested size was "); + consoleMessage.appendNumber(imageDataRect.width()); + consoleMessage.appendLiteral(" x "); + consoleMessage.appendNumber(imageDataRect.height()); + + canvas()->document().addConsoleMessage(MessageSource::Rendering, MessageLevel::Error, consoleMessage.toString()); + ec = INVALID_STATE_ERR; return nullptr; + } return ImageData::create(imageDataRect.size(), byteArray.release()); } |