diff --git a/addons/web/static/src/js/services/data_manager.js b/addons/web/static/src/js/services/data_manager.js index 5131db19028..41fc293e383 100644 --- a/addons/web/static/src/js/services/data_manager.js +++ b/addons/web/static/src/js/services/data_manager.js @@ -11,6 +11,7 @@ var utils = require('web.utils'); return core.Class.extend({ init: function () { this._init_cache(); + core.bus.on('clear_cache', this, this.invalidate.bind(this)); }, _init_cache: function () { diff --git a/addons/web/static/src/js/widgets/model_field_selector.js b/addons/web/static/src/js/widgets/model_field_selector.js index 279428e8939..6607561a2bb 100644 --- a/addons/web/static/src/js/widgets/model_field_selector.js +++ b/addons/web/static/src/js/widgets/model_field_selector.js @@ -16,6 +16,11 @@ var modelFieldsCache = { cacheDefs: {}, }; +core.bus.on('clear_cache', null, function () { + modelFieldsCache.cache = {}; + modelFieldsCache.cacheDefs = {}; +}); + /** * The ModelFieldSelector widget can be used to display/select a particular * field chain from a given model. diff --git a/addons/web/static/tests/helpers/test_utils.js b/addons/web/static/tests/helpers/test_utils.js index 3632e251a33..bc2cf05f360 100644 --- a/addons/web/static/tests/helpers/test_utils.js +++ b/addons/web/static/tests/helpers/test_utils.js @@ -252,52 +252,53 @@ function addMockEnvironment(widget, params) { logLevel: params.logLevel, currentDate: params.currentDate, }); - var widgetDestroy; - // make sure the debounce value for input fields is set to 0 var initialDebounce = DebouncedField.prototype.DEBOUNCE; DebouncedField.prototype.DEBOUNCE = params.fieldDebounce || 0; - + var initialSession, initialConfig, initialParameters; if ('session' in params) { - var initialSession = _.extend({}, session); + initialSession = _.extend({}, session); _.extend(session, params.session); - widgetDestroy = widget.destroy; - widget.destroy = function () { - for (var key in session) { + } + if ('config' in params) { + initialConfig = _.extend({}, config); + _.extend(config, params.config); + } + if ('translateParameters' in params) { + initialParameters = _.extend({}, core._t.database.parameters); + _.extend(core._t.database.parameters, params.translateParameters); + } + + var widgetDestroy = widget.destroy; + widget.destroy = function () { + // clear the caches (e.g. data_manager, ModelFieldSelector) when the + // widget is destroyed, at the end of each test to avoid collisions + core.bus.trigger('clear_cache'); + + DebouncedField.prototype.DEBOUNCE = initialDebounce; + + var key; + if ('session' in params) { + for (key in session) { delete session[key]; } _.extend(session, initialSession); - widgetDestroy.call(this); - }; - } - - if ('config' in params) { - var initialConfig = _.extend({}, config); - _.extend(config, params.config); - widgetDestroy = widget.destroy; - widget.destroy = function () { - for (var key in config) { + } + if ('config' in params) { + for (key in config) { delete config[key]; } _.extend(config, initialConfig); - DebouncedField.prototype.DEBOUNCE = initialDebounce; - widgetDestroy.call(this); - }; - } - - if ('translateParameters' in params) { - var initialParameters = _.extend({}, core._t.database.parameters); - _.extend(core._t.database.parameters, params.translateParameters); - var oldDestroy = widget.destroy; - widget.destroy = function () { - for (var key in core._t.database.parameters) { + } + if ('translateParameters' in params) { + for (key in core._t.database.parameters) { delete core._t.database.parameters[key]; } _.extend(core._t.database.parameters, initialParameters); - oldDestroy.call(this); - }; - } + } + widgetDestroy.call(this); + }; intercept(widget, 'call_service', function (event) { if (event.data.service === 'ajax') {