Bug 1582348 - Fill out some of the body of |WritableStreamFinishErroring|. r=arai

Differential Revision: https://phabricator.services.mozilla.com/D46407

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Jeff Walden 2019-09-28 03:17:00 +00:00
parent 24ee6d180d
commit 039df65b0c
2 changed files with 55 additions and 0 deletions

View File

@ -189,6 +189,7 @@ class WritableStream : public NativeObject {
void setErroring() { setState(Erroring); }
bool errored() const { return state() == Errored; }
void setErrored() { setState(Errored); }
bool backpressure() const { return flags() & Backpressure; }

View File

@ -151,17 +151,71 @@ MOZ_MUST_USE bool js::WritableStreamStartErroring(
return false;
}
#ifdef DEBUG
static bool WritableStreamHasOperationMarkedInFlight(
const WritableStream* unwrappedStream);
#endif
/**
* Streams spec, 4.4.4.
* WritableStreamFinishErroring ( stream )
*/
MOZ_MUST_USE bool js::WritableStreamFinishErroring(
JSContext* cx, Handle<WritableStream*> unwrappedStream) {
// Step 1: Assert: stream.[[state]] is "erroring".
MOZ_ASSERT(unwrappedStream->erroring());
// Step 2: Assert: ! WritableStreamHasOperationMarkedInFlight(stream) is
// false.
MOZ_ASSERT(!WritableStreamHasOperationMarkedInFlight(unwrappedStream));
// Step 3: Set stream.[[state]] to "errored".
unwrappedStream->setErrored();
// Step 4: Perform ! stream.[[writableStreamController]].[[ErrorSteps]]().
// Step 5: Let storedError be stream.[[storedError]].
// Step 6: Repeat for each writeRequest that is an element of
// stream.[[writeRequests]],
// a: Reject writeRequest with storedError.
// Step 7: Set stream.[[writeRequests]] to an empty List.
// Step 8: If stream.[[pendingAbortRequest]] is undefined,
// a: Perform ! WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream).
// b: Return.
// Step 9: Let abortRequest be stream.[[pendingAbortRequest]].
// Step 10: Set stream.[[pendingAbortRequest]] to undefined.
// Step 11: If abortRequest.[[wasAlreadyErroring]] is true,
// a: Reject abortRequest.[[promise]] with storedError.
// b: Perform ! WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream).
// c: Return.
// Step 12: Let promise be
// ! stream.[[writableStreamController]].[[AbortSteps]](
// abortRequest.[[reason]]).
// Step 13: Upon fulfillment of promise,
// a: Resolve abortRequest.[[promise]] with undefined.
// b: Perform ! WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream).
// Step 14: Upon rejection of promise with reason reason,
// c: Reject abortRequest.[[promise]] with reason.
// d: Perform ! WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream).
// XXX jwalden flesh me out!
JS_ReportErrorASCII(cx, "epic fail");
return false;
}
#ifdef DEBUG
/**
* Streams spec, 4.4.10.
* WritableStreamHasOperationMarkedInFlight ( stream )
*/
bool WritableStreamHasOperationMarkedInFlight(
const WritableStream* unwrappedStream) {
// Step 1: If stream.[[inFlightWriteRequest]] is undefined and
// controller.[[inFlightCloseRequest]] is undefined, return false.
// Step 2: Return true.
return unwrappedStream->haveInFlightWriteRequest() ||
unwrappedStream->haveInFlightCloseRequest();
}
#endif // DEBUG
/**
* Streams spec, 4.4.14.
* WritableStreamUpdateBackpressure ( stream, backpressure )