blob: 0855129191a8e8d445e92051167a1122430b5344 [file] [log] [blame]
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script>
var canvas = document.createElement('canvas')
var ctx = canvas.getContext('2d');
function verifyContextLost(shouldBeLost, message) {
// Verify context loss experimentally as well as isContextLost()
ctx.fillStyle = '#0f0';
ctx.fillRect(0, 0, 1, 1);
var contextLostTest = ctx.getImageData(0, 0, 1, 1).data[1] == 0;
assert_equals(contextLostTest, shouldBeLost, message + ': Ability to read a write to context');
assert_equals(ctx.isContextLost(), shouldBeLost, message + ': Context lost state');
}
test(() => {
verifyContextLost(false, 'initial state');
}, 'Context should initially not be lost');
test(() => {
// WebIDL defines width and height as int. 2147483647 is int max.
var extremelyLargeNumber = 2147483647;
canvas.width = extremelyLargeNumber;
canvas.height = extremelyLargeNumber;
verifyContextLost(true, 'extremely large height set');
canvas.width = extremelyLargeNumber;
verifyContextLost(true, 'extremely large width set');
// Restore a sane dimension
canvas.width = 100;
canvas.height = 100;
// Restoration is async.
verifyContextLost(true, 'reasonable size set');
}, 'Context should be lost when size is set to an extremely large number and then restored when set to a reasonable number');
var lostEventHasFired = false;
promise_test(() => {
return new Promise(resolve => {
canvas.addEventListener('contextlost', () => {
assert_false(lostEventHasFired, 'contextLost should only be fired once');
lostEventHasFired = true;
verifyContextLost(true);
resolve();
});
});
}, 'contextlost event should fire after size is set to extremely large number');
promise_test(() => {
return new Promise(resolve => {
canvas.addEventListener('contextrestored', () => {
assert_true(lostEventHasFired, 'Lost context event should fire before resorted context event');
verifyContextLost(false);
resolve();
});
});
}, 'contextrestored event should fire after size is restored to a reasonable number');
</script>