| <!doctype html> |
| <html> |
| <head> |
| <script src="../../resources/js-test-pre.js"></script> |
| <style>@namespace WebKit url(http://www.webkit.org/rocks);</style> |
| <style id="style-container"></style> |
| </head> |
| <body> |
| </body> |
| <script> |
| description('Test the parsing of attribute selector with the case-insensitive value flag (e.g. [foo=bar i]). This test covers invalid selectors of the form [attr=value flags].'); |
| |
| function testInvalidSelectorCSSOMSerialization(selectorString) { |
| var styleContainer = document.getElementById('style-container'); |
| styleContainer.innerHTML = selectorString + ' { }'; |
| shouldBe("document.getElementById('style-container').sheet.cssRules.length", "0"); |
| styleContainer.innerHTML = ''; |
| } |
| |
| function testInvalidSelector(selectorString) { |
| shouldThrowErrorName('document.querySelector("' + selectorString.replace(/"/g, '\\"') + '")', 'SyntaxError'); |
| shouldThrowErrorName('document.querySelector("' + selectorString.replace(/"/g, '\\"').replace('[', '[|') + '")', 'SyntaxError'); |
| shouldThrowErrorName('document.querySelector("' + selectorString.replace(/"/g, '\\"').replace('[', '[*|') + '")', 'SyntaxError'); |
| shouldThrowErrorName('document.querySelector("' + selectorString.replace(/"/g, '\\"').replace('[', '[WebKit|') + '")', 'SyntaxError'); |
| |
| testInvalidSelectorCSSOMSerialization(selectorString); |
| testInvalidSelectorCSSOMSerialization(selectorString.replace('[', '[|')); |
| testInvalidSelectorCSSOMSerialization(selectorString.replace('[', '[*|')); |
| testInvalidSelectorCSSOMSerialization(selectorString.replace('[', '[WebKit|')); |
| } |
| |
| var invalidSelectors = [ |
| // The flag is for the value part. It is invalid on a 'attribute-set' match. |
| "[foo i]", |
| "[foo I]", |
| |
| // 'i' as a string instead of an identifier. |
| '[foo=bar "i"]', |
| '[foo="bar" "i"]', |
| '[foo~=bar "i"]', |
| '[foo~="bar" "i"]', |
| '[foo|=bar "i"]', |
| '[foo|="bar" "i"]', |
| '[foo^=bar "i"]', |
| '[foo^="bar" "i"]', |
| '[foo$=bar "i"]', |
| '[foo$="bar" "i"]', |
| '[foo*=bar "i"]', |
| '[foo*="bar" "i"]', |
| |
| // Identifier starting by 'i' as a flag. |
| '[foo=bar invalid]', |
| '[foo="bar" invalid]', |
| '[foo~=bar invalid]', |
| '[foo~="bar" invalid]', |
| '[foo|=bar invalid]', |
| '[foo|="bar" invalid]', |
| '[foo^=bar invalid]', |
| '[foo^="bar" invalid]', |
| '[foo$=bar invalid]', |
| '[foo$="bar" invalid]', |
| '[foo*=bar invalid]', |
| '[foo*="bar" invalid]', |
| |
| // Two 'i's. |
| '[foo=bar i i]', |
| '[foo="bar" i i]', |
| '[foo~=bar i i]', |
| '[foo~="bar" i i]', |
| '[foo|=bar i i]', |
| '[foo|="bar" i i]', |
| '[foo^=bar i i]', |
| '[foo^="bar" i i]', |
| '[foo$=bar i i]', |
| '[foo$="bar" i i]', |
| '[foo*=bar i i]', |
| '[foo*="bar" i i]', |
| |
| // String or identifier after 'i'. |
| '[foo=bar i first-child]', |
| '[foo="bar" i first-child]', |
| '[foo~=bar i first-child]', |
| '[foo~="bar" i first-child]', |
| '[foo|=bar i first-child]', |
| '[foo|="bar" i first-child]', |
| '[foo^=bar i first-child]', |
| '[foo^="bar" i first-child]', |
| '[foo$=bar i first-child]', |
| '[foo$="bar" i first-child]', |
| '[foo*=bar i first-child]', |
| '[foo*="bar" i first-child]', |
| |
| '[foo=bar i "empty"]', |
| '[foo="bar" i "empty"]', |
| '[foo~=bar i "empty"]', |
| '[foo~="bar" i "empty"]', |
| '[foo|=bar i "empty"]', |
| '[foo|="bar" i "empty"]', |
| '[foo^=bar i "empty"]', |
| '[foo^="bar" i "empty"]', |
| '[foo$=bar i "empty"]', |
| '[foo$="bar" i "empty"]', |
| '[foo*=bar i "empty"]', |
| '[foo*="bar" i "empty"]', |
| |
| // String or identifier before 'i'. |
| '[foo=bar first-child i]', |
| '[foo="bar" first-child i]', |
| '[foo~=bar first-child i]', |
| '[foo~="bar" first-child i]', |
| '[foo|=bar first-child i]', |
| '[foo|="bar" first-child i]', |
| '[foo^=bar first-child i]', |
| '[foo^="bar" first-child i]', |
| '[foo$=bar first-child i]', |
| '[foo$="bar" first-child i]', |
| '[foo*=bar first-child i]', |
| '[foo*="bar" first-child i]', |
| |
| '[foo=bar "empty" i]', |
| '[foo="bar" "empty" i]', |
| '[foo~=bar "empty" i]', |
| '[foo~="bar" "empty" i]', |
| '[foo|=bar "empty" i]', |
| '[foo|="bar" "empty" i]', |
| '[foo^=bar "empty" i]', |
| '[foo^="bar" "empty" i]', |
| '[foo$=bar "empty" i]', |
| '[foo$="bar" "empty" i]', |
| '[foo*=bar "empty" i]', |
| '[foo*="bar" "empty" i]', |
| |
| // Test other characters than 'i'. |
| '[foo=bar l]', |
| '[foo="bar" l]', |
| '[foo~=bar l]', |
| '[foo~="bar" l]', |
| '[foo|=bar l]', |
| '[foo|="bar" l]', |
| '[foo^=bar l]', |
| '[foo^="bar" l]', |
| '[foo$=bar l]', |
| '[foo$="bar" l]', |
| '[foo*=bar l]', |
| '[foo*="bar" l]', |
| |
| // Missing the closing ']'. |
| '[foo=bar i', |
| '[foo="bar" i', |
| '[foo~=bar i', |
| '[foo~="bar" i', |
| '[foo|=bar i', |
| '[foo|="bar" i', |
| '[foo^=bar i', |
| '[foo^="bar" i', |
| '[foo$=bar i', |
| '[foo$="bar" i', |
| '[foo*=bar i', |
| '[foo*="bar" i', |
| ]; |
| |
| debug("Invalid selectors."); |
| for (var selectorString of invalidSelectors) { |
| testInvalidSelector(selectorString); |
| } |
| </script> |
| <script src="../../resources/js-test-post.js"></script> |
| </html> |