Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

/* Any copyright is dedicated to the Public Domain.
"use strict";
var { colorUtils } = require("resource://devtools/shared/css/color.js");
/* global getFixtureColorData */
loadHelperScript("helper_color_data.js");
add_task(async function () {
await addTab("about:blank");
const { host, doc } = await createHost("bottom");
info("Creating a test canvas element to test colors");
const canvas = createTestCanvas(doc);
info("Starting the test");
testColorUtils(canvas);
host.destroy();
gBrowser.removeCurrentTab();
});
function createTestCanvas(doc) {
const canvas = doc.createElement("canvas");
canvas.width = canvas.height = 10;
doc.body.appendChild(canvas);
return canvas;
}
function testColorUtils(canvas) {
const data = getFixtureColorData();
for (const { authored, name, hex, hsl, rgb } of data) {
const color = new colorUtils.CssColor(authored);
// Check all values.
info("Checking values for " + authored);
is(color.name, name, "color.name === name");
is(color.hex, hex, "color.hex === hex");
is(color.hsl, hsl, "color.hsl === hsl");
is(color.rgb, rgb, "color.rgb === rgb");
testToString(color, name, hex, hsl, rgb);
testColorMatch(name, hex, hsl, rgb, color.rgba, canvas);
}
}
function testToString(color, name, hex, hsl, rgb) {
const { COLORUNIT } = colorUtils.CssColor;
is(color.toString(COLORUNIT.name), name, "toString() with authored type");
is(color.toString(COLORUNIT.hex), hex, "toString() with hex type");
is(color.toString(COLORUNIT.hsl), hsl, "toString() with hsl type");
is(color.toString(COLORUNIT.rgb), rgb, "toString() with rgb type");
}
function testColorMatch(name, hex, hsl, rgb, rgba, canvas) {
let target;
const ctx = canvas.getContext("2d");
const clearCanvas = function () {
canvas.width = 1;
};
const setColor = function (color) {
ctx.fillStyle = color;
ctx.fillRect(0, 0, 1, 1);
};
const setTargetColor = function () {
clearCanvas();
// All colors have rgba so we can use this to compare against.
setColor(rgba);
const [r, g, b, a] = ctx.getImageData(0, 0, 1, 1).data;
target = { r, g, b, a };
};
const test = function (color, type) {
// hsla -> rgba -> hsla produces inaccurate results so we
// need some tolerence here.
const tolerance = 3;
clearCanvas();
setColor(color);
const [r, g, b, a] = ctx.getImageData(0, 0, 1, 1).data;
const rgbFail =
Math.abs(r - target.r) > tolerance ||
Math.abs(g - target.g) > tolerance ||
Math.abs(b - target.b) > tolerance;
ok(!rgbFail, "color " + rgba + " matches target. Type: " + type);
if (rgbFail) {
info(
`target: ${JSON.stringify(
target
)}, color: [r: ${r}, g: ${g}, b: ${b}, a: ${a}]`
);
}
const alphaFail = a !== target.a;
ok(!alphaFail, "color " + rgba + " alpha value matches target.");
};
setTargetColor();
test(name, "name");
test(hex, "hex");
test(hsl, "hsl");
test(rgb, "rgb");
}