diff options
author | Prabhjyot Singh Sodhi <prabhjyotsingh95@gmail.com> | 2015-02-18 17:17:16 +0530 |
---|---|---|
committer | Prabhjyot Singh Sodhi <prabhjyotsingh95@gmail.com> | 2015-02-22 00:27:16 +0530 |
commit | cc487979994ec637a3d37f9a3e5edb4a56e7a379 (patch) | |
tree | 868be0c79483be076f35006c4257c84de8958102 /components/script | |
parent | b589735b47e0c8c9b008831a776a6db38b38cd5d (diff) | |
download | servo-cc487979994ec637a3d37f9a3e5edb4a56e7a379.tar.gz servo-cc487979994ec637a3d37f9a3e5edb4a56e7a379.zip |
Fixing Intermittent failure in pages with timers
Fixes #4923
Diffstat (limited to 'components/script')
-rw-r--r-- | components/script/dom/bindings/refcounted.rs | 2 | ||||
-rw-r--r-- | components/script/dom/dedicatedworkerglobalscope.rs | 10 | ||||
-rw-r--r-- | components/script/dom/htmlformelement.rs | 2 | ||||
-rw-r--r-- | components/script/dom/htmlscriptelement.rs | 4 | ||||
-rw-r--r-- | components/script/dom/window.rs | 6 | ||||
-rw-r--r-- | components/script/dom/xmlhttprequest.rs | 2 | ||||
-rw-r--r-- | components/script/script_task.rs | 14 | ||||
-rw-r--r-- | components/script/timers.rs | 5 |
8 files changed, 24 insertions, 21 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 3612b126a9d..939955a64f0 100644 --- a/components/script/script_task.rs +++ b/components/script/script_task.rs @@ -15,7 +15,6 @@ use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; use dom::bindings::codegen::InheritTypes::{ElementCast, EventTargetCast, HTMLIFrameElementCast, NodeCast, EventCast}; use dom::bindings::conversions::FromJSValConvertible; use dom::bindings::conversions::StringificationBehavior; -use dom::bindings::global::GlobalRef; use dom::bindings::js::{JS, JSRef, Temporary, OptionalRootable, RootedReference}; use dom::bindings::js::{RootCollection, RootCollectionPtr}; use dom::bindings::refcounted::{LiveDOMReferences, Trusted, TrustedReference}; @@ -24,7 +23,7 @@ use dom::bindings::trace::JSTraceable; use dom::bindings::utils::{wrap_for_same_compartment, pre_wrap}; use dom::document::{Document, IsHTMLDocument, DocumentHelpers, DocumentProgressHandler, DocumentProgressTask, DocumentSource}; use dom::element::{Element, ActivationElementHelpers}; -use dom::event::{Event, EventHelpers, EventBubbles, EventCancelable}; +use dom::event::{Event, EventHelpers}; use dom::uievent::UIEvent; use dom::eventtarget::EventTarget; use dom::htmliframeelement::HTMLIFrameElement; @@ -86,6 +85,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}; @@ -135,7 +135,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>; } @@ -145,9 +145,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> { @@ -898,7 +898,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 @@ -906,7 +906,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; } |