font-variant-shorthand-serialization.html (5013B)
1 <!doctype html> 2 <html> 3 <meta charset="utf-8"> 4 <title>Serialization of font-variant shorthand</title> 5 <link rel="author" title="Tim Nguyen" href="https://github.com/nt1m"> 6 <link rel="help" href="https://drafts.csswg.org/cssom-1/#serialize-a-css-declaration-block"> 7 <script src="/resources/testharness.js"></script> 8 <script src="/resources/testharnessreport.js"></script> 9 <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> 10 <div id="target"></div> 11 <script> 12 const cssWideKeywords = ["initial", "inherit", "unset", "revert", "revert-layer"]; 13 function test_serialization_set(expected) { 14 for (const [property, value] of Object.entries(expected)) { 15 if (!CSS.supports(`${property}: initial`)) 16 continue; 17 assert_equals(target.style[property], value, `${property} was set`); 18 } 19 } 20 function setWithValue(value) { 21 return { 22 "font-variant-ligatures": value, 23 "font-variant-caps": value, 24 "font-variant-alternates": value, 25 "font-variant-numeric": value, 26 "font-variant-east-asian": value, 27 "font-variant-position": value, 28 "font-variant-emoji": value, 29 "font-variant": value 30 }; 31 } 32 const emptySet = setWithValue(""); 33 const normalSet = setWithValue("normal"); 34 const nonDefaultValues = { 35 "font-variant-ligatures": "common-ligatures discretionary-ligatures", 36 "font-variant-caps": "small-caps", 37 "font-variant-alternates": "historical-forms", 38 "font-variant-numeric": "oldstyle-nums stacked-fractions", 39 "font-variant-east-asian": "ruby", 40 "font-variant-position": "sub", 41 "font-variant-emoji": "emoji", 42 }; 43 test(function(t) { 44 target.style.fontVariant = "normal"; 45 t.add_cleanup(() => target.removeAttribute("style")); 46 47 test_serialization_set(normalSet); 48 }, "font-variant: normal serialization"); 49 50 test(function(t) { 51 target.style.fontVariant = "normal"; 52 target.style.fontVariantLigatures = "none"; 53 t.add_cleanup(() => target.removeAttribute("style")); 54 55 const expected = Object.assign({}, normalSet); 56 expected["font-variant-ligatures"] = "none"; 57 expected["font-variant"] = "none"; 58 59 test_serialization_set(expected); 60 }, "font-variant: none serialization"); 61 62 test(function(t) { 63 t.add_cleanup(() => target.removeAttribute("style")); 64 for (const [property, value] of Object.entries(nonDefaultValues)) { 65 if (property == "font-variant-ligatures" || !CSS.supports(`${property}: initial`)) 66 continue; 67 target.style.fontVariant = "normal"; 68 target.style.fontVariantLigatures = "none"; 69 target.style[property] = value; 70 71 const expected = Object.assign({}, normalSet); 72 expected["font-variant-ligatures"] = "none"; 73 expected["font-variant"] = ""; 74 expected[property] = value; 75 76 test_serialization_set(expected); 77 target.removeAttribute("style"); 78 } 79 }, "font-variant-ligatures: none serialization with non-default value for another longhand"); 80 81 test(function(t) { 82 t.add_cleanup(() => target.removeAttribute("style")); 83 84 for (const [property, value] of Object.entries(nonDefaultValues)) { 85 if (!CSS.supports(`${property}: initial`)) 86 continue; 87 target.style.fontVariant = "normal"; 88 target.style[property] = value; 89 90 const expected = Object.assign({}, normalSet); 91 expected[property] = value; 92 expected["font-variant"] = value; 93 test_serialization_set(expected); 94 95 target.removeAttribute("style"); 96 } 97 }, "font-variant: normal with non-default longhands"); 98 99 test(function(t) { 100 t.add_cleanup(() => target.removeAttribute("style")); 101 for (const keyword of cssWideKeywords) { 102 target.style.fontVariant = "normal"; 103 target.style.fontVariantLigatures = keyword; 104 105 const expected = Object.assign({}, normalSet); 106 expected["font-variant-ligatures"] = keyword; 107 expected["font-variant"] = ""; 108 test_serialization_set(expected); 109 target.removeAttribute("style"); 110 } 111 }, "CSS-wide keyword in one longhand"); 112 113 test(function(t) { 114 t.add_cleanup(() => target.removeAttribute("style")); 115 116 for (const keyword of cssWideKeywords) { 117 target.style.fontVariant = keyword; 118 test_serialization_set(setWithValue(keyword)); 119 target.removeAttribute("style"); 120 } 121 }, "CSS-wide keyword in shorthand"); 122 123 test(function(t) { 124 target.style.fontVariant = "normal"; 125 target.style.font = "menu"; 126 t.add_cleanup(() => target.removeAttribute("style")); 127 128 test_serialization_set(emptySet); 129 }, "font: menu serialization"); 130 </script> 131 </html>