<!DOCTYPE html>
<!--
Distributed under both the W3C Test Suite License [1] and the W3C
3-clause BSD License [2]. To contribute to a W3C Test Suite, see the
policies and contribution forms [3].

[1] http://www.w3.org/Consortium/Legal/2008/04-testsuite-license
[2] http://www.w3.org/Consortium/Legal/2008/03-bsd-license
[3] http://www.w3.org/2004/10/27-testcases
-->
<html>
<head>
<title>Shadow DOM Test: Upper-boundary encapsulation: document's Selector APIs</title>
<link rel="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru">
<link rel="author" title="Yuta Kitamura" href="mailto:yutak@google.com">
<link rel="help" href="http://www.w3.org/TR/2013/WD-shadow-dom-20130514/#upper-boundary-encapsulation">
<meta name="assert" content="Upper-boundary encapsulation: Nodes in a shadow tree must not be accessible through selector APIs of owner document.">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../../testcommon.js"></script>
<link rel="stylesheet" href="/resources/testharness.css">
</head>
<body>
<div id="log"></div>
<script>
// Return a document containing the structure below:
//
// <body> - - - - - {shadow-root}
//   |                    |
//   |                    +-- <p class="test-class" id="test-id">
//   |
//   +-- <p class="test-class" id="test-id">
function createTestDocument() {
    var doc = document.implementation.createHTMLDocument('Test');
    var pHost = doc.createElement('p');
    pHost.className = 'test-class';
    pHost.id = 'test-id';
    doc.body.appendChild(pHost);
    var shadowRoot = doc.body.createShadowRoot();
    var pShadow = doc.createElement('p');
    pShadow.className = 'test-class';
    pShadow.id = 'test-id';
    shadowRoot.appendChild(pShadow);
    return {
        doc: doc,
        pHost: pHost,
        pShadow: pShadow
    };
}

test(function () {
    var documentObject = createTestDocument();
    var doc = documentObject.doc;
    var pHost = documentObject.pHost;
    assert_equals(doc.querySelector('p'), pHost);
    assert_equals(doc.querySelector('.test-class'), pHost);
    assert_equals(doc.querySelector('#test-id'), pHost);
},
    'Elements in a shadow tree should not be accessible from ' +
    'owner document\'s querySelector() method.'
);

function assert_singleton_node_list(nodeList, expectedNode) {
    assert_equals(nodeList.length, 1);
    assert_equals(nodeList[0], expectedNode);
}

test(function () {
    var documentObject = createTestDocument();
    var doc = documentObject.doc;
    var pHost = documentObject.pHost;
    assert_singleton_node_list(doc.querySelectorAll('p'), pHost);
    assert_singleton_node_list(doc.querySelectorAll('.test-class'), pHost);
    assert_singleton_node_list(doc.querySelectorAll('#test-id'), pHost);
},
    'Elements in a shadow tree should not be accessible from ' +
    'owner document\'s querySelectorAll() method.'
);
</script>
</body>
</html>
