Source code
Revision control
Copy as Markdown
Other Tools
Test Info:
/* Any copyright is dedicated to the Public Domain.
*/
// We are using actual xpi files released in the wild, let's use the real cert
// checks for maximum realism.
AddonTestUtils.useRealCertChecks = true;
// We don't have an easy way to serve update manifests from a secure URL.
Services.prefs.setBoolPref(PREF_EM_CHECK_UPDATE_SECURITY, false);
// update_url from tabtweak-5.107-fx.xpi (decommissioned).
const UPDATE_URL_OLD =
// update_url from tabtweak-6.202-fx.xpi.
// XPI of older version pointing to UPDATE_URL_OLD.
const OLD_XPI = do_get_file("data/cn_pack/tabtweak-5.107-fx.xpi");
const ADDON_ID = "tabtweak@mozillaonline.com";
const server = AddonTestUtils.createHttpServer({
hosts: ["archive.mozilla.org"],
});
// data/cn_pack/addons.json has the actual response from UPDATE_URL_NEW
server.registerFile(
"/pub/cn_pack/addons.json",
do_get_file("data/cn_pack/addons.json")
);
// This is the newer version of OLD_XPI.
server.registerFile(
"/pub/cn_pack/addons/tabtweak/tabtweak-6.202-fx.xpi",
do_get_file("data/cn_pack/tabtweak-6.202-fx.xpi")
);
add_setup(async () => {
// addons.json has strict_min_version: 115.0 for the test add-on (ADDON_ID).
AddonTestUtils.updateAppInfo({ version: "115.0" });
await promiseStartupManager();
// update requests with http.
const { AddonUpdateChecker } = ChromeUtils.importESModule(
"resource://gre/modules/addons/AddonUpdateChecker.sys.mjs"
);
const { sinon } = ChromeUtils.importESModule(
);
function downgradeHttpUrl(url) {
if (url.startsWith("https:")) {
const httpUrl = url.replace(/^https:/, "http:");
info(`Test-only hack: Using http instead of https for: ${url}`);
return httpUrl;
}
return url;
}
const stub = sinon.stub(AddonUpdateChecker, "checkForUpdates");
stub.callsFake(function (aId, aUrl, aObserver) {
aUrl = downgradeHttpUrl(aUrl);
const stub2 = sinon.stub(aObserver, "onUpdateCheckComplete");
stub2.callsFake(function (results) {
for (const result of results) {
result.updateURL = downgradeHttpUrl(result.updateURL);
}
return stub2.wrappedMethod.call(this, results);
});
return stub.wrappedMethod.call(this, aId, aUrl, aObserver);
});
registerCleanupFunction(() => sinon.restore());
});
add_task(async function test_migrate_update_url() {
// OLD_XPI uses a deprecated version format.
ExtensionTestUtils.failOnSchemaWarnings(false);
const { addon: addonOld } = await promiseInstallFile(OLD_XPI);
ExtensionTestUtils.failOnSchemaWarnings(true);
equal(addonOld.id, ADDON_ID, "Got expected addon ID");
equal(
addonOld.version,
"5.107.0buildid20221104.101003",
"Got expected old version"
);
equal(addonOld.updateURL, UPDATE_URL_OLD, "Got old updateURL");
let install;
const { messages } = await promiseConsoleOutput(async () => {
const update = await promiseFindAddonUpdates(addonOld);
install = update.updateAvailable;
ok(install, "Found an update");
});
await promiseCompleteInstall(install);
const addon = await AddonManager.getAddonByID(ADDON_ID);
equal(addon.version, "6.0.20250903.174225", "Got updated version");
equal(addon.updateURL, UPDATE_URL_NEW, "Got new updateURL");
await addon.uninstall();
// Intentionally checking "WARN" prefix to confirm verbosity; by default the
// log verbosity is Warn, but in tests extensions.logging.enabled is set to
// true, which increases the level to Debug. We want to make sure that
// regular users see the log line without having to increase the log
// verbosity.
const R_EXPECTED_LOG_LINE =
/WARN\s+update_url changed for add-on tabtweak@mozillaonline.com version 5.107.0buildid20221104.101003, from https:\/\/addons.firefox.com.cn\/chinaedition\/addons\/updates.json\?reqVersion=.* to https:\/\/archive.mozilla.org\/pub\/cn_pack\/addons.json/;
AddonTestUtils.checkMessages(
messages,
{ expected: [{ message: R_EXPECTED_LOG_LINE }] },
"Got the expected log message"
);
});