summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js
diff options
context:
space:
mode:
Diffstat (limited to 'addons/web/static/src/js')
-rw-r--r--addons/web/static/src/js/boot.js63
1 files changed, 53 insertions, 10 deletions
diff --git a/addons/web/static/src/js/boot.js b/addons/web/static/src/js/boot.js
index 19fb4c51204..dc4ea5b337c 100644
--- a/addons/web/static/src/js/boot.js
+++ b/addons/web/static/src/js/boot.js
@@ -5,6 +5,10 @@
/**
* @name openerp
* @namespace openerp
+ *
+ * Modules can return a deferred the module is mark as loaded only when
+ * the deferred is resolved, and the service value equal the resolved value.
+ * The module can be rejected (unloaded) and logged as info.
*/
(function() {
@@ -14,6 +18,7 @@
var factories = Object.create(null);
var job_names = [];
var job_deps = [];
+ var job_deferred = [];
var services = Object.create({
qweb: new QWeb2.Engine(),
@@ -29,6 +34,7 @@
var odoo = window.odoo = {
testing: typeof QUnit === "object",
debug: debug,
+ remaining_jobs: jobs,
__DEBUG__: {
get_dependencies: function (name, transitive) {
@@ -122,7 +128,11 @@
odoo.__DEBUG__.web_client = services['web.web_client'];
if (jobs.length) {
- var debug_jobs = {}, job;
+ var debug_jobs = {};
+ var rejected = [];
+ var rejected_linked = [];
+ var job;
+ var jobdep;
for (var k=0; k<jobs.length; k++) {
debug_jobs[jobs[k].name] = job = {
@@ -133,13 +143,26 @@
if (jobs[k].error) {
job.error = jobs[k].error;
}
+ if (jobs[k].rejected) {
+ job.rejected = jobs[k].rejected;
+ rejected.push(job.name);
+ }
var deps = odoo.__DEBUG__.get_dependencies( job.name );
for (var i=0; i<deps.length; i++) {
if (job.name !== deps[i] && !(deps[i] in services)) {
- if (!job.missing) {
- job.missing = [];
+ jobdep = debug_jobs[deps[i]] || (deps[i] in factories && _.find(jobs, function (job) { return job.name === deps[i];}));
+ if (jobdep && jobdep.rejected) {
+ if (!job.rejected) {
+ job.rejected = [];
+ rejected_linked.push(job.name);
+ }
+ job.rejected.push(deps[i]);
+ } else {
+ if (!job.missing) {
+ job.missing = [];
+ }
+ job.missing.push(deps[i]);
}
- job.missing.push(deps[i]);
}
}
}
@@ -152,20 +175,34 @@
}
},
process_jobs: function (jobs, services) {
- var job, require;
- while (jobs.length && (job = _.find(jobs, is_ready))) {
- require = make_require(job);
+ var job;
+ var require;
+ var time;
+
+ function process_job (job) {
+ var require = make_require(job);
try {
- services[job.name] = job.factory.call(null, require);
+ var def = $.Deferred();
+ $.when(job.factory.call(null, require)).then(
+ function (data) {
+ services[job.name] = data;
+ clearTimeout(time);
+ time = _.defer(odoo.process_jobs, jobs, services);
+ def.resolve();
+ }, function (e) {
+ job.rejected = e || true;
+ jobs.push(job);
+ def.resolve();
+ });
jobs.splice(jobs.indexOf(job), 1);
+ job_deferred.push(def);
} catch (e) {
job.error = e;
}
}
- return services;
function is_ready (job) {
- return !job.error && _.every(job.factory.deps, function (name) { return name in services; });
+ return !job.error && !job.rejected && _.every(job.factory.deps, function (name) { return name in services; });
}
function make_require (job) {
@@ -183,6 +220,12 @@
require.__require_calls = 0;
return require;
}
+
+ while (jobs.length && (job = _.find(jobs, is_ready))) {
+ process_job(job);
+ }
+
+ return services;
}
};