<!DOCTYPE html>
<title>CSS Test: Properties allowed on ::first-line pseudo elements</title>
<link rel="help" href="https://drafts.csswg.org/css-pseudo-4/#first-line-styling">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<style>
#target::first-line {}
#target { visibility: hidden; }
</style>
<div id="target">text</div>
<script>
let style;
const target = document.querySelector("#target");
const defaultComputedStyle = getComputedStyle(target);
test(() => {
var styleRule = document.styleSheets[0].cssRules[0];
assert_equals(styleRule.selectorText, "#target::first-line", "make sure we have the correct style rule");
style = styleRule.style;
}, "retrieve style rule");
const validProperties = {
backgroundAttachment: "fixed",
backgroundBlendMode: "hue",
backgroundClip: "padding-box",
backgroundColor: "rgb(10, 20, 30)",
backgroundImage: "linear-gradient(rgb(0, 0, 0), rgb(255, 255, 255))",
backgroundOrigin: "border-box",
backgroundPosition: "50% 50%",
backgroundRepeat: "no-repeat",
backgroundSize: "10px 20px",
color: "rgba(10, 20, 30, 0.4)",
fontFamily: "sans-serif",
fontFeatureSettings: '"vert" 2',
fontKerning: "none",
fontSize: "30px",
fontSizeAdjust: "0.5",
fontStyle: "italic",
fontVariant: "small-caps",
fontWeight: "900",
fontVariationSettings: '"XHGT" 0.7',
letterSpacing: "12px",
opacity: "0.5",
textDecoration: "overline wavy rgb(10, 20, 30)",
textJustify: "none",
textShadow: "rgb(10, 20, 30) 10px 20px 30px",
textTransform: "capitalize",
textUnderlinePosition: "under",
verticalAlign: "12%",
wordSpacing: "12px"
};
const invalidProperties = {
border: "40px dotted rgb(10, 20, 30)",
borderImage: "linear-gradient(rgb(0, 0, 0), rgb(255, 255, 255)) 10% / 20 / 30px repeat",
borderRadius: "10px 20px",
margin: "10px 20px 30px 40px",
padding: "10px 20px 30px 40px",
position: "absolute",
transition: "transform 1s",
transform: "rotate(45deg)",
wordBreak: "break-all"
};
function testFirstLineProperty(property, rule, expected, reason) {
test(function() {
style[property] = "";
style[property] = rule;
assert_equals(getComputedStyle(target, "::first-line")[property], expected);
style[property] = "";
}, reason);
}
for (let property in validProperties) {
testFirstLineProperty(property, validProperties[property], validProperties[property],
property + " should be applied to first-line pseudo elements.");
}
for (let property in invalidProperties) {
testFirstLineProperty(property, invalidProperties[property], defaultComputedStyle[property],
property + " should not be applied to first-line pseudo elements.");
}
</script>