blob: 19d09f1c85b58618ca89809314711d52cbb497ed [file] [log] [blame]
<!doctype html>
<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
<style>
input {
background-color: rgb(1, 2, 3);
color: rgb(4, 5, 6);
}
input:in-range {
background-color: rgb(7, 8, 9);
}
input:out-of-range {
color: rgb(10, 11, 12);
}
</style>
</head>
<body>
<div id="with-renderer">
<input type="number" id="number-with-renderer"></input>
<input type="range" id="range-with-renderer"></input>
</div>
<div style="display:none;">
<input type="number" id="number-without-renderer"></input>
<input type="range" id="range-without-renderer"></input>
</div>
</body>
<script>
description('Test the style update with the :in-range and :out-of-range pseudo classes.');
function elementsWithStyle(propertyName, propertyValue) {
let filteredElements = [];
let allInput = document.querySelectorAll("input");
for (let inputElement of allInput) {
let computedStyle = getComputedStyle(inputElement);
if (computedStyle[propertyName] === propertyValue)
filteredElements.push(inputElement.id);
}
return filteredElements;
}
function inRange() {
return elementsWithStyle("background-color", "rgb(7, 8, 9)");
}
function outOfRange() {
return elementsWithStyle("color", "rgb(10, 11, 12)");
}
function setAttribute(typeString, attributeName, attributeValue) {
let inputElements = document.querySelectorAll("input[type=\"" + typeString + "\"]");
for (let inputElement of inputElements) {
inputElement.setAttribute(attributeName, attributeValue);
}
}
function removeAttribute(typeString, attributeName) {
let inputElements = document.querySelectorAll("input[type=\"" + typeString + "\"]");
for (let inputElement of inputElements) {
inputElement.removeAttribute(attributeName);
}
}
debug("Initial state.");
shouldBe("inRange()", "['range-with-renderer', 'range-without-renderer']");
shouldBe("outOfRange()", "[]");
// Define a minimum.
debug("Set a valid minimum on number.");
setAttribute("number", "min", "42");
shouldBe("inRange()", "['number-with-renderer', 'range-with-renderer', 'number-without-renderer', 'range-without-renderer']");
shouldBe("outOfRange()", "[]");
debug("Set a valid minimum on range.");
setAttribute("range", "min", "42");
shouldBe("inRange()", "['number-with-renderer', 'range-with-renderer', 'number-without-renderer', 'range-without-renderer']");
shouldBe("outOfRange()", "[]");
debug("Set a value above minimum on number.");
setAttribute("number", "value", "43");
shouldBe("inRange()", "['number-with-renderer', 'range-with-renderer', 'number-without-renderer', 'range-without-renderer']");
shouldBe("outOfRange()", "[]");
debug("Set a value above minimum on range.");
setAttribute("range", "value", "43");
shouldBe("inRange()", "['number-with-renderer', 'range-with-renderer', 'number-without-renderer', 'range-without-renderer']");
shouldBe("outOfRange()", "[]");
debug("Set a value under minimum on number.");
setAttribute("number", "value", "41");
shouldBe("inRange()", "['range-with-renderer', 'range-without-renderer']");
shouldBe("outOfRange()", "['number-with-renderer', 'number-without-renderer']");
debug("Set a value under minimum on range.");
setAttribute("range", "value", "41");
shouldBe("inRange()", "['range-with-renderer', 'range-without-renderer']");
shouldBe("outOfRange()", "['number-with-renderer', 'number-without-renderer']");
debug("Set an invalid minimum on number.");
setAttribute("number", "min", "WebKit!");
shouldBe("inRange()", "['range-with-renderer', 'range-without-renderer']");
shouldBe("outOfRange()", "[]");
debug("Set an invalid minimum on range.");
setAttribute("range", "min", "WebKit!");
shouldBe("inRange()", "['range-with-renderer', 'range-without-renderer']");
shouldBe("outOfRange()", "[]");
// Define a maximum.
debug("Set a valid maximum on number.");
setAttribute("number", "max", "101");
shouldBe("inRange()", "['number-with-renderer', 'range-with-renderer', 'number-without-renderer', 'range-without-renderer']");
shouldBe("outOfRange()", "[]");
debug("Set a valid maximum on range.");
setAttribute("range", "max", "101");
shouldBe("inRange()", "['number-with-renderer', 'range-with-renderer', 'number-without-renderer', 'range-without-renderer']");
shouldBe("outOfRange()", "[]");
debug("Set a value under maximum on number.");
setAttribute("number", "value", "0");
shouldBe("inRange()", "['number-with-renderer', 'range-with-renderer', 'number-without-renderer', 'range-without-renderer']");
shouldBe("outOfRange()", "[]");
debug("Set a value under maximum on range.");
setAttribute("range", "value", "0");
shouldBe("inRange()", "['number-with-renderer', 'range-with-renderer', 'number-without-renderer', 'range-without-renderer']");
shouldBe("outOfRange()", "[]");
debug("Set a value over maximum on number.");
setAttribute("number", "value", "103");
shouldBe("inRange()", "['range-with-renderer', 'range-without-renderer']");
shouldBe("outOfRange()", "['number-with-renderer', 'number-without-renderer']");
debug("Set a value over maximum on range.");
setAttribute("range", "value", "103");
shouldBe("inRange()", "['range-with-renderer', 'range-without-renderer']");
shouldBe("outOfRange()", "['number-with-renderer', 'number-without-renderer']");
debug("Set an invalid maximum on number.");
setAttribute("number", "max", "WebKit!");
shouldBe("inRange()", "['range-with-renderer', 'range-without-renderer']");
shouldBe("outOfRange()", "[]");
debug("Set an invalid maximum on range.");
setAttribute("range", "max", "WebKit!");
shouldBe("inRange()", "['range-with-renderer', 'range-without-renderer']");
shouldBe("outOfRange()", "[]");
// Set a full state in range.
debug("Set values, min and max in range on both");
setAttribute("range", "value", "42");
setAttribute("range", "min", "1");
setAttribute("range", "max", "103");
setAttribute("number", "value", "-42");
setAttribute("number", "min", "-100");
setAttribute("number", "max", "-3");
shouldBe("inRange()", "['number-with-renderer', 'range-with-renderer', 'number-without-renderer', 'range-without-renderer']");
shouldBe("outOfRange()", "[]");
// A disabled input should not match either selectors.
debug("Disable range");
setAttribute("range", "disabled", "");
shouldBe("inRange()", "['number-with-renderer', 'number-without-renderer']");
shouldBe("outOfRange()", "[]");
debug("Disable number");
setAttribute("number", "disabled", "");
shouldBe("inRange()", "[]");
shouldBe("outOfRange()", "[]");
debug("Set number out of range");
setAttribute("number", "value", "55");
shouldBe("inRange()", "[]");
shouldBe("outOfRange()", "[]");
debug("Set range out of range");
setAttribute("range", "value", "1024");
shouldBe("inRange()", "[]");
shouldBe("outOfRange()", "[]");
debug("Re-enable range");
removeAttribute("range", "disabled");
shouldBe("inRange()", "['range-with-renderer', 'range-without-renderer']");
shouldBe("outOfRange()", "[]");
debug("Re-enable number");
removeAttribute("number", "disabled");
shouldBe("inRange()", "['range-with-renderer', 'range-without-renderer']");
shouldBe("outOfRange()", "['number-with-renderer', 'number-without-renderer']");
// A readonly input should not match either selectors.
debug("Make number read-only");
setAttribute("number", "readonly", "");
shouldBe("inRange()", "['range-with-renderer', 'range-without-renderer']");
shouldBe("outOfRange()", "[]");
debug("Make range read-only");
setAttribute("range", "readonly", "");
shouldBe("inRange()", "[]");
shouldBe("outOfRange()", "[]");
debug("Set range in range");
setAttribute("range", "value", "74");
shouldBe("inRange()", "[]");
shouldBe("outOfRange()", "[]");
debug("Set number in range");
setAttribute("number", "value", "-69");
shouldBe("inRange()", "[]");
shouldBe("outOfRange()", "[]");
debug("Remove read-only from number");
removeAttribute("number", "readonly");
shouldBe("inRange()", "['number-with-renderer', 'number-without-renderer']");
shouldBe("outOfRange()", "[]");
debug("Remove read-only from range");
removeAttribute("range", "readonly");
shouldBe("inRange()", "['number-with-renderer', 'range-with-renderer', 'number-without-renderer', 'range-without-renderer']");
shouldBe("outOfRange()", "[]");
debug("Remove min from number");
removeAttribute("number", "min");
shouldBe("inRange()", "['number-with-renderer', 'range-with-renderer', 'number-without-renderer', 'range-without-renderer']");
shouldBe("outOfRange()", "[]");
debug("Remove max from number");
removeAttribute("number", "max");
shouldBe("inRange()", "['range-with-renderer', 'range-without-renderer']");
shouldBe("outOfRange()", "[]");
debug("Remove min from range");
removeAttribute("range", "min");
shouldBe("inRange()", "['range-with-renderer', 'range-without-renderer']");
shouldBe("outOfRange()", "[]");
debug("Remove max from range");
removeAttribute("range", "min");
shouldBe("inRange()", "['range-with-renderer', 'range-without-renderer']");
shouldBe("outOfRange()", "[]");
// Hides the elements to make the result page pretty.
document.getElementById("with-renderer").style.display = "none";
</script>
<script src="../../resources/js-test-post.js"></script>
</html>