1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- import { ajax } from 'wizard/lib/ajax';
- const _loaded = {};
- const _loading = {};
- function loadWithTag(path, cb) {
- const head = document.getElementsByTagName('head')[0];
- let finished = false;
- let s = document.createElement('script');
- s.src = path;
- if (Ember.Test) {
- Ember.Test.registerWaiter(() => finished);
- }
- head.appendChild(s);
- s.onload = s.onreadystatechange = function(_, abort) {
- finished = true;
- if (abort || !s.readyState || s.readyState === "loaded" || s.readyState === "complete") {
- s = s.onload = s.onreadystatechange = null;
- if (!abort) {
- Ember.run(null, cb);
- }
- }
- };
- }
- export function loadCSS(url) {
- return loadScript(url, { css: true });
- }
- export default function loadScript(url, opts) {
- // TODO: Remove this once plugins have been updated not to use it:
- if (url === "defer/html-sanitizer-bundle") { return Ember.RSVP.Promise.resolve(); }
- opts = opts || {};
- $('script').each((i, tag) => {
- const src = tag.getAttribute('src');
- if (src && (opts.scriptTag || src !== url)) {
- _loaded[tag.getAttribute('src')] = true;
- }
- });
- return new Ember.RSVP.Promise(function(resolve) {
- url = Discourse.getURL(url);
- // If we already loaded this url
- if (_loaded[url]) { return resolve(); }
- if (_loading[url]) { return _loading[url].then(resolve);}
- let done;
- _loading[url] = new Ember.RSVP.Promise(function(_done){
- done = _done;
- });
- _loading[url].then(function(){
- delete _loading[url];
- });
- const cb = function(data) {
- if (opts && opts.css) {
- $("head").append("<style>" + data + "</style>");
- }
- done();
- resolve();
- _loaded[url] = true;
- };
- let cdnUrl = url;
- // Scripts should always load from CDN
- // CSS is type text, to accept it from a CDN we would need to handle CORS
- if (!opts.css && Discourse.CDN && url[0] === "/" && url[1] !== "/") {
- cdnUrl = Discourse.CDN.replace(/\/$/,"") + url;
- }
- // Some javascript depends on the path of where it is loaded (ace editor)
- // to dynamically load more JS. In that case, add the `scriptTag: true`
- // option.
- if (opts.scriptTag) {
- if (Ember.testing) {
- throw `In test mode scripts cannot be loaded async ${cdnUrl}`;
- }
- loadWithTag(cdnUrl, cb);
- } else {
- ajax({url: cdnUrl, dataType: opts.css ? "text": "script", cache: true}).then(cb);
- }
- });
- }
|