diff options
author | Jo-Philipp Wich <jo@mein.io> | 2020-04-12 22:54:02 +0200 |
---|---|---|
committer | Jo-Philipp Wich <jo@mein.io> | 2020-04-12 23:55:36 +0200 |
commit | 0d0ad80fd1b96ff2c33392387320ad518640782b (patch) | |
tree | 424b144c399da133da3d2e14351c40dd0e0f96b9 /modules | |
parent | fde144c9be61d7886e81240233328a61d7088d08 (diff) |
luci-base: luci.js: add ability to add "preload" classes
Extend the LuCI bootstrap procedure to scan for class files in
/www/luci-static/preload/. Any JavaScript file found there will be
required automatically before setting up the view, allowing to stage
code that should run on every page load.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Diffstat (limited to 'modules')
-rw-r--r-- | modules/luci-base/htdocs/luci-static/resources/luci.js | 65 |
1 files changed, 63 insertions, 2 deletions
diff --git a/modules/luci-base/htdocs/luci-static/resources/luci.js b/modules/luci-base/htdocs/luci-static/resources/luci.js index e1aa65a34..1ed213ebb 100644 --- a/modules/luci-base/htdocs/luci-static/resources/luci.js +++ b/modules/luci-base/htdocs/luci-static/resources/luci.js @@ -2087,7 +2087,8 @@ domParser = null, originalCBIInit = null, rpcBaseURL = null, - sysFeatures = null; + sysFeatures = null, + preloadClasses = null; /* "preload" builtin classes to make the available via require */ var classes = { @@ -2486,6 +2487,55 @@ return Promise.resolve(sysFeatures); }, + probePreloadClasses: function() { + var sessionid = classes.rpc.getSessionID(); + + if (preloadClasses == null) { + try { + var data = JSON.parse(window.sessionStorage.getItem('preloadClasses')); + + if (this.isObject(data) && this.isObject(data[sessionid])) + preloadClasses = data[sessionid]; + } + catch (e) {} + } + + if (!Array.isArray(preloadClasses)) { + preloadClasses = this.resolveDefault(classes.rpc.declare({ + object: 'file', + method: 'list', + params: [ 'path' ], + expect: { 'entries': [] } + })(this.fspath(this.resource('preload'))), []).then(function(entries) { + var classes = []; + + for (var i = 0; i < entries.length; i++) { + if (entries[i].type != 'file') + continue; + + var m = entries[i].name.match(/(.+)\.js$/); + + if (m) + classes.push('preload.%s'.format(m[1])); + } + + try { + var data = {}; + data[sessionid] = classes; + + window.sessionStorage.setItem('preloadClasses', JSON.stringify(data)); + } + catch (e) {} + + preloadClasses = classes; + + return classes; + }); + } + + return Promise.resolve(preloadClasses); + }, + /** * Test whether a particular system feature is available, such as * hostapd SAE support or an installed firewall. The features are @@ -2577,7 +2627,18 @@ L.notifySessionExpiry(); }); - return this.probeSystemFeatures().finally(this.initDOM); + return Promise.all([ + this.probeSystemFeatures(), + this.probePreloadClasses() + ]).finally(L.bind(function() { + var tasks = []; + + if (Array.isArray(preloadClasses)) + for (var i = 0; i < preloadClasses.length; i++) + tasks.push(this.require(preloadClasses[i])); + + return Promise.all(tasks); + }, this)).finally(this.initDOM); }, /* private */ |