Version in base suite: 128.10.0esr-1~deb12u1 Base version: thunderbird_128.10.0esr-1~deb12u1 Target version: thunderbird_128.10.1esr-1~deb12u1 Base file: /srv/ftp-master.debian.org/ftp/pool/main/t/thunderbird/thunderbird_128.10.0esr-1~deb12u1.dsc Target file: /srv/ftp-master.debian.org/policy/pool/main/t/thunderbird/thunderbird_128.10.1esr-1~deb12u1.dsc comm/.gecko_rev.yml | 2 comm/mail/app/profile/all-thunderbird.js | 5 comm/mail/base/content/aboutMessage.js | 18 comm/mail/base/content/contentAreaClick.js | 2 comm/mail/base/content/mailCommands.js | 13 comm/mail/base/content/mailCommon.js | 5 comm/mail/base/content/msgHdrView.js | 34 - comm/mail/components/MailGlue.sys.mjs | 15 comm/mail/components/extensions/ExtensionUtilities.sys.mjs | 52 ++ comm/mail/components/extensions/moz.build | 1 comm/mail/components/extensions/test/browser/browser.ini | 2 comm/mail/components/extensions/test/browser/browser_ext_extension_check_for_IAN.js | 151 ++++++++ comm/mail/components/preferences/receipts.xhtml | 5 comm/mail/config/version.txt | 2 comm/mail/config/version_display.txt | 2 comm/mail/extensions/openpgp/test/unit/rnp/test_uid.js | 4 comm/mail/modules/AttachmentInfo.sys.mjs | 59 +-- comm/mail/modules/PhishingDetector.sys.mjs | 11 comm/mail/test/browser/attachment/browser_attachmentMenus.js | 10 comm/mail/themes/shared/mail/preferences/dialog.css | 4 comm/mailnews/base/src/nsMsgContentPolicy.cpp | 3 comm/mailnews/compose/src/nsSmtpUrl.cpp | 181 +++++----- comm/mailnews/compose/test/unit/test_smtpURL.js | 8 comm/mailnews/import/public/nsIImportService.idl | 29 - comm/mailnews/import/src/nsOutlookCompose.cpp | 22 - comm/mailnews/local/src/nsMailboxProtocol.cpp | 9 comm/mailnews/mime/jsmime/jsmime.mjs | 30 + comm/mailnews/mime/jsmime/test/unit/test_header.js | 20 - comm/mailnews/mime/src/MimeJSComponents.sys.mjs | 53 ++ comm/mailnews/mime/src/mimei.cpp | 3 comm/mailnews/mime/src/mimemoz2.cpp | 1 comm/mailnews/mime/src/mimetext.cpp | 65 --- comm/mailnews/mime/src/modlmime.h | 2 comm/mailnews/mime/test/unit/test_nsIMsgHeaderParser4.js | 17 comm/taskcluster/kinds/release-msix-push/kind.yml | 43 ++ comm/taskcluster/kinds/release-snap-repackage/kind.yml | 2 debian/changelog | 20 + sourcestamp.txt | 4 thunderbird-l10n/af/manifest.json | 4 thunderbird-l10n/ar/manifest.json | 4 thunderbird-l10n/ast/manifest.json | 4 thunderbird-l10n/be/manifest.json | 4 thunderbird-l10n/bg/manifest.json | 4 thunderbird-l10n/br/manifest.json | 4 thunderbird-l10n/ca/manifest.json | 4 thunderbird-l10n/cak/manifest.json | 4 thunderbird-l10n/cs/manifest.json | 4 thunderbird-l10n/cy/manifest.json | 4 thunderbird-l10n/da/manifest.json | 4 thunderbird-l10n/de/manifest.json | 4 thunderbird-l10n/dsb/manifest.json | 4 thunderbird-l10n/el/manifest.json | 4 thunderbird-l10n/en-CA/manifest.json | 4 thunderbird-l10n/en-GB/manifest.json | 4 thunderbird-l10n/es-AR/manifest.json | 4 thunderbird-l10n/es-ES/manifest.json | 4 thunderbird-l10n/es-MX/manifest.json | 4 thunderbird-l10n/et/manifest.json | 4 thunderbird-l10n/eu/manifest.json | 4 thunderbird-l10n/fi/manifest.json | 4 thunderbird-l10n/fr/manifest.json | 4 thunderbird-l10n/fy-NL/manifest.json | 4 thunderbird-l10n/ga-IE/manifest.json | 4 thunderbird-l10n/gd/manifest.json | 4 thunderbird-l10n/gl/manifest.json | 4 thunderbird-l10n/he/manifest.json | 4 thunderbird-l10n/hr/manifest.json | 4 thunderbird-l10n/hsb/manifest.json | 4 thunderbird-l10n/hu/manifest.json | 4 thunderbird-l10n/hy-AM/manifest.json | 4 thunderbird-l10n/id/manifest.json | 4 thunderbird-l10n/is/manifest.json | 4 thunderbird-l10n/it/manifest.json | 4 thunderbird-l10n/ja/manifest.json | 4 thunderbird-l10n/ka/manifest.json | 4 thunderbird-l10n/kab/manifest.json | 4 thunderbird-l10n/kk/manifest.json | 4 thunderbird-l10n/ko/manifest.json | 4 thunderbird-l10n/lt/manifest.json | 4 thunderbird-l10n/lv/manifest.json | 4 thunderbird-l10n/ms/manifest.json | 4 thunderbird-l10n/nb-NO/manifest.json | 4 thunderbird-l10n/nl/manifest.json | 4 thunderbird-l10n/nn-NO/manifest.json | 4 thunderbird-l10n/pa-IN/manifest.json | 4 thunderbird-l10n/pl/manifest.json | 4 thunderbird-l10n/pt-BR/manifest.json | 4 thunderbird-l10n/pt-PT/manifest.json | 4 thunderbird-l10n/rm/manifest.json | 4 thunderbird-l10n/ro/manifest.json | 4 thunderbird-l10n/ru/manifest.json | 4 thunderbird-l10n/sk/manifest.json | 4 thunderbird-l10n/sl/manifest.json | 4 thunderbird-l10n/sq/manifest.json | 4 thunderbird-l10n/sr/manifest.json | 4 thunderbird-l10n/sv-SE/manifest.json | 4 thunderbird-l10n/th/manifest.json | 4 thunderbird-l10n/tr/manifest.json | 4 thunderbird-l10n/uk/manifest.json | 4 thunderbird-l10n/uz/manifest.json | 4 thunderbird-l10n/vi/manifest.json | 4 thunderbird-l10n/zh-CN/manifest.json | 4 thunderbird-l10n/zh-TW/manifest.json | 4 103 files changed, 750 insertions(+), 419 deletions(-) diff -Nru thunderbird-128.10.0esr/comm/.gecko_rev.yml thunderbird-128.10.1esr/comm/.gecko_rev.yml --- thunderbird-128.10.0esr/comm/.gecko_rev.yml 2025-04-25 08:53:41.000000000 +0000 +++ thunderbird-128.10.1esr/comm/.gecko_rev.yml 2025-05-13 13:22:25.000000000 +0000 @@ -1,7 +1,7 @@ --- GECKO_BASE_REPOSITORY: https://hg.mozilla.org/mozilla-unified GECKO_HEAD_REPOSITORY: https://hg.mozilla.org/releases/mozilla-esr128 -GECKO_HEAD_REF: FIREFOX_128_10_0esr_BUILD1 +GECKO_HEAD_REF: FIREFOX_128_10_0esr_RELEASE GECKO_HEAD_REV: 8e875e7de75c05112284e9f6e91927b7bbe36e79 ### For comm-central diff -Nru thunderbird-128.10.0esr/comm/mail/app/profile/all-thunderbird.js thunderbird-128.10.1esr/comm/mail/app/profile/all-thunderbird.js --- thunderbird-128.10.0esr/comm/mail/app/profile/all-thunderbird.js 2025-04-25 08:53:41.000000000 +0000 +++ thunderbird-128.10.1esr/comm/mail/app/profile/all-thunderbird.js 2025-05-13 13:22:25.000000000 +0000 @@ -181,6 +181,11 @@ // systems for debug purposes as well. See Bug 1905622. pref("extensions.openPopupDelayedFullyLoaded.enabled", false); +// Status information used by our IAN system. Default to true, because a false +// positive is worse then a false negative IAN evaluation. +pref("extensions.hasExtensionsInstalled", true); +pref("extensions.hasExperimentsInstalled", true); + // Strict compatibility makes add-ons incompatible by default. #ifndef RELEASE_OR_BETA pref("extensions.strictCompatibility", false); diff -Nru thunderbird-128.10.0esr/comm/mail/base/content/aboutMessage.js thunderbird-128.10.1esr/comm/mail/base/content/aboutMessage.js --- thunderbird-128.10.0esr/comm/mail/base/content/aboutMessage.js 2025-04-25 08:53:41.000000000 +0000 +++ thunderbird-128.10.1esr/comm/mail/base/content/aboutMessage.js 2025-05-13 13:22:25.000000000 +0000 @@ -168,6 +168,12 @@ gViewWrapper?.close(); }); +/** + * Display a message. + * + * @param {string} uri - The message URI. + * @param {?DBViewWrapper} viewWrapper - View wrapper. + */ function displayMessage(uri, viewWrapper) { // Clear the state flags, if this window is re-used. window.msgLoaded = false; @@ -276,6 +282,18 @@ browser.docShell.allowAuth = false; browser.docShell.allowDNSPrefetch = false; + // See nsMsgContentPolicy::SetDisableItemsOnMailNewsUrlDocshells(). + const SANDBOX_ALL_FLAGS = 0xfffff; + const SANDBOXED_AUXILIARY_NAVIGATION = 0x2; + const SANDBOXED_ORIGIN = 0x10; + const SANDBOXED_TOPLEVEL_NAVIGATION_USER_ACTIVATION = 0x20000; + let sandboxFlags = SANDBOX_ALL_FLAGS; + sandboxFlags &= ~SANDBOXED_AUXILIARY_NAVIGATION; + sandboxFlags &= ~SANDBOXED_ORIGIN; + sandboxFlags &= ~SANDBOXED_TOPLEVEL_NAVIGATION_USER_ACTIVATION; + // Flags - contrary to sandbox csp values - *prevent* a given feature. + browser.browsingContext.sandboxFlags = sandboxFlags; + if (browserChanged) { browser.docShell ?.QueryInterface(Ci.nsIWebProgress) diff -Nru thunderbird-128.10.0esr/comm/mail/base/content/contentAreaClick.js thunderbird-128.10.1esr/comm/mail/base/content/contentAreaClick.js --- thunderbird-128.10.0esr/comm/mail/base/content/contentAreaClick.js 2025-04-25 08:53:41.000000000 +0000 +++ thunderbird-128.10.1esr/comm/mail/base/content/contentAreaClick.js 2025-05-13 13:22:25.000000000 +0000 @@ -66,7 +66,7 @@ } else if ( (HTMLInputElement.isInstance(target) || HTMLButtonElement.isInstance(target)) && - target.form?.action + /^https?/.test(target.form?.action) ) { href = target.form.action; } else { diff -Nru thunderbird-128.10.0esr/comm/mail/base/content/mailCommands.js thunderbird-128.10.1esr/comm/mail/base/content/mailCommands.js --- thunderbird-128.10.0esr/comm/mail/base/content/mailCommands.js 2025-04-25 08:53:41.000000000 +0000 +++ thunderbird-128.10.1esr/comm/mail/base/content/mailCommands.js 2025-05-13 13:22:25.000000000 +0000 @@ -605,8 +605,9 @@ * @param {string} data - The message data. */ async function msgOpenMessageFromString(data) { + // Ensure the filename isn't predictable. const path = await IOUtils.createUniqueFile( - PathUtils.tempDir, + PathUtils.join(PathUtils.tempDir, "pid-" + Services.appinfo.processID), "subPart.eml", 0o600 ); @@ -614,10 +615,9 @@ const tempFile = await IOUtils.getFile(path); // Delete file on exit, because Windows locks the file - const extAppLauncher = Cc[ - "@mozilla.org/uriloader/external-helper-app-service;1" - ].getService(Ci.nsPIExternalAppLauncher); - extAppLauncher.deleteTemporaryFileOnExit(tempFile); + Cc["@mozilla.org/uriloader/external-helper-app-service;1"] + .getService(Ci.nsPIExternalAppLauncher) + .deleteTemporaryFileOnExit(tempFile); const url = Services.io .getProtocolHandler("file") @@ -627,6 +627,9 @@ MailUtils.openEMLFile(window, tempFile, url); } +/** + * @param {string} message - Message URI. + */ function viewEncryptedPart(message) { let url = MailServices.mailSession.ConvertMsgURIToMsgURL(message, msgWindow); diff -Nru thunderbird-128.10.0esr/comm/mail/base/content/mailCommon.js thunderbird-128.10.1esr/comm/mail/base/content/mailCommon.js --- thunderbird-128.10.0esr/comm/mail/base/content/mailCommon.js 2025-04-25 08:53:41.000000000 +0000 +++ thunderbird-128.10.1esr/comm/mail/base/content/mailCommon.js 2025-05-13 13:22:25.000000000 +0000 @@ -1004,6 +1004,11 @@ this._allMessagesLoaded = false; if (!window.threadTree || !gViewWrapper) { + if (location.href == "about:message" && window.msgLoading) { + // Apparently the view has been re-created after the underlying folder + // has been compacted. + window.ReloadMessage(); + } return; } diff -Nru thunderbird-128.10.0esr/comm/mail/base/content/msgHdrView.js thunderbird-128.10.1esr/comm/mail/base/content/msgHdrView.js --- thunderbird-128.10.0esr/comm/mail/base/content/msgHdrView.js 2025-04-25 08:53:41.000000000 +0000 +++ thunderbird-128.10.1esr/comm/mail/base/content/msgHdrView.js 2025-05-13 13:22:25.000000000 +0000 @@ -1844,26 +1844,24 @@ "tooltiptextexternalnotfound", externalAttachmentNotFound ); - attachmentName.addEventListener("mouseover", () => - top.MsgStatusFeedback.setOverLink(firstAttachment.displayUrl) - ); - attachmentName.addEventListener("mouseout", () => - top.MsgStatusFeedback.setOverLink("") - ); - attachmentName.addEventListener("focus", () => - top.MsgStatusFeedback.setOverLink(firstAttachment.displayUrl) - ); - attachmentName.addEventListener("blur", () => - top.MsgStatusFeedback.setOverLink("") - ); + attachmentName.classList.remove("text-link"); attachmentName.classList.remove("notfound"); - if (firstAttachment.isDeleted) { - attachmentName.classList.add("notfound"); - } - if (firstAttachment.isExternalAttachment) { + attachmentName.addEventListener("mouseover", () => + top.MsgStatusFeedback.setOverLink(firstAttachment.displayUrl) + ); + attachmentName.addEventListener("mouseout", () => + top.MsgStatusFeedback.setOverLink("") + ); + attachmentName.addEventListener("focus", () => + top.MsgStatusFeedback.setOverLink(firstAttachment.displayUrl) + ); + attachmentName.addEventListener("blur", () => + top.MsgStatusFeedback.setOverLink("") + ); + attachmentName.classList.add("text-link"); if (!firstAttachment.hasFile) { @@ -1872,6 +1870,10 @@ } } + if (firstAttachment.isDeleted) { + attachmentName.classList.add("notfound"); + } + // Expanded attachment list. for (const attachmentitem of attachmentList.children) { const attachment = attachmentitem.attachment; diff -Nru thunderbird-128.10.0esr/comm/mail/components/MailGlue.sys.mjs thunderbird-128.10.1esr/comm/mail/components/MailGlue.sys.mjs --- thunderbird-128.10.0esr/comm/mail/components/MailGlue.sys.mjs 2025-04-25 08:53:41.000000000 +0000 +++ thunderbird-128.10.1esr/comm/mail/components/MailGlue.sys.mjs 2025-05-13 13:22:25.000000000 +0000 @@ -30,6 +30,7 @@ cal: "resource:///modules/calendar/calUtils.sys.mjs", ChatCore: "resource:///modules/chatHandler.sys.mjs", ExtensionSupport: "resource:///modules/ExtensionSupport.sys.mjs", + checkInstalledExtensions: "resource:///modules/ExtensionUtilities.sys.mjs", InAppNotifications: "resource:///modules/InAppNotifications.sys.mjs", LightweightThemeConsumer: "resource://gre/modules/LightweightThemeConsumer.sys.mjs", @@ -833,6 +834,20 @@ }, }, { + name: "checkInstalledExtensions", + task: async () => { + lazy.AddonManager.addAddonListener({ + onInstalled() { + lazy.checkInstalledExtensions(); + }, + onUninstalled() { + lazy.checkInstalledExtensions(); + }, + }); + await lazy.checkInstalledExtensions(); + }, + }, + { task() { // Use idleDispatch a second time to run this after the per-window // idle tasks. diff -Nru thunderbird-128.10.0esr/comm/mail/components/extensions/ExtensionUtilities.sys.mjs thunderbird-128.10.1esr/comm/mail/components/extensions/ExtensionUtilities.sys.mjs --- thunderbird-128.10.0esr/comm/mail/components/extensions/ExtensionUtilities.sys.mjs 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-128.10.1esr/comm/mail/components/extensions/ExtensionUtilities.sys.mjs 2025-05-13 13:22:25.000000000 +0000 @@ -0,0 +1,52 @@ +/* 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/. */ + +const lazy = {}; + +ChromeUtils.defineESModuleGetters(lazy, { + AddonManager: "resource://gre/modules/AddonManager.sys.mjs", + ExtensionData: "resource://gre/modules/Extension.sys.mjs", +}); + +/** + * Updates the status preferences used by the IAN system to track extensions being + * installed or not. + */ +export async function checkInstalledExtensions() { + // These add-ons are installed by tests and need to be excluded when checking + // for installed add-ons. + const TEST_ADDONS = ["special-powers@mozilla.org", "mochikit@mozilla.org"]; + + const extensions = await Promise.allSettled( + await lazy.AddonManager.getAllAddons().then(a => + a.map(async e => { + const data = new lazy.ExtensionData(e.getResourceURI()); + await data.loadManifest(); + return data; + }) + ) + ); + const extensionInfo = extensions + .filter( + e => e.value?.type == "extension" && !TEST_ADDONS.includes(e.value.id) + ) + .map(e => ({ + id: e.value.id, + isExperiment: !!e.value.manifest.experiment_apis, + data: e.value, + })); + + // If false, we can propose to move to Release. Disabled/enabled status is not + // checked, because the user might later want to enable an installed Experiment, + // which he may no longer use after moving to Release. + Services.prefs.setBoolPref( + "extensions.hasExtensionsInstalled", + extensionInfo.length > 0 + ); + // If false, we can propose to move to Release. + Services.prefs.setBoolPref( + "extensions.hasExperimentsInstalled", + extensionInfo.some(e => e.isExperiment) + ); +} diff -Nru thunderbird-128.10.0esr/comm/mail/components/extensions/moz.build thunderbird-128.10.1esr/comm/mail/components/extensions/moz.build --- thunderbird-128.10.0esr/comm/mail/components/extensions/moz.build 2025-04-25 08:53:41.000000000 +0000 +++ thunderbird-128.10.1esr/comm/mail/components/extensions/moz.build 2025-05-13 13:22:25.000000000 +0000 @@ -13,6 +13,7 @@ "ExtensionMessages.sys.mjs", "ExtensionPopups.sys.mjs", "ExtensionToolbarButtons.sys.mjs", + "ExtensionUtilities.sys.mjs", "MailExtensionShortcuts.sys.mjs", ] diff -Nru thunderbird-128.10.0esr/comm/mail/components/extensions/test/browser/browser.ini thunderbird-128.10.1esr/comm/mail/components/extensions/test/browser/browser.ini --- thunderbird-128.10.0esr/comm/mail/components/extensions/test/browser/browser.ini 2025-04-25 08:53:41.000000000 +0000 +++ thunderbird-128.10.1esr/comm/mail/components/extensions/test/browser/browser.ini 2025-05-13 13:22:25.000000000 +0000 @@ -75,12 +75,14 @@ tags = contextmenu [browser_ext_contentScripts.js] [browser_ext_contentScripts_mv3.js] +[browser_ext_extension_check_for_IAN.js] [browser_ext_mailTabs_context_clicks.js] [browser_ext_mailTabs_create.js] [browser_ext_mailTabs_folderModes.js] [browser_ext_mailTabs_getListedMessages.js] [browser_ext_mailTabs_mv3.js] [browser_ext_mailTabs.js] + [browser_ext_menus_context_action.js] support-files = data/content.html data/content_body.html data/tb-logo.png tags = contextmenu diff -Nru thunderbird-128.10.0esr/comm/mail/components/extensions/test/browser/browser_ext_extension_check_for_IAN.js thunderbird-128.10.1esr/comm/mail/components/extensions/test/browser/browser_ext_extension_check_for_IAN.js --- thunderbird-128.10.0esr/comm/mail/components/extensions/test/browser/browser_ext_extension_check_for_IAN.js 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-128.10.1esr/comm/mail/components/extensions/test/browser/browser_ext_extension_check_for_IAN.js 2025-05-13 13:22:25.000000000 +0000 @@ -0,0 +1,151 @@ +/* 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/. */ + +"use strict"; + +async function checkInitialPrefs(expected) { + for (const [key, value] of Object.entries(expected)) { + await TestUtils.waitForCondition( + () => Services.prefs.getBoolPref(key, null) === value, + `${key} should be set to ${value}` + ); + } +} + +async function checkChangedPrefs(expected) { + const promises = []; + for (const [key, after] of Object.entries(expected)) { + const before = Services.prefs.getBoolPref(key, null); + if (before == after) { + continue; + } + promises.push( + TestUtils.waitForPrefChange( + key, + value => value == after, + `${key} should switch to ${after}` + ) + ); + } + await Promise.all(promises); + + for (const [key, after] of Object.entries(expected)) { + Assert.equal( + Services.prefs.getBoolPref(key, null), + after, + `${key} should be set to ${after}` + ); + } +} + +add_task(async function test_extension_status_prefs() { + createAccount(); + + const webExtension = ExtensionTestUtils.loadExtension({ + useAddonManager: "permanent", + files: { + "background.js": function () { + browser.test.notifyPass("finished"); + }, + }, + manifest: { + browser_specific_settings: { + gecko: { id: "webExtension@mochi.test" }, + }, + background: { scripts: ["background.js"] }, + }, + }); + + const experiment = ExtensionTestUtils.loadExtension({ + useAddonManager: "permanent", + files: { + "schema.json": JSON.stringify([ + { + namespace: "testapi", + functions: [ + { + name: "test", + type: "function", + async: true, + parameters: [], + }, + ], + }, + ]), + "implementation.js": () => { + this.testapi = class extends ExtensionCommon.ExtensionAPI { + getAPI() { + return { + testapi: { + async test() { + return true; + }, + }, + }; + } + }; + }, + "background.js": function () { + browser.test.notifyPass("finished"); + }, + }, + manifest: { + browser_specific_settings: { + gecko: { id: "experiment@mochi.test" }, + }, + background: { scripts: ["background.js"] }, + experiment_apis: { + testapi: { + schema: "schema.json", + parent: { + scopes: ["addon_parent"], + paths: [["testapi"]], + script: "implementation.js", + }, + }, + }, + }, + }); + + // Wait till both prefs are set to false (initial values are true). This will + // make sure that the initial check in MailGlue.sys.mjs has run. + await checkInitialPrefs({ + "extensions.hasExtensionsInstalled": false, + "extensions.hasExperimentsInstalled": false, + }); + + // Install the WebExtension. + const checkPrefsAfterWebExtensionInstall = checkChangedPrefs({ + "extensions.hasExtensionsInstalled": true, + "extensions.hasExperimentsInstalled": false, + }); + await webExtension.startup(); + await webExtension.awaitFinish("finished"); + await checkPrefsAfterWebExtensionInstall; + + // Install the Experiment. + const checkPrefsAfterExpExtensionInstall = checkChangedPrefs({ + "extensions.hasExtensionsInstalled": true, + "extensions.hasExperimentsInstalled": true, + }); + await experiment.startup(); + await experiment.awaitFinish("finished"); + await checkPrefsAfterExpExtensionInstall; + + // Uninstall the Experiment. + const checkPrefsAfterExpExtensionUnInstall = checkChangedPrefs({ + "extensions.hasExtensionsInstalled": true, + "extensions.hasExperimentsInstalled": false, + }); + await experiment.unload(); + await checkPrefsAfterExpExtensionUnInstall; + + // Uninstall the WebExtension. + const checkPrefsAfterWebExtensionUnInstall = checkChangedPrefs({ + "extensions.hasExtensionsInstalled": false, + "extensions.hasExperimentsInstalled": false, + }); + await webExtension.unload(); + await checkPrefsAfterWebExtensionUnInstall; +}); diff -Nru thunderbird-128.10.0esr/comm/mail/components/preferences/receipts.xhtml thunderbird-128.10.1esr/comm/mail/components/preferences/receipts.xhtml --- thunderbird-128.10.0esr/comm/mail/components/preferences/receipts.xhtml 2025-04-25 08:53:41.000000000 +0000 +++ thunderbird-128.10.1esr/comm/mail/components/preferences/receipts.xhtml 2025-05-13 13:22:25.000000000 +0000 @@ -27,7 +27,7 @@ - +