mirror of
https://github.com/Matysh/houseplan-card
synced 2026-10-05 06:08:59 +00:00
Гард «uncaught exception внутри карточки» жил в demo/serve.mjs с 2026-07-27 и не срабатывал ни разу в самом частом случае. Счётчик читался синхронно, а Playwright доставляет pageerror асинхронно по CDP: если исключение возникло после последнего обращения смока к странице, счётчик к моменту проверки нулевой, а browser.close() уносит недоставленное событие. В логе это видно дословно — EXC печатается после результата и до OK. finish() теперь делает round-trip по открытым страницам перед чтением счётчика. Страницы регистрируются там, где создаются: ссылок на них у finish(browser, out) нет, а менять сигнатуру нельзя — так её зовут 205 смоков. Medium-1 жёлтого ревью ТЗ закрыт расширением, а не оговоркой. Страницы, созданные смоком после launch(), регистрация в launchInternal не покрывает: smoke_zoom_flash печатал своё EXC2 мимо счётчика, три страницы smoke_svg_sandbox не имели слушателя вовсе. Документировать слепую зону в задаче, которая существует ради устранения слепой зоны, значит закрыть issue, оставив дефект. Наружу отдана одна функция watchPage(page): подписка и регистрация неразделимы, иначе появится страница, чьи исключения считаются, а доставки не ждёт никто. Разрыв оказался шире, чем в ревью: проверка по всему набору нашла ещё два файла со своей подпиской — smoke_cold_view_toggle и smoke_cold_view_vacuum. Они не слепая зона, их страница приходит из launchColdView и уже зарегистрирована, а свой счётчик они превращают в отдельное утверждение. Поэтому инвариант сформулирован как «ни одна страница не создаётся мимо гарда» и закреплён по всему набору, а не по двум названным файлам. reportPageErrors() из #407 стал асинхронным: второй читатель счётчика обязан ждать доставку так же, как finish(). Пять смоков получили await. Фикстура smoke_danger_confirmation приведена к объявленному типу: без binding и bindingMode _bindingHasHaPage падал на undefined.split(':') — два исключения, которых гард не видел. Дефекта поведения нет, все 15 мест в src/, создающих диалог, binding пишут; врала фикстура. Два отступления от ТЗ, каждое по измеренной причине. Пробы лежат в demo/guard/, а не demo/fixtures/: последний входит в корпус sourceFingerprint, и каждый файл там объявил бы устаревшими бандл, скриншот-индекс и golden-индекс — пробы же не касаются ни одного пикселя. Поведение доказывается в job со браузером, а не в npm test: job «Фронтенд» браузеры не ставит, и тест молча скипался бы — тот самый тихий успех, против которого вся задача. Issue: #404 User-Visible: no
19 lines
1.4 KiB
Markdown
19 lines
1.4 KiB
Markdown
# Пробы гарда исключений (#404)
|
|
|
|
Здесь лежат фикстуры, которые **должны падать**: каждая проверяет, что гард
|
|
«uncaught exception внутри карточки» умеет краснеть, а не только объявлен.
|
|
|
|
Три причины, по которым это отдельный каталог, а не `demo/smoke_*` и не
|
|
`demo/fixtures/`:
|
|
|
|
1. **Не `smoke_*`** — иначе шарды CI будут гонять заведомо красный файл и
|
|
покрасят себя.
|
|
2. **Не `demo/fixtures/`** — этот каталог входит в корпус `sourceFingerprint`
|
|
(`scripts/source-fingerprint.mjs`), то есть каждый новый `.mjs` там объявляет
|
|
устаревшими закоммиченный бандл, скриншот-индекс документации и golden-индекс.
|
|
Пробы гарда ни одного пикселя не касаются, платить пересъёмкой за них нечем.
|
|
3. **Каталог, а не файл** — проб три, и они читаются как набор.
|
|
|
|
Запускает их `verify-guard.mjs`; он же вызывается из job «Смоки в браузере»
|
|
и служит guard'ом двух мутантов в `scripts/mutation-gate.mjs`.
|