diff --git a/addons/web/static/src/owl2_compatibility/event_target.js b/addons/web/static/src/owl2_compatibility/event_target.js index 868ea2a7e71..f56a99a5cd3 100644 --- a/addons/web/static/src/owl2_compatibility/event_target.js +++ b/addons/web/static/src/owl2_compatibility/event_target.js @@ -33,8 +33,8 @@ for (const callback of cbs) { this.removeEventListener(type, callback); } - delete cbs[type]; - if (Object.keys(cbs).length === 0) { + delete listeners[type]; + if (Object.keys(listeners).length === 0) { this.targetsCallbacks.delete(target); } } diff --git a/addons/web/static/tests/legacy/owl_compatibility_tests.js b/addons/web/static/tests/legacy/owl_compatibility_tests.js index 9a398020ab3..ded9e1e7107 100644 --- a/addons/web/static/tests/legacy/owl_compatibility_tests.js +++ b/addons/web/static/tests/legacy/owl_compatibility_tests.js @@ -21,6 +21,7 @@ const { Component, + EventBus, onError, onMounted, onWillDestroy, @@ -1677,4 +1678,30 @@ await mount(MyComponent, getFixture(), { env: legacyEnv }); }); + + QUnit.module("EventBus"); + + QUnit.test("unregister multiple listener from the same target", async function (assert) { + const target = Symbol("test"); + const bus = new EventBus(); + let i = 0; + + bus.on("a", target, () => assert.step(`a:${i++}`)); + bus.on("b", target, () => assert.step(`b:${i++}`)); + + bus.trigger("a"); + bus.trigger("b"); + + bus.off("a", target); + bus.off("b", target); + + bus.trigger("a"); + bus.trigger("b"); + + assert.verifySteps([ + "a:0", + "b:1", + ], "callback should not be called after unregistering them"); + }); + });