diff --git a/dom/media/mediasession/MediaSessionController.cpp b/dom/media/mediasession/MediaSessionController.cpp index cd96703a2e1a..2fbd45287dc4 100644 --- a/dom/media/mediasession/MediaSessionController.cpp +++ b/dom/media/mediasession/MediaSessionController.cpp @@ -25,6 +25,19 @@ mozilla::LazyLogModule gMediaSession("MediaSession"); namespace mozilla { namespace dom { +static bool IsMetadataEmpty(const Maybe& aMetadata) { + // Media session's metadata is null. + if (!aMetadata) { + return true; + } + + // All attirbutes in metadata are empty. + // https://w3c.github.io/mediasession/#empty-metadata + const MediaMetadataBase& metadata = *aMetadata; + return metadata.mTitle.IsEmpty() && metadata.mArtist.IsEmpty() && + metadata.mAlbum.IsEmpty() && metadata.mArtwork.IsEmpty(); +} + MediaSessionController::MediaSessionController(uint64_t aContextId) : mTopLevelBCId(aContextId) { MOZ_DIAGNOSTIC_ASSERT(XRE_IsParentProcess(), @@ -51,13 +64,18 @@ void MediaSessionController::NotifySessionDestroyed( UpdateActiveMediaSessionContextId(); } -void MediaSessionController::UpdateMetadata(uint64_t aSessionContextId, - MediaMetadataBase& aMetadata) { +void MediaSessionController::UpdateMetadata( + uint64_t aSessionContextId, const Maybe& aMetadata) { if (!mMetadataMap.Contains(aSessionContextId)) { return; } - LOG("Update metadata for session %" PRId64, aSessionContextId); - mMetadataMap.GetValue(aSessionContextId)->emplace(aMetadata); + if (IsMetadataEmpty(aMetadata)) { + LOG("Reset metadata for session %" PRId64, aSessionContextId); + mMetadataMap.GetValue(aSessionContextId)->reset(); + } else { + LOG("Update metadata for session %" PRId64, aSessionContextId); + mMetadataMap.GetValue(aSessionContextId)->emplace(*aMetadata); + } } void MediaSessionController::UpdateActiveMediaSessionContextId() { diff --git a/dom/media/mediasession/MediaSessionController.h b/dom/media/mediasession/MediaSessionController.h index f9a4753017a6..2ffd1f770b0a 100644 --- a/dom/media/mediasession/MediaSessionController.h +++ b/dom/media/mediasession/MediaSessionController.h @@ -46,7 +46,8 @@ class MediaSessionController { // Use this function to store the media metadata when media session updated // its metadata in the content process. - void UpdateMetadata(uint64_t aSessionContextId, MediaMetadataBase& aMetadata); + void UpdateMetadata(uint64_t aSessionContextId, + const Maybe& aMetadata); // Return active media session's metadata if active media session exists and // it has already set its metadata. Otherwise, return default media metadata