MediaSession: update action handler algorithm

This commit is contained in:
Fernando Jiménez Moreno 2019-10-07 10:31:52 +02:00
parent fa61191405
commit ec7a4bf32d
3 changed files with 37 additions and 5 deletions

View file

@ -94,8 +94,8 @@ use profile_traits::time::ProfilerChan as TimeProfilerChan;
use script_layout_interface::rpc::LayoutRPC; use script_layout_interface::rpc::LayoutRPC;
use script_layout_interface::OpaqueStyleAndLayoutData; use script_layout_interface::OpaqueStyleAndLayoutData;
use script_traits::transferable::MessagePortImpl; use script_traits::transferable::MessagePortImpl;
use script_traits::DrawAPaintImageResult; use script_traits::{DocumentActivity, DrawAPaintImageResult;
use script_traits::{DocumentActivity, ScriptToConstellationChan, TimerEventId, TimerSource}; use script_traits::{MediaSessionActionType, ScriptToConstellationChan, TimerEventId, TimerSource};
use script_traits::{UntrustedNodeAddress, WindowSizeData, WindowSizeType}; use script_traits::{UntrustedNodeAddress, WindowSizeData, WindowSizeType};
use selectors::matching::ElementSelectorFlags; use selectors::matching::ElementSelectorFlags;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@ -536,6 +536,7 @@ unsafe_no_jsmanaged_fields!(WindowGLContext);
unsafe_no_jsmanaged_fields!(VideoFrame); unsafe_no_jsmanaged_fields!(VideoFrame);
unsafe_no_jsmanaged_fields!(WebGLContextId); unsafe_no_jsmanaged_fields!(WebGLContextId);
unsafe_no_jsmanaged_fields!(Arc<Mutex<dyn AudioRenderer>>); unsafe_no_jsmanaged_fields!(Arc<Mutex<dyn AudioRenderer>>);
unsafe_no_jsmanaged_fields!(MediaSessionActionType);
unsafe impl<'a> JSTraceable for &'a str { unsafe impl<'a> JSTraceable for &'a str {
#[inline] #[inline]

View file

@ -16,6 +16,7 @@ use crate::script_thread::ScriptThread;
use dom_struct::dom_struct; use dom_struct::dom_struct;
use msg::constellation_msg::TopLevelBrowsingContextId; use msg::constellation_msg::TopLevelBrowsingContextId;
use script_traits::MediaSessionActionType; use script_traits::MediaSessionActionType;
use std::collections::HashMap;
use std::rc::Rc; use std::rc::Rc;
#[dom_struct] #[dom_struct]
@ -25,6 +26,9 @@ pub struct MediaSession {
metadata: MutNullableDom<MediaMetadata>, metadata: MutNullableDom<MediaMetadata>,
/// https://w3c.github.io/mediasession/#dom-mediasession-playbackstate /// https://w3c.github.io/mediasession/#dom-mediasession-playbackstate
playback_state: DomRefCell<MediaSessionPlaybackState>, playback_state: DomRefCell<MediaSessionPlaybackState>,
/// https://w3c.github.io/mediasession/#supported-media-session-actions
#[ignore_malloc_size_of = "Rc"]
action_handlers: DomRefCell<HashMap<MediaSessionActionType, Rc<MediaSessionActionHandler>>>,
} }
impl MediaSession { impl MediaSession {
@ -34,6 +38,7 @@ impl MediaSession {
reflector_: Reflector::new(), reflector_: Reflector::new(),
metadata: Default::default(), metadata: Default::default(),
playback_state: DomRefCell::new(MediaSessionPlaybackState::None), playback_state: DomRefCell::new(MediaSessionPlaybackState::None),
action_handlers: DomRefCell::new(HashMap::new()),
}; };
ScriptThread::register_media_session(&media_session, browsing_context_id); ScriptThread::register_media_session(&media_session, browsing_context_id);
media_session media_session
@ -54,10 +59,12 @@ impl MediaSession {
} }
impl MediaSessionMethods for MediaSession { impl MediaSessionMethods for MediaSession {
/// https://w3c.github.io/mediasession/#dom-mediasession-metadata
fn GetMetadata(&self) -> Option<DomRoot<MediaMetadata>> { fn GetMetadata(&self) -> Option<DomRoot<MediaMetadata>> {
self.metadata.get() self.metadata.get()
} }
/// https://w3c.github.io/mediasession/#dom-mediasession-metadata
fn SetMetadata(&self, metadata: Option<&MediaMetadata>) { fn SetMetadata(&self, metadata: Option<&MediaMetadata>) {
if let Some(ref metadata) = metadata { if let Some(ref metadata) = metadata {
metadata.set_session(self); metadata.set_session(self);
@ -75,11 +82,19 @@ impl MediaSessionMethods for MediaSession {
*self.playback_state.borrow_mut() = state; *self.playback_state.borrow_mut() = state;
} }
/// https://w3c.github.io/mediasession/#update-action-handler-algorithm
fn SetActionHandler( fn SetActionHandler(
&self, &self,
_action: MediaSessionAction, action: MediaSessionAction,
_handler: Option<Rc<MediaSessionActionHandler>>, handler: Option<Rc<MediaSessionActionHandler>>,
) { ) {
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); ScriptThread::remove_media_session(browsing_context_id);
} }
} }
impl From<MediaSessionAction> 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,
}
}
}

View file

@ -1061,7 +1061,7 @@ pub enum MessagePortMsg {
/// The type of MediaSession action. /// The type of MediaSession action.
/// https://w3c.github.io/mediasession/#enumdef-mediasessionaction /// https://w3c.github.io/mediasession/#enumdef-mediasessionaction
#[derive(Clone, Debug, Deserialize, Serialize)] #[derive(Clone, Debug, Deserialize, Eq, Hash, MallocSizeOf, PartialEq, Serialize)]
pub enum MediaSessionActionType { pub enum MediaSessionActionType {
/// The action intent is to resume playback. /// The action intent is to resume playback.
Play, Play,