diff options
author | gterzian <2792687+gterzian@users.noreply.github.com> | 2024-07-12 12:21:10 +0800 |
---|---|---|
committer | gterzian <2792687+gterzian@users.noreply.github.com> | 2024-07-12 12:21:10 +0800 |
commit | 94b71424d54db82f3dbae4dcc882f1571fd80f2d (patch) | |
tree | fb664e868c7b24a87c0f24648ef274f5ca832808 /components/script | |
parent | 545423c20266270da9083ee7449d41c2cc1cc10a (diff) | |
download | servo-94b71424d54db82f3dbae4dcc882f1571fd80f2d.tar.gz servo-94b71424d54db82f3dbae4dcc882f1571fd80f2d.zip |
fix read request promise resolving
Diffstat (limited to 'components/script')
-rw-r--r-- | components/script/dom/readablestream.rs | 14 | ||||
-rw-r--r-- | components/script/dom/readablestreamdefaultreader.rs | 46 |
2 files changed, 51 insertions, 9 deletions
diff --git a/components/script/dom/readablestream.rs b/components/script/dom/readablestream.rs index e7b77b2330f..47891228048 100644 --- a/components/script/dom/readablestream.rs +++ b/components/script/dom/readablestream.rs @@ -387,7 +387,7 @@ impl ReadableStream { .get() .expect("Stream must have a reader when a read request is fulfilled."); let request = reader.remove_read_request(); - if done { + if !done { request.chunk_steps(chunk); } else { request.close_steps(); @@ -418,8 +418,16 @@ impl ReadableStreamMethods for ReadableStream { &self, _options: &ReadableStreamGetReaderOptions, ) -> Fallible<ReadableStreamReader> { - // TODO - Err(Error::NotFound) + if self.is_locked() { + return Err(Error::Type("Stream is locked".to_string())) + } + match self.reader { + ReaderType::Default(ref reader) => { + reader.set(Some(&*ReadableStreamDefaultReader::new(&*self.global(), self))); + return Ok(ReadableStreamReader::ReadableStreamDefaultReader(reader.get().unwrap())); + }, + _ => todo!(), + } } } diff --git a/components/script/dom/readablestreamdefaultreader.rs b/components/script/dom/readablestreamdefaultreader.rs index d0b1d2970e6..74583e5f272 100644 --- a/components/script/dom/readablestreamdefaultreader.rs +++ b/components/script/dom/readablestreamdefaultreader.rs @@ -4,20 +4,25 @@ use std::collections::VecDeque; use std::rc::Rc; +use std::ptr; use dom_struct::dom_struct; use js::rust::{HandleObject as SafeHandleObject, HandleValue as SafeHandleValue}; - +use js::jsval::UndefinedValue; +use js::jsapi::Heap; +use js::conversions::ToJSValConvertible; use crate::dom::bindings::cell::DomRefCell; -use crate::dom::bindings::codegen::Bindings::ReadableStreamDefaultReaderBinding::ReadableStreamDefaultReaderMethods; +use crate::dom::bindings::codegen::Bindings::ReadableStreamDefaultReaderBinding::{ReadableStreamReadResult, ReadableStreamDefaultReaderMethods}; use crate::dom::bindings::error::Error; use crate::dom::bindings::import::module::Fallible; use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector}; +use crate::dom::bindings::utils::set_dictionary_property; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::globalscope::GlobalScope; use crate::dom::promise::Promise; use crate::dom::readablestream::ReadableStream; use crate::script_runtime::JSContext as SafeJSContext; +use crate::dom::bindings::trace::RootedTraceableBox; /// <https://streams.spec.whatwg.org/#read-request> /// For now only one variant: the one matching a `read` call. @@ -29,18 +34,47 @@ pub enum ReadRequest { impl ReadRequest { /// <https://streams.spec.whatwg.org/#read-request-chunk-steps> + #[allow(unsafe_code)] + #[allow(crown::unrooted_must_root)] pub fn chunk_steps(&self, chunk: Vec<u8>) { match self { - // TODO: [chunk, false] - ReadRequest::Read(promise) => promise.resolve_native(&chunk), + ReadRequest::Read(promise) => { + let cx = GlobalScope::get_cx(); + rooted!(in(*cx) let mut rval = UndefinedValue()); + let result = RootedTraceableBox::new(Heap::default()); + unsafe { + chunk.to_jsval(*cx, rval.handle_mut()); + result.set(*rval); + } + let result = ReadableStreamReadResult { + done: Some(false), + value: result, + }; + rooted!(in(*cx) let mut rval = UndefinedValue()); + unsafe { + result.to_jsval(*cx, rval.handle_mut()); + } + promise.resolve(cx, rval.handle()); + }, } } /// <https://streams.spec.whatwg.org/#ref-for-read-request-close-step> + #[allow(unsafe_code)] + #[allow(crown::unrooted_must_root)] pub fn close_steps(&self) { match self { - // TODO: [undefined, true] - ReadRequest::Read(promise) => promise.resolve_native(&()), + ReadRequest::Read(promise) => { + let cx = GlobalScope::get_cx(); + rooted!(in(*cx) let mut rval = UndefinedValue()); + let result = RootedTraceableBox::new(Heap::default()); + result.set(*rval); + let result = ReadableStreamReadResult { + done: Some(true), + value: result, + }; + promise.resolve(cx, rval.handle()); + }, } } |