<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Request disturbed</title>
    <meta name="help" href="https://fetch.spec.whatwg.org/#request">
    <meta name="help" href="https://fetch.spec.whatwg.org/#body-mixin">
    <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 initValuesDict = {"method" : "POST",
                            "body" : "Request's body"
      };

      var noBodyConsumed = new Request("");
      var bodyConsumed = new Request("", initValuesDict);

      test(() => {
        assert_equals(noBodyConsumed.body, null, "body's default value is null");
        assert_false(noBodyConsumed.bodyUsed , "bodyUsed is false when request is not disturbed");
        assert_not_equals(bodyConsumed.body, null, "non-null body");
        assert_true(bodyConsumed.body instanceof ReadableStream, "non-null body type");
        assert_false(noBodyConsumed.bodyUsed, "bodyUsed is false when request is not disturbed");
      }, "Request's body: initial state");

      noBodyConsumed.blob();
      bodyConsumed.blob();

      test(function() {
        assert_false(noBodyConsumed.bodyUsed , "bodyUsed is false when request is not disturbed");
        try {
          noBodyConsumed.clone();
        } catch (e) {
          assert_unreached("Can use request not disturbed for creating or cloning request");
        }
      }, "Request without body cannot be disturbed");

      test(function() {
        assert_true(bodyConsumed.bodyUsed , "bodyUsed is true when request is disturbed");
        assert_throws(new TypeError(), function() { bodyConsumed.clone(); });
      }, "Check cloning a disturbed request");

      test(function() {
        assert_true(bodyConsumed.bodyUsed , "bodyUsed is true when request is disturbed");
        assert_throws(new TypeError(), function() { new Request(bodyConsumed); });
      }, "Check creating a new request from a disturbed request");

      promise_test(function() {
        var bodyRequest = new Request("", initValuesDict);
        const originalBody = bodyRequest.body;
        assert_false(bodyRequest.bodyUsed , "bodyUsed is false when request is not disturbed");
        var requestFromRequest = new Request(bodyRequest);
        assert_true(bodyRequest.bodyUsed , "bodyUsed is true when request is disturbed");
        assert_equals(bodyRequest.body, originalBody, "body should not change");
        assert_not_equals(originalBody, undefined, "body should not be undefined");
        assert_not_equals(originalBody, null, "body should not be null");
        assert_not_equals(requestFromRequest.body, originalBody, "new request's body is new");
        return requestFromRequest.text(text => {
          assert_equals(text, "Request's body");
        });
      }, "Input request used for creating new request became disturbed");

      promise_test(() => {
        const bodyRequest = new Request("", initValuesDict);
        const originalBody = bodyRequest.body;
        assert_false(bodyRequest.bodyUsed , "bodyUsed is false when request is not disturbed");
        const requestFromRequest = new Request(bodyRequest, { body : "init body" });
        assert_true(bodyRequest.bodyUsed , "bodyUsed is true when request is disturbed");
        assert_equals(bodyRequest.body, originalBody, "body should not change");
        assert_not_equals(originalBody, undefined, "body should not be undefined");
        assert_not_equals(originalBody, null, "body should not be null");
        assert_not_equals(requestFromRequest.body, originalBody, "new request's body is new");

        return requestFromRequest.text(text => {
          assert_equals(text, "init body");
        });
      }, "Input request used for creating new request became disturbed even if body is not used");

      promise_test(function(test) {
        assert_true(bodyConsumed.bodyUsed , "bodyUsed is true when request is disturbed");
        return promise_rejects(test, new TypeError(), bodyConsumed.blob());
      }, "Check consuming a disturbed request");

      test(function() {
        var req = new Request(URL, {method: 'POST', body: 'hello'});
        assert_false(req.bodyUsed,
                     'Request should not be flagged as used if it has not been ' +
                     'consumed.');
        assert_throws(new TypeError(),
          function() { new Request(req, {method: 'GET'}); },
          'A get request may not have body.');

        assert_false(req.bodyUsed, 'After the GET case');

        assert_throws(new TypeError(),
          function() { new Request(req, {method: 'CONNECT'}); },
          'Request() with a forbidden method must throw.');

        assert_false(req.bodyUsed, 'After the forbidden method case');

        var req2 = new Request(req);
        assert_true(req.bodyUsed,
                    'Request should be flagged as used if it has been consumed.');
      }, 'Request construction failure should not set "bodyUsed"');
    </script>
  </body>
</html>
