CanvasBlocker/options/export.js

75 lines
2.2 KiB
JavaScript
Raw Permalink Normal View History

2017-11-14 01:07:27 +01:00
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
(function(){
"use strict";
2019-04-08 00:02:29 +02:00
const settings = require("../lib/settings");
const logging = require("../lib/logging");
const settingsMigration = require("../lib/settingsMigration");
require("../lib/theme").init();
2017-11-14 01:07:27 +01:00
const input = document.getElementById("settings");
settings.onloaded(function(){
2019-11-28 01:26:35 +01:00
const data = {};
2017-11-14 01:07:27 +01:00
settings.forEach(function(def){
data[def.name] = def.get();
});
input.value = JSON.stringify(data, null, "\t");
input.addEventListener("input", function(){
try {
2019-11-28 01:26:35 +01:00
let newSettings = JSON.parse(this.value);
let isValid = true;
while (settingsMigration.transitions.hasOwnProperty(newSettings.storageVersion)){
let oldVersion = newSettings.storageVersion;
newSettings = settingsMigration.transitions[newSettings.storageVersion](newSettings);
if (oldVersion === newSettings.storageVersion){
break;
}
}
2017-11-14 01:07:27 +01:00
Object.entries(newSettings).forEach(function(entry){
const [name, value] = entry;
const def = settings.getDefinition(name);
if (!def){
logging.warning("Setting %s not known.");
isValid = false;
}
else if (def.get() !== value){
const invalid = def.invalid(value);
if (invalid){
isValid = false;
logging.warning("Invalid setting for %s:", name, value, invalid);
}
}
});
if (isValid){
this.classList.remove("invalid");
Object.entries(newSettings).forEach(function(entry){
const [name, value] = entry;
if (settings[name] !== value){
settings[name] = value;
}
});
}
else {
this.classList.add("invalid");
}
}
2019-11-28 01:26:35 +01:00
catch (error){
logging.warning("Invalid JSON:", error);
2017-11-14 01:07:27 +01:00
this.classList.add("invalid");
}
});
input.addEventListener("blur", function(){
if (!this.classList.contains("invalid")){
2019-11-28 01:26:35 +01:00
const data = {};
settings.forEach(function(def){
data[def.name] = def.get();
});
input.value = JSON.stringify(data, null, "\t");
}
});
2017-11-14 01:07:27 +01:00
});
}());