From 568289aac70a6039b66b9819296722d392f06180 Mon Sep 17 00:00:00 2001 From: alwu Date: Wed, 4 Mar 2020 18:38:43 +0000 Subject: [PATCH] Bug 1592037 - part1 : do not update empty metadata to media session controller. r=MeFisto94 If new coming metadata is `null` (when setting `MediaSession.metadata=null`) or an empty metadata [1], then we would like to reset the `Maybe` in `MediaSessionController` in order to use the default metadata when someone asks for the current metadata. [1] https://w3c.github.io/mediasession/#empty-metadata Differential Revision: https://phabricator.services.mozilla.com/D64844 --HG-- extra : moz-landing-system : lando --- .../mediasession/MediaSessionController.cpp | 26 ++++++++++++++++--- .../mediasession/MediaSessionController.h | 3 ++- 2 files changed, 24 insertions(+), 5 deletions(-) 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