<!DOCTYPE html>
<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>
        function accessToObserverInCallback() {
            let test = async_test("test: Nodes inside callback should be garbage collected if no one refers to it");
            let initialNodesCount = internals.numberOfLiveNodes(document);
            const iterationCount = 50;
            let callbackCount = 0;
            for (let j = 0; j < iterationCount; ++j) {
                const div = document.createElement('div');
                container.appendChild(div);
                let observer = new IntersectionObserver(() => {
                    callbackCount++;
                    observer.disconnect();
                    container.removeChild(div);
                    if (callbackCount == iterationCount) {
                        window.requestAnimationFrame(() => {
                            gc();
                            test.step(() => {
                                let additionalNodesCount = internals.numberOfLiveNodes(document) - initialNodesCount;
                                assert_true(additionalNodesCount < iterationCount, 'Nodes inside callback should be collected.');
                                test.done();
                            });
                        });
                    }
                });
                observer.observe(div);
            }
        }

        window.onload = accessToObserverInCallback();
    </script>

</body>

</html>