<!DOCTYPE html>
<html>
<head>
<title>HTML Templates: innerHTML of template element replaces all referenced by the content attribute</title>
<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru">
<meta name="author" title="Aleksei Yu. Semenov" href="a.semenov@unipro.ru">
<meta name="assert" content="innerHTML of template element replaces all referenced by the content attribute">
<link rel="help" href="http://www.w3.org/TR/2013/WD-html-templates-20130214/#innerhtml-on-templates">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src='/html/resources/common.js'></script>
</head>
<body>
<div id="log"></div>
<script type="text/javascript">

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

    var div1 = doc.createElement('div');
    div1.setAttribute('id', 'div1');
    template.content.appendChild(div1);

    assert_not_equals(template.content.querySelector('#div1'), null,
            'Element should present in template content');

    template.innerHTML = '<div id="div2"></div>';

    assert_equals(template.content.querySelector('#div1'), null,
            'Template content should be replaced by innerHTML');
    assert_not_equals(template.content.querySelector('#div2'), null,
            'Element should present in template content');

}, 'innerHTML of template element replaces all referenced by the content attribute');



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

    template.content.appendChild(nestedTemplate);

    var div1 = doc.createElement('div');
    div1.setAttribute('id', 'div1');
    nestedTemplate.content.appendChild(div1);

    assert_not_equals(nestedTemplate.content.querySelector('#div1'), null,
            'Element should present in template content');

    nestedTemplate.innerHTML = '<div id="div2"></div>';

    assert_equals(nestedTemplate.content.querySelector('#div1'), null,
            'Template content should be replaced by innerHTML');
    assert_not_equals(nestedTemplate.content.querySelector('#div2'), null,
            'Element should present in template content');

}, 'innerHTML of template element replaces all referenced by the content attribute. '
    + 'Test nested template');


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

    var template = doc.querySelector('template');
    assert_not_equals(template.content.querySelector('div'), null,
           'Div element should present in template content');

    template.innerHTML = '<span>span internals</span>';

    assert_equals(template.content.querySelector('div'), null,
           'div element should be replaced by span in template content');

    assert_not_equals(template.content.querySelector('span'), null,
           'span element should present in template content');


}, 'innerHTML of template element replaces all referenced by the content attribute. '
    + 'Test loading of HTML document from a file');


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