test(t => { const frame = document.body.appendChild(document.createElement("iframe")); t.add_cleanup(() => frame.contentDocument.close()); assert_equals(frame.contentDocument.compatMode, "BackCompat"); frame.contentDocument.open(); assert_equals(frame.contentDocument.compatMode, "CSS1Compat"); frame.contentDocument.close(); assert_equals(frame.contentDocument.compatMode, "BackCompat"); }, "document.open() sets document to no-quirks mode (write no doctype)"); test(t => { const frame = document.body.appendChild(document.createElement("iframe")); t.add_cleanup(() => frame.contentDocument.close()); assert_equals(frame.contentDocument.compatMode, "BackCompat"); frame.contentDocument.open(); assert_equals(frame.contentDocument.compatMode, "CSS1Compat"); frame.contentDocument.write(""); assert_equals(frame.contentDocument.compatMode, "BackCompat"); frame.contentDocument.close(); assert_equals(frame.contentDocument.compatMode, "BackCompat"); }, "document.open() sets document to no-quirks mode (write old doctype)"); test(t => { const frame = document.body.appendChild(document.createElement("iframe")); t.add_cleanup(() => frame.contentDocument.close()); assert_equals(frame.contentDocument.compatMode, "BackCompat"); frame.contentDocument.open(); assert_equals(frame.contentDocument.compatMode, "CSS1Compat"); frame.contentDocument.write(""); assert_equals(frame.contentDocument.compatMode, "CSS1Compat"); frame.contentDocument.close(); assert_equals(frame.contentDocument.compatMode, "CSS1Compat"); }, "document.open() sets document to no-quirks mode (write new doctype)"); // This tests the document.open() call in fact sets the document to no-quirks // mode, not limited-quirks mode. It is derived from // quirks/blocks-ignore-line-height.html in WPT, as there is no direct way to // distinguish between a no-quirks document and a limited-quirks document. It // assumes that the user agent passes the linked test, which at the time of // writing is all major web browsers. test(t => { const frame = document.body.appendChild(document.createElement("iframe")); t.add_cleanup(() => frame.contentDocument.close()); assert_equals(frame.contentDocument.compatMode, "BackCompat"); frame.contentDocument.open(); assert_equals(frame.contentDocument.compatMode, "CSS1Compat"); // Create the DOM tree manually rather than going through document.write() to // bypass the parser, which resets the document mode. const html = frame.contentDocument.appendChild(frame.contentDocument.createElement("html")); const body = html.appendChild(frame.contentDocument.createElement("body")); assert_equals(frame.contentDocument.body, body); body.innerHTML = `
x
x
x
`; assert_equals(frame.contentDocument.compatMode, "CSS1Compat"); const idTest = frame.contentDocument.getElementById("test"); const idRef = frame.contentDocument.getElementById("ref"); const idSRef = frame.contentDocument.getElementById("s_ref"); assert_equals(frame.contentWindow.getComputedStyle(idTest).height, frame.contentWindow.getComputedStyle(idSRef).height); assert_not_equals(frame.contentWindow.getComputedStyle(idTest).height, frame.contentWindow.getComputedStyle(idRef).height); }, "document.open() sets document to no-quirks mode, not limited-quirks mode");