diff options
Diffstat (limited to '')
-rw-r--r-- | dom/media/mediacontrol/FetchImageHelper.h | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/dom/media/mediacontrol/FetchImageHelper.h b/dom/media/mediacontrol/FetchImageHelper.h new file mode 100644 index 0000000000..eb3e719610 --- /dev/null +++ b/dom/media/mediacontrol/FetchImageHelper.h @@ -0,0 +1,82 @@ +/* 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 DOM_MEDIA_MEDIACONTROL_FETCHIMAGEHELPER_H_ +#define DOM_MEDIA_MEDIACONTROL_FETCHIMAGEHELPER_H_ + +#include "imgIContainer.h" +#include "imgITools.h" +#include "mozilla/dom/MediaSessionBinding.h" +#include "mozilla/MozPromise.h" + +namespace mozilla::dom { +/** + * FetchImageHelper is used to fetch image data from MediaImage, and the fetched + * image data would be used to show on the virtual control inferface. The URL of + * MediaImage is defined by websites by using MediaSession API [1]. + * + * By using `FetchImage()`, it would return a promise that would resolve with a + * `imgIContainer`, then we can get the image data from the container. + * + * [1] https://w3c.github.io/mediasession/#dictdef-mediaimage + */ +using ImagePromise = MozPromise<nsCOMPtr<imgIContainer>, bool, + /* IsExclusive = */ true>; +class FetchImageHelper final { + public: + explicit FetchImageHelper(const MediaImage& aImage); + ~FetchImageHelper(); + + // Return a promise which would be resolved with the decoded image surface + // when we finish fetching and decoding image data, and it would be rejected + // when we fail to fecth the image. + RefPtr<ImagePromise> FetchImage(); + + // Stop fetching and decoding image and reject the image promise. If we have + // not started yet fetching image, then nothing would happen. + void AbortFetchingImage(); + + // Return true if we're fecthing image. + bool IsFetchingImage() const; + + private: + /** + * ImageFetchListener is used to listen the notification of finishing fetching + * image data (via `OnImageReady()`) and finishing decoding image data (via + * `Notify()`). + */ + class ImageFetchListener final : public imgIContainerCallback { + public: + NS_DECL_ISUPPORTS + ImageFetchListener() = default; + + // Start an async channel to load the image, and return error if the channel + // opens failed. It would use `aHelper::HandleFetchSuccess/Fail()` to notify + // the result asynchronously. + nsresult FetchDecodedImageFromURI(nsIURI* aURI, FetchImageHelper* aHelper); + void Clear(); + bool IsFetchingImage() const; + + // Method of imgIContainerCallback + NS_IMETHOD OnImageReady(imgIContainer* aImage, nsresult aStatus) override; + + private: + ~ImageFetchListener(); + + FetchImageHelper* MOZ_NON_OWNING_REF mHelper = nullptr; + nsCOMPtr<nsIChannel> mChannel; + }; + + void ClearListenerIfNeeded(); + void HandleFetchSuccess(imgIContainer* aImage); + void HandleFetchFail(); + + nsString mSrc; + MozPromiseHolder<ImagePromise> mPromise; + RefPtr<ImageFetchListener> mListener; +}; + +} // namespace mozilla::dom + +#endif // DOM_MEDIA_MEDIACONTROL_FETCHIMAGEHELPER_H_ |