blob: b423a3050b7d54f601ac9cd74ba12bfe071c03c2 [file] [log] [blame]
<!DOCTYPE html><!-- webkit-test-runner [ IntersectionObserverEnabled=true ] -->
<html>
<head>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="../resources/gc.js"></script>
</head>
<body>
<div id="container"></div>
<script>
async function callbackSurvivesAfterGC() {
let test = async_test("test: IntersectionObserverCallbacks stay alive if according observers is alive");
const iterationCount = 10;
let deletedNodesCount = 0;
let callbackCountAfterDelete = 0;
let observers = [];
await new Promise((resolve, reject) => {
for (let j = 0; j < iterationCount; ++j) {
const div = document.createElement('div');
div.state = "toDelete";
container.appendChild(div);
let observer = new IntersectionObserver(entries => {
for (const entry of entries) {
if (entry.target.state == "toDelete") {
deletedNodesCount++;
container.removeChild(entry.target);
entry.target.state = "deleted";
if (deletedNodesCount == iterationCount)
resolve();
} else if (entry.target.state == "new") {
entry.target.state = "checked";
callbackCountAfterDelete++;
}
}
if (callbackCountAfterDelete == iterationCount)
test.done();
});
observer.observe(div);
observers[j] = observer;
}
});
gc();
for (let j = 0; j < iterationCount; ++j) {
const div = document.createElement('div');
div.state = "new";
container.appendChild(div);
observers[j].observe(div);
}
}
window.onload = callbackSurvivesAfterGC();
</script>
</body>
</html>