@@ -151,17 +151,71 @@ MOZ_MUST_USE bool js::WritableStreamStartErroring(
151151 return false ;
152152}
153153
154+ #ifdef DEBUG
155+ static bool WritableStreamHasOperationMarkedInFlight (
156+ const WritableStream* unwrappedStream);
157+ #endif
158+
154159/* *
155160 * Streams spec, 4.4.4.
156161 * WritableStreamFinishErroring ( stream )
157162 */
158163MOZ_MUST_USE bool js::WritableStreamFinishErroring (
159164 JSContext* cx, Handle<WritableStream*> unwrappedStream) {
165+ // Step 1: Assert: stream.[[state]] is "erroring".
166+ MOZ_ASSERT (unwrappedStream->erroring ());
167+
168+ // Step 2: Assert: ! WritableStreamHasOperationMarkedInFlight(stream) is
169+ // false.
170+ MOZ_ASSERT (!WritableStreamHasOperationMarkedInFlight (unwrappedStream));
171+
172+ // Step 3: Set stream.[[state]] to "errored".
173+ unwrappedStream->setErrored ();
174+
175+ // Step 4: Perform ! stream.[[writableStreamController]].[[ErrorSteps]]().
176+ // Step 5: Let storedError be stream.[[storedError]].
177+ // Step 6: Repeat for each writeRequest that is an element of
178+ // stream.[[writeRequests]],
179+ // a: Reject writeRequest with storedError.
180+ // Step 7: Set stream.[[writeRequests]] to an empty List.
181+ // Step 8: If stream.[[pendingAbortRequest]] is undefined,
182+ // a: Perform ! WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream).
183+ // b: Return.
184+ // Step 9: Let abortRequest be stream.[[pendingAbortRequest]].
185+ // Step 10: Set stream.[[pendingAbortRequest]] to undefined.
186+ // Step 11: If abortRequest.[[wasAlreadyErroring]] is true,
187+ // a: Reject abortRequest.[[promise]] with storedError.
188+ // b: Perform ! WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream).
189+ // c: Return.
190+ // Step 12: Let promise be
191+ // ! stream.[[writableStreamController]].[[AbortSteps]](
192+ // abortRequest.[[reason]]).
193+ // Step 13: Upon fulfillment of promise,
194+ // a: Resolve abortRequest.[[promise]] with undefined.
195+ // b: Perform ! WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream).
196+ // Step 14: Upon rejection of promise with reason reason,
197+ // c: Reject abortRequest.[[promise]] with reason.
198+ // d: Perform ! WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream).
160199 // XXX jwalden flesh me out!
161200 JS_ReportErrorASCII (cx, " epic fail" );
162201 return false ;
163202}
164203
204+ #ifdef DEBUG
205+ /* *
206+ * Streams spec, 4.4.10.
207+ * WritableStreamHasOperationMarkedInFlight ( stream )
208+ */
209+ bool WritableStreamHasOperationMarkedInFlight (
210+ const WritableStream* unwrappedStream) {
211+ // Step 1: If stream.[[inFlightWriteRequest]] is undefined and
212+ // controller.[[inFlightCloseRequest]] is undefined, return false.
213+ // Step 2: Return true.
214+ return unwrappedStream->haveInFlightWriteRequest () ||
215+ unwrappedStream->haveInFlightCloseRequest ();
216+ }
217+ #endif // DEBUG
218+
165219/* *
166220 * Streams spec, 4.4.14.
167221 * WritableStreamUpdateBackpressure ( stream, backpressure )
0 commit comments