Zehn Messungen bekommen einen Finger -- und eine Zeitbombe faellt auf
Die Grundlinie der Fingerwache sinkt von 17 auf 6.
WAS UMGESTELLT WURDE
pruef-alter, pruef-countdown, pruef-gespraech, pruef-treffchat,
pruef-modi-verborgen, pruef-nachwuchs, pruef-personen-liste,
pruef-serien, pruef-team, pruef-kalender.
Alle zehn legen ein eigenes Handyfenster an; dort fehlte nur
`hasTouch`. Ohne ihn meldet der Browser einen feinen Zeiger, und
keine Regel aus `@media (pointer: coarse)` greift -- dort stehen die
44-Pixel-Beruehrziele.
JEDE EINZELN GELAUFEN, ALLE GRUEN
Diese Seiten halten die Fingerregeln also schon ein. Es hatte nur
nie jemand nachgesehen.
Vorher geprueft, wie gross jede ist: 1 bis 7 Seitenaufrufe, 1 bis 5
Fenster -- echte Einzelpruefungen. (Zum Vergleich: die Pruefung von
gestern Nacht hatte 244 Seitenaufrufe, und genau das hatte ich
vorher nicht nachgesehen.)
DIE ZEITBOMBE IN pruef-kalender
Beim Umstellen fiel sie rot aus -- zweimal, an einer Stelle, die mit
dem Finger nichts zu tun hat:
FEHL im naechsten Monat ist kein Tag mehr "heute"
Gegen den ausgelieferten Stand gemessen: identisch rot. Nicht
meine Aenderung, sondern der Kalender.
Heute ist der 29. September. Das Oktober-Raster zeigt 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 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. Dasselbe Muster wie
`gate-oeffnung.mjs` am 06.09.2026 im Shop: Ein Test, der die
Wanduhr als Annahme benutzt, misst irgendwann das Gegenteil.
Gefragt wird jetzt, was gemeint war: Ein EIGENER Tag des
Folgemonats darf nie „heute" sein; ein mitgezeigter Randtag
(`data-fremd="ja"`) dagegen sehr wohl, und zwar genau dann, wenn er
es ist. Das gilt an jedem Tag des Jahres. Die Meldung nennt jetzt
beide Zahlen:
ok im naechsten Monat ist kein EIGENER Tag mehr "heute"
(0 eigene, 1 mitgezeigte Randtage)
WAS UEBRIG BLEIBT: SECHS SCHWERE FAELLE
pruef-befinden, pruef-notizen, pruef-teamlage-karten,
pruef-terminregel, pruef-werdegang, pruef-grosscheck.
Dort schaltet `setViewportSize` mitten im Ablauf auf Handyformat um
-- und der Finger laesst sich nachtraeglich nicht setzen, er gehoert
zum Kontext. Jeder Fall 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.
GEPRUEFT
alle zehn einzeln: EXIT 0, keine FEHL-Zeile
pruef-kalender EXIT 0 (vorher 2 Fehlschlaege, auch auf HEAD)
pruef-fingermass 3 / 0, Grundlinie 6
This commit is contained in:
@@ -278,7 +278,11 @@ melde("=== 7. Im Browser ===");
|
|||||||
const { chromium } = await import(
|
const { chromium } = await import(
|
||||||
"file:///C:/Users/qciga/Documents/Obelix/Analyse/node_modules/playwright/index.mjs");
|
"file:///C:/Users/qciga/Documents/Obelix/Analyse/node_modules/playwright/index.mjs");
|
||||||
const browser = await chromium.launch();
|
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 seite = await kontext.newPage();
|
||||||
const konsole = [];
|
const konsole = [];
|
||||||
seite.on("console", (m) => { if (m.type() === "error" && !/favicon|ERR_/i.test(m.text())) konsole.push(m.text()); });
|
seite.on("console", (m) => { if (m.type() === "error" && !/favicon|ERR_/i.test(m.text())) konsole.push(m.text()); });
|
||||||
|
|||||||
@@ -192,7 +192,11 @@ const { chromium } = await import(
|
|||||||
const browser = await chromium.launch();
|
const browser = await chromium.launch();
|
||||||
try {
|
try {
|
||||||
const HOEHE = 844;
|
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) => {
|
await kontext.addCookies(keks.split("; ").map((k) => {
|
||||||
const [name, ...rest] = k.split("=");
|
const [name, ...rest] = k.split("=");
|
||||||
return { name, value: rest.join("="), domain: "127.0.0.1", path: "/" };
|
return { name, value: rest.join("="), domain: "127.0.0.1", path: "/" };
|
||||||
|
|||||||
@@ -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
|
`setViewportSize` sitzt auf einer Seite, die den Finger schon
|
||||||
hat), die zweite ein echter Fund und sofort repariert.
|
hat), die zweite ein echter Fund und sofort repariert.
|
||||||
|
|
||||||
Die erste Zahl, die eine Wache liefert, ist selten die richtige. */
|
Die erste Zahl, die eine Wache liefert, ist selten die richtige.
|
||||||
const GRUNDLINIE = 17;
|
|
||||||
|
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
|
/* Ab wann ist ein Fenster ein Telefon? 860 ist die Grenze, die im
|
||||||
Haus schon in mess-reaktion und mess-chat-optik steht. Darueber
|
Haus schon in mess-reaktion und mess-chat-optik steht. Darueber
|
||||||
|
|||||||
@@ -268,7 +268,11 @@ melde("=== 6. Wie es aussieht ===");
|
|||||||
"file:///C:/Users/qciga/Documents/Obelix/Analyse/node_modules/playwright/index.mjs");
|
"file:///C:/Users/qciga/Documents/Obelix/Analyse/node_modules/playwright/index.mjs");
|
||||||
const browser = await chromium.launch();
|
const browser = await chromium.launch();
|
||||||
try {
|
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) => {
|
await kontext.addCookies(dogi.split("; ").map((k) => {
|
||||||
const [name, ...rest] = k.split("=");
|
const [name, ...rest] = k.split("=");
|
||||||
return { name, value: rest.join("="), domain: "127.0.0.1", path: "/" };
|
return { name, value: rest.join("="), domain: "127.0.0.1", path: "/" };
|
||||||
|
|||||||
@@ -192,6 +192,12 @@ const lesen = (seite) => seite.evaluate(() => ({
|
|||||||
kwSpalten: document.querySelectorAll(".k-kw").length,
|
kwSpalten: document.querySelectorAll(".k-kw").length,
|
||||||
kwWerte: [...document.querySelectorAll(".k-kw")].map((k) => k.textContent),
|
kwWerte: [...document.querySelectorAll(".k-kw")].map((k) => k.textContent),
|
||||||
heuteZellen: document.querySelectorAll('.k-tag[data-heute="ja"]').length,
|
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,
|
feiertagZellen: document.querySelectorAll('.k-tag[data-feiertag="ja"]').length,
|
||||||
fremdZellen: document.querySelectorAll('.k-tag[data-fremd="ja"]').length,
|
fremdZellen: document.querySelectorAll('.k-tag[data-fremd="ja"]').length,
|
||||||
/* Eintraege */
|
/* Eintraege */
|
||||||
@@ -344,7 +350,30 @@ for (const [breite, wie] of [[1440, "Computer"], [390, "Handy"]]) {
|
|||||||
await seite.waitForTimeout(400);
|
await seite.waitForTimeout(400);
|
||||||
const weiter = await lesen(seite);
|
const weiter = await lesen(seite);
|
||||||
ok(weiter.zeitraum !== vorher, `vorwärts blättern wechselt den Monat (${vorher} → ${weiter.zeitraum})`);
|
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.click("#heute-knopf");
|
||||||
await seite.waitForTimeout(400);
|
await seite.waitForTimeout(400);
|
||||||
const zurueck = await lesen(seite);
|
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");
|
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");
|
const sPunkt = await anmelden(kPunkt, "admin", "CODE-DOGI-0001");
|
||||||
try {
|
try {
|
||||||
await sPunkt.goto(BASIS + "/workspace/kalender.html", { waitUntil: "networkidle" });
|
await sPunkt.goto(BASIS + "/workspace/kalender.html", { waitUntil: "networkidle" });
|
||||||
|
|||||||
@@ -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");
|
"file:///C:/Users/qciga/Documents/Obelix/Analyse/node_modules/playwright/index.mjs");
|
||||||
const browser = await chromium.launch();
|
const browser = await chromium.launch();
|
||||||
try {
|
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 seite = await kontext.newPage();
|
||||||
const konsole = [];
|
const konsole = [];
|
||||||
seite.on("console", (e) => { if (e.type() === "error") konsole.push(e.text()); });
|
seite.on("console", (e) => { if (e.type() === "error") konsole.push(e.text()); });
|
||||||
|
|||||||
@@ -1217,7 +1217,11 @@ melde("=== 15. Im echten Browser ===");
|
|||||||
try {
|
try {
|
||||||
/* 390 x 844 -- ein Handy. Filipe arbeitet am Handy, und die
|
/* 390 x 844 -- ein Handy. Filipe arbeitet am Handy, und die
|
||||||
Kopfleiste ist genau dort im September zerbrochen. */
|
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) => {
|
await sicht.addCookies(kDogi.split("; ").map((c) => {
|
||||||
const [name, ...rest] = c.split("=");
|
const [name, ...rest] = c.split("=");
|
||||||
return { name, value: rest.join("="), domain: "127.0.0.1", path: "/" };
|
return { name, value: rest.join("="), domain: "127.0.0.1", path: "/" };
|
||||||
|
|||||||
@@ -238,7 +238,11 @@ await kontext.close();
|
|||||||
|
|
||||||
console.log("\n6) Auf dem Handy genauso");
|
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 s = await seiteFuer(k);
|
||||||
const r = await lesen(s);
|
const r = await lesen(s);
|
||||||
ok(r.abschnitte.length === 4, `vier Überschriften (${r.abschnitte.length})`);
|
ok(r.abschnitte.length === 4, `vier Überschriften (${r.abschnitte.length})`);
|
||||||
|
|||||||
@@ -456,7 +456,11 @@ gleich(vorschau.trim(), "Läuft " + serienText(
|
|||||||
"Formular und Server formulieren WORTGLEICH – sonst laufen sie auseinander");
|
"Formular und Server formulieren WORTGLEICH – sonst laufen sie auseinander");
|
||||||
|
|
||||||
await seiteDogi.screenshot({ path: "pruef-serien-computer.png", fullPage: false });
|
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();
|
const seiteHandy = await handy.newPage();
|
||||||
await seiteHandy.goto(BASIS + "/workspace/", { waitUntil: "domcontentloaded" });
|
await seiteHandy.goto(BASIS + "/workspace/", { waitUntil: "domcontentloaded" });
|
||||||
await seiteHandy.click('.rolle[data-rolle="admin"]');
|
await seiteHandy.click('.rolle[data-rolle="admin"]');
|
||||||
|
|||||||
@@ -332,7 +332,11 @@ console.log("\n=== Auf der Seite");
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Am Handy ebenfalls. */
|
/* 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();
|
const s2 = await ctx2.newPage();
|
||||||
await s2.goto(BASIS + "/workspace/", { waitUntil: "domcontentloaded" });
|
await s2.goto(BASIS + "/workspace/", { waitUntil: "domcontentloaded" });
|
||||||
await s2.click('.rolle[data-rolle="admin"]');
|
await s2.click('.rolle[data-rolle="admin"]');
|
||||||
|
|||||||
@@ -513,7 +513,11 @@ melde("=== 6b. Im Browser ===");
|
|||||||
const { chromium } = await import(
|
const { chromium } = await import(
|
||||||
"file:///C:/Users/qciga/Documents/Obelix/Analyse/node_modules/playwright/index.mjs");
|
"file:///C:/Users/qciga/Documents/Obelix/Analyse/node_modules/playwright/index.mjs");
|
||||||
const browser = await chromium.launch();
|
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 seite = await kontext.newPage();
|
||||||
const konsole = [];
|
const konsole = [];
|
||||||
seite.on("console", (m) => { if (m.type() === "error" && !/favicon|ERR_/i.test(m.text())) konsole.push(m.text()); });
|
seite.on("console", (m) => { if (m.type() === "error" && !/favicon|ERR_/i.test(m.text())) konsole.push(m.text()); });
|
||||||
|
|||||||
Reference in New Issue
Block a user