<!--
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("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>
<!--*/ //-->
