<!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>
