summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js/env.js
diff options
context:
space:
mode:
Diffstat (limited to 'addons/web/static/src/js/env.js')
-rw-r--r--addons/web/static/src/js/env.js71
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,
};
});