<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Request idl interface</title>
    <meta name="help" href="https://fetch.spec.whatwg.org/#response">
    <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>
    <script src="/resources/WebIDLParser.js"></script>
    <script src="/resources/idlharness.js"></script>
  </head>
  <body>
    <script id="body-idl" type="text/plain">
      typedef any JSON;
      typedef (Blob or BufferSource or FormData or URLSearchParams or USVString) BodyInit;

      [NoInterfaceObject,
      Exposed=(Window,Worker)]
      interface Body {
        readonly attribute ReadableStream? body;
        readonly attribute boolean bodyUsed;
        [NewObject] Promise<ArrayBuffer> arrayBuffer();
        [NewObject] Promise<Blob> blob();
        [NewObject] Promise<FormData> formData();
        [NewObject] Promise<JSON> json();
        [NewObject] Promise<USVString> text();
      };
    </script>
    <script id="request-idl" type="text/plain">
      typedef (Request or USVString) RequestInfo;

      [Constructor(RequestInfo input, optional RequestInit init),
      Exposed=(Window,Worker)]
      interface Request {
        readonly attribute ByteString method;
        readonly attribute USVString url;
        [SameObject] readonly attribute Headers headers;

        readonly attribute RequestType type;
        readonly attribute RequestDestination destination;
        readonly attribute USVString referrer;
        readonly attribute ReferrerPolicy referrerPolicy;
        readonly attribute RequestMode mode;
        readonly attribute RequestCredentials credentials;
        readonly attribute RequestCache cache;
        readonly attribute RequestRedirect redirect;
        readonly attribute DOMString integrity;

        [NewObject] Request clone();
      };
      Request implements Body;

      dictionary RequestInit {
        ByteString method;
        HeadersInit headers;
        BodyInit? body;
        USVString referrer;
        ReferrerPolicy referrerPolicy;
        RequestMode mode;
        RequestCredentials credentials;
        RequestCache cache;
        RequestRedirect redirect;
        DOMString integrity;
        any window; // can only be set to null
      };

      enum RequestType { "", "audio", "font", "image", "script", "style", "track", "video" };
      enum RequestDestination { "", "document", "sharedworker", "subresource", "unknown", "worker" };
      enum RequestMode { "navigate", "same-origin", "no-cors", "cors" };
      enum RequestCredentials { "omit", "same-origin", "include" };
      enum RequestCache { "default", "no-store", "reload", "no-cache", "force-cache", "only-if-cached" };
      enum RequestRedirect { "follow", "error", "manual" };
      enum ReferrerPolicy {
        "", "no-referrer", "no-referrer-when-downgrade", "origin",
        "origin-when-cross-origin", "unsafe-url", "same-origin", "strict-origin",
        "strict-origin-when-cross-origin"
      };
    </script>
    <script>
      var idlsArray = new IdlArray();
      var idl = document.getElementById("body-idl").textContent
      idl += document.getElementById("request-idl").textContent

      idlsArray.add_idls(idl);
      idlsArray.add_untested_idls("interface Headers {};");
      idlsArray.add_objects({ Request: ['new Request("")'] });
      idlsArray.test();
    </script>
  </body>
</html>
