<!DOCTYPE html>
<html>
<head>
<title>HTML Templates: The template contents is a DocumentFragment</title>
<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru">
<meta name="assert" content="The template contents must be a DocumentFragment">
<link rel="help" href="http://www.w3.org/TR/2013/WD-html-templates-20130214/#definitions">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src='/html/resources/common.js'></script>
<link rel="stylesheet" href="/resources/testharness.css">
</head>
<body>
<div id="log"></div>
<script type="text/javascript">


test(function() {
    var doc = newHTMLDocument();
    var template = doc.createElement('template');

    doc.body.appendChild(template);

    assert_equals(template.content.nodeType, Node.DOCUMENT_FRAGMENT_NODE,
            'Template content should be a DocumentFragment');

    assert_class_string(template.content, 'DocumentFragment',
            'Template content class should be a DocumentFragment');

}, 'The template contents must be a DocumentFragment (empty template)');


test(function() {
    var doc = newHTMLDocument();
    var template = doc.createElement('template');

    template.innerHTML = '<div>This is a div</div><span>This is a span</span>';

    doc.body.appendChild(template);

    assert_equals(template.content.nodeType, Node.DOCUMENT_FRAGMENT_NODE,
            'Template content should be a DocumentFragment');

    assert_class_string(template.content, 'DocumentFragment',
            'Template content class should be a DocumentFragment');

}, 'The template contents must be a DocumentFragment (non empty template)');



test(function() {
    var doc = newHTMLDocument();
    var template = doc.createElement('template');

    template.innerHTML = '<div>This is a div</div>';

    doc.body.appendChild(template);

    assert_equals(template.content.nodeType, Node.DOCUMENT_FRAGMENT_NODE,
            'Template content should be a documentFragment');

}, 'The template contents must be a DocumentFragment (non empty template '
        + 'containing div which is an Element instance)');


test(function() {
    var doc = newHTMLDocument();
    var template = doc.createElement('template');

    template.innerHTML = 'Some text';

    doc.body.appendChild(template);

    assert_equals(template.content.nodeType, Node.DOCUMENT_FRAGMENT_NODE,
            'Template content should be a documentFragment');

    assert_class_string(template.content, 'DocumentFragment',
            'Template content class should be a DocumentFragment');

}, 'The template contents must be a DocumentFragment (not empty template '
        + 'containing text node)');


test(function() {
    var doc = newHTMLDocument();
    var template = doc.createElement('template');

    template.innerHTML = '<template id="t2">Some text</template>';

    doc.body.appendChild(template);

    assert_equals(template.content.nodeType, Node.DOCUMENT_FRAGMENT_NODE,
            'Template content should be a documentFragment');
    assert_class_string(template.content, 'DocumentFragment',
            'Template content class should be a DocumentFragment');

    var nestedTemplate = template.content.querySelector("#t2");
    assert_equals(nestedTemplate.content.nodeType, Node.DOCUMENT_FRAGMENT_NODE,
            'Nested template content should be a documentFragment');

    assert_class_string(nestedTemplate.content, 'DocumentFragment',
            'Nested template content class should be a DocumentFragment');


}, 'The template contents must be a DocumentFragment (nested template '
        + 'containing a text node)');


testInIFrame('../resources/template-contents-empty.html', function(context) {
    var doc = context.iframes[0].contentDocument;

    var template = doc.querySelector('template');

    assert_equals(template.content.nodeType, Node.DOCUMENT_FRAGMENT_NODE,
            'Template content should be a documentFragment');
    assert_class_string(template.content, 'DocumentFragment',
            'Template content class should be a DocumentFragment');


}, 'The template contents must be a DocumentFragment (the empty template tag '
        + 'inside HTML file loaded in iframe)');


testInIFrame('../resources/template-contents.html', function(context) {
    var doc = context.iframes[0].contentDocument;

    var template = doc.querySelector('template');

    assert_equals(template.content.nodeType, Node.DOCUMENT_FRAGMENT_NODE,
            'Template content should be a documentFragment');
    assert_class_string(template.content, 'DocumentFragment',
            'Template content class should be a DocumentFragment');

}, 'The template contents must be a DocumentFragment (non empty template '
        + 'tag inside HTML file loaded in iframe)');


testInIFrame('../resources/template-contents-text.html', function(context) {
    var doc = context.iframes[0].contentDocument;

    var template = doc.querySelector('template');

    assert_equals(template.content.nodeType, Node.DOCUMENT_FRAGMENT_NODE,
            'Template content should be a documentFragment');
    assert_class_string(template.content, 'DocumentFragment',
            'Template content class should be a DocumentFragment');

}, 'The template contents must be a DocumentFragment (the template tag '
        + 'with some text inside HTML file loaded in iframe)');


testInIFrame('../resources/template-contents-nested.html', function(context) {
    var doc = context.iframes[0].contentDocument;

    var template = doc.querySelector('template');

    assert_equals(template.content.nodeType, Node.DOCUMENT_FRAGMENT_NODE,
            'Template content should be a documentFragment');
    assert_class_string(template.content, 'DocumentFragment',
            'Template content class should be a DocumentFragment');

    var nestedTemplate = template.content.querySelector("template");

    assert_equals(nestedTemplate.content.nodeType, Node.DOCUMENT_FRAGMENT_NODE,
            'Nested template content should be a documentFragment');
    assert_class_string(nestedTemplate.content, 'DocumentFragment',
            'Nested template content class should be a DocumentFragment');

}, 'The template contents must be a DocumentFragment (the template tag '
        + 'with nested template tag inside HTML file loaded in iframe)');
</script>
</body>
</html>
