| <!DOCTYPE html> |
| <meta charset="utf-8" /> |
| <title>CSSOM - CSSFontFeatureValuesRule interface</title> |
| <link |
| rel="help" |
| href="https://drafts.csswg.org/css-fonts-4/#om-fontfeaturevalues" |
| /> |
| <link rel="author" title="Dominik Röttsches" href="drott@chromium.org" /> |
| <meta |
| name="assert" |
| content="CSSFontFeatureValuesRule interface is accessible and supports read and write access." |
| /> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <style></style> |
| <body></body> |
| <script> |
| let rule_initial = ` |
| @font-feature-values test_family { |
| @annotation { |
| the_first: 6; |
| } |
| @styleset { |
| yo: 7; |
| del: 4; |
| di: 10 9 4 5; |
| } |
| } |
| `; |
| |
| let rule_added = ` |
| @font-feature-values second_family { |
| @annotation { |
| yabab: 2; |
| yogog: 4; |
| bidib: 5; |
| } |
| } |
| `; |
| |
| let rule_overlap = ` |
| @font-feature-values test_family { |
| @annotation { |
| baric: 17; |
| } |
| @ornaments { |
| fooic: 1; |
| } |
| } |
| `; |
| |
| function resetStateAndTest(testFunction) { |
| var sheet = document.styleSheets[0]; |
| while (sheet.cssRules.length > 0) sheet.deleteRule(0); |
| sheet.insertRule(rule_initial); |
| testFunction(); |
| } |
| |
| test(function () { |
| resetStateAndTest(() => { |
| let rule = document.styleSheets[0].cssRules[0]; |
| assert_equals(rule.type, 14); |
| assert_equals(rule.annotation.size, 1); |
| assert_equals(rule.styleset.size, 3); |
| assert_array_equals(rule.styleset.get("yo"), [7]); |
| assert_array_equals(rule.styleset.get("del"), [4]); |
| assert_array_equals(rule.styleset.get("di"), [10, 9, 4, 5]); |
| assert_array_equals(rule.annotation.get("the_first"), [6]); |
| assert_equals(rule.stylistic.size, 0); |
| assert_equals(rule.swash.size, 0); |
| assert_equals(rule.ornaments.size, 0); |
| assert_equals(rule.characterVariant.size, 0); |
| assert_equals(rule.fontFamily, "test_family"); |
| }); |
| }, "CSSFontFeatureValuesRule is correctly parsed and accessible via CSSOM."); |
| |
| test(function () { |
| resetStateAndTest(() => { |
| let family_override = "test_changed_family"; |
| let rule = document.styleSheets[0].cssRules[0]; |
| rule.fontFamily = family_override; |
| let read_rule = document.styleSheets[0].cssRules[0]; |
| assert_equals(read_rule.fontFamily, family_override); |
| }); |
| }, "CSSFontFeatureValuesRule family is settable and readable."); |
| |
| test(function () { |
| resetStateAndTest(() => { |
| let rule = document.styleSheets[0].cssRules[0]; |
| let override_number = 43; |
| assert_equals(rule.styleset.get("di").length, 4); |
| rule.styleset.set("di", override_number); |
| assert_array_equals( |
| document.styleSheets[0].cssRules[0].styleset.get("di"), |
| [override_number] |
| ); |
| assert_equals(rule.styleset.size, 3); |
| assert_equals( |
| document.styleSheets[0].cssRules[0].styleset.get("di").length, |
| 1 |
| ); |
| }); |
| }, "CSSFontFeatureValuesMap entries are settable to single values."); |
| |
| test(function () { |
| resetStateAndTest(() => { |
| let rule = document.styleSheets[0].cssRules[0]; |
| let override_sequence = [43, 22]; |
| assert_equals( |
| document.styleSheets[0].cssRules[0].styleset.get("di").length, |
| 4 |
| ); |
| rule.styleset.set("di", override_sequence); |
| assert_array_equals( |
| document.styleSheets[0].cssRules[0].styleset.get("di"), |
| override_sequence |
| ); |
| assert_equals(document.styleSheets[0].cssRules[0].styleset.size, 3); |
| assert_equals( |
| document.styleSheets[0].cssRules[0].styleset.get("di").length, |
| 2 |
| ); |
| }); |
| }, "CSSFontFeatureValuesMap entries are settable to sequences of numbers."); |
| |
| test(function () { |
| resetStateAndTest(() => { |
| document.styleSheets[0].insertRule(rule_added, 1); |
| assert_equals(document.styleSheets[0].cssRules[1].type, 14); |
| assert_equals(document.styleSheets[0].cssRules[1].annotation.size, 3); |
| }); |
| }, "New rules can be added."); |
| |
| test(function () { |
| resetStateAndTest(() => { |
| document.styleSheets[0].insertRule(rule_added, 1); |
| assert_equals(document.styleSheets[0].cssRules[1].annotation.size, 3); |
| document.styleSheets[0].cssRules[1].annotation.delete("yogog"); |
| assert_equals(document.styleSheets[0].cssRules[1].annotation.size, 2); |
| }); |
| }, "Deleting single entries is possible."); |
| |
| test(function () { |
| resetStateAndTest(() => { |
| document.styleSheets[0].insertRule(rule_added, 1); |
| assert_equals(document.styleSheets[0].cssRules[1].annotation.size, 3); |
| document.styleSheets[0].cssRules[1].annotation.clear(); |
| assert_equals(document.styleSheets[0].cssRules[1].annotation.size, 0); |
| }); |
| }, "Clearing all entries is possible."); |
| |
| test(function () { |
| resetStateAndTest(() => { |
| assert_equals(document.styleSheets[0].cssRules.length, 1); |
| document.styleSheets[0].insertRule(rule_overlap, 1); |
| assert_equals(document.styleSheets[0].cssRules.length, 2); |
| |
| // Force updating internal state. |
| getComputedStyle(document.body).borderTop; |
| |
| assert_equals( |
| document.styleSheets[0].cssRules[0].annotation.size, |
| 1, |
| "1 annotation." |
| ); |
| assert_equals( |
| document.styleSheets[0].cssRules[0].styleset.size, |
| 3, |
| "3 entries in styleset." |
| ); |
| assert_equals( |
| document.styleSheets[0].cssRules[0].ornaments.size, |
| 0, |
| "No ornament entries." |
| ); |
| assert_false( |
| document.styleSheets[0].cssRules[0].annotation.has("baric"), |
| "Annotation must not contain 'baric'." |
| ); |
| assert_false( |
| document.styleSheets[0].cssRules[0].ornaments.has("fooic"), |
| "Ornaments must not contain 'fooic'." |
| ); |
| |
| assert_equals(document.styleSheets[0].cssRules[1].annotation.size, 1); |
| assert_equals(document.styleSheets[0].cssRules[1].ornaments.size, 1); |
| assert_false( |
| document.styleSheets[0].cssRules[1].annotation.has("the_first") |
| ); |
| }); |
| }, "Multiple rules for the same family are kept separate in CSSOM."); |
| </script> |