<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.backgroundImage === "") {
                    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>
