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
This commit is contained in:
alwu 2020-03-04 18:38:43 +00:00
parent 814194b463
commit 568289aac7
2 changed files with 24 additions and 5 deletions

View File

@ -25,6 +25,19 @@ mozilla::LazyLogModule gMediaSession("MediaSession");
namespace mozilla { namespace mozilla {
namespace dom { namespace dom {
static bool IsMetadataEmpty(const Maybe<MediaMetadataBase>& 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) MediaSessionController::MediaSessionController(uint64_t aContextId)
: mTopLevelBCId(aContextId) { : mTopLevelBCId(aContextId) {
MOZ_DIAGNOSTIC_ASSERT(XRE_IsParentProcess(), MOZ_DIAGNOSTIC_ASSERT(XRE_IsParentProcess(),
@ -51,13 +64,18 @@ void MediaSessionController::NotifySessionDestroyed(
UpdateActiveMediaSessionContextId(); UpdateActiveMediaSessionContextId();
} }
void MediaSessionController::UpdateMetadata(uint64_t aSessionContextId, void MediaSessionController::UpdateMetadata(
MediaMetadataBase& aMetadata) { uint64_t aSessionContextId, const Maybe<MediaMetadataBase>& aMetadata) {
if (!mMetadataMap.Contains(aSessionContextId)) { if (!mMetadataMap.Contains(aSessionContextId)) {
return; return;
} }
LOG("Update metadata for session %" PRId64, aSessionContextId); if (IsMetadataEmpty(aMetadata)) {
mMetadataMap.GetValue(aSessionContextId)->emplace(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() { void MediaSessionController::UpdateActiveMediaSessionContextId() {

View File

@ -46,7 +46,8 @@ class MediaSessionController {
// Use this function to store the media metadata when media session updated // Use this function to store the media metadata when media session updated
// its metadata in the content process. // its metadata in the content process.
void UpdateMetadata(uint64_t aSessionContextId, MediaMetadataBase& aMetadata); void UpdateMetadata(uint64_t aSessionContextId,
const Maybe<MediaMetadataBase>& aMetadata);
// Return active media session's metadata if active media session exists and // Return active media session's metadata if active media session exists and
// it has already set its metadata. Otherwise, return default media metadata // it has already set its metadata. Otherwise, return default media metadata