Compare commits

...

31 commits
main ... tofu

Author SHA1 Message Date
ansuz
65dd8f1d6a WIP TOFU BOOTLOADER 2021-01-29 15:09:44 +05:30
ansuz
01cb64d07d remove some incorrectly merged code 2021-01-26 14:47:53 +05:30
ansuz
3091046705 Merge branch 'main' into a-prototype 2021-01-26 12:28:44 +05:30
ansuz
f714275cd3 merge 4.0 branch release into offline prototype 2021-01-22 17:22:01 +05:30
ansuz
53b91247a7 resolve merge conflicts from staging 2021-01-07 15:22:12 +05:30
ansuz
f72bdff252 fix incorrect merge 2020-12-29 14:29:35 +05:30
ansuz
f9031a2bce resolve merge conflicts 2020-12-29 14:21:09 +05:30
ansuz
dcb275d1c3 fix offline page loads 2020-11-23 19:01:51 +05:30
ansuz
2404a57eb8 merge staging 2020-11-23 17:25:14 +05:30
ansuz
fb1dd2d5d5 lint compliance 2020-11-10 09:47:52 +05:30
ansuz
684a86eecc merge pwa-offline-drive, minor lint compliance 2020-11-09 20:14:53 +05:30
yflory
41f4d8fc7a Merge branch 'offlineCache' into pwa-offline-drive 2020-11-09 14:30:05 +01:00
ansuz
6c134a678b handle 'DISCONNECTED' error to avoid a password prompt or a cached file 2020-11-06 19:51:56 +05:30
ansuz
077b3fe635 Merge branch 'default-avatar' into pwa-prototype 2020-11-06 13:28:17 +05:30
ansuz
c83cd5a50d Merge branch 'pwa-offline-drive' into pwa-prototype 2020-11-06 13:01:39 +05:30
ansuz
c6b3ed9bc3 resolve merge conflicts 2020-11-06 12:58:19 +05:30
ansuz
0e652872df avoid displaying a URL for the default avatar 2020-11-06 12:55:31 +05:30
ansuz
247931eece lint compliance 2020-11-06 12:22:09 +05:30
ansuz
20f30a7259 resolve merge conflict 2020-11-06 12:20:51 +05:30
ansuz
ab7db780c8 disable requirejs timeout 2020-10-29 19:06:42 +05:30
ansuz
1542d7381d serve offline page when unknown assets can't be served 2020-10-29 19:06:00 +05:30
ansuz
96f340b11c remove early prototype serviceworker code 2020-10-29 18:25:23 +05:30
ansuz
68505fe32b lots of new caching logic in the serviceworker 2020-10-29 11:59:02 +05:30
ansuz
d5c4fdd50a load the serviceworker from boot2.js, enabling it practically everywhere 2020-10-29 11:46:19 +05:30
ansuz
f583c526a8 lint compliance 2020-10-29 11:44:46 +05:30
ansuz
f879e9044a enable serviceworkers on more pages 2020-10-29 11:43:37 +05:30
ansuz
961e8afe09 continued WIP serviceworker prototype
* more advanced caching logic
* include home page and code editor in sw scope
* properly support loading while offline
2020-10-28 13:51:50 +05:30
ansuz
696f6dc137 Merge branch 'staging' into pwa-experiment 2020-10-27 13:50:31 +05:30
ansuz
16603e02dc WIP service worker investigation 2020-10-21 14:23:39 +05:30
ansuz
084af5632b try to standardize how links are opened for PWAs 2020-10-21 14:07:25 +05:30
ansuz
3fafbbc068 basic files required for testing PWAs 2020-10-20 09:20:13 +05:30
55 changed files with 434 additions and 21 deletions

View file

@ -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">

View file

@ -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">

View file

@ -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">

View file

@ -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">

View file

@ -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">

View file

@ -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">

View file

@ -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">

View file

@ -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">

View file

@ -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,

View file

@ -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),

View file

@ -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>

View file

@ -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>

View file

@ -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">

View file

@ -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>

View file

@ -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));
}
}
}

View file

@ -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);
});
});

View file

@ -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);
};

View file

@ -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) {

View file

@ -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 = {

View file

@ -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']]

View file

@ -292,6 +292,8 @@ var factory = function () {
});
}
cb(null, u8);
} else {
// XXX cb ?
}
};

View file

@ -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
View 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>

View file

@ -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");
});

View file

@ -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();
}
});

View file

@ -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)));

View file

@ -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) {

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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">

View file

@ -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
View 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": []
}

View file

@ -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 * {

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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);
}
}
}

View file

@ -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>

View file

@ -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>

View file

@ -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>', {

View file

@ -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">

View file

@ -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>

View file

@ -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');
}
}

View file

@ -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>

View file

@ -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>

View file

@ -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
View 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();
})
);
});

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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 {