<script>

function test() {
    if (window.layoutTestController)
        layoutTestController.dumpAsText();

    var undefined;

    var features = [
        ["Core", undefined],
        ["HTML", undefined],
        ["XML", undefined],
        ["Views", undefined],
        ["StyleSheets", undefined],
        ["CSS", undefined],
        ["CSS2", undefined],
        ["CSS3", undefined],
        ["Events", undefined],
        ["UIEvents", undefined],
        ["MouseEvents", undefined],
        ["HTMLEvents", undefined],
        ["MutationEvents", undefined],
        ["Range", undefined],
        ["Traversal", undefined],

        ["Core", null],
        ["HTML", null],
        ["XML", null],
        ["Views", null],
        ["StyleSheets", null],
        ["CSS", null],
        ["CSS2", null],
        ["CSS3", null],
        ["Events", null],
        ["UIEvents", null],
        ["MouseEvents", null],
        ["HTMLEvents", null],
        ["MutationEvents", null],
        ["Range", null],
        ["Traversal", null],

        ["Core", ""],
        ["HTML", ""],
        ["XML", ""],
        ["Views", ""],
        ["StyleSheets", ""],
        ["CSS", ""],
        ["CSS2", ""],
        ["CSS3", ""],
        ["Events", ""],
        ["UIEvents", ""],
        ["MouseEvents", ""],
        ["HTMLEvents", ""],
        ["MutationEvents", ""],
        ["Range", ""],
        ["Traversal", ""],

        ["Core", "1.0"],
        ["HTML", "1.0"],
        ["XML", "1.0"],
        ["Views", "1.0"],
        ["StyleSheets", "1.0"],
        ["CSS", "1.0"],
        ["CSS2", "1.0"],
        ["CSS3", "1.0"],
        ["Events", "1.0"],
        ["UIEvents", "1.0"],
        ["MouseEvents", "1.0"],
        ["HTMLEvents", "1.0"],
        ["MutationEvents", "1.0"],
        ["Range", "1.0"],
        ["Traversal", "1.0"],

        ["Core", "2.0"],
        ["HTML", "2.0"],
        ["XML", "2.0"],
        ["Views", "2.0"],
        ["StyleSheets", "2.0"],
        ["CSS", "2.0"],
        ["CSS2", "2.0"],
        ["CSS3", "2.0"],
        ["Events", "2.0"],
        ["UIEvents", "2.0"],
        ["MouseEvents", "2.0"],
        ["HTMLEvents", "2.0"],
        ["MutationEvents", "2.0"],
        ["Range", "2.0"],
        ["Traversal", "2.0"],

        ["Core", "3.0"],
        ["HTML", "3.0"],
        ["XML", "3.0"],
        ["Views", "3.0"],
        ["StyleSheets", "3.0"],
        ["CSS", "3.0"],
        ["CSS2", "3.0"],
        ["CSS3", "3.0"],
        ["Events", "3.0"],
        ["UIEvents", "3.0"],
        ["MouseEvents", "3.0"],
        ["HTMLEvents", "3.0"],
        ["MutationEvents", "3.0"],
        ["Range", "3.0"],
        ["Traversal", "3.0"],

        ["Core", "nonsense"],
        ["HTML", "nonsense"],
        ["XML", "nonsense"],
        ["Views", "nonsense"],
        ["StyleSheets", "nonsense"],
        ["CSS", "nonsense"],
        ["CSS2", "nonsense"],
        ["CSS3", "nonsense"],
        ["Events", "nonsense"],
        ["UIEvents", "nonsense"],
        ["MouseEvents", "nonsense"],
        ["HTMLEvents", "nonsense"],
        ["MutationEvents", "nonsense"],
        ["Range", "nonsense"],
        ["Traversal", "nonsense"],

        [undefined, ""],
        [undefined, "1.0"],
        [undefined, "2.0"],
        [undefined, "3.0"],
        [undefined, "nonsense"],
        [undefined, undefined],
        [undefined, null],

        [null, ""],
        [null, "1.0"],
        [null, "2.0"],
        [null, "3.0"],
        [null, "nonsense"],
        [null, undefined],
        [null, null],

        ["nonsense", ""],
        ["nonsense", "1.0"],
        ["nonsense", "2.0"],
        ["nonsense", "3.0"],
        ["nonsense", "nonsense"],
        ["nonsense", undefined],
        ["nonsense", null],
    ];

    for (var i = 0; i < features.length; ++i)
    {
        var item = features[i];
        if (item[1] == "omitted") {
            var hasFeature = document.implementation.hasFeature(item[0]);
            var isSupported = document.body.isSupported(item[0]);
        } else {
            var hasFeature = document.implementation.hasFeature(item[0], item[1]);
            var isSupported = document.body.isSupported(item[0], item[1]);
        }

        var item0String = item[0];
        if (typeof item0String == "string")
            item0String = '"' + item0String + '"';
        var item1String = item[1];
        if (typeof item1String == "string" && item[1] != "omitted")
            item1String = '"' + item1String + '"';
        var message = item0String + ', ' + item1String + ': ' + hasFeature + ', ' + isSupported;

        var div = document.createElement('div');
        div.innerHTML = message;
        document.body.appendChild(div);
    }
}

</script>

<body onload="test()">
</body>
