<!DOCTYPE html>
<html>
<head>
<title>Custom Elements: adoptedCallback</title>
<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
<meta name="assert" content="adoptedCallback must be enqueued whenever custom element is adopted into a new 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'); }
    adoptedCallback(oldDocument, newDocument) { calls.push('adopted'); calls.push(oldDocument); calls.push(newDocument); }
    disconnectedCallback() { calls.push('disconnected'); }
}
customElements.define('my-custom-element', MyCustomElement);

test(function () {
    var instance = document.createElement('my-custom-element');
    calls = [];
    document.body.appendChild(instance);
    assert_array_equals(calls, ['connected']);
}, 'Inserting a custom element into the owner document must not enqueue and invoke adoptedCallback');

document_types().forEach(function (entry) {
    if (entry.isOwner)
        return;

    var documentName = entry.name;
    var getDocument = entry.create;

    promise_test(function () {
        return getDocument().then(function (doc) {
            var instance = document.createElement('my-custom-element');
            calls = [];
            doc.documentElement.appendChild(instance);
            assert_array_equals(calls, ['adopted', document, doc, 'connected']);
        });
    }, 'Inserting a custom element into ' + documentName + ' must enqueue and invoke adoptedCallback');

    promise_test(function () {
        return getDocument().then(function (doc) {
            var instance = document.createElement('my-custom-element');
            document.body.appendChild(instance);
            calls = [];
            doc.documentElement.appendChild(instance);
            assert_array_equals(calls, ['disconnected', 'adopted', document, doc, 'connected']);
        });
    }, 'Moving a custom element from the owner document into ' + documentName + ' must enqueue and invoke adoptedCallback');

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

    promise_test(function () {
        return getDocument().then(function (doc) {
            var instance = document.createElement('my-custom-element');
            var parent = document.createElement('div');
            parent.appendChild(instance);
            document.body.appendChild(parent);
            calls = [];
            doc.documentElement.appendChild(parent);
            assert_array_equals(calls, ['disconnected', 'adopted', document, doc, 'connected']);
        });
    }, 'Moving an ancestor of custom element from the owner document into ' + documentName + ' must enqueue and invoke adoptedCallback');

    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);

            calls = [];
            shadowRoot.appendChild(instance);
            assert_array_equals(calls, ['adopted', document, doc, 'connected']);
        });
    }, 'Inserting a custom element into a shadow tree in ' + documentName + ' must enqueue and invoke adoptedCallback');

    promise_test(function () {
        return getDocument().then(function (doc) {
            var instance = document.createElement('my-custom-element');
            var host = document.createElement('div');
            var shadowRoot = host.attachShadow({mode: 'closed'});
            shadowRoot.appendChild(instance);

            calls = [];
            doc.documentElement.appendChild(host);
            assert_array_equals(calls, ['adopted', document, doc, 'connected']);
        });
    }, 'Inserting the shadow host of a custom element into ' + documentName + ' must enqueue and invoke adoptedCallback');

    promise_test(function () {
        return getDocument().then(function (doc) {
            var instance = document.createElement('my-custom-element');
            var host = document.createElement('div');
            var shadowRoot = host.attachShadow({mode: 'closed'});
            shadowRoot.appendChild(instance);
            document.body.appendChild(host);

            calls = [];
            doc.documentElement.appendChild(host);
            assert_array_equals(calls, ['disconnected', 'adopted', document, doc, 'connected']);
        });
    }, 'Moving the shadow host of a custom element from the owner document into ' + documentName + ' must enqueue and invoke adoptedCallback');

    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'});

            calls = [];
            shadowRoot.appendChild(instance);
            assert_array_equals(calls, ['adopted', document, doc]);
        });
    }, 'Inserting a custom element into a detached shadow tree that belongs to ' + documentName + ' must enqueue and invoke adoptedCallback');
});

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