|
@@ -0,0 +1,97 @@
|
|
|
+<iframe id="test-iframe"></iframe>
|
|
|
+<script src="../include.js"></script>
|
|
|
+<script>
|
|
|
+ asyncTest((done) => {
|
|
|
+ window.addEventListener("message", (e) => {
|
|
|
+ println(e.data);
|
|
|
+ if (e.data === "DONE")
|
|
|
+ done();
|
|
|
+ });
|
|
|
+
|
|
|
+ let testCount = 1;
|
|
|
+
|
|
|
+ function createTest(asBlob, final = false) {
|
|
|
+ let html = `
|
|
|
+ <script>
|
|
|
+ parent.postMessage(${testCount++}, "*");
|
|
|
+ ${final ? "parent.postMessage('DONE', '*')" : ""}
|
|
|
+ </script>
|
|
|
+ `;
|
|
|
+ html = html.replaceAll("<", "<").replaceAll(">", ">");
|
|
|
+ return asBlob
|
|
|
+ ? URL.createObjectURL(new Blob([html], { type: "text/html" }))
|
|
|
+ : html;
|
|
|
+ }
|
|
|
+
|
|
|
+ // https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-iframe-element:process-the-iframe-attributes-2
|
|
|
+ // https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-iframe-element:process-the-iframe-attributes-3
|
|
|
+ // Whenever an iframe element with a non-null content navigable has its srcdoc attribute set, changed, or removed,
|
|
|
+ // the user agent must process the iframe attributes.
|
|
|
+ // Similarly, whenever an iframe element with a non-null content navigable but with no srcdoc attribute specified
|
|
|
+ // has its src attribute set, changed, or removed, the user agent must process the iframe attributes.
|
|
|
+
|
|
|
+ const firstSrcdoc = createTest(false);
|
|
|
+ const testIframe = document.getElementById("test-iframe");
|
|
|
+
|
|
|
+ testIframe.addEventListener("load", () => {
|
|
|
+ switch (testCount)
|
|
|
+ {
|
|
|
+ case 2:
|
|
|
+ // Change srcdoc.
|
|
|
+ testIframe.srcdoc = createTest(false);
|
|
|
+ break;
|
|
|
+ case 3:
|
|
|
+ // Remove srcdoc.
|
|
|
+ testIframe.removeAttribute("srcdoc");
|
|
|
+ testCount++;
|
|
|
+
|
|
|
+ // FIXME: Do this in test case 4. However, it does not work currently as the navigation to
|
|
|
+ // about:blank following srcdoc does not fire a load event.
|
|
|
+ // Set src.
|
|
|
+ testIframe.src = createTest(true);
|
|
|
+ break;
|
|
|
+ case 5:
|
|
|
+ // Change src.
|
|
|
+ testIframe.src = createTest(true);
|
|
|
+ break;
|
|
|
+ case 6:
|
|
|
+ // srcdoc takes priority.
|
|
|
+ testIframe.srcdoc = createTest(false);
|
|
|
+ break;
|
|
|
+ case 7:
|
|
|
+ // Changing src has no effect when srcdoc is specified.
|
|
|
+ testIframe.src = createTest(true);
|
|
|
+ setTimeout(() => {
|
|
|
+ testIframe.srcdoc = createTest(false);
|
|
|
+ }, 0)
|
|
|
+ break;
|
|
|
+ case 9:
|
|
|
+ // Removing src has no effect when srcdoc is specified.
|
|
|
+ testIframe.removeAttribute("src");
|
|
|
+ setTimeout(() => {
|
|
|
+ testIframe.srcdoc = createTest(false);
|
|
|
+ }, 0);
|
|
|
+ break;
|
|
|
+ case 10:
|
|
|
+ // Setting src has no effect when srcdoc is specified.
|
|
|
+ testIframe.src = createTest(true);
|
|
|
+ setTimeout(() => {
|
|
|
+ testIframe.srcdoc = createTest(false);
|
|
|
+ }, 0);
|
|
|
+ break;
|
|
|
+ case 12:
|
|
|
+ // Changing any other attributes doesn't cause a reload.
|
|
|
+ testIframe.setAttribute("data-hello", "world");
|
|
|
+ setTimeout(() => {
|
|
|
+ testIframe.srcdoc = createTest(false, true);
|
|
|
+ }, 0);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ // Set srcdoc.
|
|
|
+ testIframe.srcdoc = firstSrcdoc;
|
|
|
+ });
|
|
|
+</script>
|