authorgravatar for fazalkadivar7@gmail.comFazal Kadivar <fazalkadivar7@gmail.com> 2026-07-18 01:12:13+05:30
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-07-17 21:42:13+02:00
loge057e2e98583c53946c64e401441777664840987
tree7b9f8bda32fca92bd887d3157d947a1d86501d7b
parenta7f6d97b94d2e12b10081760063768f715f87e96
signature Signed by PGP key B5690EEEBB952194

fix: prevent initial right-click from selecting a context menu item (#3877)


2 files changed, 20 insertions(+), 1 deletions(-)

apps/web/src/contextMenuFallback.test.ts+17
......@@ -196,6 +196,23 @@ describe("showContextMenuFallback", () => {
196196 await expect(selectionPromise).resolves.toBe("rename");
197197 });
198198
199 it("ignores a click from the gesture that opened the menu", async () => {
200 let enablePointerSelection: ((time: number) => void) | undefined;
201 vi.stubGlobal("requestAnimationFrame", (callback: (time: number) => void) => {
202 enablePointerSelection = callback;
203 return 0;
204 });
205
206 const selectionPromise = showContextMenuFallback([{ id: "rename", label: "Rename" }]);
207 const renameButton = findButton("Rename");
208
209 renameButton?.dispatchEvent(new MouseEvent("click", { bubbles: true }));
210 enablePointerSelection?.(0);
211 renameButton?.dispatchEvent(new MouseEvent("click", { bubbles: true }));
212
213 await expect(selectionPromise).resolves.toBe("rename");
214 });
215
199216 it("opens nested submenus and resolves the clicked leaf id", async () => {
200217 const selectionPromise = showContextMenuFallback([
201218 {
apps/web/src/contextMenuFallback.ts+3-1
......@@ -272,7 +272,9 @@ export function showContextMenuFallback<T extends string>(
272272 button.addEventListener("mouseenter", () => {
273273 closeMenusFromLevel(level + 1);
274274 });
275 button.addEventListener("click", () => cleanup(item.id));
275 button.addEventListener("click", () => {
276 if (canDismissFromPointer) cleanup(item.id);
277 });
276278 }
277279 }
278280