diff options
author | Ms2ger <Ms2ger@gmail.com> | 2016-11-18 13:09:23 +0100 |
---|---|---|
committer | Ms2ger <Ms2ger@gmail.com> | 2016-11-21 10:37:26 +0100 |
commit | ae1340bf506eeef71c026e3da10b010eca59d379 (patch) | |
tree | 2fd2c6e4bf6603e0afd5094dbb098cd6307089f5 /components/net | |
parent | f672bf9eabdfcf2eca4305c577599900fbb77ea9 (diff) | |
download | servo-ae1340bf506eeef71c026e3da10b010eca59d379.tar.gz servo-ae1340bf506eeef71c026e3da10b010eca59d379.zip |
Pass the UIProvider to FileManager::handle() as needed.
Diffstat (limited to 'components/net')
-rw-r--r-- | components/net/blob_loader.rs | 13 | ||||
-rw-r--r-- | components/net/fetch/methods.rs | 116 | ||||
-rw-r--r-- | components/net/filemanager_thread.rs | 28 | ||||
-rw-r--r-- | components/net/resource_thread.rs | 6 |
4 files changed, 77 insertions, 86 deletions
diff --git a/components/net/blob_loader.rs b/components/net/blob_loader.rs index 35aa34ac978..6bd5ff4c23f 100644 --- a/components/net/blob_loader.rs +++ b/components/net/blob_loader.rs @@ -2,7 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -use filemanager_thread::{FileManager, UIProvider}; +use filemanager_thread::FileManager; use hyper::header::{Charset, ContentLength, ContentType, Headers}; use hyper::header::{ContentDisposition, DispositionParam, DispositionType}; use hyper_serde::Serde; @@ -24,7 +24,7 @@ use util::thread::spawn_named; // TODO: Check on GET // https://w3c.github.io/FileAPI/#requestResponseModel -pub fn factory<UI: 'static + UIProvider>(filemanager: FileManager<UI>) +pub fn factory(filemanager: FileManager) -> Box<FnBox(LoadData, LoadConsumer, Arc<MimeClassifier>, CancellationListener) + Send> { box move |load_data: LoadData, start_chan, classifier, cancel_listener| { spawn_named(format!("blob loader for {}", load_data.url), move || { @@ -33,10 +33,9 @@ pub fn factory<UI: 'static + UIProvider>(filemanager: FileManager<UI>) } } -fn load_blob<UI: 'static + UIProvider> - (load_data: LoadData, start_chan: LoadConsumer, +fn load_blob(load_data: LoadData, start_chan: LoadConsumer, classifier: Arc<MimeClassifier>, - filemanager: FileManager<UI>, + filemanager: FileManager, cancel_listener: CancellationListener) { let (chan, recv) = ipc::channel().unwrap(); if let Ok((id, origin, _fragment)) = parse_blob_url(&load_data.url.clone()) { @@ -122,9 +121,9 @@ fn load_blob<UI: 'static + UIProvider> /// https://fetch.spec.whatwg.org/#concept-basic-fetch (partial) // TODO: make async. -pub fn load_blob_sync<UI: 'static + UIProvider> +pub fn load_blob_sync (url: ServoUrl, - filemanager: FileManager<UI>) + filemanager: FileManager) -> Result<(Headers, Vec<u8>), NetworkError> { let (id, origin) = match parse_blob_url(&url) { Ok((id, origin, _fragment)) => (id, origin), diff --git a/components/net/fetch/methods.rs b/components/net/fetch/methods.rs index 82bfd0f7c1d..f6a6c62f489 100644 --- a/components/net/fetch/methods.rs +++ b/components/net/fetch/methods.rs @@ -7,7 +7,7 @@ use connector::create_http_connector; use data_loader::decode; use devtools_traits::DevtoolsControlMsg; use fetch::cors_cache::CorsCache; -use filemanager_thread::{FileManager, UIProvider}; +use filemanager_thread::FileManager; use http_loader::{HttpState, set_default_accept_encoding, set_default_accept_language, set_request_cookies}; use http_loader::{NetworkHttpRequestFactory, ReadResult, StreamedResponse, obtain_response, read_block}; use http_loader::{auth_from_cache, determine_request_referrer, set_cookies_from_headers}; @@ -52,28 +52,28 @@ enum Data { Done, } -pub struct FetchContext<UI: 'static + UIProvider> { +pub struct FetchContext { pub state: HttpState, pub user_agent: Cow<'static, str>, pub devtools_chan: Option<Sender<DevtoolsControlMsg>>, - pub filemanager: FileManager<UI>, + pub filemanager: FileManager, } type DoneChannel = Option<(Sender<Data>, Receiver<Data>)>; /// [Fetch](https://fetch.spec.whatwg.org#concept-fetch) -pub fn fetch<UI: 'static + UIProvider>(request: Rc<Request>, - target: &mut Target, - context: &FetchContext<UI>) - -> Response { +pub fn fetch(request: Rc<Request>, + target: &mut Target, + context: &FetchContext) + -> Response { fetch_with_cors_cache(request, &mut CorsCache::new(), target, context) } -pub fn fetch_with_cors_cache<UI: 'static + UIProvider>(request: Rc<Request>, - cache: &mut CorsCache, - target: &mut Target, - context: &FetchContext<UI>) - -> Response { +pub fn fetch_with_cors_cache(request: Rc<Request>, + cache: &mut CorsCache, + target: &mut Target, + context: &FetchContext) + -> Response { // Step 1 if request.window.get() == Window::Client { // TODO: Set window to request's client object if client is a Window object @@ -136,14 +136,14 @@ pub fn fetch_with_cors_cache<UI: 'static + UIProvider>(request: Rc<Request>, } /// [Main fetch](https://fetch.spec.whatwg.org/#concept-main-fetch) -fn main_fetch<UI: 'static + UIProvider>(request: Rc<Request>, - cache: &mut CorsCache, - cors_flag: bool, - recursive_flag: bool, - target: &mut Target, - done_chan: &mut DoneChannel, - context: &FetchContext<UI>) - -> Response { +fn main_fetch(request: Rc<Request>, + cache: &mut CorsCache, + cors_flag: bool, + recursive_flag: bool, + target: &mut Target, + done_chan: &mut DoneChannel, + context: &FetchContext) + -> Response { // TODO: Implement main fetch spec // Step 1 @@ -400,12 +400,12 @@ fn main_fetch<UI: 'static + UIProvider>(request: Rc<Request>, } /// [Basic fetch](https://fetch.spec.whatwg.org#basic-fetch) -fn basic_fetch<UI: 'static + UIProvider>(request: Rc<Request>, - cache: &mut CorsCache, - target: &mut Target, - done_chan: &mut DoneChannel, - context: &FetchContext<UI>) - -> Response { +fn basic_fetch(request: Rc<Request>, + cache: &mut CorsCache, + target: &mut Target, + done_chan: &mut DoneChannel, + context: &FetchContext) + -> Response { let url = request.current_url(); match url.scheme() { @@ -492,15 +492,15 @@ fn basic_fetch<UI: 'static + UIProvider>(request: Rc<Request>, } /// [HTTP fetch](https://fetch.spec.whatwg.org#http-fetch) -fn http_fetch<UI: 'static + UIProvider>(request: Rc<Request>, - cache: &mut CorsCache, - cors_flag: bool, - cors_preflight_flag: bool, - authentication_fetch_flag: bool, - target: &mut Target, - done_chan: &mut DoneChannel, - context: &FetchContext<UI>) - -> Response { +fn http_fetch(request: Rc<Request>, + cache: &mut CorsCache, + cors_flag: bool, + cors_preflight_flag: bool, + authentication_fetch_flag: bool, + target: &mut Target, + done_chan: &mut DoneChannel, + context: &FetchContext) + -> Response { // This is a new async fetch, reset the channel we are waiting on *done_chan = None; // Step 1 @@ -667,14 +667,14 @@ fn http_fetch<UI: 'static + UIProvider>(request: Rc<Request>, } /// [HTTP redirect fetch](https://fetch.spec.whatwg.org#http-redirect-fetch) -fn http_redirect_fetch<UI: 'static + UIProvider>(request: Rc<Request>, - cache: &mut CorsCache, - response: Response, - cors_flag: bool, - target: &mut Target, - done_chan: &mut DoneChannel, - context: &FetchContext<UI>) - -> Response { +fn http_redirect_fetch(request: Rc<Request>, + cache: &mut CorsCache, + response: Response, + cors_flag: bool, + target: &mut Target, + done_chan: &mut DoneChannel, + context: &FetchContext) + -> Response { // Step 1 assert_eq!(response.return_internal.get(), true); @@ -748,12 +748,12 @@ fn http_redirect_fetch<UI: 'static + UIProvider>(request: Rc<Request>, } /// [HTTP network or cache fetch](https://fetch.spec.whatwg.org#http-network-or-cache-fetch) -fn http_network_or_cache_fetch<UI: 'static + UIProvider>(request: Rc<Request>, - credentials_flag: bool, - authentication_fetch_flag: bool, - done_chan: &mut DoneChannel, - context: &FetchContext<UI>) - -> Response { +fn http_network_or_cache_fetch(request: Rc<Request>, + credentials_flag: bool, + authentication_fetch_flag: bool, + done_chan: &mut DoneChannel, + context: &FetchContext) + -> Response { // TODO: Implement Window enum for Request let request_has_no_window = true; @@ -970,11 +970,11 @@ fn http_network_or_cache_fetch<UI: 'static + UIProvider>(request: Rc<Request>, } /// [HTTP network fetch](https://fetch.spec.whatwg.org/#http-network-fetch) -fn http_network_fetch<UI: 'static + UIProvider>(request: Rc<Request>, - credentials_flag: bool, - done_chan: &mut DoneChannel, - context: &FetchContext<UI>) - -> Response { +fn http_network_fetch(request: Rc<Request>, + credentials_flag: bool, + done_chan: &mut DoneChannel, + context: &FetchContext) + -> Response { // TODO: Implement HTTP network fetch spec // Step 1 @@ -1158,10 +1158,10 @@ fn http_network_fetch<UI: 'static + UIProvider>(request: Rc<Request>, } /// [CORS preflight fetch](https://fetch.spec.whatwg.org#cors-preflight-fetch) -fn cors_preflight_fetch<UI: 'static + UIProvider>(request: Rc<Request>, - cache: &mut CorsCache, - context: &FetchContext<UI>) - -> Response { +fn cors_preflight_fetch(request: Rc<Request>, + cache: &mut CorsCache, + context: &FetchContext) + -> Response { // Step 1 let mut preflight = Request::new(request.current_url(), Some(request.origin.borrow().clone()), request.is_service_worker_global_scope, request.pipeline_id.get()); diff --git a/components/net/filemanager_thread.rs b/components/net/filemanager_thread.rs index 03aaa22eb38..f109c77c251 100644 --- a/components/net/filemanager_thread.rs +++ b/components/net/filemanager_thread.rs @@ -112,26 +112,15 @@ enum FileImpl { Sliced(Uuid, RelativePos), } -pub struct FileManager<UI: 'static + UIProvider> { +#[derive(Clone)] +pub struct FileManager { store: Arc<FileManagerStore>, - ui: &'static UI, } -// Not derived to avoid an unnecessary `UI: Clone` bound. -impl<UI: 'static + UIProvider> Clone for FileManager<UI> { - fn clone(&self) -> Self { - FileManager { - store: self.store.clone(), - ui: self.ui, - } - } -} - -impl<UI: 'static + UIProvider> FileManager<UI> { - pub fn new(ui: &'static UI) -> FileManager<UI> { +impl FileManager { + pub fn new() -> FileManager { FileManager { store: Arc::new(FileManagerStore::new()), - ui: ui, } } @@ -162,18 +151,21 @@ impl<UI: 'static + UIProvider> FileManager<UI> { } /// Message handler - pub fn handle(&self, msg: FileManagerThreadMsg, cancel_listener: Option<CancellationListener>) { + pub fn handle<UI>(&self, + msg: FileManagerThreadMsg, + cancel_listener: Option<CancellationListener>, + ui: &'static UI) + where UI: UIProvider + 'static, + { match msg { FileManagerThreadMsg::SelectFile(filter, sender, origin, opt_test_path) => { let store = self.store.clone(); - let ui = self.ui; spawn_named("select file".to_owned(), move || { store.select_file(filter, sender, origin, opt_test_path, ui); }); } FileManagerThreadMsg::SelectFiles(filter, sender, origin, opt_test_paths) => { let store = self.store.clone(); - let ui = self.ui; spawn_named("select files".to_owned(), move || { store.select_files(filter, sender, origin, opt_test_paths, ui); }) diff --git a/components/net/resource_thread.rs b/components/net/resource_thread.rs index aaef8b68773..17835b52747 100644 --- a/components/net/resource_thread.rs +++ b/components/net/resource_thread.rs @@ -285,7 +285,7 @@ impl ResourceChannelManager { CoreResourceMsg::Synchronize(sender) => { let _ = sender.send(()); } - CoreResourceMsg::ToFileManager(msg) => self.resource_manager.filemanager.handle(msg, None), + CoreResourceMsg::ToFileManager(msg) => self.resource_manager.filemanager.handle(msg, None, TFD_PROVIDER), CoreResourceMsg::Exit(sender) => { if let Some(ref config_dir) = self.config_dir { match group.auth_cache.read() { @@ -455,7 +455,7 @@ pub struct CoreResourceManager { devtools_chan: Option<Sender<DevtoolsControlMsg>>, swmanager_chan: Option<IpcSender<CustomResponseMediator>>, profiler_chan: ProfilerChan, - filemanager: FileManager<TFDProvider>, + filemanager: FileManager, cancel_load_map: HashMap<ResourceId, Sender<()>>, next_resource_id: ResourceId, } @@ -470,7 +470,7 @@ impl CoreResourceManager { devtools_chan: devtools_channel, swmanager_chan: None, profiler_chan: profiler_chan, - filemanager: FileManager::new(TFD_PROVIDER), + filemanager: FileManager::new(), cancel_load_map: HashMap::new(), next_resource_id: ResourceId(0), } |