// @vitest-environment jsdom import { describe, it, expect } from 'vitest'; import { buildDumpHtmlScript } from './browser.js'; /** * dumpHtml がページ内で走らせる文字列を jsdom の上で実際に評価して、 * 生の HTML に入力欄の中身が載らないことを見る(issue #1236 レビュー)。 * * 入力した文字列を `value` **属性**へ書き戻すページ(React の制御された * input など)では、打ち込んだ値がそのまま HTML に現れる。ここはその形を * 直接置いて確かめる。ブラウザを通す経路の確認は * browser.recording-secret.e2e.test.ts(http サーバ + 本物の Chromium)。 */ function dump(html: string, selector?: string, depth = 3): string { document.body.innerHTML = html; return (0, eval)(buildDumpHtmlScript(selector, depth)) as string; } describe('buildDumpHtmlScript — value 属性に残った中身', () => { it('パスワード欄の value 属性を伏せる', () => { const out = dump(''); expect(out).not.toContain('hunter2-topsecret'); expect(out).toContain('value="[masked]"'); }); it('ふつうの欄の value 属性はそのまま残す(伏せ過ぎの回帰)', () => { const out = dump(''); expect(out).toContain('value="alice-visible"'); expect(out).not.toContain('[masked]'); }); it('選んだ要素そのものが入力欄でも伏せる(根は querySelectorAll に出ない)', () => { const out = dump( '', '#pw', ); expect(out).not.toContain('hunter2-topsecret'); expect(out).toContain('value="[masked]"'); }); it('名札だけが手掛かりの欄も伏せる(「表示」で伏せ字を解いた欄)', () => { const out = dump(''); expect(out).not.toContain('hunter2-topsecret'); expect(out).toContain('value="[masked]"'); }); it('`