Index: third_party/WebKit/LayoutTests/http/tests/xmlhttprequest/simple-cross-origin-progress-events.html |
diff --git a/third_party/WebKit/LayoutTests/http/tests/xmlhttprequest/simple-cross-origin-progress-events.html b/third_party/WebKit/LayoutTests/http/tests/xmlhttprequest/simple-cross-origin-progress-events.html |
index 4735be930570526bc560c4b9b8168c1613d7e224..a0cbadf0a7c5bf2868794acdbb7415740aa8a4e5 100644 |
--- a/third_party/WebKit/LayoutTests/http/tests/xmlhttprequest/simple-cross-origin-progress-events.html |
+++ b/third_party/WebKit/LayoutTests/http/tests/xmlhttprequest/simple-cross-origin-progress-events.html |
@@ -1,127 +1,167 @@ |
<!doctype html> |
-<html> |
-<body> |
-<p>Test that upload progress events are not dispatched for simple cross-origin requests |
-(i.e. if the listener is set after calling send(), and there are no other reasons to make a preflight request).</p> |
-<pre id="console"></pre> |
+<script src="/resources/testharness.js"></script> |
+<script src="/resources/testharnessreport.js"></script> |
<script> |
-if (window.testRunner) { |
- testRunner.dumpAsText(); |
- testRunner.waitUntilDone(); |
-} |
- |
-function log(message) |
-{ |
- document.getElementById('console').appendChild(document.createTextNode(message + '\n')); |
-} |
- |
-var sawProgress; |
-var sawUploadProgress; |
- |
-function progress(evt) |
-{ |
- if (!sawProgress) |
- log("onprogress"); |
- sawProgress = true; |
-} |
- |
-function allowedUploadProgress() |
-{ |
- if (sawUploadProgress) |
- return; |
- |
- sawUploadProgress = true; |
- log("upload.onprogress"); |
-} |
- |
-function notAllowedUploadProgress() |
-{ |
- if (sawUploadProgress) |
- return; |
- |
- sawUploadProgress = true; |
- log("FAIL: upload.onprogress"); |
-} |
+// A simple cross-origin request means a cross-origin request with only |
+// CORS-safelisted method and request-headers. |
// Build a long string. |
var stringToSend = "a"; |
for (var i = 0; i < 23; ++i) |
- stringToSend += stringToSend; |
- |
-function test1() |
-{ |
- sawProgress = false; |
- sawUploadProgress = false; |
- |
- log("Test 1: The URL is allowed for cross-origin requests"); |
- |
- var xhr = new XMLHttpRequest(); |
- xhr.onprogress = progress; |
- xhr.open("POST", "http://localhost:8000/xmlhttprequest/resources/cross-site-progress-events.cgi?allow", true); |
- xhr.setRequestHeader("Content-Type", "text/plain"); |
- xhr.send(stringToSend); |
- xhr.upload.onloadstart = function() { log("FAIL: upload.onloadstart"); }; |
- xhr.upload.onprogress = notAllowedUploadProgress; |
- xhr.upload.onload = function() { log("FAIL: upload.onload"); }; |
- xhr.upload.onerror = function() { log("FAIL: upload.onerror"); }; |
- xhr.onerror = function() { log("onerror") }; |
- xhr.onload = function() { |
- log("onload"); |
- log("Response length: " + xhr.responseText.length); |
- test2(); |
- }; |
-} |
- |
-function test2() |
-{ |
- sawProgress = false; |
- sawUploadProgress = false; |
- |
- log("\nTest 2: The URL is not allowed for cross-origin requests"); |
- |
- var xhr = new XMLHttpRequest(); |
- xhr.onprogress = progress; |
- xhr.open("POST", "http://localhost:8000/xmlhttprequest/resources/cross-site-progress-events.cgi", true); |
- xhr.setRequestHeader("Content-Type", "text/plain"); |
- xhr.send(stringToSend); |
- xhr.upload.onloadstart = function() { log("FAIL: upload.onloadstart"); }; |
- xhr.upload.onprogress = notAllowedUploadProgress; |
- xhr.upload.onload = function() { log("FAIL: upload.onload"); }; |
- xhr.upload.onerror = function() { log("FAIL: upload.onerror"); }; |
- xhr.onload = function() { log("onload"); }; |
- xhr.onerror = function() { |
- log("onerror (expected)"); |
- log("Response length: " + xhr.responseText.length); |
- test3(); |
- }; |
-} |
- |
-function test3() |
-{ |
- sawProgress = false; |
- sawUploadProgress = false; |
- |
- log("\nTest 3: The URL is not allowed for cross-origin requests and at least one upload event is listened for before doing the send."); |
- |
- var xhr = new XMLHttpRequest(); |
- xhr.onprogress = progress; |
- xhr.open("POST", "http://localhost:8000/xmlhttprequest/resources/cross-site-progress-events.cgi", true); |
- xhr.setRequestHeader("Content-Type", "text/plain"); |
- xhr.upload.onloadstart = function() { log("upload.onloadstart"); }; |
- xhr.send(stringToSend); |
- xhr.upload.onprogress = allowedUploadProgress; |
- xhr.upload.onload = function() { log("FAIL: upload.onload"); }; |
- xhr.upload.onerror = function() { log("upload.onerror (expected)"); }; |
- xhr.onload = function() { log("onload"); } |
- xhr.onerror = function() { |
- log("onerror (expected)"); |
- log("Response length: " + xhr.responseText.length); |
- if (window.testRunner) |
- testRunner.notifyDone(); |
- }; |
-} |
- |
-test1(); |
+ stringToSend += stringToSend; |
+ |
+async_test(test => { |
+ const xhr = new XMLHttpRequest(); |
+ let onprogressCalled; |
+ xhr.onprogress = test.step_func(() => { |
+ onprogressCalled = true; |
+ }); |
+ xhr.onload = test.step_func(() => { |
+ assert_true(onprogressCalled, 'onprogress is called'); |
+ |
+ assert_equals(xhr.responseText.length, 2 ** 23, 'responseText.length'); |
+ |
+ test.done(); |
+ }); |
+ xhr.onerror = test.step_func(() => { |
+ assert_unreached('Unexpected onerror call'); |
+ }); |
+ |
+ xhr.open("POST", "http://localhost:8000/xmlhttprequest/resources/cross-site-progress-events.cgi?allow", true); |
+ xhr.setRequestHeader("Content-Type", "text/plain"); |
+ xhr.send(stringToSend); |
+ |
+ // Set handlers after send() |
+ const upload = xhr.upload; |
+ upload.onloadstart = test.step_func(() => { |
+ assert_unreached('Unexpected upload.onloadstart call'); |
+ }); |
+ upload.onprogress = test.step_func(() => { |
+ assert_unreached('Unexpected upload.onprogress call'); |
+ }); |
+ upload.onload = test.step_func(() => { |
+ assert_unreached('Unexpected upload.onload call'); |
+ }); |
+ upload.onerror = test.step_func(() => { |
+ assert_unreached('Unexpected upload.onerror call'); |
+ }); |
+}, 'Upload progress events should not be dispatched for a simple cross-origin request when no handler is set before send() even if the response includes the Access-Control-Allow-Origin header'); |
+ |
+async_test(test => { |
+ const xhr = new XMLHttpRequest(); |
+ |
+ let onprogressCalled; |
+ xhr.onprogress = test.step_func(() => { |
+ onprogressCalled = true; |
+ }); |
+ xhr.onload = test.step_func(() => { |
+ assert_true(onprogressCalled, 'onprogress is called'); |
+ |
+ assert_equals(xhr.responseText.length, 2 ** 23, 'responseText.length'); |
+ |
+ test.done(); |
+ }); |
+ xhr.onerror = test.step_func(() => { |
+ assert_unreached('Unexpected onerror call'); |
+ }); |
+ |
+ xhr.open("POST", "http://localhost:8000/xmlhttprequest/resources/cross-site-progress-events.cgi?allow", true); |
+ xhr.setRequestHeader("Content-Type", "text/plain"); |
+ xhr.send(stringToSend); |
+ |
+ // Set handlers after send() |
+ const upload = xhr.upload; |
+ upload.onloadstart = test.step_func(() => { |
+ assert_unreached('Unexpected upload.onloadstart call'); |
+ }); |
+ upload.onprogress = test.step_func(() => { |
+ assert_unreached('Unexpected upload.onprogress call'); |
+ }); |
+ upload.onload = test.step_func(() => { |
+ assert_unreached('Unexpected upload.onload call'); |
+ }); |
+ upload.onerror = test.step_func(() => { |
+ assert_unreached('Unexpected upload.onerror call'); |
+ }); |
+}, 'Upload progress events should be dispatched for a simple cross-origin request'); |
+ |
+async_test(test => { |
+ const xhr = new XMLHttpRequest(); |
+ let onprogressCalled; |
+ xhr.onprogress = test.step_func(() => { |
+ onprogressCalled = true; |
+ }); |
+ xhr.open("POST", "http://localhost:8000/xmlhttprequest/resources/cross-site-progress-events.cgi", true); |
+ xhr.setRequestHeader("Content-Type", "text/plain"); |
+ |
+ // Set one handler before send() |
+ const upload = xhr.upload; |
+ let uploadOnloadstartCalled; |
+ upload.onloadstart = test.step_func(() => { |
+ uploadOnloadstartCalled = true; |
+ }); |
+ xhr.onload = test.step_func(() => { |
+ assert_unreached('Unexpected onload call'); |
+ }); |
+ xhr.onerror = test.step_func(() => { |
+ // Since cross-site-progress-events.cgi doesn't accept OPTIONS requests, |
+ // the XHR should fail. |
+ |
+ assert_true(onprogressCalled, 'onprogress is called'); |
+ |
+ assert_true(uploadOnloadstartCalled, 'upload.onloadstart is called'); |
+ assert_true(uploadOnprogressCalled, 'upload.onprogress is called'); |
+ assert_true(uploadOnerrorCalled, 'upload.onerror is called'); |
+ |
+ assert_equals(xhr.responseText.length, 0, 'responseText.length'); |
+ |
+ test.done(); |
+ }); |
+ |
+ xhr.send(stringToSend); |
+ |
+ let uploadOnprogressCalled; |
+ upload.onprogress = test.step_func(() => { |
+ uploadOnprogressCalled = true; |
+ }); |
+ upload.onload = test.step_func(() => { |
+ assert_unreached('Unexpected upload.onload call'); |
+ }); |
+ let onerrorCalled; |
+ upload.onerror = test.step_func(() => { |
+ uploadOnerrorCalled = true; |
+ }); |
+}, 'Upload progress events should be dispatched for a simple cross-origin request when at least one handler is set before send()'); |
+ |
+async_test(test => { |
+ const xhr = new XMLHttpRequest(); |
+ let onprogressCalled; |
+ xhr.onprogress = test.step_func(() => { |
+ onprogressCalled = true; |
+ }); |
+ xhr.onload = test.step_func(() => { |
+ assert_true(onprogressCalled, 'onprogress is called'); |
+ |
+ assert_true(uploadOnprogressCalled, 'upload.onprogress is called'); |
+ assert_true(uploadOnloadCalled, 'upload.onload is called'); |
+ |
+ test.done(); |
+ }); |
+ |
+ // Set handlers after send() |
+ const upload = xhr.upload; |
+ let uploadOnprogressCalled; |
+ upload.onprogress = test.step_func(() => { |
+ uploadOnprogressCalled = true; |
+ }); |
+ let onloadCalled; |
+ upload.onload = test.step_func(() => { |
+ uploadOnloadCalled = true; |
+ }); |
+ |
+ // Use the script which responds to OPTIONS requests. |
+ xhr.open("POST", "http://localhost:8000/xmlhttprequest/resources/access-control-basic-allow-no-credentials.cgi", true); |
+ xhr.setRequestHeader("Content-Type", "text/plain"); |
+ xhr.send(stringToSend); |
+}, 'Upload progress events should be dispatched for a simple cross-origin request'); |
</script> |
-</body> |
-</html> |