<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Request init: simple cases</title>
    <meta name="help" href="https://fetch.spec.whatwg.org/#request">
    <meta name="author" title="Canon Research France" href="https://www.crf.canon.fr">
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
  </head>
  <body>
    <script>
      var methods = {"givenValues" : ["GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS", "head"],
                     "expectedValues" : ["GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS", "HEAD"]
      };
      var referrers = {"givenValues" : ["/relative/ressource",
                                        "http://{{host}}:{{ports[http][0]}}/relative/ressource?query=true#fragment",
                                        "http://{{host}}:{{ports[http][0]}}/",
                                        "http://test.url",
                                        "about:client",
                                        ""
                                       ],
                       "expectedValues" : ["http://{{host}}:{{ports[http][0]}}/relative/ressource",
                                           "http://{{host}}:{{ports[http][0]}}/relative/ressource?query=true#fragment",
                                           "http://{{host}}:{{ports[http][0]}}/",
                                           "about:client",
                                           "about:client",
                                           ""
                                          ]
      };
      var referrerPolicies = {"givenValues" : [ "",
                                                "no-referrer",
                                                "no-referrer-when-downgrade",
                                                "origin",
                                                "origin-when-cross-origin",
                                                "unsafe-url",
                                                "same-origin",
                                                "strict-origin",
                                                "strict-origin-when-cross-origin"
                                              ],
                              "expectedValues" : ["",
                                                  "no-referrer",
                                                  "no-referrer-when-downgrade",
                                                  "origin",
                                                  "origin-when-cross-origin",
                                                  "unsafe-url",
                                                  "same-origin",
                                                  "strict-origin",
                                                  "strict-origin-when-cross-origin"
                                                  ]
      };
      // Allow 'navigate' to be passed in as a valid mode to requestInit. This is
      // necessary since Request is a polyfill and there is no other way to set
      // mode to 'navigate'.
      var modes = {"givenValues" : ["same-origin", "no-cors", "cors", "navigate"],
                   "expectedValues" : ["same-origin", "no-cors", "cors", "navigate"]
      };
      var credentials = {"givenValues" : ["omit", "same-origin", "include"],
                          "expectedValues" : ["omit", "same-origin", "include"]
      };
      var caches = {"givenValues" : [ "default", "no-store", "reload", "no-cache", "force-cache"],
                    "expectedValues" : [ "default", "no-store", "reload", "no-cache", "force-cache"]
      };
      var redirects = {"givenValues" : ["follow", "error", "manual"],
                       "expectedValues" : ["follow", "error", "manual"]
      };
      var integrities = {"givenValues" : ["", "AZERTYUIOP1234567890" ],
                         "expectedValues" : ["", "AZERTYUIOP1234567890"]
      };

      //there is no getter for window, init's window might be null
      var windows = {"givenValues" : [ null ],
                     "expectedValues" : [undefined]
      };

      var initValuesDict = { "method" : methods,
                             // Referrer is not supported due to privacy concerns.
                             //"referrer" : referrers,
                             //"referrerPolicy" : referrerPolicies,
                             "mode" : modes,
                             "credentials" : credentials,
                             "cache" : caches,
                             "redirect" : redirects,
                             "integrity" : integrities,
                             "window" : windows
      };

      for (var attributeName in initValuesDict) {
        var valuesToTest = initValuesDict[attributeName];
        for (var valueIdx in valuesToTest["givenValues"]) {
          var givenValue = valuesToTest["givenValues"][valueIdx];
          var expectedValue = valuesToTest["expectedValues"][valueIdx];
          test(function() {
            var requestInit = {};
            requestInit[attributeName] = givenValue
            var request = new Request("", requestInit);
            assert_equals(request[attributeName], expectedValue,
              "Expect request's " + attributeName + " is " + expectedValue + " when initialized with " + givenValue);
          }, "Check " + attributeName + " init value of " + givenValue + " and associated getter");
        }
      }
    </script>
  </body>
</html>
