diff --git a/components/script/dom/bindings/error.rs b/components/script/dom/bindings/error.rs index 961ba959b8948..4cfdd3a066310 100644 --- a/components/script/dom/bindings/error.rs +++ b/components/script/dom/bindings/error.rs @@ -19,7 +19,7 @@ use libc; use std::ptr; /// DOM exceptions that can be thrown by a native DOM method. -#[deriving(Show)] +#[deriving(Show, Clone)] pub enum Error { IndexSize, FailureUnknown, diff --git a/components/script/dom/dedicatedworkerglobalscope.rs b/components/script/dom/dedicatedworkerglobalscope.rs index f29691afcf6b0..9b9b08704ec34 100644 --- a/components/script/dom/dedicatedworkerglobalscope.rs +++ b/components/script/dom/dedicatedworkerglobalscope.rs @@ -17,7 +17,6 @@ use dom::messageevent::MessageEvent; use dom::worker::{Worker, TrustedWorkerAddress}; use dom::workerglobalscope::{WorkerGlobalScope, WorkerGlobalScopeHelpers}; use dom::workerglobalscope::WorkerGlobalScopeTypeId; -use dom::xmlhttprequest::XMLHttpRequest; use script_task::{ScriptTask, ScriptChan, ScriptMsg, TimerSource}; use script_task::StackRootTLS; @@ -131,11 +130,8 @@ impl DedicatedWorkerGlobalScope { MessageEvent::dispatch_jsval(target, GlobalRef::Worker(scope), message); global.delayed_release_worker(); }, - Ok(ScriptMsg::XHRProgress(addr, progress)) => { - XMLHttpRequest::handle_progress(addr, progress) - }, - Ok(ScriptMsg::XHRRelease(addr)) => { - XMLHttpRequest::handle_release(addr) + Ok(ScriptMsg::RunnableMsg(runnable)) => { + runnable.handler() }, Ok(ScriptMsg::WorkerPostMessage(addr, data, nbytes)) => { Worker::handle_message(addr, data, nbytes); diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs index cd6d185076386..21495b9f4b38a 100644 --- a/components/script/dom/xmlhttprequest.rs +++ b/components/script/dom/xmlhttprequest.rs @@ -25,7 +25,7 @@ use dom::urlsearchparams::URLSearchParamsHelpers; use dom::xmlhttprequesteventtarget::XMLHttpRequestEventTarget; use dom::xmlhttprequesteventtarget::XMLHttpRequestEventTargetTypeId; use dom::xmlhttprequestupload::XMLHttpRequestUpload; -use script_task::{ScriptChan, ScriptMsg}; +use script_task::{ScriptChan, ScriptMsg, Runnable}; use encoding::all::UTF_8; use encoding::label::encoding_from_whatwg_label; @@ -73,10 +73,37 @@ enum XMLHttpRequestState { XHRDone = 4, // So as not to conflict with the ProgressMsg `Done` } -#[deriving(PartialEq)] +struct XHRReleaseHandler(TrustedXHRAddress); + +impl Runnable for XHRReleaseHandler { + fn handler(&self) { + let XHRReleaseHandler(addr) = *self; + XMLHttpRequest::handle_release(addr); + } +} + +struct XHRProgressHandler { + addr: TrustedXHRAddress, + progress: XHRProgress, +} + +impl XHRProgressHandler { + fn new(addr: TrustedXHRAddress, progress: XHRProgress) -> XHRProgressHandler { + XHRProgressHandler { addr: addr, progress: progress } + } +} + +impl Runnable for XHRProgressHandler { + fn handler(&self) { + XMLHttpRequest::handle_progress(self.addr, self.progress.clone()); + } +} + +#[deriving(PartialEq, Clone)] #[jstraceable] pub struct GenerationId(uint); +#[deriving(Clone)] pub enum XHRProgress { /// Notify that headers have been received HeadersReceived(GenerationId, Option, Option), @@ -208,7 +235,7 @@ impl XMLHttpRequest { }, SyncOrAsync::Async(addr, script_chan) => { let ScriptChan(ref chan) = *script_chan; - chan.send(ScriptMsg::XHRProgress(addr, msg)); + chan.send(ScriptMsg::RunnableMsg(box XHRProgressHandler::new(addr, msg))); } } } @@ -609,7 +636,7 @@ impl<'a> XMLHttpRequestMethods for JSRef<'a, XMLHttpRequest> { self.fetch_time.set(time::now().to_timespec().sec); let script_chan = global.root_ref().script_chan().clone(); // Pin the object before launching the fetch task. - // The `ScriptMsg::XHRRelease` sent when the fetch task completes will + // The `ScriptMsg::RunnableMsg` sent when the fetch task completes will // unpin it. This is to ensure that the object will stay alive // as long as there are (possibly cancelled) inflight events queued up // in the script task's port @@ -625,7 +652,7 @@ impl<'a> XMLHttpRequestMethods for JSRef<'a, XMLHttpRequest> { gen_id, start_port); let ScriptChan(ref chan) = script_chan; - chan.send(ScriptMsg::XHRRelease(addr)); + chan.send(ScriptMsg::RunnableMsg(box XHRReleaseHandler(addr))); }); let timeout = self.timeout.get(); if timeout > 0 { diff --git a/components/script/script_task.rs b/components/script/script_task.rs index 696d0e10f8fea..40d90e150cb7e 100644 --- a/components/script/script_task.rs +++ b/components/script/script_task.rs @@ -27,7 +27,6 @@ use dom::mouseevent::MouseEvent; use dom::node::{mod, Node, NodeHelpers, NodeDamage, NodeTypeId}; use dom::window::{Window, WindowHelpers}; use dom::worker::{Worker, TrustedWorkerAddress}; -use dom::xmlhttprequest::{TrustedXHRAddress, XMLHttpRequest, XHRProgress}; use parse::html::{HTMLInput, parse_html}; use layout_interface::{ScriptLayoutChan, LayoutChan, ReflowGoal, ReflowQueryType}; use layout_interface; @@ -87,6 +86,10 @@ pub enum TimerSource { FromWorker } +pub trait Runnable { + fn handler(&self); +} + /// Messages used to control script event loops, such as ScriptTask and /// DedicatedWorkerGlobalScope. pub enum ScriptMsg { @@ -106,10 +109,6 @@ pub enum ScriptMsg { /// Notifies the script that a window associated with a particular pipeline /// should be closed (only dispatched to ScriptTask). ExitWindow(PipelineId), - /// Notifies the script of progress on a fetch (dispatched to all tasks). - XHRProgress(TrustedXHRAddress, XHRProgress), - /// Releases one reference to the XHR object (dispatched to all tasks). - XHRRelease(TrustedXHRAddress), /// Message sent through Worker.postMessage (only dispatched to /// DedicatedWorkerGlobalScope). DOMMessage(*mut u64, size_t), @@ -117,6 +116,8 @@ pub enum ScriptMsg { WorkerPostMessage(TrustedWorkerAddress, *mut u64, size_t), /// Releases one reference to the Worker object (dispatched to all tasks). WorkerRelease(TrustedWorkerAddress), + /// Generic message that encapsulates event handling. + RunnableMsg(Box), } /// Encapsulates internal communication within the script task. @@ -572,16 +573,14 @@ impl ScriptTask { self.handle_navigate_msg(direction), ScriptMsg::ExitWindow(id) => self.handle_exit_window_msg(id), - ScriptMsg::XHRProgress(addr, progress) => - XMLHttpRequest::handle_progress(addr, progress), - ScriptMsg::XHRRelease(addr) => - XMLHttpRequest::handle_release(addr), ScriptMsg::DOMMessage(..) => panic!("unexpected message"), ScriptMsg::WorkerPostMessage(addr, data, nbytes) => Worker::handle_message(addr, data, nbytes), ScriptMsg::WorkerRelease(addr) => Worker::handle_release(addr), + ScriptMsg::RunnableMsg(runnable) => + runnable.handler(), } }