<!DOCTYPE html>
<html>
<head>
<title>HTML Templates: Parsing XHTML: Node's node document</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="Parsing XHTML: Node's node document must be set to that of the element to which it will be appended">
<link rel="help" href="http://www.w3.org/TR/2013/WD-html-templates-20130214/#parsing-xhtml-documents">
<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 = newXHTMLDocument();
    doc.body = doc.createElement('body');
    doc.body.innerHTML = '<template id="tmpl"></template>';

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

    assert_not_equals(template, null, 'Template element should not be null');
    assert_not_equals(template.content, undefined,
            'Content attribute of template element should not be undefined');
    assert_not_equals(template.content, null,
            'Content attribute of template element should not be null');

    assert_equals(template.ownerDocument, doc.body.ownerDocument,
            'Wrong template node owner document');
    assert_equals(template.content.ownerDocument, doc,
            'Wrong template content owner document');

}, 'Parsing XHTML: Node\'s node document must be set to that of the element '
    + 'to which it will be appended. Test empty template');



test(function() {
    var doc = newXHTMLDocument();

    doc.body = doc.createElement('body');
    doc.body.innerHTML = '<template id="tmpl"><div>Div content</div></template>';

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

    assert_equals(template.ownerDocument, doc.body.ownerDocument,
            'Wrong template node owner document');

    assert_not_equals(template, null, 'Template element should not be null');
    assert_not_equals(template.content, undefined,
            'Content attribute of template element should not be undefined');
    assert_not_equals(template.content, null,
            'Content attribute of template element should not be null');

    var div = template.content.querySelector('div');
    assert_equals(template.content.ownerDocument, div.ownerDocument,
            'Wrong DIV node owner document');

}, 'Parsing XHTML: Node\'s node document must be set to that of the element '
    + 'to which it will be appended. Test not empty template');



test(function() {
    var doc = newXHTMLDocument();
    doc.body = doc.createElement('body');
    doc.body.innerHTML = ''
            + '<template id="tmpl"><div>Div content</div> And some more text'
            + '<template id="tmpl2"><div>Template content</div></template>'
            + '</template>';

    var template = doc.querySelector('#tmpl');
    assert_not_equals(template, null, 'Template element should not be null');
    assert_equals(template.ownerDocument, doc, 'Wrong template node owner document');
    assert_not_equals(template.content, undefined,
            'Content attribute of template element should not be undefined');
    assert_not_equals(template.content, null,
            'Content attribute of template element should not be null');

    var nestedTemplate = template.content.querySelector('#tmpl2');
    assert_not_equals(nestedTemplate, null, 'Nested template element should not be null');
    assert_not_equals(nestedTemplate.content, undefined,
            'Content attribute of nested template element should not be undefined');
    assert_not_equals(nestedTemplate.content, null,
            'Content attribute of nested template element should not be null');

    assert_equals(nestedTemplate.ownerDocument, template.content.ownerDocument,
            'Wrong nested template node owner document');


    var div = nestedTemplate.content.querySelector('div');
    assert_equals(nestedTemplate.content.ownerDocument, div.ownerDocument,
            'Wrong DIV node owner document');

}, 'Parsing XHTML: Node\'s node document must be set to that of the element '
    + 'to which it will be appended. Test nested templates');



testInIFrame('../resources/template-child-nodes-div.xhtml', function(context) {
    var doc = context.iframes[0].contentDocument;

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

    assert_equals(template.ownerDocument, doc, 'Wrong template node owner document');

    assert_not_equals(template.content, undefined,
            'Content attribute of template element should not be undefined');
    assert_not_equals(template.content, null,
            'Content attribute of template element should not be null');

    var div = template.content.querySelector('div');
    assert_equals(template.content.ownerDocument, div.ownerDocument,
            'Wrong DIV node owner document');

}, 'Parsing XHTML: Node\'s node document must be set to that of the element '
    + 'to which it will be appended. Test loading XHTML document from a file');



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

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

    assert_equals(template.ownerDocument, doc, 'Wrong template node owner document');

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

    assert_equals(nestedTemplate.ownerDocument, template.content.ownerDocument,
            'Wrong template node owner document');

    var div = nestedTemplate.content.querySelector('div');
    assert_equals(nestedTemplate.content.ownerDocument, div.ownerDocument,
            'Wrong DIV node owner document');

}, 'Parsing XHTML: Node\'s node document must be set to that of the element '
    + 'to which it will be appended. Test loading of XHTML document '
    + 'with nested templates from a file');

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