<script>

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

    var undefined;

    var features = [
        ["org.w3c.svg", "1.0"],
        ["org.w3c.svg.static", "1.0"],
        ["org.w3c.svg.animation", "1.0"],
        ["org.w3c.svg.dynamic", "1.0"],
        ["org.w3c.dom", "1.0"],
        ["org.w3c.dom.svg", "1.0"],
        ["org.w3c.dom.svg.static", "1.0"],
        ["org.w3c.dom.svg.animation", "1.0"],
        ["org.w3c.dom.svg.dynamic", "1.0"],
        ["org.w3c.svg.all", "1.0"],
        ["org.w3c.dom.svg.all", "1.0"],

        ["http://www.w3.org/TR/SVG11/feature#SVG", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#SVGDOM", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#SVG-static", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#SVGDOM-static", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#SVG-animation", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#SVGDOM-animation", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#SVG-dynamic", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#SVGDOM-dynamic", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#CoreAttribute", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#Structure", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#ContainerAttribute", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#ConditionalProcessing", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#Image", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#Style", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#ViewportAttribute", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#Shape", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#Text", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#BasicText", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#PaintAttribute", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#BasicPaintAttribute", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#OpacityAttribute", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#GraphicsAttribute", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#BaseGraphicsAttribute", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#Marker", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#ColorProfile", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#Gradient", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#Pattern", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#Clip", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#BasicClip", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#Mask", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#Filter", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#BasicFilter", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#DocumentEventsAttribute", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#GraphicalEventsAttribute", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#AnimationEventsAttribute", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#Cursor", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#Hyperlinking", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#XlinkAttribute", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#ExternalResourcesRequired", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#View", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#Script", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#Animation", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#Font", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#BasicFont", "1.1"],
        ["http://www.w3.org/TR/SVG11/feature#Extensibility", "1.1"]]

    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>
