mirror of
https://github.com/servo/servo.git
synced 2025-08-06 14:10:11 +01:00
dom: Implement WritableStream
(#34844)
* add basic interface for writable stream Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * add stubs for pipeTo and pipeThrough methods Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * add stubs for writable stream defautl writer Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * add stubs for writable stream controller Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * add underlying source dict Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * add underlying source dict Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * implement constructor Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * implement init writable stream Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * impl setup default controller Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * implement controller setup Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * implement controller advance queue if neededd Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * implement stream finish erroring Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * implement stream reject close and closed promise if needed Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * finish implementation of stream finish erroring Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * call into controller setup from stream constructor Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * implement stream mark first write request in flight Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * implement controller process write Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * call into advance queue if needed at various points Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * implement stream deal with rejection, use from_safe_context Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * implement controller clear algorithms Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * remove unused todo Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * implement stream start erroring Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * finish writer ensure ready promise rejected Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * implement stream finish in flight write request Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * implement write constructor and setup Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * implement controller error Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * remove unnecessary unsafe code Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * finish implementing process write Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * implement close sentinel Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * implement public locked Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * implement stream abort Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * implement stream close Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * implement controller close Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * fix use of crown Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * remove unnecessary options around writer promises Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * implement writer get desired size Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * implement writer ready Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * implement writer abort Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * implement writer close Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * implement writer release lock Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * implement writer public write Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * implement private writer write Uses ai Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * implement writer release. Uses ai Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * impl controller process close Uses ai Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * finish controller process close Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * root promise handlers Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * handler errors in stream and writer constructor finish implementation of stream finish in flight close Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * fix warnings Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * implement controller get chunk size Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * tidy the webidls Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * implement stream get writer Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * fix assertion of stream state when advancing queue if needed Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * add docs for value with size Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * use reject_error in abort Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * remove unnecessary allowances of unsafe code Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * turn writable-streams test suite on Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * update encodings test expectations Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * properly check if type is set on sink in stream constructor Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * fix double borrow in controller advance queue if needed Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * make the queue aware of the close sentinel when dequeuing a value Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * fix assertion of no backpressure in update backpressure Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * also clear strategy size when clearing algorithms Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * remove this object arg when calling into strategy size Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * fix has operations marked in flight Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * fix typo in has in flight write request Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * turn error into no-op when aborting a stream, if the stream is closed or errored. Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * fix error handling of calling into abort algorithm Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * fix error handling of calling into close and write algorithms Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * fix double borrow on queue fix logic in update_backpressure fix logic in get_desired_size fix logic in writer setup Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * update test expectations for aborting suite Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * fix controller get_backpressure Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * fix clippy Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * update test expectations to expect errors in tests using unsupported apis Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * fix error handling of calling into start algo in controller setup Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * update test expectations for test checking for undefined this in strategy size call Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * update test expectation to timeout for response-stream-with-broken-then.any.worker Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * update interfaces Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * fix use of global() and error to_jsval Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * fix use of crown for promise handlers Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * remove fail expectation from worker interface objects test Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * remove fail expectation for test expecting this to be undefined in callback Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * fix documentation link for writablestream state Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * refactor write_requests to use a vec deque uses ai Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * remove unnecessary doc Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * refactor reject_close_and_closed_promise_if_needed to take a safe js context as argument uses ai Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * pass globals and contexts by ref where possible uses ai Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * fix doc link for controller Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * remove unnecessary comment Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * change update_backpressure to be a method of the writablestream uses ai Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * rename writer method that resolve closed and ready promise for clarity uses ai Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * add comments for steps in peek queue value Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * fix doc link for the abort algorihtm fulfillment handler Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * fix step doc and variable name in abort algo rejection handler Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * Add must_root to pending abort request Co-authored-by: Josh Matthews <josh@joshmatthews.net> Signed-off-by: Gregory Terzian <2792687+gterzian@users.noreply.github.com> * limit visibility to crate for has_operations_marked_inflight Co-authored-by: Josh Matthews <josh@joshmatthews.net> Signed-off-by: Gregory Terzian <2792687+gterzian@users.noreply.github.com> * limit visibility to crate for get_stored_error Co-authored-by: Josh Matthews <josh@joshmatthews.net> Signed-off-by: Gregory Terzian <2792687+gterzian@users.noreply.github.com> * remove potention re-borrow risk in reject loop on write requests in finish_erroring Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * remove potential re-borrow risk when taking pending abort request in finish_erroring Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * remove potential re-borrow risk when taking close request in reject_close_and_closed_promise_if_needed Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * remove re-borrow risks in finish_in_flight_close Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * remove re-borrow risk on in_flight_close_request in finish_in_flight_close_with_error Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * remove unnecessary clone of of reason in abort Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * fix condition on backpressure and a writable state in close Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * limit visibility to crate for update_backpressure Co-authored-by: Josh Matthews <josh@joshmatthews.net> Signed-off-by: Gregory Terzian <2792687+gterzian@users.noreply.github.com> * remove mutability of reason in abort workflow Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * remove unnecessary use of ignore_malloc_size_of around Dom in controller Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * fix ignore malloc size of comment for strategy size Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * reduce visibility of public methods to crate in controller Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * remove use of JS_GetPendingException in controller get_chunk_size Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * return early on error in write Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * use is_some_and in assertion that stream.witer is writer in release Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * root pending abort request uses ai Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * fix mutable re-borrow risk in writer Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> --------- Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> Signed-off-by: Gregory Terzian <2792687+gterzian@users.noreply.github.com> Co-authored-by: Josh Matthews <josh@joshmatthews.net>
This commit is contained in:
parent
720bc725b0
commit
df6d636168
33 changed files with 2914 additions and 19 deletions
|
@ -115,21 +115,25 @@ impl Callback for StartAlgorithmRejectionHandler {
|
|||
}
|
||||
|
||||
/// <https://streams.spec.whatwg.org/#value-with-size>
|
||||
#[derive(JSTraceable)]
|
||||
#[derive(Debug, JSTraceable, PartialEq)]
|
||||
#[cfg_attr(crown, crown::unrooted_must_root_lint::must_root)]
|
||||
pub(crate) struct ValueWithSize {
|
||||
value: Box<Heap<JSVal>>,
|
||||
size: f64,
|
||||
/// <https://streams.spec.whatwg.org/#value-with-size-value>
|
||||
pub(crate) value: Box<Heap<JSVal>>,
|
||||
/// <https://streams.spec.whatwg.org/#value-with-size-size>
|
||||
pub(crate) size: f64,
|
||||
}
|
||||
|
||||
/// <https://streams.spec.whatwg.org/#value-with-size>
|
||||
#[derive(JSTraceable)]
|
||||
#[derive(Debug, JSTraceable, PartialEq)]
|
||||
#[cfg_attr(crown, crown::unrooted_must_root_lint::must_root)]
|
||||
pub(crate) enum EnqueuedValue {
|
||||
/// A value enqueued from Rust.
|
||||
Native(Box<[u8]>),
|
||||
/// A Js value.
|
||||
Js(ValueWithSize),
|
||||
/// <https://streams.spec.whatwg.org/#close-sentinel>
|
||||
CloseSentinel,
|
||||
}
|
||||
|
||||
impl EnqueuedValue {
|
||||
|
@ -137,6 +141,9 @@ impl EnqueuedValue {
|
|||
match self {
|
||||
EnqueuedValue::Native(v) => v.len() as f64,
|
||||
EnqueuedValue::Js(v) => v.size,
|
||||
// The size of the sentinel is zero,
|
||||
// as per <https://streams.spec.whatwg.org/#ref-for-close-sentinel%E2%91%A0>
|
||||
EnqueuedValue::CloseSentinel => 0.,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -152,6 +159,9 @@ impl EnqueuedValue {
|
|||
EnqueuedValue::Js(value_with_size) => unsafe {
|
||||
value_with_size.value.to_jsval(*cx, rval);
|
||||
},
|
||||
EnqueuedValue::CloseSentinel => {
|
||||
unreachable!("The close sentinel is never made available as a js val.")
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -161,6 +171,7 @@ fn is_non_negative_number(value: &EnqueuedValue) -> bool {
|
|||
let value_with_size = match value {
|
||||
EnqueuedValue::Native(_) => return true,
|
||||
EnqueuedValue::Js(value_with_size) => value_with_size,
|
||||
EnqueuedValue::CloseSentinel => return true,
|
||||
};
|
||||
|
||||
// If v is not a Number, return false.
|
||||
|
@ -186,23 +197,29 @@ pub(crate) struct QueueWithSizes {
|
|||
#[ignore_malloc_size_of = "EnqueuedValue::Js"]
|
||||
queue: VecDeque<EnqueuedValue>,
|
||||
/// <https://streams.spec.whatwg.org/#readablestreamdefaultcontroller-queuetotalsize>
|
||||
total_size: f64,
|
||||
pub(crate) total_size: f64,
|
||||
}
|
||||
|
||||
impl QueueWithSizes {
|
||||
/// <https://streams.spec.whatwg.org/#dequeue-value>
|
||||
fn dequeue_value(&mut self, cx: SafeJSContext, rval: MutableHandleValue) {
|
||||
/// A none `rval` means we're dequeing the close sentinel,
|
||||
/// which should never be made available to script.
|
||||
pub(crate) fn dequeue_value(&mut self, cx: SafeJSContext, rval: Option<MutableHandleValue>) {
|
||||
let Some(value) = self.queue.front() else {
|
||||
unreachable!("Buffer cannot be empty when dequeue value is called into.");
|
||||
};
|
||||
self.total_size -= value.size();
|
||||
value.to_jsval(cx, rval);
|
||||
if let Some(rval) = rval {
|
||||
value.to_jsval(cx, rval);
|
||||
} else {
|
||||
assert_eq!(value, &EnqueuedValue::CloseSentinel);
|
||||
}
|
||||
self.queue.pop_front();
|
||||
}
|
||||
|
||||
/// <https://streams.spec.whatwg.org/#enqueue-value-with-size>
|
||||
#[cfg_attr(crown, allow(crown::unrooted_must_root))]
|
||||
fn enqueue_value_with_size(&mut self, value: EnqueuedValue) -> Result<(), Error> {
|
||||
pub(crate) fn enqueue_value_with_size(&mut self, value: EnqueuedValue) -> Result<(), Error> {
|
||||
// If ! IsNonNegativeNumber(size) is false, throw a RangeError exception.
|
||||
if !is_non_negative_number(&value) {
|
||||
return Err(Error::Range(
|
||||
|
@ -223,10 +240,30 @@ impl QueueWithSizes {
|
|||
Ok(())
|
||||
}
|
||||
|
||||
fn is_empty(&self) -> bool {
|
||||
pub(crate) fn is_empty(&self) -> bool {
|
||||
self.queue.is_empty()
|
||||
}
|
||||
|
||||
/// <https://streams.spec.whatwg.org/#peek-queue-value>
|
||||
/// Returns whether value is the close sentinel.
|
||||
pub(crate) fn peek_queue_value(&self, cx: SafeJSContext, rval: MutableHandleValue) -> bool {
|
||||
// Assert: container has [[queue]] and [[queueTotalSize]] internal slots.
|
||||
// Done with the QueueWithSizes type.
|
||||
|
||||
// Assert: container.[[queue]] is not empty.
|
||||
assert!(!self.is_empty());
|
||||
|
||||
// Let valueWithSize be container.[[queue]][0].
|
||||
let value_with_size = self.queue.front().expect("Queue is not empty.");
|
||||
if let EnqueuedValue::CloseSentinel = value_with_size {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Return valueWithSize’s value.
|
||||
value_with_size.to_jsval(cx, rval);
|
||||
false
|
||||
}
|
||||
|
||||
/// Only used with native sources.
|
||||
fn get_in_memory_bytes(&self) -> Option<Vec<u8>> {
|
||||
self.queue
|
||||
|
@ -244,7 +281,7 @@ impl QueueWithSizes {
|
|||
}
|
||||
|
||||
/// <https://streams.spec.whatwg.org/#reset-queue>
|
||||
fn reset(&mut self) {
|
||||
pub(crate) fn reset(&mut self) {
|
||||
self.queue.clear();
|
||||
self.total_size = Default::default();
|
||||
}
|
||||
|
@ -409,7 +446,7 @@ impl ReadableStreamDefaultController {
|
|||
/// <https://streams.spec.whatwg.org/#dequeue-value>
|
||||
fn dequeue_value(&self, cx: SafeJSContext, rval: MutableHandleValue) {
|
||||
let mut queue = self.queue.borrow_mut();
|
||||
queue.dequeue_value(cx, rval);
|
||||
queue.dequeue_value(cx, Some(rval));
|
||||
}
|
||||
|
||||
/// <https://streams.spec.whatwg.org/#readable-stream-default-controller-should-call-pull>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue