diff options
author | chansuke <chansuke@georepublic.de> | 2018-09-09 22:21:35 +0900 |
---|---|---|
committer | chansuke <chansuke@georepublic.de> | 2018-10-10 22:15:37 +0900 |
commit | 7b3cf27c69f1ed2d5372e2f1e50ce2aab84e05a7 (patch) | |
tree | c039399a0b0acaae90649a42644da87ee6dc0970 /components/script/task_source | |
parent | 7a88a2e28ae20b9ce3dddaef1da25b7837088b2a (diff) | |
download | servo-7b3cf27c69f1ed2d5372e2f1e50ce2aab84e05a7.tar.gz servo-7b3cf27c69f1ed2d5372e2f1e50ce2aab84e05a7.zip |
Add task source for media element
Diffstat (limited to 'components/script/task_source')
-rw-r--r-- | components/script/task_source/media_element.rs | 51 | ||||
-rw-r--r-- | components/script/task_source/mod.rs | 2 |
2 files changed, 53 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..711af86ba08 --- /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 http://mozilla.org/MPL/2.0/. */ + +use dom::bindings::inheritance::Castable; +use dom::bindings::refcounted::Trusted; +use dom::event::SimpleEventTask; +use dom::eventtarget::EventTarget; +use dom::window::Window; +use msg::constellation_msg::PipelineId; +use script_runtime::{CommonScriptMsg, ScriptThreadEventCategory}; +use script_thread::MainThreadScriptMsg; +use servo_atoms::Atom; +use servo_channel::Sender; +use std::fmt; +use std::result::Result; +use task::{TaskCanceller, TaskOnce}; +use task_source::{TaskSource, TaskSourceName}; + +#[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()); + } +} diff --git a/components/script/task_source/mod.rs b/components/script/task_source/mod.rs index a38607bfe98..b58c0cb3191 100644 --- a/components/script/task_source/mod.rs +++ b/components/script/task_source/mod.rs @@ -5,6 +5,7 @@ pub mod dom_manipulation; pub mod file_reading; pub mod history_traversal; +pub mod media_element; pub mod networking; pub mod performance_timeline; pub mod remote_event; @@ -29,6 +30,7 @@ pub enum TaskSourceName { PerformanceTimeline, UserInteraction, RemoteEvent, + MediaElement, Websocket, } |