aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
authorZhen Zhang <izgzhen@gmail.com>2016-07-24 11:37:34 +0200
committerZhen Zhang <izgzhen@gmail.com>2016-07-25 19:39:16 +0200
commit9c8ebd3ce1f48f2aff811d6f3eedd7a3f3b8f553 (patch)
tree624d686a08f6dd9c208366062670581c490c8383 /components/script/dom
parent2de3b119a961942943280fa280c50a7a814de583 (diff)
downloadservo-9c8ebd3ce1f48f2aff811d6f3eedd7a3f3b8f553.tar.gz
servo-9c8ebd3ce1f48f2aff811d6f3eedd7a3f3b8f553.zip
Chunked ReadFile from file manager
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/blob.rs20
1 files changed, 16 insertions, 4 deletions
diff --git a/components/script/dom/blob.rs b/components/script/dom/blob.rs
index 1e3c74e1e26..ae2b1725319 100644
--- a/components/script/dom/blob.rs
+++ b/components/script/dom/blob.rs
@@ -16,7 +16,7 @@ use encoding::types::{EncoderTrap, Encoding};
use ipc_channel::ipc;
use net_traits::IpcSend;
use net_traits::blob_url_store::{BlobBuf, get_blob_origin};
-use net_traits::filemanager_thread::{FileManagerThreadMsg, SelectedFileId, RelativePos};
+use net_traits::filemanager_thread::{FileManagerThreadMsg, SelectedFileId, RelativePos, ReadFileProgress};
use std::cell::Cell;
use std::ops::Index;
use std::path::PathBuf;
@@ -286,9 +286,21 @@ fn read_file(global: GlobalRef, id: SelectedFileId) -> Result<Vec<u8>, ()> {
let msg = FileManagerThreadMsg::ReadFile(chan, id, check_url_validity, origin);
let _ = file_manager.send(msg);
- match recv.recv().unwrap() {
- Ok(blob_buf) => Ok(blob_buf.bytes),
- Err(_) => Err(()),
+ let mut bytes = vec![];
+
+ loop {
+ match recv.recv().unwrap() {
+ Ok(ReadFileProgress::Meta(mut blob_buf)) => {
+ bytes.append(&mut blob_buf.bytes);
+ }
+ Ok(ReadFileProgress::Partial(mut bytes_in)) => {
+ bytes.append(&mut bytes_in);
+ }
+ Ok(ReadFileProgress::EOF) => {
+ return Ok(bytes);
+ }
+ Err(_) => return Err(()),
+ }
}
}