diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2016-08-02 16:57:46 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-08-02 16:57:46 -0500 |
commit | b2f69f363574d5dea3cb96d4ef00c1d4e56bdd63 (patch) | |
tree | 419954a6061f18b47448b3a4e5a29c1ab639d83c /components/script | |
parent | 7807895d5839ddd8e042b7e741961a75b70c37d8 (diff) | |
parent | 17ae38a31880e32afe8458a132b838241579f073 (diff) | |
download | servo-b2f69f363574d5dea3cb96d4ef00c1d4e56bdd63.tar.gz servo-b2f69f363574d5dea3cb96d4ef00c1d4e56bdd63.zip |
Auto merge of #12684 - izgzhen:cancel-file-manager, r=Manishearth
Add cancellability to file manager load and related refactoring
Fixes #12589.
r? @Manishearth
---
- [x] `./mach build -d` does not report any errors
- [x] `./mach test-tidy` does not report any errors
- [x] These changes fix #12589
- [x] There are tests for these changes OR
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/12684)
<!-- Reviewable:end -->
Diffstat (limited to 'components/script')
-rw-r--r-- | components/script/dom/bindings/global.rs | 6 | ||||
-rw-r--r-- | components/script/dom/blob.rs | 25 | ||||
-rw-r--r-- | components/script/dom/htmlinputelement.rs | 8 | ||||
-rw-r--r-- | components/script/dom/url.rs | 6 |
4 files changed, 21 insertions, 24 deletions
diff --git a/components/script/dom/bindings/global.rs b/components/script/dom/bindings/global.rs index fe81b8a14de..bfc3212a9c4 100644 --- a/components/script/dom/bindings/global.rs +++ b/components/script/dom/bindings/global.rs @@ -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 { diff --git a/components/script/dom/blob.rs b/components/script/dom/blob.rs index 2f3865b7ce0..4711da80010 100644 --- a/components/script/dom/blob.rs +++ b/components/script/dom/blob.rs @@ -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![]; diff --git a/components/script/dom/htmlinputelement.rs b/components/script/dom/htmlinputelement.rs index 6f7a7a755f5..a98fcbcfb4e 100644 --- a/components/script/dom/htmlinputelement.rs +++ b/components/script/dom/htmlinputelement.rs @@ -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) => { diff --git a/components/script/dom/url.rs b/components/script/dom/url.rs index 81c806de806..768dabf1475 100644 --- a/components/script/dom/url.rs +++ b/components/script/dom/url.rs @@ -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(); } |