From 6bf0a5cb5034a7e684dcc3500e841785237ce2dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 19:32:43 +0200 Subject: Adding upstream version 1:115.7.0. Signed-off-by: Daniel Baumann --- dom/media/mediacontrol/FetchImageHelper.h | 82 +++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 dom/media/mediacontrol/FetchImageHelper.h (limited to 'dom/media/mediacontrol/FetchImageHelper.h') 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, 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 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 mChannel; + }; + + void ClearListenerIfNeeded(); + void HandleFetchSuccess(imgIContainer* aImage); + void HandleFetchFail(); + + nsString mSrc; + MozPromiseHolder mPromise; + RefPtr mListener; +}; + +} // namespace mozilla::dom + +#endif // DOM_MEDIA_MEDIACONTROL_FETCHIMAGEHELPER_H_ -- cgit v1.2.3