mirror of
https://github.com/servo/servo.git
synced 2025-08-06 22:15:33 +01:00
script: implement ReadableByteStreamController (#35410)
* script: implement ReadableByteStreamController Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> * implement can_copy_data_block_bytes and copy_data_block_bytes Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> * Remove BufferSource::Default Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> * implement StartAlgorithmFulfillmentHandler, StartAlgorithmRejectionHandler, PullAlgorithmFulfillmentHandler, PullAlgorithmRejectionHandler for ReadableByteStreamController Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> * implement perform_pull_into Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> * fix build Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> * Fix clippy Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> * Fix build Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> * Remove RefCell from PullIntoDescriptor and QueueEntry Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> * Remove commented code Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> * add perform_cancel_steps, perform_release_steps and perform_pull_steps Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> * fix clippy Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> * fix crown Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> * unskip readable-byte-streams Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> * Fix CRASH Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> * fix clippy Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> * Fix more CRASHS Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> * fix more crashes Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> * Fix bad-buffers-and-views.any.js test Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> * Update test expectations Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> * Fix BorrowMutError crashes Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> * fix view_byte_length test Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> * Fix non-transferable-buffers test Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> * Pass contexts as much as possible by reference Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> * Make respond_internal Fallible Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> * Fix crwon Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> * fix process pull into descriptors using queue logic and resulting double-borrow Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> * Fix clippy Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> * FIx more crashes Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> * Fix timeout tests Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> * Fix all tests Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> * Remove all error! logs Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> * Remove #[allow(unsafe_code)] Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> * Fix lint Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> * Fix tidy Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> * Fix test expectation Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> --------- Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com> Co-authored-by: gterzian <2792687+gterzian@users.noreply.github.com>
This commit is contained in:
parent
459aee27b6
commit
a5cf04c479
30 changed files with 3410 additions and 324 deletions
|
@ -14,7 +14,7 @@ use js::jsval::{JSVal, UndefinedValue};
|
|||
use js::rust::{HandleObject as SafeHandleObject, HandleValue as SafeHandleValue};
|
||||
use js::typedarray::{ArrayBufferView, ArrayBufferViewU8};
|
||||
|
||||
use super::bindings::buffer_source::{BufferSource, HeapBufferSource};
|
||||
use super::bindings::buffer_source::HeapBufferSource;
|
||||
use super::bindings::codegen::Bindings::ReadableStreamBYOBReaderBinding::ReadableStreamBYOBReaderReadOptions;
|
||||
use super::bindings::codegen::Bindings::ReadableStreamDefaultReaderBinding::ReadableStreamReadResult;
|
||||
use super::bindings::reflector::reflect_dom_object;
|
||||
|
@ -69,7 +69,17 @@ impl ReadIntoRequest {
|
|||
},
|
||||
can_gc,
|
||||
),
|
||||
None => promise.resolve_native(&(), can_gc),
|
||||
None => {
|
||||
let result = RootedTraceableBox::new(Heap::default());
|
||||
result.set(UndefinedValue());
|
||||
promise.resolve_native(
|
||||
&ReadableStreamReadResult {
|
||||
done: Some(true),
|
||||
value: result,
|
||||
},
|
||||
can_gc,
|
||||
);
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
@ -177,14 +187,20 @@ impl ReadableStreamBYOBReader {
|
|||
}
|
||||
|
||||
/// <https://streams.spec.whatwg.org/#abstract-opdef-readablestreambyobreadererrorreadintorequests>
|
||||
fn error_read_into_requests(&self, rval: SafeHandleValue, can_gc: CanGc) {
|
||||
pub(crate) fn error_read_into_requests(&self, e: SafeHandleValue, can_gc: CanGc) {
|
||||
// Reject reader.[[closedPromise]] with e.
|
||||
self.closed_promise.borrow().reject_native(&e, can_gc);
|
||||
|
||||
// Set reader.[[closedPromise]].[[PromiseIsHandled]] to true.
|
||||
self.closed_promise.borrow().set_promise_is_handled();
|
||||
|
||||
// Let readRequests be reader.[[readRequests]].
|
||||
let mut read_into_requests = self.take_read_into_requests();
|
||||
|
||||
// Set reader.[[readIntoRequests]] to a new empty list.
|
||||
for request in read_into_requests.drain(0..) {
|
||||
// Perform readIntoRequest’s error steps, given e.
|
||||
request.error_steps(rval, can_gc);
|
||||
request.error_steps(e, can_gc);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -200,7 +216,7 @@ impl ReadableStreamBYOBReader {
|
|||
}
|
||||
|
||||
/// <https://streams.spec.whatwg.org/#readable-stream-cancel>
|
||||
pub(crate) fn close(&self, can_gc: CanGc) {
|
||||
pub(crate) fn cancel(&self, can_gc: CanGc) {
|
||||
// If reader is not undefined and reader implements ReadableStreamBYOBReader,
|
||||
// Let readIntoRequests be reader.[[readIntoRequests]].
|
||||
let mut read_into_requests = self.take_read_into_requests();
|
||||
|
@ -212,9 +228,15 @@ impl ReadableStreamBYOBReader {
|
|||
}
|
||||
}
|
||||
|
||||
pub(crate) fn close(&self, can_gc: CanGc) {
|
||||
// Resolve reader.[[closedPromise]] with undefined.
|
||||
self.closed_promise.borrow().resolve_native(&(), can_gc);
|
||||
}
|
||||
|
||||
/// <https://streams.spec.whatwg.org/#readable-stream-byob-reader-read>
|
||||
pub(crate) fn read(
|
||||
&self,
|
||||
cx: SafeJSContext,
|
||||
view: HeapBufferSource<ArrayBufferViewU8>,
|
||||
options: &ReadableStreamBYOBReaderReadOptions,
|
||||
read_into_request: &ReadIntoRequest,
|
||||
|
@ -234,13 +256,25 @@ impl ReadableStreamBYOBReader {
|
|||
let cx = GlobalScope::get_cx();
|
||||
rooted!(in(*cx) let mut error = UndefinedValue());
|
||||
stream.get_stored_error(error.handle_mut());
|
||||
|
||||
read_into_request.error_steps(error.handle(), can_gc);
|
||||
} else {
|
||||
// Otherwise,
|
||||
// perform ! ReadableByteStreamControllerPullInto(stream.[[controller]], view, min, readIntoRequest).
|
||||
stream.perform_pull_into_steps(read_into_request, view, options, can_gc);
|
||||
stream.perform_pull_into(cx, read_into_request, view, options, can_gc);
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn get_num_read_into_requests(&self) -> usize {
|
||||
self.read_into_requests.borrow().len()
|
||||
}
|
||||
|
||||
pub(crate) fn remove_read_into_request(&self) -> ReadIntoRequest {
|
||||
self.read_into_requests
|
||||
.borrow_mut()
|
||||
.pop_front()
|
||||
.expect("read into requests is empty")
|
||||
}
|
||||
}
|
||||
|
||||
impl ReadableStreamBYOBReaderMethods<crate::DomTypeHolder> for ReadableStreamBYOBReader {
|
||||
|
@ -260,16 +294,13 @@ impl ReadableStreamBYOBReaderMethods<crate::DomTypeHolder> for ReadableStreamBYO
|
|||
}
|
||||
|
||||
/// <https://streams.spec.whatwg.org/#byob-reader-read>
|
||||
#[allow(unsafe_code)]
|
||||
fn Read(
|
||||
&self,
|
||||
view: CustomAutoRooterGuard<ArrayBufferView>,
|
||||
options: &ReadableStreamBYOBReaderReadOptions,
|
||||
can_gc: CanGc,
|
||||
) -> Rc<Promise> {
|
||||
let view = HeapBufferSource::<ArrayBufferViewU8>::new(BufferSource::ArrayBufferView(
|
||||
Heap::boxed(unsafe { *view.underlying_object() }),
|
||||
));
|
||||
let view = HeapBufferSource::<ArrayBufferViewU8>::from_view(view);
|
||||
|
||||
// Let promise be a new promise.
|
||||
let promise = Promise::new(&self.global(), can_gc);
|
||||
|
@ -306,9 +337,9 @@ impl ReadableStreamBYOBReaderMethods<crate::DomTypeHolder> for ReadableStreamBYO
|
|||
// If view has a [[TypedArrayName]] internal slot,
|
||||
if view.has_typed_array_name() {
|
||||
// If options["min"] > view.[[ArrayLength]], return a promise rejected with a RangeError exception.
|
||||
if options.min > (view.array_length() as u64) {
|
||||
if options.min > (view.get_typed_array_length() as u64) {
|
||||
promise.reject_error(
|
||||
Error::Type("min is greater than array length".to_owned()),
|
||||
Error::Range("min is greater than array length".to_owned()),
|
||||
can_gc,
|
||||
);
|
||||
return promise;
|
||||
|
@ -318,7 +349,7 @@ impl ReadableStreamBYOBReaderMethods<crate::DomTypeHolder> for ReadableStreamBYO
|
|||
// If options["min"] > view.[[ByteLength]], return a promise rejected with a RangeError exception.
|
||||
if options.min > (view.byte_length() as u64) {
|
||||
promise.reject_error(
|
||||
Error::Type("min is greater than byte length".to_owned()),
|
||||
Error::Range("min is greater than byte length".to_owned()),
|
||||
can_gc,
|
||||
);
|
||||
return promise;
|
||||
|
@ -347,7 +378,7 @@ impl ReadableStreamBYOBReaderMethods<crate::DomTypeHolder> for ReadableStreamBYO
|
|||
let read_into_request = ReadIntoRequest::Read(promise.clone());
|
||||
|
||||
// Perform ! ReadableStreamBYOBReaderRead(this, view, options["min"], readIntoRequest).
|
||||
self.read(view, options, &read_into_request, can_gc);
|
||||
self.read(cx, view, options, &read_into_request, can_gc);
|
||||
|
||||
// Return promise.
|
||||
promise
|
||||
|
@ -371,7 +402,7 @@ impl ReadableStreamBYOBReaderMethods<crate::DomTypeHolder> for ReadableStreamBYO
|
|||
|
||||
/// <https://streams.spec.whatwg.org/#generic-reader-cancel>
|
||||
fn Cancel(&self, _cx: SafeJSContext, reason: SafeHandleValue, can_gc: CanGc) -> Rc<Promise> {
|
||||
self.cancel(&self.global(), reason, can_gc)
|
||||
self.generic_cancel(&self.global(), reason, can_gc)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue