Re: type parameter of Document.open() (detailed review of the DOM)

On Mon, 9 Jul 2007, Simon Pieters wrote:
> 
> (This is part of my detailed review of the Document Object Model section.)
> 
> Step 9 in Document.open() says:
> 
>    If type does not have the value "text/html", then act as if the
>    tokeniser had emitted a pre element start tag, then set the HTML
>    parser's tokenisation stage's content model flag to PLAINTEXT.
> 
> However this is not what any of IE, Opera, Firefox or Safari are doing, 
> AFAICT. They treat "text/plain" as text/plain and anything else as 
> text/html. Is this intentional?

In my testing, I found that:

* Opera honours the type if it recognised it, and treats the type as 
text/html if it did not. It recognises at least text/plain, image/svg+xml, 
and application/xhtml+xml. It does something with application/xml and 
text/xml that I couldn't understand. With image/gif and image/png, it 
creates the regular fake image document, and document.write()s go into the 
front of that, before the <img>, even if you output a valid image. It 
ignores leading spaces and semicolons, and ignores everything after the 
first non-leading space or the first semicolon. It is case-insensitive.

* Safari treats everything as text/html, it seems.

* Firefox treats text/html as HTML, and everything else as text/plain. It 
ignores leading and trailing spaces, and ignores everything after the 
first non-leading space or the first semicolon. It is case-insensitive.

