cryptpad/customize.dist/share/respond.js
ansuz ae116d4772 emit change events for remote storage.
listen for those events being sent via postMessage
2016-08-30 18:11:43 +02:00

93 lines
2.8 KiB
JavaScript

var validDomains = [
/cryptpad.fr$/i,
];
var isValidDomain = function (o) {
return validDomains.some(function (e) {
switch (typeof(e)) {
case 'string': return e === o;
case 'object': return e.test(o);
}
});
};
var isArray = function (o) { return Object.prototype.toString.call(o) === '[object Array]'; };
window.addEventListener('message', function(e) {
if (!isValidDomain(e.origin)) { return; }
var payload = JSON.parse(e.data);
var parent = window.parent;
var respond = function (error, data) {
var res = {
_uid: payload._uid,
error: error,
data: data,
};
parent.postMessage(JSON.stringify(res), '*');
};
//console.log(payload);
switch(payload.method) {
case 'set':
localStorage.setItem(payload.key, JSON.stringify(payload.data));
respond();
break;
case 'batchset':
if (isArray(payload.data) || typeof(payload.data) !== 'object') {
respond('[batchset.TypeError] expected key-value pairs to set');
return;
}
Object.keys(payload.data).forEach(function (k) {
localStorage.setItem(k, JSON.stringify(payload.data[k]));
});
respond();
break;
case 'get':
respond(void 0, JSON.parse(localStorage.getItem(payload.key)));
break;
case 'batchget':
if (!isArray(payload.data)) {
respond('[batchget.TypeError] expected array of keys to return');
return;
}
var map = {};
payload.data.forEach(function (k) {
map[k] = JSON.parse(localStorage.getItem(k));
});
respond(void 0, map);
break;
case 'remove':
//console.log("Removing %s from localStorage", payload.key);
localStorage.removeItem(payload.key);
respond();
break;
case 'batchremove':
if (!isArray(payload.data)) {
respond('[batchremove.TypeError] expected array of keys to remove');
return;
}
payload.data.forEach(function (k) {
localStorage.removeItem(k);
});
respond();
break;
case 'keys':
respond(void 0, Object.keys(localStorage));
break;
case undefined:
respond('No method supplied');
break;
}
});
window.addEventListener('storage', function (ev) {
parent.postMessage(JSON.stringify({
_uid: 'change',
data: {
key: ev.key,
oldValue: ev.oldValue,
newValue: ev.newValue,
}
}), '*');
});