Bug 1646016 fix app compat data for locales if they are not version specific r=robwu

Differential Revision: https://phabricator.services.mozilla.com/D87520
This commit is contained in:
Shane Caraveo 2020-08-22 00:33:06 +00:00
Родитель 1dd1c165fb
Коммит 735332e1fa
2 изменённых файлов: 60 добавлений и 4 удалений

Просмотреть файл

@ -25,7 +25,6 @@ XPCOMUtils.defineLazyModuleGetters(this, {
AddonManagerPrivate: "resource://gre/modules/AddonManager.jsm",
AddonRepository: "resource://gre/modules/addons/AddonRepository.jsm",
AddonSettings: "resource://gre/modules/addons/AddonSettings.jsm",
AppConstants: "resource://gre/modules/AppConstants.jsm",
DeferredTask: "resource://gre/modules/DeferredTask.jsm",
ExtensionUtils: "resource://gre/modules/ExtensionUtils.jsm",
FileUtils: "resource://gre/modules/FileUtils.jsm",
@ -795,7 +794,7 @@ AddonWrapper = class {
}
get __AddonInternal__() {
return AppConstants.DEBUG ? addonFor(this) : undefined;
return addonFor(this);
}
get seen() {
@ -3013,6 +3012,16 @@ this.XPIDatabaseReconcile = {
aOldAddon.signedDate === undefined &&
(aOldAddon.signedState || checkSigning);
// If maxVersion was inadvertently updated for a locale, force a reload
// from the manifest. See Bug 1646016 for details.
if (
!aReloadMetadata &&
aOldAddon.type === "locale" &&
aOldAddon.matchingTargetApplication
) {
aReloadMetadata = aOldAddon.matchingTargetApplication.maxVersion === "*";
}
let manifest = null;
if (checkSigning || aReloadMetadata || signedDateMissing) {
try {
@ -3040,7 +3049,6 @@ this.XPIDatabaseReconcile = {
if (aReloadMetadata) {
// Avoid re-reading these properties from manifest,
// use existing addon instead.
// TODO - consider re-scanning for targetApplications.
let remove = [
"syncGUID",
"foreignInstall",
@ -3051,10 +3059,14 @@ this.XPIDatabaseReconcile = {
"applyBackgroundUpdates",
"sourceURI",
"releaseNotesURI",
"targetApplications",
"installTelemetryInfo",
];
// TODO - consider re-scanning for targetApplications for other addon types.
if (aOldAddon.type !== "locale") {
remove.push("targetApplications");
}
let props = PROP_JSON_FIELDS.filter(a => !remove.includes(a));
copyProperties(manifest, props, aOldAddon);
}

Просмотреть файл

@ -479,3 +479,47 @@ add_task(async function test_staged_langpack_for_app_update_not_found() {
await promiseShutdownManager();
Services.locale.requestedLocales = originalLocales;
});
/**
* This test verifies that a compat update with an invalid max_version
* will be disabled, at least allowing Firefox to startup without failures.
*/
add_task(async function test_staged_langpack_compat_startup() {
let originalLocales = Services.locale.requestedLocales;
await promiseStartupManager("58");
let [, { addon }] = await Promise.all([
promiseLangpackStartup(),
AddonTestUtils.promiseInstallXPI(ADDONS.langpack_1),
]);
Assert.ok(addon.isActive);
await promiseLocaleChanged(["und"]);
// Mimick a compatibility update
let compatUpdate = {
targetApplications: [
{
id: "toolkit@mozilla.org",
minVersion: "58",
maxVersion: "*",
},
],
};
addon.__AddonInternal__.applyCompatibilityUpdate(compatUpdate);
await promiseRestartManager("59");
addon = await promiseAddonByID(ID);
Assert.ok(!addon.isActive, "addon is not active after upgrade");
ok(!addon.isCompatible, "compatibility update fixed");
await promiseRestartManager("58");
addon = await promiseAddonByID(ID);
Assert.ok(addon.isActive, "addon is active after downgrade");
ok(addon.isCompatible, "compatibility update fixed");
await addon.uninstall();
await promiseShutdownManager();
Services.locale.requestedLocales = originalLocales;
});