/* Any copyright is dedicated to the Public Domain. http://creativecommons.org/publicdomain/zero/1.0/ */ "use strict"; // Test that the rule-view properly handles @starting-style rules. const TEST_URI = `

Hello @starting-style!

Testing override
`; add_task(async function () { await pushPref("layout.css.starting-style-at-rules.enabled", true); await addTab( "https://example.com/document-builder.sjs?html=" + encodeURIComponent(TEST_URI) ); const { inspector, view } = await openRuleView(); await selectNode("body", inspector); await checkRuleViewContent(view, [ { selector: `element`, ancestorRulesData: null, selectorEditable: false, declarations: [], }, { selector: `body, ~~[data-test="in-starting-style"]~~`, ancestorRulesData: ["@starting-style {"], declarations: [{ name: "color", value: "navy" }], }, { selector: `body, ~~[data-test="in-starting-style-layer"]~~`, ancestorRulesData: ["@starting-style {", " @layer {"], declarations: [{ name: "color", value: "hotpink", overridden: true }], }, { header: "@property" }, ]); await selectNode("h1", inspector); await checkRuleViewContent(view, [ { selector: `element`, ancestorRulesData: null, selectorEditable: false, declarations: [], }, { selector: `h1, ~~[data-test="in-starting-style"]~~`, ancestorRulesData: ["@starting-style {"], declarations: [{ name: "background-color", value: "salmon" }], }, { selector: ``, ancestorRulesData: [ `h1, [data-test="top-level"] {`, " @starting-style {", ], declarations: [{ name: "color", value: "gold" }], }, { selector: `h1, ~~[data-test="top-level"]~~`, ancestorRulesData: null, declarations: [ { name: "color", value: "tomato" }, { name: "transition", value: "all 1s" }, ], }, { header: "@property" }, ]); await selectNode("main", inspector); await checkRuleViewContent(view, [ { selector: `element`, ancestorRulesData: null, selectorEditable: false, declarations: [], }, { selector: ``, ancestorRulesData: [ `main, [data-test="top-level"] {`, " @starting-style {", ], declarations: [ { name: "--empty-start", value: "" }, { name: "background-color", value: "goldenrod", // background-color value in last starting-style rule is not overridden overridden: false, }, { name: "padding-top", value: "3px", // padding-top value in last starting-style rule is overridden by the !important // set on the top level rule overridden: true, }, { name: "margin-top", value: "3px", // margin-top value in last starting-style rule is overridden by the !important set // on another starting-style rule overridden: true, }, { name: "outline-color", value: "goldenrod", // outline-color value in last starting-style rule is overridden by the !important // set on another starting-style rule overridden: true, }, ], }, { selector: `main, ~~[data-test="top-level"]~~`, ancestorRulesData: null, declarations: [ { name: "--my-color", value: "white" }, { name: "--my-overridden-color", value: "white !important" }, { name: "--my-registered-color", value: "white" }, { name: "--empty-start", value: "1px" }, { name: "--check-my-overridden-color", value: "var(--my-overridden-color)", }, { name: "--check-my-registered-color", value: "var(--my-registered-color)", }, { name: "--check-empty-start", value: "var(--empty-start)" }, { name: "color", value: "var(--my-color)" }, { name: "background-color", value: "firebrick", // background-color value in top level rule is not overridden, even if the // property is also set in a starting style rule overridden: false, }, { name: "padding-top", value: "2px !important", // padding-top value in top level rule is not overridden overridden: false, }, { name: "margin-top", value: "2px", // margin-top value in top level rule is not overridden overridden: false, }, { name: "transition", value: "all 1s 1000s" }, { name: "outline-color", value: "firebrick", // outline-color value in top level rule is not overridden overridden: false, }, { name: "outline-width", value: "5px" }, { name: "outline-style", value: "solid" }, { name: "outline-offset", value: "10px" }, ], }, { selector: `main, ~~[data-test="in-starting-style"]~~`, ancestorRulesData: ["@starting-style {"], declarations: [ { name: "--my-color", value: "black !important" }, { name: "--my-overridden-color", value: "black", overridden: true }, { name: "--my-registered-color", value: "black !important" }, { name: "--check-my-color", value: "var(--my-color)" }, { name: "--check-my-overridden-color", value: "var(--my-overridden-color)", overridden: true, }, { name: "--check-my-registered-color", value: "var(--my-registered-color)", overridden: true, }, { name: "--check-my-unset-registered-color", value: "var(--my-unset-registered-color)", }, { name: "background-color", value: "dodgerblue", // background-color value in top-level starting style rule is overridden overridden: true, }, { name: "padding-top", value: "1px", // padding-top value in top-level starting style rule is overridden overridden: true, }, { name: "margin-top", value: "1px !important", // margin-top value in top-level starting style rule is not overridden, // since it's declared with !important overridden: false, }, { name: "outline-color", value: "dodgerblue", // outline-color value in top-level starting style rule is overridden overridden: true, }, ], }, { selector: `main, ~~[data-test="in-starting-style-layer-2"]~~`, ancestorRulesData: [`@starting-style {`, " @layer {"], declarations: [ { name: "background-color", value: "cyan", // background-color value in second layer in starting style rule is overridden overridden: true, }, { name: "padding-top", value: "5px", // padding-top value in second layer in starting style rule is overridden overridden: true, }, { name: "margin-top", value: "5px", // margin-top value in second layer in starting style rule is overridden overridden: true, }, { name: "outline-color", value: "cyan !important", // outline-color value in second layer in starting style rule is overridden even // if it was declared with !important overridden: true, }, ], }, { selector: `main, ~~[data-test="in-starting-style-layer"]~~`, ancestorRulesData: [`@starting-style {`, " @layer {"], declarations: [ { name: "background-color", value: "forestgreen", // background-color value in first layer in starting style rule is overridden overridden: true, }, { name: "padding-top", value: "4px", // padding-top value in first layer in starting style rule is overridden overridden: true, }, { name: "margin-top", value: "4px", // margin-top value in first layer in starting style rule is overridden overridden: true, }, { name: "outline-color", value: "forestgreen !important", // outline-color value in first layer in starting style rule is not overridden // as it's declared with !important overridden: false, }, ], }, { header: "@property" }, ]); info( "Check that CSS variables set in starting-style are not impacting the var() tooltip" ); ok( !isPropertyOverridden(view, 2, { "--my-color": "white" }), "--my-color value in top level rule is not overridden" ); info( "Check var() in regular rule for a variable set in both regular and starting-style rule" ); await assertVariableTooltipForProperty( view, `main, [data-test="top-level"]`, "color", { header: // prettier-ignore '' + '' + '' + 'white' + '', // Computed value isn't displayed when it's the same as we put in the header computed: null, // The starting-style value is displayed in the tooltip startingStyle: // prettier-ignore '' + '' + '' + 'black' + '', } ); info( "Check var() in starting-style rule for a variable set in both regular and starting-style rule" ); await assertVariableTooltipForProperty( view, `main, [data-test="in-starting-style"]`, "--check-my-color", { // The displayed value is the one set in the starting-style rule header: // prettier-ignore '' + '' + '' + 'black' + '', // Computed value isn't displayed in starting-style rule computed: null, // The starting-style section is not displayed when hovering starting-style rule startingStyle: null, } ); info( "Check var() in both regular and starting-style rule for a variable overridden in regular rule" ); ok( isPropertyOverridden(view, 3, { "--my-overridden-color": "black" }), "--my-overridden-color in top-level starting style rule is overridden" ); await assertVariableTooltipForProperty( view, `main, [data-test="top-level"]`, "--check-my-overridden-color", { header: // prettier-ignore '' + '' + '' + 'white' + '', // Computed value isn't displayed when it's the same as we put in the header computed: null, // The starting-style rule is overridden, so we don't show a starting-style section in the tooltip startingStyle: null, } ); await assertVariableTooltipForProperty( view, `main, [data-test="in-starting-style"]`, "--check-my-overridden-color", { // the value is the one from the regular rule, not the one from the starting-style rule header: // prettier-ignore '' + '' + '' + 'white' + '', // Computed value isn't displayed in starting-style rule computed: null, startingStyle: null, } ); info( "Check var() for a registered property in both regular and starting-style rule" ); await assertVariableTooltipForProperty( view, `main, [data-test="top-level"]`, "--check-my-registered-color", { header: // prettier-ignore '' + '' + '' + 'white' + '', computed: // prettier-ignore '' + '' + '' + 'rgb(255, 255, 255)' + '', // The starting-style value is displayed in the tooltip startingStyle: // prettier-ignore '' + '' + '' + 'black' + '', // registered property data is displayed registeredProperty: { syntax: `"<color>"`, inherits: "true", "initial-value": // prettier-ignore `` + `` + `` + `blue` + ``, }, } ); await assertVariableTooltipForProperty( view, `main, [data-test="in-starting-style"]`, "--check-my-registered-color", { // The displayed value is the one set in the starting-style rule header: // prettier-ignore '' + '' + '' + 'black' + '', // Computed value isn't displayed in starting-style rule computed: null, // The starting-style section is not displayed when hovering starting-style rule startingStyle: null, // registered property data is displayed registeredProperty: { syntax: `"<color>"`, inherits: "true", "initial-value": // prettier-ignore `` + `` + `` + `blue` + ``, }, } ); info("Check var() for a unset registered property in starting-style rule"); await assertVariableTooltipForProperty( view, `main, [data-test="in-starting-style"]`, "--check-my-unset-registered-color", { // The displayed value is the registered property initial value header: // prettier-ignore '' + '' + '' + 'lavender' + '', // The starting-style section is not displayed when hovering starting-style rule startingStyle: null, // registered property data is displayed registeredProperty: { syntax: `"<color>"`, inherits: "true", "initial-value": // prettier-ignore '' + '' + '' + 'lavender' + '', }, } ); info("Check var() for a empty variable in regular rule"); await assertVariableTooltipForProperty( view, `main, [data-test="top-level"]`, "--check-empty-start", { header: "1px", // The starting-style value is displayed in the tooltip startingStyle: "<empty>", startingStyleClasses: ["empty-css-variable"], } ); }); function isPropertyOverridden(view, ruleIndex, property) { return getTextProperty( view, ruleIndex, property ).editor.element.classList.contains("ruleview-overridden"); }