* IE treats known image/* types as errors that raise exceptions, 
text/plain as text/plain, and everything else as text/html. It doesn't 
ignore spaces or semicolons. It is case-insensitive.

I've gone with the simplest subset behaviour -- case-insensitive literal 
string match against "text/plain", with everything else being treated as 
HTML. Hopefully this is compatible enough.

Notable tests:
 http://software.hixie.ch/utilities/js/live-dom-viewer/?%3C!DOCTYPE%20html%3E...%3Ciframe%3E%3C%2Fiframe%3E%3Cscript%3Eonload%20%3D%20function%20()%20%7B%20%0D%0A%20%20var%20d%20%3D%20document.getElementsByTagName('iframe')%5B0%5D.contentDocument%3B%0D%0A%20%20d.open('image%2Fsvg%2Bxml')%3B%0D%0A%20%20d.write(%22%3Cinput%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml'%20value%3D'(x)html'%2F%3E%22)%3B%0D%0A%20%20d.close()%3B%0D%0A%7D%3B%3C%2Fscript%3E
 http://software.hixie.ch/utilities/js/live-dom-viewer/?%3C!DOCTYPE%20html%3E...%3Ciframe%3E%3C%2Fiframe%3E%3Cscript%3Eonload%20%3D%20function%20()%20%7B%20%0D%0A%20%20var%20d%20%3D%20document.getElementsByTagName('iframe')%5B0%5D.contentDocument%3B%0D%0A%20%20d.open('image%2Fgif')%3B%0D%0A%20%20var%20a%20%3D%20%5B%200x47%2C%200x49%2C%200x46%2C%200x38%2C%200x39%2C%200x61%2C%200x01%2C%200x00%2C%200x01%2C%200x00%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%200x80%2C%200xff%2C%200x00%2C%200xc0%2C%200xc0%2C%200xc0%2C%200x00%2C%200x00%2C%200x00%2C%200x21%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%200xf9%2C%200x04%2C%200x01%2C%200x00%2C%200x00%2C%200x00%2C%200x00%2C%200x2c%2C%200x00%2C%200x00%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%200x00%2C%200x00%2C%200x01%2C%200x00%2C%200x01%2C%200x00%2C%200x00%2C%200x02%2C%200x02%2C%200x44%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%200x01%2C%200x00%2C%200x3b%20%5D%3B%0D%0A%20%20var%20s%20%3D%20%22%22%3B%0D%0A%20%20for%20(var%20i%20%3D%200%3B%20i%20%3C%20a.length%3B%20i%20%2B%3D%201)%0D%0A%20%20%20%20s%20%2B%3D%20String.fromCharCode(a%5Bi%5D)%3B%0D%0A%20%20d.write(s)%3B%0D%0A%20%20d.close()%3B%0D%0A%7D%3B%3C%2Fscript%3E
 http://software.hixie.ch/utilities/js/live-dom-viewer/?%3C!DOCTYPE%20html%3E...%3Ciframe%3E%3C%2Fiframe%3E%3Cscript%3Eonload%20%3D%20function%20()%20%7B%20%0A%20%20var%20d%20%3D%20document.getElementsByTagName('iframe')%5B0%5D.contentDocument%3B%0A%20%20d.open('image%2Fgif')%3B%0A%20%20var%20a%20%3D%20%5B%200x89%2C%200x50%2C%200x4e%2C%200x47%2C%200x0d%2C%200x0a%2C%200x1a%2C%200x0a%2C%200x00%2C%0A%20%20%20%20%20%20%20%20%20%20%20%200x00%2C%200x00%2C%200x0d%2C%200x49%2C%200x48%2C%200x44%2C%200x52%2C%200x00%2C%200x00%2C%0A%20%20%20%20%20%20%20%20%20%20%20%200x00%2C%200x14%2C%200x00%2C%200x00%2C%200x00%2C%200x14%2C%200x08%2C%200x02%2C%200x00%2C%0A%20%20%20%20%20%20%20%20%20%20%20%200x00%2C%200x00%2C%200x02%2C%200xeb%2C%200x8a%2C%200x5a%2C%200x00%2C%200x00%2C%200x00%2C%0A%20%20%20%20%20%20%20%20%20%20%20%200x04%2C%200x67%2C%200x41%2C%200x4d%2C%200x41%2C%200x00%2C%200x00%2C%200xaf%2C%200xc8%2C%0A%20%20%20%20%20%20%20%20%20%20%20%200x37%2C%200x05%2C%200x8a%2C%200xe9%2C%200x00%2C%200x00%2C%200x00%2C%200x09%2C%200x70%2C%0A%20%20%20%20%20%20%20%20%20%20%20%200x48%2C%200x59%2C%200x73%2C%200x00%2C%200x00%2C%200x00%2C%200x48%2C%200x00%2C%200x00%2C%0A%20%20%20%20%20%20%20%20%20%20%20%200x00%2C%200x48%2C%200x00%2C%200x46%2C%200xc9%2C%200x6b%2C%200x3e%2C%200x00%2C%200x00%2C%0A%20%20%20%20%20%20%20%20%20%20%20%200x00%2C%200x1b%2C%200x49%2C%200x44%2C%200x41%2C%200x54%2C%200x38%2C%200xcb%2C%200x63%2C%0A%20%20%20%20%20%20%20%20%20%20%20%200xfc%2C%200xcf%2C%200x40%2C%200x3e%2C%200x60%2C%200xa2%2C%200x40%2C%200xef%2C%200xa8%2C%0A%20%20%20%20%20%20%20%20%20%20%20%200xe6%2C%200x51%2C%200xcd%2C%200xa3%2C%200x9a%2C%200x47%2C%200x35%2C%200x53%2C%200x41%2C%0A%20%20%20%20%20%20%20%20%20%20%20%200x33%2C%200x00%2C%200x22%2C%200x9c%2C%200x01%2C%200x27%2C%200x21%2C%200x6c%2C%200x3c%2C%0A%20%20%20%20%20%20%20%20%20%20%20%200xf6%2C%200x00%2C%200x00%2C%200x00%2C%200x22%2C%200x7a%2C%200x54%2C%200x58%2C%200x74%2C%0A%20%20%20%20%20%20%20%20%20%20%20%200x53%2C%200x6f%2C%200x66%2C%200x74%2C%200x77%2C%200x61%2C%200x72%2C%200x65%2C%200x00%2C%0A%20%20%20%20%20%20%20%20%20%20%20%200x00%2C%200x78%2C%200xda%2C%200x73%2C%200x4c%2C%200xc9%2C%200x4f%2C%200x4a%2C%200x55%2C%0A%20%20%20%20%20%20%20%20%20%20%20%200xf0%2C%200xcc%2C%200x4d%2C%200x4c%2C%200x4f%2C%200x0d%2C%200x4a%2C%200x4d%2C%200x4c%2C%0A%20%20%20%20%20%20%20%20%20%20%20%200xa9%2C%200x04%2C%200x00%2C%200x2f%2C%200x9c%2C%200x05%2C%200xd4%2C%200xae%2C%200x0c%2C%0A%20%20%20%20%20%20%20%20%20%20%20%200xa9%2C%200x4d%2C%200x00%2C%200x00%2C%200x00%2C%200x00%2C%200x49%2C%200x45%2C%200x4e%2C%0A%20%20%20%20%20%20%20%20%20%20%20%200x44%2C%200xae%2C%200x42%2C%200x60%2C%200x82%20%5D%3B%0A%20%20var%20s%20%3D%20%22%22%3B%0A%20%20for%20(var%20i%20%3D%200%3B%20i%20%3C%20a.length%3B%20i%20%2B%3D%201)%0A%20%20%20%20s%20%2B%3D%20String.fromCharCode(a%5Bi%5D)%3B%0A%20%20d.write(s)%3B%0A%20%20d.close()%3B%0A%7D%3B%3C%2Fscript%3E

-- 
Ian Hickson               U+1047E                )\._.,--....,'``.    fL
http://ln.hixie.ch/       U+263A                /,   _.. \   _\  ;`._ ,.
Things that are impossible just take longer.   `._.-(,_..'--(,_..'`-.;.'

Received on Tuesday, 12 August 2008 23:59:46 UTC