aboutsummaryrefslogtreecommitdiffstats
path: root/components/net
diff options
context:
space:
mode:
authorMs2ger <Ms2ger@gmail.com>2016-11-18 13:09:23 +0100
committerMs2ger <Ms2ger@gmail.com>2016-11-21 10:37:26 +0100
commitae1340bf506eeef71c026e3da10b010eca59d379 (patch)
tree2fd2c6e4bf6603e0afd5094dbb098cd6307089f5 /components/net
parentf672bf9eabdfcf2eca4305c577599900fbb77ea9 (diff)
downloadservo-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.rs13
-rw-r--r--components/net/fetch/methods.rs116
-rw-r--r--components/net/filemanager_thread.rs28
-rw-r--r--components/net/resource_thread.rs6
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),
}