summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/trusted-types/Element-setAttribute-respects-Elements-node-documents-globals-CSP.html
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/trusted-types/Element-setAttribute-respects-Elements-node-documents-globals-CSP.html')
-rw-r--r--testing/web-platform/tests/trusted-types/Element-setAttribute-respects-Elements-node-documents-globals-CSP.html125
1 files changed, 125 insertions, 0 deletions
diff --git a/testing/web-platform/tests/trusted-types/Element-setAttribute-respects-Elements-node-documents-globals-CSP.html b/testing/web-platform/tests/trusted-types/Element-setAttribute-respects-Elements-node-documents-globals-CSP.html
new file mode 100644
index 0000000000..c0f72bb36a
--- /dev/null
+++ b/testing/web-platform/tests/trusted-types/Element-setAttribute-respects-Elements-node-documents-globals-CSP.html
@@ -0,0 +1,125 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta
+ http-equiv="Content-Security-Policy"
+ content="require-trusted-types-for 'script';"
+ />
+ <title>
+ trusted-types (TT): `setAttribute`/`setAttributeNode` for an element
+ adopted from a non-TT realm respects TT's Content-Security-Policy (CSP)
+ </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="nonSVGTestElements">
+ <iframe srcdoc="v"></iframe>
+ <embed src="v" />
+ <script src="v"></script>
+ <object data="v"></object>
+ <object codebase="v"></object>
+ </div>
+ <svg id="svgTestElements">
+ <script href="v"></script>
+ <script xlink:href="v"></script>
+ </svg>
+ <script>
+ const passThroughPolicy = trustedTypes.createPolicy("passThrough", {
+ createHTML: (s) => s,
+ });
+
+ function runTest(aTestElement) {
+ const testAttr = aTestElement.attributes[0];
+
+ async_test(
+ (t) => {
+ const sourceFrame = document.createElement("iframe");
+
+ // The markup requires the parent element to ensure the attribute is associated with the
+ // correct namespace.
+ sourceFrame.srcdoc = passThroughPolicy.createHTML(
+ `<!DOCTYPE html>
+ <head>
+ <meta charset="utf-8">
+ </head>
+ <body>
+ <` +
+ aTestElement.parentElement.localName +
+ `>
+ <` +
+ aTestElement.localName +
+ ` ` +
+ testAttr.name +
+ `="` +
+ testAttr.value +
+ `">
+ </` +
+ aTestElement.localName +
+ `>
+ </` +
+ aTestElement.parentElement.localName +
+ `>
+ doc without TT CSP.
+ </body>`
+ );
+
+ t.add_cleanup(() => {
+ sourceFrame.remove();
+ });
+
+ sourceFrame.addEventListener(
+ "load",
+ t.step_func_done(() => {
+ // A window is a global object which has 1-to-1 mapping to a realm, see the first
+ // note of <https://html.spec.whatwg.org/#realms-settings-objects-global-objects>
+ // and its following paragraph. Here, `sourceElement`'s node document's global
+ // belongs to a non-TT realm.
+
+ const sourceElement =
+ sourceFrame.contentDocument.body.querySelector(
+ aTestElement.localName
+ );
+ const sourceAttr = sourceElement.getAttributeNode(
+ testAttr.name
+ );
+ sourceElement.removeAttributeNode(sourceAttr);
+
+ document.body.append(sourceElement);
+ // Now `sourceElement`'s node document's global belongs to a TT-realm.
+
+ assert_throws_js(sourceFrame.contentWindow.TypeError, () => {
+ sourceElement.setAttributeNode(sourceAttr);
+ });
+ assert_throws_js(sourceFrame.contentWindow.TypeError, () => {
+ sourceElement.setAttributeNS(
+ sourceAttr.namespaceURI,
+ sourceAttr.name,
+ sourceAttr.value
+ );
+ });
+ })
+ );
+
+ document.body.append(sourceFrame);
+ },
+ `setAttribute and setAttributeNode respect the element's node document's global's CSP;
+ Element=${aTestElement.localName}; Parent=${aTestElement.parentElement.localName}; Attribute=${testAttr.name}`
+ );
+ }
+
+ for (const testElement of document.querySelectorAll(
+ "#nonSVGTestElements *"
+ )) {
+ runTest(testElement);
+ }
+
+ for (const testElement of document.querySelectorAll(
+ "#svgTestElements *"
+ )) {
+ runTest(testElement);
+ }
+ </script>
+ </body>
+</html>