CanvasBlocker/options/export.js

75 lines
2.2 KiB
JavaScript

/* 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";
const settings = require("../lib/settings");
const logging = require("../lib/logging");
const settingsMigration = require("../lib/settingsMigration");
require("../lib/theme").init();
const input = document.getElementById("settings");
settings.onloaded(function(){
const data = {};
settings.forEach(function(def){
data[def.name] = def.get();
});
input.value = JSON.stringify(data, null, "\t");
input.addEventListener("input", function(){
try {
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;
}
}
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");
}
}
catch (error){
logging.warning("Invalid JSON:", error);
this.classList.add("invalid");
}
});
input.addEventListener("blur", function(){
if (!this.classList.contains("invalid")){
const data = {};
settings.forEach(function(def){
data[def.name] = def.get();
});
input.value = JSON.stringify(data, null, "\t");
}
});
});
}());