<html>
<head>
    <script language='javascript'>
    function runTest()
    {
        if (window.testRunner)
            testRunner.dumpAsText();
        var sheets = document.styleSheets;
        if (sheets.length == 11) {
            for (i = 0; i < sheets.length; i++) {
                if (sheets[i].cssRules.length != 1
                    || sheets[i].cssRules[0].type != CSSRule.STYLE_RULE
                    || sheets[i].cssRules[0].style.getPropertyCSSValue("background-image") == null) {
                    return;
                }
            }
            document.getElementById('result').innerHTML = 'SUCCESS';
        }
    }
    </script>
    <link media="all" href="resources/background_image.css" rel="stylesheet">
    <link media="aural" href="resources/background_image.css" rel="stylesheet">
    <link media="braille" href="resources/background_image.css" rel="stylesheet">
    <link media="embossed" href="resources/background_image.css" rel="stylesheet">
    <link media="handheld" href="resources/background_image.css" rel="stylesheet">
    <link media="print" href="resources/background_image.css" rel="stylesheet">
    <link media="projection" href="resources/background_image.css" rel="stylesheet">
    <link media="screen" href="resources/background_image.css" rel="stylesheet">
    <link media="tty" href="resources/background_image.css" rel="stylesheet">
    <link media="tv" href="resources/background_image.css" rel="stylesheet">
    <link media="invalid" href="resources/background_image.css" rel="stylesheet">
</head>
<body onload="runTest()">
<p>Test that the styleSheet collection contains all sheets referenced through the &lt;link&gt; elements. See bug #22429.</p>
<div id="result">FAILURE</div>
</body>
</html>
