Fetch cancellation: Store cancel_chan in XHR

This commit is contained in:
Manish Goregaokar 2017-11-17 13:18:29 -08:00
parent 1dfb125cc9
commit 87e4c15280

View file

@ -154,6 +154,8 @@ pub struct XMLHttpRequest {
response_status: Cell<Result<(), ()>>, response_status: Cell<Result<(), ()>>,
referrer_url: Option<ServoUrl>, referrer_url: Option<ServoUrl>,
referrer_policy: Option<ReferrerPolicy>, referrer_policy: Option<ReferrerPolicy>,
#[ignore_malloc_size_of = "channels are hard"]
cancellation_chan: DomRefCell<Option<ipc::IpcSender<()>>>,
} }
impl XMLHttpRequest { impl XMLHttpRequest {
@ -198,6 +200,7 @@ impl XMLHttpRequest {
response_status: Cell::new(Ok(())), response_status: Cell::new(Ok(())),
referrer_url: referrer_url, referrer_url: referrer_url,
referrer_policy: referrer_policy, referrer_policy: referrer_policy,
cancellation_chan: DomRefCell::new(None),
} }
} }
pub fn new(global: &GlobalScope) -> DomRoot<XMLHttpRequest> { pub fn new(global: &GlobalScope) -> DomRoot<XMLHttpRequest> {
@ -218,7 +221,8 @@ impl XMLHttpRequest {
fn initiate_async_xhr(context: Arc<Mutex<XHRContext>>, fn initiate_async_xhr(context: Arc<Mutex<XHRContext>>,
task_source: NetworkingTaskSource, task_source: NetworkingTaskSource,
global: &GlobalScope, global: &GlobalScope,
init: RequestInit) { init: RequestInit,
cancellation_chan: ipc::IpcReceiver<()>) {
impl FetchResponseListener for XHRContext { impl FetchResponseListener for XHRContext {
fn process_request_body(&mut self) { fn process_request_body(&mut self) {
// todo // todo
@ -255,6 +259,7 @@ impl XMLHttpRequest {
} }
let (action_sender, action_receiver) = ipc::channel().unwrap(); let (action_sender, action_receiver) = ipc::channel().unwrap();
let listener = NetworkListener { let listener = NetworkListener {
context: context, context: context,
task_source: task_source, task_source: task_source,
@ -264,7 +269,7 @@ impl XMLHttpRequest {
listener.notify_fetch(message.to().unwrap()); listener.notify_fetch(message.to().unwrap());
})); }));
global.core_resource_thread().send( global.core_resource_thread().send(
Fetch(init, FetchChannels::ResponseMsg(action_sender, None))).unwrap(); Fetch(init, FetchChannels::ResponseMsg(action_sender, Some(cancellation_chan)))).unwrap();
} }
} }
@ -1311,8 +1316,11 @@ impl XMLHttpRequest {
(global.networking_task_source(), None) (global.networking_task_source(), None)
}; };
let (cancel_sender, cancel_receiver) = ipc::channel().unwrap();
*self.cancellation_chan.borrow_mut() = Some(cancel_sender);
XMLHttpRequest::initiate_async_xhr(context.clone(), task_source, XMLHttpRequest::initiate_async_xhr(context.clone(), task_source,
global, init); global, init, cancel_receiver);
if let Some(script_port) = script_port { if let Some(script_port) = script_port {
loop { loop {