diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs index 74e6996b67a..1d426c2a0e6 100644 --- a/components/script/dom/bindings/trace.rs +++ b/components/script/dom/bindings/trace.rs @@ -94,8 +94,8 @@ use profile_traits::time::ProfilerChan as TimeProfilerChan; use script_layout_interface::rpc::LayoutRPC; use script_layout_interface::OpaqueStyleAndLayoutData; use script_traits::transferable::MessagePortImpl; -use script_traits::DrawAPaintImageResult; -use script_traits::{DocumentActivity, ScriptToConstellationChan, TimerEventId, TimerSource}; +use script_traits::{DocumentActivity, DrawAPaintImageResult; +use script_traits::{MediaSessionActionType, ScriptToConstellationChan, TimerEventId, TimerSource}; use script_traits::{UntrustedNodeAddress, WindowSizeData, WindowSizeType}; use selectors::matching::ElementSelectorFlags; use serde::{Deserialize, Serialize}; @@ -536,6 +536,7 @@ unsafe_no_jsmanaged_fields!(WindowGLContext); unsafe_no_jsmanaged_fields!(VideoFrame); unsafe_no_jsmanaged_fields!(WebGLContextId); unsafe_no_jsmanaged_fields!(Arc>); +unsafe_no_jsmanaged_fields!(MediaSessionActionType); unsafe impl<'a> JSTraceable for &'a str { #[inline] diff --git a/components/script/dom/mediasession.rs b/components/script/dom/mediasession.rs index 6fdfd9b27c4..4105ddb3b5f 100644 --- a/components/script/dom/mediasession.rs +++ b/components/script/dom/mediasession.rs @@ -16,6 +16,7 @@ use crate::script_thread::ScriptThread; use dom_struct::dom_struct; use msg::constellation_msg::TopLevelBrowsingContextId; use script_traits::MediaSessionActionType; +use std::collections::HashMap; use std::rc::Rc; #[dom_struct] @@ -25,6 +26,9 @@ pub struct MediaSession { metadata: MutNullableDom, /// https://w3c.github.io/mediasession/#dom-mediasession-playbackstate playback_state: DomRefCell, + /// https://w3c.github.io/mediasession/#supported-media-session-actions + #[ignore_malloc_size_of = "Rc"] + action_handlers: DomRefCell>>, } impl MediaSession { @@ -34,6 +38,7 @@ impl MediaSession { reflector_: Reflector::new(), metadata: Default::default(), playback_state: DomRefCell::new(MediaSessionPlaybackState::None), + action_handlers: DomRefCell::new(HashMap::new()), }; ScriptThread::register_media_session(&media_session, browsing_context_id); media_session @@ -54,10 +59,12 @@ impl MediaSession { } impl MediaSessionMethods for MediaSession { + /// https://w3c.github.io/mediasession/#dom-mediasession-metadata fn GetMetadata(&self) -> Option> { self.metadata.get() } + /// https://w3c.github.io/mediasession/#dom-mediasession-metadata fn SetMetadata(&self, metadata: Option<&MediaMetadata>) { if let Some(ref metadata) = metadata { metadata.set_session(self); @@ -75,11 +82,19 @@ impl MediaSessionMethods for MediaSession { *self.playback_state.borrow_mut() = state; } + /// https://w3c.github.io/mediasession/#update-action-handler-algorithm fn SetActionHandler( &self, - _action: MediaSessionAction, - _handler: Option>, + action: MediaSessionAction, + handler: Option>, ) { + match handler { + Some(handler) => self + .action_handlers + .borrow_mut() + .insert(action.into(), handler.clone()), + None => self.action_handlers.borrow_mut().remove(&action.into()), + }; } } @@ -93,3 +108,19 @@ impl Drop for MediaSession { ScriptThread::remove_media_session(browsing_context_id); } } + +impl From for MediaSessionActionType { + fn from(action: MediaSessionAction) -> MediaSessionActionType { + match action { + MediaSessionAction::Play => MediaSessionActionType::Play, + MediaSessionAction::Pause => MediaSessionActionType::Pause, + MediaSessionAction::Seekbackward => MediaSessionActionType::SeekBackward, + MediaSessionAction::Seekforward => MediaSessionActionType::SeekForward, + MediaSessionAction::Previoustrack => MediaSessionActionType::PreviousTrack, + MediaSessionAction::Nexttrack => MediaSessionActionType::NextTrack, + MediaSessionAction::Skipad => MediaSessionActionType::SkipAd, + MediaSessionAction::Stop => MediaSessionActionType::Stop, + MediaSessionAction::Seekto => MediaSessionActionType::SeekTo, + } + } +} diff --git a/components/script_traits/lib.rs b/components/script_traits/lib.rs index 4bfa594688a..b4b85889ea0 100644 --- a/components/script_traits/lib.rs +++ b/components/script_traits/lib.rs @@ -1061,7 +1061,7 @@ pub enum MessagePortMsg { /// The type of MediaSession action. /// https://w3c.github.io/mediasession/#enumdef-mediasessionaction -#[derive(Clone, Debug, Deserialize, Serialize)] +#[derive(Clone, Debug, Deserialize, Eq, Hash, MallocSizeOf, PartialEq, Serialize)] pub enum MediaSessionActionType { /// The action intent is to resume playback. Play,