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