/* Any copyright is dedicated to the Public Domain. http://creativecommons.org/publicdomain/zero/1.0/ */ "use strict"; // Tests that inherited element-backed pseudo element rules are properly displayed in // the Rules view and that declarations are properly overridden. const TEST_URI = `
Top-level summary
nested summary details in summary

child of details in summary

top-level details not a real summary

in top-level details

/* don't use an id so the "inherited from" section would have the same text as the section for the parent details. This will assert that we do get separate inhertied section for those different "levels" */
nested details summary nested details

child of nested details

s
hello
`; add_task(async function () { await addTab("data:text/html;charset=utf-8," + encodeURIComponent(TEST_URI)); const { inspector, view } = await openRuleView(); await selectNode("summary", inspector); Assert.deepEqual( getInheritedHeadersText(view), ["Inherited from details"], "There's no inherited ::details-content header when top-level is selected" ); await selectNode("body > details > p", inspector); Assert.deepEqual( getInheritedHeadersText(view), ["Inherited from details::details-content", "Inherited from details"], "Got expected inherited headers when children of top-level
is selected" ); is( view.element.querySelector( ".ruleview-header + #pseudo-elements-container .ruleview-selector-pseudo-class" ).textContent, "::after", "The ::after pseudo element rules is properly displayed in its section" ); ok( !isPropertyOverridden(view, 6, { color: "dodgerblue" }), "color property in ::details-content is not overridden" ); ok( isPropertyOverridden(view, 7, { color: "forestgreen" }), "color property in lower specificity ::details-content is overridden" ); ok( isPropertyOverridden(view, 9, { color: "gold" }), "color property in details is overridden" ); checkCSSVariableOutput( view, "p", "outline-color", "inspector-variable", "tomato" ); info("Check rules and declarations for details in summary"); await selectNode("details#in-summary", inspector); Assert.deepEqual( getInheritedHeadersText(view), ["Inherited from summary"], "Got expected inherited headers when
in is selected" ); await selectNode("details#in-summary summary", inspector); Assert.deepEqual( getInheritedHeadersText(view), ["Inherited from details#in-summary"], "Got expected inherited headers when nested is selected" ); await selectNode("details#in-summary p", inspector); Assert.deepEqual( getInheritedHeadersText(view), [ "Inherited from details#in-summary::details-content", "Inherited from details#in-summary", "Inherited from summary", ], "Got expected inherited headers when nested
child is selected" ); is( view.element.querySelector( ".ruleview-header + #pseudo-elements-container .ruleview-selector-pseudo-class" ).textContent, "::after", "The ::after pseudo element rules is properly displayed in its section" ); ok( !isPropertyOverridden(view, 6, { color: "brown" }), "color property in #detail#in-summary::details-content is not overridden" ); ok( isPropertyOverridden(view, 7, { color: "dodgerblue" }), "color property in ::details-content is overridden" ); ok( isPropertyOverridden(view, 9, { color: "cyan" }), "color property in details#in-summary is overridden" ); ok( isPropertyOverridden(view, 10, { color: "gold" }), "color property in details is overridden" ); ok( isPropertyOverridden(view, 12, { color: "violet" }), "color property in summary is overridden" ); checkCSSVariableOutput( view, "p", "outline-color", "inspector-variable", "rebeccapurple" ); info("Check rules and declarations for second summary inside details"); // when a
element has multiple children, only the first one is // actually interactive. The other ones are placed inside the ::details-content await selectNode("summary#non-functional-summary", inspector); Assert.deepEqual( getInheritedHeadersText(view), ["Inherited from details::details-content", "Inherited from details"], "Got expected inherited headers when non functional summary is selected" ); ok( !isPropertyOverridden(view, 1, { color: "violet" }), "color property in summary is not overridden when non functional summary is selected" ); ok( isPropertyOverridden(view, 3, { color: "dodgerblue" }), "color property in details::details-content is overridden when non functional summary is selected" ); ok( isPropertyOverridden(view, 4, { color: "forestgreen" }), "color property in :where(body > details)::details-content is overridden when non functional summary is selected" ); ok( isPropertyOverridden(view, 6, { color: "gold" }), "color property in details is overridden when non functional summary is selected" ); info("Check rules and declarations for details in details"); await selectNode("details.in-details", inspector); Assert.deepEqual( getInheritedHeadersText(view), ["Inherited from details::details-content"], "Got expected inherited headers when
in
is selected" ); ok( !isPropertyOverridden(view, 4, { color: "gold" }), "color property in details is not overridden for details in details" ); ok( isPropertyOverridden(view, 6, { color: "forestgreen" }), "color property in where(body > details)::details-content is overridden for details in details" ); info("Check rules and declarations for children of details in details"); await selectNode("details.in-details p", inspector); Assert.deepEqual( getInheritedHeadersText(view), [ // this is for the body > details > details::details-content pseudo "Inherited from details::details-content", // this is for the body > details::details-content pseudo "Inherited from details::details-content", "Inherited from details", ], "Got expected inherited headers when children
in
is selected" ); ok( !isPropertyOverridden(view, 6, { color: "dodgerblue" }), "color property in inherited details::details-content is not overridden for child of details in details" ); ok( isPropertyOverridden(view, 8, { color: "forestgreen" }), "color property in inherited :where(body > details)::details-content is overridden for child of details in details" ); ok( isPropertyOverridden(view, 10, { color: "gold" }), "color property in inherited details is overridden for child of details in details" ); info( "Check that properties in inherited element-backed pseudo element rules are properly picked when using !important" ); await selectNode("#vip article", inspector); Assert.deepEqual( getInheritedHeadersText(view), [ "Inherited from details#vip::details-content", "Inherited from details#vip", ], "Got expected inherited headers" ); ok( isPropertyOverridden(view, 2, { color: "red" }), "non-important color property in #vip::details-content is overridden" ); ok( !isPropertyOverridden(view, 3, { color: "blue" }), "important color property in #vip::details-content is not overridden" ); ok( isPropertyOverridden(view, 4, { color: "dodgerblue" }), "non important color property in details::details-content is overridden" ); ok( isPropertyOverridden(view, 5, { color: "forestgreen" }), "non important color property in :where(body > details)::details-content is overridden" ); ok( isPropertyOverridden(view, 7, { color: "gold" }), "non important color property in details is overridden" ); }); function getInheritedHeadersText(view) { return [...view.element.querySelectorAll(".ruleview-header-inherited")].map( el => el.textContent ); } function isPropertyOverridden(view, ruleIndex, property) { return getTextProperty( view, ruleIndex, property ).editor.element.classList.contains("ruleview-overridden"); }