| Index: qunit/tests/cssEscaping.js |
| =================================================================== |
| new file mode 100644 |
| --- /dev/null |
| +++ b/qunit/tests/cssEscaping.js |
| @@ -0,0 +1,100 @@ |
| +module("CSS escaping"); |
| +asyncTest("CSS escaping", function() |
| +{ |
| + var frame = document.createElement("iframe"); |
| + frame.srcdoc='<script src="../include.postload.js"></script>'; |
| + |
| + frame.addEventListener("load", function() |
|
Wladimir Palant
2014/11/06 21:26:06
Nit: This should be part of test setup (defined in
Sebastian Noack
2014/11/10 12:13:18
I already wondered whether qunit has setup/teardow
|
| + { |
| + start(); |
| + |
| + var escapeCSS = frame.contentWindow.escapeCSS; |
| + var quote = frame.contentWindow.quote; |
| + |
| + document.body.removeChild(frame); |
|
Wladimir Palant
2014/11/06 21:26:06
Won't removing the frame immediately prevent escap
Sebastian Noack
2014/11/10 12:13:18
No, the test passes without any errors. I think it
|
| + |
| + function testSelector(opts) { |
|
Wladimir Palant
2014/11/06 21:26:06
Nit: opening bracket on next line please.
Sebastian Noack
2014/11/10 12:13:18
Done.
|
| + var mustMatch = opts.mustMatch !== false; |
| + var doc = document.implementation.createHTMLDocument(); |
| + |
| + var style = doc.createElement("style"); |
| + doc.documentElement.appendChild(style); |
| + style.sheet.insertRule(opts.selector + " {}"); |
| + |
| + var element; |
| + try |
| + { |
| + element = doc.createElement(opts.tagName || "div"); |
| + } |
| + catch (e) |
| + { |
| + // Some characters we are going to test can not occur in tag names, |
| + // but we still have to make sure that no exception is thrown when |
| + // calling .querySelector() and .insertRule() |
| + element = null; |
| + mustMatch = false; |
| + } |
| + |
| + if (element) |
| + { |
| + for (var attr in opts.attributes) |
| + element.setAttribute(attr, opts.attributes[attr]); |
| + |
| + doc.documentElement.appendChild(element); |
| + } |
| + |
| + var foundElement = doc.querySelector(opts.selector); |
| + if (mustMatch) |
| + equal(foundElement, element, opts.selector); |
| + else |
| + ok(true, opts.selector); |
| + } |
| + |
| + function testEscape(s) |
| + { |
| + testSelector({ |
| + selector: escapeCSS(s), |
| + tagName: s |
| + }); |
| + |
| + testSelector({ |
| + selector: "#" + escapeCSS(s), |
| + attributes: {id: s} |
| + }); |
| + |
| + testSelector({ |
| + selector: "." + escapeCSS(s), |
| + attributes: {class: s}, |
| + |
| + // Whitespace characters split the class name, hence the selector |
| + // won't match. But we still have to make sure that no exception |
| + // is thrown when calling .querySelector() and .insertRule() |
| + mustMatch: !/\s/.test(s) |
| + }); |
| + |
| + testSelector({ |
| + selector: "[foo=" + quote(s) + "]", |
| + attributes: {foo: s} |
| + }); |
| + } |
| + |
| + for (var i = 0; i < 0x80; i++) |
| + { |
| + var chr = String.fromCharCode(i); |
| + |
| + // Make sure that all ASCII characters are correctly escaped. |
| + testEscape(chr); |
| + |
| + // Some characters are only escaped when in the first positon, |
| + // so we still have to make sure that everything is correctly escaped |
| + // in subsequent positions. At the same time we make sure that |
| + // leading dashes are escaped, when followed by certain characters. |
| + testEscape("-" + chr); |
|
Wladimir Palant
2014/11/06 21:26:06
How about testing a letter as leading character as
Sebastian Noack
2014/11/10 12:13:18
I considered that case redundant. But fair enough.
|
| + } |
| + |
| + // Test some non-ASCII characters. However, those shouldn't require escaping. |
| + testEscape("😻♥ä"); |
|
Wladimir Palant
2014/11/06 21:26:06
Better not have Unicode characters in a JavaScript
Sebastian Noack
2014/11/10 12:13:18
I actually enjoyed seeing a cat with heart-shaped
|
| + }); |
| + |
| + document.body.appendChild(frame); |
| +}); |