From 9bf5424e0e14b8f0f377c1ebdb6149585e2672ff Mon Sep 17 00:00:00 2001 From: alwu Date: Fri, 13 Mar 2020 23:31:16 +0000 Subject: [PATCH] Bug 1582508 - part1 : implement 'MediaSessionPlaybackState'. r=webidl,chunmin,Ehsan Implement `playbackstate`[1] attribute for media session interface. [1] https://w3c.github.io/mediasession/#dom-mediasession-playbackstate Differential Revision: https://phabricator.services.mozilla.com/D66338 --HG-- extra : moz-landing-system : lando --- dom/media/mediasession/MediaSession.cpp | 14 ++++++++++++++ dom/media/mediasession/MediaSession.h | 10 ++++++++++ dom/webidl/MediaSession.webidl | 8 ++++++-- 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/dom/media/mediasession/MediaSession.cpp b/dom/media/mediasession/MediaSession.cpp index 649ae7357430..63f385c0e4e8 100644 --- a/dom/media/mediasession/MediaSession.cpp +++ b/dom/media/mediasession/MediaSession.cpp @@ -39,6 +39,20 @@ void MediaSession::SetMetadata(MediaMetadata* aMetadata) { NotifyMetadataUpdated(); } +void MediaSession::SetPlaybackState( + const MediaSessionPlaybackState& aPlaybackState) { + if (mDeclaredPlaybackState == aPlaybackState) { + return; + } + mDeclaredPlaybackState = aPlaybackState; + // TODO : propagate declared state to the media controller in chrome process + // in order to call `media session actions update algorithm`. +} + +MediaSessionPlaybackState MediaSession::PlaybackState() const { + return mDeclaredPlaybackState; +} + void MediaSession::SetActionHandler(MediaSessionAction aAction, MediaSessionActionHandler* aHandler) { size_t index = static_cast(aAction); diff --git a/dom/media/mediasession/MediaSession.h b/dom/media/mediasession/MediaSession.h index 08ed73a1abe4..e3557f5d4eef 100644 --- a/dom/media/mediasession/MediaSession.h +++ b/dom/media/mediasession/MediaSession.h @@ -39,6 +39,10 @@ class MediaSession final : public nsISupports, public nsWrapperCache { void SetMetadata(MediaMetadata* aMetadata); + void SetPlaybackState(const MediaSessionPlaybackState& aPlaybackState); + + MediaSessionPlaybackState PlaybackState() const; + void SetActionHandler(MediaSessionAction aAction, MediaSessionActionHandler* aHandler); @@ -72,6 +76,12 @@ class MediaSession final : public nsISupports, public nsWrapperCache { RefPtr mMediaMetadata; static const size_t ACTIONS = MediaSessionActionValues::Count; RefPtr mActionHandlers[ACTIONS] = {nullptr}; + + // This is used as is a hint for the user agent to determine whether the + // browsing context is playing or paused. + // https://w3c.github.io/mediasession/#declared-playback-state + MediaSessionPlaybackState mDeclaredPlaybackState = + MediaSessionPlaybackState::None; }; } // namespace dom diff --git a/dom/webidl/MediaSession.webidl b/dom/webidl/MediaSession.webidl index 3a30e2dcd68b..c13096edc591 100644 --- a/dom/webidl/MediaSession.webidl +++ b/dom/webidl/MediaSession.webidl @@ -7,7 +7,11 @@ * https://w3c.github.io/mediasession/#idl-index */ -// TODO: Implement MediaSessionPlaybackState (bug 1582508) +enum MediaSessionPlaybackState { + "none", + "paused", + "playing" +}; // TODO: Implement the missing seek* (bug 1580623) and skipad (bug 1582569) actions enum MediaSessionAction { @@ -24,7 +28,7 @@ callback MediaSessionActionHandler = void(MediaSessionActionDetails details); interface MediaSession { attribute MediaMetadata? metadata; - // TODO: attribute MediaSessionPlaybackState playbackState; (bug 1582508) + attribute MediaSessionPlaybackState playbackState; void setActionHandler(MediaSessionAction action, MediaSessionActionHandler? handler);