Bug 1416003 - Handle preference studies on prefs with only user-branch values r?Gijs
MozReview-Commit-ID: BBReL4bEjPY
--- a/browser/extensions/shield-recipe-client/bootstrap.js
+++ b/browser/extensions/shield-recipe-client/bootstrap.js
@@ -77,36 +77,46 @@ this.Bootstrap = {
const realPrefType = defaultBranch.getPrefType(prefName);
if (realPrefType !== Services.prefs.PREF_INVALID && realPrefType !== experimentPrefType) {
log.error(`Error setting startup pref ${prefName}; pref type does not match.`);
continue;
}
// record the value of the default branch before setting it
- switch (realPrefType) {
- case Services.prefs.PREF_STRING:
- studyPrefsChanged[prefName] = defaultBranch.getCharPref(prefName);
- break;
+ try {
+ switch (realPrefType) {
+ case Services.prefs.PREF_STRING:
+ studyPrefsChanged[prefName] = defaultBranch.getCharPref(prefName);
+ break;
- case Services.prefs.PREF_INT:
- studyPrefsChanged[prefName] = defaultBranch.getIntPref(prefName);
- break;
+ case Services.prefs.PREF_INT:
+ studyPrefsChanged[prefName] = defaultBranch.getIntPref(prefName);
+ break;
+
+ case Services.prefs.PREF_BOOL:
+ studyPrefsChanged[prefName] = defaultBranch.getBoolPref(prefName);
+ break;
- case Services.prefs.PREF_BOOL:
- studyPrefsChanged[prefName] = defaultBranch.getBoolPref(prefName);
- break;
+ case Services.prefs.PREF_INVALID:
+ studyPrefsChanged[prefName] = null;
+ break;
- case Services.prefs.PREF_INVALID:
+ default:
+ // This should never happen
+ log.error(`Error getting startup pref ${prefName}; unknown value type ${experimentPrefType}.`);
+ }
+ } catch (e) {
+ if (e.message.includes("(NS_ERROR_UNEXPECTED) [nsIPrefBranch.get")) {
+ // There is a value for the pref on the user branch but not on the default branch. This is ok.
studyPrefsChanged[prefName] = null;
- break;
-
- default:
- // This should never happen
- log.error(`Error getting startup pref ${prefName}; unknown value type ${experimentPrefType}.`);
+ } else {
+ // rethrow
+ throw e;
+ }
}
// now set the new default value
switch (experimentPrefType) {
case Services.prefs.PREF_STRING:
defaultBranch.setCharPref(prefName, experimentBranch.getCharPref(prefName));
break;
--- a/browser/extensions/shield-recipe-client/test/browser/browser_bootstrap.js
+++ b/browser/extensions/shield-recipe-client/test/browser/browser_bootstrap.js
@@ -247,8 +247,24 @@ decorate_task(
[experimentPref2]: 1,
[experimentPref3]: "original string",
[experimentPref4]: null, // null because it was not initially set.
}],
"finishStartup should record original values of the prefs initExperimentPrefs changed",
);
},
);
+
+// Test that startup prefs are handled correctly when there is a value on the user branch but not the default branch.
+decorate_task(
+ withPrefEnv({
+ set: [
+ ["extensions.shield-recipe-client.startupExperimentPrefs.testing.does-not-exist", "foo"],
+ ["testing.does-not-exist", "foo"],
+ ],
+ }),
+ withBootstrap,
+ withStub(PreferenceExperiments, "recordOriginalValues"),
+ async function testInitExperimentPrefsNoDefaultValue(Bootstrap) {
+ Bootstrap.initExperimentPrefs();
+ ok(true, "initExperimentPrefs should not throw for non-existant prefs");
+ },
+);