<!DOCTYPE html>
<html>
<body>
<p>This tests removing an iframe with a custom element inside a callback. WebKit should not hit assertions.<br>
WebKit should not hit any assertions.</p>
<script>

customElements.define('test-element', class extends HTMLElement {
    disconnectedCallback() { }
    attributeChangedCallback(name, oldValue, newValue) {
        if (newValue != 'bar')
            return;
        removeIframe();
        GCController.collect();
    }
    static get observedAttributes() { return ['id']; }
});

function insertIframe() {
    let iframe = document.createElement('iframe');
    document.body.appendChild(iframe);
    let container = document.createElement('div');
    container.innerHTML = '<test-element></test-element><test-element id="foo"></test-element>';
    iframe.contentDocument.body.appendChild(container);
}

function removeIframe() {
    document.querySelector('iframe').remove();
}

if (!window.GCController)
    document.write('This test requires GCController');
else {
    testRunner.dumpAsText();
    insertIframe();
    document.createElement('test-element').id = 'bar';
    document.write(`<p>PASS. WebKit did not hit any assertions.</p>`);
}

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