diff --git a/components/embedder_traits/lib.rs b/components/embedder_traits/lib.rs index 9d4e56dd297..d8773318e35 100644 --- a/components/embedder_traits/lib.rs +++ b/components/embedder_traits/lib.rs @@ -240,6 +240,24 @@ pub enum MediaSessionPlaybackState { Paused, } +/// https://w3c.github.io/mediasession/#dictdef-mediapositionstate +#[derive(Clone, Debug, Deserialize, Serialize)] +pub struct MediaPositionState { + pub duration: Option, + pub playback_rate: Option, + pub position: Option, +} + +impl MediaPositionState { + pub fn new(duration: f64, playback_rate: f64, position: f64) -> Self { + Self { + duration, + playback_rate, + position, + } + } +} + /// Type of events sent from script to the embedder about the media session. #[derive(Clone, Debug, Deserialize, Serialize)] pub enum MediaSessionEvent { @@ -247,4 +265,6 @@ pub enum MediaSessionEvent { SetMetadata(MediaMetadata), /// Indicates that the playback state has changed. PlaybackStateChange(MediaSessionPlaybackState), + /// Indicates that the position state is set. + SetPositionState(MediaPositionState), } diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs index 0780a81e2e6..cf179aee439 100644 --- a/components/script/dom/htmlmediaelement.rs +++ b/components/script/dom/htmlmediaelement.rs @@ -67,7 +67,7 @@ use crate::script_thread::ScriptThread; use crate::task_source::TaskSource; use dom_struct::dom_struct; use embedder_traits::resources::{self, Resource as EmbedderResource}; -use embedder_traits::{MediaSessionEvent, MediaSessionPlaybackState}; +use embedder_traits::{MediaPositionState, MediaSessionEvent, MediaSessionPlaybackState}; use euclid::default::Size2D; use headers::{ContentLength, ContentRange, HeaderMapExt}; use html5ever::{LocalName, Prefix}; @@ -1780,6 +1780,15 @@ impl HTMLMediaElement { .add(self.playback_position.get(), position); self.playback_position.set(position); self.time_marches_on(); + let media_position_state = + MediaPositionState::new(self.duration.get(), self.playbackRate.get(), position); + debug!( + "Sending media session event set position state {:?}", + media_position_state + ); + self.send_media_session_event(MediaSessionEvent::SetPositionState( + media_position_state, + )); }, PlayerEvent::SeekData(p, ref seek_lock) => { self.fetch_request(Some(p), Some(seek_lock.clone()));