Index: third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp |
diff --git a/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp b/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp |
index d0b1507be5a13a82865857ab3516b60d57bd2885..e463ee0f70ab209f1a53629fb7d4d46ef8ec1bb0 100644 |
--- a/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp |
+++ b/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp |
@@ -487,7 +487,11 @@ String HTMLCanvasElement::toEncodingMimeType(const String& mimeType) |
const AtomicString HTMLCanvasElement::imageSourceURL() const |
{ |
- return AtomicString(toDataURLInternal("image/png", 0, FrontBuffer)); |
+ NonThrowableExceptionState exceptionState; |
+ AtomicString dataURL(toDataURLInternal("image/png", 0, FrontBuffer, exceptionState)); |
+ if (exceptionState.hadException()) |
+ return AtomicString("data:,"); |
+ return dataURL; |
} |
void HTMLCanvasElement::prepareSurfaceForPaintingIfNeeded() const |
@@ -497,7 +501,7 @@ void HTMLCanvasElement::prepareSurfaceForPaintingIfNeeded() const |
m_imageBuffer->prepareSurfaceForPaintingIfNeeded(); |
} |
-ImageData* HTMLCanvasElement::toImageData(SourceDrawingBuffer sourceBuffer) const |
+ImageData* HTMLCanvasElement::toImageData(SourceDrawingBuffer sourceBuffer, ExceptionState& exceptionState) const |
{ |
ImageData* imageData; |
if (is3D()) { |
@@ -507,7 +511,9 @@ ImageData* HTMLCanvasElement::toImageData(SourceDrawingBuffer sourceBuffer) cons |
return imageData; |
m_context->paintRenderingResultsToCanvas(sourceBuffer); |
- imageData = ImageData::create(m_size); |
+ imageData = ImageData::create(m_size, exceptionState); |
+ if (exceptionState.hadException()) |
+ return nullptr; |
RefPtr<SkImage> snapshot = buffer()->newSkImageSnapshot(PreferNoAcceleration); |
if (snapshot) { |
SkImageInfo imageInfo = SkImageInfo::Make(width(), height(), kRGBA_8888_SkColorType, kUnpremul_SkAlphaType); |
@@ -516,7 +522,9 @@ ImageData* HTMLCanvasElement::toImageData(SourceDrawingBuffer sourceBuffer) cons |
return imageData; |
} |
- imageData = ImageData::create(m_size); |
+ imageData = ImageData::create(m_size, exceptionState); |
+ if (exceptionState.hadException()) |
+ return nullptr; |
if (!m_context) |
return imageData; |
@@ -531,14 +539,17 @@ ImageData* HTMLCanvasElement::toImageData(SourceDrawingBuffer sourceBuffer) cons |
return imageData; |
} |
-String HTMLCanvasElement::toDataURLInternal(const String& mimeType, const double& quality, SourceDrawingBuffer sourceBuffer) const |
+String HTMLCanvasElement::toDataURLInternal(const String& mimeType, const double& quality, SourceDrawingBuffer sourceBuffer, ExceptionState& exceptionState) const |
{ |
if (!isPaintable()) |
return String("data:,"); |
String encodingMimeType = toEncodingMimeType(mimeType); |
- ImageData* imageData = toImageData(sourceBuffer); |
+ ImageData* imageData = toImageData(sourceBuffer, exceptionState); |
+ if (exceptionState.hadException()) |
+ return String(); |
+ |
ScopedDisposal<ImageData> disposer(imageData); |
return ImageDataBuffer(imageData->size(), imageData->data()->data()).toDataURL(encodingMimeType, quality); |
@@ -557,7 +568,7 @@ String HTMLCanvasElement::toDataURL(const String& mimeType, const ScriptValue& q |
quality = v8Value.As<v8::Number>()->Value(); |
} |
} |
- return toDataURLInternal(mimeType, quality, BackBuffer); |
+ return toDataURLInternal(mimeType, quality, BackBuffer, exceptionState); |
} |
void HTMLCanvasElement::encodeImageAsync(DOMUint8ClampedArray* imageData, IntSize imageSize, FileCallback* callback, const String& mimeType, double quality) |
@@ -603,8 +614,11 @@ void HTMLCanvasElement::toBlob(FileCallback* callback, const String& mimeType, c |
String encodingMimeType = toEncodingMimeType(mimeType); |
- ImageData* imageData = toImageData(BackBuffer); |
- // imageData unref its data, which we still keep alive for the async toBlob thread |
+ ImageData* imageData = toImageData(BackBuffer, exceptionState); |
+ if (exceptionState.hadException()) |
+ return; |
+ |
+ // ImageData unrefs its data, which we still keep alive for the async toBlob thread |
ScopedDisposal<ImageData> disposer(imageData); |
// Add a ref to keep image data alive until completion of encoding |