aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
authorTaym Haddadi <haddadi.taym@gmail.com>2025-02-04 12:58:46 +0100
committerGitHub <noreply@github.com>2025-02-04 11:58:46 +0000
commit6547d35fa5a6ae29e25e7592c5b7a06cb8399c1e (patch)
tree816e5d93f1da7c61ee0509e923667bd1b3138b1d /components/script/dom
parentc0cef69108b199efc0fcb720fe70ffe0dd07d763 (diff)
downloadservo-6547d35fa5a6ae29e25e7592c5b7a06cb8399c1e.tar.gz
servo-6547d35fa5a6ae29e25e7592c5b7a06cb8399c1e.zip
Script: implement ReadableStreamBYOBRequest (#35074)
* Script: implement ReadableStreamBYOBReader::Read Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> * implement viewed_buffer_array_byte_length and byte_length Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> * Correct BufferSource implemntation Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> * Reduce BufferSource to two variants ArrayBuffer and ArrayBufferView Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> * Scriptt: implement ReadableStreamBYOBRequest Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> * fix is_detached_buffer and viewed_buffer_array_byte_length Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> * Use if let Some instead of unwrap() Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com> --------- Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com>
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/readablebytestreamcontroller.rs13
-rw-r--r--components/script/dom/readablestreambyobrequest.rs66
2 files changed, 68 insertions, 11 deletions
diff --git a/components/script/dom/readablebytestreamcontroller.rs b/components/script/dom/readablebytestreamcontroller.rs
index 8d1c1b91eed..85c2a08fe76 100644
--- a/components/script/dom/readablebytestreamcontroller.rs
+++ b/components/script/dom/readablebytestreamcontroller.rs
@@ -39,6 +39,19 @@ impl ReadableByteStreamController {
) {
todo!()
}
+
+ /// <https://streams.spec.whatwg.org/#readable-byte-stream-controller-respond>
+ pub(crate) fn respond(&self, _bytes_written: u64) -> Fallible<()> {
+ todo!()
+ }
+
+ /// <https://streams.spec.whatwg.org/#readable-byte-stream-controller-respond-with-new-view>
+ pub(crate) fn respond_with_new_view(
+ &self,
+ _view: HeapBufferSource<ArrayBufferViewU8>,
+ ) -> Fallible<()> {
+ todo!()
+ }
}
impl ReadableByteStreamControllerMethods<crate::DomTypeHolder> for ReadableByteStreamController {
diff --git a/components/script/dom/readablestreambyobrequest.rs b/components/script/dom/readablestreambyobrequest.rs
index 47df222e1d8..973dede62d9 100644
--- a/components/script/dom/readablestreambyobrequest.rs
+++ b/components/script/dom/readablestreambyobrequest.rs
@@ -3,37 +3,81 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom_struct::dom_struct;
+use js::gc::CustomAutoRooterGuard;
+use js::jsapi::Heap;
+use js::typedarray::{ArrayBufferView, ArrayBufferViewU8};
+use super::bindings::buffer_source::{BufferSource, HeapBufferSource};
use crate::dom::bindings::codegen::Bindings::ReadableStreamBYOBRequestBinding::ReadableStreamBYOBRequestMethods;
use crate::dom::bindings::import::module::{Error, Fallible};
use crate::dom::bindings::reflector::Reflector;
+use crate::dom::bindings::root::MutNullableDom;
+use crate::dom::readablebytestreamcontroller::ReadableByteStreamController;
+use crate::dom::types::GlobalScope;
use crate::script_runtime::JSContext as SafeJSContext;
/// <https://streams.spec.whatwg.org/#readablestreambyobrequest>
#[dom_struct]
pub(crate) struct ReadableStreamBYOBRequest {
reflector_: Reflector,
+ controller: MutNullableDom<ReadableByteStreamController>,
+ #[ignore_malloc_size_of = "mozjs"]
+ view: HeapBufferSource<ArrayBufferViewU8>,
}
impl ReadableStreamBYOBRequestMethods<crate::DomTypeHolder> for ReadableStreamBYOBRequest {
/// <https://streams.spec.whatwg.org/#rs-byob-request-view>
fn GetView(&self, _cx: SafeJSContext) -> Option<js::typedarray::ArrayBufferView> {
- // TODO
- None
+ // Return this.[[view]].
+ self.view.buffer_to_option()
}
/// <https://streams.spec.whatwg.org/#rs-byob-request-respond>
- fn Respond(&self, _bytes_written: u64) -> Fallible<()> {
- // TODO
- Err(Error::NotFound)
+ fn Respond(&self, bytes_written: u64) -> Fallible<()> {
+ let cx = GlobalScope::get_cx();
+
+ // If this.[[controller]] is undefined, throw a TypeError exception.
+ let controller = if let Some(controller) = self.controller.get() {
+ controller
+ } else {
+ return Err(Error::Type("controller is undefined".to_owned()));
+ };
+
+ // If ! IsDetachedBuffer(this.[[view]].[[ArrayBuffer]]) is true, throw a TypeError exception.
+ if self.view.is_detached_buffer(cx) {
+ return Err(Error::Type("buffer is detached".to_owned()));
+ }
+
+ // Assert: this.[[view]].[[ByteLength]] > 0.
+ assert!(self.view.byte_length() > 0);
+
+ // Assert: this.[[view]].[[ViewedArrayBuffer]].[[ByteLength]] > 0.
+ assert!(self.view.viewed_buffer_array_byte_length(cx) > 0);
+
+ // Perform ? ReadableByteStreamControllerRespond(this.[[controller]], bytesWritten).
+ controller.respond(bytes_written)
}
/// <https://streams.spec.whatwg.org/#rs-byob-request-respond-with-new-view>
- fn RespondWithNewView(
- &self,
- _view: js::gc::CustomAutoRooterGuard<js::typedarray::ArrayBufferView>,
- ) -> Fallible<()> {
- // TODO
- Err(Error::NotFound)
+ #[allow(unsafe_code)]
+ fn RespondWithNewView(&self, view: CustomAutoRooterGuard<ArrayBufferView>) -> Fallible<()> {
+ let view = HeapBufferSource::<ArrayBufferViewU8>::new(BufferSource::ArrayBufferView(
+ Heap::boxed(unsafe { *view.underlying_object() }),
+ ));
+
+ // If this.[[controller]] is undefined, throw a TypeError exception.
+ let controller = if let Some(controller) = self.controller.get() {
+ controller
+ } else {
+ return Err(Error::Type("controller is undefined".to_owned()));
+ };
+
+ // If ! IsDetachedBuffer(view.[[ViewedArrayBuffer]]) is true, throw a TypeError exception.
+ if self.view.is_detached_buffer(GlobalScope::get_cx()) {
+ return Err(Error::Type("buffer is detached".to_owned()));
+ }
+
+ // Return ? ReadableByteStreamControllerRespondWithNewView(this.[[controller]], view).
+ controller.respond_with_new_view(view)
}
}