<!DOCTYPE html>
<html>
<head>
    <script src="../js/resources/js-test-pre.js"></script>
    <script>
        description('This tests the XMLHttpRequest responseXML loading an HTML document in Strict Mode with responseType "document".');

        window.jsTestIsAsync = true;
        var xhr = new XMLHttpRequest(),
            url = window.location.href,
            children;
        xhr.onload = function() {
            shouldBeNonNull('xhr.responseXML');
            shouldBeTrue('xhr.responseXML instanceof Document');

            debug('The two open &lt;br&gt; elements should be siblings of one another and not nested per HTML parser spec.');

            // Get the children of the body tag, using QSA to skip all text nodes.
            children = xhr.responseXML.querySelectorAll('body > *');

            // Test that the HTML parser was used by confirming the two BR tags are adjacent siblings
            // and not nested within one another, nor nesting the div#console node.
            // There should be 5 non-text children altogether.
            shouldEvaluateTo('children.length', 5);
            shouldBeEqualToString('children[0].tagName', 'DIV');
            shouldBeEqualToString('children[0].id', 'description');
            shouldBeEqualToString('children[1].tagName', 'BR');
            shouldBeEqualToString('children[2].tagName', 'BR');
            shouldBeEqualToString('children[3].tagName', 'DIV');
            shouldBeEqualToString('children[3].id', 'console');
            shouldBeEqualToString('children[4].tagName', 'SCRIPT');

            // Make sure the first BR tag doesn't have an "id" set, which will prove
            // the first script in this document was not executed.
            shouldNotBe('children[1].id', '"break-tag"');

            // The parsed HTML document in responseXML should be the same compatMode as this document.
            // This document is in strict mode due to the HTML5 DOCTYPE being present.
            shouldBeEqualToString('xhr.responseXML.compatMode', 'CSS1Compat');
            shouldBeEqualToString('xhr.responseXML.compatMode', document.compatMode);

            finishJSTest();
        };
        xhr.onerror = function() {
            testFailed('The XHR request to an existing resource failed: "' + url + '"');
            finishJSTest();
        };
        xhr.open('GET', url);
        xhr.responseType = 'document';
        xhr.send(null);
    </script>
    <script src="../js/resources/js-test-post.js"></script>
</head>
<body>
    <div id="description"></div>

    <!-- Leave these break tags malformed/open to test HTML parsing.
         They should be siblings to div#description, and not nested within one another.
         The XMLDocument parser would treat the second <br> as a child to the first. -->
    <br><br>

    <div id="console"></div>

    <script>
        // This code will manipulate the first BR node by adding an "id" to it.
        // This same BR will be inspected after XHR loads the document to see
        // if this script executed or not.  If it didn't execute, the first BR
        // will not have an "id" specified and the test passes.
        var br = document.querySelector('div#description + br');
        br.id = 'break-tag';
    </script>
</body>
</html>
