From 75170353fe78d871b3df2df532b65b44cd34a99e Mon Sep 17 00:00:00 2001 From: ansuz Date: Mon, 1 Aug 2016 15:18:23 +0200 Subject: [PATCH] api for sharing localstorage across subdomains --- customize.dist/share/frame.html | 7 +++ customize.dist/share/respond.js | 83 +++++++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 customize.dist/share/frame.html create mode 100644 customize.dist/share/respond.js diff --git a/customize.dist/share/frame.html b/customize.dist/share/frame.html new file mode 100644 index 000000000..8d2d63c0d --- /dev/null +++ b/customize.dist/share/frame.html @@ -0,0 +1,7 @@ + + + + + + + diff --git a/customize.dist/share/respond.js b/customize.dist/share/respond.js new file mode 100644 index 000000000..b5ae4671e --- /dev/null +++ b/customize.dist/share/respond.js @@ -0,0 +1,83 @@ +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; + } +}); +