OLD | NEW |
1 <!doctype html> | 1 <!doctype html> |
2 <html> | 2 <script src="/resources/testharness.js"></script> |
3 <body> | 3 <script src="/resources/testharnessreport.js"></script> |
4 <p>Test that upload progress events are not dispatched for simple cross-origin r
equests | |
5 (i.e. if the listener is set after calling send(), and there are no other reason
s to make a preflight request).</p> | |
6 <pre id="console"></pre> | |
7 <script> | 4 <script> |
8 if (window.testRunner) { | 5 // A simple cross-origin request means a cross-origin request with only |
9 testRunner.dumpAsText(); | 6 // CORS-safelisted method and request-headers. |
10 testRunner.waitUntilDone(); | |
11 } | |
12 | |
13 function log(message) | |
14 { | |
15 document.getElementById('console').appendChild(document.createTextNode(messa
ge + '\n')); | |
16 } | |
17 | |
18 var sawProgress; | |
19 var sawUploadProgress; | |
20 | |
21 function progress(evt) | |
22 { | |
23 if (!sawProgress) | |
24 log("onprogress"); | |
25 sawProgress = true; | |
26 } | |
27 | |
28 function allowedUploadProgress() | |
29 { | |
30 if (sawUploadProgress) | |
31 return; | |
32 | |
33 sawUploadProgress = true; | |
34 log("upload.onprogress"); | |
35 } | |
36 | |
37 function notAllowedUploadProgress() | |
38 { | |
39 if (sawUploadProgress) | |
40 return; | |
41 | |
42 sawUploadProgress = true; | |
43 log("FAIL: upload.onprogress"); | |
44 } | |
45 | 7 |
46 // Build a long string. | 8 // Build a long string. |
47 var stringToSend = "a"; | 9 var stringToSend = "a"; |
48 for (var i = 0; i < 23; ++i) | 10 for (var i = 0; i < 23; ++i) |
49 stringToSend += stringToSend; | 11 stringToSend += stringToSend; |
50 | 12 |
51 function test1() | 13 async_test(test => { |
52 { | 14 const xhr = new XMLHttpRequest(); |
53 sawProgress = false; | 15 let onprogressCalled; |
54 sawUploadProgress = false; | 16 xhr.onprogress = test.step_func(() => { |
| 17 onprogressCalled = true; |
| 18 }); |
| 19 xhr.onload = test.step_func(() => { |
| 20 assert_true(onprogressCalled, 'onprogress is called'); |
55 | 21 |
56 log("Test 1: The URL is allowed for cross-origin requests"); | 22 assert_equals(xhr.responseText.length, 2 ** 23, 'responseText.length'); |
57 | 23 |
58 var xhr = new XMLHttpRequest(); | 24 test.done(); |
59 xhr.onprogress = progress; | 25 }); |
60 xhr.open("POST", "http://localhost:8000/xmlhttprequest/resources/cross-site-
progress-events.cgi?allow", true); | 26 xhr.onerror = test.step_func(() => { |
61 xhr.setRequestHeader("Content-Type", "text/plain"); | 27 assert_unreached('Unexpected onerror call'); |
62 xhr.send(stringToSend); | 28 }); |
63 xhr.upload.onloadstart = function() { log("FAIL: upload.onloadstart"); }; | |
64 xhr.upload.onprogress = notAllowedUploadProgress; | |
65 xhr.upload.onload = function() { log("FAIL: upload.onload"); }; | |
66 xhr.upload.onerror = function() { log("FAIL: upload.onerror"); }; | |
67 xhr.onerror = function() { log("onerror") }; | |
68 xhr.onload = function() { | |
69 log("onload"); | |
70 log("Response length: " + xhr.responseText.length); | |
71 test2(); | |
72 }; | |
73 } | |
74 | 29 |
75 function test2() | 30 xhr.open("POST", "http://localhost:8000/xmlhttprequest/resources/cross-site-pr
ogress-events.cgi?allow", true); |
76 { | 31 xhr.setRequestHeader("Content-Type", "text/plain"); |
77 sawProgress = false; | 32 xhr.send(stringToSend); |
78 sawUploadProgress = false; | |
79 | 33 |
80 log("\nTest 2: The URL is not allowed for cross-origin requests"); | 34 // Set handlers after send() |
| 35 const upload = xhr.upload; |
| 36 upload.onloadstart = test.step_func(() => { |
| 37 assert_unreached('Unexpected upload.onloadstart call'); |
| 38 }); |
| 39 upload.onprogress = test.step_func(() => { |
| 40 assert_unreached('Unexpected upload.onprogress call'); |
| 41 }); |
| 42 upload.onload = test.step_func(() => { |
| 43 assert_unreached('Unexpected upload.onload call'); |
| 44 }); |
| 45 upload.onerror = test.step_func(() => { |
| 46 assert_unreached('Unexpected upload.onerror call'); |
| 47 }); |
| 48 }, 'Upload progress events should not be dispatched for a simple cross-origin re
quest when no handler is set before send() even if the response includes the Acc
ess-Control-Allow-Origin header'); |
81 | 49 |
82 var xhr = new XMLHttpRequest(); | 50 async_test(test => { |
83 xhr.onprogress = progress; | 51 const xhr = new XMLHttpRequest(); |
84 xhr.open("POST", "http://localhost:8000/xmlhttprequest/resources/cross-site-
progress-events.cgi", true); | |
85 xhr.setRequestHeader("Content-Type", "text/plain"); | |
86 xhr.send(stringToSend); | |
87 xhr.upload.onloadstart = function() { log("FAIL: upload.onloadstart"); }; | |
88 xhr.upload.onprogress = notAllowedUploadProgress; | |
89 xhr.upload.onload = function() { log("FAIL: upload.onload"); }; | |
90 xhr.upload.onerror = function() { log("FAIL: upload.onerror"); }; | |
91 xhr.onload = function() { log("onload"); }; | |
92 xhr.onerror = function() { | |
93 log("onerror (expected)"); | |
94 log("Response length: " + xhr.responseText.length); | |
95 test3(); | |
96 }; | |
97 } | |
98 | 52 |
99 function test3() | 53 let onprogressCalled; |
100 { | 54 xhr.onprogress = test.step_func(() => { |
101 sawProgress = false; | 55 onprogressCalled = true; |
102 sawUploadProgress = false; | 56 }); |
| 57 xhr.onload = test.step_func(() => { |
| 58 assert_true(onprogressCalled, 'onprogress is called'); |
103 | 59 |
104 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."); | 60 assert_equals(xhr.responseText.length, 2 ** 23, 'responseText.length'); |
105 | 61 |
106 var xhr = new XMLHttpRequest(); | 62 test.done(); |
107 xhr.onprogress = progress; | 63 }); |
108 xhr.open("POST", "http://localhost:8000/xmlhttprequest/resources/cross-site-
progress-events.cgi", true); | 64 xhr.onerror = test.step_func(() => { |
109 xhr.setRequestHeader("Content-Type", "text/plain"); | 65 assert_unreached('Unexpected onerror call'); |
110 xhr.upload.onloadstart = function() { log("upload.onloadstart"); }; | 66 }); |
111 xhr.send(stringToSend); | |
112 xhr.upload.onprogress = allowedUploadProgress; | |
113 xhr.upload.onload = function() { log("FAIL: upload.onload"); }; | |
114 xhr.upload.onerror = function() { log("upload.onerror (expected)"); }; | |
115 xhr.onload = function() { log("onload"); } | |
116 xhr.onerror = function() { | |
117 log("onerror (expected)"); | |
118 log("Response length: " + xhr.responseText.length); | |
119 if (window.testRunner) | |
120 testRunner.notifyDone(); | |
121 }; | |
122 } | |
123 | 67 |
124 test1(); | 68 xhr.open("POST", "http://localhost:8000/xmlhttprequest/resources/cross-site-pr
ogress-events.cgi?allow", true); |
| 69 xhr.setRequestHeader("Content-Type", "text/plain"); |
| 70 xhr.send(stringToSend); |
| 71 |
| 72 // Set handlers after send() |
| 73 const upload = xhr.upload; |
| 74 upload.onloadstart = test.step_func(() => { |
| 75 assert_unreached('Unexpected upload.onloadstart call'); |
| 76 }); |
| 77 upload.onprogress = test.step_func(() => { |
| 78 assert_unreached('Unexpected upload.onprogress call'); |
| 79 }); |
| 80 upload.onload = test.step_func(() => { |
| 81 assert_unreached('Unexpected upload.onload call'); |
| 82 }); |
| 83 upload.onerror = test.step_func(() => { |
| 84 assert_unreached('Unexpected upload.onerror call'); |
| 85 }); |
| 86 }, 'Upload progress events should be dispatched for a simple cross-origin reques
t'); |
| 87 |
| 88 async_test(test => { |
| 89 const xhr = new XMLHttpRequest(); |
| 90 let onprogressCalled; |
| 91 xhr.onprogress = test.step_func(() => { |
| 92 onprogressCalled = true; |
| 93 }); |
| 94 xhr.open("POST", "http://localhost:8000/xmlhttprequest/resources/cross-site-pr
ogress-events.cgi", true); |
| 95 xhr.setRequestHeader("Content-Type", "text/plain"); |
| 96 |
| 97 // Set one handler before send() |
| 98 const upload = xhr.upload; |
| 99 let uploadOnloadstartCalled; |
| 100 upload.onloadstart = test.step_func(() => { |
| 101 uploadOnloadstartCalled = true; |
| 102 }); |
| 103 xhr.onload = test.step_func(() => { |
| 104 assert_unreached('Unexpected onload call'); |
| 105 }); |
| 106 xhr.onerror = test.step_func(() => { |
| 107 // Since cross-site-progress-events.cgi doesn't accept OPTIONS requests, |
| 108 // the XHR should fail. |
| 109 |
| 110 assert_true(onprogressCalled, 'onprogress is called'); |
| 111 |
| 112 assert_true(uploadOnloadstartCalled, 'upload.onloadstart is called'); |
| 113 assert_true(uploadOnprogressCalled, 'upload.onprogress is called'); |
| 114 assert_true(uploadOnerrorCalled, 'upload.onerror is called'); |
| 115 |
| 116 assert_equals(xhr.responseText.length, 0, 'responseText.length'); |
| 117 |
| 118 test.done(); |
| 119 }); |
| 120 |
| 121 xhr.send(stringToSend); |
| 122 |
| 123 let uploadOnprogressCalled; |
| 124 upload.onprogress = test.step_func(() => { |
| 125 uploadOnprogressCalled = true; |
| 126 }); |
| 127 upload.onload = test.step_func(() => { |
| 128 assert_unreached('Unexpected upload.onload call'); |
| 129 }); |
| 130 let onerrorCalled; |
| 131 upload.onerror = test.step_func(() => { |
| 132 uploadOnerrorCalled = true; |
| 133 }); |
| 134 }, 'Upload progress events should be dispatched for a simple cross-origin reques
t when at least one handler is set before send()'); |
| 135 |
| 136 async_test(test => { |
| 137 const xhr = new XMLHttpRequest(); |
| 138 let onprogressCalled; |
| 139 xhr.onprogress = test.step_func(() => { |
| 140 onprogressCalled = true; |
| 141 }); |
| 142 xhr.onload = test.step_func(() => { |
| 143 assert_true(onprogressCalled, 'onprogress is called'); |
| 144 |
| 145 assert_true(uploadOnprogressCalled, 'upload.onprogress is called'); |
| 146 assert_true(uploadOnloadCalled, 'upload.onload is called'); |
| 147 |
| 148 test.done(); |
| 149 }); |
| 150 |
| 151 // Set handlers after send() |
| 152 const upload = xhr.upload; |
| 153 let uploadOnprogressCalled; |
| 154 upload.onprogress = test.step_func(() => { |
| 155 uploadOnprogressCalled = true; |
| 156 }); |
| 157 let onloadCalled; |
| 158 upload.onload = test.step_func(() => { |
| 159 uploadOnloadCalled = true; |
| 160 }); |
| 161 |
| 162 // Use the script which responds to OPTIONS requests. |
| 163 xhr.open("POST", "http://localhost:8000/xmlhttprequest/resources/access-contro
l-basic-allow-no-credentials.cgi", true); |
| 164 xhr.setRequestHeader("Content-Type", "text/plain"); |
| 165 xhr.send(stringToSend); |
| 166 }, 'Upload progress events should be dispatched for a simple cross-origin reques
t'); |
125 </script> | 167 </script> |
126 </body> | |
127 </html> | |
OLD | NEW |