diff --git a/addons/web/static/src/js/core.js b/addons/web/static/src/js/core.js
index c64da7e5810..29f6c3e4d9e 100644
--- a/addons/web/static/src/js/core.js
+++ b/addons/web/static/src/js/core.js
@@ -345,31 +345,16 @@ instance.web.Session.include( /** @lends instance.web.Session# */{
load_css: function (files) {
var self = this;
_.each(files, function (file) {
- $('head').append($('', {
- 'href': self.url(file, null),
- 'rel': 'stylesheet',
- 'type': 'text/css'
- }));
+ openerp.loadCSS(self.url(file, null));
});
},
load_js: function(files) {
var self = this;
var d = $.Deferred();
- if(files.length !== 0) {
+ if (files.length !== 0) {
var file = files.shift();
- var tag = document.createElement('script');
- tag.type = 'text/javascript';
- tag.src = self.url(file, null);
- tag.onload = tag.onreadystatechange = function() {
- if ( (tag.readyState && tag.readyState != "loaded" && tag.readyState != "complete") || tag.onload_done )
- return;
- tag.onload_done = true;
- self.load_js(files).done(function () {
- d.resolve();
- });
- };
- var head = document.head || document.getElementsByTagName('head')[0];
- head.appendChild(tag);
+ var url = self.url(file, null);
+ openerp.loadJS(url).done(d.resolve);
} else {
d.resolve();
}
diff --git a/addons/web/static/src/js/openerpframework.js b/addons/web/static/src/js/openerpframework.js
index 5dcc2197944..f190fefeba3 100644
--- a/addons/web/static/src/js/openerpframework.js
+++ b/addons/web/static/src/js/openerpframework.js
@@ -933,6 +933,46 @@ openerp.jsonpRpc = function(url, fct_name, params, settings) {
});
};
+openerp.loadCSS = function (url) {
+ if (!$('link[href="' + url + '"]').length) {
+ $('head').append($('', {
+ 'href': url,
+ 'rel': 'stylesheet',
+ 'type': 'text/css'
+ }));
+ }
+};
+openerp.loadJS = function (url) {
+ var def = $.Deferred();
+ if ($('script[src="' + url + '"]').length) {
+ def.resolve();
+ } else {
+ var script = document.createElement('script');
+ script.type = 'text/javascript';
+ script.src = url;
+ script.onload = script.onreadystatechange = function() {
+ if ((script.readyState && script.readyState != "loaded" && script.readyState != "complete") || script.onload_done) {
+ return;
+ }
+ script.onload_done = true;
+ def.resolve(url);
+ };
+ script.onerror = function () {
+ console.error("Error loading file", script.src);
+ def.reject(url);
+ };
+ var head = document.head || document.getElementsByTagName('head')[0];
+ head.appendChild(script);
+ }
+ return def;
+};
+openerp.loadBundle = function (name) {
+ return $.when(
+ openerp.loadCSS('/web/css/' + name),
+ openerp.loadJS('/web/js/' + name)
+ );
+};
+
var realSetTimeout = function(fct, millis) {
var finished = new Date().getTime() + millis;
var wait = function() {