<!DOCTYPE html>
<html>
<head>
<title>Shadow DOM: Slotable interface</title>
<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
<meta name="assert" content="Element and Text interfaces must implement Slotable interface">
<link rel="help" href="https://dom.spec.whatwg.org/#slotable">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
</head>
<body>
<div id="log"></div>
<script>

test(function () {
    assert_true('assignedSlot' in Element.prototype, 'assignedSlot must be defined on Element.prototype');
    assert_true('assignedSlot' in document.createElement('div'), 'assignedSlot must be defined on a div element');

    assert_true('assignedSlot' in Text.prototype, 'assignedSlot must be defined on Text.prototype');
    assert_true('assignedSlot' in document.createTextNode(''), 'assignedSlot must be defined on a text node');
    assert_false('assignedSlot' in document.createComment(''), 'assignedSlot must not be defined on a comment node');
    assert_false('assignedSlot' in document.createProcessingInstruction('target', 'data'), 'assignedSlot must not be defined on a processing instruction node');

}, 'assignedSlot attribute must be defined on Element and Text interfaces');

test(function () {
    assert_equals(document.createElement('div').assignedSlot, null, 'assignedSlot must be null when the element is not in any tree');

    var shadowHost = document.createElement('div');
    var shadowRoot = shadowHost.attachShadow({mode: 'open'});

    var childElement = document.createElement('b');
    shadowHost.appendChild(childElement);
    assert_equals(childElement.assignedSlot, null, 'assignedSlot on an element must be null when a node is not assigned of any slot');

    var childTextNode = document.createTextNode('');
    shadowHost.appendChild(childTextNode);
    assert_equals(childTextNode.assignedSlot, null, 'assignedSlot on a text node must be null when a node is not assigned of any slot');

    var slot = document.createElement('slot');
    slot.name = 'foo';
    shadowRoot.appendChild(slot);
    assert_equals(childElement.assignedSlot, null, 'assignedSlot on an element must be null when a node does not match any slot');
    assert_equals(childTextNode.assignedSlot, null, 'assignedSlot on a text node must be null when a node does not match any slot');

}, 'assignedSlot must return null when the node does not have an assigned node');

test(function () {
    var shadowHost = document.createElement('div');
    var childElement = document.createElement('b');
    shadowHost.appendChild(childElement);

    var childTextNode = document.createTextNode('');
    shadowHost.appendChild(childTextNode);

    var shadowRoot = shadowHost.attachShadow({mode: 'open'});
    var slot = document.createElement('slot');
    shadowRoot.appendChild(slot);

    assert_equals(childElement.assignedSlot, slot, 'assignedSlot on an element must return the assigned default slot element');
    assert_equals(childTextNode.assignedSlot, slot, 'assignedSlot on a text node must return the assigned default slot element');

    slot.name = 'foo';
    assert_equals(childElement.assignedSlot, null, 'assignedSlot on an element must null when the element is unassigned from a slot element');
    assert_equals(childTextNode.assignedSlot, null, 'assignedSlot on a text node must null when the node is unassigned from a slot element');

    childElement.slot = 'foo';
    assert_equals(childElement.assignedSlot, slot, 'assignedSlot on an element must return the re-assigned slot element');

    slot.removeAttribute('name');
    assert_equals(childTextNode.assignedSlot, slot, 'assignedSlot on a text node must return the re-assigned slot element');

}, 'assignedSlot must return the assigned slot');

test(function () {
    var shadowHost = document.createElement('div');
    var childElement = document.createElement('b');
    shadowHost.appendChild(childElement);

    var childTextNode = document.createTextNode('');
    shadowHost.appendChild(childTextNode);

    var shadowRoot = shadowHost.attachShadow({mode: 'closed'});
    var slot = document.createElement('slot');
    shadowRoot.appendChild(slot);

    assert_equals(childElement.assignedSlot, null, 'assignedSlot on an element must return null if the slot is inside a closed shadow tree.');
    assert_equals(childTextNode.assignedSlot, null, 'assignedSlot on a text node must return null if the slot is inside a closed shadow tree.');

}, 'assignedSlot must return null when the assigned slot element is inside a closed shadow tree');

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