diff options
author | Julius Härtl <jus@bitgrid.net> | 2019-01-04 11:24:50 +0100 |
---|---|---|
committer | Julius Härtl <jus@bitgrid.net> | 2019-01-17 10:35:19 +0100 |
commit | a36604d2ec68a99db6c84f6ad5ad99cbb9764040 (patch) | |
tree | 6f065ac6e7bba588cb8e5ac3851281f5976d42b0 | |
parent | ac6ee0b8b7d06deb5285b99ed55df5baae9d821f (diff) | |
download | nextcloud-server-a36604d2ec68a99db6c84f6ad5ad99cbb9764040.tar.gz nextcloud-server-a36604d2ec68a99db6c84f6ad5ad99cbb9764040.zip |
Add public API for loading js files asynchronously
Signed-off-by: Julius Härtl <jus@bitgrid.net>
-rw-r--r-- | core/js/js.js | 4 | ||||
-rw-r--r-- | core/src/OCP/index.js | 11 | ||||
-rw-r--r-- | core/src/OCP/loader.js | 80 | ||||
-rw-r--r-- | core/src/main.js | 2 |
4 files changed, 96 insertions, 1 deletions
diff --git a/core/js/js.js b/core/js/js.js index a99a6d547d7..73a9c32a91a 100644 --- a/core/js/js.js +++ b/core/js/js.js @@ -39,7 +39,7 @@ function escapeHTML(s) { } /** @namespace OCP */ -var OCP = {}, +var OCP = Object.assign({}, window.OCP), /** * @namespace OC */ @@ -367,6 +367,7 @@ var OCP = {}, * @param {string} app the app id to which the script belongs * @param {string} script the filename of the script * @param ready event handler to be called when the script is loaded + * @deprecated 16.0.0 Use OCP.Loader.loadScript */ addScript:function(app,script,ready){ var deferred, path=OC.filePath(app,'js',script+'.js'); @@ -387,6 +388,7 @@ var OCP = {}, * Loads a CSS file * @param {string} app the app id to which the css style belongs * @param {string} style the filename of the css file + * @deprecated 16.0.0 Use OCP.Loader.loadStylesheet */ addStyle:function(app,style){ var path=OC.filePath(app,'css',style+'.css'); diff --git a/core/src/OCP/index.js b/core/src/OCP/index.js new file mode 100644 index 00000000000..db622f20f78 --- /dev/null +++ b/core/src/OCP/index.js @@ -0,0 +1,11 @@ +/** + * + */ +import loader from './loader' + +/** @namespace OCP */ +const OCP = { + Loader: loader, +}; + +window['OCP'] = Object.assign({}, window.OCP, OCP) diff --git a/core/src/OCP/loader.js b/core/src/OCP/loader.js new file mode 100644 index 00000000000..9f551b90a1f --- /dev/null +++ b/core/src/OCP/loader.js @@ -0,0 +1,80 @@ +/* + * @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net> + * + * @author Julius Härtl <jus@bitgrid.net> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +let loadedScripts = {}; +let loadedStylesheets = {}; +/** + * @namespace OCP + * @class Loader + */ +export default { + + + /** + * Load a script asynchronously + * + * @param {string} app + * @param {string} file + * @returns {Promise} + */ + loadScript: function(app, file) { + const key = app + file; + if (loadedScripts.hasOwnProperty(key)) { + return Promise.resolve(); + } + loadedScripts[key] = true; + return new Promise(function (resolve, reject) { + var scriptPath = OC.filePath(app, 'js', file); + var script = document.createElement('script'); + script.src = scriptPath; + script.setAttribute('nonce', btoa(OC.requestToken)); + script.onload = () => resolve(); + script.onerror = () => reject(`Failed to load script from ${scriptPath}`); + document.head.appendChild(script); + }); + }, + + /** + * Load a stylesheet file asynchronously + * + * @param {string} app + * @param {string} file + * @returns {Promise} + */ + loadStylesheet: function(app, file) { + const key = app + file; + if (loadedStylesheets.hasOwnProperty(key)) { + return Promise.resolve(); + } + loadedStylesheets[key] = true; + return new Promise(function (resolve, reject) { + var stylePath = OC.filePath(app, 'css', file); + var link = document.createElement('link'); + link.href = stylePath; + link.type = 'text/css'; + link.rel = 'stylesheet'; + link.onload = () => resolve(); + link.onerror = () => reject(`Failed to load stylesheet from ${stylePath}`); + document.head.appendChild(link); + }); + }, +} diff --git a/core/src/main.js b/core/src/main.js index af824d9ac61..e7041e975f5 100644 --- a/core/src/main.js +++ b/core/src/main.js @@ -22,3 +22,5 @@ import '@babel/polyfill' import './globals' + +import './OCP/index' |