<html>
<head>
<title>getPropertyValue should be case insensitive</title>
<script>
        function log(msg)
        {
            var console = document.getElementById('console');
            console.appendChild(document.createTextNode(msg + "\n"));
        }

        function test()
        {
            var test;
            var lowerValue, upperValue;

            if (window.testRunner)
                testRunner.dumpAsText();

            test = document.getElementById('test');
            lowerValue = document.defaultView.getComputedStyle(test, "").getPropertyValue("width");
            upperValue = document.defaultView.getComputedStyle(test, "").getPropertyValue("WIDTH");
            log("getPropertyValue: " + (lowerValue === upperValue ? "PASS" : "FAIL"));
            
            test.style.setProperty("color", "#ff0000", null);
            test.style.setProperty("COLOR", "#00cc00", null);
            lowerValue = document.defaultView.getComputedStyle(test, "").getPropertyValue("color");
            log("setProperty: " + (lowerValue == "rgb(0, 204, 0)" ? "PASS" : "FAIL"));
            
            test.style.setProperty("font-weight", "bold", null);
            test.style.removeProperty("FONT-WEIGHT");
            lowerValue = document.defaultView.getComputedStyle(test, "").getPropertyValue("font-weight");
            log("removeProperty: " + (lowerValue == "normal" ? "PASS" : "FAIL"));
        }
    </script>
</head>
<body onload="test();">
<p>Property names retrieved by getPropertyValue, setProperty, removeProperty and others must be treated as case insensitive. This test ensures that they are.</p>
<p>References</p>
<ul>
<li><a href="http://bugs.webkit.org/show_bug.cgi?id=14645">http://bugs.webkit.org/show_bug.cgi?id=14645</a></li>
<li><a href="http://www.w3.org/TR/CSS1#forward-compatible-parsing">http://www.w3.org/TR/CSS1#forward-compatible-parsing</a></li>
</ul>
<p id="test">This paragraph should be green, and not bold when the test completes.</p>
<pre id='console'></pre>
</body>
</html>
