Skip to content

Commit

Permalink
Make network listener runnable cancellable
Browse files Browse the repository at this point in the history
  • Loading branch information
cbrewster committed Jul 8, 2016
1 parent b9af49f commit 315ffe7
Show file tree
Hide file tree
Showing 6 changed files with 21 additions and 5 deletions.
1 change: 1 addition & 0 deletions components/script/dom/htmllinkelement.rs
Expand Up @@ -226,6 +226,7 @@ impl HTMLLinkElement {
let listener = NetworkListener {
context: context,
script_chan: document.window().networking_task_source(),
wrapper: Some(document.window().get_runnable_wrapper()),
};
let response_target = AsyncResponseTarget {
sender: action_sender,
Expand Down
4 changes: 3 additions & 1 deletion components/script/dom/htmlmediaelement.rs
Expand Up @@ -473,10 +473,12 @@ impl HTMLMediaElement {
// 4.2
let context = Arc::new(Mutex::new(HTMLMediaElementContext::new(self, url.clone())));
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 {
context: context,
script_chan: script_chan,
wrapper: Some(window.get_runnable_wrapper()),
};

let response_target = AsyncResponseTarget {
Expand Down
1 change: 1 addition & 0 deletions components/script/dom/htmlscriptelement.rs
Expand Up @@ -308,6 +308,7 @@ impl HTMLScriptElement {
let listener = NetworkListener {
context: context,
script_chan: doc.window().networking_task_source(),
wrapper: Some(doc.window().get_runnable_wrapper()),
};
let response_target = AsyncResponseTarget {
sender: action_sender,
Expand Down
1 change: 1 addition & 0 deletions components/script/dom/xmlhttprequest.rs
Expand Up @@ -258,6 +258,7 @@ impl XMLHttpRequest {
let listener = NetworkListener {
context: context,
script_chan: script_chan,
wrapper: None,
};
ROUTER.add_route(action_receiver.to_opaque(), box move |message| {
listener.notify_fetch(message.to().unwrap());
Expand Down
18 changes: 14 additions & 4 deletions components/script/network_listener.rs
Expand Up @@ -6,23 +6,33 @@ use net_traits::{Action, AsyncResponseListener, FetchResponseListener};
use net_traits::{FetchResponseMsg, ResponseAction};
use script_runtime::ScriptThreadEventCategory::NetworkEvent;
use script_runtime::{CommonScriptMsg, ScriptChan};
use script_thread::Runnable;
use script_thread::{Runnable, RunnableWrapper};
use std::sync::{Arc, Mutex};

/// An off-thread sink for async network event runnables. All such events are forwarded to
/// a target thread, where they are invoked on the provided context object.
pub struct NetworkListener<Listener: PreInvoke + Send + 'static> {
pub context: Arc<Mutex<Listener>>,
pub script_chan: Box<ScriptChan + Send>,
pub wrapper: Option<RunnableWrapper>,
}

impl<Listener: PreInvoke + Send + 'static> NetworkListener<Listener> {
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(),
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);
}
}
}
}
Expand Down
1 change: 1 addition & 0 deletions components/script/script_thread.rs
Expand Up @@ -2055,6 +2055,7 @@ impl ScriptThread {
let listener = NetworkListener {
context: context,
script_chan: self.chan.clone(),
wrapper: None,
};
ROUTER.add_route(action_receiver.to_opaque(), box move |message| {
listener.notify_action(message.to().unwrap());
Expand Down

0 comments on commit 315ffe7

Please sign in to comment.