Skip to content
This repository was archived by the owner on Jul 9, 2025. It is now read-only.

Commit 039df65

Browse files
committed
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
1 parent 24ee6d1 commit 039df65

2 files changed

Lines changed: 55 additions & 0 deletions

File tree

js/src/builtin/streams/WritableStream.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ class WritableStream : public NativeObject {
189189
void setErroring() { setState(Erroring); }
190190

191191
bool errored() const { return state() == Errored; }
192+
void setErrored() { setState(Errored); }
192193

193194
bool backpressure() const { return flags() & Backpressure; }
194195

js/src/builtin/streams/WritableStreamOperations.cpp

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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
*/
158163
MOZ_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

Comments
 (0)