blob: 7ed0151e25765453c6dc55f89a25b38fca2082a7 [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 attribute selector with the case-insensitive value flag (e.g. [foo=bar i]). This test cover the more advanced cases that do not use a canonical form but are still valid.');
function testValidSelectorCSSOMSerialization(selectorString, expectedSerializedSelector) {
var styleContainer = document.getElementById('style-container');
styleContainer.innerHTML = selectorString + ' { }';
shouldBe("document.getElementById('style-container').sheet.cssRules.length", "1");
if (!expectedSerializedSelector)
expectedSerializedSelector = selectorString;
shouldBeEqualToString("document.getElementById('style-container').sheet.cssRules[0].selectorText", expectedSerializedSelector);
styleContainer.innerHTML = '';
}
function testValidSelector(selectorString, expectedSerializedSelector) {
shouldNotThrow('document.querySelector("' + selectorString.replace(/"/g, '\\"') + '")');
shouldNotThrow('document.querySelector("' + selectorString.replace(/"/g, '\\"').replace('[', '[*|') + '")');
shouldNotThrow('document.querySelector("' + selectorString.replace(/"/g, '\\"').replace('[', '[|') + '")');
testValidSelectorCSSOMSerialization(selectorString, expectedSerializedSelector);
testValidSelectorCSSOMSerialization(selectorString.replace('[', '[|'), expectedSerializedSelector);
testValidSelectorCSSOMSerialization(selectorString.replace('[', '[*|'), expectedSerializedSelector.replace('[', '[*|'));
}
var alternativeValidSelectors = [
// Uppercase '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]', '[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]', '[foo*="bar" i]'],
// Make sure the case of the value is preserved on serialization.
['[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]'],
['[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]'],
// Tab instead of space before the 'i'.
['[foo=bar\ti]', '[foo="bar" i]'],
['[foo="bar"\ti]', '[foo="bar" i]'],
['[foo~=bar\ti]', '[foo~="bar" i]'],
['[foo~="bar"\ti]', '[foo~="bar" i]'],
['[foo|=bar\ti]', '[foo|="bar" i]'],
['[foo|="bar"\ti]', '[foo|="bar" i]'],
['[foo^=bar\ti]', '[foo^="bar" i]'],
['[foo^="bar"\ti]', '[foo^="bar" i]'],
['[foo$=bar\ti]', '[foo$="bar" i]'],
['[foo$="bar"\ti]', '[foo$="bar" i]'],
['[foo*=bar\ti]', '[foo*="bar" i]'],
['[foo*="bar"\ti]', '[foo*="bar" i]'],
// Spacing after the '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 ]', '[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 ]', '[foo*="bar" i]'],
['[foo=bar i\t]', '[foo="bar" i]'],
['[foo="bar" i\t]', '[foo="bar" i]'],
['[foo~=bar i\t]', '[foo~="bar" i]'],
['[foo~="bar" i\t]', '[foo~="bar" i]'],
['[foo|=bar i\t]', '[foo|="bar" i]'],
['[foo|="bar" i\t]', '[foo|="bar" i]'],
['[foo^=bar i\t]', '[foo^="bar" i]'],
['[foo^="bar" i\t]', '[foo^="bar" i]'],
['[foo$=bar i\t]', '[foo$="bar" i]'],
['[foo$="bar" i\t]', '[foo$="bar" i]'],
['[foo*=bar i\t]', '[foo*="bar" i]'],
['[foo*="bar" i\t]', '[foo*="bar" i]'],
// Spaces everywhere.
['[foo=bar \t i \t ]', '[foo="bar" i]'],
['[foo="bar" \t i \t ]', '[foo="bar" i]'],
['[foo~=bar \t i \t ]', '[foo~="bar" i]'],
['[foo~="bar" \t i \t ]', '[foo~="bar" i]'],
['[foo|=bar \t i \t ]', '[foo|="bar" i]'],
['[foo|="bar" \t i \t ]', '[foo|="bar" i]'],
['[foo^=bar \t i \t ]', '[foo^="bar" i]'],
['[foo^="bar" \t i \t ]', '[foo^="bar" i]'],
['[foo$=bar \t i \t ]', '[foo$="bar" i]'],
['[foo$="bar" \t i \t ]', '[foo$="bar" i]'],
['[foo*=bar \t i \t ]', '[foo*="bar" i]'],
['[foo*="bar" \t i \t ]', '[foo*="bar" i]']
];
debug("Various valid cases of the selector that are not using the canonical form.");
for (var testCase of alternativeValidSelectors) {
testValidSelector(testCase[0], testCase[1]);
}
</script>
<script src="../../resources/js-test-post.js"></script>
</html>