From 1dfb125cc95d37f4d46e5f852639274787684623 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Fri, 17 Nov 2017 12:48:25 -0800 Subject: [PATCH] Fetch cancellation: Add cancel_chan to FetchContext --- components/constellation/network_listener.rs | 4 ++-- components/net/fetch/methods.rs | 2 ++ components/net/resource_thread.rs | 12 +++++++----- components/net_traits/lib.rs | 8 ++++---- components/script/document_loader.rs | 2 +- components/script/dom/eventsource.rs | 4 ++-- components/script/dom/xmlhttprequest.rs | 2 +- components/script/fetch.rs | 2 +- tests/unit/net/fetch.rs | 1 + tests/unit/net/lib.rs | 1 + 10 files changed, 22 insertions(+), 16 deletions(-) diff --git a/components/constellation/network_listener.rs b/components/constellation/network_listener.rs index 034dacf0e85..2a39c4bec94 100644 --- a/components/constellation/network_listener.rs +++ b/components/constellation/network_listener.rs @@ -57,14 +57,14 @@ impl NetworkListener { Some(ref res_init_) => CoreResourceMsg::FetchRedirect( self.req_init.clone(), res_init_.clone(), - ipc_sender), + ipc_sender, None), None => { set_default_accept(Destination::Document, &mut listener.req_init.headers); set_default_accept_language(&mut listener.req_init.headers); CoreResourceMsg::Fetch( listener.req_init.clone(), - FetchChannels::ResponseMsg(ipc_sender)) + FetchChannels::ResponseMsg(ipc_sender, None)) } }; diff --git a/components/net/fetch/methods.rs b/components/net/fetch/methods.rs index f43cd591636..789501fa322 100644 --- a/components/net/fetch/methods.rs +++ b/components/net/fetch/methods.rs @@ -15,6 +15,7 @@ use hyper::header::{Header, HeaderFormat, HeaderView, Headers, Referer as Refere use hyper::method::Method; use hyper::mime::{Mime, SubLevel, TopLevel}; use hyper::status::StatusCode; +use ipc_channel::ipc::IpcReceiver; use mime_guess::guess_mime_type; use net_traits::{FetchTaskTarget, NetworkError, ReferrerPolicy}; use net_traits::request::{CredentialsMode, Destination, Referrer, Request, RequestMode}; @@ -43,6 +44,7 @@ pub struct FetchContext { pub user_agent: Cow<'static, str>, pub devtools_chan: Option>, pub filemanager: FileManager, + pub cancel_chan: Option>, } pub type DoneChannel = Option<(Sender, Receiver)>; diff --git a/components/net/resource_thread.rs b/components/net/resource_thread.rs index 9e1a3c9eee7..8837ae64bf8 100644 --- a/components/net/resource_thread.rs +++ b/components/net/resource_thread.rs @@ -157,14 +157,14 @@ impl ResourceChannelManager { match msg { CoreResourceMsg::Fetch(req_init, channels) => { match channels { - FetchChannels::ResponseMsg(sender) => - self.resource_manager.fetch(req_init, None, sender, http_state), + FetchChannels::ResponseMsg(sender, cancel_chan) => + self.resource_manager.fetch(req_init, None, sender, http_state, cancel_chan), FetchChannels::WebSocket { event_sender, action_receiver } => self.resource_manager.websocket_connect(req_init, event_sender, action_receiver, http_state), } } - CoreResourceMsg::FetchRedirect(req_init, res_init, sender) => - self.resource_manager.fetch(req_init, Some(res_init), sender, http_state), + CoreResourceMsg::FetchRedirect(req_init, res_init, sender, cancel_chan) => + self.resource_manager.fetch(req_init, Some(res_init), sender, http_state, cancel_chan), CoreResourceMsg::SetCookieForUrl(request, cookie, source) => self.resource_manager.set_cookie_for_url(&request, cookie.into_inner(), source, http_state), CoreResourceMsg::SetCookiesForUrl(request, cookies, source) => { @@ -329,7 +329,8 @@ impl CoreResourceManager { req_init: RequestInit, res_init_: Option, mut sender: IpcSender, - http_state: &Arc) { + http_state: &Arc, + cancel_chan: Option>) { let http_state = http_state.clone(); let ua = self.user_agent.clone(); let dc = self.devtools_chan.clone(); @@ -346,6 +347,7 @@ impl CoreResourceManager { user_agent: ua, devtools_chan: dc, filemanager: filemanager, + cancel_chan: cancel_chan, }; match res_init_ { diff --git a/components/net_traits/lib.rs b/components/net_traits/lib.rs index b6e6a447f78..c5aad91ce26 100644 --- a/components/net_traits/lib.rs +++ b/components/net_traits/lib.rs @@ -342,7 +342,7 @@ pub enum WebSocketNetworkEvent { #[derive(Deserialize, Serialize)] /// IPC channels to communicate with the script thread about network or DOM events. pub enum FetchChannels { - ResponseMsg(IpcSender), + ResponseMsg(IpcSender, /* cancel_chan */ Option>), WebSocket { event_sender: IpcSender, action_receiver: IpcReceiver, @@ -353,7 +353,7 @@ pub enum FetchChannels { pub enum CoreResourceMsg { Fetch(RequestInit, FetchChannels), /// Initiate a fetch in response to processing a redirection - FetchRedirect(RequestInit, ResponseInit, IpcSender), + FetchRedirect(RequestInit, ResponseInit, IpcSender, /* cancel_chan */ Option>), /// Store a cookie for a given originating URL SetCookieForUrl(ServoUrl, Serde>, CookieSource), /// Store a set of cookies for a given originating URL @@ -383,7 +383,7 @@ pub fn fetch_async(request: RequestInit, core_resource_thread: &CoreResourceT ROUTER.add_route(action_receiver.to_opaque(), Box::new(move |message| f(message.to().unwrap()))); core_resource_thread.send( - CoreResourceMsg::Fetch(request, FetchChannels::ResponseMsg(action_sender))).unwrap(); + CoreResourceMsg::Fetch(request, FetchChannels::ResponseMsg(action_sender, None))).unwrap(); } #[derive(Clone, Deserialize, MallocSizeOf, Serialize)] @@ -478,7 +478,7 @@ pub fn load_whole_resource(request: RequestInit, -> Result<(Metadata, Vec), NetworkError> { let (action_sender, action_receiver) = ipc::channel().unwrap(); core_resource_thread.send( - CoreResourceMsg::Fetch(request, FetchChannels::ResponseMsg(action_sender))).unwrap(); + CoreResourceMsg::Fetch(request, FetchChannels::ResponseMsg(action_sender, None))).unwrap(); let mut buf = vec![]; let mut metadata = None; diff --git a/components/script/document_loader.rs b/components/script/document_loader.rs index 6102736c04e..9fa1f251dbc 100644 --- a/components/script/document_loader.rs +++ b/components/script/document_loader.rs @@ -126,7 +126,7 @@ impl DocumentLoader { request: RequestInit, fetch_target: IpcSender) { self.resource_threads.sender().send( - CoreResourceMsg::Fetch(request, FetchChannels::ResponseMsg(fetch_target))).unwrap(); + CoreResourceMsg::Fetch(request, FetchChannels::ResponseMsg(fetch_target, None))).unwrap(); } /// Mark an in-progress network request complete. diff --git a/components/script/dom/eventsource.rs b/components/script/dom/eventsource.rs index 1150c70742c..3f2b829a457 100644 --- a/components/script/dom/eventsource.rs +++ b/components/script/dom/eventsource.rs @@ -491,7 +491,7 @@ impl EventSource { listener.notify_fetch(message.to().unwrap()); })); global.core_resource_thread().send( - CoreResourceMsg::Fetch(request, FetchChannels::ResponseMsg(action_sender))).unwrap(); + CoreResourceMsg::Fetch(request, FetchChannels::ResponseMsg(action_sender, None))).unwrap(); // Step 13 Ok(ev) } @@ -555,6 +555,6 @@ impl EventSourceTimeoutCallback { } // Step 5.4 global.core_resource_thread().send( - CoreResourceMsg::Fetch(request, FetchChannels::ResponseMsg(self.action_sender))).unwrap(); + CoreResourceMsg::Fetch(request, FetchChannels::ResponseMsg(self.action_sender, None))).unwrap(); } } diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs index 7ab5593b7fb..09003a7b52c 100644 --- a/components/script/dom/xmlhttprequest.rs +++ b/components/script/dom/xmlhttprequest.rs @@ -264,7 +264,7 @@ impl XMLHttpRequest { listener.notify_fetch(message.to().unwrap()); })); global.core_resource_thread().send( - Fetch(init, FetchChannels::ResponseMsg(action_sender))).unwrap(); + Fetch(init, FetchChannels::ResponseMsg(action_sender, None))).unwrap(); } } diff --git a/components/script/fetch.rs b/components/script/fetch.rs index fe201f0105c..cb1ed112dec 100644 --- a/components/script/fetch.rs +++ b/components/script/fetch.rs @@ -108,7 +108,7 @@ pub fn Fetch(global: &GlobalScope, input: RequestInfo, init: RootedTraceableBox< listener.notify_fetch(message.to().unwrap()); })); core_resource_thread.send( - NetTraitsFetch(request_init, FetchChannels::ResponseMsg(action_sender))).unwrap(); + NetTraitsFetch(request_init, FetchChannels::ResponseMsg(action_sender, None))).unwrap(); promise } diff --git a/tests/unit/net/fetch.rs b/tests/unit/net/fetch.rs index 5c1f6fa793c..3508942dac3 100644 --- a/tests/unit/net/fetch.rs +++ b/tests/unit/net/fetch.rs @@ -538,6 +538,7 @@ fn test_fetch_with_hsts() { user_agent: DEFAULT_USER_AGENT.into(), devtools_chan: None, filemanager: FileManager::new(), + cancel_chan: None, }; { diff --git a/tests/unit/net/lib.rs b/tests/unit/net/lib.rs index 2116fa3dd83..bb5aed81fb3 100644 --- a/tests/unit/net/lib.rs +++ b/tests/unit/net/lib.rs @@ -61,6 +61,7 @@ fn new_fetch_context(dc: Option>) -> FetchContext { user_agent: DEFAULT_USER_AGENT.into(), devtools_chan: dc, filemanager: FileManager::new(), + cancel_chan: None, } } impl FetchTaskTarget for FetchResponseCollector {