diff --git a/app/src/ui/help.ts b/app/src/ui/help.ts index 5dc24c6..db0379e 100644 --- a/app/src/ui/help.ts +++ b/app/src/ui/help.ts @@ -325,7 +325,7 @@ export function createHelpView(container: HTMLElement, tabs: HTMLElement): HelpV lastOpen = opened; // La barre haute de l'aide reste en vue (app.css) : ce qu'on // amène en haut s'arrête 12 px sous elle (scroll-margin-top). - const target = opened?.section ?? (term === null ? undefined : terms.get(term)?.card); + const target = opened?.section ?? (term === null ? undefined : terms.get(term)?.dt); if (target !== undefined) { target.scrollIntoView({ block: "start" }); } else if (closed !== null) { diff --git a/tests/browser/match.mjs b/tests/browser/match.mjs index 7603f57..188b3e9 100644 --- a/tests/browser/match.mjs +++ b/tests/browser/match.mjs @@ -290,6 +290,46 @@ for (;;) { if (!reloaded) { // Le match continue après un rechargement de la page. reloaded = true; + // L'application enregistre sans attendre : on laisse IndexedDB + // finir d'écrire la nouvelle partie (Firefox peut être lent). + await until("partie suivante enregistrée", (score) => new Promise((resolve) => { + const open = indexedDB.open("ustagammon"); + open.onerror = () => resolve(false); + open.onsuccess = () => { + const tx = open.result.transaction(["settings", "games"]); + const current = tx.objectStore("settings").get("current"); + current.onsuccess = () => { + const id = current.result?.value; + if (typeof id !== "string") { + resolve(false); + return; + } + const summary = tx.objectStore("games").get(id); + summary.onsuccess = () => { + const s = summary.result; + resolve(s?.status === "playing" && + `${s.match?.score.computer}-${s.match?.score.player}` === score); + open.result.close(); + }; + }; + }; + }), `${next.computer}-${next.player}`).catch(async (error) => { + const stored = await page.evaluate(() => new Promise((resolve) => { + const open = indexedDB.open("ustagammon"); + open.onerror = () => resolve(`IndexedDB : ${open.error}`); + open.onsuccess = () => { + const all = open.result.transaction(["settings", "games"]); + const current = all.objectStore("settings").get("current"); + const games = all.objectStore("games").getAll(); + games.onsuccess = () => resolve(JSON.stringify({ + current: current.result, + games: games.result.map((g) => [g.id, g.status, g.match, g.updatedAt]), + local: Object.keys(localStorage), + })); + }; + })); + throw new Error(`${error.message} ; enregistré : ${stored}`); + }); await page.reload(); await until("partie reprise", () => !document.body.classList.contains("busy")); const again = await shownMatch();