diff options
Diffstat (limited to 'components/script/task_source/media_element.rs')
-rw-r--r-- | components/script/task_source/media_element.rs | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/components/script/task_source/media_element.rs b/components/script/task_source/media_element.rs new file mode 100644 index 00000000000..c0a902b373b --- /dev/null +++ b/components/script/task_source/media_element.rs @@ -0,0 +1,51 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +use crate::dom::bindings::inheritance::Castable; +use crate::dom::bindings::refcounted::Trusted; +use crate::dom::event::SimpleEventTask; +use crate::dom::eventtarget::EventTarget; +use crate::dom::window::Window; +use crate::script_runtime::{CommonScriptMsg, ScriptThreadEventCategory}; +use crate::script_thread::MainThreadScriptMsg; +use crate::task::{TaskCanceller, TaskOnce}; +use crate::task_source::{TaskSource, TaskSourceName}; +use crossbeam_channel::Sender; +use msg::constellation_msg::PipelineId; +use servo_atoms::Atom; +use std::fmt; +use std::result::Result; + +#[derive(Clone, JSTraceable)] +pub struct MediaElementTaskSource(pub Sender<MainThreadScriptMsg>, pub PipelineId); + +impl fmt::Debug for MediaElementTaskSource { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "MediaElementTaskSource(...)") + } +} + +impl TaskSource for MediaElementTaskSource { + const NAME: TaskSourceName = TaskSourceName::MediaElement; + + fn queue_with_canceller<T>(&self, task: T, canceller: &TaskCanceller) -> Result<(), ()> + where + T: TaskOnce + 'static, + { + let msg = MainThreadScriptMsg::Common(CommonScriptMsg::Task( + ScriptThreadEventCategory::ScriptEvent, + Box::new(canceller.wrap_task(task)), + Some(self.1), + MediaElementTaskSource::NAME, + )); + self.0.send(msg).map_err(|_| ()) + } +} + +impl MediaElementTaskSource { + pub fn queue_simple_event(&self, target: &EventTarget, name: Atom, window: &Window) { + let target = Trusted::new(target); + let _ = self.queue(SimpleEventTask { target, name }, window.upcast()); + } +} |