aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
authorgterzian <2792687+gterzian@users.noreply.github.com>2024-07-12 12:21:10 +0800
committergterzian <2792687+gterzian@users.noreply.github.com>2024-07-12 12:21:10 +0800
commit94b71424d54db82f3dbae4dcc882f1571fd80f2d (patch)
treefb664e868c7b24a87c0f24648ef274f5ca832808 /components/script
parent545423c20266270da9083ee7449d41c2cc1cc10a (diff)
downloadservo-94b71424d54db82f3dbae4dcc882f1571fd80f2d.tar.gz
servo-94b71424d54db82f3dbae4dcc882f1571fd80f2d.zip
fix read request promise resolving
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/readablestream.rs14
-rw-r--r--components/script/dom/readablestreamdefaultreader.rs46
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());
+ },
}
}