<!doctype html>
<title>DOMParser basic test of HTML parsing</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
// |expected| should be an object indicating the expected type of node.
function assert_node(actual, expected) {
    assert_true(actual instanceof expected.type,
                'Node type mismatch: actual = ' + actual.nodeType + ', expected = ' + expected.nodeType);
    if (typeof(expected.id) !== 'undefined')
        assert_equals(actual.id, expected.id, expected.idMessage);
    if (typeof(expected.nodeValue) !== 'undefined')
        assert_equals(actual.nodeValue, expected.nodeValue, expected.nodeValueMessage);
}

var doc;
setup(function() {
    var parser = new DOMParser();
    var input = '<html id="root"><head></head><body></body></html>';
    doc = parser.parseFromString(input, 'text/html');
});

test(function() {
    var root = doc.documentElement;
    assert_node(root, { type: HTMLHtmlElement, id: 'root',
                        idMessage: 'documentElement id attribute should be root.' });
}, 'Parsing of id attribute');

test(function() {
    assert_equals(doc.contentType, "text/html")
}, 'contentType');

test(function() {
    assert_equals(doc.characterSet, "UTF-8")
}, 'characterSet');

test(function() {
    assert_equals(doc.inputEncoding, "UTF-8")
}, 'inputEncoding');

test(function() {
    assert_equals(doc.charset, "UTF-8")
}, 'charset');

test(function() {
    var url = document.URL;
    assert_equals(doc.documentURI, url,
                  'The document must have a URL value equal to the URL of the active document.');
    assert_equals(doc.URL, url,
                  'The document must have a URL value equal to the URL of the active document.');
}, 'URL value');

test(function() {
    assert_equals(doc.location, null,
                  'The document must have a location value of null.');
}, 'Location value');

test(function() {
    var soup = "<!DOCTYPE foo></><foo></multiple></>";
    var htmldoc = new DOMParser().parseFromString(soup, "text/html");
    assert_equals(htmldoc.documentElement.localName, "html");
    assert_equals(htmldoc.documentElement.namespaceURI, "http://www.w3.org/1999/xhtml");
}, "DOMParser parses HTML tag soup with no problems");
</script>
