summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/css/css-fonts/support/js/variation-sequences.js
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/css/css-fonts/support/js/variation-sequences.js')
-rw-r--r--testing/web-platform/tests/css/css-fonts/support/js/variation-sequences.js125
1 files changed, 125 insertions, 0 deletions
diff --git a/testing/web-platform/tests/css/css-fonts/support/js/variation-sequences.js b/testing/web-platform/tests/css/css-fonts/support/js/variation-sequences.js
new file mode 100644
index 0000000000..84c5a1a9c7
--- /dev/null
+++ b/testing/web-platform/tests/css/css-fonts/support/js/variation-sequences.js
@@ -0,0 +1,125 @@
+var baseChars = {
+ "emoji": "\u{1fae8}",
+ "cjk": "\u{8279}",
+ "math": "\u{2205}"
+};
+
+var variationSelectors = {
+ "emoji": ["\u{fe0e}", "\u{fe0f}"],
+ "cjk": ["", "\u{FE00}", "\u{FE01}", "\u{e0100}", "\u{e0101}",
+ "\u{e0102}"
+ ],
+ "math": ["", "\u{FE00}"]
+};
+
+var families = {
+ "emoji": ["ColorEmojiFont", "MonoEmojiFont",
+ "EmojiFontWithBaseCharOnly",
+ "sans-serif"
+ ],
+ "cjk": ["CJKFontWithVS", "CJKFontWithBaseCharOnly",
+ "sans-serif"
+ ],
+ "math": ["MathFontWithVS", "MathFontWithBaseCharOnly",
+ "sans-serif"
+ ]
+};
+
+var variationSequenceFamilies = new Map([
+ ["\u{1fae8}\u{fe0e}", "MonoEmojiFont"],
+ ["\u{1fae8}\u{fe0f}", "ColorEmojiFont"],
+ ["\u{8279}\u{fe00}", "CJKFontWithVS"],
+ ["\u{8279}\u{fe01}", "CJKFontWithVS"],
+ ["\u{8279}\u{e0100}", "CJKFontWithVS"],
+ ["\u{8279}\u{e0101}", "CJKFontWithVS"],
+ ["\u{8279}\u{e0102}", "CJKFontWithVS"],
+ ["\u{2205}\u{FE00}", "MathFontWithVS"]
+]);
+
+var baseCharFamilies = new Map([
+ ["\u{1fae8}", new Set(["MonoEmojiFont", "ColorEmojiFont",
+ "EmojiFontWithBaseCharOnly"
+ ])],
+ ["\u{8279}", new Set(["CJKFontWithVS",
+ "CJKFontWithBaseCharOnly"
+ ])],
+ ["\u{2205}", new Set(["MathFontWithVS",
+ "MathFontWithBaseCharOnly"
+ ])]
+]);
+
+const range = function*(l) {
+ for (let i = 0; i < l; i += 1) yield i;
+}
+const isEmpty = arr =>
+ arr.length === 0;
+
+const permutations =
+ function*(a) {
+ const r = arguments[1] || [];
+ if (isEmpty(a))
+ yield r;
+ for (let i of range(a.length)) {
+ const aa = [...a];
+ const rr = [...r, ...aa.splice(i, 1)];
+ yield* permutations(aa, rr);
+ }
+}
+
+function getMatchedFamilyForVariationSequence(
+ familyList, baseCharacter, variationSelector) {
+ const variationSequence = baseCharacter + variationSelector;
+ // First try to find a match for the whole variation sequence.
+ if (variationSequenceFamilies.has(variationSequence)) {
+ const matchedFamily = variationSequenceFamilies.get(variationSequence);
+ if (familyList.includes(matchedFamily)) {
+ return matchedFamily;
+ }
+ }
+ // If failed, try to match only the base character from the
+ // variation sequence.
+ if (baseCharFamilies.has(baseCharacter)) {
+ const eligibleFamilies = baseCharFamilies.get(baseCharacter);
+ const matchedFamilies =
+ familyList.filter(value => eligibleFamilies.has(value));
+ if (matchedFamilies.length) {
+ return matchedFamilies[0];
+ }
+ }
+ // We should not reach here, we should always match one of the
+ // specified web fonts in the tests.
+ return "";
+}
+
+function generateContent(
+ families, baseChar, variationSelectors, getFontFamilyValue) {
+ var rootElem = document.createElement('div');
+ // We want to test all possible combinations of variation
+ // selectors and font-family list values. For the refs,
+ // we explicitly specify the font that we expect to be
+ // matched from the maps at the beginning of the files.
+ const allFamiliesLists = permutations(families);
+ for (const familyList of allFamiliesLists) {
+ for (const variationSelector of variationSelectors) {
+ const contentSpan = document.createElement("span");
+ contentSpan.textContent = baseChar + variationSelector;
+ contentSpan.style.fontFamily =
+ getFontFamilyValue(familyList, baseChar, variationSelector);
+ rootElem.appendChild(contentSpan);
+ }
+ }
+ document.body.appendChild(rootElem);
+}
+
+function generateVariationSequenceTests(type) {
+ var getFontFamilyValue = (familyList, baseChar, variationSelector) => {
+ return familyList.join(', ');
+ }
+ generateContent(families[type], baseChars[type], variationSelectors[type], getFontFamilyValue);
+}
+
+function generateVariationSequenceRefs(type) {
+ generateContent(
+ families[type], baseChars[type], variationSelectors[type],
+ getMatchedFamilyForVariationSequence);
+}