<!DOCTYPE html>
<html>
<head>
<script src="../resources/js-test-pre.js"></script>
<script src="../resources/gc.js"></script>
</head>
<body>
<script>
description("Tests that using PerformanceObserver does not cause the document to get leaked.");
window.jsTestIsAsync = true;

window.onload = function () {
    testDocumentIsNotLeaked(
        async function initAndRemove(frameCount)
        {
            let frames = await new Promise((resolve, reject) => {
                let frames = [];
                let counter = 0;
                function onLoad() {
                    counter++;
                    if (counter == frameCount)
                        resolve(frames);
                }
                for (let i = 0; i < frameCount; ++i) {
                    let frame = document.createElement('iframe');
                    frame.src = "resources/performance-observer-no-document-leak-frame.html";
                    frame.onload = onLoad;
                    document.body.appendChild(frame);
                    frames.push(frame);
                }
            });
            let frameIdentifiers = [];
            for (let i = 0; i < frameCount; ++i) {
                let frame = frames[i];
                frameIdentifiers.push(internals.documentIdentifier(frame.contentDocument));
                frame.remove();
            }
            nukeArray(frames);
            frames = null;
            return frameIdentifiers;
        }
    ).then(
        () => testPassed("Document did not leak"),
        (error) => testFailed(error.message)
    ).finally(finishJSTest);
};

</script>
<script src="../resources/js-test-post.js"></script>
</body>
</html>
