integrate readablestream with fetch and blob

This commit is contained in:
Gregory Terzian 2020-02-29 11:59:10 +08:00
parent 0281acea95
commit bd5796c90b
74 changed files with 2219 additions and 899 deletions

View file

@ -36,14 +36,12 @@ use net_traits::{FetchChannels, FetchResponseListener, NetworkError};
use net_traits::{FetchMetadata, FilteredMetadata, Metadata};
use net_traits::{ResourceFetchTiming, ResourceTimingType};
use servo_url::ServoUrl;
use std::mem;
use std::rc::Rc;
use std::sync::{Arc, Mutex};
struct FetchContext {
fetch_promise: Option<TrustedPromise>,
response_object: Trusted<Response>,
body: Vec<u8>,
resource_timing: ResourceFetchTiming,
}
@ -149,6 +147,7 @@ pub fn Fetch(
// Step 2
let request = match Request::Constructor(global, input, init) {
Err(e) => {
response.error_stream(e.clone());
promise.reject_error(e);
return promise;
},
@ -172,7 +171,6 @@ pub fn Fetch(
let fetch_context = Arc::new(Mutex::new(FetchContext {
fetch_promise: Some(TrustedPromise::new(promise.clone())),
response_object: Trusted::new(&*response),
body: vec![],
resource_timing: ResourceFetchTiming::new(timing_type),
}));
let listener = NetworkListener {
@ -222,7 +220,9 @@ impl FetchResponseListener for FetchContext {
Err(_) => {
promise.reject_error(Error::Type("Network error occurred".to_string()));
self.fetch_promise = Some(TrustedPromise::new(promise));
self.response_object.root().set_type(DOMResponseType::Error);
let response = self.response_object.root();
response.set_type(DOMResponseType::Error);
response.error_stream(Error::Type("Network error occurred".to_string()));
return;
},
// Step 4.2
@ -260,15 +260,15 @@ impl FetchResponseListener for FetchContext {
self.fetch_promise = Some(TrustedPromise::new(promise));
}
fn process_response_chunk(&mut self, mut chunk: Vec<u8>) {
self.response_object.root().stream_chunk(chunk.as_slice());
self.body.append(&mut chunk);
fn process_response_chunk(&mut self, chunk: Vec<u8>) {
let response = self.response_object.root();
response.stream_chunk(chunk);
}
fn process_response_eof(&mut self, _response: Result<ResourceFetchTiming, NetworkError>) {
let response = self.response_object.root();
let _ac = enter_realm(&*response);
response.finish(mem::replace(&mut self.body, vec![]));
response.finish();
// TODO
// ... trailerObject is not supported in Servo yet.
}