<!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: Window object named properties: Frames</title>
<link rel="author" title="Aleksei Yu. Semenov" href="mailto:a.semenov@unipro.ru">
<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: The nodes and named elements are not accessible from Window object named properties.">
<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>
test(function () {
    var host = document.createElement('div');
    try {
        host.style.display = 'none';
        document.body.appendChild(host);
        var shadowRoot = host.createShadowRoot();
        var iframe = document.createElement('iframe');
        iframe.style.display = 'none';
        iframe.name = 'test-name';
        shadowRoot.appendChild(iframe);
        assert_false('test-name' in window);
    } finally {
        if (host.parentNode)
            host.parentNode.removeChild(host);
    }
},
    'An iframe element in a shadow tree should not be accessible from ' +
    'window\'s named properties with its "name" attribute value.'
);

var frameTest = async_test(
    'A frame element in a shadow tree should not be accessible from ' +
    'window\'s named properties with its "name" attribute value.');

frameTest.step(function () {
    // To test a document with frames, an iframe containing frames is created.
    var srcdoc = [
        '<!DOCTYPE html>',
        '<html>',
        '<head>',
        '<title>Frames Test</title>',
        '<script src="../../testcommon.js"><' + '/script>',
        '</head>',
        '<frameset id="host" cols="50%,*">',
        '<frame src="about:blank" name="host-frame1">',
        '<frame src="about:blank" name="host-frame2">',
        '</frameset>',
        '</html>'
    ].join('\n');
    var iframe = document.createElement('iframe');
    iframe.srcdoc = srcdoc;
    iframe.style.display = 'none';

    iframe.addEventListener('load', frameTest.step_func(function (event) {
        try {
            var doc = iframe.contentDocument;
            var win = iframe.contentWindow;
            var shadowRoot = doc.getElementById('host').createShadowRoot();
            shadowRoot.innerHTML =
                '<frame src="about:blank" name="shadow-frame1">\n' +
                '<frame src="about:blank" name="shadow-frame2">';
            assert_false('shadow-frame1' in win);
            assert_false('shadow-frame2' in win);
            frameTest.done();
        } finally {
            if (iframe.parentNode)
                iframe.parentNode.removeChild(iframe);
        }
    }));

    document.body.appendChild(iframe);
});
</script>
</body>
</html>
