12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- <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>
|