Commit ce494afb authored by xlai's avatar xlai Committed by Commit bot

Correct SourceImageStatus in OffscreenCanvas::getSourceImageForCanvas

The crash in constructor of ImagePattern may be due to the fact that
image passed in as its constructor argument is nullptr. By tracking
all the call trace backwards, we find the image creation originates
from BaseRenderingContext2D::createPattern, where the SourceImageStatus
indicates what corresponding action to do. But this SourceImageStatus
was wrongly set for OffscreenCanvas, in particular, in the function
OffscreenCanvas::getSourceImageForCanvas. This CL corrects it and makes
sure that if the image is null, BaseRenderingContext2D::createPattern
will return Image::nullImage() instead of nullptr.

BUG=646654

Review-Url: https://codereview.chromium.org/2344573002
Cr-Commit-Position: refs/heads/master@{#418927}
parent 6772f5bb
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script>
test(function() {
var patternCanvas = new OffscreenCanvas(0, 50);
var patternCanvasCtx = patternCanvas.getContext("2d");
patternCanvasCtx.fillStyle = '#fed';
patternCanvasCtx.fillRect(0, 0, 15, 15);
var myOCanvas = new OffscreenCanvas(100, 100);
var myOCanvasCtx = myOCanvas.getContext("2d");
var pattern = myOCanvasCtx.createPattern(patternCanvas, 'repeat');
myOCanvasCtx.fillStyle = pattern;
myOCanvasCtx.fillRect(0, 0, myOCanvas.width, myOCanvas.height);
var imageData = myOCanvasCtx.getImageData(0, 0, 1, 1).data;
assert_equals(imageData[0], 0);
assert_equals(imageData[1], 0);
assert_equals(imageData[2], 0);
assert_equals(imageData[3], 0);
}, "CreatePattern using OffcreenCanvas as image source silently fails when offscreenCanvas has zero size");
</script>
...@@ -74,14 +74,23 @@ ImageBitmap* OffscreenCanvas::transferToImageBitmap(ExceptionState& exceptionSta ...@@ -74,14 +74,23 @@ ImageBitmap* OffscreenCanvas::transferToImageBitmap(ExceptionState& exceptionSta
return image; return image;
} }
PassRefPtr<Image> OffscreenCanvas::getSourceImageForCanvas(SourceImageStatus* status, AccelerationHint hint, SnapshotReason reason, const FloatSize&) const PassRefPtr<Image> OffscreenCanvas::getSourceImageForCanvas(SourceImageStatus* status, AccelerationHint hint, SnapshotReason reason, const FloatSize& size) const
{ {
if (!m_context) { if (!m_context) {
*status = InvalidSourceImageStatus; *status = InvalidSourceImageStatus;
return nullptr; return nullptr;
} }
if (!size.width() || !size.height()) {
*status = ZeroSizeCanvasSourceImageStatus;
return nullptr;
}
RefPtr<Image> image = m_context->getImage(hint, reason);
if (!image) {
*status = InvalidSourceImageStatus;
} else {
*status = NormalSourceImageStatus; *status = NormalSourceImageStatus;
return m_context->getImage(hint, reason); }
return image.release();
} }
bool OffscreenCanvas::isOpaque() const bool OffscreenCanvas::isOpaque() const
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment