<!doctype html>
<title>WebSockets: this, e.target, e.currentTarget, e.eventPhase</title>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src=../../../constants.js?pipe=sub></script>
<div id=log></div>
<script>
async_test(function(t) {
  var ws = new WebSocket(SCHEME_DOMAIN_PORT+'/echo_raw');
  ws.addEventListener('open', function(e) {
    var this_val = this;
    t.step(function() {
      // first a text frame, then a frame with reserved opcode 3
      // which should fail the connection
      ws.send('\\x81\\x04test\\x83\\x03LOL');
      assert_equals(this_val, ws);
      assert_equals(e.target, ws);
      assert_equals(e.currentTarget, ws);
      assert_equals(e.eventPhase, 2);
    });
  }, false);
  ws.addEventListener('message', function(e) {
    var this_val = this;
    t.step(function() {
      assert_equals(this_val, ws);
      assert_equals(e.target, ws);
      assert_equals(e.currentTarget, ws);
      assert_equals(e.eventPhase, 2);
    });
  }, false);
  ws.addEventListener('error', function(e) {
    var this_val = this;
    t.step(function() {
      assert_equals(this_val, ws);
      assert_equals(e.target, ws);
      assert_equals(e.currentTarget, ws);
      assert_equals(e.eventPhase, 2);
    });
  }, false);
  ws.addEventListener('close', function(e) {
    var this_val = this;
    t.step(function() {
      assert_equals(this_val, ws);
      assert_equals(e.target, ws);
      assert_equals(e.currentTarget, ws);
      assert_equals(e.eventPhase, 2);
      t.done();
    });
  }, false);
});
</script>
