c72be766646f5d69db5ba205a64f4e176d749cb0
[WebKit-https.git] / LayoutTests / imported / w3c / web-platform-tests / service-workers / service-worker / fetch-event-redirect.https.html
1 <!DOCTYPE html>
2 <title>Service Worker: Fetch Event Redirect Handling</title>
3 <meta name=timeout content=long>
4 <script src="/resources/testharness.js"></script>
5 <script src="resources/testharness-helpers.js"></script>
6 <script src="/resources/testharnessreport.js"></script>
7 <script src="/common/get-host-info.sub.js"></script>
8 <script src="resources/test-helpers.sub.js"></script>
9 <body>
10 <script>
11
12 // ------------------------
13 // Utilities for testing non-navigation requests that are intercepted with
14 // a redirect.
15
16 const host_info = get_host_info();
17 const kScript = 'resources/fetch-rewrite-worker.js';
18 const kScope = host_info['HTTPS_ORIGIN'] + base_path() +
19                'resources/blank.html?fetch-event-redirect';
20 let frame;
21
22 function redirect_fetch_test(t, test) {
23   const hostKeySuffix = test['url_credentials'] ? '_WITH_CREDS' : '';
24   const successPath = base_path() + 'resources/success.py';
25
26   let acaOrigin = '';
27   let host = host_info['HTTPS_ORIGIN' + hostKeySuffix];
28   if (test['redirect_dest'] === 'no-cors') {
29     host = host_info['HTTPS_REMOTE_ORIGIN' + hostKeySuffix]
30   } else if (test['redirect_dest'] === 'cors') {
31     acaOrigin = '?ACAOrigin=' + encodeURIComponent(host_info['HTTPS_ORIGIN']);
32     host = host_info['HTTPS_REMOTE_ORIGIN' + hostKeySuffix]
33   }
34
35   const dest = '?Redirect=' + encodeURIComponent(host + successPath + acaOrigin);
36   const expectedTypeParam =
37       test['expected_type']
38           ? '&expected_type=' + test['expected_type']
39           : '';
40   const expectedRedirectedParam =
41       test['expected_redirected']
42           ? '&expected_redirected=' + test['expected_redirected']
43           : '';
44   const url = '/' + test.name +
45             '?url=' + encodeURIComponent('redirect.py' + dest) +
46             expectedTypeParam + expectedRedirectedParam
47   const request = new Request(url, test.request_init);
48
49   if (test.should_reject) {
50     return assert_promise_rejects(
51       frame.contentWindow.fetch(request),
52       new TypeError(),
53       'Must fail to fetch: url=' + url);
54   }
55   return frame.contentWindow.fetch(request).then((response) => {
56       assert_equals(response.type, test.expected_type,
57                     'response.type');
58       assert_equals(response.redirected, test.expected_redirected,
59                     'response.redirected');
60       if (response.type === 'opaque' || response.type === 'opaqueredirect') {
61         return;
62       }
63       return response.json().then((json) => {
64         assert_equals(json.result, 'success', 'JSON result must be "success".');
65       });
66     });
67 }
68
69 // Set up the service worker and the frame.
70 promise_test(t => {
71     return service_worker_unregister_and_register(t, kScript, kScope)
72       .then(registration => {
73           promise_test(() => {
74               return registration.unregister();
75             }, 'restore global state');
76
77           return wait_for_state(t, registration.installing, 'activated');
78         })
79       .then(() => {
80           return with_iframe(kScope);
81         })
82       .then(f => {
83           frame = f;
84           add_completion_callback(() => { f.remove(); });
85         });
86   }, 'initialize global state');
87
88 // ------------------------
89 // Test every combination of:
90 //  - RequestMode (same-origin, cors, no-cors)
91 //  - RequestRedirect (manual, follow, error)
92 //  - redirect destination origin (same-origin, cors, no-cors)
93 //  - redirect destination credentials (no user/pass, user/pass)
94 //
95 // TODO: add navigation requests
96 // TODO: add redirects to data URI and verify same-origin data-URL flag behavior
97 // TODO: add test where original redirect URI is cross-origin
98 // TODO: verify final method is correct for 301, 302, and 303
99 // TODO: verify CORS redirect results in all further redirects being
100 //       considered cross origin
101
102 promise_test(function(t) {
103   return redirect_fetch_test(t, {
104     name: 'nonav-manual-cors-redirects-to-sameorigin-nocreds',
105     redirect_dest: 'same-origin',
106     url_credentials: false,
107     expected_type: 'opaqueredirect',
108     expected_redirected: false,
109     request_init: {
110       redirect: 'manual',
111       mode: 'cors'
112     },
113     should_reject: false
114   });
115 }, 'Non-navigation, manual redirect, cors mode Request redirected to ' +
116    'same-origin without credentials should succeed opaqueredirect ' +
117    'interception and response should not be redirected');
118
119 promise_test(function(t) {
120   return redirect_fetch_test(t, {
121     name: 'nonav-manual-cors-redirects-to-nocors-nocreds',
122     redirect_dest: 'no-cors',
123     url_credentials: false,
124     expected_type: 'opaqueredirect',
125     expected_redirected: false,
126     request_init: {
127       redirect: 'manual',
128       mode: 'cors'
129     },
130     should_reject: false
131   });
132 }, 'Non-navigation, manual redirect, cors mode Request redirected to ' +
133    'no-cors without credentials should succeed opaqueredirect interception ' +
134    'and response should not be redirected');
135
136 promise_test(function(t) {
137   return redirect_fetch_test(t, {
138     name: 'nonav-manual-cors-redirects-to-cors-nocreds',
139     redirect_dest: 'cors',
140     url_credentials: false,
141     expected_type: 'opaqueredirect',
142     expected_redirected: false,
143     request_init: {
144       redirect: 'manual',
145       mode: 'cors'
146     },
147     should_reject: false
148   });
149 }, 'Non-navigation, manual redirect, cors mode Request redirected to ' +
150    'cors without credentials should succeed opaqueredirect interception ' +
151    'and response should not be redirected');
152
153 promise_test(function(t) {
154   return redirect_fetch_test(t, {
155     name: 'nonav-manual-sameorigin-redirects-to-sameorigin-nocreds',
156     redirect_dest: 'same-origin',
157     url_credentials: false,
158     expected_type: 'opaqueredirect',
159     expected_redirected: false,
160     request_init: {
161       redirect: 'manual',
162       mode: 'same-origin'
163     },
164     should_reject: false
165   });
166 }, 'Non-navigation, manual redirect, same-origin mode Request redirected to ' +
167    'same-origin without credentials should succeed opaqueredirect ' +
168    'interception and response should not be redirected');
169
170 promise_test(function(t) {
171   return redirect_fetch_test(t, {
172     name: 'nonav-manual-sameorigin-redirects-to-nocors-nocreds',
173     redirect_dest: 'no-cors',
174     url_credentials: false,
175     expected_type: 'opaqueredirect',
176     expected_redirected: false,
177     request_init: {
178       redirect: 'manual',
179       mode: 'same-origin'
180     },
181     should_reject: false
182   });
183 }, 'Non-navigation, manual redirect, same-origin mode Request redirected to ' +
184    'no-cors without credentials should succeed opaqueredirect interception ' +
185    'and response should not be redirected');
186
187 promise_test(function(t) {
188   return redirect_fetch_test(t, {
189     name: 'nonav-manual-sameorigin-redirects-to-cors-nocreds',
190     redirect_dest: 'cors',
191     url_credentials: false,
192     expected_type: 'opaqueredirect',
193     expected_redirected: false,
194     request_init: {
195       redirect: 'manual',
196       mode: 'same-origin'
197     },
198     should_reject: false
199   });
200 }, 'Non-navigation, manual redirect, same-origin mode Request redirected to ' +
201    'cors without credentials should succeed opaqueredirect interception ' +
202    'and response should not be redirected');
203
204 promise_test(function(t) {
205   return redirect_fetch_test(t, {
206     name: 'nonav-manual-nocors-redirects-to-sameorigin-nocreds',
207     redirect_dest: 'same-origin',
208     url_credentials: false,
209     expected_type: 'opaqueredirect',
210     expected_redirected: false,
211     request_init: {
212       redirect: 'manual',
213       mode: 'no-cors'
214     },
215     should_reject: false
216   });
217 }, 'Non-navigation, manual redirect, no-cors mode Request redirected to ' +
218    'same-origin without credentials should succeed opaqueredirect interception ' +
219    'and response should not be redirected');
220
221 promise_test(function(t) {
222   return redirect_fetch_test(t, {
223     name: 'nonav-manual-nocors-redirects-to-nocors-nocreds',
224     redirect_dest: 'no-cors',
225     url_credentials: false,
226     expected_type: 'opaqueredirect',
227     expected_redirected: false,
228     request_init: {
229       redirect: 'manual',
230       mode: 'no-cors'
231     },
232     should_reject: false
233   });
234 }, 'Non-navigation, manual redirect, no-cors mode Request redirected to ' +
235    'no-cors without credentials should succeed interception ' +
236    'and response should not be redirected');
237
238 promise_test(function(t) {
239   return redirect_fetch_test(t, {
240     name: 'nonav-manual-nocors-redirects-to-cors-nocreds',
241     redirect_dest: 'cors',
242     url_credentials: false,
243     expected_type: 'opaqueredirect',
244     expected_redirected: false,
245     request_init: {
246       redirect: 'manual',
247       mode: 'no-cors'
248     },
249     should_reject: false
250   });
251 }, 'Non-navigation, manual redirect, no-cors mode Request redirected to ' +
252    'cors without credentials should succeed interception ' +
253    'and response should not be redirected');
254
255 promise_test(function(t) {
256   return redirect_fetch_test(t, {
257     name: 'nonav-manual-cors-redirects-to-sameorigin-creds',
258     redirect_dest: 'same-origin',
259     url_credentials: true,
260     expected_type: 'opaqueredirect',
261     expected_redirected: false,
262     request_init: {
263       redirect: 'manual',
264       mode: 'cors'
265     },
266     should_reject: false
267   });
268 }, 'Non-navigation, manual redirect, cors mode Request redirected to ' +
269    'same-origin with credentials should succeed opaqueredirect interception ' +
270    'and response should not be redirected');
271
272 promise_test(function(t) {
273   return redirect_fetch_test(t, {
274     name: 'nonav-manual-cors-redirects-to-nocors-creds',
275     redirect_dest: 'no-cors',
276     url_credentials: true,
277     expected_type: 'opaqueredirect',
278     expected_redirected: false,
279     request_init: {
280       redirect: 'manual',
281       mode: 'cors'
282     },
283     should_reject: false
284   });
285 }, 'Non-navigation, manual redirect, cors mode Request redirected to ' +
286    'no-cors with credentials should succeed opaqueredirect interception ' +
287    'and response should not be redirected');
288
289 promise_test(function(t) {
290   return redirect_fetch_test(t, {
291     name: 'nonav-manual-cors-redirects-to-cors-creds',
292     redirect_dest: 'cors',
293     url_credentials: true,
294     expected_type: 'opaqueredirect',
295     expected_redirected: false,
296     request_init: {
297       redirect: 'manual',
298       mode: 'cors'
299     },
300     should_reject: false
301   });
302 }, 'Non-navigation, manual redirect, cors mode Request redirected to ' +
303    'cors with credentials should succeed opaqueredirect interception ' +
304    'and response should not be redirected');
305
306 promise_test(function(t) {
307   return redirect_fetch_test(t, {
308     name: 'nonav-manual-sameorigin-redirects-to-sameorigin-creds',
309     redirect_dest: 'same-origin',
310     url_credentials: true,
311     expected_type: 'opaqueredirect',
312     expected_redirected: false,
313     request_init: {
314       redirect: 'manual',
315       mode: 'same-origin'
316     },
317     should_reject: false
318   });
319 }, 'Non-navigation, manual redirect, same-origin mode Request redirected to ' +
320    'same-origin with credentials should succeed opaqueredirect interception ' +
321    'and response should not be redirected');
322
323 promise_test(function(t) {
324   return redirect_fetch_test(t, {
325     name: 'nonav-manual-sameorigin-redirects-to-nocors-creds',
326     redirect_dest: 'no-cors',
327     url_credentials: true,
328     expected_type: 'opaqueredirect',
329     expected_redirected: false,
330     request_init: {
331       redirect: 'manual',
332       mode: 'same-origin'
333     },
334     should_reject: false
335   });
336 }, 'Non-navigation, manual redirect, same-origin mode Request redirected to ' +
337    'no-cors with credentials should succeed opaqueredirect interception ' +
338    'and response should not be redirected');
339
340 promise_test(function(t) {
341   return redirect_fetch_test(t, {
342     name: 'nonav-manual-sameorigin-redirects-to-cors-creds',
343     redirect_dest: 'cors',
344     url_credentials: true,
345     expected_type: 'opaqueredirect',
346     expected_redirected: false,
347     request_init: {
348       redirect: 'manual',
349       mode: 'same-origin'
350     },
351     should_reject: false
352   });
353 }, 'Non-navigation, manual redirect, same-origin mode Request redirected to ' +
354    'cors with credentials should succeed opaqueredirect interception ' +
355    'and response should not be redirected');
356
357 promise_test(function(t) {
358   return redirect_fetch_test(t, {
359     name: 'nonav-manual-nocors-redirects-to-sameorigin-creds',
360     redirect_dest: 'same-origin',
361     url_credentials: true,
362     expected_type: 'opaqueredirect',
363     expected_redirected: false,
364     request_init: {
365       redirect: 'manual',
366       mode: 'no-cors'
367     },
368     should_reject: false
369   });
370 }, 'Non-navigation, manual redirect, no-cors mode Request redirected to ' +
371    'same-origin with credentials should succeed opaqueredirect interception ' +
372    'and response should not be redirected');
373
374 promise_test(function(t) {
375   return redirect_fetch_test(t, {
376     name: 'nonav-manual-nocors-redirects-to-nocors-creds',
377     redirect_dest: 'no-cors',
378     url_credentials: true,
379     expected_type: 'opaqueredirect',
380     expected_redirected: false,
381     request_init: {
382       redirect: 'manual',
383       mode: 'no-cors'
384     },
385     should_reject: false
386   });
387 }, 'Non-navigation, manual redirect, no-cors mode Request redirected to ' +
388    'no-cors with credentials should succeed interception ' +
389    'and response should not be redirected');
390
391 promise_test(function(t) {
392   return redirect_fetch_test(t, {
393     name: 'nonav-manual-nocors-redirects-to-cors-creds',
394     redirect_dest: 'cors',
395     url_credentials: true,
396     expected_type: 'opaqueredirect',
397     expected_redirected: false,
398     request_init: {
399       redirect: 'manual',
400       mode: 'no-cors'
401     },
402     should_reject: false
403   });
404 }, 'Non-navigation, manual redirect, no-cors mode Request redirected to ' +
405    'cors with credentials should succeed interception ' +
406    'and response should not be redirected');
407
408 promise_test(function(t) {
409   return redirect_fetch_test(t, {
410     name: 'nonav-follow-cors-redirects-to-sameorigin-nocreds',
411     redirect_dest: 'same-origin',
412     url_credentials: false,
413     expected_type: 'basic',
414     expected_redirected: true,
415     request_init: {
416       redirect: 'follow',
417       mode: 'cors'
418     },
419     should_reject: false
420   });
421 }, 'Non-navigation, follow redirect, cors mode Request redirected to ' +
422    'same-origin without credentials should succeed interception ' +
423    'and response should be redirected');
424
425 promise_test(function(t) {
426   return redirect_fetch_test(t, {
427     name: 'nonav-follow-cors-redirects-to-nocors-nocreds',
428     redirect_dest: 'no-cors',
429     url_credentials: false,
430     request_init: {
431       redirect: 'follow',
432       mode: 'cors'
433     },
434     // should reject because CORS requests require CORS headers on cross-origin
435     // resources
436     should_reject: true
437   });
438 }, 'Non-navigation, follow redirect, cors mode Request redirected to ' +
439    'no-cors without credentials should fail interception ' +
440    'and response should not be redirected');
441
442 promise_test(function(t) {
443   return redirect_fetch_test(t, {
444     name: 'nonav-follow-cors-redirects-to-cors-nocreds',
445     redirect_dest: 'cors',
446     url_credentials: false,
447     expected_type: 'cors',
448     expected_redirected: true,
449     request_init: {
450       redirect: 'follow',
451       mode: 'cors'
452     },
453     should_reject: false
454   });
455 }, 'Non-navigation, follow redirect, cors mode Request redirected to ' +
456    'cors without credentials should succeed interception ' +
457    'and response should be redirected');
458
459 promise_test(function(t) {
460   return redirect_fetch_test(t, {
461     name: 'nonav-follow-sameorigin-redirects-to-sameorigin-nocreds',
462     redirect_dest: 'same-origin',
463     url_credentials: false,
464     expected_type: 'basic',
465     expected_redirected: true,
466     request_init: {
467       redirect: 'follow',
468       mode: 'same-origin'
469     },
470     should_reject: false
471   });
472 }, 'Non-navigation, follow redirect, same-origin mode Request redirected to ' +
473    'same-origin without credentials should succeed interception ' +
474    'and response should be redirected');
475
476 promise_test(function(t) {
477   return redirect_fetch_test(t, {
478     name: 'nonav-follow-sameorigin-redirects-to-nocors-nocreds',
479     redirect_dest: 'no-cors',
480     url_credentials: false,
481     request_init: {
482       redirect: 'follow',
483       mode: 'same-origin'
484     },
485     // should reject because same-origin requests cannot load cross-origin
486     // resources
487     should_reject: true
488   });
489 }, 'Non-navigation, follow redirect, same-origin mode Request redirected to ' +
490    'no-cors without credentials should fail interception ' +
491    'and response should not be redirected');
492
493 promise_test(function(t) {
494   return redirect_fetch_test(t, {
495     name: 'nonav-follow-sameorigin-redirects-to-cors-nocreds',
496     redirect_dest: 'cors',
497     url_credentials: false,
498     request_init: {
499       redirect: 'follow',
500       mode: 'same-origin'
501     },
502     // should reject because same-origin requests cannot load cross-origin
503     // resources
504     should_reject: true
505   });
506 }, 'Non-navigation, follow redirect, same-origin mode Request redirected to ' +
507    'cors without credentials should fail interception ' +
508    'and response should not be redirected');
509
510 promise_test(function(t) {
511   return redirect_fetch_test(t, {
512     name: 'nonav-follow-nocors-redirects-to-sameorigin-nocreds',
513     redirect_dest: 'same-origin',
514     url_credentials: false,
515     expected_type: 'basic',
516     expected_redirected: true,
517     request_init: {
518       redirect: 'follow',
519       mode: 'no-cors'
520     },
521     should_reject: false
522   });
523 }, 'Non-navigation, follow redirect, no-cors mode Request redirected to ' +
524    'same-origin without credentials should succeed interception ' +
525    'and response should be redirected');
526
527 promise_test(function(t) {
528   return redirect_fetch_test(t, {
529     name: 'nonav-follow-nocors-redirects-to-nocors-nocreds',
530     redirect_dest: 'no-cors',
531     url_credentials: false,
532     expected_type: 'opaque',
533     expected_redirected: false,
534     request_init: {
535       redirect: 'follow',
536       mode: 'no-cors'
537     },
538     should_reject: false
539   });
540 }, 'Non-navigation, follow redirect, no-cors mode Request redirected to ' +
541    'no-cors without credentials should succeed interception ' +
542    'and response should not be redirected');
543
544 promise_test(function(t) {
545   return redirect_fetch_test(t, {
546     name: 'nonav-follow-nocors-redirects-to-cors-nocreds',
547     redirect_dest: 'cors',
548     url_credentials: false,
549     expected_type: 'opaque',
550     expected_redirected: false,
551     request_init: {
552       redirect: 'follow',
553       mode: 'no-cors'
554     },
555     should_reject: false
556   });
557 }, 'Non-navigation, follow redirect, no-cors mode Request redirected to ' +
558    'cors without credentials should succeed interception ' +
559    'and response should not be redirected');
560
561 promise_test(function(t) {
562   return redirect_fetch_test(t, {
563     name: 'nonav-follow-cors-redirects-to-sameorigin-creds',
564     redirect_dest: 'same-origin',
565     url_credentials: true,
566     expected_type: 'basic',
567     expected_redirected: true,
568     request_init: {
569       redirect: 'follow',
570       mode: 'cors'
571     },
572     should_reject: false
573   });
574 }, 'Non-navigation, follow redirect, cors mode Request redirected to ' +
575    'same-origin with credentials should succeed interception ' +
576    'and response should be redirected');
577
578 promise_test(function(t) {
579   return redirect_fetch_test(t, {
580     name: 'nonav-follow-cors-redirects-to-nocors-creds',
581     redirect_dest: 'no-cors',
582     url_credentials: true,
583     request_init: {
584       redirect: 'follow',
585       mode: 'cors'
586     },
587     // should reject because CORS requests require CORS headers on cross-origin
588     // resources
589     should_reject: true
590   });
591 }, 'Non-navigation, follow redirect, cors mode Request redirected to ' +
592    'no-cors with credentials should fail interception ' +
593    'and response should not be redirected');
594
595 promise_test(function(t) {
596   return redirect_fetch_test(t, {
597     name: 'nonav-follow-cors-redirects-to-cors-creds',
598     redirect_dest: 'cors',
599     url_credentials: true,
600     request_init: {
601       redirect: 'follow',
602       mode: 'cors'
603     },
604     // should reject because CORS requests do not allow user/pass entries in
605     // cross-origin URLs
606     // NOTE: https://github.com/whatwg/fetch/issues/112
607     should_reject: true
608   });
609 }, 'Non-navigation, follow redirect, cors mode Request redirected to ' +
610    'cors with credentials should fail interception ' +
611    'and response should be redirected');
612
613 promise_test(function(t) {
614   return redirect_fetch_test(t, {
615     name: 'nonav-follow-sameorigin-redirects-to-sameorigin-creds',
616     redirect_dest: 'same-origin',
617     url_credentials: true,
618     expected_type: 'basic',
619     expected_redirected: true,
620     request_init: {
621       redirect: 'follow',
622       mode: 'same-origin'
623     },
624     should_reject: false
625   });
626 }, 'Non-navigation, follow redirect, same-origin mode Request redirected to ' +
627    'same-origin with credentials should succeed interception ' +
628    'and response should be redirected');
629
630 promise_test(function(t) {
631   return redirect_fetch_test(t, {
632     name: 'nonav-follow-sameorigin-redirects-to-nocors-creds',
633     redirect_dest: 'no-cors',
634     url_credentials: true,
635     request_init: {
636       redirect: 'follow',
637       mode: 'same-origin'
638     },
639     // should reject because same-origin requests cannot load cross-origin
640     // resources
641     should_reject: true
642   });
643 }, 'Non-navigation, follow redirect, same-origin mode Request redirected to ' +
644    'no-cors with credentials should fail interception ' +
645    'and response should not be redirected');
646
647 promise_test(function(t) {
648   return redirect_fetch_test(t, {
649     name: 'nonav-follow-sameorigin-redirects-to-cors-creds',
650     redirect_dest: 'cors',
651     url_credentials: true,
652     request_init: {
653       redirect: 'follow',
654       mode: 'same-origin'
655     },
656     // should reject because same-origin requests cannot load cross-origin
657     // resources
658     should_reject: true
659   });
660 }, 'Non-navigation, follow redirect, same-origin mode Request redirected to ' +
661    'cors with credentials should fail interception ' +
662    'and response should not be redirected');
663
664 promise_test(function(t) {
665   return redirect_fetch_test(t, {
666     name: 'nonav-follow-nocors-redirects-to-sameorigin-creds',
667     redirect_dest: 'same-origin',
668     url_credentials: true,
669     expected_type: 'basic',
670     expected_redirected: true,
671     request_init: {
672       redirect: 'follow',
673       mode: 'no-cors'
674     },
675     should_reject: false
676   });
677 }, 'Non-navigation, follow redirect, no-cors mode Request redirected to ' +
678    'same-origin with credentials should succeed interception ' +
679    'and response should be redirected');
680
681 promise_test(function(t) {
682   return redirect_fetch_test(t, {
683     name: 'nonav-follow-nocors-redirects-to-nocors-creds',
684     redirect_dest: 'no-cors',
685     url_credentials: true,
686     expected_type: 'opaque',
687     expected_redirected: false,
688     request_init: {
689       redirect: 'follow',
690       mode: 'no-cors'
691     },
692     should_reject: false
693   });
694 }, 'Non-navigation, follow redirect, no-cors mode Request redirected to ' +
695    'no-cors with credentials should succeed interception ' +
696    'and response should not be redirected');
697
698 promise_test(function(t) {
699   return redirect_fetch_test(t, {
700     name: 'nonav-follow-nocors-redirects-to-cors-creds',
701     redirect_dest: 'cors',
702     url_credentials: true,
703     expected_type: 'opaque',
704     expected_redirected: false,
705     request_init: {
706       redirect: 'follow',
707       mode: 'no-cors'
708     },
709     should_reject: false
710   });
711 }, 'Non-navigation, follow redirect, no-cors mode Request redirected to ' +
712    'cors with credentials should succeed interception ' +
713    'and response should not be redirected');
714
715 promise_test(function(t) {
716   return redirect_fetch_test(t, {
717     name: 'nonav-error-cors-redirects-to-sameorigin-nocreds',
718     redirect_dest: 'same-origin',
719     url_credentials: false,
720     request_init: {
721       redirect: 'error',
722       mode: 'cors'
723     },
724     // should reject because requests with 'error' RequestRedirect cannot be
725     // redirected.
726     should_reject: true
727   });
728 }, 'Non-navigation, error redirect, cors mode Request redirected to ' +
729    'same-origin without credentials should fail interception ' +
730    'and response should not be redirected');
731
732 promise_test(function(t) {
733   return redirect_fetch_test(t, {
734     name: 'nonav-error-cors-redirects-to-nocors-nocreds',
735     redirect_dest: 'no-cors',
736     url_credentials: false,
737     request_init: {
738       redirect: 'error',
739       mode: 'cors'
740     },
741     // should reject because requests with 'error' RequestRedirect cannot be
742     // redirected.
743     should_reject: true
744   });
745 }, 'Non-navigation, error redirect, cors mode Request redirected to ' +
746    'no-cors without credentials should fail interception ' +
747    'and response should not be redirected');
748
749 promise_test(function(t) {
750   return redirect_fetch_test(t, {
751     name: 'nonav-error-cors-redirects-to-cors-nocreds',
752     redirect_dest: 'cors',
753     url_credentials: false,
754     request_init: {
755       redirect: 'error',
756       mode: 'cors'
757     },
758     // should reject because requests with 'error' RequestRedirect cannot be
759     // redirected.
760     should_reject: true
761   });
762 }, 'Non-navigation, error redirect, cors mode Request redirected to ' +
763    'cors without credentials should fail interception ' +
764    'and response should not be redirected');
765
766 promise_test(function(t) {
767   return redirect_fetch_test(t, {
768     name: 'nonav-error-sameorigin-redirects-to-sameorigin-nocreds',
769     redirect_dest: 'same-origin',
770     url_credentials: false,
771     request_init: {
772       redirect: 'error',
773       mode: 'same-origin'
774     },
775     // should reject because requests with 'error' RequestRedirect cannot be
776     // redirected.
777     should_reject: true
778   });
779 }, 'Non-navigation, error redirect, same-origin mode Request redirected to ' +
780    'same-origin without credentials should fail interception ' +
781    'and response should not be redirected');
782
783 promise_test(function(t) {
784   return redirect_fetch_test(t, {
785     name: 'nonav-error-sameorigin-redirects-to-nocors-nocreds',
786     redirect_dest: 'no-cors',
787     url_credentials: false,
788     request_init: {
789       redirect: 'error',
790       mode: 'same-origin'
791     },
792     // should reject because requests with 'error' RequestRedirect cannot be
793     // redirected.
794     should_reject: true
795   });
796 }, 'Non-navigation, error redirect, same-origin mode Request redirected to ' +
797    'no-cors without credentials should fail interception ' +
798    'and response should not be redirected');
799
800 promise_test(function(t) {
801   return redirect_fetch_test(t, {
802     name: 'nonav-error-sameorigin-redirects-to-cors-nocreds',
803     redirect_dest: 'cors',
804     url_credentials: false,
805     request_init: {
806       redirect: 'error',
807       mode: 'same-origin'
808     },
809     // should reject because requests with 'error' RequestRedirect cannot be
810     // redirected.
811     should_reject: true
812   });
813 }, 'Non-navigation, error redirect, same-origin mode Request redirected to ' +
814    'cors without credentials should fail interception ' +
815    'and response should not be redirected');
816
817 promise_test(function(t) {
818   return redirect_fetch_test(t, {
819     name: 'nonav-error-nocors-redirects-to-sameorigin-nocreds',
820     redirect_dest: 'same-origin',
821     url_credentials: false,
822     request_init: {
823       redirect: 'error',
824       mode: 'no-cors'
825     },
826     // should reject because requests with 'error' RequestRedirect cannot be
827     // redirected.
828     should_reject: true
829   });
830 }, 'Non-navigation, error redirect, no-cors mode Request redirected to ' +
831    'same-origin without credentials should fail interception ' +
832    'and response should not be redirected');
833
834 promise_test(function(t) {
835   return redirect_fetch_test(t, {
836     name: 'nonav-error-nocors-redirects-to-nocors-nocreds',
837     redirect_dest: 'no-cors',
838     url_credentials: false,
839     request_init: {
840       redirect: 'error',
841       mode: 'no-cors'
842     },
843     // should reject because requests with 'error' RequestRedirect cannot be
844     // redirected.
845     should_reject: true
846   });
847 }, 'Non-navigation, error redirect, no-cors mode Request redirected to ' +
848    'no-cors without credentials should fail interception ' +
849    'and response should not be redirected');
850
851 promise_test(function(t) {
852   return redirect_fetch_test(t, {
853     name: 'nonav-error-nocors-redirects-to-cors-nocreds',
854     redirect_dest: 'cors',
855     url_credentials: false,
856     request_init: {
857       redirect: 'error',
858       mode: 'no-cors'
859     },
860     // should reject because requests with 'error' RequestRedirect cannot be
861     // redirected.
862     should_reject: true
863   });
864 }, 'Non-navigation, error redirect, no-cors mode Request redirected to ' +
865    'cors without credentials should fail interception ' +
866    'and response should not be redirected');
867
868 promise_test(function(t) {
869   return redirect_fetch_test(t, {
870     name: 'nonav-error-cors-redirects-to-sameorigin-creds',
871     redirect_dest: 'same-origin',
872     url_credentials: true,
873     request_init: {
874       redirect: 'error',
875       mode: 'cors'
876     },
877     // should reject because requests with 'error' RequestRedirect cannot be
878     // redirected.
879     should_reject: true
880   });
881 }, 'Non-navigation, error redirect, cors mode Request redirected to ' +
882    'same-origin with credentials should fail interception ' +
883    'and response should not be redirected');
884
885 promise_test(function(t) {
886   return redirect_fetch_test(t, {
887     name: 'nonav-error-cors-redirects-to-nocors-creds',
888     redirect_dest: 'no-cors',
889     url_credentials: true,
890     request_init: {
891       redirect: 'error',
892       mode: 'cors'
893     },
894     // should reject because requests with 'error' RequestRedirect cannot be
895     // redirected.
896     should_reject: true
897   });
898 }, 'Non-navigation, error redirect, cors mode Request redirected to ' +
899    'no-cors with credentials should fail interception ' +
900    'and response should not be redirected');
901
902 promise_test(function(t) {
903   return redirect_fetch_test(t, {
904     name: 'nonav-error-cors-redirects-to-cors-creds',
905     redirect_dest: 'cors',
906     url_credentials: true,
907     request_init: {
908       redirect: 'error',
909       mode: 'cors'
910     },
911     // should reject because requests with 'error' RequestRedirect cannot be
912     // redirected.
913     should_reject: true
914   });
915 }, 'Non-navigation, error redirect, cors mode Request redirected to ' +
916    'cors with credentials should fail interception ' +
917    'and response should not be redirected');
918
919 promise_test(function(t) {
920   return redirect_fetch_test(t, {
921     name: 'nonav-error-sameorigin-redirects-to-sameorigin-creds',
922     redirect_dest: 'same-origin',
923     url_credentials: true,
924     request_init: {
925       redirect: 'error',
926       mode: 'same-origin'
927     },
928     // should reject because requests with 'error' RequestRedirect cannot be
929     // redirected.
930     should_reject: true
931   });
932 }, 'Non-navigation, error redirect, same-origin mode Request redirected to ' +
933    'same-origin with credentials should fail interception ' +
934    'and response should not be redirected');
935
936 promise_test(function(t) {
937   return redirect_fetch_test(t, {
938     name: 'nonav-error-sameorigin-redirects-to-nocors-creds',
939     redirect_dest: 'no-cors',
940     url_credentials: true,
941     request_init: {
942       redirect: 'error',
943       mode: 'same-origin'
944     },
945     // should reject because requests with 'error' RequestRedirect cannot be
946     // redirected.
947     should_reject: true
948   });
949 }, 'Non-navigation, error redirect, same-origin mode Request redirected to ' +
950    'no-cors with credentials should fail interception ' +
951    'and response should not be redirected');
952
953 promise_test(function(t) {
954   return redirect_fetch_test(t, {
955     name: 'nonav-error-sameorigin-redirects-to-cors-creds',
956     redirect_dest: 'cors',
957     url_credentials: true,
958     request_init: {
959       redirect: 'error',
960       mode: 'same-origin'
961     },
962     // should reject because requests with 'error' RequestRedirect cannot be
963     // redirected.
964     should_reject: true
965   });
966 }, 'Non-navigation, error redirect, same-origin mode Request redirected to ' +
967    'cors with credentials should fail interception ' +
968    'and response should not be redirected');
969
970 promise_test(function(t) {
971   return redirect_fetch_test(t, {
972     name: 'nonav-error-nocors-redirects-to-sameorigin-creds',
973     redirect_dest: 'same-origin',
974     url_credentials: true,
975     request_init: {
976       redirect: 'error',
977       mode: 'no-cors'
978     },
979     // should reject because requests with 'error' RequestRedirect cannot be
980     // redirected.
981     should_reject: true
982   });
983 }, 'Non-navigation, error redirect, no-cors mode Request redirected to ' +
984    'same-origin with credentials should fail interception ' +
985    'and response should not be redirected');
986
987 promise_test(function(t) {
988   return redirect_fetch_test(t, {
989     name: 'nonav-error-nocors-redirects-to-nocors-creds',
990     redirect_dest: 'no-cors',
991     url_credentials: true,
992     request_init: {
993       redirect: 'error',
994       mode: 'no-cors'
995     },
996     // should reject because requests with 'error' RequestRedirect cannot be
997     // redirected.
998     should_reject: true
999   });
1000 }, 'Non-navigation, error redirect, no-cors mode Request redirected to ' +
1001    'no-cors with credentials should fail interception ' +
1002    'and response should not be redirected');
1003
1004 promise_test(function(t) {
1005   return redirect_fetch_test(t, {
1006     name: 'nonav-error-nocors-redirects-to-cors-creds',
1007     redirect_dest: 'cors',
1008     url_credentials: true,
1009     request_init: {
1010       redirect: 'error',
1011       mode: 'no-cors'
1012     },
1013     // should reject because requests with 'error' RequestRedirect cannot be
1014     // redirected.
1015     should_reject: true
1016   });
1017 }, 'Non-navigation, error redirect, no-cors mode Request redirected to ' +
1018    'cors with credentials should fail interception and response should not ' +
1019    'be redirected');
1020 </script>
1021 </body>