Index: lib/prefs.js |
diff --git a/lib/prefs.js b/lib/prefs.js |
index 14785c4a7f616d224030a84914e2e98ace2efad9..f6cd74478fc7c2b6856e33b49d42ac7b6a22c145 100644 |
--- a/lib/prefs.js |
+++ b/lib/prefs.js |
@@ -48,6 +48,11 @@ let defaults = { |
notifications_ignoredcategories: [], |
}; |
+let optionalValues_ExpectedTypes = { |
+ __proto__: null, |
+ allowed_connection_type: "string" |
+}; |
+ |
let preconfigurable = ["suppress_first_run_page", "disable_auto_updates", |
"first_run_subscription_auto_select", "allowed_connection_type"]; |
@@ -57,6 +62,25 @@ let listeners = []; |
let isDirty = false; |
let isSaving = false; |
+function isValueTypeCorrect(key, value) |
+{ |
+ // For values of required settings the first line just works. |
+ // For values of optional settings it works when the type of default |
+ // value is the same as the type of value. It happens when |
+ // - value is undefined and no default value |
+ // - value is not undefined and there is a default value. |
+ // However, for optional values types are different when |
+ // - value is undefined and there is a default value |
+ // - value is not undefined and there is no default value. |
+ let isValueTypeGood = typeof value == typeof defaults[key]; |
+ let optionalValue_ExpectedType = optionalValues_ExpectedTypes[key]; |
+ if (!isValueTypeGood && optionalValue_ExpectedType) |
+ { |
+ isValueTypeGood = value == undefined || typeof value == optionalValue_ExpectedType; |
+ } |
+ return isValueTypeGood; |
+} |
+ |
function defineProperty(key) |
{ |
Object.defineProperty(Prefs, key, |
@@ -64,10 +88,10 @@ function defineProperty(key) |
get: () => values[key], |
set: function(value) |
{ |
- if (typeof value != typeof defaults[key]) |
+ if (!isValueTypeCorrect(key, value)) |
throw new Error("Attempt to change preference type"); |
- if (value == defaults[key]) |
+ if (value == defaults[key] || value == undefined) |
delete values[key]; |
else |
values[key] = value; |
@@ -141,12 +165,26 @@ let Prefs = exports.Prefs = { |
// Update the default prefs with what was preconfigured |
for (let key in _preconfiguredPrefs) |
if (preconfigurable.indexOf(key) != -1) |
- defaults[key] = _preconfiguredPrefs[key]; |
+ { |
+ let value = _preconfiguredPrefs[key]; |
+ if (!isValueTypeCorrect(key, value)) |
+ throw new Error("Unexpected value type in preconfigured preferences"); |
+ |
+ if (value == undefined) |
+ delete defaults[key]; |
+ else |
+ defaults[key] = value; |
+ } |
// Define defaults |
for (let key in defaults) |
defineProperty(key); |
+for (let key in optionalValues_ExpectedTypes) |
+ // only those which are not defined yet |
+ if (!Object.prototype.hasOwnProperty.call(defaults, key)) |
+ defineProperty(key); |
+ |
// Set values of prefs based on defaults |
values = Object.create(defaults); |