fix(ai-toolbar): use stable clipboard fallback identities

This commit is contained in:
2026-04-23 04:53:39 -04:00
parent d9aa035dce
commit 35731fb684
2 changed files with 66 additions and 5 deletions

View File

@@ -506,6 +506,24 @@ describe("AI toolbar paste capture", () => {
expect(onAiCreate).not.toHaveBeenCalled();
});
test("Mod+Enter ignores combined Ctrl+Meta modifiers", async () => {
const onAiCreate = mock();
const { textareaProps } = await renderToolbarBoundary({
aiPrompt: "Draft a kickoff",
onAiCreate,
});
const event = createTextareaKeydownEvent({
ctrlKey: true,
metaKey: true,
});
textareaProps.onKeyDown?.(event);
expect(event.preventDefault).not.toHaveBeenCalled();
expect(onAiCreate).not.toHaveBeenCalled();
});
test("Mod+Enter does not trigger AI generation while loading", async () => {
const onAiCreate = mock();
@@ -683,6 +701,36 @@ describe("AI toolbar paste capture", () => {
);
});
test("clipboard fallback reuses the same synthesized file name for identical clipboard content", async () => {
const onImagesSelect = mock();
const clipboardRead = mock(async () => [
{
types: ["image/png"],
getType: async () => new Blob(["same-image"], { type: "image/png" }),
},
]);
(globalThis as { navigator?: Navigator }).navigator = {
clipboard: { read: clipboardRead },
} as Navigator;
await renderToolbar({ onImagesSelect });
const handleDocumentKeydown = getDocumentListener("keydown");
await handleDocumentKeydown(
createDocumentKeydownEvent({ ctrlKey: true }),
);
await handleDocumentKeydown(
createDocumentKeydownEvent({ ctrlKey: true }),
);
expect(onImagesSelect).toHaveBeenCalledTimes(2);
expect(onImagesSelect.mock.calls[0]?.[0][0]?.name).toBe(
onImagesSelect.mock.calls[1]?.[0][0]?.name,
);
});
test("async clipboard fallback does not double-handle a paste already handled by the synchronous document paste flow", async () => {
const onImagesSelect = mock();
const clipboardRead = mock(async () => [