blob: f6668368dfb1376aaefc3341c24974ce124e18fa [file] [log] [blame] [edit]
<!DOCTYPE html>
<body>
<script src='../../resources/js-test.js'></script>
<script>
description("Test a gradient stored on the state stack does not get garbage collected. Test passes if it does not crash.");
jsTestIsAsync = true;
window.onload = function() {
let context = document.getElementById('c').getContext('2d');
if (true) {
let gradient = context.createLinearGradient(0, 0, 75, 75);
gradient.addColorStop(0, 'red');
gradient.addColorStop(0.33, 'white');
gradient.addColorStop(0.67, 'white');
gradient.addColorStop(1, 'blue');
context.scale(2,2);
context.beginPath();
context.rect(0,0,75,75);
context.clip();
context.fillStyle = gradient;
context.fillRect(0,0,30,30);
context.fillRect(50,50,30,30);
context.save();
}
context.fillStyle = 'green';
context.scale(0.5,0.5);
context.beginPath();
context.rect(0,0,5,5);
context.clip();
requestAnimationFrame(() => forceGC(context));
};
function forceGC(ctx) {
count = 0;
handle = setInterval(() => {
gc();
count++;
if (count > 500) {
clearInterval(handle);
drawSecondFrame(ctx);
}
}, 10);
}
function drawSecondFrame(ctx) {
ctx.restore();
let gradient = ctx.fillStyle;
// colors are type string, gradients and patterns are objects
if (typeof gradient !== typeof {})
testFailed("Should have restored a gradient from the state stack.");
ctx.fillRect(0,0,30,30);
ctx.fillRect(75,75,30,30);
if (window.testRunner) {
finishJSTest("PASS");
}
}
</script>
<canvas id="c" width="300" height="300"></canvas>
</body>