<!-- quirks mode is important, text/css is already required otherwise -->
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<div id=log></div>
<script>
  var fails = [null, "", "x", "x/x", "text/html", "text/json"],
      passes = ["text/css", "text/css;charset=utf-8", "text/css;blah"]

  const get_url = (mime) => {
    let url = "resources/css.py"
    if (mime != null) {
        url += "?type=" + encodeURIComponent(mime)
    }
    return url
  }

  fails.forEach(function(mime) {
    async_test(function(t) {
      var link = document.createElement("link")
      link.rel = "stylesheet"
      link.onerror = t.step_func_done()
      link.onload = t.unreached_func("Unexpected load event")
      link.href = get_url(mime)
      document.body.appendChild(link)
    }, "URL query: " + mime)
  })

  fails.forEach(function(mime) {
    async_test(function(t) {
      var link = document.createElement("link")
      link.rel = "stylesheet"
      link.onerror = t.step_func_done()
      link.onload = t.unreached_func("Unexpected load event")
      link.href = get_url(mime)
      document.body.appendChild(link)
    }, "Revalidated URL query: " + mime)
  })

  passes.forEach(function(mime) {
    async_test(function(t) {
      var link = document.createElement("link")
      link.rel = "stylesheet"
      link.onerror = t.unreached_func("Unexpected error event")
      link.onload = t.step_func_done()
      link.href = get_url(mime)
      document.body.appendChild(link)
    }, "URL query: " + mime)
  })

  passes.forEach(function(mime) {
    async_test(function(t) {
      var link = document.createElement("link")
      link.rel = "stylesheet"
      link.onerror = t.unreached_func("Unexpected error event")
      link.onload = t.step_func_done()
      link.href = get_url(mime)
      document.body.appendChild(link)
    }, "Revalidated URL query: " + mime)
  })
</script>
