| OLD | NEW |
| 1 description("Series of tests to ensure correct behaviour when canvas size is ext
remely large."); | 1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> |
| 2 <html> |
| 3 <head> |
| 4 <script src="../../resources/js-test.js"></script> |
| 5 </head> |
| 6 <body> |
| 7 <script> |
| 8 description("Tests to ensure correct behaviour of canvas loss and restoration wh
en size is extremely large then, restored to a reasonable value."); |
| 9 |
| 10 if (window.testRunner) { |
| 11 testRunner.dumpAsText(); |
| 12 testRunner.waitUntilDone(); |
| 13 } |
| 14 |
| 2 var canvas = document.createElement('canvas') | 15 var canvas = document.createElement('canvas') |
| 16 canvas.addEventListener('contextlost', contextLost); |
| 17 canvas.addEventListener('contextrestored', contextRestored); |
| 3 var ctx = canvas.getContext('2d'); | 18 var ctx = canvas.getContext('2d'); |
| 19 var lostEventHasFired = false; |
| 20 verifyContextLost(false); |
| 4 | 21 |
| 5 // WebIDL defines width and height as int. 2147483647 is int max. | 22 // WebIDL defines width and height as int. 2147483647 is int max. |
| 6 var extremelyLargeNumber = 2147483647; | 23 var extremelyLargeNumber = 2147483647; |
| 7 canvas.width = extremelyLargeNumber; | 24 canvas.width = extremelyLargeNumber; |
| 8 canvas.height = extremelyLargeNumber; | 25 canvas.height = extremelyLargeNumber; |
| 26 verifyContextLost(true); |
| 27 canvas.width = extremelyLargeNumber; |
| 28 verifyContextLost(true); |
| 29 canvas.width = 100; |
| 30 canvas.height = 100; |
| 31 verifyContextLost(true); // Restoration is async. |
| 32 // Restore a sane dimension |
| 9 | 33 |
| 10 debug("check for crash on extremely large canvas size."); | 34 function verifyContextLost(shouldBeLost) { |
| 11 useCanvasContext(ctx); | 35 // Verify context loss experimentally as well as isContextLost() |
| 12 var imageData = ctx.getImageData(1, 1, 98, 98); | 36 ctx.fillStyle = '#0f0'; |
| 13 var imgdata = imageData.data; | 37 ctx.fillRect(0, 0, 1, 1); |
| 14 // Blink returns zero color if the image buffer does not exist. | 38 contextLostTest = ctx.getImageData(0, 0, 1, 1).data[1] == 0; |
| 15 shouldBe("imgdata[4]", "0"); | 39 if (shouldBeLost) { |
| 16 shouldBe("imgdata[5]", "0"); | 40 shouldBeTrue('contextLostTest'); |
| 17 shouldBe("imgdata[6]", "0"); | 41 shouldBeTrue('ctx.isContextLost()'); |
| 18 | 42 } else { |
| 19 debug("check for crash after resetting to the same size."); | 43 shouldBeFalse('contextLostTest'); |
| 20 canvas.width = extremelyLargeNumber; | 44 shouldBeFalse('ctx.isContextLost()'); |
| 21 useCanvasContext(ctx); | |
| 22 imageData = ctx.getImageData(1, 1, 98, 98); | |
| 23 imgdata = imageData.data; | |
| 24 shouldBe("imgdata[4]", "0"); | |
| 25 shouldBe("imgdata[5]", "0"); | |
| 26 shouldBe("imgdata[6]", "0"); | |
| 27 | |
| 28 // googol is parsed to 0. | |
| 29 var googol = Math.pow(10, 100); | |
| 30 debug("check for crash after resizing to googol."); | |
| 31 canvas.width = googol; | |
| 32 canvas.height = googol; | |
| 33 useCanvasContext(ctx); | |
| 34 imageData = ctx.getImageData(1, 1, 98, 98); | |
| 35 imgdata = imageData.data; | |
| 36 shouldBe("imgdata[4]", "0"); | |
| 37 shouldBe("imgdata[5]", "0"); | |
| 38 shouldBe("imgdata[6]", "0"); | |
| 39 | |
| 40 debug("check for crash after resetting to the same size."); | |
| 41 canvas.width = googol; | |
| 42 useCanvasContext(ctx); | |
| 43 imageData = ctx.getImageData(1, 1, 98, 98); | |
| 44 imgdata = imageData.data; | |
| 45 shouldBe("imgdata[4]", "0"); | |
| 46 shouldBe("imgdata[5]", "0"); | |
| 47 shouldBe("imgdata[6]", "0"); | |
| 48 | |
| 49 debug("check again for crash on extremely large canvas size."); | |
| 50 canvas.width = extremelyLargeNumber; | |
| 51 canvas.height = extremelyLargeNumber; | |
| 52 useCanvasContext(ctx); | |
| 53 imageData = ctx.getImageData(1, 1, 98, 98); | |
| 54 imgdata = imageData.data; | |
| 55 shouldBe("imgdata[4]", "0"); | |
| 56 shouldBe("imgdata[5]", "0"); | |
| 57 shouldBe("imgdata[6]", "0"); | |
| 58 | |
| 59 function useCanvasContext(ctx) { | |
| 60 ctx.fillStyle = 'green'; | |
| 61 ctx.fillRect(0, 0, 100, 100); | |
| 62 for(var i = 0; i < 100; i++) { | |
| 63 // This API tries to create an image buffer if the image buffer is not c
reated. | |
| 64 ctx.getImageData(1, 1, 1, 1); | |
| 65 } | 45 } |
| 66 ctx.beginPath(); | |
| 67 ctx.rect(0,0,100,100); | |
| 68 ctx.save(); | |
| 69 ctx.fillStyle = 'red'; | |
| 70 ctx.fillRect(0, 0, 100, 100); | |
| 71 ctx.restore(); | |
| 72 ctx.fillStyle = 'green'; | |
| 73 ctx.fill(); | |
| 74 } | 46 } |
| 75 | 47 |
| 76 debug("after resizing to normal size, the canvas must be in a valid state."); | 48 function contextLost() { |
| 77 canvas.width = 100; | 49 if (lostEventHasFired) { |
| 78 canvas.height = 100; | 50 testFailed('Context lost event was dispatched more than once.'); |
| 79 ctx.fillStyle = 'blue'; | 51 } else { |
| 80 ctx.fillRect(0, 0, 100, 100); | 52 testPassed('Graphics context lost event dispatched.'); |
| 81 imageData = ctx.getImageData(1, 1, 98, 98); | 53 } |
| 82 imgdata = imageData.data; | 54 lostEventHasFired = true; |
| 83 shouldBe("imgdata[4]", "0"); | 55 verifyContextLost(true); |
| 84 shouldBe("imgdata[5]", "0"); | 56 } |
| 85 shouldBe("imgdata[6]", "255"); | 57 |
| 58 function contextRestored() { |
| 59 if (lostEventHasFired) { |
| 60 testPassed('Context restored event dispatched after context lost.'); |
| 61 } else { |
| 62 testFailed('Context restored event was dispatched before a context lost
event.'); |
| 63 } |
| 64 verifyContextLost(false); |
| 65 » if (window.testRunner) { |
| 66 » testRunner.notifyDone(); |
| 67 } |
| 68 } |
| 69 </script> |
| 70 </body> |
| 71 </html> |
| OLD | NEW |