| <!DOCTYPE html> | |
| <meta charset="utf-8"> | |
| <title>Length unit 'ch' used in pseudo elements without text should be recalculated after loading a web font</title> | |
| <link rel="help" href="https://www.w3.org/TR/css-values-4/#font-relative-lengths"> | |
| <link rel="help" href="https://drafts.csswg.org/css-pseudo-4#generated-content"> | |
| <link rel="author" href="xiaochengh@chromium.org"> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <style> | |
| .before::before, | |
| .after::after, | |
| .backdrop::backdrop { | |
| font: 25px/1 "custom font", monospace; | |
| background: linear-gradient(45deg, red, blue); | |
| background-size: 1ch 1ch; | |
| } | |
| </style> | |
| <div class="container before"></div> | |
| <div class="container after"></div> | |
| <dialog class="container backdrop"></dialog> | |
| <script> | |
| function parseBackgroundSizeInPx(element, pseudoElement) { | |
| const x = getComputedStyle(element, pseudoElement).backgroundSize.split(' ')[0]; | |
| if (!x.endsWith('px')) | |
| return NaN; | |
| return parseFloat(x); | |
| } | |
| const testCases = ['before', 'after', 'backdrop']; | |
| const elements = testCases.map(testCase => document.querySelector('.' + testCase)); | |
| const asyncTests = testCases.map( | |
| testCase => async_test(`ch in pseudo-element ::${testCase} should be recalculated after loading a web font`)); | |
| // Before loading custom font, tests should be rendered with monospace | |
| // fallback and have a '1ch' measurement much shorter than 25px. | |
| for (let i = 0; i < testCases.length; ++i) { | |
| asyncTests[i].step(() => { | |
| const backgroundSizePx = parseBackgroundSizeInPx(elements[i], '::' + testCases[i]); | |
| assert_less_than(backgroundSizePx, 24); | |
| }); | |
| } | |
| // Insert custom font into style sheet and load it | |
| const customFont = new FontFace('custom font', 'url(/fonts/Ahem.ttf)'); | |
| document.fonts.add(customFont); | |
| // After loading custom font, tests should be rendered with the custom font, | |
| // which is Ahem, and have a '1ch' measurement that equals 25px. | |
| customFont.load().then( | |
| () => { | |
| for (let i = 0; i < testCases.length; ++i) { | |
| asyncTests[i].step(() => { | |
| const backgroundSizePx = parseBackgroundSizeInPx(elements[i], '::' + testCases[i]); | |
| assert_equals(backgroundSizePx, 25); | |
| asyncTests[i].done(); | |
| }); | |
| } | |
| }, | |
| () => { | |
| for (let i = 0; i < testCases.length; ++i) { | |
| asyncTests[i].step(() => { | |
| assert_unreached('Failed to load font'); | |
| }); | |
| } | |
| } | |
| ); | |
| </script> |