<!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: Non-element node cannot be a shadow host</title>
<link rel="author" title="Aleksei Yu. Semenov" href="mailto:sgrekhov@unipro.ru">
<link rel="author" title="Mikhail Fursov" href="mailto:mfursov@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/#partial-element-methods">
<meta name="assert" content="Nodes, that are not elements, are not allowed to become shadow hosts.">
<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>
var XHTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';

function createTextNode() {
    var doc = document.implementation.createHTMLDocument('Test Document');
    var node = doc.createTextNode('Text Node');
    doc.body.appendChild(node);
    return node;
}

function createCommentNode() {
    var doc = document.implementation.createHTMLDocument('Test Document');
    var node = doc.createComment('Comment Node');
    doc.body.appendChild(node);
    return node;
}

function createCDATASectionNode() {
    var doc = document.implementation.createDocument(XHTML_NAMESPACE, 'html');
    var node = doc.createCDATASection('CDATA Section Node');
    doc.documentElement.appendChild(node);
    return node;
}

function createAttributeNode() {
    var doc = document.implementation.createDocument(XHTML_NAMESPACE, 'html');
    var node = doc.createAttribute('attribute-node');
    doc.documentElement.setAttributeNode(node);
    return node;
}

function createDocumentFragmentNode() {
    var doc = document.implementation.createDocument(XHTML_NAMESPACE, 'html');
    var node = doc.createDocumentFragment();
    doc.documentElement.appendChild(node);
    return node;
}

function createProcessingInstructionNode() {
    var doc = document.implementation.createDocument(XHTML_NAMESPACE, 'html');
    var node = doc.createProcessingInstruction('processing-instruction-node', '');
    doc.documentElement.appendChild(node);
    return node;
}

function createDocumentNode() {
    return document.implementation.createDocument(XHTML_NAMESPACE, 'html');
}

var factories = [
    ['a text node', createTextNode],
    ['a comment node', createCommentNode],
    ['a CDATA section node', createCDATASectionNode],
    ['an attribute node', createAttributeNode],
    ['a document fragment node', createDocumentFragmentNode],
    ['a processing instruction node', createProcessingInstructionNode],
    ['a document node', createDocumentNode]
];

// Non-element nodes should not have createShadowRoot() method.
var noCreateShadowRootTestParameters = factories.map(
    function (nameAndFactory) {
        var name = nameAndFactory[0];
        var factory = nameAndFactory[1];
        return [
            'Checks whether ' + name + ' does not have createShadowRoot() ' +
                'method.',
            factory
        ];
    });

function testNoCreateShadowRoot(factory) {
    var node = factory();
    assert_equals(node.createShadowRoot, undefined);
}

generate_tests(testNoCreateShadowRoot, noCreateShadowRootTestParameters);
</script>
</body>
</html>
