| // META: script=../../../constants.sub.js |
| // META: variant=?default |
| // META: variant=?wpt_flags=h2 |
| // META: variant=?wss |
| |
| async_test(t => { |
| const ws = new WebSocket(SCHEME_DOMAIN_PORT + '/handshake_sleep_2'); |
| let closeMethodReturned = false; |
| let errorEventSeen = false; |
| let closeEventSeen = false; |
| ws.onerror = t.step_func(() => { |
| assert_true(closeMethodReturned, 'ws.close() should have returned'); |
| assert_false(errorEventSeen, 'error event should only fire once'); |
| errorEventSeen = true; |
| assert_false(closeEventSeen, 'error event should come before close event'); |
| }); |
| ws.onclose = t.step_func_done(() => { |
| assert_true(closeMethodReturned, 'ws.close() should have returned'); |
| assert_true(errorEventSeen, 'error event should have fired'); |
| assert_false(closeEventSeen, 'close event should only fire once'); |
| closeEventSeen = true; |
| assert_equals(ws.readyState, WebSocket.CLOSED, |
| 'readyState should be CLOSED'); |
| }); |
| assert_equals(ws.readyState, WebSocket.CONNECTING, |
| 'readyState should be CONNECTING'); |
| ws.close(); |
| closeMethodReturned = true; |
| assert_equals(ws.readyState, WebSocket.CLOSING, |
| 'readyState should be CLOSING'); |
| }, 'close event should be fired asynchronously when WebSocket is connecting'); |