Make network listener runnable cancellable

This commit is contained in:
Connor Brewster 2016-07-05 14:45:09 -06:00
parent b9af49f120
commit 315ffe7677
6 changed files with 21 additions and 5 deletions

View file

@ -226,6 +226,7 @@ impl HTMLLinkElement {
let listener = NetworkListener { let listener = NetworkListener {
context: context, context: context,
script_chan: document.window().networking_task_source(), script_chan: document.window().networking_task_source(),
wrapper: Some(document.window().get_runnable_wrapper()),
}; };
let response_target = AsyncResponseTarget { let response_target = AsyncResponseTarget {
sender: action_sender, sender: action_sender,

View file

@ -473,10 +473,12 @@ impl HTMLMediaElement {
// 4.2 // 4.2
let context = Arc::new(Mutex::new(HTMLMediaElementContext::new(self, url.clone()))); let context = Arc::new(Mutex::new(HTMLMediaElementContext::new(self, url.clone())));
let (action_sender, action_receiver) = ipc::channel().unwrap(); let (action_sender, action_receiver) = ipc::channel().unwrap();
let script_chan = window_from_node(self).networking_task_source(); let window = window_from_node(self);
let script_chan = window.networking_task_source();
let listener = box NetworkListener { let listener = box NetworkListener {
context: context, context: context,
script_chan: script_chan, script_chan: script_chan,
wrapper: Some(window.get_runnable_wrapper()),
}; };
let response_target = AsyncResponseTarget { let response_target = AsyncResponseTarget {

View file

@ -308,6 +308,7 @@ impl HTMLScriptElement {
let listener = NetworkListener { let listener = NetworkListener {
context: context, context: context,
script_chan: doc.window().networking_task_source(), script_chan: doc.window().networking_task_source(),
wrapper: Some(doc.window().get_runnable_wrapper()),
}; };
let response_target = AsyncResponseTarget { let response_target = AsyncResponseTarget {
sender: action_sender, sender: action_sender,

View file

@ -258,6 +258,7 @@ impl XMLHttpRequest {
let listener = NetworkListener { let listener = NetworkListener {
context: context, context: context,
script_chan: script_chan, script_chan: script_chan,
wrapper: None,
}; };
ROUTER.add_route(action_receiver.to_opaque(), box move |message| { ROUTER.add_route(action_receiver.to_opaque(), box move |message| {
listener.notify_fetch(message.to().unwrap()); listener.notify_fetch(message.to().unwrap());

View file

@ -6,7 +6,7 @@ use net_traits::{Action, AsyncResponseListener, FetchResponseListener};
use net_traits::{FetchResponseMsg, ResponseAction}; use net_traits::{FetchResponseMsg, ResponseAction};
use script_runtime::ScriptThreadEventCategory::NetworkEvent; use script_runtime::ScriptThreadEventCategory::NetworkEvent;
use script_runtime::{CommonScriptMsg, ScriptChan}; use script_runtime::{CommonScriptMsg, ScriptChan};
use script_thread::Runnable; use script_thread::{Runnable, RunnableWrapper};
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
/// An off-thread sink for async network event runnables. All such events are forwarded to /// An off-thread sink for async network event runnables. All such events are forwarded to
@ -14,15 +14,25 @@ use std::sync::{Arc, Mutex};
pub struct NetworkListener<Listener: PreInvoke + Send + 'static> { pub struct NetworkListener<Listener: PreInvoke + Send + 'static> {
pub context: Arc<Mutex<Listener>>, pub context: Arc<Mutex<Listener>>,
pub script_chan: Box<ScriptChan + Send>, pub script_chan: Box<ScriptChan + Send>,
pub wrapper: Option<RunnableWrapper>,
} }
impl<Listener: PreInvoke + Send + 'static> NetworkListener<Listener> { impl<Listener: PreInvoke + Send + 'static> NetworkListener<Listener> {
pub fn notify<A: Action<Listener> + Send + 'static>(&self, action: A) { pub fn notify<A: Action<Listener> + Send + 'static>(&self, action: A) {
if let Err(err) = self.script_chan.send(CommonScriptMsg::RunnableMsg(NetworkEvent, box ListenerRunnable { let runnable = ListenerRunnable {
context: self.context.clone(), context: self.context.clone(),
action: action, action: action,
})) { };
warn!("failed to deliver network data: {:?}", err); if let Some(ref wrapper) = self.wrapper {
if let Err(err) = self.script_chan.send(
CommonScriptMsg::RunnableMsg(NetworkEvent, wrapper.wrap_runnable(runnable))) {
warn!("failed to deliver network data: {:?}", err);
}
} else {
if let Err(err) = self.script_chan.send(
CommonScriptMsg::RunnableMsg(NetworkEvent, box runnable)) {
warn!("failed to deliver network data: {:?}", err);
}
} }
} }
} }

View file

@ -2055,6 +2055,7 @@ impl ScriptThread {
let listener = NetworkListener { let listener = NetworkListener {
context: context, context: context,
script_chan: self.chan.clone(), script_chan: self.chan.clone(),
wrapper: None,
}; };
ROUTER.add_route(action_receiver.to_opaque(), box move |message| { ROUTER.add_route(action_receiver.to_opaque(), box move |message| {
listener.notify_action(message.to().unwrap()); listener.notify_action(message.to().unwrap());