<!DOCTYPE html><!-- webkit-test-runner [ experimental:ResizeObserverEnabled=true ] -->
<html>
<body>
<p>This tests that JS wrappers of targets in an ResizeObserverEntry do not get collected.</p>
<pre id="log"></pre>
<script src="../resources/gc.js"></script>
<script>

if (window.testRunner)
    testRunner.dumpAsText();

const targetCount = 5;
const iterationCount = 10;

async function observe() {
    for (let i = 0; i < targetCount; ++i) {
        let target = document.createElement('div');
        target.myState = 'live';
        document.body.appendChild(target);
    }

    return new Promise((resolve) => {
        const observer = new ResizeObserver(entries => {
            resolve(entries);
            observer.disconnect();
        });
        document.querySelectorAll('div').forEach(target => observer.observe(target));
    });
}

function check(entries) {
    let deadCount = 0;
    for (const entry of entries) {
        if (entry.target.myState != 'live')
            deadCount++;
    }
    document.getElementById('log').textContent += (deadCount ? `FAIL - ${deadCount} targets lost JS wrappers` : 'PASS') + '\n';
}

async function runAll() {
    if (window.testRunner)
        testRunner.waitUntilDone();

    for (let j = 0; j < iterationCount; ++j) {
        const entries = await observe();
        document.querySelectorAll('div').forEach(target => target.remove());
        await Promise.resolve();
        gc();
        check(entries);
    }

    if (window.testRunner)
        testRunner.notifyDone();
}

runAll();

</script>
</body>
</html>
