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::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<Mutex<dyn AudioRenderer>>);
unsafe_no_jsmanaged_fields!(MediaSessionActionType);
unsafe impl<'a> JSTraceable for &'a str {
#[inline]

View file

@ -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<MediaMetadata>,
/// https://w3c.github.io/mediasession/#dom-mediasession-playbackstate
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 {
@ -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<DomRoot<MediaMetadata>> {
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<Rc<MediaSessionActionHandler>>,
action: MediaSessionAction,
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);
}
}
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.
/// 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,