diff --git a/addons/web/static/src/core/popover/popover_controller.js b/addons/web/static/src/core/popover/popover_controller.js index 32eeb20218d..b82c1fc35ce 100644 --- a/addons/web/static/src/core/popover/popover_controller.js +++ b/addons/web/static/src/core/popover/popover_controller.js @@ -42,6 +42,7 @@ export class PopoverController extends Component { !this.popoverRef.el.contains(target) ) { this.props.close(); + ev.preventDefault(); } } diff --git a/addons/web/static/tests/core/popover/popover_service_tests.js b/addons/web/static/tests/core/popover/popover_service_tests.js index 02f90c09512..619150668d5 100644 --- a/addons/web/static/tests/core/popover/popover_service_tests.js +++ b/addons/web/static/tests/core/popover/popover_service_tests.js @@ -85,6 +85,30 @@ QUnit.test("close on click away", async (assert) => { assert.containsNone(fixture, ".o_popover #comp"); }); +QUnit.test("close on click away should be default prevented", async (assert) => { + assert.expect(6); + class Comp extends Component {} + Comp.template = xml`
in popover
`; + + popovers.add(popoverTarget, Comp, {}); + await nextTick(); + + assert.containsOnce(fixture, ".o_popover"); + assert.containsOnce(fixture, ".o_popover #comp"); + const closeButton = fixture.querySelector("#close"); + function clickListener(ev) { + assert.step(`click-event-${ev.defaultPrevented ? "default-prevented" : ""}`); + } + closeButton.addEventListener("pointerdown", clickListener); + + await click(fixture, "#close"); + + assert.containsNone(fixture, ".o_popover"); + assert.containsNone(fixture, ".o_popover #comp"); + assert.verifySteps(["click-event-default-prevented"]); + closeButton.removeEventListener("pointerdown", clickListener); +}); + QUnit.test("close on 'Escape' keydown", async (assert) => { class Comp extends Component {} Comp.template = xml`
in popover
`;