diff options
| author | Aaron Bohy <aab@odoo.com> | 2020-06-08 11:50:24 +0000 |
|---|---|---|
| committer | Aaron Bohy <aab@odoo.com> | 2020-07-13 12:55:07 +0000 |
| commit | af85bb5e13b9c97d022a721bd782a37d718e4496 (patch) | |
| tree | 731c1983542ec3fc07b3b70832659d5ad803252d /addons/web | |
| parent | ce3c7d8714c330b8344ffb76245c364045cbf62f (diff) | |
[IMP] web,*: do not deploy services in tests
*mail,point_of_sale,web_editor,website
In the tests, required services are deployed for each test
independently. There is no need to have, in additon, all services
deployed globally. Worse, it could conflict and lead to unexpected
results.
This commit ensures services are no longer deployed globally in
tests. It turns the module 'web.env' into a declarative module with
no side-effect, by moving the service deployment to main.js, which
isn't added to the tests page.
Task 2287397
closes odoo/odoo#53817
Signed-off-by: Lucas Perais (lpe) <lpe@odoo.com>
Diffstat (limited to 'addons/web')
| -rw-r--r-- | addons/web/static/src/js/common_env.js | 37 | ||||
| -rw-r--r-- | addons/web/static/src/js/core/abstract_service.js | 45 | ||||
| -rw-r--r-- | addons/web/static/src/js/main.js | 11 | ||||
| -rw-r--r-- | addons/web/static/src/js/public/public_root_instance.js | 6 | ||||
| -rw-r--r-- | addons/web/static/tests/main_tests.js | 19 | ||||
| -rw-r--r-- | addons/web/views/webclient_templates.xml | 7 |
6 files changed, 77 insertions, 48 deletions
diff --git a/addons/web/static/src/js/common_env.js b/addons/web/static/src/js/common_env.js index 567607d50b5..792c3b966d4 100644 --- a/addons/web/static/src/js/common_env.js +++ b/addons/web/static/src/js/common_env.js @@ -19,7 +19,7 @@ odoo.define("web.commonEnv", function (require) { const { jsonRpc } = require("web.ajax"); const { device, isDebug } = require("web.config"); - const { bus, serviceRegistry } = require("web.core"); + const { bus } = require("web.core"); const rpc = require("web.rpc"); const session = require("web.session"); const { _t } = require("web.translation"); @@ -97,40 +97,5 @@ odoo.define("web.commonEnv", function (require) { session, }; - - // Deploy services in the env (specializations of AbstractService registered - // into the serviceRegistry) - const UndeployedServices = Object.assign({}, serviceRegistry.map); - function _deployServices() { - let done = false; - while (!done) { - // find a service with no missing dependency - const serviceName = Object.keys(UndeployedServices).find(serviceName => { - const Service = UndeployedServices[serviceName]; - return Service.prototype.dependencies.every(depName => { - return env.services[depName]; - }); - }); - if (serviceName) { - const Service = UndeployedServices[serviceName]; - const service = new Service(env); - env.services[serviceName] = service; - delete UndeployedServices[serviceName]; - service.start(); - } else { - done = true; - } - } - } - serviceRegistry.onAdd((serviceName, Service) => { - if (serviceName in env.services || serviceName in UndeployedServices) { - throw new Error(`Service ${serviceName} is already loaded.`); - } - UndeployedServices[serviceName] = Service; - _deployServices(); - }); - _deployServices(); - - return env; }); diff --git a/addons/web/static/src/js/core/abstract_service.js b/addons/web/static/src/js/core/abstract_service.js index f9ad859fef2..5157b5b55f4 100644 --- a/addons/web/static/src/js/core/abstract_service.js +++ b/addons/web/static/src/js/core/abstract_service.js @@ -2,6 +2,7 @@ odoo.define('web.AbstractService', function (require) { "use strict"; var Class = require('web.Class'); +const { serviceRegistry } = require("web.core"); var Mixins = require('web.mixins'); var ServicesMixin = require('web.ServicesMixin'); @@ -40,6 +41,50 @@ var AbstractService = Class.extend(Mixins.EventDispatcherMixin, ServicesMixin, { this.env.bus.trigger('do-action', payload); } }, + + //-------------------------------------------------------------------------- + // Static + //-------------------------------------------------------------------------- + + /** + * Deploy services in the env (specializations of AbstractService registered + * into the serviceRegistry). + * + * @static + * @param {Object} env + */ + deployServices(env) { + const UndeployedServices = Object.assign({}, serviceRegistry.map); + function _deployServices() { + let done = false; + while (!done) { + // find a service with no missing dependency + const serviceName = Object.keys(UndeployedServices).find(serviceName => { + const Service = UndeployedServices[serviceName]; + return Service.prototype.dependencies.every(depName => { + return env.services[depName]; + }); + }); + if (serviceName) { + const Service = UndeployedServices[serviceName]; + const service = new Service(env); + env.services[serviceName] = service; + delete UndeployedServices[serviceName]; + service.start(); + } else { + done = true; + } + } + } + serviceRegistry.onAdd((serviceName, Service) => { + if (serviceName in env.services || serviceName in UndeployedServices) { + throw new Error(`Service ${serviceName} is already loaded.`); + } + UndeployedServices[serviceName] = Service; + _deployServices(); + }); + _deployServices(); + } }); return AbstractService; diff --git a/addons/web/static/src/js/main.js b/addons/web/static/src/js/main.js index 49b90228ba2..465ea0d63d4 100644 --- a/addons/web/static/src/js/main.js +++ b/addons/web/static/src/js/main.js @@ -1,18 +1,20 @@ odoo.define('web.web_client', function (require) { "use strict"; + const AbstractService = require('web.AbstractService'); const env = require('web.env'); const session = require("web.session"); const WebClient = require('web.WebClient'); + // configure the env and set it on Owl Component owl.config.mode = env.isDebug() ? "dev" : "prod"; owl.Component.env = env; - const webClient = new WebClient(); + // deploy services in the env + AbstractService.prototype.deployServices(env); - /** - * Add the owl templates to the environment and start the web client. - */ + // add the owl templates to the environment and start the web client + const webClient = new WebClient(); async function startWebClient() { await session.is_bound; env.qweb.addTemplates(session.owlTemplates); @@ -21,7 +23,6 @@ odoo.define('web.web_client', function (require) { webClient.setElement($(document.body)); webClient.start(); } - startWebClient(); return webClient; diff --git a/addons/web/static/src/js/public/public_root_instance.js b/addons/web/static/src/js/public/public_root_instance.js index e368d421fbe..a7422a97c26 100644 --- a/addons/web/static/src/js/public/public_root_instance.js +++ b/addons/web/static/src/js/public/public_root_instance.js @@ -1,6 +1,7 @@ odoo.define('root.widget', function (require) { 'use strict'; +const AbstractService = require('web.AbstractService'); const env = require('web.public_env'); var lazyloader = require('web.public.lazyloader'); var rootData = require('web.public.root'); @@ -12,6 +13,11 @@ owl.config.mode = env.isDebug() ? "dev" : "prod"; owl.Component.env = env; /** + * Deploy services in the env + */ +AbstractService.prototype.deployServices(env); + +/** * This widget is important, because the tour manager needs a root widget in * order to work. The root widget must be a service provider with the ajax * service, so that the tour manager can let the server know when tours have diff --git a/addons/web/static/tests/main_tests.js b/addons/web/static/tests/main_tests.js index 97d9b051bbb..30164cea61b 100644 --- a/addons/web/static/tests/main_tests.js +++ b/addons/web/static/tests/main_tests.js @@ -3,14 +3,23 @@ odoo.define('web.web_client', async function (require) { "use strict"; const session = require("web.session"); - const WebClient = require('web.WebClient'); + const { bus } = require('web.core'); - owl.config.mode = "dev"; + // listen to unhandled rejected promises, and when the rejection is not due + // to a crash, prevent the browser from displaying an 'unhandledrejection' + // error in the console, which would make tests crash on each Promise.reject() + // something similar is done by the CrashManagerService, but by default, it + // isn't deployed in tests + bus.on('crash_manager_unhandledrejection', this, function (ev) { + if (!ev.reason || !(ev.reason instanceof Error)) { + ev.stopPropagation(); + ev.stopImmediatePropagation(); + ev.preventDefault(); + } + }); - const webClient = new WebClient(); + owl.config.mode = "dev"; await session.is_bound; session.owlTemplates = session.owlTemplates.replace(/t-transition/g, 'transition'); - - return webClient; }); diff --git a/addons/web/views/webclient_templates.xml b/addons/web/views/webclient_templates.xml index c074328ac60..0323694b5c4 100644 --- a/addons/web/views/webclient_templates.xml +++ b/addons/web/views/webclient_templates.xml @@ -879,6 +879,10 @@ </t> </template> + <template id="web.assets_backend_prod_only"> + <script type="text/javascript" src="/web/static/src/js/main.js"></script> + </template> + <template id="web.webclient_bootstrap"> <t t-call="web.layout"> <t t-set="head_web"> @@ -891,9 +895,8 @@ <t t-call-assets="web.assets_backend" t-js="false"/> <t t-call-assets="web.assets_common" t-css="false"/> <t t-call-assets="web.assets_backend" t-css="false"/> + <t t-call-assets="web.assets_backend_prod_only" t-css="false"/> <t t-call="web.conditional_assets_tests"/> - - <script type="text/javascript" src="/web/static/src/js/main.js"></script> </t> <t t-set="head" t-value="head_web + (head or '')"/> <t t-set="body_classname" t-value="'o_web_client'"/> |
