diff --git a/packages/app/src/entry.tsx b/packages/app/src/entry.tsx index 3232695ee1a..22ab7eb514f 100644 --- a/packages/app/src/entry.tsx +++ b/packages/app/src/entry.tsx @@ -73,6 +73,7 @@ if (root instanceof HTMLElement && root.dataset.opencodeMounted === undefined) { const auth = authFromToken(new URLSearchParams(location.search).get("auth_token")) clearAuthToken() const standalone = isStandalone() + root.dataset.standalone = String(standalone) if (standalone) restorePwaRoute() const server: ServerConnection.Http = { type: "http", diff --git a/packages/app/src/index.css b/packages/app/src/index.css index 2635fbd6f24..e2b317094e6 100644 --- a/packages/app/src/index.css +++ b/packages/app/src/index.css @@ -32,6 +32,11 @@ } } +/* iOS can report navigator.standalone without matching display-mode. */ +#root[data-standalone="true"] { + height: 100vh; +} + @layer components { [data-slot="session-side-panel-presence"][data-opened="true"] { animation: terminal-panel-presence-in 240ms cubic-bezier(0.22, 1, 0.36, 1); diff --git a/packages/app/test-browser/pwa-route.test.ts b/packages/app/test-browser/pwa-route.test.ts index 8c4e0bf63eb..78587ba74f3 100644 --- a/packages/app/test-browser/pwa-route.test.ts +++ b/packages/app/test-browser/pwa-route.test.ts @@ -19,6 +19,18 @@ test("normal browser windows are not standalone", () => { expect(isStandalone()).toBe(false) }) +test("detects iOS home-screen apps when the standalone media query does not match", () => { + const descriptor = Object.getOwnPropertyDescriptor(navigator, "standalone") + Object.defineProperty(navigator, "standalone", { configurable: true, value: true }) + try { + expect(window.matchMedia("(display-mode: standalone)").matches).toBe(false) + expect(isStandalone()).toBe(true) + } finally { + if (descriptor) Object.defineProperty(navigator, "standalone", descriptor) + if (!descriptor) Reflect.deleteProperty(navigator, "standalone") + } +}) + test("restores the last PWA route including query and hash without adding history", () => { window.history.replaceState({ retained: true }, "", "http://localhost/") const length = window.history.length