From 480b3ab1488bf69f3397f3f094a6b6d8b9585482 Mon Sep 17 00:00:00 2001 From: scottkiener-at-safelite Date: Mon, 29 Jun 2026 09:32:03 -0400 Subject: [PATCH] Intercept keystrokes via overlay --- .../intercept-overlay.spec.js | 29 +++++++++++++++++++ .../intercept-overlay/intercept-overlay.vue | 14 ++++++++- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/ux-components/intercept-overlay/intercept-overlay.spec.js b/src/ux-components/intercept-overlay/intercept-overlay.spec.js index f3854a47a..0a282b93d 100644 --- a/src/ux-components/intercept-overlay/intercept-overlay.spec.js +++ b/src/ux-components/intercept-overlay/intercept-overlay.spec.js @@ -14,4 +14,33 @@ describe("intercept-overlay.vue", () => { expect(wrapper.text()).toBe(""); wrapper.unmount(); }); + + describe("keyboard interception", () => { + test("adds a capturing keydown listener on mount and removes it on unmount", () => { + const addSpy = jest.spyOn(document, "addEventListener"); + const removeSpy = jest.spyOn(document, "removeEventListener"); + + const wrapper = shallowMount(interceptOverlay); + expect(addSpy).toHaveBeenCalledWith("keydown", expect.any(Function), true); + + const [, handler] = addSpy.mock.calls.find( + ([type, , capture]) => type === "keydown" && capture === true + ); + + wrapper.unmount(); + expect(removeSpy).toHaveBeenCalledWith("keydown", handler, true); + + addSpy.mockRestore(); + removeSpy.mockRestore(); + }); + + test("blockKey prevents default and stops immediate propagation", () => { + const wrapper = shallowMount(interceptOverlay); + const event = { preventDefault: jest.fn(), stopImmediatePropagation: jest.fn() }; + wrapper.vm.blockKey(event); + expect(event.preventDefault).toHaveBeenCalled(); + expect(event.stopImmediatePropagation).toHaveBeenCalled(); + wrapper.unmount(); + }); + }); }); diff --git a/src/ux-components/intercept-overlay/intercept-overlay.vue b/src/ux-components/intercept-overlay/intercept-overlay.vue index 1a101589a..1269ccb9d 100644 --- a/src/ux-components/intercept-overlay/intercept-overlay.vue +++ b/src/ux-components/intercept-overlay/intercept-overlay.vue @@ -1,10 +1,22 @@