blob: 90416d918d54dded648ca6daf3803c50435ce8c7 [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
function test()
{
let suite = InspectorTest.createAsyncSuite("CSS.getMatchedStyleForNode.LayerGrouping");
function expectRuleAtIndex(rules, index, {selectorText, colorPropertyValue, file, lineNumber, groupings})
{
InspectorTest.log(`- Testing rule #${index}`);
let rule = rules[index];
InspectorTest.expectEqual(rule.selectorText, selectorText, `Selector text should be "${selectorText}".`);
InspectorTest.expectEqual(rule.style.propertyForName("color").value, colorPropertyValue, `"color" property value should be "${colorPropertyValue}".`);
InspectorTest.expectEqual(rule.sourceCodeLocation?.sourceCode.urlComponents.lastPathComponent, file, `Source code for rule should be in file named "${file}".`);
if (!groupings) {
InspectorTest.expectEmpty(rule.groupings, "Rule should have no groupings.");
return;
}
InspectorTest.expectEqual(rule.groupings.length, groupings.length, `Rule should have ${groupings.length} grouping(s).`);
for (let i = 0; i < groupings.length; ++i) {
InspectorTest.expectEqual(rule.groupings[i].type, groupings[i].type, `Grouping ${i} should have a type of "${groupings[i].type}".`);
if (groupings[i].text)
InspectorTest.expectEqual(rule.groupings[i].text, groupings[i].text, `Grouping ${i} should have a text of "${groupings[i].text}".`);
else
InspectorTest.expectNull(rule.groupings[i].text, `Grouping ${i} should not have any text.`);
}
}
function addTestCase({name, description, selector, expectedAuthoredRuleCount, authoredRulesHandler})
{
suite.addTestCase({
name,
description,
async test() {
let documentNode = await WI.domManager.requestDocument();
let nodeId = await documentNode.querySelector(selector);
let domNode = WI.domManager.nodeForId(nodeId);
InspectorTest.assert(domNode, `Should find DOM Node for selector '${selector}'.`);
let domNodeStyles = WI.cssManager.stylesForNode(domNode);
InspectorTest.assert(domNodeStyles, `Should find CSS Styles for DOM Node.`);
await domNodeStyles.refreshIfNeeded();
let authoredRules = domNodeStyles.matchedRules.filter((rule) => rule.type === WI.CSSStyleSheet.Type.Author);
InspectorTest.expectEqual(authoredRules.length, expectedAuthoredRuleCount, `Should have ${expectedAuthoredRuleCount} authored rules.`);
authoredRulesHandler(authoredRules);
},
});
}
addTestCase({
name: "CSS.getMatchedStyleForNode.LayerGrouping.Normal",
description: "Layers should be presented in the expected order, with layers applied in the order they are declared.",
selector: "#normal",
expectedAuthoredRuleCount: 3,
authoredRulesHandler(rules) {
expectRuleAtIndex(rules, 0, {
selectorText: ".item",
colorPropertyValue: "red",
file: "getMatchedStylesForNodeLayerGrouping.html",
});
expectRuleAtIndex(rules, 1, {
selectorText: ".item",
colorPropertyValue: "lawngreen",
file: "getMatchedStylesForNodeLayerGrouping.html",
groupings: [
{type: WI.CSSGrouping.Type.LayerRule, text: "special"},
{type: WI.CSSGrouping.Type.SupportsRule, text: "(color: red)"},
],
});
expectRuleAtIndex(rules, 2, {
selectorText: ".item",
colorPropertyValue: "peachpuff",
file: "getMatchedStylesForNodeLayerGrouping.html",
groupings: [
{type: WI.CSSGrouping.Type.LayerRule, text: "base"},
],
});
}
});
addTestCase({
name: "CSS.getMatchedStyleForNode.LayerGrouping.Imported",
description: "Stylesheets imported with @import with a layer parameter should have nested layer groupings.",
selector: "#imported",
expectedAuthoredRuleCount: 5,
authoredRulesHandler(rules) {
expectRuleAtIndex(rules, 0, {
selectorText: ".item",
colorPropertyValue: "red",
file: "getMatchedStylesForNodeLayerGrouping.html",
});
expectRuleAtIndex(rules, 1, {
selectorText: ".item",
colorPropertyValue: "lawngreen",
file: "getMatchedStylesForNodeLayerGrouping.html",
groupings: [
{type: WI.CSSGrouping.Type.LayerRule, text: "special"},
{type: WI.CSSGrouping.Type.SupportsRule, text: "(color: red)"},
],
});
expectRuleAtIndex(rules, 2, {
selectorText: ".item",
colorPropertyValue: "peachpuff",
file: "getMatchedStylesForNodeLayerGrouping.html",
groupings: [
{type: WI.CSSGrouping.Type.LayerRule, text: "base"},
],
});
expectRuleAtIndex(rules, 3, {
selectorText: ".imported",
colorPropertyValue: "darkslategray",
file: "external-layers.css",
groupings: [
{type: WI.CSSGrouping.Type.LayerRule, text: "special"},
{type: WI.CSSGrouping.Type.SupportsRule, text: "(color: red)"},
{type: WI.CSSGrouping.Type.LayerImportRule, text: "imported"},
],
});
expectRuleAtIndex(rules, 4, {
selectorText: ".imported",
colorPropertyValue: "mintcream",
file: "external-layers.css",
groupings: [
{type: WI.CSSGrouping.Type.LayerRule, text: "base"},
{type: WI.CSSGrouping.Type.LayerImportRule, text: "imported"},
],
});
}
});
addTestCase({
name: "CSS.getMatchedStyleForNode.LayerGrouping.Anonymous",
description: "Anonymous layers (layers without a name) should be separate and be applied in the order they are declared relative to other anonymous and named layers.",
selector: "#anonymous",
expectedAuthoredRuleCount: 4,
authoredRulesHandler(rules) {
expectRuleAtIndex(rules, 0, {
selectorText: ".item",
colorPropertyValue: "red",
file: "getMatchedStylesForNodeLayerGrouping.html",
});
expectRuleAtIndex(rules, 1, {
selectorText: ".anonymous",
colorPropertyValue: "darkviolet",
file: "getMatchedStylesForNodeLayerGrouping.html",
groupings: [
{type: WI.CSSGrouping.Type.LayerRule},
],
});
expectRuleAtIndex(rules, 2, {
selectorText: ".item",
colorPropertyValue: "lawngreen",
file: "getMatchedStylesForNodeLayerGrouping.html",
groupings: [
{type: WI.CSSGrouping.Type.LayerRule, text: "special"},
{type: WI.CSSGrouping.Type.SupportsRule, text: "(color: red)"},
],
});
expectRuleAtIndex(rules, 3, {
selectorText: ".item",
colorPropertyValue: "peachpuff",
file: "getMatchedStylesForNodeLayerGrouping.html",
groupings: [
{type: WI.CSSGrouping.Type.LayerRule, text: "base"},
],
});
}
});
suite.runTestCasesAndFinish();
}
</script>
<style>
@layer imported, base, special;
@import url("./resources/external-layers.css") layer(imported);
@supports(color: red) {
@layer special {
.item {
color: lawngreen;
}
}
}
@layer base {
.item {
color: peachpuff;
}
}
@layer {
.anonymous {
color: darkviolet;
}
}
.item {
color: red;
}
</style>
</head>
<body onload="runTest()">
<p>Tests for the CSS.getMatchedStyleForNode command and style rule groupings.</p>
<div id="normal" class="item"></div>
<div id="imported" class="item imported"></div>
<div id="anonymous" class="item anonymous"></div>
</body>
</html>