WPT
wpt / css / css-fonts / variations / at-font-face-descriptors.html
Spec: CSS Fonts ↗
Runs: Chrome 155.0.8038.0 (wpt@7addae031, 2026-09-02) | Firefox 157.0a1 (wpt@7addae031, 2026-09-02) | Safari 251 preview (wpt@5ce815a83, 2026-08-27) | Ladybird 1.0-a7884 (wpt@b1a7025f8, 2026-09-02) | Servo Servo 0.6 (wpt@09159dcb3, 2026-09-02) | Blitz 188486089 (wpt@a95401e4e, 2026-09-02)
View on the Blitz WPT dashboard | Open test on wpt.live | wpt.fyi
| Chrome | Firefox | Safari | Ladybird | Servo | Blitz | |
|---|---|---|---|---|---|---|
| Total | 85/88 | 0/88 | 84/88 | 75/88 | 0/88 | 0/88 |
| Subtest | Chrome | Firefox | Safari | Ladybird | Servo | Blitz |
|---|---|---|---|---|---|---|
| font-weight(valid): 'normal' keyword: normal | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-weight(valid): 'bold' keyword: bold | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-weight(valid): 'auto' keyword inside @font-face: auto | PASS | FAIL | FAIL | PASS | FAIL | FAIL |
| font-weight(invalid): 'lighter' keyword inside @font-face: lighter | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-weight(invalid): 'bolder' keyword inside @font-face: bolder | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-weight(invalid): Extra content after keyword: bold a | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-weight(valid): Values that are not multiple of 100 should be parsed successfully: 401 | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-weight(valid): Non-integer values should be parsed successfully: 400.1 | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-weight(valid): Minimum allowed value should be parsed successfully: 1 | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-weight(invalid): Values below minimum should be rejected: 0.999 | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-weight(invalid): Values below zero should be rejected: -100 | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-weight(valid): Maximum allowed value should be parsed successfully: 1000 | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-weight(invalid): Values above maximum should be rejected: 1000.001 | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-weight(invalid): Extra content after value: 100 a | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-weight(valid): Simple calc value: calc(100.5) | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-weight(valid): Out-of-range simple calc value: calc(1001) | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-weight(valid): Valid calc expression: calc(100.5*3 + 50.5) | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-weight(valid): Valid calc expression with out-of-range value: calc(100.5*3 + 800) | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-weight(invalid): Valid calc expression with units: calc(100.5px + 50.5px) | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-weight(valid): Simple range: 100 900 | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-weight(valid): Simple range with equal upper and lower bounds: 500 500 | FAIL | FAIL | PASS | FAIL | FAIL | FAIL |
| font-weight(invalid): Lower bound out of range: 0.9 100 | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-weight(invalid): Upper bound out of range: 100 1001 | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-weight(valid): Lower bound calc(): calc(100 + 100) 400 | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-weight(valid): Upper bound calc(): 200 calc(200 + 200) | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-weight(valid): Both bounds are calc(): calc(100 + 100) calc(200 + 200) | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-weight(valid): Bounds out of order are valid: 400 200 | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-weight(invalid): Extra content after upper bound: 100 200 300 | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-stretch(valid): 'ultra-condensed' keyword: ultra-condensed | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-stretch(valid): 'extra-condensed' keyword: extra-condensed | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-stretch(valid): 'condensed' keyword: condensed | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-stretch(valid): 'semi-condensed' keyword: semi-condensed | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-stretch(valid): 'normal' keyword: normal | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-stretch(valid): 'semi-expanded' keyword: semi-expanded | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-stretch(valid): 'expanded' keyword: expanded | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-stretch(valid): 'extra-expanded' keyword: extra-expanded | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-stretch(valid): 'ultra-expanded' keyword: ultra-expanded | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-stretch(invalid): Extra content after value: expanded a | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-stretch(valid): 'auto' keyword inside @font-face: auto | PASS | FAIL | FAIL | PASS | FAIL | FAIL |
| font-stretch(valid): Legal percentage: 1% | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-stretch(valid): Legal percentage: 10.5% | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-stretch(valid): Legal percentage: 100% | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-stretch(valid): Legal percentage: 1000% | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-stretch(invalid): Only percentages, not numbers allowed: 100 | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-stretch(invalid): Negative values are illegal: -1% | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-stretch(valid): Zero is legal: 0% | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-stretch(invalid): Extra content after value: 100% a | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-stretch(valid): Simple calc value: calc(200.5%) | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-stretch(valid): Valid calc expression: calc(50%*2 - 20%) | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-stretch(valid): Negative calc value (to be clamped): calc(-100%) | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-stretch(valid): Negative calc expression (to be clamped): calc(50% - 50%*2) | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-stretch(invalid): Unit-less calc value: calc(100) | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-stretch(invalid): Calc value with units: calc(100px) | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-stretch(valid): Simple range: 100% 200% | PASS | FAIL | PASS | FAIL | FAIL | FAIL |
| font-stretch(valid): Simple range with equal upper and lower bounds: 100% 100% | FAIL | FAIL | PASS | FAIL | FAIL | FAIL |
| font-stretch(invalid): Lower bound out of range: -100% 100% | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-stretch(valid): Lower bound calc(): calc(10% + 10%) 30% | PASS | FAIL | PASS | FAIL | FAIL | FAIL |
| font-stretch(valid): Upper bound calc(): 10% calc(10% + 10%) | PASS | FAIL | PASS | FAIL | FAIL | FAIL |
| font-stretch(valid): Both bounds are calc(): calc(10% + 10%) calc(20% + 20%) | PASS | FAIL | PASS | FAIL | FAIL | FAIL |
| font-stretch(valid): Bounds out of order: 200% 100% | PASS | FAIL | PASS | FAIL | FAIL | FAIL |
| font-stretch(invalid): Extra content after upper bound: 100% 200% 300% | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-style(valid): 'normal' keyword: normal | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-style(valid): 'italic' keyword: italic | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-style(valid): 'oblique' keyword: oblique | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-style(valid): 'auto' keyword inside @font-face: auto | PASS | FAIL | FAIL | PASS | FAIL | FAIL |
| font-style(invalid): 'italic' followed by angle: italic 20deg | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-style(invalid): Extra content after keyword: italic a | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-style(valid): 'oblique' followed by zero degrees: oblique 0deg | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-style(valid): 'oblique' followed by former default 20deg angle: oblique 20deg | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-style(valid): 'oblique' followed by maxumum 90 degree angle: oblique 90deg | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-style(valid): 'oblique' followed by minimum -90 degree angle: oblique -90deg | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-style(valid): 'oblique' followed by calc with out of range value (should be clamped): oblique calc(91deg) | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-style(valid): 'oblique' followed by calc with out of range value (should be clamped): oblique calc(-91deg) | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-style(valid): 'oblique' followed by angle in radians: oblique 0rad | PASS | FAIL | PASS | FAIL | FAIL | FAIL |
| font-style(invalid): 'oblique' followed by unit-less number: oblique 20 | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-style(invalid): 'oblique' followed by non-angle: oblique 20px | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-style(invalid): 'oblique' followed by non-number: oblique a | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-style(invalid): 'oblique' followed by isolated minus: oblique - | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-style(invalid): 'oblique' followed by minus and angle separated by space: oblique - 20deg | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-style(invalid): 'oblique' followed by minus and non-number: oblique -a | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-style(valid): Simple range: oblique 10deg 20deg | PASS | FAIL | PASS | FAIL | FAIL | FAIL |
| font-style(valid): Simple range with equal upper and lower bounds: oblique 10deg 10deg | FAIL | FAIL | PASS | FAIL | FAIL | FAIL |
| font-style(valid): Simple range with equal upper and lower bounds: oblique 0deg 0deg | PASS | FAIL | PASS | FAIL | FAIL | FAIL |
| font-style(valid): Simple range with former default angle for both bounds: oblique 20deg 20deg | PASS | FAIL | FAIL | FAIL | FAIL | FAIL |
| font-style(valid): Bounds out of order: oblique 20deg 10deg | PASS | FAIL | PASS | FAIL | FAIL | FAIL |
| font-style(invalid): Lower bound out of range: oblique -100deg 20deg | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-style(invalid): Upper bound out of range: oblique 20deg 100deg | PASS | FAIL | PASS | PASS | FAIL | FAIL |
| font-style(invalid): Extra content after upper bound: oblique 10deg 20deg 30deg | PASS | FAIL | PASS | PASS | FAIL | FAIL |