From 7c560090625021865f8d4509a01f8e52cc664163 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 6 Aug 2026 11:27:44 +0000 Subject: [PATCH] Fix cached embed navigation offline Co-authored-by: scaryrawr <661373+scaryrawr@users.noreply.github.com> --- apps/page/playwright/offline.e2e.js | 14 ++++++++++ apps/page/src/service-worker.test.ts | 38 ++++++++++++++++++++++++++++ apps/page/src/service-worker.ts | 10 +++++++- apps/page/take-screenshots.mjs | 2 +- 4 files changed, 62 insertions(+), 2 deletions(-) diff --git a/apps/page/playwright/offline.e2e.js b/apps/page/playwright/offline.e2e.js index 9f271d6b..abefda22 100644 --- a/apps/page/playwright/offline.e2e.js +++ b/apps/page/playwright/offline.e2e.js @@ -57,3 +57,17 @@ test('loads the home page offline from the bare project path', async ({ context, expect(requestedOutsideProjectPath).not.toContain('/index.js'); expect(requestedOutsideProjectPath).not.toContain('/manifest.json'); }); + +test('loads and runs the embed page offline', async ({ context, page }) => { + await page.goto('/sl/', { waitUntil: 'networkidle' }); + await waitForServiceWorkerControl(page); + + await context.setOffline(true); + await page.goto('/sl/embed.html?trainType=d51&smoke=true', { waitUntil: 'domcontentloaded' }); + + await expect(page.getByRole('heading', { name: 'SL Steam Locomotive Animation' })).toBeAttached(); + const terminal = page.getByRole('img', { name: 'Animated ASCII art train moving across terminal screen' }); + await expect(terminal).toBeVisible(); + await expect.poll(() => terminal.textContent()).toMatch(/[^\s\u00a0]/); + await expect(terminal).not.toContainText('Failed to load animation'); +}); diff --git a/apps/page/src/service-worker.test.ts b/apps/page/src/service-worker.test.ts index edaf31c0..fd07e8aa 100644 --- a/apps/page/src/service-worker.test.ts +++ b/apps/page/src/service-worker.test.ts @@ -149,4 +149,42 @@ describe('service worker regressions', () => { expect(response.headers.get('Location')).toBe('https://example.com/sl/'); expect(cacheOpenCalls).toBe(0); }); + + test('serves the cached embed shell when the extensionless route returns 404', async () => { + openCache = async () => + ({ + match: async (request: RequestInfo | URL) => { + expect(request).toBe('/sl/embed.html'); + return new Response('