blob: 12b81bbf1e1bf9534f7098eaf8f273e5c5a5d9a8 [file] [log] [blame]
<!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>