commit 3e71e49b21aea01a0bd25599008ee02813c401d9
parent 30ceed98862fc8df9e45c0b2f1cae76483eff8ff
Author: Tom Schuster <tschuster@mozilla.com>
Date: Mon, 8 Dec 2025 13:13:20 +0000
Bug 2003789 - Use ChromeUtils.fetchDecodedImage in existing code. r=mossop,profiles-reviewers
Differential Revision: https://phabricator.services.mozilla.com/D275079
Diffstat:
2 files changed, 2 insertions(+), 157 deletions(-)
diff --git a/browser/components/profiles/SelectableProfileService.sys.mjs b/browser/components/profiles/SelectableProfileService.sys.mjs
@@ -57,53 +57,6 @@ const COMMAND_LINE_ACTIVATE = "profiles-activate";
const gSupportsBadging = "nsIMacDockSupport" in Ci || "nsIWinTaskbar" in Ci;
-/**
- * Handles listening to the channel requests.
- */
-class ChannelListener {
- #request = null;
- #imageListener = null;
- #rejector = null;
-
- constructor(rejector) {
- this.#rejector = rejector;
- }
-
- setImageListener(imageListener) {
- this.#imageListener = imageListener;
- if (this.#request) {
- this.#imageListener.onStartRequest(this.#request);
- }
- }
-
- onStartRequest(request) {
- this.#request = request;
- if (this.#imageListener) {
- this.#imageListener.onStartRequest(request);
- }
- }
-
- onStopRequest(request, status) {
- if (this.#imageListener) {
- this.#imageListener.onStopRequest(request, status);
- }
-
- if (!Components.isSuccessCode(status)) {
- this.#rejector(new Components.Exception("Image loading failed", status));
- }
-
- this.#imageListener = null;
- this.#rejector = null;
- this.#request = null;
- }
-
- onDataAvailable(request, inputStream, offset, count) {
- if (this.#imageListener) {
- this.#imageListener.onDataAvailable(request, inputStream, offset, count);
- }
- }
-}
-
async function loadImage(profile) {
let uri;
@@ -123,37 +76,7 @@ async function loadImage(profile) {
Ci.nsIContentPolicy.TYPE_IMAGE
);
- return new Promise((resolve, reject) => {
- let imageTools = Cc["@mozilla.org/image/tools;1"].getService(Ci.imgITools);
-
- // Despite the docs it is fine to pass null here, we then just get a global loader.
- let imageLoader = imageTools.getImgLoaderForDocument(null);
- let observer = imageTools.createScriptedObserver({
- decodeComplete() {
- request.cancel(Cr.NS_BINDING_ABORTED);
- resolve(request.image);
- },
- });
-
- let channelListener = new ChannelListener(reject);
- channel.asyncOpen(channelListener);
-
- let streamListener = {};
- let request = imageLoader.loadImageWithChannelXPCOM(
- channel,
- observer,
- null,
- streamListener
- );
- // Force image decoding to start when the container is available.
- request.startDecoding(Ci.imgIContainer.FLAG_ASYNC_NOTIFY);
-
- // If the request is coming from the cache then there will be no listener
- // and the channel will have been automatically cancelled.
- if (streamListener.value) {
- channelListener.setImageListener(streamListener.value);
- }
- });
+ return ChromeUtils.fetchDecodedImage(uri, channel);
}
/**
diff --git a/browser/components/taskbartabs/TaskbarTabsUtils.sys.mjs b/browser/components/taskbartabs/TaskbarTabsUtils.sys.mjs
@@ -149,56 +149,6 @@ function scaleImage(aImgContainer) {
}
/**
- * A channel listener to aid with receiving image data.
- */
-class ChannelListener {
- #request = null;
- #imageListener = null;
- #rejector = null;
-
- constructor(rejector) {
- this.#rejector = rejector;
- }
-
- setImageListener(imageListener) {
- this.#imageListener = imageListener;
- if (this.#request) {
- this.#imageListener.onStartRequest(this.#request);
- }
- }
-
- onStartRequest(request) {
- this.#request = request;
- if (this.#imageListener) {
- this.#imageListener.onStartRequest(request);
- }
- }
-
- onStopRequest(request, status) {
- if (this.#imageListener) {
- this.#imageListener.onStopRequest(request, status);
- }
-
- if (
- !Components.isSuccessCode(status) &&
- status !== Cr.NS_ERROR_PARSED_DATA_CACHED
- ) {
- this.#rejector(new Components.Exception("Image loading failed", status));
- }
-
- this.#imageListener = null;
- this.#rejector = null;
- this.#request = null;
- }
-
- onDataAvailable(request, inputStream, offset, count) {
- if (this.#imageListener) {
- this.#imageListener.onDataAvailable(request, inputStream, offset, count);
- }
- }
-}
-
-/**
* Retrieves an image given a URI.
*
* @param {nsIURI} aUri - The URI to retrieve an image from.
@@ -222,33 +172,5 @@ async function getImageFromUri(aUri) {
Ci.nsIContentPolicy.TYPE_IMAGE
);
- return new Promise((resolve, reject) => {
- // Despite the docs it is fine to pass null here, we then just get a global loader.
- let imageLoader = lazy.imgTools.getImgLoaderForDocument(null);
- let observer = lazy.imgTools.createScriptedObserver({
- decodeComplete() {
- request.cancel(Cr.NS_BINDING_ABORTED);
- resolve(request.image);
- },
- });
-
- let channelListener = new ChannelListener(reject);
- channel.asyncOpen(channelListener);
-
- let streamListener = {};
- let request = imageLoader.loadImageWithChannelXPCOM(
- channel,
- observer,
- null,
- streamListener
- );
- // Force image decoding to start when the container is available.
- request.startDecoding(Ci.imgIContainer.FLAG_ASYNC_NOTIFY);
-
- // If the request is coming from the cache then there will be no listener
- // and the channel will have been automatically cancelled.
- if (streamListener.value) {
- channelListener.setImageListener(streamListener.value);
- }
- });
+ return ChromeUtils.fetchDecodedImage(aUri, channel);
}