diff options
Diffstat (limited to 'addons/web/static/src/js/env.js')
| -rw-r--r-- | addons/web/static/src/js/env.js | 71 |
1 files changed, 65 insertions, 6 deletions
diff --git a/addons/web/static/src/js/env.js b/addons/web/static/src/js/env.js index c223fcc91ee..72d14ae3e60 100644 --- a/addons/web/static/src/js/env.js +++ b/addons/web/static/src/js/env.js @@ -1,15 +1,15 @@ odoo.define("web.env", function (require) { "use strict"; - const { _lt, _t, bus } = require("web.core"); - const { blockUI, unblockUI } = require("web.framework"); - const { device, isDebug } = require("web.config"); const { jsonRpc } = require('web.ajax'); + const { device, isDebug } = require("web.config"); + const { _lt, _t, bus, serviceRegistry } = require("web.core"); + const dataManager = require('web.data_manager'); + const { blockUI, unblockUI } = require("web.framework"); const rpc = require("web.rpc"); const session = require("web.session"); const utils = require("web.utils"); - const qweb = new owl.QWeb({ translateFn: _t }); function ajaxJsonRPC() { @@ -59,6 +59,64 @@ odoo.define("web.env", function (require) { utils.set_cookie(...arguments); } + // ServiceProvider + const services = {}; // dict containing deployed service instances + const UndeployedServices = {}; // dict containing classes of undeployed services + function _deployServices() { + let done = false; + while (!done) { + const serviceName = _.findKey(UndeployedServices, Service => { + // no missing dependency + return !_.some(Service.prototype.dependencies, depName => { + return !services[depName]; + }); + }); + if (serviceName) { + const Service = UndeployedServices[serviceName]; + // we created a patched version of the Service in which the 'trigger_up' + // function directly calls the requested service, instead of triggering + // a 'call_service' event up, which wouldn't work as services have + // no parent + const PatchedService = Service.extend({ + _trigger_up: function (ev) { + this._super(...arguments); + if (!ev.is_stopped() && ev.name === 'call_service') { + const payload = ev.data; + let args = payload.args || []; + if (payload.service === 'ajax' && payload.method === 'rpc') { + // ajax service uses an extra 'target' argument for rpc + args = args.concat(ev.target); + } + const service = services[payload.service]; + const result = service[payload.method].apply(service, args); + payload.callback(result); + } + }, + }); + const service = new PatchedService(); + services[serviceName] = service; + delete UndeployedServices[serviceName]; + service.start(); + } else { + done = true; + } + } + } + _.each(serviceRegistry.map, (Service, serviceName) => { + if (serviceName in UndeployedServices) { + throw new Error(`Service ${serviceName} is already loaded.`); + } + UndeployedServices[serviceName] = Service; + }); + serviceRegistry.onAdd((serviceName, Service) => { + if (serviceName in services || serviceName in UndeployedServices) { + throw new Error(`Service ${serviceName} is already loaded.`); + } + UndeployedServices[serviceName] = Service; + _deployServices(); + }); + _deployServices(); + // There should be as much dependencies as possible in the env object. // This will allow an easier testing of components. // See https://github.com/odoo/owl/blob/master/doc/reference/environment.md#content-of-an-environment @@ -67,10 +125,11 @@ odoo.define("web.env", function (require) { _lt, _t, bus, + dataManager, device, isDebug, qweb, - services: { + services: Object.assign(services, { ajaxJsonRPC, blockUI, getCookie, @@ -80,7 +139,7 @@ odoo.define("web.env", function (require) { rpc: performRPC, setCookie, unblockUI, - }, + }), session, }; }); |
