blob: 02f0cc7b610620e58e1df2deee98a4c62a75798a [file] [log] [blame]
<!DOCTYPE html>
<html>
<body onload="runTest()">
<script src="../resources/js-test.js"></script>
<script>
description("This test asserts that a CSSAnimation doesn't leak after it was removed declaratively and the document was replaced.");
if (window.internals)
jsTestIsAsync = true;
function runTest() {
if (!window.internals)
return;
var frame = document.body.appendChild(document.createElement("iframe"));
frame.addEventListener("load", async () => {
if (frame.src === 'about:blank')
return;
const animationId = "leak-css-animation";
await (element => {
return new Promise(resolve => {
const animation = element.getAnimations()[0];
if (!animation) {
testFailed("The expected CSS animation was not created.");
finishJSTest();
}
animation.id = animationId;
if (!internals.animationWithIdExists(animationId)) {
testFailed("The expected CSS animation with the provided ID was not initially found.");
finishJSTest();
}
requestAnimationFrame(() => {
element.style.animation = "none";
resolve();
});
});
})(frame.contentDocument.querySelector("div"));
requestAnimationFrame(() => {
frame.remove();
frame = null;
gc();
let timeout = 0;
const handle = setInterval(() => {
if (!internals.animationWithIdExists(animationId)) {
clearInterval(handle);
testPassed("The CSS animation was destroyed.");
finishJSTest();
return;
}
timeout++;
if (timeout == 500) {
clearInterval(handle);
testFailed("The CSS animation was leaked.");
finishJSTest();
return;
}
gc();
}, 10);
});
});
frame.src = 'resources/css-animation-leak-iframe.html';
}
</script>
</body>
</html>