diff --git a/www/common/loading.js b/www/common/loading.js index d9c3b8df9..da327f8f9 100644 --- a/www/common/loading.js +++ b/www/common/loading.js @@ -1,10 +1,73 @@ -define([ - 'less!/customize/src/less/loading.less' -], function () { +define([], function () { + var loadingStyle = (function(){/* + #loading { + position: fixed; + z-index: 9999999; + top: 0px; + bottom: 0px; + left: 0px; + right: 0px; + background: #222; + color: #fafafa; + text-align: center; + font-size: 1.5em; + } + #loading .loadingContainer { + margin-top: 50vh; + transform: translateY(-50%); + } + #loading .cryptofist { + margin-left: auto; + margin-right: auto; + height: 300px; + margin-bottom: 2em; + } + @media screen and (max-height: 450px) { + #loading .cryptofist { + display: none; + } + } + #loading .spinnerContainer { + position: relative; + height: 100px; + } + #loading .spinnerContainer > div { + height: 100px; + } + #loadingTip { + position: fixed; + z-index: 99999; + top: 80%; + left: 0; + right: 0; + text-align: center; + transition: opacity 750ms; + transition-delay: 3000ms; + } + @media screen and (max-height: 600px) { + #loadingTip { + display: none; + } + } + #loadingTip span { + background-color: #222; + color: #fafafa; + text-align: center; + font-size: 1.5em; + opacity: 0.7; + font-family: 'Open Sans', 'Helvetica Neue', sans-serif; + padding: 15px; + max-width: 60%; + display: inline-block; + }*/ + }).toString().slice(14, -3); var urlArgs = window.location.href.replace(/^.*\?([^\?]*)$/, function (all, x) { return x; }); var elem = document.createElement('div'); elem.setAttribute('id', 'loading'); elem.innerHTML = [ + '', '
', '', '
', diff --git a/www/common/sframe-boot.js b/www/common/sframe-boot.js index 4489db89f..f2fcadc37 100644 --- a/www/common/sframe-boot.js +++ b/www/common/sframe-boot.js @@ -6,32 +6,6 @@ // sed -i -e 's@/common/sframe-boot.js?ver=[^"]*@/common/sframe-boot.js?ver=1.3@' $x; done ;(function () { var afterLoaded = function (req) { - var localStorage = {}; - if (req.cfg && req.cfg.urlArgs) { - try { - localStorage = window.localStorage; - if (localStorage['CRYPTPAD_VERSION'] !== req.cfg.urlArgs) { - // new version, flush - Object.keys(localStorage).forEach(function (k) { - if (!k.indexOf('CRYPTPAD_CACHE_')) { delete localStorage[k]; } - }); - localStorage['CRYPTPAD_VERSION'] = req.cfg.urlArgs; - } - } catch (e) { - console.error(e); - localStorage = {}; - } - } - window.cryptpadCache = Object.freeze({ - put: function (k, v, cb) { - cb = cb || function () { }; - setTimeout(function () { localStorage['CRYPTPAD_CACHE_' + k] = v; cb(); }); - }, - get: function (k, cb) { - if (!cb) { throw new Error(); } - setTimeout(function () { cb(localStorage['CRYPTPAD_CACHE_' + k]); }); - } - }); req.cfg = req.cfg || {}; if (req.pfx) { req.cfg.onNodeCreated = function (node /*, config, module, path*/) { @@ -54,6 +28,20 @@ var afterLoaded = function (req) { clearInterval(intr); txid = {}; window.removeEventListener('message', onReply); + data.cache = data.cache || {}; + var updated = {}; + window.cryptpadCache = { + get: function (k, cb) { + setTimeout(function () { cb(data.cache[k]); }); + }, + put: function (k, v, cb) { + cb = cb || function () { }; + updated[k] = v; + setTimeout(function () { data.cache[k] = v; cb(); }); + }, + updated: updated, + cache: data.cache + }; require(['/common/sframe-boot2.js'], function () { }); }; window.addEventListener('message', onReply); diff --git a/www/common/sframe-boot2.js b/www/common/sframe-boot2.js index e6845bcbe..dd0370ca8 100644 --- a/www/common/sframe-boot2.js +++ b/www/common/sframe-boot2.js @@ -20,5 +20,7 @@ define(['/common/requireconfig.js'], function (RequireConfig) { window.__defineGetter__('localStorage', function () { return mkFakeStore(); }); window.__defineGetter__('sessionStorage', function () { return mkFakeStore(); }); + window.CRYPTPAD_INSIDE = true; + require([document.querySelector('script[data-bootload]').getAttribute('data-bootload')]); }); diff --git a/www/common/sframe-channel.js b/www/common/sframe-channel.js index 300491e1f..a091452c3 100644 --- a/www/common/sframe-channel.js +++ b/www/common/sframe-channel.js @@ -8,7 +8,7 @@ define([ return Math.random().toString(16).replace('0.', '') + Math.random().toString(16).replace('0.', ''); }; - var create = function (ow, cb, isSandbox) { + var create = function (ow, cb, isSandbox, sendData) { var otherWindow; var evReady = Util.mkEvent(true); var handlers = {}; @@ -47,7 +47,6 @@ define([ // Fire an event. channel.event('EV_SOMETHING', { args: "whatever" }); var event = chan.event = function (e, content) { - if (!otherWindow) { throw new Error('not yet initialized'); } if (!SFrameProtocol[e]) { throw new Error('please only fire events that are defined in sframe-protocol.js'); } @@ -63,7 +62,6 @@ define([ // If the type is a query, your handler will be invoked with a reply function that takes // one argument (the content to reply with). chan.on = function (queryType, handler, quiet) { - if (!otherWindow && !quiet) { throw new Error('not yet initialized'); } if (!SFrameProtocol[queryType]) { throw new Error('please only register handlers which are defined in sframe-protocol.js'); } @@ -85,7 +83,6 @@ define([ // when that handler is first registered. // channel.whenReg('Q_SOMETHING', function () { ...query Q_SOMETHING?... }); chan.whenReg = function (queryType, cb, always) { - if (!otherWindow) { throw new Error('not yet initialized'); } if (!SFrameProtocol[queryType]) { throw new Error('please only register handlers which are defined in sframe-protocol.js'); } @@ -109,7 +106,8 @@ define([ delete callWhenRegistered[content]; } insideHandlers.push(content); - }, true); + }); + chan.whenReg('EV_REGISTER_HANDLER', evReady.fire); // Make sure both iframes are ready chan.onReady = function (h) { @@ -131,8 +129,9 @@ define([ //console.log(msg); } else if (!otherWindow) { otherWindow = ow; - evReady.fire(); - ow.postMessage(JSON.stringify({ txid: data.txid }), '*'); + sendData = sendData || {}; + sendData.txid = data.txid; + ow.postMessage(JSON.stringify(sendData), '*'); cb(chan); } else if (typeof(data.q) === 'string' && handlers[data.q]) { handlers[data.q].forEach(function (f) { diff --git a/www/common/sframe-common-outer.js b/www/common/sframe-common-outer.js index 32143cb8f..00bd0e0ea 100644 --- a/www/common/sframe-common-outer.js +++ b/www/common/sframe-common-outer.js @@ -34,12 +34,34 @@ define([ Crypto = _Crypto; Cryptget = _Cryptget; FilePicker = _FilePicker; + + if (localStorage.CRYPTPAD_URLARGS !== ApiConfig.requireConf.urlArgs) { + console.log("New version, flushing cache"); + Object.keys(localStorage).forEach(function (k) { + if (k.indexOf('CRYPTPAD_CACHE|') !== 0) { return; } + delete localStorage[k]; + }); + localStorage.CRYPTPAD_URLARGS = ApiConfig.requireConf.urlArgs; + } + var cache = {}; + Object.keys(localStorage).forEach(function (k) { + if (k.indexOf('CRYPTPAD_CACHE|') !== 0) { return; } + cache[k.slice(('CRYPTPAD_CACHE|').length)] = localStorage[k]; + }); + SFrameChannel.create($('#sbox-iframe')[0].contentWindow, waitFor(function (sfc) { sframeChan = sfc; - })); + }), false, { cache: cache }); Cryptpad.ready(waitFor()); })); }).nThen(function (waitFor) { + + sframeChan.on('EV_CACHE_PUT', function (x) { + Object.keys(x).forEach(function (k) { + localStorage['CRYPTPAD_CACHE|' + k] = x[k]; + }); + }); + secret = Cryptpad.getSecrets(); if (!secret.channel) { // New pad: create a new random channel id diff --git a/www/common/sframe-common.js b/www/common/sframe-common.js index 5fd99d3d5..cf278dd1c 100644 --- a/www/common/sframe-common.js +++ b/www/common/sframe-common.js @@ -259,6 +259,19 @@ define([ }).nThen(function () { ctx.metadataMgr = MetadataMgr.create(ctx.sframeChan); + ctx.sframeChan.whenReg('EV_CACHE_PUT', function () { + if (Object.keys(window.cryptpadCache.updated).length) { + ctx.sframeChan.event('EV_CACHE_PUT', window.cryptpadCache.updated); + } + window.cryptpadCache._put = window.cryptpadCache.put; + window.cryptpadCache.put = function (k, v, cb) { + window.cryptpadCache._put(k, v, cb); + var x = {}; + x[k] = v; + ctx.sframeChan.event('EV_CACHE_PUT', x); + }; + }); + UI.addTooltips(); ctx.sframeChan.on('EV_RT_CONNECT', function () { CommonRealtime.setConnectionState(true); }); diff --git a/www/common/sframe-protocol.js b/www/common/sframe-protocol.js index 1be9d7476..cab662df0 100644 --- a/www/common/sframe-protocol.js +++ b/www/common/sframe-protocol.js @@ -127,4 +127,7 @@ define({ // Present mode URL 'Q_PRESENT_URL_GET_VALUE': true, 'EV_PRESENT_URL_SET_VALUE': true, + + // Put one or more entries to the cache which will go in localStorage. + 'EV_CACHE_PUT': true, });