Caret/js/settings.js

95 lines
No EOL
2.1 KiB
JavaScript

define(["command"], function(command) {
var defaults = {};
var local = {};
var SyncFile = function(name, c) {
this.entry = {};
if (name) {
this.open(name, c);
}
};
SyncFile.prototype = {
name: "",
open: function(name, c) {
this.name = name;
this.entry.name = name;
if (c) {
c(this);
}
},
read: function(c) {
var name = this.name;
chrome.storage.sync.get(this.name, function(data) {
c(null, data[name]);
});
},
write: function(content, c) {
var data = {};
data[this.name] = content;
var self = this;
chrome.storage.sync.set(data, function() {
if (c) c(null, self);
});
},
retain: function() { return false; }
};
var Settings = {
get: function(name) {
if (!name) {
return local;
}
name = name + ".json";
return local[name];
},
getAsFile: function(name) {
return new SyncFile(name + ".json");
},
load: function(name, c) {
name = name + ".json";
if (local[name] || defaults[name]) {
return c();
}
var onload = function() {
var raw = this.responseText.replace(/\/\*[\s\S]*?\*\/|\/\/.*$/gm, "");
defaults[name] = JSON.parse(raw);
chrome.storage.sync.get(name, function(data) {
if (data[name]) {
try {
local[name] = JSON.parse(data[name]);
} catch (e) {
local[name] = defaults[name];
}
} else {
local[name] = defaults[name];
}
c();
});
};
var xhr = new XMLHttpRequest();
xhr.open("GET", "config/" + name);
xhr.onload = onload;
xhr.send();
}
};
return {
load: function(name, parentRequire, onLoad, config) {
var files = name.split(",");
var completed = 0;
files.forEach(function(file) {
Settings.load(file, function() {
completed++;
if (completed == files.length) {
onLoad(Settings);
}
})
});
}
}
});