fix(noter): søgefeltet taber ikke bogstaver, og det nyeste svar vinder
Fra en skærmoptagelse, to billeder i sekundet:
2,5 s feltet "verd" listen ufiltreret
3,0 s feltet "nde" listen filtreret
6,0 s feltet "verdande" listen ufiltreret
6,5 s feltet tomt listen filtreret
To fejl oven i hinanden, og den ene er min fra #79.
Bogstaverne forsvandt, fordi adressen blev skrevet ved hvert tastetryk, så en
søgning kunne gemmes og deles. `replaceState` opdaterer `$page.url` et øjeblik
efter, den kaldes, så to hurtige tastetryk gav en effekt, der læste den *forrige*
adresse, fandt den uenig med det skrevne, og skrev den gamle værdi tilbage i
feltet. `untrack` fjernede sløjfen mellem de to effekter; den fjernede ikke
kapløbet med browserens egen forsinkelse.
En markør, der skal holde to retninger enige, taber kapløbet et sted. Adressen
skrives derfor ikke længere af siden — kun af navigation — og der er én effekt
tilbage, som læser den. Prisen er, at et ryddet søgefelt ikke rydder `q` af
adressen. Det er en mindre løgn end at æde bogstaver.
Den anden fejl har ligget der hele tiden: `load()` havde ingen vagt mod forældede
svar. To hentninger kunne være undervejs på én gang, og den langsomste vandt — så
listen viste svaret på et spørgsmål, der ikke længere blev stillet. Pausen på
250 ms gjorde det sjældnere og kunne ikke gøre det umuligt; det stod endda i
kommentaren ved siden af. Hver hentning har nu et nummer, og kun det nyeste
skrives i listen.
Prøven skriver i et menneskeligt tempo, for det var hastigheden, der afslørede
det, og holder den ene af to hentninger tilbage for at tvinge rækkefølgen om.
Kørt mod den gamle kode fejler den med `Received: ""` — feltet var tømt helt.
Bemærket: "en gruppe er en side med sine projekter" fejlede to fulde kørsler i
træk og bestod på den tredje, og alene. Den er ikke rørt her. Sammen med "en delt
note tager de noter med" i går er der nu to prøver, der flakker.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
c62dcc3d7c
commit
87054ac8ca
+78
-3
@@ -4687,10 +4687,11 @@ test('en søgning i ⌘K efterlader de træffere, den fandt', async ({ page }) =
|
||||
await expect(list.getByText('Fyrreskov syd')).toBeVisible();
|
||||
await expect(list.getByText('Egeskov')).toHaveCount(0);
|
||||
|
||||
// Og adressen lyver ikke, når feltet tømmes: uden det ville et genbesøg hente
|
||||
// en søgning tilbage, man selv havde ryddet væk.
|
||||
// Feltet kan tømmes, og listen kommer hel igen. Adressen beholder sit `q` —
|
||||
// den skrives kun af navigation. Den første udgave skrev den ved hvert
|
||||
// tastetryk, så den kunne deles, og det kostede bogstaver ud af feltet; se
|
||||
// prøven nedenfor.
|
||||
await page.getByPlaceholder('Søg i noter').fill('');
|
||||
await expect(page).not.toHaveURL(/[?&]q=/);
|
||||
await expect(list.getByText('Egeskov')).toBeVisible();
|
||||
|
||||
expect(trouble).toEqual([]);
|
||||
@@ -4821,3 +4822,77 @@ test('en opgaves tekst kan læses færdig på en telefon', async ({ page }) => {
|
||||
|
||||
expect(trouble).toEqual([]);
|
||||
});
|
||||
/**
|
||||
* Søgefeltet taber ikke bogstaver, og listen viser det, der blev spurgt om.
|
||||
*
|
||||
* Fra en skærmoptagelse, to billeder i sekundet:
|
||||
*
|
||||
* 2,5 s feltet "verd" listen ufiltreret
|
||||
* 3,0 s feltet "nde" listen filtreret
|
||||
* 6,0 s feltet "verdande" listen ufiltreret
|
||||
* 6,5 s feltet tomt listen filtreret
|
||||
*
|
||||
* To fejl oven i hinanden.
|
||||
*
|
||||
* Bogstaverne forsvandt, fordi adressen blev skrevet ved hvert tastetryk:
|
||||
* `replaceState` opdaterer `$page.url` et øjeblik efter, den kaldes, så en effekt
|
||||
* læste den forrige adresse og skrev den gamle værdi tilbage i feltet.
|
||||
*
|
||||
* Og resultaterne landede for sent, fordi to hentninger kunne være undervejs på
|
||||
* én gang uden at nogen holdt styr på, hvilken der gjaldt. Den langsomste vandt.
|
||||
*/
|
||||
test('søgefeltet taber ikke bogstaver, og det nyeste svar vinder', async ({ page }) => {
|
||||
const trouble = watchForTrouble(page);
|
||||
await page.goto('/noter');
|
||||
|
||||
// Sin egen note at finde. Et ord fra en anden prøve ville gøre den her
|
||||
// afhængig af rækkefølgen, og den kobling har allerede narret mig i denne fil.
|
||||
await page.getByRole('button', { name: 'Ny note' }).click();
|
||||
const krop = page.getByLabel('Notens tekst');
|
||||
await krop.fill('Kaffemølle\n\nnoget om den');
|
||||
await krop.blur();
|
||||
await expect(page.getByText('Gemt', { exact: true })).toBeVisible();
|
||||
await expect(page.locator('.list').getByText('Kaffemølle', { exact: true })).toBeVisible();
|
||||
|
||||
// Skrevet i et tempo, et menneske kan skrive i. Det var hastigheden, der
|
||||
// afslørede det: en pause mellem hvert bogstav skjuler kapløbet helt.
|
||||
const felt = page.getByPlaceholder('Søg i noter');
|
||||
await felt.click();
|
||||
await page.keyboard.type('kaffemølle', { delay: 40 });
|
||||
await expect(felt).toHaveValue('kaffemølle');
|
||||
|
||||
// Og det bliver stående. Fejlen viste sig et halvt sekund efter, ikke med det
|
||||
// samme — adressen skal nå at komme tilbage, før den kan skrive over noget.
|
||||
await page.waitForTimeout(1500);
|
||||
await expect(felt).toHaveValue('kaffemølle');
|
||||
|
||||
// Det nyeste svar vinder, også når det kommer først.
|
||||
//
|
||||
// Den første søgning holdes tilbage, den anden slippes igennem. Uden vagten
|
||||
// lander den gamle sidst og overskriver listen med svaret på et spørgsmål, der
|
||||
// ikke længere bliver stillet.
|
||||
let held;
|
||||
await page.route('**/api/v1/notes?*', async (route) => {
|
||||
const q = new URL(route.request().url()).searchParams.get('q');
|
||||
if (q === 'aaaaa' && !held) {
|
||||
held = route;
|
||||
return; // holdes, indtil den næste er kommet igennem
|
||||
}
|
||||
await route.continue();
|
||||
});
|
||||
|
||||
await felt.fill('');
|
||||
await felt.fill('aaaaa');
|
||||
await page.waitForTimeout(500);
|
||||
await felt.fill('kaffemølle');
|
||||
await page.waitForTimeout(900);
|
||||
if (held) await held.continue();
|
||||
await page.waitForTimeout(700);
|
||||
|
||||
// Feltet og listen er enige: det, der står, er det, der blev spurgt om.
|
||||
await expect(felt).toHaveValue('kaffemølle');
|
||||
await expect(page.locator('.list').getByText('Kaffemølle', { exact: true })).toBeVisible();
|
||||
|
||||
await page.unroute('**/api/v1/notes?*');
|
||||
expect(trouble).toEqual([]);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user