| <!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 :nth-last-child(of) for querySelector and style.'); |
| |
| function testValidSelector(selectorString, expectedSerializedSelector) { |
| shouldNotThrow('document.querySelector(":nth-last-child(' + selectorString.replace(/\\/g, '\\\\') + ')")'); |
| |
| var styleContainer = document.getElementById('style-container'); |
| styleContainer.innerHTML = ':nth-last-child(' + selectorString + ') { }'; |
| shouldBe("document.getElementById('style-container').sheet.cssRules.length", "1"); |
| if (!expectedSerializedSelector) |
| expectedSerializedSelector = selectorString; |
| shouldBeEqualToString("document.getElementById('style-container').sheet.cssRules[0].selectorText", ':nth-last-child(' + expectedSerializedSelector + ')'); |
| styleContainer.innerHTML = ''; |
| } |
| |
| // There are multiple ways of parsing :nth-last-child() based on the An+B part, we should test everything. |
| var validNthAnPlusB = [ |
| "even", |
| "odd", |
| "n", |
| "-n", |
| "3", |
| "-3", |
| "n+0", |
| "n-0", |
| "0n", |
| "3n+5", |
| "-3n+5", |
| "3n-5", |
| "-3n-5", |
| ]; |
| |
| var expectedNthAnPlusB = [ |
| "2n", |
| "2n+1", |
| "n", |
| "-n", |
| "3", |
| "-3", |
| "n", |
| "n", |
| "0", |
| "3n+5", |
| "-3n+5", |
| "3n-5", |
| "-3n-5", |
| ]; |
| |
| debug("Basic valid cases without [of selectors]"); |
| for (var i = 0; i < validNthAnPlusB.length; ++i) |
| testValidSelector(validNthAnPlusB[i], expectedNthAnPlusB[i]); |
| |
| var validRightSide = [ |
| // Basic types. |
| "*", |
| "foobar", |
| "#id", |
| ".class", |
| ":first-child", |
| ":last-child", |
| |
| // 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", |
| |
| // Selector lists. |
| "a, a", |
| "a, b", |
| "a, b, c, d", |
| ".foo, .bar, .baz", |
| "a > b, a b, a + b, a ~ b", |
| ]; |
| |
| debug("Basic cases with [of selectors]"); |
| for (var leftSideIndex = 0; leftSideIndex < validNthAnPlusB.length; ++leftSideIndex) { |
| for (var rightSideIndex = 0; rightSideIndex < validRightSide.length; ++rightSideIndex) { |
| var selectorString = validNthAnPlusB[leftSideIndex] + " of " + validRightSide[rightSideIndex]; |
| var expectedSelectorString = expectedNthAnPlusB[leftSideIndex] + " of " + validRightSide[rightSideIndex]; |
| testValidSelector(selectorString, expectedSelectorString); |
| testValidSelector(selectorString + " ", expectedSelectorString); |
| } |
| } |
| |
| </script> |
| <script src="../../resources/js-test-post.js"></script> |
| </html> |