Add cancellability to file manager load and related refactoring

This commit is contained in:
Zhen Zhang 2016-08-01 21:06:58 +02:00
parent 7807895d58
commit 17ae38a318
12 changed files with 137 additions and 189 deletions

View file

@ -14,9 +14,9 @@ use dom::bindings::str::DOMString;
use encoding::all::UTF_8;
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, ReadFileProgress};
use net_traits::{CoreResourceMsg, IpcSend};
use std::cell::Cell;
use std::mem;
use std::ops::Index;
@ -197,11 +197,10 @@ impl Blob {
if set_valid {
let global = self.global();
let origin = get_blob_origin(&global.r().get_url());
let filemanager = global.r().resource_threads().sender();
let (tx, rx) = ipc::channel().unwrap();
let msg = FileManagerThreadMsg::ActivateBlobURL(f.id.clone(), tx, origin.clone());
let _ = filemanager.send(msg);
self.send_to_file_manager(msg);
match rx.recv().unwrap() {
Ok(_) => return f.id.clone(),
@ -218,7 +217,6 @@ impl Blob {
let global = self.global();
let origin = get_blob_origin(&global.r().get_url());
let filemanager = global.r().resource_threads().sender();
let blob_buf = BlobBuf {
filename: None,
@ -228,7 +226,8 @@ impl Blob {
};
let (tx, rx) = ipc::channel().unwrap();
let _ = filemanager.send(FileManagerThreadMsg::PromoteMemory(blob_buf, set_valid, tx, origin.clone()));
let msg = FileManagerThreadMsg::PromoteMemory(blob_buf, set_valid, tx, origin.clone());
self.send_to_file_manager(msg);
match rx.recv().unwrap() {
Ok(id) => {
@ -253,12 +252,11 @@ impl Blob {
let origin = get_blob_origin(&global.r().get_url());
let filemanager = global.r().resource_threads().sender();
let (tx, rx) = ipc::channel().unwrap();
let msg = FileManagerThreadMsg::AddSlicedURLEntry(parent_id.clone(),
rel_pos.clone(),
tx, origin.clone());
let _ = filemanager.send(msg);
self.send_to_file_manager(msg);
match rx.recv().expect("File manager thread is down") {
Ok(new_id) => {
let new_id = SelectedFileId(new_id.0);
@ -286,14 +284,19 @@ impl Blob {
let global = self.global();
let origin = get_blob_origin(&global.r().get_url());
let filemanager = global.r().resource_threads().sender();
let (tx, rx) = ipc::channel().unwrap();
let msg = FileManagerThreadMsg::DecRef(f.id.clone(), origin, tx);
let _ = filemanager.send(msg);
self.send_to_file_manager(msg);
let _ = rx.recv().unwrap();
}
}
fn send_to_file_manager(&self, msg: FileManagerThreadMsg) {
let global = self.global();
let resource_threads = global.r().resource_threads();
let _ = resource_threads.send(CoreResourceMsg::ToFileManager(msg));
}
}
impl Drop for Blob {
@ -305,12 +308,12 @@ impl Drop for Blob {
}
fn read_file(global: GlobalRef, id: SelectedFileId) -> Result<Vec<u8>, ()> {
let file_manager = global.filemanager_thread();
let resource_threads = global.resource_threads();
let (chan, recv) = ipc::channel().map_err(|_|())?;
let origin = get_blob_origin(&global.get_url());
let check_url_validity = false;
let msg = FileManagerThreadMsg::ReadFile(chan, id, check_url_validity, origin);
let _ = file_manager.send(msg);
let _ = resource_threads.send(CoreResourceMsg::ToFileManager(msg));
let mut bytes = vec![];