/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
// Tests that a used font-family is highlighted in the rule-view.
const TEST_URI = `
Text
Text
Text
Text
Text
A Ɋ
Text
Text
Text
`;
// Tests that font-family properties in the rule-view correctly
// indicates which font is in use.
// Each entry in the test array should contain:
// {
// baseSelector: the rule-view selector to look for font-family in
// nb: the number of fonts this property should have
// used: the indexes of all the fonts that should be highlighted, or null if none should
// be highlighted
// selectBeforePseudoElement: Whether the before pseudo element should be selectd or not
// }
const TESTS = [
{ baseSelector: "#id1", nb: 3, used: [2] }, // sans-serif
{ baseSelector: "#id2", nb: 1, used: [0] }, // serif
{ baseSelector: "#id3", nb: 4, used: [1] }, // monospace
{ baseSelector: "#id4", nb: 2, used: null },
{ baseSelector: "#id5", nb: 1, used: [0] }, // monospace
{ baseSelector: "#id7", nb: 2, used: [1] }, // serif
{ baseSelector: "#id8", nb: 1, used: null },
{ baseSelector: "#id9", nb: 2, used: [1], selectBeforePseudoElement: true }, // monospace
];
if (Services.appinfo.OS !== "Linux") {
// Both georgia and arial are used because the second character can't be rendered with
// georgia, so the browser falls back. Also, skip this on Linux which has neither of
// these fonts.
TESTS.push({ baseSelector: "#id6", nb: 2, used: [0, 1] });
}
add_task(async function () {
await addTab("data:text/html;charset=utf-8," + encodeURIComponent(TEST_URI));
const { inspector, view } = await openRuleView();
for (const { baseSelector, nb, used, selectBeforePseudoElement } of TESTS) {
const onFontHighlighted = view.once("font-highlighted");
if (selectBeforePseudoElement) {
// Query the first children node to get the before pseudo element:
const baseNode = await getNodeFront(baseSelector, inspector);
const pseudoElement = (await inspector.walker.children(baseNode))
.nodes[0];
await selectNode(pseudoElement, inspector);
} else {
await selectNode(baseSelector, inspector);
}
await onFontHighlighted;
const selector = !selectBeforePseudoElement
? baseSelector
: `${baseSelector}::before`;
info(`Looking for fonts in font-family property for: <${selector}>`);
const prop = getRuleViewProperty(view, selector, "font-family").valueSpan;
const fonts = prop.querySelectorAll(".ruleview-font-family");
ok(fonts.length, "Fonts found in the property");
is(fonts.length, nb, "Correct number of fonts found in the property");
const highlighted = [...fonts].filter(span =>
span.classList.contains("used-font")
);
const expectedHighlightedNb = used === null ? 0 : used.length;
is(
highlighted.length,
expectedHighlightedNb,
"Correct number of used fonts found"
);
let highlightedIndex = 0;
[...fonts].forEach((font, index) => {
if (font === highlighted[highlightedIndex]) {
is(index, used[highlightedIndex], "The right font is highlighted");
highlightedIndex++;
}
});
}
});