diff --git a/packages/app/e2e/regression/mobile-session.spec.ts b/packages/app/e2e/regression/mobile-session.spec.ts index 0b04c765506..d7ac4dcea78 100644 --- a/packages/app/e2e/regression/mobile-session.spec.ts +++ b/packages/app/e2e/regression/mobile-session.spec.ts @@ -270,7 +270,10 @@ test("the summary's changes row switches the view and keeps the side tabs", asyn const launcher = panel.getByRole("tab", { name: "Open file", exact: true }) await browseFiles(page) await expect(launcher).toHaveAttribute("aria-selected", "true") + // The launcher opens beside the preview; closing the file leaves only the launcher stored. + await readme.click({ button: "middle" }) await expect(readme).toHaveCount(0) + await expect(launcher).toHaveAttribute("aria-selected", "true") await page.reload() await expect(launcher).toHaveAttribute("aria-selected", "true") await page.setViewportSize({ width: 390, height: 844 }) diff --git a/packages/app/e2e/regression/review.spec.ts b/packages/app/e2e/regression/review.spec.ts index 9d9f641126a..8695c429be5 100644 --- a/packages/app/e2e/regression/review.spec.ts +++ b/packages/app/e2e/regression/review.spec.ts @@ -171,7 +171,7 @@ test("open file tab browses, searches, and tracks missing files", async ({ page await expect(tab("Context")).toHaveAttribute("aria-selected", "true") await expect(tab("Open file")).toHaveAttribute("aria-selected", "false") await expect(sidebar).toBeHidden() - // The New tab view hides launchers whose tab is open, so the strip's tab returns to it. + // The strip's launcher tab returns to it. await tab("Open file").click() await expect(tab("Open file")).toHaveAttribute("aria-selected", "true") await expect(panel.getByText("ReviewOpenFile", { exact: true })).toBeVisible() @@ -204,8 +204,9 @@ test("open file tab browses, searches, and tracks missing files", async ({ page await expect(tab("README.md")).toHaveAttribute("aria-selected", "true") await expect(panel.getByText("contents:README.md", { exact: true })).toBeVisible() + // A new launcher opens beside the preview rather than replacing it. await browseFiles(page) - await expect(tab("README.md")).toHaveCount(0) + await expect(tab("README.md")).toHaveAttribute("aria-selected", "false") await expect(sidebar).toBeVisible() await filter.fill("nested") const result = panel.getByRole("option", { name: /nested\.ts/ }) @@ -228,6 +229,18 @@ test("open file tab browses, searches, and tracks missing files", async ({ page await expect(tab("Open file")).toHaveCount(0) await expect(tab("nested.ts")).toHaveAttribute("aria-selected", "true") + // The New tab view keeps offering Open file, so several launchers stay open; a pick replaces the selected one. + await openFileLauncher(panel) + await openFileLauncher(panel) + await expect(tab("Open file")).toHaveCount(2) + await panel.getByRole("button", { name: "README.md" }).click() + await expect(tab("README.md")).toHaveAttribute("aria-selected", "true") + await expect(tab("Open file")).toHaveCount(1) + await tab("Open file").click() + await page.keyboard.press("Control+w") + await expect(tab("Open file")).toHaveCount(0) + await expect(tab("nested.ts")).toHaveAttribute("aria-selected", "true") + // The file browser beside file tabs keeps its DOM and scroll position across preview and pinned tab switches. await sidebarToggle.click() await filter.fill("") diff --git a/packages/app/e2e/utils/side-panel.ts b/packages/app/e2e/utils/side-panel.ts index e8b1efd676a..745817e7043 100644 --- a/packages/app/e2e/utils/side-panel.ts +++ b/packages/app/e2e/utils/side-panel.ts @@ -7,7 +7,7 @@ export async function openFileLauncher(panel: Locator) { await panel.getByRole("button", { name: /^Open file/ }).click() } -/** Opens the file browser with its shortcut, which still works while a file tab hides "Open file" from the New tab view. */ +/** Opens the file browser with its shortcut: it reuses the selected launcher, else opens another. */ export async function browseFiles(page: Page) { await page.keyboard.press("Control+Alt+P") } diff --git a/packages/app/src/runtime/extension/side-region.tsx b/packages/app/src/runtime/extension/side-region.tsx index 5809af48cbc..6db384e9716 100644 --- a/packages/app/src/runtime/extension/side-region.tsx +++ b/packages/app/src/runtime/extension/side-region.tsx @@ -494,7 +494,7 @@ function LauncherRow(props: { item: SessionPanelMenuItem }): JSX.Element { return (