aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortoasted-nutbread <toasted-nutbread@users.noreply.github.com>2020-10-27 19:26:30 -0400
committerGitHub <noreply@github.com>2020-10-27 19:26:30 -0400
commitdfdefc15d31b401092760926756150a839f52487 (patch)
treec64c857814d7502676d93c88188d9397fff283ce
parent45627bd6e69324eb5b4ca86041ad44046d22f7f4 (diff)
Options fixes (#962)
* Fix default options not having the correct versions * Move schema validation * Remove legacy version number * Add tests for OptionsUtil.getDefault() * Remove unused getValidValueOrDefault
-rw-r--r--ext/bg/data/options-schema.json5
-rw-r--r--ext/bg/js/options.js34
-rw-r--r--ext/bg/js/settings/backup-controller.js1
-rw-r--r--test/test-options-util.js30
4 files changed, 55 insertions, 15 deletions
diff --git a/ext/bg/data/options-schema.json b/ext/bg/data/options-schema.json
index c0a39ea2..d344a7b9 100644
--- a/ext/bg/data/options-schema.json
+++ b/ext/bg/data/options-schema.json
@@ -62,7 +62,6 @@
"options": {
"type": "object",
"required": [
- "version",
"general",
"audio",
"scanning",
@@ -72,10 +71,6 @@
"anki"
],
"properties": {
- "version": {
- "type": "integer",
- "minimum": 0
- },
"general": {
"type": "object",
"required": [
diff --git a/ext/bg/js/options.js b/ext/bg/js/options.js
index 9e89e9bd..668be98e 100644
--- a/ext/bg/js/options.js
+++ b/ext/bg/js/options.js
@@ -82,7 +82,13 @@ class OptionsUtil {
}
// Generic updates
- return await this._applyUpdates(options, this._getVersionUpdates());
+ options = await this._applyUpdates(options, this._getVersionUpdates());
+
+ // Validation
+ options = this._schemaValidator.getValidValueOrDefault(this._optionsSchema, options);
+
+ // Result
+ return options;
}
async load() {
@@ -105,10 +111,10 @@ class OptionsUtil {
if (typeof options !== 'undefined') {
options = await this.update(options);
+ } else {
+ options = this.getDefault();
}
- options = this._schemaValidator.getValidValueOrDefault(this._optionsSchema, options);
-
return options;
}
@@ -126,11 +132,10 @@ class OptionsUtil {
}
getDefault() {
- return this._schemaValidator.getValidValueOrDefault(this._optionsSchema);
- }
-
- getValidValueOrDefault(options) {
- return this._schemaValidator.getValidValueOrDefault(this._optionsSchema, options);
+ const optionsVersion = this._getVersionUpdates().length;
+ const options = this._schemaValidator.getValidValueOrDefault(this._optionsSchema);
+ options.version = optionsVersion;
+ return options;
}
createValidatingProxy(options) {
@@ -468,6 +473,10 @@ class OptionsUtil {
{
async: true,
update: this._updateVersion4.bind(this)
+ },
+ {
+ async: false,
+ update: this._updateVersion5.bind(this)
}
];
}
@@ -586,4 +595,13 @@ class OptionsUtil {
await this._addFieldTemplatesToOptions(options, '/bg/data/anki-field-templates-upgrade-v4.handlebars');
return options;
}
+
+ _updateVersion5(options) {
+ // Version 5 changes:
+ // Removed legacy version number from profile options.
+ for (const profile of options.profiles) {
+ delete profile.options.version;
+ }
+ return options;
+ }
}
diff --git a/ext/bg/js/settings/backup-controller.js b/ext/bg/js/settings/backup-controller.js
index 454ede85..d5fa28bc 100644
--- a/ext/bg/js/settings/backup-controller.js
+++ b/ext/bg/js/settings/backup-controller.js
@@ -336,7 +336,6 @@ class BackupController {
// Upgrade options
optionsFull = await this._optionsUtil.update(optionsFull);
- optionsFull = this._optionsUtil.getValidValueOrDefault(optionsFull);
// Check for warnings
const sanitizationWarnings = this._settingsImportSanitizeOptions(optionsFull, true);
diff --git a/test/test-options-util.js b/test/test-options-util.js
index a7dc41d1..00786dd6 100644
--- a/test/test-options-util.js
+++ b/test/test-options-util.js
@@ -63,6 +63,7 @@ function clone(value) {
function createProfileOptionsTestData1() {
return {
+ version: 14,
general: {
enable: true,
enableClipboardPopups: false,
@@ -495,7 +496,7 @@ function createOptionsUpdatedTestData1() {
}
],
profileCurrent: 0,
- version: 4,
+ version: 5,
global: {
database: {
prefixWildcardsSupported: false
@@ -517,6 +518,32 @@ async function testUpdate(extDir) {
assert.deepStrictEqual(optionsUpdated, optionsExpected);
}
+async function testDefault(extDir) {
+ const data = [
+ (options) => options,
+ (options) => {
+ delete options.profiles[0].options.audio.autoPlay;
+ },
+ (options) => {
+ options.profiles[0].options.audio.autoPlay = void 0;
+ }
+ ];
+
+ const vm = createVM(extDir);
+ const [OptionsUtil] = vm.get(['OptionsUtil']);
+ const optionsUtil = new OptionsUtil();
+ await optionsUtil.prepare();
+
+ for (const modify of data) {
+ const options = optionsUtil.getDefault();
+
+ const optionsModified = clone(options);
+ modify(optionsModified);
+
+ const optionsUpdated = await optionsUtil.update(clone(optionsModified));
+ assert.deepStrictEqual(clone(optionsUpdated), clone(options));
+ }
+}
async function testFieldTemplatesUpdate(extDir) {
const vm = createVM(extDir);
@@ -590,6 +617,7 @@ ${update4}
async function main() {
const extDir = path.join(__dirname, '..', 'ext');
await testUpdate(extDir);
+ await testDefault(extDir);
await testFieldTemplatesUpdate(extDir);
}