diff --git a/addons/bus/static/tests/helpers/mock_websocket.js b/addons/bus/static/tests/helpers/mock_websocket.js index ab5b04a2f1f..5fa2e7e66b9 100644 --- a/addons/bus/static/tests/helpers/mock_websocket.js +++ b/addons/bus/static/tests/helpers/mock_websocket.js @@ -73,7 +73,12 @@ export function patchWebsocketWorkerWithCleanup(params = {}) { websocketWorker = websocketWorker || new WebsocketWorker('wss://odoo.com/websocket'); patchWithCleanup(browser, { SharedWorker: function () { - return new SharedWorkerMock(websocketWorker); + const sharedWorker = new SharedWorkerMock(websocketWorker); + registerCleanup(() => { + sharedWorker._messageChannel.port1.close(); + sharedWorker._messageChannel.port2.close(); + }); + return sharedWorker; }, }, { pure: true }); registerCleanup(() => { diff --git a/addons/web/static/src/owl2_compatibility/event_target.js b/addons/web/static/src/owl2_compatibility/event_target.js index 8ef1c23ef29..868ea2a7e71 100644 --- a/addons/web/static/src/owl2_compatibility/event_target.js +++ b/addons/web/static/src/owl2_compatibility/event_target.js @@ -14,20 +14,29 @@ } on(type, target, callback) { if (!this.targetsCallbacks.has(target)) { - this.targetsCallbacks.set(target, []); + this.targetsCallbacks.set(target, {}); } callback = wrapCallback(target, callback); - this.targetsCallbacks.get(target).push(callback); + const listeners = this.targetsCallbacks.get(target); + if (!listeners[type]) { + listeners[type] = new Set(); + } + listeners[type].add(callback); return this.addEventListener(type, callback); } off(type, target) { - const cbs = this.targetsCallbacks.get(target); - if (!cbs) { + const listeners = this.targetsCallbacks.get(target); + if (!listeners || !Object.hasOwnProperty.call(listeners, type)) { return; } + const cbs = listeners[type]; for (const callback of cbs) { this.removeEventListener(type, callback); } + delete cbs[type]; + if (Object.keys(cbs).length === 0) { + this.targetsCallbacks.delete(target); + } } }; })();