fetch redirect is incompatible with "no-cors" mode
[WebKit-https.git] / LayoutTests / imported / w3c / web-platform-tests / fetch / api / redirect / redirect-mode.js
1 if (this.document === undefined) {
2   importScripts("/resources/testharness.js");
3   importScripts("/common/get-host-info.sub.js")
4 }
5
6 function redirectMode(desc, redirectUrl, redirectLocation, redirectStatus, redirectMode, corsMode) {
7   var url = redirectUrl;
8   var urlParameters = "?redirect_status=" + redirectStatus;
9   urlParameters += "&location=" + encodeURIComponent(redirectLocation);
10
11   var requestInit = {"redirect": redirectMode, mode: corsMode};
12
13   promise_test(function(test) {
14     if (redirectMode === "error" || (corsMode === "no-cors" && redirectMode !== "follow"))
15       return promise_rejects(test, new TypeError(), fetch(url + urlParameters, requestInit));
16     if (redirectMode === "manual")
17       return fetch(url + urlParameters, requestInit).then(function(resp) {
18         assert_equals(resp.status, 0, "Response's status is 0");
19         assert_equals(resp.type, "opaqueredirect", "Response's type is opaqueredirect");
20         assert_equals(resp.statusText, "", "Response's statusText is \"\"");
21         assert_equals(resp.url, url + urlParameters, "Response URL should be the original one");
22       });
23     if (redirectMode === "follow")
24       return fetch(url + urlParameters, requestInit).then(function(resp) {
25         assert_true(new URL(resp.url).pathname.endsWith(locationUrl), "Response's url should be the redirected one");
26         assert_equals(resp.status, 200, "Response's status is 200");
27       });
28     assert_unreached(redirectMode + " is no a valid redirect mode");
29   }, desc);
30 }
31
32 var redirUrl = get_host_info().HTTP_ORIGIN + "/fetch/api/resources/redirect.py";
33 var locationUrl = "top.txt";
34
35 for (var statusCode of [301, 302, 303, 307, 308]) {
36   redirectMode("Redirect " + statusCode + " in \"error\" redirect, cors mode", redirUrl, locationUrl, statusCode, "error", "cors");
37   redirectMode("Redirect " + statusCode + " in \"follow\" redirect, cors mode", redirUrl, locationUrl, statusCode, "follow", "cors");
38   redirectMode("Redirect " + statusCode + " in \"manual\" redirect, cors mode", redirUrl, locationUrl, statusCode, "manual", "cors");
39 }
40 redirectMode("Redirect in \"error\" redirect, no cors mode", redirUrl, locationUrl, 301, "error", "no-cors");
41 redirectMode("Redirect in \"manual\" redirect, no cors mode", redirUrl, locationUrl, 301, "manual", "no-cors");
42
43 done();