Re-factor how the BasePreferences.prefs-property is initialized

Looking at this now, I cannot understand why we'd need to initialize `this.prefs` with all of the values from `this.defaults`.
Not only does this *indirectly* require one extra loop, via the `Object.assign`-call, but it also means that in GENERIC-builds changes to default-preference values might not be picked-up unless the the existing user-prefs are cleared (if the user had *manually* set prefs previously).
This commit is contained in:
Jonas Jenwald 2021-03-22 14:19:50 +01:00
parent d426ffdad9
commit 4b27f58625

View File

@ -35,25 +35,16 @@ class BasePreferences {
enumerable: true, enumerable: true,
configurable: false, configurable: false,
}); });
this.prefs = Object.assign(Object.create(null), this.defaults); this.prefs = Object.create(null);
this._initializedPromise = this._readFromStorage(this.defaults).then( this._initializedPromise = this._readFromStorage(this.defaults).then(
prefs => { prefs => {
if (!prefs) { for (const name in this.defaults) {
return; const prefValue = prefs?.[name];
} // Ignore preferences whose types don't match the default values.
for (const name in prefs) { if (typeof prefValue === typeof this.defaults[name]) {
const defaultValue = this.defaults[name], this.prefs[name] = prefValue;
prefValue = prefs[name];
// Ignore preferences not present in, or whose types don't match,
// the default values.
if (
defaultValue === undefined ||
typeof prefValue !== typeof defaultValue
) {
continue;
} }
this.prefs[name] = prefValue;
} }
} }
); );
@ -86,7 +77,7 @@ class BasePreferences {
*/ */
async reset() { async reset() {
await this._initializedPromise; await this._initializedPromise;
this.prefs = Object.assign(Object.create(null), this.defaults); this.prefs = Object.create(null);
return this._writeToStorage(this.defaults); return this._writeToStorage(this.defaults);
} }
@ -114,8 +105,7 @@ class BasePreferences {
value = value.toString(); value = value.toString();
} else { } else {
throw new Error( throw new Error(
`Set preference: "${value}" is a ${valueType}, ` + `Set preference: "${value}" is a ${valueType}, expected a ${defaultType}.`
`expected a ${defaultType}.`
); );
} }
} else { } else {