mirror of
https://github.com/Matysh/houseplan-card
synced 2026-09-28 19:01:34 +00:00
После #600 единственный скроллер диалога находится в shadow-root .content. Съёмка продолжала менять scrollTop у старой .body, поэтому обычный кадр устройства и кадр Display preview получались побайтово одинаковыми. Тест фиксирует владельца скролла и запрещает возврат к неработающей .body. Issue: #600 User-Visible: no
49 lines
3.4 KiB
JavaScript
49 lines
3.4 KiB
JavaScript
import test from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import { readFileSync } from 'node:fs';
|
|
|
|
import { DETERMINISTIC_ARGS } from '../demo/docs/browser-args.mjs';
|
|
|
|
// #424. Съёмка документации давала разные кадры на одном коммите: один-два
|
|
// случайных кадра из десяти расходились между прогонами, при этом внутри
|
|
// процесса всё было стабильно. Причина — композитор: частичная растеризация
|
|
// переиспользует ранее нарисованные куски тайла, а снимок берётся до конца всех
|
|
// стадий. Два флага чинят это только вместе; по отдельности ни один не помогает
|
|
// (проверено перебором, восемь прогонов на конфигурацию).
|
|
|
|
test('набор запрещает частичную растеризацию', () => {
|
|
assert.ok(DETERMINISTIC_ARGS.includes('--disable-partial-raster'),
|
|
'без этого флага кадр зависит от того, что композитор рисовал до него');
|
|
});
|
|
|
|
test('набор требует пройти все стадии композитора до отрисовки', () => {
|
|
assert.ok(DETERMINISTIC_ARGS.includes('--run-all-compositor-stages-before-draw'),
|
|
'без этого флага снимок берётся на полпути, и докрутка каждый раз своя');
|
|
});
|
|
|
|
test('прежние флаги детерминизма текста остались на месте', () => {
|
|
// #410 убрал ими основную часть дрейфа; потерять их вместе с правкой #424
|
|
// означало бы разменять одну недетерминированность на другую.
|
|
for (const flag of ['--force-color-profile=srgb', '--font-render-hinting=none', '--disable-lcd-text']) {
|
|
assert.ok(DETERMINISTIC_ARGS.includes(flag), flag);
|
|
}
|
|
});
|
|
|
|
test('съёмка берёт набор из этого модуля, а не объявляет свой', () => {
|
|
// Иначе тест стерёг бы константу, которой никто не пользуется.
|
|
const source = readFileSync(new URL('../demo/docs/capture.mjs', import.meta.url), 'utf8');
|
|
assert.match(source, /import \{ DETERMINISTIC_ARGS \} from '\.\/browser-args\.mjs'/);
|
|
assert.doesNotMatch(source, /const DETERMINISTIC_ARGS\s*=/,
|
|
'собственное объявление в capture.mjs разошлось бы с проверяемым набором');
|
|
});
|
|
|
|
test('#600 кадр превью крутит единственный скроллер hp-dialog', () => {
|
|
const source = readFileSync(new URL('../demo/docs/capture.mjs', import.meta.url), 'utf8');
|
|
const block = source.match(/if \(current\.devicePresentationPreview\) \{([\s\S]*?)\n \}/)?.[1] || '';
|
|
assert.match(block, /dialog\?\.renderRoot\?\.querySelector\('\.content'\)/,
|
|
'после #600 скроллом владеет .content в shadow root оболочки');
|
|
assert.match(block, /scroller\.scrollTop\s*\+=/);
|
|
assert.doesNotMatch(block, /querySelector\('\.body'\)/,
|
|
'.body больше не скроллер: такая съёмка даёт два одинаковых кадра');
|
|
});
|