Plein écran : attente bornée, repli tourné si l'écran reste en portrait, paysage forcé en mode immersif ; plan : résultat et corrections de la recette

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Pierre MARTIN
2026-11-03 15:40:53 +01:00
co-authored by Claude Opus 5.5
parent b8c2997ec0
commit 155a953c3b
3 changed files with 87 additions and 16 deletions
+27 -8
View File
@@ -539,6 +539,9 @@ async function openMenu() {
* le journal de la partie quittée. */
async function newGameFromMenu() {
const before = await savedJournal();
const started = () =>
page.evaluate(() => JSON.parse(localStorage.getItem("ustagammon.settings") ?? "{}").gamesStarted);
const startedBefore = await started();
await openMenu();
const start = Date.now();
await page.click("#menu-new-game");
@@ -548,8 +551,11 @@ async function newGameFromMenu() {
check(!(await page.isVisible("#menu")), "le menu reste ouvert après « Nouvelle partie »");
await waitForPlayer();
const after = await savedJournal();
check(after.head !== before.head && !after.events.some((e) => e.type === "MovePlayed" &&
e.side === "player"), "« Nouvelle partie » n'a pas commencé de partie");
// (Les identifiants d'événements se suivent : une partie neuve peut avoir
// la même tête que la précédente ; on compte les parties commencées.)
check((await started()) === startedBefore + 1 &&
!after.events.some((e) => e.type === "MovePlayed" && e.side === "player"),
"« Nouvelle partie » n'a pas commencé de partie");
log(`nouvelle partie commencée en ${Date.now() - start} ms, sans confirmation`);
return before;
}
@@ -579,7 +585,8 @@ let releaseEngine;
const engineHeld = new Promise((resolve) => {
releaseEngine = resolve;
});
await page.route("**/wasm/engine.data", async (route) => {
// (Au niveau du contexte : le Web Worker du moteur fait la demande.)
await context.route("**/wasm/engine.data", async (route) => {
await engineHeld;
await route.continue();
});
@@ -603,9 +610,13 @@ await page.waitForSelector("#board polygon[data-point]");
log(`plateau dessiné en ${Date.now() - start} ms, avant le moteur (${loading.checkers} pions)`);
}
await checkStable("chargement");
await review("1-chargement");
// Firefox ne laisse pas toujours retenir la demande du Worker : la revue de
// l'écran de chargement (six vues) se fait dans Chromium.
if (fullReview) {
await review("1-chargement");
}
releaseEngine();
await page.unroute("**/wasm/engine.data");
await context.unroute("**/wasm/engine.data");
let todo = await waitForPlayer();
log(`moteur chargé, partie prête en ${Date.now() - start} ms (${todo})`);
await checkStable("moteur chargé");
@@ -774,7 +785,13 @@ for (let actions = 0; ; actions++) {
// l'orientation, d'où le repli par rotation CSS de tout l'écran.
rotatedChecked = true;
await page.click("#fullscreen-button");
await sleep(300);
for (let i = 0; i < 40; i++) {
if (await page.evaluate(() => document.documentElement.classList.contains("landscape"))) {
break;
}
await sleep(100);
}
await sleep(200);
const view = await page.evaluate(() => {
const r = document.getElementById("board").getBoundingClientRect();
return {
@@ -783,7 +800,9 @@ for (let actions = 0; ; actions++) {
board: [r.x, r.y, r.width, r.height].map(Math.round),
};
});
check(view.landscape, "plein écran : pas de vue paysage");
check(view.landscape, `plein écran : pas de vue paysage (${await page.evaluate(() =>
`${document.documentElement.className} ; plein écran ${document.fullscreenElement !== null} ; ` +
`portrait ${matchMedia("(orientation: portrait)").matches}`)})`);
if (view.rotated) {
check(JSON.stringify(view.board) === JSON.stringify([0, 0, 412, 915]),
`repli tourné : plateau ${view.board}`);
@@ -806,7 +825,7 @@ for (let actions = 0; ; actions++) {
check(!(await page.evaluate(() => document.documentElement.classList.contains("landscape"))),
"plein écran quitté : la vue paysage reste");
log(`plein écran : ${view.rotated ? "repli par rotation CSS" : "paysage verrouillé"}, ` +
"dés lancés en touchant le plateau tourné, sortie par le menu");
"dés lancés en touchant le plateau, sortie par le menu");
continue;
}
// Dés : au clavier (Espace), en les touchant (d'un côté puis de