blob: ece340a0e7b754a6568cd9464203741633df6550 [file] [log] [blame]
<!doctype html>
<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
<style id="style-container">
</style>
</head>
<body>
</body>
<script>
description('Test the parsing of :not(selectorList) for querySelector and style.');
function testInvalidSelector(selectorString) {
var styleContainer = document.getElementById('style-container');
styleContainer.innerHTML = ':not(' + selectorString + ') { }';
const parsed = document.getElementById('style-container').sheet.cssRules.length == 1;
debug(`selector '${styleContainer.innerHTML}' parsed: ${parsed ? "YES" : "NO"}`);
styleContainer.innerHTML = '';
}
var validSelectors = [
// Basic types.
"*",
"foobar",
"#id",
".class",
":first-child",
":last-child",
":visited",
// Compound selectors.
"foobar#id.class",
".class:not(.notclass)",
"#id:empty",
// Complex selectors.
"a > b",
"a b",
"a + b",
"a ~ b",
"a + b > c ~ d e + g",
// Functional pseudo classes.
":-webkit-any(.selector,#tama,#hanayo,#midoriko)",
":not(:link)",
":not(:is(cocoa, cappuccino))",
":not(:matches(cocoa, cappuccino))",
":nth-child(even of a, b, c)",
];
var invalidSelectors = [
// Pseudo elements.
"::first-letter",
"::first-line",
"::before",
"::after",
":first-letter",
":first-line",
":before",
":after",
// Not selectors.
"",
" ",
",",
".123class",
"#123id",
"[]",
"()",
")",
"{}",
"}",
// Empty functional pseudo classes.
":not()",
":is()",
":matches()",
":nth-child()",
":nth-child(2n of)",
// Unbalanced parenthesized functional pseudo classes.
":not(",
":is(",
":matches(",
":nth-child(2n+1 of",
];
debug("2 :not(valid, invalid) selectors");
for (var i = 0; i < validSelectors.length; ++i) {
for (var j = 0; j < invalidSelectors.length; ++j) {
var selectorString = validSelectors[i] + ',' + invalidSelectors[j];
testInvalidSelector(selectorString);
}
}
</script>
<script src="../../resources/js-test-post.js"></script>
</html>