feat(offline): implicit net-state model, two-tier version gate, unified lobby #249

Merged
developer merged 18 commits from feature/android-native into development 2026-07-13 00:59:16 +00:00
Showing only changes of commit 2ea91a8354 - Show all commits
+15
View File
@@ -38,7 +38,20 @@ async function openFinishedHistory(page: Page): Promise<void> {
await expect(page.getByRole('button', { name: 'Export game' })).toBeVisible(); await expect(page.getByRole('button', { name: 'Export game' })).toBeVisible();
} }
// Desktop WebKit (Safari's engine) exposes a working Web Share API, unlike Chromium and WebKit on
// Linux (the CI host). The "plain desktop browser" delivery paths tested below are reached only when
// Web Share is ABSENT — shareUrlAsFile / pickGcgDelivery fall through to the anchor download or the
// clipboard copy — so pin that precondition; otherwise macOS WebKit takes the share branch and no
// download or clipboard copy occurs. Mirrors the inverse stub the share-sheet test sets up.
async function withoutWebShare(page: Page): Promise<void> {
await page.addInitScript(() => {
Object.defineProperty(navigator, 'share', { value: undefined, configurable: true });
Object.defineProperty(navigator, 'canShare', { value: undefined, configurable: true });
});
}
test('the chooser downloads the PNG through the signed URL on a plain browser', async ({ page }) => { test('the chooser downloads the PNG through the signed URL on a plain browser', async ({ page }) => {
await withoutWebShare(page);
await routeDl(page); await routeDl(page);
await openFinishedHistory(page); await openFinishedHistory(page);
await page.getByRole('button', { name: 'Export game' }).click(); await page.getByRole('button', { name: 'Export game' }).click();
@@ -49,6 +62,7 @@ test('the chooser downloads the PNG through the signed URL on a plain browser',
}); });
test('the chooser downloads the GCG through the same signed-URL route', async ({ page }) => { test('the chooser downloads the GCG through the same signed-URL route', async ({ page }) => {
await withoutWebShare(page);
await routeDl(page); await routeDl(page);
await openFinishedHistory(page); await openFinishedHistory(page);
await page.getByRole('button', { name: 'Export game' }).click(); await page.getByRole('button', { name: 'Export game' }).click();
@@ -198,6 +212,7 @@ test('Telegram on iOS keeps the app chooser and opens the OS share sheet', async
}); });
test('a legacy Telegram client (no downloadFile) hides the image and copies the GCG', async ({ page }) => { test('a legacy Telegram client (no downloadFile) hides the image and copies the GCG', async ({ page }) => {
await withoutWebShare(page);
await page.addInitScript(() => { await page.addInitScript(() => {
// Headless engines deny the real clipboard; a permissive stub keeps the legacy // Headless engines deny the real clipboard; a permissive stub keeps the legacy
// copy path deterministic in both browsers. // copy path deterministic in both browsers.