<!DOCTYPE html>
<html>
<head>
<script src="../../../resources/js-test-pre.js"></script>
<script src="resources/shadow-dom.js"></script>
</head>
<body>
<script>
description("Tests for content element's getDistributedNodes().");

document.body.appendChild(
    createDOM('div', {},
              createDOM('div', {'id': 'host-1'},
                        createShadowRoot(
                            createDOM('content', {'id': 'content-1'})),
                        createDOM('div', {'id': 'child-1'})),
              createDOM('div', {'id': 'host-2'},
                        createShadowRoot(
                            createDOM('content', {'id': 'content-2'}),
                            createDOM('div', {'id': 'host-3'},
                                      createShadowRoot(
                                          createDOM('content', {'id': 'content-3'})),
                                      createDOM('div', {'id': 'child-3'}))),
                        createDOM('div', {'id': 'child-2'}))));


var content1 = getNodeInShadowTreeStack('host-1/content-1');
var content2 = getNodeInShadowTreeStack('host-2/content-2');
var content3 = getNodeInShadowTreeStack('host-2/host-3/content-3');

var child1 = getNodeInShadowTreeStack('child-1');
var child2 = getNodeInShadowTreeStack('child-2');
var child3 = getNodeInShadowTreeStack('host-2/child-3');

var distributedNodes1 = content1.getDistributedNodes();
var distributedNodes2 = content2.getDistributedNodes();
var distributedNodes3 = content3.getDistributedNodes();

function assertNodeList(nodeList, expectedNodes)
{
    window.nodeList = nodeList;
    window.expectedNodes = expectedNodes;
    shouldBe("nodeList.length", "expectedNodes.length");
    for (var i = 0; i < nodeList.length; ++i) {
      shouldBe("nodeList.item(" + i + ")", "expectedNodes[" + i + "]");
    }
}

assertNodeList(distributedNodes1, [child1]);
assertNodeList(distributedNodes2, [child2]);
assertNodeList(distributedNodes3, [child3]);

debug('Verify that getDistributedNodes() returns a static NodeList.');
document.getElementById('host-1').innerHTML = '';
assertNodeList(distributedNodes1, [child1]);
assertNodeList(content1.getDistributedNodes(), []);

</script>
<script src="../../../resources/js-test-post.js"></script>
</body>
</html>
