diff options
author | Keith Yeung <kungfukeith11@gmail.com> | 2016-03-12 17:58:52 -0500 |
---|---|---|
committer | Keith Yeung <kungfukeith11@gmail.com> | 2016-05-11 10:12:25 -0400 |
commit | cc049515dc77d8975351d04074310874c486c512 (patch) | |
tree | 2bdd5b068f9f964484cf0edd2dd9de5a2b656069 /components/script/task_source/user_interaction.rs | |
parent | 12a96f71945dbd27336469f69f8e679a2b54b40b (diff) | |
download | servo-cc049515dc77d8975351d04074310874c486c512.tar.gz servo-cc049515dc77d8975351d04074310874c486c512.zip |
Implement user interaction task source
Diffstat (limited to 'components/script/task_source/user_interaction.rs')
-rw-r--r-- | components/script/task_source/user_interaction.rs | 48 |
1 files changed, 42 insertions, 6 deletions
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); + } + } } } |