fix(gateway): 최근 턴 글꼴을 일반 글꼴로 복원
공개 현황 이력이 Gateway 본문의 Pretendard 글꼴을 상속하게 하고, serif 재유입 검사와 실제 Chromium computed font 검증을 추가한다.
This commit is contained in:
@@ -115,6 +115,13 @@ for (const viewport of [
|
|||||||
await expect(lines.nth(1)).toContainText('<span class="name" onclick=');
|
await expect(lines.nth(1)).toContainText('<span class="name" onclick=');
|
||||||
expect(await page.evaluate(() => (globalThis as Record<string, unknown>).__legacyLogXss)).toBeUndefined();
|
expect(await page.evaluate(() => (globalThis as Record<string, unknown>).__legacyLogXss)).toBeUndefined();
|
||||||
|
|
||||||
|
const pageFontFamily = await page.locator('body').evaluate((element) => getComputedStyle(element).fontFamily);
|
||||||
|
const historyFontFamily = await page
|
||||||
|
.locator('.status-history')
|
||||||
|
.evaluate((element) => getComputedStyle(element).fontFamily);
|
||||||
|
expect(historyFontFamily).toBe(pageFontFamily);
|
||||||
|
expect(historyFontFamily).toContain('Pretendard');
|
||||||
|
|
||||||
const geometry = await lines.evaluateAll((elements) =>
|
const geometry = await lines.evaluateAll((elements) =>
|
||||||
elements.map((element) => {
|
elements.map((element) => {
|
||||||
const rect = element.getBoundingClientRect();
|
const rect = element.getBoundingClientRect();
|
||||||
@@ -144,7 +151,7 @@ for (const viewport of [
|
|||||||
const name = `legacy-log-gateway-${viewport.name}`;
|
const name = `legacy-log-gateway-${viewport.name}`;
|
||||||
await writeFile(
|
await writeFile(
|
||||||
resolve(artifactRoot, `${name}.json`),
|
resolve(artifactRoot, `${name}.json`),
|
||||||
`${JSON.stringify({ viewport, geometry }, null, 2)}\n`,
|
`${JSON.stringify({ viewport, pageFontFamily, historyFontFamily, geometry }, null, 2)}\n`,
|
||||||
'utf8'
|
'utf8'
|
||||||
);
|
);
|
||||||
await page.screenshot({ path: resolve(artifactRoot, `${name}.png`), fullPage: true });
|
await page.screenshot({ path: resolve(artifactRoot, `${name}.png`), fullPage: true });
|
||||||
|
|||||||
@@ -362,7 +362,7 @@ const handlePasswordReset = async (): Promise<void> => {
|
|||||||
border-top: 1px solid #444;
|
border-top: 1px solid #444;
|
||||||
padding: 8px 12px;
|
padding: 8px 12px;
|
||||||
color: #ddd;
|
color: #ddd;
|
||||||
font-family: 'Times New Roman', serif;
|
font-family: inherit;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
line-height: 1.35;
|
line-height: 1.35;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
import assert from 'node:assert/strict';
|
||||||
|
import { readFile, readdir } from 'node:fs/promises';
|
||||||
|
import path from 'node:path';
|
||||||
|
import { describe, it } from 'node:test';
|
||||||
|
|
||||||
|
const sourceRoot = path.resolve(import.meta.dirname, '../src');
|
||||||
|
const fontFamilyDeclaration = /font-family\s*:\s*([^;]+);/g;
|
||||||
|
const fontShorthandDeclaration = /(?:^|[\s{])font\s*:\s*([^;]+);/gm;
|
||||||
|
const forcedSerifFamily = /Times New Roman|(?<![\w-])serif(?![\w-])/i;
|
||||||
|
|
||||||
|
const listStyleSources = async () => {
|
||||||
|
const entries = await readdir(sourceRoot, { recursive: true, withFileTypes: true });
|
||||||
|
|
||||||
|
return entries
|
||||||
|
.filter((entry) => entry.isFile() && (entry.name.endsWith('.css') || entry.name.endsWith('.vue')))
|
||||||
|
.map((entry) => path.join(entry.parentPath, entry.name))
|
||||||
|
.sort();
|
||||||
|
};
|
||||||
|
|
||||||
|
describe('gateway content font contract', () => {
|
||||||
|
it('does not force Times New Roman or a generic serif family', async () => {
|
||||||
|
const violations = [];
|
||||||
|
|
||||||
|
for (const file of await listStyleSources()) {
|
||||||
|
const source = await readFile(file, 'utf8');
|
||||||
|
for (const match of source.matchAll(fontFamilyDeclaration)) {
|
||||||
|
const value = match[1]?.trim() ?? '';
|
||||||
|
if (forcedSerifFamily.test(value)) {
|
||||||
|
violations.push(`${path.relative(sourceRoot, file)}: font-family: ${value}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const match of source.matchAll(fontShorthandDeclaration)) {
|
||||||
|
const value = match[1]?.trim() ?? '';
|
||||||
|
if (forcedSerifFamily.test(value)) {
|
||||||
|
violations.push(`${path.relative(sourceRoot, file)}: font: ${value}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.deepEqual(violations, []);
|
||||||
|
});
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user