diff options
author | Zhen Zhang <izgzhen@gmail.com> | 2016-07-08 19:52:10 +0800 |
---|---|---|
committer | Zhen Zhang <izgzhen@gmail.com> | 2016-07-09 15:31:00 +0800 |
commit | 5e051c08f69cb17d610c14b208c68fc4896c55ba (patch) | |
tree | 85a294c6d17493671656f7f32db52c18f824ae71 /components/net/filemanager_thread.rs | |
parent | c2a22bd05e0c8282175422df26e188ef63bcc452 (diff) | |
download | servo-5e051c08f69cb17d610c14b208c68fc4896c55ba.tar.gz servo-5e051c08f69cb17d610c14b208c68fc4896c55ba.zip |
Add ability to WPT-test file uploads and fetches, fixes #12322
Diffstat (limited to 'components/net/filemanager_thread.rs')
-rw-r--r-- | components/net/filemanager_thread.rs | 41 |
1 files changed, 33 insertions, 8 deletions
diff --git a/components/net/filemanager_thread.rs b/components/net/filemanager_thread.rs index 3ff8579e0d2..627dcced0e9 100644 --- a/components/net/filemanager_thread.rs +++ b/components/net/filemanager_thread.rs @@ -21,6 +21,7 @@ use std::sync::{Arc, RwLock}; #[cfg(any(target_os = "macos", target_os = "linux"))] use tinyfiledialogs; use url::Url; +use util::prefs::PREFS; use util::thread::spawn_named; use uuid::Uuid; @@ -128,14 +129,14 @@ impl<UI: 'static + UIProvider> FileManager<UI> { loop { let store = self.store.clone(); match self.receiver.recv().unwrap() { - FileManagerThreadMsg::SelectFile(filter, sender, origin) => { + FileManagerThreadMsg::SelectFile(filter, sender, origin, opt_test_path) => { spawn_named("select file".to_owned(), move || { - store.select_file(filter, sender, origin); + store.select_file(filter, sender, origin, opt_test_path); }); } - FileManagerThreadMsg::SelectFiles(filter, sender, origin) => { + FileManagerThreadMsg::SelectFiles(filter, sender, origin, opt_test_paths) => { spawn_named("select files".to_owned(), move || { - store.select_files(filter, sender, origin); + store.select_files(filter, sender, origin, opt_test_paths); }) } FileManagerThreadMsg::ReadFile(sender, id, origin) => { @@ -309,8 +310,17 @@ impl <UI: 'static + UIProvider> FileManagerStore<UI> { fn select_file(&self, patterns: Vec<FilterPattern>, sender: IpcSender<FileManagerResult<SelectedFile>>, - origin: FileOrigin) { - match self.ui.open_file_dialog("", patterns) { + origin: FileOrigin, opt_test_path: Option<String>) { + // Check if the select_files preference is enabled + // to ensure process-level security against compromised script; + // Then try applying opt_test_path directly for testing convenience + let opt_s = if select_files_pref_enabled() { + opt_test_path + } else { + self.ui.open_file_dialog("", patterns) + }; + + match opt_s { Some(s) => { let selected_path = Path::new(&s); @@ -328,8 +338,17 @@ impl <UI: 'static + UIProvider> FileManagerStore<UI> { fn select_files(&self, patterns: Vec<FilterPattern>, sender: IpcSender<FileManagerResult<Vec<SelectedFile>>>, - origin: FileOrigin) { - match self.ui.open_file_dialog_multi("", patterns) { + origin: FileOrigin, opt_test_paths: Option<Vec<String>>) { + // Check if the select_files preference is enabled + // to ensure process-level security against compromised script; + // Then try applying opt_test_paths directly for testing convenience + let opt_v = if select_files_pref_enabled() { + opt_test_paths + } else { + self.ui.open_file_dialog_multi("", patterns) + }; + + match opt_v { Some(v) => { let mut selected_paths = vec![]; @@ -481,3 +500,9 @@ impl <UI: 'static + UIProvider> FileManagerStore<UI> { } } } + + +fn select_files_pref_enabled() -> bool { + PREFS.get("dom.testing.htmlinputelement.select_files.enabled") + .as_boolean().unwrap_or(false) +} |