<!DOCTYPE html>
<html>
<head>
<title>HTML Templates: Template element as a descendant of the body element.</title>
<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru">
<meta name="author" title="Aleksei Yu. Semenov" href="mailto:a.semenov@unipro.ru">
<meta name="assert" content="Template element can be a descendant of the body element">
<link rel="help" href="http://www.w3.org/TR/2013/WD-html-templates-20130214/#template-element">
<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">

function templateIsAChild(element) {
    element.innerHTML = '<template>some text</template>';

    assert_not_equals(element.querySelector('template'), null,
        'Template element should be a descendant of the ' + element.tagName + ' element');
}

function templateIsAnIndirectChild(element) {
    element.innerHTML = '<div><template>some text</template></div>';

    assert_not_equals(element.querySelector('template'), null,
        'Template element should be a descendant of the ' + element.tagName + ' element');
}

function templateIsAnAppendedChild(doc, element) {
    var template = doc.createElement('template');

    element.appendChild(template);

    assert_not_equals(element.querySelector('template'), null,
        'Template element should be a descendant of the ' + element.tagName + ' element');
}

function templateIsAnAppendedIndirectChild(doc, element) {
    var template = doc.createElement('template');
    var div = doc.createElement('div');
    div.appendChild(template);

    element.appendChild(div);

    assert_not_equals(element.querySelector('template'), null,
        'Template element should be a descendant of the ' + element.tagName + ' element');
}

var doc = newHTMLDocument();
var frameset = doc.createElement('frameset');

var parameters = [['Template element as a descendant of the BODY element. ' +
                   'Template element is created by innerHTML',
                   doc.body],
                  ['Template element as a descendant of the HEAD element. ' +
                   'Template element is created by innerHTML',
                   doc.head],
                   ['Template element as a descendant of the FRAMESET element. ' +
                    'Template element is created by innerHTML',
                    frameset]
                   ];
generate_tests(templateIsAChild, parameters,
        'Template element as a descendant of the HEAD, BODY and FRAMESET elements');



parameters = [['Template element as an indirect descendant of the BODY element. ' +
               'Template element is created by innerHTML',
               doc.body],
              ['Template element as an indirect descendant of the HEAD element. ' +
               'Template element is created by innerHTML',
               doc.head],
               ['Template element as an indirect descendant of the FRAMESET element. ' +
                'Template element is created by innerHTML',
                frameset]
               ];
generate_tests(templateIsAnIndirectChild, parameters,
        'Template element as an indirect descendant of the HEAD, BODY and FRAMESET elements');



parameters = [['Template element as a descendant of the BODY element. ' +
               'Template element is appended by appendChild()',
               doc, doc.body],
              ['Template element as a descendant of the HEAD element. ' +
               'Template element is appended by appendChild()',
               doc, doc.head],
               ['Template element as a descendant of the FRAMESET element. ' +
                'Template element is  appended by appendChild()',
                doc, frameset]
               ];
generate_tests(templateIsAnAppendedChild, parameters,
        'Template element as a descendant of the HEAD, BODY and FRAMESET elements');



parameters = [['Template element as an indirect descendant of the BODY element. ' +
               'Template element is appended by appendChild()',
               doc, doc.body],
              ['Template element as an indirect descendant of the HEAD element. ' +
               'Template element is appended by appendChild()',
               doc, doc.head],
               ['Template element as an indirect descendant of the FRAMESET element. ' +
                'Template element is  appended by appendChild()',
                doc, frameset]
               ];
generate_tests(templateIsAnAppendedIndirectChild, parameters,
        'Template element as a descendant of the HEAD, BODY and FRAMESET elements');

</script>
</body>
</html>
