diff --git a/packages/overlay/src/vaadin-overlay-mixin.js b/packages/overlay/src/vaadin-overlay-mixin.js index ace0b77506d..32c639815db 100644 --- a/packages/overlay/src/vaadin-overlay-mixin.js +++ b/packages/overlay/src/vaadin-overlay-mixin.js @@ -583,6 +583,7 @@ export const OverlayMixin = (superClass) => this.dispatchEvent(evt); if (this.opened && !evt.defaultPrevented) { + event.preventDefault(); this.close(event); } } diff --git a/packages/overlay/test/interactions.test.js b/packages/overlay/test/interactions.test.js index 3a3a69f5a50..77ecccb759f 100644 --- a/packages/overlay/test/interactions.test.js +++ b/packages/overlay/test/interactions.test.js @@ -61,6 +61,28 @@ describe('interactions', () => { expect(overlay.opened).to.be.true; }); + it('should prevent default on the Escape keydown event when closing', () => { + const spy = sinon.spy(); + document.addEventListener('keydown', spy, { once: true }); + + escKeyDown(document.body); + + expect(overlay.opened).to.be.false; + expect(spy.firstCall.args[0].defaultPrevented).to.be.true; + }); + + it('should not prevent default on the Escape keydown event if overlay-escape-press is cancelled', () => { + overlay.addEventListener('vaadin-overlay-escape-press', (e) => e.preventDefault()); + + const spy = sinon.spy(); + document.addEventListener('keydown', spy, { once: true }); + + escKeyDown(document.body); + + expect(overlay.opened).to.be.true; + expect(spy.firstCall.args[0].defaultPrevented).to.be.false; + }); + it('should not close on Esc if the keydown event was prevented', () => { overlay.addEventListener('keydown', (e) => e.preventDefault());