<!DOCTYPE html><!-- webkit-test-runner [ experimental: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>
