<!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");
      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>

