mirror of
https://github.com/servo/servo.git
synced 2025-08-06 06:00:15 +01:00
Add cancellability to file manager load and related refactoring
This commit is contained in:
parent
7807895d58
commit
17ae38a318
12 changed files with 137 additions and 189 deletions
|
@ -19,7 +19,6 @@ use js::jsapi::{CurrentGlobalOrNull, GetGlobalForObjectCrossCompartment};
|
|||
use js::jsapi::{JSContext, JSObject, JS_GetClass, MutableHandleValue};
|
||||
use js::{JSCLASS_IS_DOMJSCLASS, JSCLASS_IS_GLOBAL};
|
||||
use msg::constellation_msg::PipelineId;
|
||||
use net_traits::filemanager_thread::FileManagerThreadMsg;
|
||||
use net_traits::{ResourceThreads, CoreResourceThread, IpcSend};
|
||||
use profile_traits::{mem, time};
|
||||
use script_runtime::{CommonScriptMsg, ScriptChan, ScriptPort};
|
||||
|
@ -133,11 +132,6 @@ impl<'a> GlobalRef<'a> {
|
|||
self.resource_threads().sender()
|
||||
}
|
||||
|
||||
/// Get the port to file manager for this global scope
|
||||
pub fn filemanager_thread(&self) -> IpcSender<FileManagerThreadMsg> {
|
||||
self.resource_threads().sender()
|
||||
}
|
||||
|
||||
/// Get the worker's id.
|
||||
pub fn get_worker_id(&self) -> Option<WorkerId> {
|
||||
match *self {
|
||||
|
|
|
@ -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![];
|
||||
|
||||
|
|
|
@ -34,9 +34,9 @@ use dom::virtualmethods::VirtualMethods;
|
|||
use ipc_channel::ipc::{self, IpcSender};
|
||||
use mime_guess;
|
||||
use msg::constellation_msg::Key;
|
||||
use net_traits::IpcSend;
|
||||
use net_traits::blob_url_store::get_blob_origin;
|
||||
use net_traits::filemanager_thread::{FileManagerThreadMsg, FilterPattern};
|
||||
use net_traits::{IpcSend, CoreResourceMsg};
|
||||
use script_traits::ScriptMsg as ConstellationMsg;
|
||||
use std::borrow::ToOwned;
|
||||
use std::cell::Cell;
|
||||
|
@ -780,7 +780,7 @@ impl HTMLInputElement {
|
|||
fn select_files(&self, opt_test_paths: Option<Vec<DOMString>>) {
|
||||
let window = window_from_node(self);
|
||||
let origin = get_blob_origin(&window.get_url());
|
||||
let filemanager = window.resource_threads().sender();
|
||||
let resource_threads = window.resource_threads();
|
||||
|
||||
let mut files: Vec<Root<File>> = vec![];
|
||||
let mut error = None;
|
||||
|
@ -793,7 +793,7 @@ impl HTMLInputElement {
|
|||
|
||||
let (chan, recv) = ipc::channel().expect("Error initializing channel");
|
||||
let msg = FileManagerThreadMsg::SelectFiles(filter, chan, origin, opt_test_paths);
|
||||
let _ = filemanager.send(msg).unwrap();
|
||||
let _ = resource_threads.send(CoreResourceMsg::ToFileManager(msg)).unwrap();
|
||||
|
||||
match recv.recv().expect("IpcSender side error") {
|
||||
Ok(selected_files) => {
|
||||
|
@ -817,7 +817,7 @@ impl HTMLInputElement {
|
|||
|
||||
let (chan, recv) = ipc::channel().expect("Error initializing channel");
|
||||
let msg = FileManagerThreadMsg::SelectFile(filter, chan, origin, opt_test_path);
|
||||
let _ = filemanager.send(msg).unwrap();
|
||||
let _ = resource_threads.send(CoreResourceMsg::ToFileManager(msg)).unwrap();
|
||||
|
||||
match recv.recv().expect("IpcSender side error") {
|
||||
Ok(selected) => {
|
||||
|
|
|
@ -14,9 +14,9 @@ use dom::blob::Blob;
|
|||
use dom::urlhelper::UrlHelper;
|
||||
use dom::urlsearchparams::URLSearchParams;
|
||||
use ipc_channel::ipc;
|
||||
use net_traits::IpcSend;
|
||||
use net_traits::blob_url_store::{get_blob_origin, parse_blob_url};
|
||||
use net_traits::filemanager_thread::{SelectedFileId, FileManagerThreadMsg};
|
||||
use net_traits::{IpcSend, CoreResourceMsg};
|
||||
use std::borrow::ToOwned;
|
||||
use std::default::Default;
|
||||
use url::quirks::domain_to_unicode;
|
||||
|
@ -145,11 +145,11 @@ impl URL {
|
|||
|
||||
if let Ok(url) = Url::parse(&url) {
|
||||
if let Ok((id, _, _)) = parse_blob_url(&url) {
|
||||
let filemanager = global.resource_threads().sender();
|
||||
let resource_threads = global.resource_threads();
|
||||
let id = SelectedFileId(id.simple().to_string());
|
||||
let (tx, rx) = ipc::channel().unwrap();
|
||||
let msg = FileManagerThreadMsg::RevokeBlobURL(id, origin, tx);
|
||||
let _ = filemanager.send(msg);
|
||||
let _ = resource_threads.send(CoreResourceMsg::ToFileManager(msg));
|
||||
|
||||
let _ = rx.recv().unwrap();
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue