<!DOCTYPE html><!-- webkit-test-runner [ ResizeObserverEnabled=true ] -->
<html>
<meta name="timeout" content="long">
<head>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="../resources/gc.js"></script>
</head>
<body>
<script>

let iframeCount = 20;
function prepareFrame() {
    return new Promise(function(resolve, reject) {
        let container = document.createElement("div");
        for (let i = 0; i < iframeCount; ++i) {
            let iframe = document.createElement("iframe");
            iframe.style.height = "1px";
            iframe.src = "resources/element-leak-frame.html";
            container.appendChild(iframe);
        }
        document.body.appendChild(container);

        let notifyCount = 0;
        window.addEventListener('message', event => {
            switch(event.data) {
            case 'Notified':
                notifyCount++;
                if (notifyCount == iframeCount) {
                    resolve("All iframes notified");
                }
            break;
            }
        }, false);
    });
}

function testElementLeak(resolve, reject) {
    return new Promise(function(resolve, reject) {
        let documentIdentifierArray = new Array(iframeCount);
        let count = 0;
        document.querySelectorAll('iframe').forEach(iframe => {
            documentIdentifierArray[count++] = internals.documentIdentifier(iframe.contentDocument);
            iframe.remove();
        });

        let handle = setInterval(function() {
            gc();
            documentIdentifierArray.forEach(function(frameDocumentIdentifier) {
                if (internals && !internals.isDocumentAlive(frameDocumentIdentifier)) {
                    clearInterval(handle);
                    documentIdentifierArray = [];
                    resolve("Detected document release.");
                }
            });
        }, 10);
    });
}

function startTest() {
    return prepareFrame().then(function(){
        return testElementLeak().catch(function(result){
            assert_unreached(result);
        });
    }).catch(function(result){
        assert_unreached(result);
    });
}

test(_ => {
    assert_own_property(window, "ResizeObserver");
}, "ResizeObserver implemented");

promise_test(async () => {
    return startTest();
}, 'Test elements leak in 20 iframes');

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