<html>
<!-- 
    Note the lack of doctype above: That is intentional. This test
    MUST be in quirks mode to have any real testing power.
-->
<head>
<title>Same-origin CSS in quirks mode</title>

<script>
// Prune memory cache to make sure we don't use a cached parsed stylesheet, in which case
// the console warning would not be shown and the test would be flaky.
internals.pruneMemoryCacheToSize(0);
</script>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>

<link rel="stylesheet"
      href="/resources/redirect.php?url=/security/resources/xorigincss1.html"></link>
<link rel="stylesheet"
      type="text/css"
      href="/resources/redirect.php?url=/security/resources/xorigincss2.html"></link>
<link rel="stylesheet"
      href="/resources/redirect.php?url=/security/resources/xorigincss1.css"></link>
<link rel="stylesheet"
      href="resources/xorigincss3.html"></link>
<style>
/* Deliberately reuse the same file / class / id on this first one */
@import "/resources/redirect.php?url=/security/resources/xorigincss2.html";
@import "/resources/redirect.php?url=/security/resources/xorigincss4.html";
@import "/resources/redirect.php?url=/security/resources/xorigincss2.css";
@import "resources/xorigincss5.html";

/* Check that data: is still allowed for non-CORS cross-origin image fetches. */
#data-background-url {
    content: "PASS (image loaded)";
    background: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='0px' height='0px'></svg>");
}
</style>
<script>
    function getBackgroundColorForId(id) {
        return window.getComputedStyle(document.getElementById(id), null).getPropertyValue('background-color')
    }
    var onloadTest = async_test("Testing same-origin and MIME behavior for CSS.");
    window.onload = function () {
        test(function () {
            assert_equals(getBackgroundColorForId('id1'), 'rgb(255, 255, 0)');
        }, 'xorigincss1.html should be loaded via &lt;link&gt;.');
        test(function () {
            assert_equals(getBackgroundColorForId('id2'), 'rgb(255, 255, 0)');
        }, 'xorigincss2.html should be loaded either via &lt;link&gt; or @import.');
        test(function () {
            assert_equals(getBackgroundColorForId('id3'), 'rgb(255, 255, 0)');
        }, 'xorigincss1.css should be loaded via &lt;link&gt;');
        test(function () {
            assert_equals(getBackgroundColorForId('id4'), 'rgb(255, 255, 0)');
        }, 'xorigincss3.html should be loaded');
        test(function () {
            assert_equals(getBackgroundColorForId('id5'), 'rgb(255, 255, 0)');
        }, 'xorigincss4.html should be loaded via @import.');
        test(function () {
            assert_equals(getBackgroundColorForId('id6'), 'rgb(255, 255, 0)');
        }, 'xorigincss2.css should be loaded.');
        test(function () {
            assert_equals(getBackgroundColorForId('id7'), 'rgb(255, 255, 0)');
        }, 'xorigincss5.html should be loaded.');
        onloadTest.done();
    };
</script>
</head>
<body>
    <div id="id1" class="id1"></div>
    <div id="id2" class="id2"></div>
    <div id="id3" class="id3"></div>
    <div id="id4" class="id4"></div>
    <div id="id5" class="id5"></div>
    <div id="id6" class="id6"></div>
    <div id="id7" class="id7"></div>
    <div id="id8" class="id8"></div>
    <div id="data-background-url">PASS background image loaded</div>
</body>
</html>
