OLD | NEW |
(Empty) | |
| 1 <!DOCTYPE html> |
| 2 <title>Service Worker: FetchEvent for resources</title> |
| 3 <meta name="timeout" content="long"> |
| 4 <script src="/resources/testharness.js"></script> |
| 5 <script src="/resources/testharnessreport.js"></script> |
| 6 <script src="resources/get-host-info.sub.js"></script> |
| 7 <script src="resources/test-helpers.sub.js"></script> |
| 8 <script> |
| 9 |
| 10 function assert_resolves(promise, description) { |
| 11 return promise.catch(function(reason) { |
| 12 throw new Error(description + ' - ' + reason.message); |
| 13 }); |
| 14 } |
| 15 |
| 16 function assert_rejects(promise, description) { |
| 17 return promise.then( |
| 18 function() { throw new Error(description); }, |
| 19 function() {}); |
| 20 } |
| 21 |
| 22 function iframe_test(url, timeout_enabled) { |
| 23 return new Promise(function(resolve, reject) { |
| 24 var frame = document.createElement('iframe'); |
| 25 frame.src = url; |
| 26 if (timeout_enabled) { |
| 27 // We can't catch the network error on iframe. So we use the timer for |
| 28 // failure detection. |
| 29 var timer = setTimeout(function() { |
| 30 reject(new Error('iframe load timeout')); |
| 31 frame.remove(); |
| 32 }, 10000); |
| 33 } |
| 34 frame.onload = function() { |
| 35 if (timeout_enabled) |
| 36 clearTimeout(timer); |
| 37 if (frame.contentDocument.body.textContent == 'Hello world\n') |
| 38 resolve(); |
| 39 else |
| 40 reject(new Error('content mismatch')); |
| 41 frame.remove(); |
| 42 }; |
| 43 document.body.appendChild(frame); |
| 44 }); |
| 45 } |
| 46 |
| 47 promise_test(function(t) { |
| 48 var SCOPE = 'resources/fetch-request-redirect-iframe.html'; |
| 49 var SCRIPT = 'resources/fetch-rewrite-worker.js'; |
| 50 var REDIRECT_URL = base_path() + 'resources/redirect.py?Redirect='; |
| 51 var IMAGE_URL = base_path() + 'resources/square.png'; |
| 52 var AUDIO_URL = base_path() + 'resources/silence.oga'; |
| 53 var XHR_URL = base_path() + 'resources/simple.txt'; |
| 54 var HTML_URL = base_path() + 'resources/dummy.html'; |
| 55 |
| 56 var REDIRECT_TO_IMAGE_URL = REDIRECT_URL + encodeURIComponent(IMAGE_URL); |
| 57 var REDIRECT_TO_AUDIO_URL = REDIRECT_URL + encodeURIComponent(AUDIO_URL); |
| 58 var REDIRECT_TO_XHR_URL = REDIRECT_URL + encodeURIComponent(XHR_URL); |
| 59 var REDIRECT_TO_HTML_URL = REDIRECT_URL + encodeURIComponent(HTML_URL); |
| 60 |
| 61 var worker; |
| 62 var frame; |
| 63 return service_worker_unregister_and_register(t, SCRIPT, SCOPE) |
| 64 .then(function(registration) { |
| 65 worker = registration.installing; |
| 66 return wait_for_state(t, worker, 'activated'); |
| 67 }) |
| 68 .then(function() { return with_iframe(SCOPE); }) |
| 69 .then(function(f) { |
| 70 frame = f; |
| 71 return Promise.all([ |
| 72 // XMLHttpRequest tests. |
| 73 assert_resolves(frame.contentWindow.xhr(XHR_URL), |
| 74 'Normal XHR should succeed.'), |
| 75 assert_resolves(frame.contentWindow.xhr(REDIRECT_TO_XHR_URL), |
| 76 'Redirected XHR should succeed.'), |
| 77 assert_resolves( |
| 78 frame.contentWindow.xhr( |
| 79 './?url=' + encodeURIComponent(REDIRECT_TO_XHR_URL) + |
| 80 '&redirect-mode=follow'), |
| 81 'Redirected XHR with Request.redirect=follow should succeed.'), |
| 82 assert_rejects( |
| 83 frame.contentWindow.xhr( |
| 84 './?url=' + encodeURIComponent(REDIRECT_TO_XHR_URL) + |
| 85 '&redirect-mode=error'), |
| 86 'Redirected XHR with Request.redirect=error should fail.'), |
| 87 assert_rejects( |
| 88 frame.contentWindow.xhr( |
| 89 './?url=' + encodeURIComponent(REDIRECT_TO_XHR_URL) + |
| 90 '&redirect-mode=manual'), |
| 91 'Redirected XHR with Request.redirect=manual should fail.'), |
| 92 |
| 93 // Image loading tests. |
| 94 assert_resolves(frame.contentWindow.load_image(IMAGE_URL), |
| 95 'Normal image resource should be loaded.'), |
| 96 assert_resolves( |
| 97 frame.contentWindow.load_image(REDIRECT_TO_IMAGE_URL), |
| 98 'Redirected image resource should be loaded.'), |
| 99 assert_resolves( |
| 100 frame.contentWindow.load_image( |
| 101 './?url=' + encodeURIComponent(REDIRECT_TO_IMAGE_URL) + |
| 102 '&redirect-mode=follow'), |
| 103 'Loading redirected image with Request.redirect=follow should' + |
| 104 ' succeed.'), |
| 105 assert_rejects( |
| 106 frame.contentWindow.load_image( |
| 107 './?url=' + encodeURIComponent(REDIRECT_TO_IMAGE_URL) + |
| 108 '&redirect-mode=error'), |
| 109 'Loading redirected image with Request.redirect=error should ' + |
| 110 'fail.'), |
| 111 assert_rejects( |
| 112 frame.contentWindow.load_image( |
| 113 './?url=' + encodeURIComponent(REDIRECT_TO_IMAGE_URL) + |
| 114 '&redirect-mode=manual'), |
| 115 'Loading redirected image with Request.redirect=manual should' + |
| 116 ' fail.'), |
| 117 |
| 118 // Audio loading tests. |
| 119 assert_resolves(frame.contentWindow.load_audio(AUDIO_URL), |
| 120 'Normal audio resource should be loaded.'), |
| 121 assert_resolves( |
| 122 frame.contentWindow.load_audio(REDIRECT_TO_AUDIO_URL), |
| 123 'Redirected audio resource should be loaded.'), |
| 124 assert_resolves( |
| 125 frame.contentWindow.load_audio( |
| 126 './?url=' + encodeURIComponent(REDIRECT_TO_AUDIO_URL) + |
| 127 '&redirect-mode=follow'), |
| 128 'Loading redirected audio with Request.redirect=follow should' + |
| 129 ' succeed.'), |
| 130 assert_rejects( |
| 131 frame.contentWindow.load_audio( |
| 132 './?url=' + encodeURIComponent(REDIRECT_TO_AUDIO_URL) + |
| 133 '&redirect-mode=error'), |
| 134 'Loading redirected audio with Request.redirect=error should ' + |
| 135 'fail.'), |
| 136 assert_rejects( |
| 137 frame.contentWindow.load_audio( |
| 138 './?url=' + encodeURIComponent(REDIRECT_TO_AUDIO_URL) + |
| 139 '&redirect-mode=manual'), |
| 140 'Loading redirected audio with Request.redirect=manual should' + |
| 141 ' fail.'), |
| 142 |
| 143 // Iframe tests. |
| 144 assert_resolves(iframe_test(HTML_URL), |
| 145 'Normal iframe loading should succeed.'), |
| 146 assert_resolves( |
| 147 iframe_test(REDIRECT_TO_HTML_URL), |
| 148 'Normal redirected iframe loading should succeed.'), |
| 149 assert_rejects( |
| 150 iframe_test(SCOPE + '?url=' + |
| 151 encodeURIComponent(REDIRECT_TO_HTML_URL) + |
| 152 '&redirect-mode=follow', |
| 153 true /* timeout_enabled */), |
| 154 'Redirected iframe loading with Request.redirect=follow should'+ |
| 155 ' fail.'), |
| 156 assert_rejects( |
| 157 iframe_test(SCOPE + '?url=' + |
| 158 encodeURIComponent(REDIRECT_TO_HTML_URL) + |
| 159 '&redirect-mode=error', |
| 160 true /* timeout_enabled */), |
| 161 'Redirected iframe loading with Request.redirect=error should '+ |
| 162 'fail.'), |
| 163 assert_resolves( |
| 164 iframe_test(SCOPE + '?url=' + |
| 165 encodeURIComponent(REDIRECT_TO_HTML_URL) + |
| 166 '&redirect-mode=manual', |
| 167 true /* timeout_enabled */), |
| 168 'Redirected iframe loading with Request.redirect=manual should'+ |
| 169 ' succeed.'), |
| 170 ]); |
| 171 }) |
| 172 .then(function() { |
| 173 frame.remove(); |
| 174 service_worker_unregister_and_done(t, SCOPE); |
| 175 }); |
| 176 }, 'Verify redirect mode of Fetch API and ServiceWorker FetchEvent.'); |
| 177 |
| 178 // test for reponse.redirected |
| 179 promise_test(function(t) { |
| 180 var SCOPE = 'resources/fetch-request-redirect-iframe.html'; |
| 181 var SCRIPT = 'resources/fetch-rewrite-worker.js'; |
| 182 var REDIRECT_URL = base_path() + 'resources/redirect.py?Redirect='; |
| 183 var XHR_URL = base_path() + 'resources/simple.txt'; |
| 184 var IMAGE_URL = base_path() + 'resources/square.png'; |
| 185 |
| 186 var REDIRECT_TO_XHR_URL = REDIRECT_URL + encodeURIComponent(XHR_URL); |
| 187 |
| 188 var host_info = get_host_info(); |
| 189 |
| 190 var CROSS_ORIGIN_URL = host_info['HTTPS_REMOTE_ORIGIN'] + IMAGE_URL; |
| 191 |
| 192 var REDIRECT_TO_CROSS_ORIGIN = REDIRECT_URL + |
| 193 encodeURIComponent(CROSS_ORIGIN_URL + '?ACAOrigin=*'); |
| 194 |
| 195 var worker; |
| 196 var frame; |
| 197 return service_worker_unregister_and_register(t, SCRIPT, SCOPE) |
| 198 .then(function(registration) { |
| 199 worker = registration.installing; |
| 200 return wait_for_state(t, worker, 'activated'); |
| 201 }) |
| 202 .then(function() { return with_iframe(SCOPE); }) |
| 203 .then(function(f) { |
| 204 frame = f; |
| 205 return Promise.all([ |
| 206 // XMLHttpRequest tests. |
| 207 assert_resolves( |
| 208 frame.contentWindow.xhr( |
| 209 './?url=' + encodeURIComponent(XHR_URL) + |
| 210 '&expected_redirected=false' + |
| 211 '&expected_resolves=true'), |
| 212 'Normal XHR should be resolved and response should not be ' + |
| 213 'redirected.'), |
| 214 assert_resolves( |
| 215 frame.contentWindow.xhr( |
| 216 './?url=' + encodeURIComponent(REDIRECT_TO_XHR_URL) + |
| 217 '&expected_redirected=true' + |
| 218 '&expected_resolves=true'), |
| 219 'Redirected XHR should be resolved and response should be ' + |
| 220 'redirected.'), |
| 221 |
| 222 // tests for request's mode = cors |
| 223 assert_resolves( |
| 224 frame.contentWindow.xhr( |
| 225 './?url=' + encodeURIComponent(XHR_URL) + |
| 226 '&mode=cors' + |
| 227 '&expected_redirected=false' + |
| 228 '&expected_resolves=true'), |
| 229 'Normal XHR should be resolved and response should not be ' + |
| 230 'redirected even with CORS mode.'), |
| 231 assert_resolves( |
| 232 frame.contentWindow.xhr( |
| 233 './?url=' + encodeURIComponent(REDIRECT_TO_XHR_URL) + |
| 234 '&mode=cors' + |
| 235 '&redirect-mode=follow' + |
| 236 '&expected_redirected=true' + |
| 237 '&expected_resolves=true'), |
| 238 'Redirected XHR should be resolved and response.redirected ' + |
| 239 'should be redirected with CORS mode.'), |
| 240 |
| 241 // tests for request's mode = no-cors |
| 242 // The response.redirect should be false since we will not add |
| 243 // redirected url list when redirect-mode is not follow. |
| 244 assert_rejects( |
| 245 frame.contentWindow.xhr( |
| 246 './?url=' + encodeURIComponent(REDIRECT_TO_XHR_URL) + |
| 247 '&mode=no-cors' + |
| 248 '&redirect-mode=manual' + |
| 249 '&expected_redirected=false' + |
| 250 '&expected_resolves=false'), |
| 251 'Redirected XHR should be reject and response should be ' + |
| 252 'redirected with NO-CORS mode and redirect-mode=manual.'), |
| 253 |
| 254 // tests for redirecting to a cors |
| 255 assert_resolves( |
| 256 frame.contentWindow.load_image( |
| 257 './?url=' + encodeURIComponent(REDIRECT_TO_CROSS_ORIGIN) + |
| 258 '&mode=no-cors' + |
| 259 '&redirect-mode=follow' + |
| 260 '&expected_redirected=false' + |
| 261 '&expected_resolves=true'), |
| 262 'Redirected COS image should be reject and response should ' + |
| 263 'not be redirected with NO-CORS mode.'), |
| 264 ]); |
| 265 }) |
| 266 .then(function() { |
| 267 frame.remove(); |
| 268 service_worker_unregister_and_done(t, SCOPE); |
| 269 }); |
| 270 }, 'Verify redirected of Response(Fetch API) and ServiceWorker FetchEvent.'); |
| 271 |
| 272 // test for reponse.redirected after cached |
| 273 promise_test(function(t) { |
| 274 var SCOPE = 'resources/fetch-request-redirect-iframe.html'; |
| 275 var SCRIPT = 'resources/fetch-rewrite-worker.js'; |
| 276 var REDIRECT_URL = base_path() + 'resources/redirect.py?Redirect='; |
| 277 var XHR_URL = base_path() + 'resources/simple.txt'; |
| 278 var IMAGE_URL = base_path() + 'resources/square.png'; |
| 279 |
| 280 var REDIRECT_TO_XHR_URL = REDIRECT_URL + encodeURIComponent(XHR_URL); |
| 281 |
| 282 var host_info = get_host_info(); |
| 283 |
| 284 var CROSS_ORIGIN_URL = host_info['HTTPS_REMOTE_ORIGIN'] + IMAGE_URL; |
| 285 |
| 286 var REDIRECT_TO_CROSS_ORIGIN = REDIRECT_URL + |
| 287 encodeURIComponent(CROSS_ORIGIN_URL + '?ACAOrigin=*'); |
| 288 |
| 289 var worker; |
| 290 var frame; |
| 291 return service_worker_unregister_and_register(t, SCRIPT, SCOPE) |
| 292 .then(function(registration) { |
| 293 worker = registration.installing; |
| 294 return wait_for_state(t, worker, 'activated'); |
| 295 }) |
| 296 .then(function() { return with_iframe(SCOPE); }) |
| 297 .then(function(f) { |
| 298 frame = f; |
| 299 return Promise.all([ |
| 300 // XMLHttpRequest tests. |
| 301 assert_resolves( |
| 302 frame.contentWindow.xhr( |
| 303 './?url=' + encodeURIComponent(XHR_URL) + |
| 304 '&expected_redirected=false' + |
| 305 '&expected_resolves=true' + |
| 306 '&cache'), |
| 307 'Normal XHR should be resolved and response should not be ' + |
| 308 'redirected.'), |
| 309 assert_resolves( |
| 310 frame.contentWindow.xhr( |
| 311 './?url=' + encodeURIComponent(REDIRECT_TO_XHR_URL) + |
| 312 '&expected_redirected=true' + |
| 313 '&expected_resolves=true' + |
| 314 '&cache'), |
| 315 'Redirected XHR should be resolved and response should be ' + |
| 316 'redirected.'), |
| 317 |
| 318 // tests for request's mode = cors |
| 319 assert_resolves( |
| 320 frame.contentWindow.xhr( |
| 321 './?url=' + encodeURIComponent(XHR_URL) + |
| 322 '&mode=cors' + |
| 323 '&expected_redirected=false' + |
| 324 '&expected_resolves=true' + |
| 325 '&cache'), |
| 326 'Normal XHR should be resolved and response should not be ' + |
| 327 'redirected even with CORS mode.'), |
| 328 assert_resolves( |
| 329 frame.contentWindow.xhr( |
| 330 './?url=' + encodeURIComponent(REDIRECT_TO_XHR_URL) + |
| 331 '&mode=cors' + |
| 332 '&redirect-mode=follow' + |
| 333 '&expected_redirected=true' + |
| 334 '&expected_resolves=true' + |
| 335 '&cache'), |
| 336 'Redirected XHR should be resolved and response.redirected ' + |
| 337 'should be redirected with CORS mode.'), |
| 338 |
| 339 // tests for request's mode = no-cors |
| 340 // The response.redirect should be false since we will not add |
| 341 // redirected url list when redirect-mode is not follow. |
| 342 assert_rejects( |
| 343 frame.contentWindow.xhr( |
| 344 './?url=' + encodeURIComponent(REDIRECT_TO_XHR_URL) + |
| 345 '&mode=no-cors' + |
| 346 '&redirect-mode=manual' + |
| 347 '&expected_redirected=false' + |
| 348 '&expected_resolves=false' + |
| 349 '&cache'), |
| 350 'Redirected XHR should be reject and response should be ' + |
| 351 'redirected with NO-CORS mode and redirect-mode=manual.'), |
| 352 |
| 353 // tests for redirecting to a cors |
| 354 assert_resolves( |
| 355 frame.contentWindow.load_image( |
| 356 './?url=' + encodeURIComponent(REDIRECT_TO_CROSS_ORIGIN) + |
| 357 '&mode=no-cors' + |
| 358 '&redirect-mode=follow' + |
| 359 '&expected_redirected=false' + |
| 360 '&expected_resolves=true' + |
| 361 '&cache'), |
| 362 'Redirected COS image should be reject and response should ' + |
| 363 'not be redirected with NO-CORS mode.'), |
| 364 ]); |
| 365 }) |
| 366 .then(function() { |
| 367 frame.remove(); |
| 368 service_worker_unregister_and_done(t, SCOPE); |
| 369 }); |
| 370 }, 'Verify redirected of Response(Fetch API), Cache API and ServiceWorker ' + |
| 371 'FetchEvent.'); |
| 372 </script> |
OLD | NEW |