Bug 1582348 - Implement |WritableStreamDefaultWriterRelease|. r=arai

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

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Jeff Walden 2019-11-05 05:10:14 +00:00
parent fa982c9e33
commit 331487beaa
3 changed files with 82 additions and 0 deletions

View File

@ -113,6 +113,20 @@ JSObject* js::WritableStreamDefaultWriterClose(
return promise;
}
/**
* Streams spec, 4.6.5.
* WritableStreamDefaultWriterEnsureClosedPromiseRejected( writer, error )
*/
MOZ_MUST_USE bool js::WritableStreamDefaultWriterEnsureClosedPromiseRejected(
JSContext* cx, Handle<WritableStreamDefaultWriter*> unwrappedWriter,
Handle<Value> error) {
cx->check(error);
// XXX jwalden flesh me out!
JS_ReportErrorASCII(cx, "epic fail");
return false;
}
/**
* Streams spec, 4.6.6.
* WritableStreamDefaultWriterEnsureReadyPromiseRejected( writer, error )
@ -161,6 +175,66 @@ bool js::WritableStreamDefaultWriterGetDesiredSize(
return true;
}
/**
* Streams spec, 4.6.8.
* WritableStreamDefaultWriterRelease ( writer )
*/
bool js::WritableStreamDefaultWriterRelease(
JSContext* cx, Handle<WritableStreamDefaultWriter*> unwrappedWriter) {
// Step 1: Let stream be writer.[[ownerWritableStream]].
// Step 2: Assert: stream is not undefined.
MOZ_ASSERT(unwrappedWriter->hasStream());
Rooted<WritableStream*> unwrappedStream(
cx, UnwrapStreamFromWriter(cx, unwrappedWriter));
if (!unwrappedStream) {
return false;
}
// Step 3: Assert: stream.[[writer]] is writer.
#ifdef DEBUG
{
WritableStreamDefaultWriter* unwrappedStreamWriter =
UnwrapWriterFromStream(cx, unwrappedStream);
if (!unwrappedStreamWriter) {
return false;
}
MOZ_ASSERT(unwrappedStreamWriter == unwrappedWriter);
}
#endif
// Step 4: Let releasedError be a new TypeError.
Rooted<Value> releasedError(cx);
JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr,
JSMSG_WRITABLESTREAM_CANT_RELEASE_ALREADY_CLOSED);
if (!cx->isExceptionPending() || !cx->getPendingException(&releasedError)) {
return false;
}
// Step 5: Perform
// ! WritableStreamDefaultWriterEnsureReadyPromiseRejected(
// writer, releasedError).
if (!WritableStreamDefaultWriterEnsureReadyPromiseRejected(
cx, unwrappedWriter, releasedError)) {
return false;
}
// Step 6: Perform
// ! WritableStreamDefaultWriterEnsureClosedPromiseRejected(
// writer, releasedError).
if (!WritableStreamDefaultWriterEnsureClosedPromiseRejected(
cx, unwrappedWriter, releasedError)) {
return false;
}
// Step 7: Set stream.[[writer]] to undefined.
unwrappedStream->clearWriter();
// Step 8: Set writer.[[ownerWritableStream]] to undefined.
unwrappedWriter->clearStream();
return true;
}
/**
* Streams spec, 4.6.9.
* WritableStreamDefaultWriterWrite ( writer, chunk )

View File

@ -24,6 +24,10 @@ class WritableStreamDefaultWriter;
extern JSObject* WritableStreamDefaultWriterClose(
JSContext* cx, JS::Handle<WritableStreamDefaultWriter*> unwrappedWriter);
extern MOZ_MUST_USE bool WritableStreamDefaultWriterEnsureClosedPromiseRejected(
JSContext* cx, JS::Handle<WritableStreamDefaultWriter*> unwrappedWriter,
JS::Handle<JS::Value> error);
extern MOZ_MUST_USE bool WritableStreamDefaultWriterEnsureReadyPromiseRejected(
JSContext* cx, JS::Handle<WritableStreamDefaultWriter*> unwrappedWriter,
JS::Handle<JS::Value> error);
@ -32,6 +36,9 @@ extern MOZ_MUST_USE bool WritableStreamDefaultWriterGetDesiredSize(
JSContext* cx, JS::Handle<WritableStreamDefaultWriter*> unwrappedWriter,
JS::MutableHandle<JS::Value> size);
extern MOZ_MUST_USE bool WritableStreamDefaultWriterRelease(
JSContext* cx, JS::Handle<WritableStreamDefaultWriter*> unwrappedWriter);
extern JSObject* WritableStreamDefaultWriterWrite(
JSContext* cx, JS::Handle<WritableStreamDefaultWriter*> unwrappedWriter,
JS::Handle<JS::Value> chunk);

View File

@ -691,6 +691,7 @@ MSG_DEF(JSMSG_WRITABLESTREAM_RELEASED_DURING_WRITE, 0, JSEXN_TYPEERR, "writ
MSG_DEF(JSMSG_WRITABLESTREAM_WRITE_CLOSING_OR_CLOSED, 0, JSEXN_TYPEERR, "can't write to a stream that's currently closing or already closed")
MSG_DEF(JSMSG_CANT_ABORT_LOCKED_WRITABLESTREAM, 0, JSEXN_TYPEERR, "can't abort a WritableStream that's locked to a writer")
MSG_DEF(JSMSG_WRITABLESTREAM_CLOSE_CLOSING_OR_CLOSED, 0, JSEXN_TYPEERR, "can't close a stream that's currently closing or already closed")
MSG_DEF(JSMSG_WRITABLESTREAM_CANT_RELEASE_ALREADY_CLOSED,0, JSEXN_TYPEERR, "writer has already been released and can't be closed")
MSG_DEF(JSMSG_READABLESTREAM_NYI, 0, JSEXN_ERR, "full WritableStream support is not yet implemented")
// Other Stream-related