Index: LayoutTests/http/tests/xmlhttprequest/abort-after-send.html |
diff --git a/LayoutTests/http/tests/xmlhttprequest/abort-after-send.html b/LayoutTests/http/tests/xmlhttprequest/abort-after-send.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..fdc33464ebb22d2b93c7fdf801e2964c7aa2ab4e |
--- /dev/null |
+++ b/LayoutTests/http/tests/xmlhttprequest/abort-after-send.html |
@@ -0,0 +1,83 @@ |
+<!doctype html> |
+<html> |
+<head> |
+<title>XMLHttpRequest: abort() while sending data</title> |
+<script src="../resources/testharness.js"></script> |
+<script src="../resources/testharnessreport.js"></script> |
+</head> |
+<body> |
+Correct progress event sequencing on abort(), <a href="http://crbug.com/315488">bug 315488</a>. |
+<script> |
+// Based on http://w3c-test.org/web-platform-tests/master/XMLHttpRequest/abort-during-upload.htm |
+ |
+var expected = [ |
+ 'upload', 'progress', |
+ 'upload', 'abort', |
+ 'upload', 'loadend', |
+ 'load', 'progress', |
+ 'load', 'abort', |
+ 'load', 'loadend']; |
+ |
+var result = []; |
+function recordEvent(e) { |
+ var kind = e.target instanceof XMLHttpRequest ? 'load' : 'upload'; |
+ result.push(kind, e.type); |
+} |
+ |
+var abortAfterSendLoadend = async_test("Progress event delivery on abort(), post-send() (async)"); |
+abortAfterSendLoadend.step(function() { |
+ var xhr = new XMLHttpRequest(); |
+ xhr.open("POST", "resources/delay.php?iteration=1&delay=1000"); |
+ xhr.onprogress = recordEvent; |
+ xhr.onabort = recordEvent; |
+ xhr.onloadend = abortAfterSendLoadend.step_func(function (e) { |
+ recordEvent(e); |
+ assert_equals(xhr.readyState, XMLHttpRequest.DONE); |
+ assert_array_equals(result, expected); |
+ // Runs after abort()'s transition of readyState to UNSENT. |
+ setTimeout(abortAfterSendLoadend.step_func(function () { |
+ assert_equals(xhr.readyState, XMLHttpRequest.UNSENT); |
+ abortAfterSendLoadend.done(); |
+ }), 0); |
+ }); |
+ xhr.upload.onprogress = recordEvent; |
+ xhr.upload.onabort = recordEvent; |
+ xhr.upload.onloadend = recordEvent; |
+ |
+ xhr.send(); |
+ xhr.abort(); |
+}); |
+ |
+var resultSync = []; |
+function recordEventSync(e) { |
+ var kind = e.target instanceof XMLHttpRequest ? 'load' : 'upload'; |
+ resultSync.push(kind, e.type); |
+} |
+var abortAfterSendSync = async_test("Progress event delivery on abort(), post-send() (sync)"); |
+abortAfterSendSync.step(function() { |
+ var xhr = new XMLHttpRequest(); |
+ xhr.open("POST", "resources/delay.php?iteration=1&delay=10"); |
+ xhr.onreadystatechange = function () { |
+ if (xhr.readyState > XMLHttpRequest.OPENED && xhr.readyState != XMLHttpRequest.DONE) |
+ xhr.abort(); |
+ }; |
+ xhr.onprogress = recordEventSync; |
+ xhr.onabort = recordEventSync; |
+ xhr.onloadend = abortAfterSendSync.step_func(function (e) { |
+ recordEventSync(e); |
+ assert_equals(xhr.readyState, XMLHttpRequest.DONE); |
+ assert_array_equals(resultSync, expected); |
+ // Runs after abort()'s transition of readyState to UNSENT. |
+ setTimeout(abortAfterSendSync.step_func(function () { |
+ assert_equals(xhr.readyState, XMLHttpRequest.UNSENT); |
+ abortAfterSendSync.done(); |
+ }), 0); |
+ }); |
+ xhr.upload.onprogress = recordEventSync; |
+ xhr.upload.onabort = recordEventSync; |
+ xhr.upload.onloadend = recordEventSync; |
+ xhr.send(); |
+}); |
+</script> |
+</body> |
+</html> |