Compare commits
31 commits
Author | SHA1 | Date | |
---|---|---|---|
|
65dd8f1d6a | ||
|
01cb64d07d | ||
|
3091046705 | ||
|
f714275cd3 | ||
|
53b91247a7 | ||
|
f72bdff252 | ||
|
f9031a2bce | ||
|
dcb275d1c3 | ||
|
2404a57eb8 | ||
|
fb1dd2d5d5 | ||
|
684a86eecc | ||
|
41f4d8fc7a | ||
|
6c134a678b | ||
|
077b3fe635 | ||
|
c83cd5a50d | ||
|
c6b3ed9bc3 | ||
|
0e652872df | ||
|
247931eece | ||
|
20f30a7259 | ||
|
ab7db780c8 | ||
|
1542d7381d | ||
|
96f340b11c | ||
|
68505fe32b | ||
|
d5c4fdd50a | ||
|
f583c526a8 | ||
|
f879e9044a | ||
|
961e8afe09 | ||
|
696f6dc137 | ||
|
16603e02dc | ||
|
084af5632b | ||
|
3fafbbc068 |
55 changed files with 434 additions and 21 deletions
|
@ -6,6 +6,7 @@
|
|||
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
|
||||
<link rel="icon" type="image/png" href="/customize/favicon/main-favicon.png" id="favicon"/>
|
||||
<link rel="manifest" href="/manifest.webmanifest">
|
||||
<script async data-bootload="/customize/four-oh-four.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
|
||||
</head>
|
||||
<body class="html">
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
|
||||
<link rel="icon" type="image/png" href="/customize/favicon/main-favicon.png" id="favicon"/>
|
||||
<link rel="manifest" href="/manifest.webmanifest">
|
||||
<script async data-bootload="/customize/template.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
|
||||
</head>
|
||||
<body class="html">
|
||||
|
|
|
@ -6,6 +6,8 @@
|
|||
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
|
||||
<link rel="icon" type="image/png" href="/customize/main-favicon.png" id="favicon"/>
|
||||
<link rel="manifest" href="/manifest.webmanifest">
|
||||
<script async data-bootload="/customize/template.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
|
||||
</head>
|
||||
<body class="html">
|
||||
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
|
||||
<link rel="icon" type="image/png" href="/customize/favicon/main-favicon.png" id="favicon"/>
|
||||
<link rel="manifest" href="/manifest.webmanifest">
|
||||
<script async data-bootload="/customize/template.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
|
||||
</head>
|
||||
<body class="html">
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
|
||||
<link rel="icon" type="image/png" href="/customize/favicon/main-favicon.png" id="favicon"/>
|
||||
<link rel="manifest" href="/manifest.webmanifest">
|
||||
<script async data-bootload="/customize/template.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
|
||||
</head>
|
||||
<body class="html">
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
|
||||
<link rel="icon" type="image/png" href="/customize/favicon/main-favicon.png" id="favicon"/>
|
||||
<link rel="manifest" href="/manifest.webmanifest">
|
||||
<script async data-bootload="/customize/template.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
|
||||
</head>
|
||||
<body class="html">
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
|
||||
<link rel="icon" type="image/png" href="/customize/favicon/main-favicon.png" id="favicon"/>
|
||||
<link rel="manifest" href="/manifest.webmanifest">
|
||||
<script async data-bootload="/customize/template.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
|
||||
</head>
|
||||
<body class="html">
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
|
||||
<link rel="icon" type="image/png" href="/customize/favicon/main-favicon.png" id="favicon"/>
|
||||
<link rel="manifest" href="/manifest.webmanifest">
|
||||
<script async data-bootload="/customize/template.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
|
||||
</head>
|
||||
<body class="html">
|
||||
|
|
|
@ -24,6 +24,7 @@ Default.commonCSP = function (domain) {
|
|||
the ws://* directive, and change '*' to your domain
|
||||
*/
|
||||
"connect-src 'self' ws: wss: blob:" + domain,
|
||||
"manifest-src " + domain,
|
||||
|
||||
// data: is used by codemirror
|
||||
"img-src 'self' data: blob:" + domain,
|
||||
|
|
|
@ -205,7 +205,7 @@ var serveConfig = (function () {
|
|||
'define(function(){',
|
||||
'var obj = ' + JSON.stringify({
|
||||
requireConf: {
|
||||
waitSeconds: 600,
|
||||
waitSeconds: 0, //600,
|
||||
urlArgs: 'ver=' + Package.version + cacheString(),
|
||||
},
|
||||
removeDonateButton: (config.removeDonateButton === true),
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="referrer" content="no-referrer" />
|
||||
<link rel="manifest" href="/manifest.webmanifest">
|
||||
<script async data-bootload="main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
|
||||
<link href="/customize/src/outer.css?ver=1.1" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
<head>
|
||||
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<link rel="manifest" href="/manifest.webmanifest">
|
||||
<script data-bootload="main.js" data-main="/common/boot.js" src="/bower_components/requirejs/require.js"></script>
|
||||
|
||||
<style>
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
|
||||
<link rel="icon" type="image/png" href="/customize/favicon/main-favicon.png" id="favicon"/>
|
||||
<link rel="manifest" href="/manifest.webmanifest">
|
||||
<script async data-bootload="main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
|
||||
</head>
|
||||
<body class="html">
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="referrer" content="no-referrer" />
|
||||
<script async data-bootload="/common/sframe-app-outer.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
|
||||
<link rel="manifest" href="/manifest.webmanifest">
|
||||
<link href="/customize/src/outer.css?ver=1.1" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
<body>
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
define([
|
||||
'cm/lib/codemirror',
|
||||
'/common/common-util.js',
|
||||
|
||||
'cm/addon/mode/simple'
|
||||
], function (CodeMirror) {
|
||||
], function (CodeMirror, Util) {
|
||||
CodeMirror.__mode = 'orgmode';
|
||||
|
||||
var isEmpty = function (el, idx) {
|
||||
|
@ -300,11 +302,11 @@ define([
|
|||
if(!link) return;
|
||||
|
||||
if(/^https?\:\/\//.test(link)){
|
||||
window.open(link);
|
||||
Util.open(link);
|
||||
}else{
|
||||
var root_path = dirname(window.location.pathname.replace(/^\/view/, ''));
|
||||
var link_path = link;
|
||||
window.open("/view"+pathBuilder(root_path, link_path));
|
||||
Util.open("/view"+pathBuilder(root_path, link_path));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -49,6 +49,10 @@ define([
|
|||
throw e;
|
||||
};
|
||||
|
||||
window.addEventListener('unhandledrejection', function(event) {
|
||||
console.error('Unhandled rejection (promise: ', event.promise, ', reason: ', event.reason, ').');
|
||||
});
|
||||
|
||||
try {
|
||||
var test_key = 'localStorage_test';
|
||||
var testval = Math.random().toString();
|
||||
|
@ -58,5 +62,83 @@ define([
|
|||
}
|
||||
} catch (e) { console.error(e); failStore(); }
|
||||
|
||||
require([document.querySelector('script[data-bootload]').getAttribute('data-bootload')]);
|
||||
var called = false;
|
||||
var load = function () {
|
||||
if (called) { return; }
|
||||
called = true;
|
||||
require([document.querySelector('script[data-bootload]').getAttribute('data-bootload')]);
|
||||
};
|
||||
|
||||
var urlArgs = RequireConfig().urlArgs;
|
||||
var sw = window.navigator.serviceWorker;
|
||||
// If the browser doesn't support service workers, just start loading normally
|
||||
if (!sw) { return void load(); }
|
||||
|
||||
// TOFU
|
||||
// calling back 'true' means it's safe to proceed
|
||||
// otherwise load the old version
|
||||
var TOFU_KEY = 'TOFU_URL_ARGS';
|
||||
var checkVersion = function (msg, cb) {
|
||||
var newUrlArgs = urlArgs;
|
||||
var k = TOFU_KEY;
|
||||
try {
|
||||
var oldUrlArgs = localStorage.getItem(k);
|
||||
if (!oldUrlArgs) {
|
||||
//localStorage.setItem(k, newUrlArgs);
|
||||
return void cb(true);
|
||||
}
|
||||
if (oldUrlArgs === newUrlArgs) {
|
||||
return void cb(true);
|
||||
}
|
||||
// we don't have our fancy loading screen or other UI, so use window.confirm
|
||||
return void setTimeout(function () {
|
||||
var answer = window.confirm(msg);
|
||||
//localStorage.setItem(k, newUrlArgs);
|
||||
return void cb(answer);
|
||||
});
|
||||
} catch (err) {
|
||||
localStorage.removeItem(k);
|
||||
return void cb(false);
|
||||
}
|
||||
};
|
||||
|
||||
var loadServiceWorker = function (args, offline) {
|
||||
var path = '/sw.js?' + args; // + (offline ? '&offline=1': ''); // XXX wrong way to do offline...
|
||||
try {
|
||||
sw
|
||||
.register(path, { scope: '/' })
|
||||
.then(function (reg) {
|
||||
// XXX tell the service worker if it should stay offline...
|
||||
|
||||
localStorage.setItem(TOFU_KEY, args);
|
||||
console.log("service-worker registered", reg);
|
||||
load();
|
||||
})
|
||||
.catch(function (err) {
|
||||
console.error(err);
|
||||
load();
|
||||
});
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
load();
|
||||
}
|
||||
};
|
||||
|
||||
var msg = "ok to load a new version of cryptpad (" + urlArgs + ")?";
|
||||
checkVersion(msg, function (consent) {
|
||||
var consentfulWorker = urlArgs;
|
||||
var offline = false;
|
||||
|
||||
//console.log(urlArgs);
|
||||
if (!consent) {
|
||||
consentfulWorker = localStorage.getItem(TOFU_KEY);
|
||||
offline = true;
|
||||
//return void loadServiceWorker(localStorage.getItem(TOFU_KEY), true);
|
||||
} else {
|
||||
console.error("THE USER CONSENTED TO THE UPDATE");
|
||||
}
|
||||
window.consentfulWorker = consentfulWorker;
|
||||
|
||||
loadServiceWorker(consentfulWorker, offline);
|
||||
});
|
||||
});
|
||||
|
|
|
@ -5,6 +5,25 @@
|
|||
window.atob = window.atob || function (str) { return Buffer.from(str, 'base64').toString('binary'); }; // jshint ignore:line
|
||||
window.btoa = window.btoa || function (str) { return Buffer.from(str, 'binary').toString('base64'); }; // jshint ignore:line
|
||||
|
||||
var isPwa = function isPwa() {
|
||||
return ["fullscreen", "standalone", "minimal-ui"].some(function (displayMode) {
|
||||
return window.matchMedia('(display-mode: ' + displayMode + ')').matches;
|
||||
});
|
||||
};
|
||||
|
||||
// XXX standardize noopener, etc.
|
||||
Util.open = function (url, name /*, features */) {
|
||||
if (navigator.standalone || isPwa()) {
|
||||
try {
|
||||
return (window.document.location = url);
|
||||
} catch (err) {
|
||||
// fall through to standard opening method
|
||||
console.error(err);
|
||||
}
|
||||
}
|
||||
return window.open(url, name);
|
||||
};
|
||||
|
||||
Util.slice = function (A, start, end) {
|
||||
return Array.prototype.slice.call(A, start, end);
|
||||
};
|
||||
|
|
|
@ -1932,7 +1932,7 @@ define([
|
|||
|
||||
var CRYPTPAD_VERSION = 'cryptpad-version';
|
||||
var currentVersion = localStorage[CRYPTPAD_VERSION];
|
||||
var updateLocalVersion = function (newUrlArgs) {
|
||||
var updateLocalVersion = function (newUrlArgs) { // XXX
|
||||
// Check for CryptPad updates
|
||||
var urlArgs = newUrlArgs || (Config.requireConf ? Config.requireConf.urlArgs : null);
|
||||
if (!urlArgs) { return; }
|
||||
|
@ -2089,7 +2089,7 @@ define([
|
|||
STORE_READY: onStoreReady,
|
||||
// Network
|
||||
NETWORK_DISCONNECT: common.onNetworkDisconnect.fire,
|
||||
NETWORK_RECONNECT: function (data) {
|
||||
NETWORK_RECONNECT: function (data) { // XXX reconnect
|
||||
require(['/api/config?' + (+new Date())], function (NewConfig) {
|
||||
var update = updateLocalVersion(NewConfig.requireConf && NewConfig.requireConf.urlArgs);
|
||||
if (update) {
|
||||
|
|
|
@ -1129,7 +1129,7 @@ define([
|
|||
var priv = metadataMgr.getPrivateData();
|
||||
var useUnsafe = Util.find(priv, ['settings', 'security', 'unsafeLinks']);
|
||||
if (useUnsafe === true) {
|
||||
return void window.open(APP.origin + href);
|
||||
return void Util.open(APP.origin + href);
|
||||
}
|
||||
|
||||
// Get hidden hash
|
||||
|
@ -1138,7 +1138,7 @@ define([
|
|||
if (isRo) { opts.view = true; }
|
||||
var hash = Hash.getHiddenHashFromKeys(parsed.type, secret, opts);
|
||||
var hiddenHref = Hash.hashToHref(hash, parsed.type);
|
||||
window.open(APP.origin + hiddenHref);
|
||||
Util.open(APP.origin + hiddenHref);
|
||||
};
|
||||
var openIn = function (type, path, team, fData) {
|
||||
var obj = {
|
||||
|
|
|
@ -390,7 +390,7 @@ define([
|
|||
var v = opts.getLinkValue({
|
||||
embed: Util.isChecked($link.find('#cp-share-embed'))
|
||||
});
|
||||
window.open(v);
|
||||
Util.open(v);
|
||||
return true;
|
||||
},
|
||||
keys: [[13, 'ctrl']]
|
||||
|
|
|
@ -292,6 +292,8 @@ var factory = function () {
|
|||
});
|
||||
}
|
||||
cb(null, u8);
|
||||
} else {
|
||||
// XXX cb ?
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -558,7 +558,7 @@ define([
|
|||
var $room = $(roomEl).click(function () {
|
||||
display(id);
|
||||
}).dblclick(function () {
|
||||
if (friendData.profile) { window.open(origin + '/profile/#' + friendData.profile); }
|
||||
if (friendData.profile) { Util.open(origin + '/profile/#' + friendData.profile); }
|
||||
});
|
||||
|
||||
$(unmute).on('click dblclick', function (e) {
|
||||
|
@ -723,7 +723,7 @@ define([
|
|||
if (types.indexOf('profile') !== -1) {
|
||||
// update dblclick event in friend list
|
||||
$userlist.find(userQuery(curvePublic)).off('dblclick').dblclick(function () {
|
||||
if (info.profile) { window.open(origin + '/profile/#' + info.profile); }
|
||||
if (info.profile) { Util.open(origin + '/profile/#' + info.profile); }
|
||||
});
|
||||
}
|
||||
|
||||
|
|
8
www/common/offline.html
Normal file
8
www/common/offline.html
Normal file
|
@ -0,0 +1,8 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Worker</title>
|
||||
<script src="/service/main.js?ver=pewpew"></script>
|
||||
</head>
|
||||
<body>
|
||||
<h1>OFFLINE</h1>
|
|
@ -2659,7 +2659,7 @@ define([
|
|||
if (typeof(cb) === 'function') { cb(returned); }
|
||||
|
||||
store.offline = false;
|
||||
sendDriveEvent('NETWORK_RECONNECT'); // Tell inner that we're now online
|
||||
sendDriveEvent('NETWORK_RECONNECT'); // Tell inner that we're now online // XXX
|
||||
broadcast([], "UPDATE_METADATA");
|
||||
broadcast([], "STORE_READY", returned);
|
||||
|
||||
|
@ -2826,7 +2826,7 @@ define([
|
|||
});
|
||||
rt.proxy.on('reconnect', function () {
|
||||
store.offline = false;
|
||||
sendDriveEvent('NETWORK_RECONNECT');
|
||||
sendDriveEvent('NETWORK_RECONNECT'); // XXX reconnect
|
||||
broadcast([], "UPDATE_METADATA");
|
||||
});
|
||||
|
||||
|
|
|
@ -48,5 +48,30 @@ define([
|
|||
throw e;
|
||||
};
|
||||
|
||||
require([document.querySelector('script[data-bootload]').getAttribute('data-bootload')]);
|
||||
var called = false;
|
||||
var load = function () {
|
||||
if (called) { return; }
|
||||
called = true;
|
||||
require([document.querySelector('script[data-bootload]').getAttribute('data-bootload')]);
|
||||
};
|
||||
|
||||
var sw = window.navigator.serviceWorker;
|
||||
if (!sw) { return void load(); }
|
||||
try {
|
||||
sw
|
||||
.register('/sw.js?'
|
||||
+ RequireConfig().urlArgs // XXX should match the query string provided by outer
|
||||
, { scope: '/' })
|
||||
.then(function (reg) {
|
||||
console.log("service-worker registered", reg);
|
||||
load();
|
||||
})
|
||||
.catch(function (err) {
|
||||
console.error(err);
|
||||
load();
|
||||
});
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
load();
|
||||
}
|
||||
});
|
||||
|
|
|
@ -12,6 +12,7 @@ define([
|
|||
var requireConfig = RequireConfig();
|
||||
var lang = Messages._languageUsed;
|
||||
var req = {
|
||||
worker: window.consentfulWorker,
|
||||
cfg: requireConfig,
|
||||
req: [ '/common/loading.js' ],
|
||||
pfx: window.location.origin,
|
||||
|
@ -30,6 +31,7 @@ define([
|
|||
}
|
||||
}
|
||||
|
||||
// XXX load with cached URL args via window.consentfulWorker
|
||||
document.getElementById('sbox-iframe').setAttribute('src',
|
||||
ApiConfig.httpSafeOrigin + (pathname || window.location.pathname) + 'inner.html?' +
|
||||
requireConfig.urlArgs + '#' + encodeURIComponent(JSON.stringify(req)));
|
||||
|
|
|
@ -651,7 +651,7 @@ define([
|
|||
return void ctx.sframeChan.event('EV_OPEN_UNSAFE_URL', url);
|
||||
}
|
||||
var bounceHref = window.location.origin + '/bounce/#' + encodeURIComponent(url);
|
||||
window.open(bounceHref);
|
||||
Util.open(bounceHref);
|
||||
};
|
||||
|
||||
funcs.fixLinks = function (domElement) {
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="referrer" content="no-referrer" />
|
||||
<link rel="manifest" href="/manifest.webmanifest">
|
||||
<script async data-bootload="main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
|
||||
<link href="/customize/src/outer.css?ver=1.1" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="referrer" content="no-referrer" />
|
||||
<link rel="manifest" href="/manifest.webmanifest">
|
||||
<script async data-bootload="main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
|
||||
<link href="/customize/src/outer.css?ver=1.1" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="referrer" content="no-referrer" />
|
||||
<link rel="manifest" href="/manifest.webmanifest">
|
||||
<script async data-bootload="main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
|
||||
<link href="/customize/src/outer.css?ver=1.1" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="referrer" content="no-referrer" />
|
||||
<link rel="manifest" href="/manifest.webmanifest">
|
||||
<script async data-bootload="main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
|
||||
<link href="/customize/src/outer.css?ver=1.1" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
<meta content="text/html; charset=utf-8" http-equiv="content-type" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="referrer" content="no-referrer" />
|
||||
<link rel="manifest" href="/manifest.webmanifest">
|
||||
<script async data-bootload="/common/sframe-app-outer.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
|
||||
<link href="/customize/src/outer.css?ver=1.1" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
|
||||
<link rel="icon" type="image/png" href="/customize/favicon/main-favicon.png" id="favicon"/>
|
||||
<link rel="manifest" href="/manifest.webmanifest">
|
||||
<script async data-bootload="/customize/template.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
|
||||
</head>
|
||||
<body class="html">
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
<title data-localization="main_title">CryptPad: Collaboration suite, encrypted and open-source</title>
|
||||
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
|
||||
<link rel="manifest" href="/manifest.webmanifest">
|
||||
<script async data-main="main" src="/bower_components/requirejs/require.js"></script>
|
||||
<link rel="icon" type="image/png" href="/customize/favicon/main-favicon.png" id="favicon"/>
|
||||
</head>
|
||||
|
|
12
www/manifest.webmanifest
Normal file
12
www/manifest.webmanifest
Normal file
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"short_name": "CryptPad",
|
||||
"name": "CryptPad: the encrypted collaboration suite",
|
||||
"description": "the encrypted collaboration suite",
|
||||
"icons": [],
|
||||
"background_color": "#ff0073",
|
||||
"display": "browser",
|
||||
"start_url": "/",
|
||||
"scope": "/",
|
||||
"theme_color": "#ff0073",
|
||||
"shortcuts": []
|
||||
}
|
|
@ -1,6 +1,7 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>Test media-tag</title>
|
||||
<link rel="manifest" href="/manifest.webmanifest">
|
||||
<script async data-bootload="main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
|
||||
<style>
|
||||
media-tag * {
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="referrer" content="no-referrer" />
|
||||
<link rel="manifest" href="/manifest.webmanifest">
|
||||
<script async data-bootload="main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
|
||||
<link href="/customize/src/outer.css?ver=1.1" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="referrer" content="no-referrer" />
|
||||
<link rel="manifest" href="/manifest.webmanifest">
|
||||
<script async data-bootload="/common/onlyoffice/main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
|
||||
<link href="/customize/src/outer.css?ver=1.1" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="referrer" content="no-referrer" />
|
||||
<link rel="manifest" href="/manifest.webmanifest">
|
||||
<script async data-bootload="/common/onlyoffice/main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
|
||||
<link href="/customize/src/outer.css?ver=1.1" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="referrer" content="no-referrer" />
|
||||
<link rel="manifest" href="/manifest.webmanifest">
|
||||
<script async data-bootload="/common/sframe-app-outer.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
|
||||
<link href="/customize/src/outer.css?ver=1.1" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
|
|
|
@ -2,8 +2,9 @@ define([
|
|||
'jquery',
|
||||
'/common/hyperscript.js',
|
||||
'/common/common-ui-elements.js',
|
||||
'/common/common-util.js',
|
||||
'/customize/messages.js'
|
||||
], function ($, h, UIElements, Messages) {
|
||||
], function ($, h, UIElements, Util, Messages) {
|
||||
|
||||
var onLinkClicked = function (e, inner) {
|
||||
var $target = $(e.target);
|
||||
|
@ -46,7 +47,7 @@ define([
|
|||
ee.preventDefault();
|
||||
ee.stopPropagation();
|
||||
var bounceHref = window.location.origin + '/bounce/#' + encodeURIComponent(href);
|
||||
window.open(bounceHref);
|
||||
Util.open(bounceHref);
|
||||
$link.remove();
|
||||
});
|
||||
$link.on('mouseleave', function () {
|
||||
|
@ -93,7 +94,7 @@ define([
|
|||
var href = anchor.getAttribute('href');
|
||||
if (href) {
|
||||
var bounceHref = window.location.origin + '/bounce/#' + encodeURIComponent(href);
|
||||
window.open(bounceHref);
|
||||
Util.open(bounceHref);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="referrer" content="no-referrer" />
|
||||
<link rel="manifest" href="/manifest.webmanifest">
|
||||
<script async data-bootload="main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
|
||||
<link href="/customize/src/outer.css?ver=1.1" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="referrer" content="no-referrer" />
|
||||
<link rel="manifest" href="/manifest.webmanifest">
|
||||
<script async data-bootload="main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
|
||||
<link href="/customize/src/outer.css?ver=1.1" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
|
|
|
@ -103,7 +103,7 @@ define([
|
|||
$('<button>', {
|
||||
'class': 'btn '+VIEW_PROFILE_BUTTON,
|
||||
}).text(Messages.profile_viewMyProfile).click(function () {
|
||||
window.open(url, '_blank');
|
||||
Util.open(url, '_blank');
|
||||
}).appendTo($container);
|
||||
|
||||
$('<button>', {
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
|
||||
<link rel="icon" type="image/png" href="/customize/favicon/main-favicon.png" id="favicon"/>
|
||||
<link rel="manifest" href="/manifest.webmanifest">
|
||||
<script async data-bootload="/customize/template.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
|
||||
</head>
|
||||
<body class="html">
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="referrer" content="no-referrer" />
|
||||
<link rel="manifest" href="/manifest.webmanifest">
|
||||
<script async data-bootload="main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
|
||||
<link href="/customize/src/outer.css?ver=1.1" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
|
|
|
@ -94,7 +94,7 @@ define([
|
|||
'subscription': {
|
||||
onClick: function() {
|
||||
var urls = common.getMetadataMgr().getPrivateData().accounts;
|
||||
window.open(urls.upgradeURL);
|
||||
Util.open(urls.upgradeURL);
|
||||
Feedback.send('SUBSCRIPTION_BUTTON');
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="referrer" content="no-referrer" />
|
||||
<link rel="manifest" href="/manifest.webmanifest">
|
||||
<script async data-bootload="/common/onlyoffice/main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
|
||||
<link href="/customize/src/outer.css?ver=1.1" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="referrer" content="no-referrer" />
|
||||
<link rel="manifest" href="/manifest.webmanifest">
|
||||
<script async data-bootload="/common/sframe-app-outer.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
|
||||
<link href="/customize/src/outer.css?ver=1.1" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="referrer" content="no-referrer" />
|
||||
<link rel="manifest" href="/manifest.webmanifest">
|
||||
<script async data-bootload="main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
|
||||
<link href="/customize/src/outer.css?ver=1.1" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
|
|
223
www/sw.js
Normal file
223
www/sw.js
Normal file
|
@ -0,0 +1,223 @@
|
|||
/* jshint esversion: 6 */
|
||||
var version = self.location.search || "DEFAULT";
|
||||
//console.log('worker location:', self.location);
|
||||
console.info('SW VERSION', version);
|
||||
|
||||
var params = new URLSearchParams(version);
|
||||
var OFFLINE = params.has('offline');
|
||||
|
||||
console.info("SW OFFLINE?", OFFLINE);
|
||||
|
||||
var filesToCache = [
|
||||
'/common/sframe-app-outer.js',
|
||||
'/common/offline.html',
|
||||
];
|
||||
|
||||
/*
|
||||
[
|
||||
'auth',
|
||||
'bounce',
|
||||
'code',
|
||||
'contacts',
|
||||
'drive',
|
||||
'file',
|
||||
'kanban',
|
||||
'login',
|
||||
'logout',
|
||||
'notifications',
|
||||
//'oodoc',
|
||||
//'ooslide',
|
||||
'pad',
|
||||
'poll',
|
||||
'profile',
|
||||
'register',
|
||||
//'secureiframe',
|
||||
//'service',
|
||||
'settings',
|
||||
'sheet',
|
||||
'slide',
|
||||
'support',
|
||||
'teams',
|
||||
'todo',
|
||||
'whiteboard',
|
||||
//'worker',
|
||||
];
|
||||
.forEach(function (path) {
|
||||
filesToCache.push('/' + path + '/');
|
||||
});
|
||||
*/
|
||||
|
||||
/*
|
||||
[
|
||||
'',
|
||||
//'404.html',
|
||||
'about.html',
|
||||
'contact.html',
|
||||
'faq.html',
|
||||
'features.html',
|
||||
'index.html',
|
||||
//'maintenance.html',
|
||||
'privacy.html',
|
||||
'terms.html',
|
||||
'what-is-cryptpad.html',
|
||||
].forEach(function (path) {
|
||||
filesToCache.push('/' + path);
|
||||
});
|
||||
*/
|
||||
|
||||
filesToCache.forEach(function (file, i) {
|
||||
filesToCache[i] += ('?' + version);
|
||||
});
|
||||
|
||||
var openCache = function (name) {
|
||||
return self.caches.open(name);
|
||||
};
|
||||
|
||||
var deleteCache = function (name) {
|
||||
return self.caches.delete(name);
|
||||
};
|
||||
|
||||
var cacheResponse = function (cache, request, response) {
|
||||
cache.put(request.clone(), response.clone());
|
||||
};
|
||||
|
||||
var listCaches = function () {
|
||||
return self.caches.keys();
|
||||
};
|
||||
|
||||
var matchCache = function (req, opt) {
|
||||
return self.caches.match(req, opt);
|
||||
};
|
||||
|
||||
var handleApiConfig = function (event) {
|
||||
//console.log("API CONFIG");
|
||||
var request = new Request('/api/config');
|
||||
event.respondWith(
|
||||
fetch(request)
|
||||
.then(function (response) {
|
||||
//console.log("API CONFIG", request, response);
|
||||
if (!response.ok) {
|
||||
return matchCache('/api/config', {
|
||||
ignoreSearch: true,
|
||||
});
|
||||
//throw new Error("oops");
|
||||
}
|
||||
|
||||
// XXX always cache the latest /api/config
|
||||
return openCache(version).then(function (cache) {
|
||||
//console.log('API CONFIG REQUEST', request.clone());
|
||||
cacheResponse(cache, event.request, response);
|
||||
return response.clone();
|
||||
}).catch(function (err) {
|
||||
console.error(err);
|
||||
});
|
||||
//return response.clone();
|
||||
})
|
||||
.catch(function (/* err */) {
|
||||
//console.error(err);
|
||||
console.error("failed /api/config fetch");
|
||||
//console.log(caches.match('/api/config'));
|
||||
|
||||
// XXX respond with most recently cached /api/config
|
||||
return matchCache(event.request.clone(), {
|
||||
ignoreSearch: true,
|
||||
})
|
||||
//'api/config')
|
||||
.then(function (response) {
|
||||
/* 0 && response.clone().text().then(function (data) {
|
||||
console.log('response.text', data);
|
||||
}); */
|
||||
//console.log('response.text', response.clone().text());
|
||||
|
||||
//console.log("falling back to cached /api/config");
|
||||
return response.clone();
|
||||
});
|
||||
})
|
||||
);
|
||||
};
|
||||
|
||||
var handleDefaultFetch = function (event) {
|
||||
event.respondWith(
|
||||
matchCache(event.request)
|
||||
.then(function (response) {
|
||||
if (response) { return response; }
|
||||
return openCache(version).then(function (cache) {
|
||||
console.log('Network request for ', event.request.url);
|
||||
return fetch(event.request.clone())
|
||||
.then(function (response) {
|
||||
if (response.ok) {
|
||||
cache.put(event.request, response.clone());
|
||||
}
|
||||
return response.clone();
|
||||
}).catch(function (/*err*/) {
|
||||
console.error('FAILED FETCH for url [%s]', new URL(event.request.url).pathname);
|
||||
return matchCache('/common/offline.html', {
|
||||
ignoreSearch: true,
|
||||
});
|
||||
//console.error(err);
|
||||
});
|
||||
});
|
||||
}).catch(error => {
|
||||
console.error(error);
|
||||
// unexpected error. allow default behaviour
|
||||
})
|
||||
);
|
||||
};
|
||||
|
||||
var handleFetch = function (event) {
|
||||
if (event.request.method !== 'GET') { return; }
|
||||
var url = new URL(event.request.url);
|
||||
if (url.pathname === '/sw.js') { return; }
|
||||
|
||||
//console.log(url);
|
||||
//console.log('Fetch event for ', event.request.url, event.request);
|
||||
if (/^\/api\/config/.test(url.pathname)) {
|
||||
return void handleApiConfig(event);
|
||||
}
|
||||
handleDefaultFetch(event);
|
||||
};
|
||||
|
||||
self.addEventListener('fetch', handleFetch);
|
||||
|
||||
self.addEventListener('unhandledrejection', function(event) {
|
||||
console.error('Unhandled rejection (promise: ', event.promise, ', reason: ', event.reason, ').');
|
||||
throw new Error();
|
||||
});
|
||||
|
||||
var claimClients = function () {
|
||||
clients.claim(); // jshint ignore:line
|
||||
};
|
||||
|
||||
self.addEventListener('install', function (event) {
|
||||
event.waitUntil(
|
||||
openCache(version).then(function (cache) {
|
||||
return cache.addAll(filesToCache);
|
||||
})
|
||||
.then(function () {
|
||||
return self.skipWaiting();
|
||||
}).catch(function (err) {
|
||||
console.error(err);
|
||||
})
|
||||
);
|
||||
});
|
||||
|
||||
self.addEventListener('activate', function (event) {
|
||||
// evict older versions of files you've cached
|
||||
console.log("activating %s", version);
|
||||
|
||||
event.waitUntil(
|
||||
listCaches()
|
||||
.then(keys => Promise.all(
|
||||
keys.map(key => {
|
||||
if (key !== version) {
|
||||
console.log('Evicting cache: [%s]', key);
|
||||
return deleteCache(key);
|
||||
}
|
||||
})
|
||||
)).then(() => {
|
||||
console.log('version %s now ready to handle fetches!', version);
|
||||
claimClients();
|
||||
})
|
||||
);
|
||||
});
|
||||
|
|
@ -5,6 +5,7 @@
|
|||
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="referrer" content="no-referrer" />
|
||||
<link rel="manifest" href="/manifest.webmanifest">
|
||||
<script async data-bootload="main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
|
||||
<link href="/customize/src/outer.css?ver=1.1" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="referrer" content="no-referrer" />
|
||||
<link rel="manifest" href="/manifest.webmanifest">
|
||||
<script async data-bootload="main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
|
||||
<link href="/customize/src/outer.css?ver=1.1" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="referrer" content="no-referrer" />
|
||||
<link rel="manifest" href="/manifest.webmanifest">
|
||||
<script async data-bootload="/common/sframe-app-outer.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
|
||||
<link href="/customize/src/outer.css?ver=1.1" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="referrer" content="no-referrer" />
|
||||
<link rel="manifest" href="/manifest.webmanifest">
|
||||
<script async data-bootload="main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
|
||||
<style>
|
||||
html, body {
|
||||
|
|
Loading…
Reference in a new issue