| <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> |
| <html> |
| <head> |
| <script src="../../../resources/js-test-pre.js"></script> |
| </head> |
| <body> |
| <script> |
| description("Test that iframe.contentWindow.document.write() can convert a document to strict mode -- https://bugs.webkit.org/show_bug.cgi?id=24336"); |
| |
| // Simple recurisve "give me a string to represent this tree" function |
| function treeAsString(node) { |
| var string = node.nodeName; |
| if (node.childNodes.length) { |
| string += " ["; |
| } |
| for (var x = 0; x < node.childNodes.length; x++) { |
| if (x != 0) { |
| string += ", "; |
| } |
| string += treeAsString(node.childNodes[x]); |
| } |
| |
| if (node.childNodes.length) { |
| string += "]"; |
| } |
| return string; |
| } |
| |
| function doctypeNodeName(iframeDocument) { |
| // WebKit returns "html" (matching the specified name of the doctype source) |
| // Gecko returns "HTML" and IE "#comment" |
| // We don't care for this test, so we use this hack. |
| return iframeDocument.firstChild.nodeName; |
| } |
| |
| var iframe = document.createElement("iframe"); |
| document.body.appendChild(iframe); |
| var iframeDocument = iframe.contentWindow.document; |
| |
| debug("about:blank is quirksmode by default") |
| shouldBeEqualToString("iframeDocument.compatMode", "BackCompat"); |
| debug("ensure that about:blank's DOM has an html and body element") |
| shouldBeEqualToString("treeAsString(iframeDocument)", "#document [HTML [HEAD, BODY]]"); |
| |
| iframeDocument.write("<!DocType html><html><body>test</body></html>"); |
| debug("writing a doctype as the first document.write can change the document to standards") |
| shouldBeEqualToString("iframeDocument.compatMode", "CSS1Compat"); |
| debug("ensure the written DOM has an html and body element") |
| shouldBeEqualToString("treeAsString(iframeDocument)", "#document [" + doctypeNodeName(iframeDocument) + ", HTML [HEAD, BODY [#text]]]"); |
| |
| // document.open() doesn't seem to clear the document as expected in Gecko |
| // https://bugzilla.mozilla.org/show_bug.cgi?id=483908 |
| // All tests after this points are likely to fail in Firefox |
| iframe.contentWindow.document.open(); |
| debug("ensure that document.open clears the document but does not change the document pointer") |
| shouldBe("iframeDocument", "iframe.contentWindow.document"); |
| debug("document.open should also clear the document and reset the doctype)") |
| shouldBeEqualToString("treeAsString(iframeDocument)", "#document"); |
| shouldBeEqualToString("iframeDocument.compatMode", "CSS1Compat"); |
| |
| debug("document.write of \"\" should leave the document in no-quirks mode and add no content to the document") |
| iframeDocument.write(""); |
| shouldBeEqualToString("iframeDocument.compatMode", "CSS1Compat"); |
| shouldBeEqualToString("treeAsString(iframeDocument)", "#document"); |
| |
| debug("document.write calls can change the doctype until an <html> is created") |
| iframeDocument.write("<!DocType html><html><body>test</body></html>"); |
| shouldBeEqualToString("iframeDocument.compatMode", "CSS1Compat"); |
| |
| debug("reset the document again"); |
| iframe.contentWindow.document.open(); |
| |
| debug("document.write of \"<html>\" should leave the document in quirksmode and add only an HTML element, no body") |
| iframeDocument.write("<html>"); |
| shouldBeEqualToString("iframeDocument.compatMode", "BackCompat"); |
| shouldBeEqualToString("treeAsString(iframeDocument)", "#document [HTML]"); |
| |
| debug("any document.write calls after <html> has been encountered cannot change the doctype") |
| iframeDocument.write("<!DocType html><html><body>test</body></html>"); |
| shouldBeEqualToString("iframeDocument.compatMode", "BackCompat"); |
| |
| document.body.removeChild(iframe); |
| </script> |
| <script src="../../../resources/js-test-post.js"></script> |
| </body> |
| </html> |