diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs index 65717bb81bf..4602fec34df 100644 --- a/components/script/dom/bindings/trace.rs +++ b/components/script/dom/bindings/trace.rs @@ -40,6 +40,7 @@ use crate::dom::document::PendingRestyle; use crate::dom::htmlimageelement::SourceSet; use crate::dom::htmlmediaelement::{HTMLMediaElementFetchContext, MediaFrameRenderer}; use crate::dom::identityhub::Identities; +use crate::script_runtime::StreamConsumer; use crate::task::TaskBox; use app_units::Au; use canvas_traits::canvas::{ @@ -543,6 +544,7 @@ unsafe_no_jsmanaged_fields!(Arc>); unsafe_no_jsmanaged_fields!(MediaSessionActionType); unsafe_no_jsmanaged_fields!(MediaMetadata); unsafe_no_jsmanaged_fields!(WebrenderIpcSender); +unsafe_no_jsmanaged_fields!(StreamConsumer); unsafe impl<'a> JSTraceable for &'a str { #[inline] diff --git a/components/script/dom/response.rs b/components/script/dom/response.rs index 184e5ff8888..0e756513b9a 100644 --- a/components/script/dom/response.rs +++ b/components/script/dom/response.rs @@ -19,6 +19,7 @@ use crate::dom::headers::{is_obs_text, is_vchar}; use crate::dom::headers::{Guard, Headers}; use crate::dom::promise::Promise; use crate::dom::xmlhttprequest::Extractable; +use crate::script_runtime::StreamConsumer; use dom_struct::dom_struct; use http::header::HeaderMap as HyperHeaders; use hyper::StatusCode; @@ -48,6 +49,8 @@ pub struct Response { body: DomRefCell, #[ignore_malloc_size_of = "Rc"] body_promise: DomRefCell, BodyType)>>, + #[ignore_malloc_size_of = "StreamConsumer"] + stream_consumer: DomRefCell>, } impl Response { @@ -64,6 +67,7 @@ impl Response { url_list: DomRefCell::new(vec![]), body: DomRefCell::new(NetTraitsResponseBody::Empty), body_promise: DomRefCell::new(None), + stream_consumer: DomRefCell::new(None), } } @@ -441,11 +445,24 @@ impl Response { } } + pub fn set_stream_consumer(&self, sc: Option) { + *self.stream_consumer.borrow_mut() = sc; + } + + pub fn stream_chunk(&self, stream: &[u8]) { + if let Some(stream_consumer) = self.stream_consumer.borrow_mut().as_ref() { + stream_consumer.consume_chunk(stream); + } + } + #[allow(unrooted_must_root)] pub fn finish(&self, body: Vec) { *self.body.borrow_mut() = NetTraitsResponseBody::Done(body); if let Some((p, body_type)) = self.body_promise.borrow_mut().take() { consume_body_with_promise(self, body_type, &p); } + if let Some(stream_consumer) = self.stream_consumer.borrow_mut().take() { + stream_consumer.stream_end(); + } } } diff --git a/components/script/fetch.rs b/components/script/fetch.rs index 68285653a2f..e7f045895d8 100644 --- a/components/script/fetch.rs +++ b/components/script/fetch.rs @@ -260,6 +260,7 @@ impl FetchResponseListener for FetchContext { } fn process_response_chunk(&mut self, mut chunk: Vec) { + self.response_object.root().stream_chunk(chunk.as_slice()); self.body.append(&mut chunk); } diff --git a/components/script/script_runtime.rs b/components/script/script_runtime.rs index fa02e7e564e..02a6b42b854 100644 --- a/components/script/script_runtime.rs +++ b/components/script/script_runtime.rs @@ -853,26 +853,30 @@ pub struct StreamConsumer(*mut JSStreamConsumer); #[allow(unsafe_code)] impl StreamConsumer { - fn consume_chunk(&self, stream: &[u8]) -> bool { + pub fn consume_chunk(&self, stream: &[u8]) -> bool { unsafe { let stream_ptr = stream.as_ptr(); return StreamConsumerConsumeChunk(self.0, stream_ptr, stream.len()); } } - fn stream_end(&self) { + pub fn stream_end(&self) { unsafe { StreamConsumerStreamEnd(self.0); } } - fn stream_error(&self, error_code: usize) { + pub fn stream_error(&self, error_code: usize) { unsafe { StreamConsumerStreamError(self.0, error_code); } } - fn note_response_urls(&self, maybe_url: Option, maybe_source_map_url: Option) { + pub fn note_response_urls( + &self, + maybe_url: Option, + maybe_source_map_url: Option, + ) { unsafe { let maybe_url = maybe_url.map(|url| CString::new(url).unwrap()); let maybe_source_map_url = maybe_source_map_url.map(|url| CString::new(url).unwrap()); @@ -965,6 +969,7 @@ unsafe extern "C" fn consume_stream( ); return false; } + unwrapped_source.set_stream_consumer(Some(StreamConsumer(_consumer))); } else { //Step 3 Upon rejection of source, return with reason. throw_dom_exception( diff --git a/tests/wpt/metadata/wasm/webapi/contenttype.any.js.ini b/tests/wpt/metadata/wasm/webapi/contenttype.any.js.ini index 3fb3c3ac135..db44784b992 100644 --- a/tests/wpt/metadata/wasm/webapi/contenttype.any.js.ini +++ b/tests/wpt/metadata/wasm/webapi/contenttype.any.js.ini @@ -1,22 +1,12 @@ [contenttype.any.worker.html] - expected: TIMEOUT - [Response with Content-Type "application/wasm": compileStreaming] - expected: TIMEOUT - - [Response with Content-Type "APPLICATION/wasm": compileStreaming] - expected: NOTRUN - [Response with Content-Type "APPLICATION/wasm": instantiateStreaming] - expected: NOTRUN + expected: FAIL [Response with Content-Type "APPLICATION/WASM": instantiateStreaming] - expected: NOTRUN + expected: FAIL [Response with Content-Type "application/wasm": instantiateStreaming] - expected: NOTRUN - - [Response with Content-Type "APPLICATION/WASM": compileStreaming] - expected: NOTRUN + expected: FAIL [contenttype.any.sharedworker.html] @@ -26,24 +16,14 @@ [contenttype.any.html] - expected: TIMEOUT - [Response with Content-Type "application/wasm": compileStreaming] - expected: TIMEOUT - - [Response with Content-Type "APPLICATION/wasm": compileStreaming] - expected: NOTRUN - [Response with Content-Type "APPLICATION/wasm": instantiateStreaming] - expected: NOTRUN + expected: FAIL [Response with Content-Type "APPLICATION/WASM": instantiateStreaming] - expected: NOTRUN + expected: FAIL [Response with Content-Type "application/wasm": instantiateStreaming] - expected: NOTRUN - - [Response with Content-Type "APPLICATION/WASM": compileStreaming] - expected: NOTRUN + expected: FAIL [contenttype.any.serviceworker.html] diff --git a/tests/wpt/metadata/wasm/webapi/status.any.js.ini b/tests/wpt/metadata/wasm/webapi/status.any.js.ini index 8d6bdb60c08..7cb0f5c08a8 100644 --- a/tests/wpt/metadata/wasm/webapi/status.any.js.ini +++ b/tests/wpt/metadata/wasm/webapi/status.any.js.ini @@ -1,49 +1,27 @@ [status.any.html] - expected: TIMEOUT [Response with status 300: instantiateStreaming] - expected: NOTRUN + expected: FAIL [Response with status 500: instantiateStreaming] - expected: NOTRUN - - [Response with status 700: instantiateStreaming] - expected: NOTRUN - - [Response with status 700: compileStreaming] - expected: NOTRUN - - [Response with status 600: instantiateStreaming] - expected: NOTRUN - - [Response with status 0: instantiateStreaming] - expected: NOTRUN + expected: FAIL [Response with status 404: compileStreaming] - expected: NOTRUN + expected: FAIL [Response with status 500: compileStreaming] - expected: NOTRUN - - [Response with status 600: compileStreaming] - expected: NOTRUN + expected: FAIL [Response with status 300: compileStreaming] - expected: TIMEOUT + expected: FAIL [Response with status 400: compileStreaming] - expected: NOTRUN + expected: FAIL [Response with status 400: instantiateStreaming] - expected: NOTRUN - - [Response with status 999: instantiateStreaming] - expected: NOTRUN - - [Response with status 999: compileStreaming] - expected: NOTRUN + expected: FAIL [Response with status 404: instantiateStreaming] - expected: NOTRUN + expected: FAIL [status.any.serviceworker.html] @@ -59,49 +37,27 @@ [status.any.worker.html] - expected: TIMEOUT [Response with status 300: instantiateStreaming] - expected: NOTRUN + expected: FAIL [Response with status 500: instantiateStreaming] - expected: NOTRUN - - [Response with status 700: instantiateStreaming] - expected: NOTRUN - - [Response with status 700: compileStreaming] - expected: NOTRUN - - [Response with status 600: instantiateStreaming] - expected: NOTRUN - - [Response with status 0: instantiateStreaming] - expected: NOTRUN + expected: FAIL [Response with status 404: compileStreaming] - expected: NOTRUN + expected: FAIL [Response with status 500: compileStreaming] - expected: NOTRUN - - [Response with status 600: compileStreaming] - expected: NOTRUN + expected: FAIL [Response with status 300: compileStreaming] - expected: TIMEOUT + expected: FAIL [Response with status 400: compileStreaming] - expected: NOTRUN + expected: FAIL [Response with status 400: instantiateStreaming] - expected: NOTRUN - - [Response with status 999: instantiateStreaming] - expected: NOTRUN - - [Response with status 999: compileStreaming] - expected: NOTRUN + expected: FAIL [Response with status 404: instantiateStreaming] - expected: NOTRUN + expected: FAIL