<!DOCTYPE html>
<html>
  <head>
    <title>EventSource: reconnection</title>
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
  </head>
  <body>
    <div id="log"></div>
    <script>
      function doReconn(url, title) {
        var test = async_test(document.title + " " + title)
        test.step(function() {
          var source = new EventSource(url)
          source.onmessage = test.step_func(function(e) {
            assert_equals(e.data, "data")
            source.close()
            test.done()
          })
        })
      }

      doReconn("resources/status-reconnect.py?status=200",
        "200")


      var t = async_test(document.title + ", test reconnection events", { timeout: 9000 });
      t.step(function() {
        var opened = false, reconnected = false,
            source = new EventSource("resources/status-reconnect.py?status=200&ok_first&id=2");

        source.onerror = t.step_func(function(e) {
          assert_equals(e.type, 'error');
          assert_equals(source.readyState, source.CONNECTING, "readyState");
          assert_true(opened, "connection is opened earlier");

          reconnected = true;
        });

        source.onmessage = t.step_func(function(e) {
          if (!opened) {
            opened = true;
            assert_false(reconnected, "have reconnected before first message");
            assert_equals(e.data, "ok");
          }
          else {
            assert_true(reconnected, "Got reconnection event");
            assert_equals(e.data, "data");
            source.close()
            t.done()
          }
        });
      });

    </script>
  </body>
</html>

