Fetch cancellation: Add CancellationListener

This commit is contained in:
Manish Goregaokar 2017-11-17 14:57:07 -08:00
parent 27457e4d84
commit 6dd7af2bda
4 changed files with 38 additions and 10 deletions

View file

@ -28,7 +28,7 @@ use std::fs::File;
use std::io::Read; use std::io::Read;
use std::mem; use std::mem;
use std::str; use std::str;
use std::sync::Arc; use std::sync::{Arc, Mutex};
use std::sync::mpsc::{Sender, Receiver}; use std::sync::mpsc::{Sender, Receiver};
use subresource_integrity::is_response_integrity_valid; use subresource_integrity::is_response_integrity_valid;
@ -44,9 +44,37 @@ pub struct FetchContext {
pub user_agent: Cow<'static, str>, pub user_agent: Cow<'static, str>,
pub devtools_chan: Option<Sender<DevtoolsControlMsg>>, pub devtools_chan: Option<Sender<DevtoolsControlMsg>>,
pub filemanager: FileManager, pub filemanager: FileManager,
pub cancel_chan: Option<IpcReceiver<()>>, pub cancellation_listener: Arc<Mutex<CancellationListener>>,
} }
pub struct CancellationListener {
cancel_chan: Option<IpcReceiver<()>>,
cancelled: bool,
}
impl CancellationListener {
pub fn new(cancel_chan: Option<IpcReceiver<()>>) -> Self {
Self {
cancel_chan: cancel_chan,
cancelled: false,
}
}
pub fn cancelled(&mut self) -> bool {
if let Some(ref cancel_chan) = self.cancel_chan {
if self.cancelled {
true
} else if cancel_chan.try_recv().is_ok() {
self.cancelled = true;
true
} else {
false
}
} else {
false
}
}
}
pub type DoneChannel = Option<(Sender<Data>, Receiver<Data>)>; pub type DoneChannel = Option<(Sender<Data>, Receiver<Data>)>;
/// [Fetch](https://fetch.spec.whatwg.org#concept-fetch) /// [Fetch](https://fetch.spec.whatwg.org#concept-fetch)

View file

@ -9,7 +9,7 @@ use cookie_rs;
use cookie_storage::CookieStorage; use cookie_storage::CookieStorage;
use devtools_traits::DevtoolsControlMsg; use devtools_traits::DevtoolsControlMsg;
use fetch::cors_cache::CorsCache; use fetch::cors_cache::CorsCache;
use fetch::methods::{FetchContext, fetch}; use fetch::methods::{CancellationListener, FetchContext, fetch};
use filemanager_thread::{FileManager, TFDProvider}; use filemanager_thread::{FileManager, TFDProvider};
use hsts::HstsList; use hsts::HstsList;
use http_loader::{HttpState, http_redirect_fetch}; use http_loader::{HttpState, http_redirect_fetch};
@ -35,7 +35,7 @@ use std::fs::File;
use std::io::prelude::*; use std::io::prelude::*;
use std::ops::Deref; use std::ops::Deref;
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use std::sync::{Arc, RwLock}; use std::sync::{Arc, Mutex, RwLock};
use std::sync::mpsc::Sender; use std::sync::mpsc::Sender;
use std::thread; use std::thread;
use storage_thread::StorageThreadFactory; use storage_thread::StorageThreadFactory;
@ -347,7 +347,7 @@ impl CoreResourceManager {
user_agent: ua, user_agent: ua,
devtools_chan: dc, devtools_chan: dc,
filemanager: filemanager, filemanager: filemanager,
cancel_chan: cancel_chan, cancellation_listener: Arc::new(Mutex::new(CancellationListener::new(cancel_chan))),
}; };
match res_init_ { match res_init_ {

View file

@ -25,7 +25,7 @@ use hyper_openssl;
use msg::constellation_msg::TEST_PIPELINE_ID; use msg::constellation_msg::TEST_PIPELINE_ID;
use net::connector::create_ssl_client; use net::connector::create_ssl_client;
use net::fetch::cors_cache::CorsCache; use net::fetch::cors_cache::CorsCache;
use net::fetch::methods::FetchContext; use net::fetch::methods::{CancellationListener, FetchContext};
use net::filemanager_thread::FileManager; use net::filemanager_thread::FileManager;
use net::hsts::HstsEntry; use net::hsts::HstsEntry;
use net::test::HttpState; use net::test::HttpState;
@ -538,7 +538,7 @@ fn test_fetch_with_hsts() {
user_agent: DEFAULT_USER_AGENT.into(), user_agent: DEFAULT_USER_AGENT.into(),
devtools_chan: None, devtools_chan: None,
filemanager: FileManager::new(), filemanager: FileManager::new(),
cancel_chan: None, cancellation_listener: Arc::new(Mutex::new(CancellationListener::new(None))),
}; };
{ {

View file

@ -36,7 +36,7 @@ use devtools_traits::DevtoolsControlMsg;
use hyper::server::{Handler, Listening, Server}; use hyper::server::{Handler, Listening, Server};
use net::connector::create_ssl_client; use net::connector::create_ssl_client;
use net::fetch::cors_cache::CorsCache; use net::fetch::cors_cache::CorsCache;
use net::fetch::methods::{self, FetchContext}; use net::fetch::methods::{self, CancellationListener, FetchContext};
use net::filemanager_thread::FileManager; use net::filemanager_thread::FileManager;
use net::test::HttpState; use net::test::HttpState;
use net_traits::FetchTaskTarget; use net_traits::FetchTaskTarget;
@ -44,7 +44,7 @@ use net_traits::request::Request;
use net_traits::response::Response; use net_traits::response::Response;
use servo_config::resource_files::resources_dir_path; use servo_config::resource_files::resources_dir_path;
use servo_url::ServoUrl; use servo_url::ServoUrl;
use std::sync::Arc; use std::sync::{Arc, Mutex};
use std::sync::mpsc::{Sender, channel}; use std::sync::mpsc::{Sender, channel};
const DEFAULT_USER_AGENT: &'static str = "Such Browser. Very Layout. Wow."; const DEFAULT_USER_AGENT: &'static str = "Such Browser. Very Layout. Wow.";
@ -61,7 +61,7 @@ fn new_fetch_context(dc: Option<Sender<DevtoolsControlMsg>>) -> FetchContext {
user_agent: DEFAULT_USER_AGENT.into(), user_agent: DEFAULT_USER_AGENT.into(),
devtools_chan: dc, devtools_chan: dc,
filemanager: FileManager::new(), filemanager: FileManager::new(),
cancel_chan: None, cancellation_listener: Arc::new(Mutex::new(CancellationListener::new(None))),
} }
} }
impl FetchTaskTarget for FetchResponseCollector { impl FetchTaskTarget for FetchResponseCollector {