fix: preload each measured editor card
Полные бенчмарки производительности / Бенчмарки рендера и геометрии (blend) (push) Failing after 33m7s
Полные бенчмарки производительности / Бенчмарки рендера и геометрии (large-house) (push) Failing after 38m37s
Полные бенчмарки производительности / Бенчмарки рендера и геометрии (isometric) (push) Failing after 47m35s
Полные бенчмарки производительности / Бенчмарки рендера и геометрии (overlay) (push) Failing after 57m39s
Полные бенчмарки производительности / Бенчмарки рендера и геометрии (space-default) (push) Failing after 21m38s
Полные бенчмарки производительности / Бенчмарки рендера и геометрии (plan-snap) (push) Failing after 33m1s
Полные бенчмарки производительности / Бенчмарки рендера и геометрии (space-glow) (push) Failing after 24m36s
Проверка (CI) / Бэкенд: pytest в Home Assistant (push) Failing after 7m31s
Проверка (CI) / Предполётные проверки: документация, провенанс, процесс (push) Failing after 1m6s
Проверка (CI) / Классификация изменённых файлов (push) Successful in 22s
Проверка (CI) / Переиспользование: это дерево уже проверено (push) Successful in 54s
Проверка (CI) / HACS: валидация репозитория (push) Failing after 20s
Проверка (CI) / Hassfest: манифест интеграции (push) Failing after 16s
Проверка (CI) / Фронтенд: типы, юниты, мутанты, синхрон бандла (push) Failing after 9m57s
Проверка (CI) / Смоки в браузере (шард 1 из 3) (push) Skipped
Проверка (CI) / Смоки в браузере (шард 2 из 3) (push) Skipped
Проверка (CI) / Смоки в браузере (шард 3 из 3) (push) Skipped
Проверка (CI) / Смоки: все шарды зелёные (push) Skipped
Проверка (CI) / Golden-кадры против принятых эталонов (push) Skipped
Проверка (CI) / Перф-смок: бюджет времени кадра (push) Skipped

Issue: #380
User-Visible: no
This commit is contained in:
Sergey Matyunin
2026-08-30 00:55:01 +03:00
parent 285688de47
commit 9c162c0926
2 changed files with 19 additions and 0 deletions
+9
View File
@@ -5,6 +5,7 @@ import { dirname, resolve } from 'node:path';
import { launch } from './serve.mjs';
import { LARGE_HOUSE_COUNTS, makeLargeHouseFixture } from './fixtures/large-house.mjs';
import { assertFreshDemoBundle } from './bundle-freshness.mjs';
import { ensureHarnessEditorRuntime } from './editor-runtime-compat.mjs';
import { summarizeLongTasks, summarizeTimings } from './performance/evaluate.mjs';
import { assertCardContract, LARGE_HOUSE_CARD_CONTRACT } from './performance/card-contract.mjs';
@@ -52,6 +53,9 @@ await page.addStyleTag({
await page.addScriptTag({
content: `window.__hpAssertCardContract = ${assertCardContract.toString()};`,
});
await page.addScriptTag({
content: `window.__hpEnsureHarnessEditorRuntime = ${ensureHarnessEditorRuntime.toString()};`,
});
const chromium = await browser.version();
let buildFingerprint;
try {
@@ -187,6 +191,11 @@ try {
card._onLabsSnapshot({ active: Object.freeze(['iso']), space: '' });
}
card.hass = hassFor(fixture.states);
// launch() warms its own bootstrap card, but each measured sample creates
// a fresh card. Current lazy bundles therefore need their own controller
// construction; monolithic stable bundles remain immediate (#380).
if (!await window.__hpEnsureHarnessEditorRuntime(card))
throw new Error('large-house editor runtime did not preload');
window.__hpAssertCardContract(card, cardContract);
if (requiresIsometric && (typeof card._setProjection !== 'function'
|| !(card._isoGeometryCache instanceof Map))) {
+10
View File
@@ -37,6 +37,16 @@ test('large-house benchmark declares every private card member it consumes', ()
);
});
test('every measured large-house card preloads its own lazy editor runtime (#380)', () => {
const source = readFileSync(
new URL('../demo/benchmark_large_house.mjs', import.meta.url), 'utf8',
);
const create = source.indexOf("document.createElement('houseplan-card')");
const preload = source.indexOf('await window.__hpEnsureHarnessEditorRuntime(card)', create);
const contract = source.indexOf('window.__hpAssertCardContract(card, cardContract)', create);
assert.ok(create >= 0 && preload > create && contract > preload);
});
test('Glow benchmark declares every private card member it consumes', () => {
const declared = new Set([
...declaredMembers(GLOW_CARD_CONTRACT),