<!--
onconnect = function(e) {
try {
  var port = e.ports[0]
  var url = decodeURIComponent(location.hash.substr(1))
  var source = new EventSource(url)
  source.onerror = function(e) {
    port.postMessage([true, this.readyState, 'data' in e])
    this.close();
  }
} catch(e) {
  port.postMessage([false, String(e)])
}
}
/*-->
<!DOCTYPE html>
<html>
  <head>
    <title>shared worker - EventSource: constructor (act as if there is a network error)</title>
    <meta name=timeout content=long>
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
  </head>
  <body>
    <div id="log"></div>
    <script>
      function fetchFail(url) {
        var test = async_test(document.title + " (" + url + ")", { timeout: 20000 })
        test.step(function() {
          var worker = new SharedWorker('#'+encodeURIComponent(url))
          worker.port.onmessage = function(e) {
            test.step(function() {
              assert_true(e.data[0], e.data[1])
              assert_equals(e.data[1], EventSource.CLOSED, 'source.readyState')
              assert_false(e.data[2], "'data' in e");
            })
            test.done()
          }
        })
      }
      fetchFail("http://example.not")
      fetchFail("https://example.not/test")
      fetchFail("ftp://example.not")
      fetchFail("about:blank")
      fetchFail("mailto:whatwg@awesome.example")
      fetchFail("javascript:alert('FAIL')")
    </script>
    <!-- This tests "fails the connection" as well as making sure a simple
         event is dispatched and not a MessageEvent -->
  </body>
</html>
<!--*/ //-->
