blob: d33701759d6068e3d335a9bf17795df1a4235cd0 [file] [log] [blame]
<!DOCTYPE html>
<meta charset="utf-8">
<title>CSS Color 4: Resolving HSL color values</title>
<link rel="author" title="Chris Nardi" href="mailto:csnardi1@gmail.com">
<link rel="help" href="https://drafts.csswg.org/css-color-4/#resolving-color-values">
<meta name="assert" content="Tests if HSL color values are resolved properly">
<meta name="timeout" content="long">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="parent" style="color: rgb(45, 23, 27)">
<div id="inner"></div>
</div>
<script>
function color_test(color, expected, reason) {
test(function() {
var element = document.getElementById('inner');
// Random value not in our test data.
fail_value = "rgb(12, 34, 223)"
element.style.color = "black";
element.style.cssText = "color: " + fail_value + "; color: " + color;
if (expected === null)
assert_equals(getComputedStyle(element).color, fail_value);
else
assert_equals(getComputedStyle(element).color, expected);
}, `${reason}: ${color}`);
}
function expected_value(rgb_channels) {
if (rgb_channels === null)
return null;
else if (rgb_channels.length === 3 || rgb_channels[3] == 1 || rgb_channels[3] === undefined)
return "rgb(" + rgb_channels.slice(0, 3).join(", ") + ")";
else
return "rgba(" + rgb_channels.join(", ") + ")";
}
// Taken mostly from https://drafts.csswg.org/css-color/#hsl-to-rgb
function hslToRgb(hue, sat, light) {
if (light <= .5) {
var t2 = light * (sat + 1);
} else {
var t2 = light + sat - (light * sat);
}
var t1 = light * 2 - t2;
var r = Math.min(Math.max(Math.round(hueToRgb(t1, t2, hue + 2) * 255), 0), 255);
var g = Math.min(Math.max(Math.round(hueToRgb(t1, t2, hue) * 255), 0), 255);
var b = Math.min(Math.max(Math.round(hueToRgb(t1, t2, hue - 2) * 255), 0), 255);
return [r,g,b];
}
function hueToRgb(t1, t2, hue) {
if (hue < 0) hue += 6;
if (hue >= 6) hue -= 6;
if (hue < 1) return (t2 - t1) * hue + t1;
else if (hue < 3) return t2;
else if (hue < 4) return (t2 - t1) * (4 - hue) + t1;
else return t1;
}
// Test HSL parsing
for (var hue of [0, 30, 60, 90, 120, 180, 210, 240, 270, 300, 330, 360]) {
for (var sat of [0, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875, 1]) {
for (var light of [0, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875, 1]) {
rgb_channels = hslToRgb(hue / 60, sat, light);
for (var alpha of [undefined, 0, 0.2, 1]) {
hsl_color = "hsl(" + hue + ", " + sat * 100 + "%, " + light * 100 + "%)";
rgb_channels[3] = alpha;
if (alpha !== undefined) {
hsl_color = "hsla(" + hue + ", " + sat * 100 + "%, " + light * 100 + "%, " + alpha + ")";
}
color_test(hsl_color, expected_value(rgb_channels), "HSL/HSLA value should parse and round correctly");
}
}
}
}
</script>