/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim:set ts=2 sw=2 sts=2 et cindent: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef mozilla_dom_MediaMetadata_h #define mozilla_dom_MediaMetadata_h #include "MediaEventSource.h" #include "js/TypeDecls.h" #include "mozilla/dom/BindingDeclarations.h" #include "mozilla/dom/MediaSessionBinding.h" #include "mozilla/gfx/2D.h" #include "nsCycleCollectionParticipant.h" #include "nsWrapperCache.h" class nsIGlobalObject; namespace mozilla { class ErrorResult; namespace dom { class MediaImageData { public: MediaImageData() = default; explicit MediaImageData(const MediaImage& aImage) : mSizes(aImage.mSizes), mSrc(aImage.mSrc), mType(aImage.mType) {} MediaImage ToMediaImage() const; nsString mSizes; nsString mSrc; nsString mType; // Maybe null, only the first valid artwork is fetched by // MediaMetadata::FetchArtwork. RefPtr mDataSurface; }; class MediaMetadataBase { public: MediaMetadataBase() = default; MediaMetadataBase(const nsString& aTitle, const nsString& aArtist, const nsString& aAlbum) : mTitle(aTitle), mArtist(aArtist), mAlbum(aAlbum) {} static MediaMetadataBase EmptyData() { return MediaMetadataBase(); } nsString mTitle; nsString mArtist; nsString mAlbum; nsCString mUrl; CopyableTArray mArtwork; }; using MediaMetadataBasePromise = mozilla::MozPromise; class MediaMetadata final : public nsISupports, public nsWrapperCache, private MediaMetadataBase { public: // Ref counting and cycle collection NS_DECL_CYCLE_COLLECTING_ISUPPORTS_FINAL NS_DECL_CYCLE_COLLECTION_WRAPPERCACHE_CLASS(MediaMetadata) // WebIDL methods nsIGlobalObject* GetParentObject() const; JSObject* WrapObject(JSContext* aCx, JS::Handle aGivenProto) override; static already_AddRefed Constructor( const GlobalObject& aGlobal, const MediaMetadataInit& aInit, ErrorResult& aRv); void GetTitle(nsString& aRetVal) const; void SetTitle(const nsAString& aTitle); void GetArtist(nsString& aRetVal) const; void SetArtist(const nsAString& aArtist); void GetAlbum(nsString& aRetVal) const; void SetAlbum(const nsAString& aAlbum); void GetArtwork(JSContext* aCx, nsTArray& aRetVal, ErrorResult& aRv) const; void SetArtwork(JSContext* aCx, const Sequence& aArtwork, ErrorResult& aRv); // This function will always resolve successfully, even when no artwork was // loaded. // At most, it returns one decoded image of the artwork. RefPtr LoadMetadataArtwork(); // Before LoadMetadataArtwork() resolves the mDataSurface of the // MediaImageData is going to be null. MediaMetadataBase* AsMetadataBaseWithoutArtworkSurface() { return this; } MediaEventSource& MetadataChangeEvent() { return mMetadataChangeEvent; } private: MediaMetadata(nsIGlobalObject* aParent, const nsString& aTitle, const nsString& aArtist, const nsString& aAlbum); ~MediaMetadata() = default; // Perform `convert artwork algorithm`. Set `mArtwork` to a converted // `aArtwork` if the conversion works, otherwise throw a type error in `aRv`. void SetArtworkInternal(const Sequence& aArtwork, ErrorResult& aRv); static RefPtr FetchArtwork( const MediaMetadataBase& aMetadata, nsIPrincipal* aPrincipal, const size_t aIndex); nsCOMPtr mParent; MediaEventProducer mMetadataChangeEvent; }; } // namespace dom } // namespace mozilla #endif // mozilla_dom_MediaMetadata_h