diff options
Diffstat (limited to 'components/script/task_source')
-rw-r--r-- | components/script/task_source/dom_manipulation.rs | 4 | ||||
-rw-r--r-- | components/script/task_source/mod.rs | 1 | ||||
-rw-r--r-- | components/script/task_source/user_interaction.rs | 48 |
3 files changed, 45 insertions, 8 deletions
diff --git a/components/script/task_source/dom_manipulation.rs b/components/script/task_source/dom_manipulation.rs index de3fc19710e..05b0722f889 100644 --- a/components/script/task_source/dom_manipulation.rs +++ b/components/script/task_source/dom_manipulation.rs @@ -18,8 +18,10 @@ impl TaskSource<DOMManipulationTask> for DOMManipulationTaskSource { fn queue(&self, msg: DOMManipulationTask) -> Result<(), ()> { self.0.send(MainThreadScriptMsg::DOMManipulation(msg)).map_err(|_| ()) } +} - fn clone(&self) -> Box<TaskSource<DOMManipulationTask> + Send> { +impl DOMManipulationTaskSource { + pub fn clone(&self) -> Box<TaskSource<DOMManipulationTask> + Send> { box DOMManipulationTaskSource((&self.0).clone()) } } diff --git a/components/script/task_source/mod.rs b/components/script/task_source/mod.rs index 74dd7347e9e..fe2d159b04a 100644 --- a/components/script/task_source/mod.rs +++ b/components/script/task_source/mod.rs @@ -12,5 +12,4 @@ use std::result::Result; pub trait TaskSource<T> { fn queue(&self, msg: T) -> Result<(), ()>; - fn clone(&self) -> Box<TaskSource<T> + Send>; } diff --git a/components/script/task_source/user_interaction.rs b/components/script/task_source/user_interaction.rs index 8f79b8ddaed..59d7d728185 100644 --- a/components/script/task_source/user_interaction.rs +++ b/components/script/task_source/user_interaction.rs @@ -2,19 +2,55 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -use script_runtime::{CommonScriptMsg, ScriptChan}; +use dom::bindings::refcounted::Trusted; +use dom::event::{EventBubbles, EventCancelable}; +use dom::eventtarget::EventTarget; +use script_runtime::ScriptChan; use script_thread::MainThreadScriptMsg; +use std::result::Result; use std::sync::mpsc::Sender; +use string_cache::Atom; +use task_source::TaskSource; #[derive(JSTraceable)] pub struct UserInteractionTaskSource(pub Sender<MainThreadScriptMsg>); -impl ScriptChan for UserInteractionTaskSource { - fn send(&self, msg: CommonScriptMsg) -> Result<(), ()> { - self.0.send(MainThreadScriptMsg::Common(msg)).map_err(|_| ()) +impl TaskSource<UserInteractionTask> for UserInteractionTaskSource { + fn queue(&self, msg: UserInteractionTask) -> Result<(), ()> { + self.0.send(MainThreadScriptMsg::UserInteraction(msg)).map_err(|_| ()) } +} + +impl UserInteractionTaskSource { + pub fn queue_event(&self, + target: &EventTarget, + name: Atom, + bubbles: EventBubbles, + cancelable: EventCancelable) { + let target = Trusted::new(target); + let _ = self.0.send(MainThreadScriptMsg::UserInteraction(UserInteractionTask::FireEvent( + target, name, bubbles, cancelable))); + } + + pub fn clone(&self) -> UserInteractionTaskSource { + UserInteractionTaskSource((&self.0).clone()) + } +} + +pub enum UserInteractionTask { + // https://dom.spec.whatwg.org/#concept-event-fire + FireEvent(Trusted<EventTarget>, Atom, EventBubbles, EventCancelable), +} + +impl UserInteractionTask { + pub fn handle_task(self) { + use self::UserInteractionTask::*; - fn clone(&self) -> Box<ScriptChan + Send> { - box UserInteractionTaskSource((&self.0).clone()) + match self { + FireEvent(element, name, bubbles, cancelable) => { + let target = element.root(); + target.fire_event(&*name, bubbles, cancelable); + } + } } } |