| Index: LayoutTests/fast/canvas/canvas-lose-restore-max-int-size.html
|
| diff --git a/LayoutTests/fast/canvas/script-tests/canvas-extremely-large-dimensions.js b/LayoutTests/fast/canvas/canvas-lose-restore-max-int-size.html
|
| similarity index 13%
|
| rename from LayoutTests/fast/canvas/script-tests/canvas-extremely-large-dimensions.js
|
| rename to LayoutTests/fast/canvas/canvas-lose-restore-max-int-size.html
|
| index 7de4f41c63ce288558d40bd823282f682c3d5960..ec412cb3393c4658b566bfbe61225df7a71243fe 100644
|
| --- a/LayoutTests/fast/canvas/script-tests/canvas-extremely-large-dimensions.js
|
| +++ b/LayoutTests/fast/canvas/canvas-lose-restore-max-int-size.html
|
| @@ -1,85 +1,71 @@
|
| -description("Series of tests to ensure correct behaviour when canvas size is extremely large.");
|
| +<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
|
| +<html>
|
| +<head>
|
| +<script src="../../resources/js-test.js"></script>
|
| +</head>
|
| +<body>
|
| +<script>
|
| +description("Tests to ensure correct behaviour of canvas loss and restoration when size is extremely large then, restored to a reasonable value.");
|
| +
|
| +if (window.testRunner) {
|
| + testRunner.dumpAsText();
|
| + testRunner.waitUntilDone();
|
| +}
|
| +
|
| var canvas = document.createElement('canvas')
|
| +canvas.addEventListener('contextlost', contextLost);
|
| +canvas.addEventListener('contextrestored', contextRestored);
|
| var ctx = canvas.getContext('2d');
|
| +var lostEventHasFired = false;
|
| +verifyContextLost(false);
|
|
|
| // WebIDL defines width and height as int. 2147483647 is int max.
|
| var extremelyLargeNumber = 2147483647;
|
| canvas.width = extremelyLargeNumber;
|
| canvas.height = extremelyLargeNumber;
|
| -
|
| -debug("check for crash on extremely large canvas size.");
|
| -useCanvasContext(ctx);
|
| -var imageData = ctx.getImageData(1, 1, 98, 98);
|
| -var imgdata = imageData.data;
|
| -// Blink returns zero color if the image buffer does not exist.
|
| -shouldBe("imgdata[4]", "0");
|
| -shouldBe("imgdata[5]", "0");
|
| -shouldBe("imgdata[6]", "0");
|
| -
|
| -debug("check for crash after resetting to the same size.");
|
| +verifyContextLost(true);
|
| canvas.width = extremelyLargeNumber;
|
| -useCanvasContext(ctx);
|
| -imageData = ctx.getImageData(1, 1, 98, 98);
|
| -imgdata = imageData.data;
|
| -shouldBe("imgdata[4]", "0");
|
| -shouldBe("imgdata[5]", "0");
|
| -shouldBe("imgdata[6]", "0");
|
| -
|
| -// googol is parsed to 0.
|
| -var googol = Math.pow(10, 100);
|
| -debug("check for crash after resizing to googol.");
|
| -canvas.width = googol;
|
| -canvas.height = googol;
|
| -useCanvasContext(ctx);
|
| -imageData = ctx.getImageData(1, 1, 98, 98);
|
| -imgdata = imageData.data;
|
| -shouldBe("imgdata[4]", "0");
|
| -shouldBe("imgdata[5]", "0");
|
| -shouldBe("imgdata[6]", "0");
|
| -
|
| -debug("check for crash after resetting to the same size.");
|
| -canvas.width = googol;
|
| -useCanvasContext(ctx);
|
| -imageData = ctx.getImageData(1, 1, 98, 98);
|
| -imgdata = imageData.data;
|
| -shouldBe("imgdata[4]", "0");
|
| -shouldBe("imgdata[5]", "0");
|
| -shouldBe("imgdata[6]", "0");
|
| +verifyContextLost(true);
|
| +canvas.width = 100;
|
| +canvas.height = 100;
|
| +verifyContextLost(true); // Restoration is async.
|
| +// Restore a sane dimension
|
|
|
| -debug("check again for crash on extremely large canvas size.");
|
| -canvas.width = extremelyLargeNumber;
|
| -canvas.height = extremelyLargeNumber;
|
| -useCanvasContext(ctx);
|
| -imageData = ctx.getImageData(1, 1, 98, 98);
|
| -imgdata = imageData.data;
|
| -shouldBe("imgdata[4]", "0");
|
| -shouldBe("imgdata[5]", "0");
|
| -shouldBe("imgdata[6]", "0");
|
| +function verifyContextLost(shouldBeLost) {
|
| + // Verify context loss experimentally as well as isContextLost()
|
| + ctx.fillStyle = '#0f0';
|
| + ctx.fillRect(0, 0, 1, 1);
|
| + contextLostTest = ctx.getImageData(0, 0, 1, 1).data[1] == 0;
|
| + if (shouldBeLost) {
|
| + shouldBeTrue('contextLostTest');
|
| + shouldBeTrue('ctx.isContextLost()');
|
| + } else {
|
| + shouldBeFalse('contextLostTest');
|
| + shouldBeFalse('ctx.isContextLost()');
|
| + }
|
| +}
|
|
|
| -function useCanvasContext(ctx) {
|
| - ctx.fillStyle = 'green';
|
| - ctx.fillRect(0, 0, 100, 100);
|
| - for(var i = 0; i < 100; i++) {
|
| - // This API tries to create an image buffer if the image buffer is not created.
|
| - ctx.getImageData(1, 1, 1, 1);
|
| +function contextLost() {
|
| + if (lostEventHasFired) {
|
| + testFailed('Context lost event was dispatched more than once.');
|
| + } else {
|
| + testPassed('Graphics context lost event dispatched.');
|
| }
|
| - ctx.beginPath();
|
| - ctx.rect(0,0,100,100);
|
| - ctx.save();
|
| - ctx.fillStyle = 'red';
|
| - ctx.fillRect(0, 0, 100, 100);
|
| - ctx.restore();
|
| - ctx.fillStyle = 'green';
|
| - ctx.fill();
|
| + lostEventHasFired = true;
|
| + verifyContextLost(true);
|
| }
|
|
|
| -debug("after resizing to normal size, the canvas must be in a valid state.");
|
| -canvas.width = 100;
|
| -canvas.height = 100;
|
| -ctx.fillStyle = 'blue';
|
| -ctx.fillRect(0, 0, 100, 100);
|
| -imageData = ctx.getImageData(1, 1, 98, 98);
|
| -imgdata = imageData.data;
|
| -shouldBe("imgdata[4]", "0");
|
| -shouldBe("imgdata[5]", "0");
|
| -shouldBe("imgdata[6]", "255");
|
| +function contextRestored() {
|
| + if (lostEventHasFired) {
|
| + testPassed('Context restored event dispatched after context lost.');
|
| + } else {
|
| + testFailed('Context restored event was dispatched before a context lost event.');
|
| + }
|
| + verifyContextLost(false);
|
| + if (window.testRunner) {
|
| + testRunner.notifyDone();
|
| + }
|
| +}
|
| +</script>
|
| +</body>
|
| +</html>
|
|
|