| // window.stop() below prevents the load event from firing, so wait until it is |
| // fired to start the test. |
| setup({explicit_done: true }); |
| |
| onload = () => { |
| async_test(function(t) { |
| const client = new XMLHttpRequest(); |
| |
| const result = []; |
| const expected = [ |
| 'readystatechange', 0, 1, // open() |
| ]; |
| |
| let state = 0; |
| |
| client.onreadystatechange = t.step_func(() => { |
| result.push('readystatechange', state, client.readyState); |
| }); |
| client.onabort = t.unreached_func("abort should not be fired after window.stop() and open()"); |
| client.onloadend = t.unreached_func("loadend should not be fired after window.stop() and open()"); |
| |
| client.open("GET", "resources/well-formed.xml"); |
| assert_equals(client.readyState, 1); |
| |
| state = 1; |
| client.send(null); |
| state = 2; |
| window.stop(); |
| // Unlike client.abort(), window.stop() does not change readyState |
| // immediately, rather through a task... |
| assert_equals(client.readyState, 1); |
| state = 3; |
| // ... which is then canceled when we open a new request anyway. |
| client.open("GET", "resources/well-formed.xml"); |
| assert_equals(client.readyState, 1); |
| assert_array_equals(result, expected); |
| |
| // Give the abort and loadend events a chance to fire (erroneously) before |
| // calling this a success. |
| t.step_timeout(t.step_func_done(), 1000); |
| }, "open() after window.stop()"); |
| done(); |
| }; |