aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbors-servo <metajack+bors@gmail.com>2015-02-21 12:51:44 -0700
committerbors-servo <metajack+bors@gmail.com>2015-02-21 12:51:44 -0700
commitf1f826544919b4fa7cdf4bf263abf0c0c1497f70 (patch)
treef80ddaf5eccc7c96c8c5e95172cc794573ec7e92
parent939b13f436d2fc895cf8a57140b0bd50acc53a89 (diff)
parentcc487979994ec637a3d37f9a3e5edb4a56e7a379 (diff)
downloadservo-f1f826544919b4fa7cdf4bf263abf0c0c1497f70.tar.gz
servo-f1f826544919b4fa7cdf4bf263abf0c0c1497f70.zip
auto merge of #4956 : psdh/servo/interfail, r=jdm
Fixes #4923
-rw-r--r--components/script/dom/bindings/refcounted.rs2
-rw-r--r--components/script/dom/dedicatedworkerglobalscope.rs10
-rw-r--r--components/script/dom/htmlformelement.rs2
-rw-r--r--components/script/dom/htmlscriptelement.rs4
-rw-r--r--components/script/dom/window.rs6
-rw-r--r--components/script/dom/xmlhttprequest.rs2
-rw-r--r--components/script/script_task.rs11
-rw-r--r--components/script/timers.rs5
8 files changed, 23 insertions, 19 deletions
diff --git a/components/script/dom/bindings/refcounted.rs b/components/script/dom/bindings/refcounted.rs
index a0183aac59c..b7f039cb527 100644
--- a/components/script/dom/bindings/refcounted.rs
+++ b/components/script/dom/bindings/refcounted.rs
@@ -114,7 +114,7 @@ impl<T: Reflectable> Drop for Trusted<T> {
*refcount -= 1;
if *refcount == 0 {
self.script_chan.send(
- ScriptMsg::RefcountCleanup(TrustedReference(self.ptr)));
+ ScriptMsg::RefcountCleanup(TrustedReference(self.ptr))).unwrap();
}
}
}
diff --git a/components/script/dom/dedicatedworkerglobalscope.rs b/components/script/dom/dedicatedworkerglobalscope.rs
index 32314d8fc8a..ea16903fd8f 100644
--- a/components/script/dom/dedicatedworkerglobalscope.rs
+++ b/components/script/dom/dedicatedworkerglobalscope.rs
@@ -49,8 +49,8 @@ pub struct SendableWorkerScriptChan {
}
impl ScriptChan for SendableWorkerScriptChan {
- fn send(&self, msg: ScriptMsg) {
- self.sender.send((self.worker.clone(), msg)).unwrap();
+ fn send(&self, msg: ScriptMsg) -> Result<(), ()> {
+ return self.sender.send((self.worker.clone(), msg)).map_err(|_| ());
}
fn clone(&self) -> Box<ScriptChan + Send> {
@@ -147,7 +147,7 @@ impl DedicatedWorkerGlobalScope {
Err(_) => {
println!("error loading script {}", worker_url.serialize());
parent_sender.send(ScriptMsg::RunnableMsg(
- box WorkerEventHandler::new(worker)));
+ box WorkerEventHandler::new(worker))).unwrap();
return;
}
Ok((metadata, bytes)) => {
@@ -235,7 +235,7 @@ impl<'a> PrivateDedicatedWorkerGlobalScopeHelpers for JSRef<'a, DedicatedWorkerG
let col_num = errorevent.Colno();
let worker = self.worker.borrow().as_ref().unwrap().clone();
self.parent_sender.send(ScriptMsg::WorkerDispatchErrorEvent(worker, msg, file_name,
- line_num, col_num));
+ line_num, col_num)).unwrap();
}
}
@@ -244,7 +244,7 @@ impl<'a> DedicatedWorkerGlobalScopeMethods for JSRef<'a, DedicatedWorkerGlobalSc
let data = try!(StructuredCloneData::write(cx, message));
let worker = self.worker.borrow().as_ref().unwrap().clone();
self.parent_sender.send(ScriptMsg::RunnableMsg(
- box WorkerMessageHandler::new(worker, data)));
+ box WorkerMessageHandler::new(worker, data))).unwrap();
Ok(())
}
diff --git a/components/script/dom/htmlformelement.rs b/components/script/dom/htmlformelement.rs
index be6f1fc9fcb..ddc8d42b661 100644
--- a/components/script/dom/htmlformelement.rs
+++ b/components/script/dom/htmlformelement.rs
@@ -215,7 +215,7 @@ impl<'a> HTMLFormElementHelpers for JSRef<'a, HTMLFormElement> {
}
// This is wrong. https://html.spec.whatwg.org/multipage/forms.html#planned-navigation
- win.r().script_chan().send(ScriptMsg::TriggerLoad(win.r().page().id, load_data));
+ win.r().script_chan().send(ScriptMsg::TriggerLoad(win.r().page().id, load_data)).unwrap();
}
fn get_form_dataset<'b>(self, submitter: Option<FormSubmitter<'b>>) -> Vec<FormDatum> {
diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs
index ee3e85f6ed1..662e88f02e1 100644
--- a/components/script/dom/htmlscriptelement.rs
+++ b/components/script/dom/htmlscriptelement.rs
@@ -257,7 +257,7 @@ impl<'a> HTMLScriptElementHelpers for JSRef<'a, HTMLScriptElement> {
ScriptOrigin::Internal => {
let chan = window.script_chan();
let handler = Trusted::new(window.get_cx(), self, chan.clone());
- chan.send(ScriptMsg::RunnableMsg(box handler));
+ chan.send(ScriptMsg::RunnableMsg(box handler)).unwrap();
}
}
}
@@ -268,7 +268,7 @@ impl<'a> HTMLScriptElementHelpers for JSRef<'a, HTMLScriptElement> {
let window = window.r();
let chan = window.script_chan();
let handler = Trusted::new(window.get_cx(), self, chan.clone());
- chan.send(ScriptMsg::RunnableMsg(box handler));
+ chan.send(ScriptMsg::RunnableMsg(box handler)).unwrap();
}
fn dispatch_load_event(self) {
diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs
index fcc56776c8d..ded3ba24303 100644
--- a/components/script/dom/window.rs
+++ b/components/script/dom/window.rs
@@ -197,7 +197,7 @@ impl<'a> WindowMethods for JSRef<'a, Window> {
}
fn Close(self) {
- self.script_chan.send(ScriptMsg::ExitWindow(self.page.id.clone()));
+ self.script_chan.send(ScriptMsg::ExitWindow(self.page.id.clone())).unwrap();
}
fn Document(self) -> Temporary<Document> {
@@ -387,10 +387,10 @@ impl<'a> WindowHelpers for JSRef<'a, Window> {
let url = url.unwrap();
match url.fragment {
Some(fragment) => {
- self.script_chan.send(ScriptMsg::TriggerFragment(self.page.id, fragment));
+ self.script_chan.send(ScriptMsg::TriggerFragment(self.page.id, fragment)).unwrap();
},
None => {
- self.script_chan.send(ScriptMsg::TriggerLoad(self.page.id, LoadData::new(url)));
+ self.script_chan.send(ScriptMsg::TriggerLoad(self.page.id, LoadData::new(url))).unwrap();
}
}
}
diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs
index 5bef26a7c84..b8530f5b38a 100644
--- a/components/script/dom/xmlhttprequest.rs
+++ b/components/script/dom/xmlhttprequest.rs
@@ -220,7 +220,7 @@ impl XMLHttpRequest {
xhr.process_partial_response(msg);
},
SyncOrAsync::Async(ref addr, ref script_chan) => {
- script_chan.send(ScriptMsg::RunnableMsg(box XHRProgressHandler::new(addr.clone(), msg)));
+ script_chan.send(ScriptMsg::RunnableMsg(box XHRProgressHandler::new(addr.clone(), msg))).unwrap();
}
}
}
diff --git a/components/script/script_task.rs b/components/script/script_task.rs
index f63bd70abbf..f29e5690cf5 100644
--- a/components/script/script_task.rs
+++ b/components/script/script_task.rs
@@ -84,6 +84,7 @@ use std::fmt::{self, Display};
use std::mem::replace;
use std::num::ToPrimitive;
use std::rc::Rc;
+use std::result::Result;
use std::sync::mpsc::{channel, Sender, Receiver, Select};
use std::u32;
use time::{Tm, strptime};
@@ -133,7 +134,7 @@ pub enum ScriptMsg {
/// A cloneable interface for communicating with an event loop.
pub trait ScriptChan {
/// Send a message to the associated event loop.
- fn send(&self, msg: ScriptMsg);
+ fn send(&self, msg: ScriptMsg) -> Result<(), ()>;
/// Clone this handle.
fn clone(&self) -> Box<ScriptChan+Send>;
}
@@ -143,9 +144,9 @@ pub trait ScriptChan {
pub struct NonWorkerScriptChan(pub Sender<ScriptMsg>);
impl ScriptChan for NonWorkerScriptChan {
- fn send(&self, msg: ScriptMsg) {
+ fn send(&self, msg: ScriptMsg) -> Result<(), ()> {
let NonWorkerScriptChan(ref chan) = *self;
- chan.send(msg).unwrap();
+ return chan.send(msg).map_err(|_| ());
}
fn clone(&self) -> Box<ScriptChan+Send> {
@@ -893,7 +894,7 @@ impl ScriptTask {
// https://html.spec.whatwg.org/multipage/#the-end step 4
let addr: Trusted<Document> = Trusted::new(self.get_cx(), document.r(), self.chan.clone());
let handler = Box::new(DocumentProgressHandler::new(addr.clone(), DocumentProgressTask::DOMContentLoaded));
- self.chan.send(ScriptMsg::RunnableMsg(handler));
+ self.chan.send(ScriptMsg::RunnableMsg(handler)).unwrap();
// We have no concept of a document loader right now, so just dispatch the
// "load" event as soon as we've finished executing all scripts parsed during
@@ -901,7 +902,7 @@ impl ScriptTask {
// https://html.spec.whatwg.org/multipage/#the-end step 7
let handler = Box::new(DocumentProgressHandler::new(addr, DocumentProgressTask::Load));
- self.chan.send(ScriptMsg::RunnableMsg(handler));
+ self.chan.send(ScriptMsg::RunnableMsg(handler)).unwrap();
*page.fragment_name.borrow_mut() = final_url.fragment.clone();
diff --git a/components/script/timers.rs b/components/script/timers.rs
index 8f361ebcb7b..0b8d7117022 100644
--- a/components/script/timers.rs
+++ b/components/script/timers.rs
@@ -149,7 +149,10 @@ impl TimerManager {
let id = select.wait();
if id == timeout_handle.id() {
timeout_port.recv().unwrap();
- script_chan.send(ScriptMsg::FireTimer(source, TimerId(handle)));
+ if script_chan.send(ScriptMsg::FireTimer(source, TimerId(handle))).is_err() {
+ break;
+ }
+
if is_interval == IsInterval::NonInterval {
break;
}