<!DOCTYPE html><!-- webkit-test-runner [ ResizeObserverEnabled=true ] -->
<html>
<head>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="../resources/gc.js"></script>
</head>
<body>
<div id="target1" style="width:100px;height:100px;">t1
</div>

<script>
function startTest() {

    // Delete the next observer.
    let notifiedObserver1 = false;
    let observer1 = new ResizeObserver( entries => {
        if (observer2) {
            observer2.disconnect();
            observer2 = null;
            gc();
        }
        notifiedObserver1 = true;
    });

    // Deleted before delivering.
    let observer2 = new ResizeObserver( entries => {
        assert_unreached("observer2 is deleted before notifying");
    } );

    // Delete the provious observer.
    let notifiedObserver3 = false;
    let observer3 = new ResizeObserver( entries => {
        if (observer1) {
            assert_true(notifiedObserver1, "observer1 is notified before observer3");
            observer1.disconnect();
            observer1 = null;
            gc();
        }
        notifiedObserver3 = true;
    });
    // observer4 should be notified.
    let observer4 = new ResizeObserver( entries => {
        assert_true(notifiedObserver3, "observer3 is notified before observer4");
        done();
    });

    let t1 = document.querySelector('#target1');
    observer1.observe(t1);
    observer2.observe(t1);
    observer3.observe(t1);
    observer4.observe(t1);
}

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

promise_test(async () => {
    return startTest();
}, 'Test deleting observer in callbacks');

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