| <!DOCTYPE html> | |
| <html> | |
| <head> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <script src="support/testcases.sub.js"></script> | |
| </head> | |
| <body> | |
| <script> | |
| function buildNode(element_name, markup) { | |
| const e = document.createElement(element_name); | |
| e.innerHTML = markup; | |
| return e; | |
| } | |
| function toString(node) { | |
| const e = document.createElement("div"); | |
| e.append(node.cloneNode(true)); | |
| return e.innerHTML; | |
| } | |
| function assert_node_equals(node1, node2) { | |
| assert_equals(node1 instanceof Node, node2 instanceof Node); | |
| if (!(node1 instanceof Node)) return; | |
| node1.normalize(); | |
| node2.normalize(); | |
| assert_true(node1.isEqualNode(node2), | |
| `Node[${toString(node1)}] == Node[${toString(node2)}]`); | |
| if (node1 instanceof HTMLTemplateElement) { | |
| assert_node_equals(node1.content, node2.content); | |
| } | |
| } | |
| test(t => { | |
| let s = new Sanitizer(); | |
| assert_throws_js(TypeError, _ => s.sanitizeFor()); | |
| assert_throws_js(TypeError, _ => s.sanitizeFor(null)); | |
| }, "Sanitizer.sanitizeFor() should throw."); | |
| test(t => { | |
| let s = new Sanitizer(); | |
| assert_throws_js(TypeError, _ => s.sanitizeFor("xxx")); | |
| }, "Sanitizer.sanitizeFor() with one argument should throw."); | |
| for (const context of ["script", "iframe", "object", "div"]) { | |
| const should_fail = context != "div"; | |
| test(t => { | |
| let result = new Sanitizer().sanitizeFor(context, "<div>Hello!</div>"); | |
| if (should_fail) { | |
| assert_equals(null, result); | |
| } else { | |
| assert_true(result instanceof HTMLElement); | |
| } | |
| }, `Sanitizer.sanitizeFor("${context}", ...) should ${should_fail ? "fail" : "pass"}.`); | |
| } | |
| async_test(t => { | |
| let s = new Sanitizer(); | |
| s.sanitizeFor("div", "<img src='https://bla/'>"); | |
| t.step_timeout(_ => { | |
| assert_equals(performance.getEntriesByName("https://bla/").length, 0); | |
| t.done(); | |
| }, 1000); | |
| }, "Sanitizer.sanitizeFor function shouldn't load the image."); | |
| test(t => { | |
| const probe = `<a href="about:blank">hello</a><script>con` + | |
| `sole.log("world!");<` + `/script>`; | |
| const expected = `<a href="about:blank">hello</a>`; | |
| for (const element of ["div", "template", "span", "table", "td", | |
| "pumuckl", "custom-element", "linearGradient", | |
| "svg", "svg:img", "svg:linearGradient"]) { | |
| assert_node_equals( | |
| buildNode(element, expected), | |
| new Sanitizer().sanitizeFor(element, probe)); | |
| } | |
| }, `Sanitizer.sanitizeFor(element, ..)`); | |
| for (const context of ["div", "template", "table"]) { | |
| for (const probe of ["<em>Hello</em>", "<td>data</td>"]) { | |
| test(t => { | |
| assert_node_equals( | |
| buildNode(context, probe), | |
| new Sanitizer().sanitizeFor(context, probe)); | |
| }, `Sanitizer.sanitizeFor("${context}", "${probe}") obeys parse context.`); | |
| } | |
| } | |
| for (const testcase of testcases) { | |
| test(t => { | |
| let s = new Sanitizer(testcase.config_input); | |
| assert_node_equals( | |
| buildNode("template", testcase.result), | |
| s.sanitizeFor("template", testcase.value)); | |
| }, "Sanitizer.sanitizeFor with config: " + testcase.message); | |
| } | |
| </script> | |
| </body> | |
| </html> |