<!DOCTYPE html>
<html>
<head>
<title>Custom Elements: disconnectedCallback</title>
<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
<meta name="assert" content="disconnectedCallback must be enqueued whenever custom element is removed from a document">
<link rel="help" href="https://w3c.github.io/webcomponents/spec/custom/#dfn-connected-callback">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="./resources/custom-elements-helpers.js"></script>
</head>
<body>
<div id="log"></div>
<script>

var calls = [];
class MyCustomElement extends HTMLElement {
    connectedCallback() { calls.push('connected', this); }
    disconnectedCallback() { calls.push('disconnected', this); }
}
customElements.define('my-custom-element', MyCustomElement);

document_types().forEach(function (entry) {
    var documentName = entry.name;
    var getDocument = entry.create;

    promise_test(function () {
        return getDocument().then(function (doc) {
            var instance = document.createElement('my-custom-element');
            doc.documentElement.appendChild(instance);
            calls = [];
            doc.documentElement.removeChild(instance);
            assert_array_equals(calls, ['disconnected', instance]);
        });
    }, 'Removing a custom element from ' + documentName + ' must enqueue and invoke disconnectedCallback');

    promise_test(function () {
        return getDocument().then(function (doc) {
            var instance = document.createElement('my-custom-element');
            var parent = document.createElement('div');
            parent.appendChild(instance);
            doc.documentElement.appendChild(parent);
            calls = [];
            doc.documentElement.removeChild(parent);
            assert_array_equals(calls, ['disconnected', instance]);
        });
    }, 'Removing an ancestor of custom element from ' + documentName + ' must enqueue and invoke disconnectedCallback');

    promise_test(function () {
        return getDocument().then(function (doc) {
            var instance = document.createElement('my-custom-element');
            var host = doc.createElementNS('http://www.w3.org/1999/xhtml', 'div');
            var shadowRoot = host.attachShadow({mode: 'closed'});
            doc.documentElement.appendChild(host);
            shadowRoot.appendChild(instance);

            calls = [];
            shadowRoot.removeChild(instance);
            assert_array_equals(calls, ['disconnected', instance]);
        });
    }, 'Removing a custom element from a shadow tree in ' + documentName + ' must enqueue and invoke disconnectedCallback');

    promise_test(function () {
        return getDocument().then(function (doc) {
            var instance = document.createElement('my-custom-element');
            var host = doc.createElementNS('http://www.w3.org/1999/xhtml', 'div');
            var shadowRoot = host.attachShadow({mode: 'closed'});
            shadowRoot.appendChild(instance);
            doc.documentElement.appendChild(host);

            calls = [];
            doc.documentElement.removeChild(host);
            assert_array_equals(calls, ['disconnected', instance]);
        });
    }, 'Removing the shadow host of a custom element from a' + documentName + ' must enqueue and invoke disconnectedCallback');

    promise_test(function () {
        return getDocument().then(function (doc) {
            var instance = document.createElement('my-custom-element');
            var host = doc.createElementNS('http://www.w3.org/1999/xhtml', 'div');
            var shadowRoot = host.attachShadow({mode: 'closed'});
            shadowRoot.appendChild(instance);

            calls = [];
            shadowRoot.removeChild(instance);
            assert_array_equals(calls, []);
        });
    }, 'Removing a custom element from a detached shadow tree that belongs to ' + documentName + ' must not enqueue and invoke disconnectedCallback');
});

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