diff --git a/src/gui/suggesters/suggest.test.ts b/src/gui/suggesters/suggest.test.ts new file mode 100644 index 00000000..341e07e8 --- /dev/null +++ b/src/gui/suggesters/suggest.test.ts @@ -0,0 +1,55 @@ +import type { App } from "obsidian"; +import { afterEach, describe, expect, it, vi } from "vitest"; +import { GenericTextSuggester } from "./genericTextSuggester"; + +function createApp(): App { + return { + dom: { + appContainerEl: document.body, + }, + keymap: { + pushScope: vi.fn(), + popScope: vi.fn(), + }, + } as unknown as App; +} + +describe("TextInputSuggest", () => { + afterEach(() => { + document.body.replaceChildren(); + }); + + it("keeps focus during suggestion mousedown so click selection can run", async () => { + const input = document.createElement("input"); + input.trigger = (eventName: string) => { + input.dispatchEvent(new Event(eventName, { bubbles: true })); + }; + document.body.appendChild(input); + + new GenericTextSuggester(createApp(), input, ["Adventure"]); + + input.focus(); + input.value = "Adv"; + input.dispatchEvent(new Event("input", { bubbles: true })); + await Promise.resolve(); + + const suggestion = document.querySelector(".suggestion-item"); + expect(suggestion?.textContent).toBe("Adventure"); + + const mouseDown = new MouseEvent("mousedown", { + bubbles: true, + cancelable: true, + }); + suggestion?.dispatchEvent(mouseDown); + + if (!mouseDown.defaultPrevented) { + input.blur(); + } + + suggestion?.dispatchEvent( + new MouseEvent("click", { bubbles: true, cancelable: true }), + ); + + expect(input.value).toBe("Adventure"); + }); +}); diff --git a/src/gui/suggesters/suggest.ts b/src/gui/suggesters/suggest.ts index 686f1dec..1f336e5b 100644 --- a/src/gui/suggesters/suggest.ts +++ b/src/gui/suggesters/suggest.ts @@ -264,7 +264,7 @@ export abstract class TextInputSuggest implements ISuggestOwner { this.inputEl.setAttribute("aria-expanded", "false"); this.suggestEl.addEventListener("mousedown", (event: MouseEvent) => { - if (event.target === this.suggestEl) event.preventDefault(); + event.preventDefault(); }); // Setup global listeners