From c877df38a6976b1080ee847949fd4e745f091ee8 Mon Sep 17 00:00:00 2001 From: Andrew Fong Date: Mon, 23 Jun 2025 16:48:57 -0700 Subject: [PATCH] Removing window fires event handler --- .../fake-browser/src/apis/windows.test.ts | 67 +++++++++++++++++++ packages/fake-browser/src/apis/windows.ts | 1 + 2 files changed, 68 insertions(+) create mode 100644 packages/fake-browser/src/apis/windows.test.ts diff --git a/packages/fake-browser/src/apis/windows.test.ts b/packages/fake-browser/src/apis/windows.test.ts new file mode 100644 index 0000000..dae21ae --- /dev/null +++ b/packages/fake-browser/src/apis/windows.test.ts @@ -0,0 +1,67 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import { fakeBrowser } from '../index'; + +describe('windows', () => { + beforeEach(fakeBrowser.reset); + + describe('remove', () => { + it('should trigger onRemoved event when removing a window', async () => { + const listener = vi.fn(); + fakeBrowser.windows.onRemoved.addListener(listener); + + const newWindow = await fakeBrowser.windows.create(); + await fakeBrowser.windows.remove(newWindow.id!); + + expect(listener).toHaveBeenCalledWith(newWindow.id); + }); + + it('should remove window from windowList', async () => { + const window1 = await fakeBrowser.windows.create(); + const window2 = await fakeBrowser.windows.create(); + + const allWindowsBefore = await fakeBrowser.windows.getAll(); + expect(allWindowsBefore).toHaveLength(3); // default + 2 new + + await fakeBrowser.windows.remove(window1.id!); + + const allWindowsAfter = await fakeBrowser.windows.getAll(); + expect(allWindowsAfter).toHaveLength(2); + expect(allWindowsAfter.find(w => w.id === window1.id)).toBeUndefined(); + }); + }); + + describe('create', () => { + it('should trigger onCreated event', async () => { + const listener = vi.fn(); + fakeBrowser.windows.onCreated.addListener(listener); + + const newWindow = await fakeBrowser.windows.create(); + + expect(listener).toHaveBeenCalledWith( + expect.objectContaining({ + id: newWindow.id, + focused: false, + }), + ); + }); + }); + + describe('tabs and windows interaction', () => { + it('should remove window when last tab is removed', async () => { + const windowListener = vi.fn(); + fakeBrowser.windows.onRemoved.addListener(windowListener); + + const window = await fakeBrowser.windows.create(); + const tab = await fakeBrowser.tabs.create({ windowId: window.id }); + + // Remove the only tab in the window + await fakeBrowser.tabs.remove(tab.id!); + + // Window should be removed automatically + expect(windowListener).toHaveBeenCalledWith(window.id); + + const allWindows = await fakeBrowser.windows.getAll(); + expect(allWindows.find(w => w.id === window.id)).toBeUndefined(); + }); + }); +}); diff --git a/packages/fake-browser/src/apis/windows.ts b/packages/fake-browser/src/apis/windows.ts index 66e94b5..93adca9 100644 --- a/packages/fake-browser/src/apis/windows.ts +++ b/packages/fake-browser/src/apis/windows.ts @@ -106,6 +106,7 @@ export const windows: BrowserOverrides['windows'] = { const index = windowList.findIndex(window => window.id === windowId); if (index < 0) return; windowList.splice(index, 1); + await onRemoved.trigger(windowId); }, onCreated, onRemoved,