blob: 51364f0e31bfcdd78db219efd7a7bc8d78712ed0 [file] [log] [blame]
// In strict mode, there is no restriction on when :hover or :active can match.
var testCases = [
// Tag name.
["testingPLACEHOLDER", true],
// Id.
["#targetPLACEHOLDER", true],
["PLACEHOLDER#target", true],
["#targetPLACEHOLDER#target", true],
// Class name.
[".aClassPLACEHOLDER", true],
["PLACEHOLDER.aClass", true],
[".aClassPLACEHOLDER.otherClass", true],
// Attribute filter.
[".aClass[webkit]", true],
["PLACEHOLDER[webkit]", true],
["[id]PLACEHOLDER[webkit]", true],
[".aClass[webkit=rocks]", true],
["PLACEHOLDER[webkit=rocks]", true],
["[id=target]PLACEHOLDER[webkit=rocks]", true],
[".aClass[webkit^=ro]", true],
["PLACEHOLDER[webkit^=ro]", true],
["[id^=ta]PLACEHOLDER[webkit^=ro]", true],
[".aClass[webkit$=ks]", true],
["PLACEHOLDER[webkit$=ks]", true],
["[id$=et]PLACEHOLDER[webkit$=ks]", true],
[".aClass[webkit*=ck]", true],
["PLACEHOLDER[webkit*=ck]", true],
["[id*=rg]PLACEHOLDER[webkit*=ck]", true],
[".aClass[webkit~=rocks]", true],
["PLACEHOLDER[webkit~=rocks]", true],
["[id~=target]PLACEHOLDER[webkit~=rocks]", true],
[".aClass[webkit|=rocks]", true],
["PLACEHOLDER[webkit|=rocks]", true],
["[id|=target]PLACEHOLDER[webkit|=rocks]", true],
// Pseudo-class other than :active/:hover.
["testing:nth-child(1)PLACEHOLDER", true],
["testingPLACEHOLDER:nth-child(1)", true],
["testing:nth-child(1)PLACEHOLDER:nth-child(1)", true],
// Same with child relation.
[":nth-child(n)PLACEHOLDER > #target", false],
["PLACEHOLDER:nth-child(n) > #target", false],
[":nth-child(n)PLACEHOLDER:nth-child(n) > #target", false],
// Same with descendant relation.
[":nth-child(n)PLACEHOLDER #target", false],
["PLACEHOLDER:nth-child(n) #target", false],
[":nth-child(n)PLACEHOLDER:nth-child(n) #target", false],
[":-webkit-any(PLACEHOLDER) #target", false],
];
function testQuerySelector(selector, shouldMatch) {
shouldBe('document.querySelectorAll("' + selector + '").length', shouldMatch? '1' : '0');
}
function testStyling(selector, shouldMatch) {
var testStyle = document.getElementById('testStyle');
var noMatchStyle = "rgb(1, 2, 3)";
var matchStyle = "rgb(4, 5, 6)"
testStyle.textContent = "#target { color:" + noMatchStyle + " } " + selector + " { color:" + matchStyle + " !important }";
shouldBeEqualToString('getComputedStyle(document.getElementById("target")).color', shouldMatch ? matchStyle : noMatchStyle);
testStyle.textContent = "";
}
function test(original) {
var pseudoClass = ':not(' + original + ')';
for (var i = 0, length = testCases.length; i < length; ++i) {
var selector = testCases[i][0].replace('PLACEHOLDER', pseudoClass)
testQuerySelector(selector, testCases[i][1]);
testStyling(selector, testCases[i][1]);
}
// In strict mode, no tag name or the universal selector also work. This is tested separately because those selectors match
// every ancestor of the target.
shouldBe('document.querySelectorAll("*").length - document.querySelectorAll("' + pseudoClass + '").length', '3');
testStyling(pseudoClass, true);
shouldBe('document.querySelectorAll("*").length - document.querySelectorAll("*' + pseudoClass + '").length', '3');
testStyling('*' + pseudoClass, true);
}