<!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.baseURI, document.URL);
}, 'baseURI 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");

test(function() {
    assert_throws(new TypeError(), function() {
        new DOMParser().parseFromString("", "text/foo-this-is-invalid");
    })
}, "DOMParser throws on an invalid enum value")
</script>
