fix: harden favorites controller lifecycle

This commit is contained in:
wxs
2026-07-17 15:12:00 +08:00
parent ff1decd4a7
commit 8ebb50524c
4 changed files with 180 additions and 5 deletions
+25 -1
View File
@@ -2,7 +2,10 @@
import { beforeEach, describe, expect, test, vi } from "vitest";
import { syncFavoriteRowPickers } from "../src/content/market/favorite-row-picker";
import {
disposeFavoriteRowPickers,
syncFavoriteRowPickers
} from "../src/content/market/favorite-row-picker";
import type { FavoriteCreatorInput, FavoriteFolder } from "../src/content/market/favorites-store";
const firstFolder = createFolder("folder-1", "合作");
@@ -129,6 +132,7 @@ async function flushAsyncEvents(): Promise<void> {
describe("favorite-row-picker", () => {
beforeEach(() => {
disposeFavoriteRowPickers(document);
document.body.innerHTML = "";
});
@@ -355,6 +359,26 @@ describe("favorite-row-picker", () => {
expect(readPopover()).toBeNull();
});
test("disposes an open picker and clears its detached action handler", () => {
const actionCell = createActionCell();
const onSetCreatorFolderIds = vi.fn(async () => {});
sync({ actionCell, onSetCreatorFolderIds });
const button = readFavoriteButton(actionCell);
button.click();
expect(readPopover()).not.toBeNull();
disposeFavoriteRowPickers(document);
disposeFavoriteRowPickers(document);
expect(readPopover()).toBeNull();
expect(button.onclick).toBeNull();
document.dispatchEvent(new KeyboardEvent("keydown", { key: "Escape" }));
document.body.dispatchEvent(new Event("pointerdown", { bubbles: true }));
button.click();
expect(onSetCreatorFolderIds).not.toHaveBeenCalled();
});
test("clamps a bottom-right picker within the viewport", () => {
const actionCell = createActionCell();
const originalWidth = Object.getOwnPropertyDescriptor(