aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/writablestreamdefaultwriter.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/writablestreamdefaultwriter.rs')
-rw-r--r--components/script/dom/writablestreamdefaultwriter.rs48
1 files changed, 47 insertions, 1 deletions
diff --git a/components/script/dom/writablestreamdefaultwriter.rs b/components/script/dom/writablestreamdefaultwriter.rs
index 99cda7e365b..60aab9598cc 100644
--- a/components/script/dom/writablestreamdefaultwriter.rs
+++ b/components/script/dom/writablestreamdefaultwriter.rs
@@ -263,7 +263,7 @@ impl WritableStreamDefaultWriter {
}
/// <https://streams.spec.whatwg.org/#writable-stream-default-writer-write>
- fn write(
+ pub(crate) fn write(
&self,
cx: SafeJSContext,
global: &GlobalScope,
@@ -377,6 +377,52 @@ impl WritableStreamDefaultWriter {
// Set this.[[stream]] to undefined.
self.stream.set(None);
}
+
+ /// <https://streams.spec.whatwg.org/#writable-stream-default-writer-close-with-error-propagation>
+ pub(crate) fn close_with_error_propagation(
+ &self,
+ cx: SafeJSContext,
+ global: &GlobalScope,
+ can_gc: CanGc,
+ ) -> Rc<Promise> {
+ // Let stream be writer.[[stream]].
+ let Some(stream) = self.stream.get() else {
+ // Assert: stream is not undefined.
+ unreachable!("Stream should be set.");
+ };
+
+ // Let state be stream.[[state]].
+ // Used via stream method calls.
+
+ // If ! WritableStreamCloseQueuedOrInFlight(stream) is true
+ // or state is "closed",
+ if stream.close_queued_or_in_flight() || stream.is_closed() {
+ // return a promise resolved with undefined.
+ let promise = Promise::new(global, can_gc);
+ promise.resolve_native(&(), can_gc);
+ return promise;
+ }
+
+ // If state is "errored",
+ if stream.is_errored() {
+ // return a promise rejected with stream.[[storedError]].
+ rooted!(in(*cx) let mut error = UndefinedValue());
+ stream.get_stored_error(error.handle_mut());
+ let promise = Promise::new(global, can_gc);
+ promise.reject_native(&error.handle(), can_gc);
+ return promise;
+ }
+
+ // Assert: state is "writable" or "erroring".
+ assert!(stream.is_writable() || stream.is_erroring());
+
+ // Return ! WritableStreamDefaultWriterClose(writer).
+ self.close(cx, global, can_gc)
+ }
+
+ pub(crate) fn get_stream(&self) -> Option<DomRoot<WritableStream>> {
+ self.stream.get()
+ }
}
impl WritableStreamDefaultWriterMethods<crate::DomTypeHolder> for WritableStreamDefaultWriter {