| <!DOCTYPE html> |
| <title>Length unit 'ch' 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="author" href="mailto:xiaochengh@chromium.org"> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <style> |
| .container { |
| font: 25px/1 "custom font", monospace; |
| } |
| |
| .test { |
| width: 1ch; |
| } |
| </style> |
| |
| <div class="container"> |
| <div class="test"></div> |
| </div> |
| |
| <div class="container" style="display: contents"> |
| <div class="test"></div> |
| </div> |
| |
| <div class="container" style="display: none"> |
| <div class="test"></div> |
| </div> |
| |
| <script> |
| function parseWidthInPx(element) { |
| const value = getComputedStyle(element).width; |
| if (!value.endsWith('px')) |
| return NaN; |
| return parseFloat(value); |
| } |
| |
| const testCases = document.querySelectorAll('.test'); |
| |
| const asyncTests = [ |
| async_test('ch in a normal div should be recalculated after loading a web font'), |
| async_test('ch in display:contents should be recalculated after loading a web font'), |
| async_test('ch in display:none 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 widthPx = parseWidthInPx(testCases[i]); |
| assert_less_than(widthPx, 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 widthPx = parseWidthInPx(testCases[i]); |
| assert_approx_equals(widthPx, 25, 0.1); |
| asyncTests[i].done(); |
| }); |
| } |
| }, |
| () => { |
| for (let i = 0; i < testCases.length; ++i) { |
| asyncTests[i].step(() => { |
| assert_unreached('Failed to load font'); |
| }); |
| } |
| } |
| ); |
| </script> |