tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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:
Mwidget/cocoa/MediaHardwareKeysEventSourceMacMediaCenter.h | 9---------
Mwidget/cocoa/MediaHardwareKeysEventSourceMacMediaCenter.mm | 124+++++++++++++++++++++++++++----------------------------------------------------
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