commit cf92280990d50fa532124ec1b848ddd4965a3d17
parent a8f7fcefdda1268014c961141ee6ed7f27470a8d
Author: Tom Schuster <tschuster@mozilla.com>
Date: Mon, 10 Nov 2025 14:09:16 +0000
Bug 1944033 - Update macOS/cocoa to use the image from the child. r=media-playback-reviewers,aosmond
Differential Revision: https://phabricator.services.mozilla.com/D271090
Diffstat:
2 files changed, 42 insertions(+), 91 deletions(-)
diff --git a/widget/cocoa/MediaHardwareKeysEventSourceMacMediaCenter.h b/widget/cocoa/MediaHardwareKeysEventSourceMacMediaCenter.h
@@ -5,7 +5,6 @@
#ifndef WIDGET_COCOA_MEDIAHARDWAREKEYSEVENTSOURCEMACMEDIACENTER_H_
#define WIDGET_COCOA_MEDIAHARDWAREKEYSEVENTSOURCEMACMEDIACENTER_H_
-#include "mozilla/dom/FetchImageHelper.h"
#include "mozilla/dom/MediaControlKeySource.h"
#ifdef __OBJC__
@@ -52,15 +51,7 @@ class MediaHardwareKeysEventSourceMacMediaCenter final
bool mOpened = false;
dom::MediaMetadataBase mMediaMetadata;
- // Should only be used on main thread
- UniquePtr<dom::FetchImageHelper> mImageFetcher;
- MozPromiseRequestHolder<dom::ImagePromise> mImageFetchRequest;
-
- nsString mFetchingUrl;
nsString mCurrentImageUrl;
- size_t mNextImageIndex = 0;
-
- void LoadImageAtIndex(const size_t aIndex);
MediaCenterEventHandler mPlayPauseHandler;
MediaCenterEventHandler mNextTrackHandler;
diff --git a/widget/cocoa/MediaHardwareKeysEventSourceMacMediaCenter.mm b/widget/cocoa/MediaHardwareKeysEventSourceMacMediaCenter.mm
@@ -156,10 +156,7 @@ bool MediaHardwareKeysEventSourceMacMediaCenter::Open() {
void MediaHardwareKeysEventSourceMacMediaCenter::Close() {
LOG("Close MediaHardwareKeysEventSourceMacMediaCenter");
SetPlaybackState(MediaSessionPlaybackState::None);
- mImageFetchRequest.DisconnectIfExists();
mCurrentImageUrl.Truncate();
- mFetchingUrl.Truncate();
- mNextImageIndex = 0;
EndListeningForEvents();
mOpened = false;
MediaControlKeySource::Close();
@@ -205,15 +202,50 @@ void MediaHardwareKeysEventSourceMacMediaCenter::SetMediaMetadata(
forKey:MPMediaItemPropertyArtist];
[nowPlayingInfo setObject:nsCocoaUtils::ToNSString(aMetadata.mAlbum)
forKey:MPMediaItemPropertyAlbumTitle];
- if (mCurrentImageUrl.IsEmpty() ||
- !IsImageIn(aMetadata.mArtwork, mCurrentImageUrl)) {
- [nowPlayingInfo removeObjectForKey:MPMediaItemPropertyArtwork];
- if (mFetchingUrl.IsEmpty() ||
- !IsImageIn(aMetadata.mArtwork, mFetchingUrl)) {
- mNextImageIndex = 0;
- LoadImageAtIndex(mNextImageIndex++);
+ bool remove = true;
+ for (const dom::MediaImageData& imageData : aMetadata.mArtwork) {
+ if (!imageData.mDataSurface) {
+ continue;
+ }
+
+ if (mCurrentImageUrl == imageData.mSrc) {
+ LOG("Artwork image url did not change.");
+ remove = false;
+ break;
+ }
+
+ RefPtr<gfxDrawable> drawable = new gfxSurfaceDrawable(
+ imageData.mDataSurface, imageData.mDataSurface->GetSize());
+ nsCOMPtr<imgIContainer> imageContainer =
+ image::ImageOps::CreateFromDrawable(drawable);
+
+ NSImage* image;
+ nsresult rv =
+ nsCocoaUtils::CreateDualRepresentationNSImageFromImageContainer(
+ imageContainer, imgIContainer::FRAME_CURRENT, nullptr,
+ NSMakeSize(0, 0), &image);
+ if (NS_FAILED(rv) || !image) {
+ LOG("Failed to create cocoa image. Try next image");
+ continue;
}
+
+ MPMediaItemArtwork* artwork = [[MPMediaItemArtwork alloc]
+ initWithBoundsSize:image.size
+ requestHandler:^NSImage* _Nonnull(CGSize aSize) {
+ return image;
+ }];
+ [nowPlayingInfo setObject:artwork forKey:MPMediaItemPropertyArtwork];
+ [artwork release];
+ [image release];
+
+ mCurrentImageUrl = imageData.mSrc;
+ remove = false;
+ break;
+ }
+
+ if (remove) {
+ [nowPlayingInfo removeObjectForKey:MPMediaItemPropertyArtwork];
}
// The procedure of updating `nowPlayingInfo` is actually an async operation
@@ -264,77 +296,5 @@ void MediaHardwareKeysEventSourceMacMediaCenter::SetPositionState(
}
}
-void MediaHardwareKeysEventSourceMacMediaCenter::LoadImageAtIndex(
- const size_t aIndex) {
- MOZ_ASSERT(NS_IsMainThread());
-
- if (aIndex >= mMediaMetadata.mArtwork.Length()) {
- LOG("Stop loading image. No available image");
- mImageFetchRequest.DisconnectIfExists();
- mFetchingUrl.Truncate();
- return;
- }
-
- const MediaImage& image = mMediaMetadata.mArtwork[aIndex];
-
- if (!IsValidImageUrl(image.mSrc)) {
- LOG("Skip the image with invalid URL. Try next image");
- LoadImageAtIndex(mNextImageIndex++);
- return;
- }
-
- mImageFetchRequest.DisconnectIfExists();
- mFetchingUrl = image.mSrc;
-
- mImageFetcher = MakeUnique<dom::FetchImageHelper>(image);
- RefPtr<MediaHardwareKeysEventSourceMacMediaCenter> self = this;
- mImageFetcher->FetchImage()
- ->Then(
- AbstractThread::MainThread(), __func__,
- [this, self](const nsCOMPtr<imgIContainer>& aImage) {
- LOG("The image is fetched successfully");
- mImageFetchRequest.Complete();
-
- NSImage* image;
- nsresult rv =
- nsCocoaUtils::CreateDualRepresentationNSImageFromImageContainer(
- aImage, imgIContainer::FRAME_CURRENT, nullptr,
- NSMakeSize(0, 0), &image);
- if (NS_FAILED(rv) || !image) {
- LOG("Failed to create cocoa image. Try next image");
- LoadImageAtIndex(mNextImageIndex++);
- return;
- }
- mCurrentImageUrl = mFetchingUrl;
-
- MPNowPlayingInfoCenter* center =
- [MPNowPlayingInfoCenter defaultCenter];
- NSMutableDictionary* nowPlayingInfo =
- [[center.nowPlayingInfo mutableCopy] autorelease]
- ?: [NSMutableDictionary dictionary];
-
- MPMediaItemArtwork* artwork = [[MPMediaItemArtwork alloc]
- initWithBoundsSize:image.size
- requestHandler:^NSImage* _Nonnull(CGSize aSize) {
- return image;
- }];
- [nowPlayingInfo setObject:artwork
- forKey:MPMediaItemPropertyArtwork];
- [artwork release];
- [image release];
-
- center.nowPlayingInfo = nowPlayingInfo;
-
- mFetchingUrl.Truncate();
- },
- [this, self](bool) {
- LOG("Failed to fetch image. Try next image");
- mImageFetchRequest.Complete();
- mFetchingUrl.Truncate();
- LoadImageAtIndex(mNextImageIndex++);
- })
- ->Track(mImageFetchRequest);
-}
-
} // namespace widget
} // namespace mozilla