diff options
Diffstat (limited to 'components/script/task_source/user_interaction.rs')
-rw-r--r-- | components/script/task_source/user_interaction.rs | 49 |
1 files changed, 27 insertions, 22 deletions
diff --git a/components/script/task_source/user_interaction.rs b/components/script/task_source/user_interaction.rs index 24dd59af222..cddafb80ee4 100644 --- a/components/script/task_source/user_interaction.rs +++ b/components/script/task_source/user_interaction.rs @@ -2,10 +2,12 @@ * 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 dom::bindings::global::GlobalRef; use dom::bindings::refcounted::Trusted; -use dom::event::{EventBubbles, EventCancelable}; +use dom::event::{EventBubbles, EventCancelable, EventRunnable}; use dom::eventtarget::EventTarget; -use script_thread::MainThreadScriptMsg; +use dom::window::Window; +use script_thread::{MainThreadScriptMsg, Runnable, RunnableWrapper, ScriptThread}; use std::result::Result; use std::sync::mpsc::Sender; use string_cache::Atom; @@ -14,38 +16,41 @@ use task_source::TaskSource; #[derive(JSTraceable, Clone)] pub struct UserInteractionTaskSource(pub Sender<MainThreadScriptMsg>); -impl TaskSource<UserInteractionTask> for UserInteractionTaskSource { - fn queue(&self, msg: UserInteractionTask) -> Result<(), ()> { +impl TaskSource for UserInteractionTaskSource { + fn queue_with_wrapper<T>(&self, + msg: Box<T>, + wrapper: &RunnableWrapper) + -> Result<(), ()> + where T: Runnable + Send + 'static { + let msg = UserInteractionTask(wrapper.wrap_runnable(msg)); self.0.send(MainThreadScriptMsg::UserInteraction(msg)).map_err(|_| ()) } } impl UserInteractionTaskSource { pub fn queue_event(&self, - target: &EventTarget, - name: Atom, - bubbles: EventBubbles, - cancelable: EventCancelable) { + target: &EventTarget, + name: Atom, + bubbles: EventBubbles, + cancelable: EventCancelable, + window: &Window) { let target = Trusted::new(target); - let _ = self.0.send(MainThreadScriptMsg::UserInteraction(UserInteractionTask::FireEvent( - target, name, bubbles, cancelable))); + let runnable = box EventRunnable { + target: target, + name: name, + bubbles: bubbles, + cancelable: cancelable, + }; + let _ = self.queue(runnable, GlobalRef::Window(window)); } } -pub enum UserInteractionTask { - // https://dom.spec.whatwg.org/#concept-event-fire - FireEvent(Trusted<EventTarget>, Atom, EventBubbles, EventCancelable), -} +pub struct UserInteractionTask(pub Box<Runnable + Send>); impl UserInteractionTask { - pub fn handle_task(self) { - use self::UserInteractionTask::*; - - match self { - FireEvent(element, name, bubbles, cancelable) => { - let target = element.root(); - target.fire_event(&*name, bubbles, cancelable); - } + pub fn handle_task(self, script_thread: &ScriptThread) { + if !self.0.is_cancelled() { + self.0.main_thread_handler(script_thread); } } } |