From 0f1edcd181690f1dd5912b77c9aa393f5fc6089f Mon Sep 17 00:00:00 2001 From: wxs Date: Fri, 17 Jul 2026 13:27:41 +0800 Subject: [PATCH] fix: preserve drawer on dialog escape --- src/content/market/favorites-drawer.ts | 2 +- tests/favorites-drawer.test.ts | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/content/market/favorites-drawer.ts b/src/content/market/favorites-drawer.ts index 19a1dc5..ded88c5 100644 --- a/src/content/market/favorites-drawer.ts +++ b/src/content/market/favorites-drawer.ts @@ -112,7 +112,7 @@ export function createFavoritesDrawer( }; const onDocumentKeydown = (event: KeyboardEvent) => { - if (event.key !== "Escape" || !isOpen) { + if (event.key !== "Escape" || !isOpen || event.defaultPrevented) { return; } if (document.querySelector("[data-sces-favorite-folder-dialog]")) { diff --git a/tests/favorites-drawer.test.ts b/tests/favorites-drawer.test.ts index fd76559..9eb6e82 100644 --- a/tests/favorites-drawer.test.ts +++ b/tests/favorites-drawer.test.ts @@ -484,6 +484,28 @@ describe("favorites-drawer", () => { expect(document.activeElement).toBe(restoredSearch); }); + test("keeps a remounted drawer open after an earlier dialog handles Escape", async () => { + const first = createHarness(); + first.controller.render(createState()); + readTab().click(); + + const dialogResult = promptForFavoriteFolderName(document, { + title: "新建收藏夹" + }); + first.controller.dispose(); + + const remounted = createHarness(); + remounted.controller.render(createState()); + readTab().click(); + document.dispatchEvent( + new KeyboardEvent("keydown", { cancelable: true, key: "Escape" }) + ); + + await expect(dialogResult).resolves.toBeNull(); + expect(readDrawer().hidden).toBe(false); + expect(readTab().getAttribute("aria-expanded")).toBe("true"); + }); + test("calls create, rename, and delete handlers with the matching folder id", async () => { const onCreateFolder = vi.fn(async () => {}); const onRenameFolder = vi.fn(async (_folderId: string) => {});