From 5639483a2ce187b538c58c19bd3ae885ebddb3fe Mon Sep 17 00:00:00 2001 From: Neil <4138956+nwparker@users.noreply.github.com> Date: Sun, 31 May 2026 09:05:18 -0700 Subject: [PATCH] fix: restore duplicate browser pages by index --- src/renderer/src/store/slices/browser.test.ts | 29 +++++++++++++++++++ src/renderer/src/store/slices/browser.ts | 8 ++--- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/renderer/src/store/slices/browser.test.ts b/src/renderer/src/store/slices/browser.test.ts index 325193ef0b3..989a0d9b614 100644 --- a/src/renderer/src/store/slices/browser.test.ts +++ b/src/renderer/src/store/slices/browser.test.ts @@ -390,6 +390,35 @@ describe('createBrowserSlice floating tabs', () => { }) }) +describe('createBrowserSlice closed browser workspaces', () => { + it('reopens duplicate-URL browser pages on the originally active page', () => { + const store = createTestStore() + const tab = store.getState().createBrowserTab('wt-1', 'https://example.com/dashboard', { + title: 'First copy' + }) + const secondPage = store.getState().createBrowserPage(tab.id, 'https://example.com/dashboard', { + title: 'Second copy' + }) + if (!secondPage) { + throw new Error('Expected a second browser page') + } + + store.getState().closeBrowserTab(tab.id) + const restored = store.getState().reopenClosedBrowserTab('wt-1') + if (!restored) { + throw new Error('Expected a reopened browser workspace') + } + const restoredPages = store.getState().browserPagesByWorkspace[restored.id] ?? [] + const activePage = restoredPages.find((page) => page.id === restored.activePageId) + + expect(restoredPages.map((page) => page.url)).toEqual([ + 'https://example.com/dashboard', + 'https://example.com/dashboard' + ]) + expect(activePage?.title).toBe('Second copy') + }) +}) + describe('createBrowserSlice runtime guard', () => { beforeEach(() => { vi.clearAllMocks() diff --git a/src/renderer/src/store/slices/browser.ts b/src/renderer/src/store/slices/browser.ts index 6fd9207bbf4..b4102a68e8e 100644 --- a/src/renderer/src/store/slices/browser.ts +++ b/src/renderer/src/store/slices/browser.ts @@ -760,13 +760,13 @@ export const createBrowserSlice: StateCreator = }) } - // Activate the originally-active page if it wasn't the first one + // Why: duplicate URLs are valid browser pages; restoring by URL can select + // the wrong copy. The restore path preserves page order, so map by index. const activePageId = snap.activePageId if (activePageId) { const restoredPages = get().browserPagesByWorkspace[restored.id] ?? [] - const targetPage = restoredPages.find( - (p) => p.url === pages.find((orig) => orig.id === activePageId)?.url - ) + const activePageIndex = pages.findIndex((orig) => orig.id === activePageId) + const targetPage = activePageIndex >= 0 ? restoredPages[activePageIndex] : null if (targetPage && targetPage.id !== restoredPages[0]?.id) { get().setActiveBrowserPage(restored.id, targetPage.id) }