| <!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> |