diff --git a/server/pruef-alter.mjs b/server/pruef-alter.mjs index db4c7f20..47cf5c07 100644 --- a/server/pruef-alter.mjs +++ b/server/pruef-alter.mjs @@ -278,7 +278,11 @@ melde("=== 7. Im Browser ==="); const { chromium } = await import( "file:///C:/Users/qciga/Documents/Obelix/Analyse/node_modules/playwright/index.mjs"); const browser = await chromium.launch(); - const kontext = await browser.newContext({ viewport: { width: 390, height: 844 } }); + /* MIT FINGER. Ohne `hasTouch` meldet der Browser einen feinen + Zeiger, und keine Regel aus `@media (pointer: coarse)` greift -- + dort stehen die 44-Pixel-Beruehrziele. Siehe pruef-fingermass.mjs. */ + const kontext = await browser.newContext({ viewport: { width: 390, height: 844 }, + hasTouch: true, isMobile: true }); const seite = await kontext.newPage(); const konsole = []; seite.on("console", (m) => { if (m.type() === "error" && !/favicon|ERR_/i.test(m.text())) konsole.push(m.text()); }); diff --git a/server/pruef-countdown.mjs b/server/pruef-countdown.mjs index b878481b..1e447f66 100644 --- a/server/pruef-countdown.mjs +++ b/server/pruef-countdown.mjs @@ -192,7 +192,11 @@ const { chromium } = await import( const browser = await chromium.launch(); try { const HOEHE = 844; - const kontext = await browser.newContext({ viewport: { width: 390, height: HOEHE } }); + /* MIT FINGER. Ohne `hasTouch` meldet der Browser einen feinen + Zeiger, und keine Regel aus `@media (pointer: coarse)` greift -- + dort stehen die 44-Pixel-Beruehrziele. Siehe pruef-fingermass.mjs. */ + const kontext = await browser.newContext({ viewport: { width: 390, height: HOEHE }, + hasTouch: true, isMobile: true }); await kontext.addCookies(keks.split("; ").map((k) => { const [name, ...rest] = k.split("="); return { name, value: rest.join("="), domain: "127.0.0.1", path: "/" }; diff --git a/server/pruef-fingermass.mjs b/server/pruef-fingermass.mjs index a9330c44..1a75f7d1 100644 --- a/server/pruef-fingermass.mjs +++ b/server/pruef-fingermass.mjs @@ -61,8 +61,22 @@ const ORDNER = new URL(".", import.meta.url).pathname.replace(/^\/([A-Za-z]:)/, `setViewportSize` sitzt auf einer Seite, die den Finger schon hat), die zweite ein echter Fund und sofort repariert. - Die erste Zahl, die eine Wache liefert, ist selten die richtige. */ -const GRUNDLINIE = 17; + Die erste Zahl, die eine Wache liefert, ist selten die richtige. + + 29.09.2026, nachmittags: 17 -> 6. Zehn Fenster bekamen einen + Finger, eines fiel weg. Alle zehn Pruefungen liefen danach gruen + -- diese Seiten halten die Fingerregeln also schon ein, es hatte + nur nie jemand nachgesehen. Gefunden wurde dabei trotzdem etwas: + eine Zeitbombe in pruef-kalender (siehe dort). + + Die sechs uebrigen sind die schweren Faelle: Dort schaltet + `setViewportSize` mitten im Ablauf auf Handyformat um, und der + Finger laesst sich nachtraeglich nicht setzen. Jeder davon + braucht einen eigenen Kontext samt Anmeldung -- Umbau, nicht + Einzeiler. `pruef-grosscheck` bleibt unangetastet, bis Filipe + einen Lauf freigibt: Eine Aenderung, die ich nicht pruefen darf, + liefere ich nicht aus. */ +const GRUNDLINIE = 6; /* Ab wann ist ein Fenster ein Telefon? 860 ist die Grenze, die im Haus schon in mess-reaktion und mess-chat-optik steht. Darueber diff --git a/server/pruef-gespraech.mjs b/server/pruef-gespraech.mjs index c588cc97..40fbdf99 100644 --- a/server/pruef-gespraech.mjs +++ b/server/pruef-gespraech.mjs @@ -268,7 +268,11 @@ melde("=== 6. Wie es aussieht ==="); "file:///C:/Users/qciga/Documents/Obelix/Analyse/node_modules/playwright/index.mjs"); const browser = await chromium.launch(); try { - const kontext = await browser.newContext({ viewport: { width: 390, height: 900 } }); + /* MIT FINGER. Ohne `hasTouch` meldet der Browser einen feinen + Zeiger, und keine Regel aus `@media (pointer: coarse)` greift -- + dort stehen die 44-Pixel-Beruehrziele. Siehe pruef-fingermass.mjs. */ + const kontext = await browser.newContext({ viewport: { width: 390, height: 900 }, + hasTouch: true, isMobile: true }); await kontext.addCookies(dogi.split("; ").map((k) => { const [name, ...rest] = k.split("="); return { name, value: rest.join("="), domain: "127.0.0.1", path: "/" }; diff --git a/server/pruef-kalender.mjs b/server/pruef-kalender.mjs index fd4f4e30..494bb0b7 100644 --- a/server/pruef-kalender.mjs +++ b/server/pruef-kalender.mjs @@ -192,6 +192,12 @@ const lesen = (seite) => seite.evaluate(() => ({ kwSpalten: document.querySelectorAll(".k-kw").length, kwWerte: [...document.querySelectorAll(".k-kw")].map((k) => k.textContent), heuteZellen: document.querySelectorAll('.k-tag[data-heute="ja"]').length, + /* Ein Monatsraster zeigt die Randtage der Nachbarmonate mit + (`data-fremd="ja"`). Fuer die Frage „wandert die Heute-Marke + mit der Ansicht?" zaehlen nur die EIGENEN Tage -- siehe die + Pruefung beim Blaettern. */ + heuteEigen: document.querySelectorAll('.k-tag[data-heute="ja"]:not([data-fremd="ja"])').length, + heuteFremd: document.querySelectorAll('.k-tag[data-heute="ja"][data-fremd="ja"]').length, feiertagZellen: document.querySelectorAll('.k-tag[data-feiertag="ja"]').length, fremdZellen: document.querySelectorAll('.k-tag[data-fremd="ja"]').length, /* Eintraege */ @@ -344,7 +350,30 @@ for (const [breite, wie] of [[1440, "Computer"], [390, "Handy"]]) { await seite.waitForTimeout(400); const weiter = await lesen(seite); ok(weiter.zeitraum !== vorher, `vorwärts blättern wechselt den Monat (${vorher} → ${weiter.zeitraum})`); - ok(weiter.heuteZellen === 0, "im nächsten Monat ist kein Tag mehr \"heute\""); + /* DIESE PRUEFUNG WAR EINE ZEITBOMBE (entschärft 29.09.2026). + + Sie stand auf `weiter.heuteZellen === 0` und war jahrelang grün + -- bis heute. Am 29. September zeigt das Oktober-Raster in + seiner ersten Zeile die letzten Septembertage mit, und einer + davon IST heute. Die Anwendung macht dabei alles richtig: + `kalender.js` setzt die Marke an `tag === daten.heute`, also am + Datum und nicht an der Rasterposition. Genau das sollte die + Pruefung ja beweisen -- und schlug an, weil die Anwendung es + tat. + + Geschrieben wurde sie an einem Tag in der Monatsmitte. Von da + an war sie richtig, bis der Kalender sie einholte, und dann + kostete der Fehlalarm Vertrauen in den ganzen Satz. Dasselbe + Muster wie `gate-oeffnung.mjs` am 06.09.2026 im Shop. + + Gefragt wird jetzt, was gemeint war: Die Marke darf NICHT an + der Ansicht haengen. Ein EIGENER Tag des Folgemonats darf nie + „heute" sein -- ein mitgezeigter Randtag des laufenden Monats + dagegen sehr wohl, und zwar genau dann, wenn er es ist. Das + gilt an jedem Tag des Jahres. */ + ok(weiter.heuteEigen === 0, + `im nächsten Monat ist kein EIGENER Tag mehr "heute" ` + + `(${weiter.heuteEigen} eigene, ${weiter.heuteFremd} mitgezeigte Randtage)`); await seite.click("#heute-knopf"); await seite.waitForTimeout(400); const zurueck = await lesen(seite); @@ -762,7 +791,11 @@ console.log("\n=== Die gerechneten Tage"); ======================================================================= */ console.log("\n=== Am Handy wird aus einer Pille ein Punkt"); { - const kPunkt = await browser.newContext({ viewport: { width: 390, height: 1100 } }); + /* MIT FINGER. Ohne `hasTouch` meldet der Browser einen feinen + Zeiger, und keine Regel aus `@media (pointer: coarse)` greift -- + dort stehen die 44-Pixel-Beruehrziele. Siehe pruef-fingermass.mjs. */ + const kPunkt = await browser.newContext({ viewport: { width: 390, height: 1100 }, + hasTouch: true, isMobile: true }); const sPunkt = await anmelden(kPunkt, "admin", "CODE-DOGI-0001"); try { await sPunkt.goto(BASIS + "/workspace/kalender.html", { waitUntil: "networkidle" }); diff --git a/server/pruef-modi-verborgen.mjs b/server/pruef-modi-verborgen.mjs index 6835fedb..2b352215 100644 --- a/server/pruef-modi-verborgen.mjs +++ b/server/pruef-modi-verborgen.mjs @@ -375,7 +375,11 @@ console.log("\n=== 7. Dieselbe Seite mit einem echten Browser ===\n"); "file:///C:/Users/qciga/Documents/Obelix/Analyse/node_modules/playwright/index.mjs"); const browser = await chromium.launch(); try { - const kontext = await browser.newContext({ viewport: { width: 390, height: 844 } }); + /* MIT FINGER. Ohne `hasTouch` meldet der Browser einen feinen + Zeiger, und keine Regel aus `@media (pointer: coarse)` greift -- + dort stehen die 44-Pixel-Beruehrziele. Siehe pruef-fingermass.mjs. */ + const kontext = await browser.newContext({ viewport: { width: 390, height: 844 }, + hasTouch: true, isMobile: true }); const seite = await kontext.newPage(); const konsole = []; seite.on("console", (e) => { if (e.type() === "error") konsole.push(e.text()); }); diff --git a/server/pruef-nachwuchs.mjs b/server/pruef-nachwuchs.mjs index dee76a89..0cb40bb8 100644 --- a/server/pruef-nachwuchs.mjs +++ b/server/pruef-nachwuchs.mjs @@ -1217,7 +1217,11 @@ melde("=== 15. Im echten Browser ==="); try { /* 390 x 844 -- ein Handy. Filipe arbeitet am Handy, und die Kopfleiste ist genau dort im September zerbrochen. */ - const sicht = await browser.newContext({ viewport: { width: 390, height: 844 } }); + /* MIT FINGER. Ohne `hasTouch` meldet der Browser einen feinen + Zeiger, und keine Regel aus `@media (pointer: coarse)` greift -- + dort stehen die 44-Pixel-Beruehrziele. Siehe pruef-fingermass.mjs. */ + const sicht = await browser.newContext({ viewport: { width: 390, height: 844 }, + hasTouch: true, isMobile: true }); await sicht.addCookies(kDogi.split("; ").map((c) => { const [name, ...rest] = c.split("="); return { name, value: rest.join("="), domain: "127.0.0.1", path: "/" }; diff --git a/server/pruef-personen-liste.mjs b/server/pruef-personen-liste.mjs index 91cc7381..db7d85f7 100644 --- a/server/pruef-personen-liste.mjs +++ b/server/pruef-personen-liste.mjs @@ -238,7 +238,11 @@ await kontext.close(); console.log("\n6) Auf dem Handy genauso"); { - const k = await browser.newContext({ viewport: { width: 390, height: 844 } }); + /* MIT FINGER. Ohne `hasTouch` meldet der Browser einen feinen + Zeiger, und keine Regel aus `@media (pointer: coarse)` greift -- + dort stehen die 44-Pixel-Beruehrziele. Siehe pruef-fingermass.mjs. */ + const k = await browser.newContext({ viewport: { width: 390, height: 844 }, + hasTouch: true, isMobile: true }); const s = await seiteFuer(k); const r = await lesen(s); ok(r.abschnitte.length === 4, `vier Überschriften (${r.abschnitte.length})`); diff --git a/server/pruef-serien.mjs b/server/pruef-serien.mjs index 023cf8a5..e31b1cd3 100644 --- a/server/pruef-serien.mjs +++ b/server/pruef-serien.mjs @@ -456,7 +456,11 @@ gleich(vorschau.trim(), "Läuft " + serienText( "Formular und Server formulieren WORTGLEICH – sonst laufen sie auseinander"); await seiteDogi.screenshot({ path: "pruef-serien-computer.png", fullPage: false }); -const handy = await browser.newContext({ viewport: { width: 390, height: 844 } }); +/* MIT FINGER. Ohne `hasTouch` meldet der Browser einen feinen + Zeiger, und keine Regel aus `@media (pointer: coarse)` greift -- + dort stehen die 44-Pixel-Beruehrziele. Siehe pruef-fingermass.mjs. */ +const handy = await browser.newContext({ viewport: { width: 390, height: 844 }, + hasTouch: true, isMobile: true }); const seiteHandy = await handy.newPage(); await seiteHandy.goto(BASIS + "/workspace/", { waitUntil: "domcontentloaded" }); await seiteHandy.click('.rolle[data-rolle="admin"]'); diff --git a/server/pruef-team.mjs b/server/pruef-team.mjs index b1c91514..10c9b9f3 100644 --- a/server/pruef-team.mjs +++ b/server/pruef-team.mjs @@ -332,7 +332,11 @@ console.log("\n=== Auf der Seite"); } /* Am Handy ebenfalls. */ - const ctx2 = await browser.newContext({ viewport: { width: 390, height: 900 } }); + /* MIT FINGER. Ohne `hasTouch` meldet der Browser einen feinen + Zeiger, und keine Regel aus `@media (pointer: coarse)` greift -- + dort stehen die 44-Pixel-Beruehrziele. Siehe pruef-fingermass.mjs. */ + const ctx2 = await browser.newContext({ viewport: { width: 390, height: 900 }, + hasTouch: true, isMobile: true }); const s2 = await ctx2.newPage(); await s2.goto(BASIS + "/workspace/", { waitUntil: "domcontentloaded" }); await s2.click('.rolle[data-rolle="admin"]'); diff --git a/server/pruef-treffchat.mjs b/server/pruef-treffchat.mjs index d4d7d48b..d758db4b 100644 --- a/server/pruef-treffchat.mjs +++ b/server/pruef-treffchat.mjs @@ -513,7 +513,11 @@ melde("=== 6b. Im Browser ==="); const { chromium } = await import( "file:///C:/Users/qciga/Documents/Obelix/Analyse/node_modules/playwright/index.mjs"); const browser = await chromium.launch(); - const kontext = await browser.newContext({ viewport: { width: 412, height: 915 } }); + /* MIT FINGER. Ohne `hasTouch` meldet der Browser einen feinen + Zeiger, und keine Regel aus `@media (pointer: coarse)` greift -- + dort stehen die 44-Pixel-Beruehrziele. Siehe pruef-fingermass.mjs. */ + const kontext = await browser.newContext({ viewport: { width: 412, height: 915 }, + hasTouch: true, isMobile: true }); const seite = await kontext.newPage(); const konsole = []; seite.on("console", (m) => { if (m.type() === "error" && !/favicon|ERR_/i.test(m.text())) konsole.push(m.text()); });