<script>
function log(msg)
{
    document.getElementById('log').appendChild(document.createTextNode(msg + '\n'));
}

function appendChildText(node, text)
{
    if (node.canHaveChildren == null || node.canHaveChildren) {
        node.appendChild(document.createTextNode(text));
    } else {
        // IE doesn't allow script nodes to have children. We must use the
        // .text property instead.
        node.text = text;
    }
}

function createScriptElement(type, language)
{
    var script = document.createElement('script');

    var typeStr;
    if (type == null) {
        typeStr = 'unspecified';
    } else {
        typeStr = '\\"' + type + '\\"';
        script.setAttribute('type', type);
    }

    var languageStr;
    if (language == null) {
        languageStr = 'unspecified';
    } else {
        languageStr = '\\"' + language + '\\"';
        script.setAttribute('language', language);
    }

    var text = 'log("Type: ' + typeStr + ', Language: ' + languageStr + '");';
    appendChildText(script, text);

    return script;
}

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

    var types = [
        null,
        "",
        "text/javascript",
        "text/ecmascript",
        "application/javascript",
        "application/ecmascript",
        "application/x-javascript",
        "text/javascript1.0",
        "text/javascript1.1",
        "text/javascript1.2",
        "text/javascript1.3",
        "text/javascript1.4",
        "text/javascript1.5",
        "text/javascript1.6",
        "text/javascript1.7",
        "text/javascript1.8",
        "text/javascript1.9",
        "text/jscript",
        "text/livescript",
        "text/x-ebayScript",
        "  text/javascript",
        "text/javascript  ",
        "  text/javascript  ",
        "    ",
        "abcdefg"
    ];

    var languages = [
        "",
        "javascript",
        "javascript1.0",
        "javascript1.1",
        "javascript1.2",
        "javascript1.3",
        "javascript1.4",
        "javascript1.5",
        "javascript1.6",
        "javascript1.7",
        "javascript1.8",
        "javascript1.9",
        "ecmascript",
        "livescript",
        "jscript",
        "ebayScript",
        "    ",
        "  javascript",
        "javascript  ",
        "  javascript  ",
        "abcdefg"
    ];

    for (var i = 0; i < types.length; ++i)
        document.body.appendChild(createScriptElement(types[i], null));

    for (var i = 0; i < languages.length; ++i)
        document.body.appendChild(createScriptElement(null, languages[i]));

    for (var i = 0; i < languages.length; ++i)
        document.body.appendChild(createScriptElement("", languages[i]));

    log('When a type is specified, the language attribute should be ignored.');
    for (var i = 0; i < languages.length; ++i)
        document.body.appendChild(createScriptElement("text/javascript", languages[i]));
}
</script>
<body onload="test();">
    <p>This page tests the allowed values for the type and language attributes
    of the &lt;script&gt; tag. Below you will see the allowed values.</p>

    <pre id="log"></pre>
</body>
