75 lines
2.2 KiB
HTML
75 lines
2.2 KiB
HTML
<!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>
|