<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Response consume blob and http bodies</title>
    <meta name="help" href="https://fetch.spec.whatwg.org/#response">
    <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 src="../resources/utils.js"></script>
    <script>
promise_test(function(test) {
    return new Response(new Blob([], { "type" : "text/plain" })).body.cancel();
}, "Cancelling a starting blob Response stream");

promise_test(function(test) {
    var response = new Response(new Blob(["This is data"], { "type" : "text/plain" }));
    var reader = response.body.getReader();
    reader.read();
    return reader.cancel();
}, "Cancelling a loading blob Response stream");

promise_test(function(test) {
    var response = new Response(new Blob(["T"], { "type" : "text/plain" }));
    var reader = response.body.getReader();

    var closedPromise = reader.closed.then(function() {
        return reader.cancel();
    });
    reader.read().then(function readMore({done, value}) {
      if (!done) return reader.read().then(readMore);
    });
    return closedPromise;
}, "Cancelling a closed blob Response stream");

promise_test(function(test) {
    return fetch(RESOURCES_DIR + "trickle.py?ms=30&count=100").then(function(response) {
        return response.body.cancel();
    });
}, "Cancelling a starting Response stream");

promise_test(function() {
    return fetch(RESOURCES_DIR + "trickle.py?ms=30&count=100").then(function(response) {
        var reader = response.body.getReader();
        return reader.read().then(function() {
            return reader.cancel();
        });
    });
}, "Cancelling a loading Response stream");

promise_test(function() {
    async function readAll(reader) {
      while (true) {
        const {value, done} = await reader.read();
        if (done)
          return;
      }
    }

    return fetch(RESOURCES_DIR + "top.txt").then(function(response) {
        var reader = response.body.getReader();
        return readAll(reader).then(() => reader.cancel());
    });
}, "Cancelling a closed Response stream");
    </script>
  </body>
</html>
