<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Response Receives Propagated Error from ReadableStream</title>
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
  </head>
  <body>
    <script>
      function CustomTestError() {
        const error = Error();
        error.name = 'custom-test-error';
        return error;
      }

      function newStreamWithStartError() {
        return new ReadableStream({
          start(controller) {
            controller.error(CustomTestError());
          }
        })
      }

      function newStreamWithPullError() {
        return new ReadableStream({
          pull(controller) {
            controller.error(CustomTestError());
          }
        })
      }

      function runRequestPromiseTest(stream, responseReaderMethod, testDescription) {
        promise_test(test => {
          return promise_rejects(
            test,
            CustomTestError(),
            new Response(stream)[responseReaderMethod](),
            'CustomTestError should propagate'
          )
        }, testDescription)
      }


      promise_test(test => {
        return promise_rejects(test, CustomTestError(), newStreamWithStartError().getReader().read(), 'CustomTestError should propagate')
      }, "ReadableStreamDefaultReader Promise receives ReadableStream start() Error")

      promise_test(test => {
        return promise_rejects(test, CustomTestError(), newStreamWithPullError().getReader().read(), 'CustomTestError should propagate')
      }, "ReadableStreamDefaultReader Promise receives ReadableStream pull() Error")


      // test start() errors for all Body reader methods
      runRequestPromiseTest(newStreamWithStartError(), 'arrayBuffer', 'ReadableStream start() Error propagates to Response.arrayBuffer() Promise');
      runRequestPromiseTest(newStreamWithStartError(), 'blob',        'ReadableStream start() Error propagates to Response.blob() Promise');
      runRequestPromiseTest(newStreamWithStartError(), 'formData',    'ReadableStream start() Error propagates to Response.formData() Promise');
      runRequestPromiseTest(newStreamWithStartError(), 'json',        'ReadableStream start() Error propagates to Response.json() Promise');
      runRequestPromiseTest(newStreamWithStartError(), 'text',        'ReadableStream start() Error propagates to Response.text() Promise');

      // test pull() errors for all Body reader methods
      runRequestPromiseTest(newStreamWithPullError(), 'arrayBuffer', 'ReadableStream pull() Error propagates to Response.arrayBuffer() Promise');
      runRequestPromiseTest(newStreamWithPullError(), 'blob',        'ReadableStream pull() Error propagates to Response.blob() Promise');
      runRequestPromiseTest(newStreamWithPullError(), 'formData',    'ReadableStream pull() Error propagates to Response.formData() Promise');
      runRequestPromiseTest(newStreamWithPullError(), 'json',        'ReadableStream pull() Error propagates to Response.json() Promise');
      runRequestPromiseTest(newStreamWithPullError(), 'text',        'ReadableStream pull() Error propagates to Response.text() Promise');
    </script>
  </body>
</html>
