Bug 1592498 - Remove UI migrations up to Firefox 59 and migration 66 for intermittent failures. r=Gijs

Differential Revision: https://phabricator.services.mozilla.com/D96999
This commit is contained in:
Marco Bonardo 2020-11-16 11:56:47 +00:00
Родитель e0d88600e7
Коммит 9d0b97496e
3 изменённых файлов: 0 добавлений и 529 удалений

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

@ -821,7 +821,6 @@ XPCOMUtils.defineLazyModuleGetters(this, {
LoginBreaches: "resource:///modules/LoginBreaches.jsm",
NewTabUtils: "resource://gre/modules/NewTabUtils.jsm",
Normandy: "resource://normandy/Normandy.jsm",
ObjectUtils: "resource://gre/modules/ObjectUtils.jsm",
OS: "resource://gre/modules/osfile.jsm",
OsEnvironment: "resource://gre/modules/OsEnvironment.jsm",
PageActions: "resource:///modules/PageActions.jsm",
@ -1134,14 +1133,6 @@ BrowserGlue.prototype = {
if (this._placesBrowserInitComplete) {
Services.obs.notifyObservers(null, "places-browser-init-complete");
}
} else if (data == "migrateMatchBucketsPrefForUI66") {
this._migrateMatchBucketsPrefForUI66().then(() => {
Services.obs.notifyObservers(
null,
"browser-glue-test",
"migrateMatchBucketsPrefForUI66-done"
);
});
} else if (data == "add-breaches-sync-handler") {
this._addBreachesSyncHandler();
}
@ -1229,9 +1220,6 @@ BrowserGlue.prototype = {
// Allow certain viewable internally types to be opened from downloads.
DownloadsViewableInternally.register();
break;
case "shield-init-complete":
this._shieldInitComplete = true;
break;
}
},
@ -1269,7 +1257,6 @@ BrowserGlue.prototype = {
os.addObserver(this, "xpi-signature-changed");
os.addObserver(this, "sync-ui-state:update");
os.addObserver(this, "handlersvc-store-initialized");
os.addObserver(this, "shield-init-complete");
ActorManagerParent.addJSProcessActors(JSPROCESSACTORS);
ActorManagerParent.addJSWindowActors(JSWINDOWACTORS);
@ -1343,7 +1330,6 @@ BrowserGlue.prototype = {
os.removeObserver(this, "flash-plugin-hang");
os.removeObserver(this, "xpi-signature-changed");
os.removeObserver(this, "sync-ui-state:update");
os.removeObserver(this, "shield-init-complete");
Services.prefs.removeObserver(
"privacy.trackingprotection",
@ -3346,132 +3332,6 @@ BrowserGlue.prototype = {
let xulStore = Services.xulStore;
if (currentUIVersion < 52) {
// Keep old devtools log persistence behavior after splitting netmonitor and
// webconsole prefs (bug 1307881).
if (Services.prefs.getBoolPref("devtools.webconsole.persistlog", false)) {
Services.prefs.setBoolPref("devtools.netmonitor.persistlog", true);
}
}
// Update user customizations that will interfere with the Safe Browsing V2
// to V4 migration (bug 1395419).
if (currentUIVersion < 53) {
const MALWARE_PREF = "urlclassifier.malwareTable";
if (Services.prefs.prefHasUserValue(MALWARE_PREF)) {
let malwareList = Services.prefs.getCharPref(MALWARE_PREF);
if (malwareList.includes("goog-malware-shavar")) {
malwareList.replace("goog-malware-shavar", "goog-malware-proto");
Services.prefs.setCharPref(MALWARE_PREF, malwareList);
}
}
}
if (currentUIVersion < 55) {
Services.prefs.clearUserPref("browser.customizemode.tip0.shown");
}
if (currentUIVersion < 56) {
// Prior to the end of the Firefox 57 cycle, the sidebarcommand being present
// or not was the only thing that distinguished whether the sidebar was open.
// Now, the sidebarcommand always indicates the last opened sidebar, and we
// correctly persist the checked attribute to indicate whether or not the
// sidebar was open. We should set the checked attribute in case it wasn't:
if (xulStore.getValue(BROWSER_DOCURL, "sidebar-box", "sidebarcommand")) {
xulStore.setValue(BROWSER_DOCURL, "sidebar-box", "checked", "true");
}
}
if (currentUIVersion < 58) {
// With Firefox 57, we are doing a one time reset of the geo prefs due to bug 1413652
Services.prefs.clearUserPref("browser.search.countryCode");
Services.prefs.clearUserPref("browser.search.region");
Services.prefs.clearUserPref("browser.search.isUS");
}
if (currentUIVersion < 59) {
let searchInitializedPromise = new Promise(resolve => {
if (Services.search.isInitialized) {
resolve();
}
const SEARCH_SERVICE_TOPIC = "browser-search-service";
Services.obs.addObserver(function observer(subject, topic, data) {
if (data != "init-complete") {
return;
}
Services.obs.removeObserver(observer, SEARCH_SERVICE_TOPIC);
resolve();
}, SEARCH_SERVICE_TOPIC);
});
searchInitializedPromise.then(() => {
let currentEngine = Services.search.defaultEngine.wrappedJSObject;
// Only reset the current engine if it wasn't set by a WebExtension
// and it is not one of the default engines.
// If the original default is not a default, the user has a weird
// configuration probably involving langpacks, it's not worth
// attempting to reset their settings.
if (
currentEngine._extensionID ||
currentEngine.isAppProvided ||
!Services.search.originalDefaultEngine.isAppProvided
) {
return;
}
if (!currentEngine._loadPath.startsWith("[https]")) {
Services.search.resetToOriginalDefaultEngine();
}
});
// Migrate the old requested locales prefs to use the new model
const SELECTED_LOCALE_PREF = "general.useragent.locale";
const MATCHOS_LOCALE_PREF = "intl.locale.matchOS";
if (
Services.prefs.prefHasUserValue(MATCHOS_LOCALE_PREF) ||
Services.prefs.prefHasUserValue(SELECTED_LOCALE_PREF)
) {
if (Services.prefs.getBoolPref(MATCHOS_LOCALE_PREF, false)) {
Services.locale.requestedLocales = [];
} else {
let locale = Services.prefs.getComplexValue(
SELECTED_LOCALE_PREF,
Ci.nsIPrefLocalizedString
);
if (locale) {
try {
Services.locale.requestedLocales = [locale.data];
} catch (e) {
/* Don't panic if the value is not a valid locale code. */
}
}
}
Services.prefs.clearUserPref(SELECTED_LOCALE_PREF);
Services.prefs.clearUserPref(MATCHOS_LOCALE_PREF);
}
}
if (currentUIVersion < 61) {
// Remove persisted toolbarset from navigator toolbox
xulStore.removeValue(BROWSER_DOCURL, "navigator-toolbox", "toolbarset");
}
if (currentUIVersion < 62) {
// Remove iconsize and mode from all the toolbars
let toolbars = [
"navigator-toolbox",
"nav-bar",
"PersonalToolbar",
"TabsToolbar",
"toolbar-menubar",
];
for (let resourceName of ["mode", "iconsize"]) {
for (let toolbarId of toolbars) {
xulStore.removeValue(BROWSER_DOCURL, toolbarId, resourceName);
}
}
}
if (currentUIVersion < 64) {
OS.File.remove(
OS.Path.join(OS.Constants.Path.profileDir, "directoryLinks.json"),
@ -3512,12 +3372,6 @@ BrowserGlue.prototype = {
});
}
if (currentUIVersion < 66) {
// Set whether search suggestions or history/bookmarks results come first
// in the urlbar results, and uninstall a related Shield study.
this._migrateMatchBucketsPrefForUI66();
}
if (currentUIVersion < 67) {
// Migrate devtools firebug theme users to light theme (bug 1378108):
if (Services.prefs.getCharPref("devtools.theme") == "firebug") {
@ -4023,93 +3877,6 @@ BrowserGlue.prototype = {
);
},
async _migrateMatchBucketsPrefForUI66() {
// This does two related things.
//
// (1) Profiles created on or after Firefox 57's release date were eligible
// for a Shield study that changed the browser.urlbar.matchBuckets pref in
// order to show search suggestions above history/bookmarks in the urlbar
// popup. This uninstalls that study. (It's actually slightly more
// complex. The study set the pref to several possible values, but the
// overwhelming number of profiles in the study got search suggestions
// first, followed by history/bookmarks.)
//
// (2) This also ensures that (a) new users see search suggestions above
// history/bookmarks, thereby effectively making the study permanent, and
// (b) old users (including those in the study) continue to see whatever
// they were seeing before. This works together with UnifiedComplete.js.
// By default, the browser.urlbar.matchBuckets pref does not exist, and
// UnifiedComplete.js internally hardcodes a default value for it. Before
// Firefox 60, the hardcoded default was to show history/bookmarks first.
// After 60, it's to show search suggestions first.
// Wait for Shield init to complete.
await new Promise(resolve => {
if (this._shieldInitComplete) {
resolve();
return;
}
let topic = "shield-init-complete";
Services.obs.addObserver(function obs() {
Services.obs.removeObserver(obs, topic);
resolve();
}, topic);
});
// Now get the pref's value. If the study is active, the value will have
// just been set (on the default branch) as part of Shield's init. The pref
// should not exist otherwise (normally).
let prefName = "browser.urlbar.matchBuckets";
let prefValue = Services.prefs.getCharPref(prefName, "");
// Get the study (aka experiment). It may not be installed.
let experiment = null;
let experimentName = "pref-flip-search-composition-57-release-1413565";
let { PreferenceExperiments } = ChromeUtils.import(
"resource://normandy/lib/PreferenceExperiments.jsm"
);
try {
experiment = await PreferenceExperiments.get(experimentName);
} catch (e) {}
// Uninstall the study, resetting the pref to its state before the study.
if (experiment && !experiment.expired) {
await PreferenceExperiments.stop(experimentName, {
resetValue: true,
reason: "external:search-ui-migration",
});
}
// At this point, normally the pref should not exist. If it does, then it
// either has a user value, or something unexpectedly set its value on the
// default branch. Either way, preserve that value.
if (Services.prefs.getCharPref(prefName, "")) {
return;
}
// The new default is "suggestion:4,general:5" (show search suggestions
// before history/bookmarks), but we implement that by leaving the pref
// undefined, and UnifiedComplete.js hardcodes that value internally. So if
// the pref was "suggestion:4,general:5" (modulo whitespace), we're done.
if (prefValue) {
let buckets = PlacesUtils.convertMatchBucketsStringToArray(prefValue);
if (
ObjectUtils.deepEqual(buckets, [
["suggestion", 4],
["general", 5],
])
) {
return;
}
}
// Set the pref on the user branch. If the pref had a value, then preserve
// it. Otherwise, set the previous default value, which was to show history
// and bookmarks before search suggestions.
prefValue = prefValue || "general:5,suggestion:Infinity";
Services.prefs.setCharPref(prefName, prefValue);
},
/**
* Open preferences even if there are no open windows.
*/

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

@ -7,7 +7,3 @@ reason = test depends on update channel
[browser_default_bookmark_toolbar_visibility.js]
[browser_initial_tab_remoteType.js]
[browser_startup_homepage.js]
[browser_urlbar_matchBuckets_migration60.js]
skip-if = os == 'win' #Bug 1592498

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

@ -1,292 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
// Makes sure the browser.urlbar.matchBuckets pref is set correctly starting in
// Firefox 60, nsBrowserGlue UI version 66.
const PREF_NAME = "browser.urlbar.matchBuckets";
const PREF_VALUE_SUGGESTIONS_FIRST = "suggestion:4,general:5";
const PREF_VALUE_GENERAL_FIRST = "general:5,suggestion:Infinity";
const STUDY_NAME = "pref-flip-search-composition-57-release-1413565";
ChromeUtils.import("resource://normandy/lib/PreferenceExperiments.jsm", this);
// Migrates without doing anything else. The pref should be set to show history
// first.
add_task(async function migrate() {
await sanityCheckInitialState();
// Trigger migration. The pref is cleared initially, so after migration it
// should be set on the user branch to show history first.
await promiseMigration();
Assert.equal(
Services.prefs.getCharPref(PREF_NAME, ""),
PREF_VALUE_GENERAL_FIRST,
"Pref should be set, general first"
);
Assert.ok(
Services.prefs.prefHasUserValue(PREF_NAME),
"Pref should be set on user branch"
);
Services.prefs.clearUserPref(PREF_NAME);
});
// Sets the pref to a value on the user branch and migrates. The pref shouldn't
// change.
add_task(async function setUserPrefAndMigrate() {
await sanityCheckInitialState();
// Set a value for the pref on the user branch.
let userValue = "userTest:10";
Services.prefs.setCharPref(PREF_NAME, userValue);
// Trigger migration. The pref should be preserved.
await promiseMigration();
Assert.equal(
Services.prefs.getCharPref(PREF_NAME, ""),
userValue,
"Pref should remain same"
);
Assert.ok(
Services.prefs.prefHasUserValue(PREF_NAME),
"Pref should remain on user branch"
);
Services.prefs.clearUserPref(PREF_NAME);
});
// Sets the pref to a value on the default branch and migrates. The pref
// shouldn't change.
add_task(async function setDefaultPrefAndMigrate() {
await sanityCheckInitialState();
// Set a value for the pref on the default branch.
let defaultValue = "defaultTest:10";
Services.prefs.getDefaultBranch(PREF_NAME).setCharPref("", defaultValue);
// Trigger migration. The pref should be preserved.
await promiseMigration();
Assert.equal(
Services.prefs.getCharPref(PREF_NAME, ""),
defaultValue,
"Pref should remain same"
);
Assert.ok(
!Services.prefs.prefHasUserValue(PREF_NAME),
"Pref should remain on default branch"
);
Services.prefs.deleteBranch(PREF_NAME);
});
// Installs the study using the pref that the overwhelming majority of users
// will see ("ratio": 97, "value": "suggestion:4,general:5") and migrates. The
// study should be stopped and the pref should remain cleared.
add_task(async function installStudyAndMigrate() {
await sanityCheckInitialState();
// Normandy can't unset the pref if it didn't already have a value, so give it
// a value that will be treated as empty by the migration.
Services.prefs.getDefaultBranch(PREF_NAME).setCharPref("", "");
// Install the study. It should set the pref.
await PreferenceExperiments.start(newExperimentOpts());
Assert.ok(await PreferenceExperiments.has(STUDY_NAME), "Study installed");
Assert.equal(
Services.prefs.getCharPref(PREF_NAME, ""),
PREF_VALUE_SUGGESTIONS_FIRST,
"Pref should be set by study"
);
// Trigger migration. The study should be stopped, and the pref should be
// cleared since it's the default value.
await promiseMigration();
Assert.ok(!(await getNonExpiredExperiment()), "Study stopped");
Assert.equal(
Services.prefs.getCharPref(PREF_NAME, ""),
"",
"Pref should be cleared"
);
await PreferenceExperiments.clearAllExperimentStorage();
});
// Installs the study using the pref that the overwhelming majority of users
// will see ("ratio": 97, "value": "suggestion:4,general:5"), except that the
// pref has unnecessary spaces in it, and then migrates. The study should be
// stopped and the pref should remain cleared. i.e., the migration code should
// parse the pref value and compare the resulting buckets instead of comparing
// strings directly.
add_task(async function installStudyPrefWithSpacesAndMigrate() {
await sanityCheckInitialState();
// Install the study. It should set the pref.
const preferenceValue = " suggestion : 4, general : 5 ";
const experiment = newExperimentOpts({
preferences: {
[PREF_NAME]: {
preferenceValue,
},
},
});
await PreferenceExperiments.start(experiment);
Assert.ok(await PreferenceExperiments.has(STUDY_NAME), "Study installed");
Assert.equal(
Services.prefs.getCharPref(PREF_NAME, ""),
preferenceValue,
"Pref should be set by study"
);
// Trigger migration. The study should be stopped, and the pref should be
// cleared since it's the default value.
await promiseMigration();
Assert.ok(!(await getNonExpiredExperiment()), "Study stopped");
Assert.equal(
Services.prefs.getCharPref(PREF_NAME, ""),
"",
"Pref should be cleared"
);
await PreferenceExperiments.clearAllExperimentStorage();
});
// Installs the study using a pref that a tiny number of users will see
// ("ratio": 1, "value": "general:3,suggestion:6") and migrates. The study
// should be stopped and the pref should be preserved since it's not the new
// default.
add_task(async function installStudyMinorityPrefAndMigrate() {
await sanityCheckInitialState();
// Install the study. It should set the pref.
let preferenceValue = "general:3,suggestion:6";
const experiment = newExperimentOpts({
preferences: {
[PREF_NAME]: {
preferenceValue,
},
},
});
await PreferenceExperiments.start(experiment);
Assert.ok(await PreferenceExperiments.has(STUDY_NAME), "Study installed");
Assert.equal(
Services.prefs.getCharPref(PREF_NAME, ""),
preferenceValue,
"Pref should be set by study"
);
// Trigger migration. The study should be stopped, and the pref should remain
// the same since it's a non-default value. It should be set on the user
// branch.
await promiseMigration();
Assert.ok(!(await getNonExpiredExperiment()), "Study stopped");
Assert.equal(
Services.prefs.getCharPref(PREF_NAME, ""),
preferenceValue,
"Pref should remain the same"
);
Assert.ok(
Services.prefs.prefHasUserValue(PREF_NAME),
"Pref should be set on user branch"
);
await PreferenceExperiments.clearAllExperimentStorage();
Services.prefs.clearUserPref(PREF_NAME);
});
// Sets the pref to some value on the default branch, installs the study, and
// migrates. The study should be stopped and the original pref value should be
// restored.
add_task(async function setDefaultPrefInstallStudyAndMigrate() {
await sanityCheckInitialState();
// First, set the pref to some value on the default branch. (If the pref is
// set on the user branch, starting the study actually throws because the
// study's branch is the default branch.)
let defaultValue = "test:10";
Services.prefs.getDefaultBranch(PREF_NAME).setCharPref("", defaultValue);
// Install the study. It should set the pref.
await PreferenceExperiments.start(newExperimentOpts());
Assert.ok(await PreferenceExperiments.has(STUDY_NAME), "Study installed");
Assert.equal(
Services.prefs.getCharPref(PREF_NAME, ""),
PREF_VALUE_SUGGESTIONS_FIRST,
"Pref should be set by study"
);
// Trigger migration. The study should be stopped, and the pref should be
// restored to the value set above.
await promiseMigration();
Assert.ok(!(await getNonExpiredExperiment()), "Study stopped");
Assert.equal(
Services.prefs.getCharPref(PREF_NAME, ""),
defaultValue,
"Pref should be restored to user value"
);
await PreferenceExperiments.clearAllExperimentStorage();
Services.prefs.deleteBranch(PREF_NAME);
});
async function sanityCheckInitialState() {
Assert.equal(
Services.prefs.getCharPref(PREF_NAME, ""),
"",
"Pref should be cleared initially"
);
Assert.ok(
!(await PreferenceExperiments.has(STUDY_NAME)),
"Study should not be installed initially"
);
}
function promiseMigration() {
let topic = "browser-glue-test";
let donePromise = TestUtils.topicObserved(topic, (subj, data) => {
return "migrateMatchBucketsPrefForUI66-done" == data;
});
Cc["@mozilla.org/browser/browserglue;1"]
.getService(Ci.nsIObserver)
.observe(null, topic, "migrateMatchBucketsPrefForUI66");
return donePromise;
}
function newExperimentOpts(opts = {}) {
const defaultPref = {
[PREF_NAME]: {},
};
const defaultPrefInfo = {
preferenceValue: PREF_VALUE_SUGGESTIONS_FIRST,
preferenceBranchType: "default",
preferenceType: "string",
};
const preferences = {};
for (const [prefName, prefInfo] of Object.entries(
opts.preferences || defaultPref
)) {
preferences[prefName] = { ...defaultPrefInfo, ...prefInfo };
}
return Object.assign(
{
slug: STUDY_NAME,
actionName: "SomeAction",
branch: "branch",
},
opts,
{
preferences,
}
);
}
async function getNonExpiredExperiment() {
try {
let exp = await PreferenceExperiments.get(STUDY_NAME);
if (exp.expired) {
return null;
}
} catch (ex) {}
return null;
}