tor-browser

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

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:
Mbrowser/components/profiles/SelectableProfileService.sys.mjs | 79+------------------------------------------------------------------------------
Mbrowser/components/taskbartabs/TaskbarTabsUtils.sys.mjs | 80+------------------------------------------------------------------------------
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); }