- From: Maciej Stachowiak <mjs@apple.com>
- Date: Fri, 5 Oct 2007 10:39:11 -0700
- To: Simon Pieters <simonp@opera.com>
- Cc: public-html <public-html@w3.org>
On Oct 5, 2007, at 9:55 AM, Simon Pieters wrote: > > (This is part of my detailed review of the Document Object Model > section.) > > The spec doesn't say what UAs are to do with the [[Get]] method on > the HTMLDocument interface. There are some interoperability > problems. See: > > http://simon.html5.org/test/html/dom/interfaces/HTMLDocument/Get-method/demos/ We have extensive test cases for this: http://trac.webkit.org/projects/webkit/browser/trunk/LayoutTests/fast/dom/HTMLDocument/document-special-properties.html http://trac.webkit.org/projects/webkit/browser/trunk/LayoutTests/fast/dom/HTMLDocument/document-special-properties-expected.txt One thing both IE and Safari do that your description below missed is that <img> elements can be found by id, but only if they also have a name attribute (regardless of the value of the name). We have run into the <embed>-in-<object> conflict with id/name lookup on the document as well, and have not thought of a good way to solve it given the constraint of actually parsing the <object>'s children in all cases. We also have a similar test case for Window's special property access: http://trac.webkit.org/projects/webkit/browser/trunk/LayoutTests/fast/dom/Window/window-special-properties.html http://trac.webkit.org/projects/webkit/browser/trunk/LayoutTests/fast/dom/HTMLDocument/document-special-properties-expected.txt This case is even less interoperable and Safari does something that's a compromise between IE and Firefox. Regards, Maciej > > > For reference I'll include my findings below: > > > -----------------8<----------------- > > Firefox: > > 1. look for all _name elements_ element with the name="" X. > 2. if one element was found, return that and abort these steps. > 3. otherwise if two or more elements were found, return a nodelist > of those > elements and abort these steps. > 4. otherwise, if document.getElementById(X) returns an _id element_ > return that and abort these steps. > 5. return undefined. > > A _name element_ is applet, embed, form, img, object > > An _id element_ is applet, embed, img, object > > > Safari: > > 1. look for all _name elements_ and _id elements_ with the name="" > or id="" > X, respectively. > 2. if one element was found, return that and abort these steps. > 3. otherwise if two or more elements were found, return an > HTMLCollection > of those elements and abort these steps. > 4. return undefined. > > A _name element_ is applet, embed, form, iframe, img, object. > > An _id element_ is applet, object. > > object above means object that contains only whitespace and <param>s. > > For iframes, return the element's contentWindow instead of the > element. > > > IE: > > It's hard to pin down what IE does. It seems to have special > tokenization rules for <object>. It's like a pseudo-CDATA element > that knows about <param>s. Whether the <object> will be replaced > with its contents (which will be parsed as HTML at that point) > depends on how the <param> tags are placed and where whitespace > occurs, and the phase of the moon. Anyway, if it is to be replaced, > it will be replaced after the load event has fired. See: http://krijnhoetmer.nl/irc-logs/whatwg/20071005#l-193 > > As an aside: it seems that setAttribute("name", "x") does nothing in > IE on applet, embed, form, iframe, img, object, if the element > didn't have a name="" attribute before. > > Whether it is replaced of course affects what [[Get]] returns, and > when you call [[Get]] (before or after the load event). > > Anyway. > > 1. look for all _name elements_ and _id elements_ with the name="" > or id="" > X, respectively. > 2. if one element was found, return that and abort these steps. > 3. otherwise if two or more elements were found, return a collection > of > those elements and abort these steps. > 4. return undefined. > > A _name element_ is applet, embed, form, iframe, img, object. > > An _id element_ is applet, object. > > For iframes, return the element's contentWindow instead of the > element. > > > Opera: > > 1. look for all _name elements_ and _id elements_ with the name="" > or id="" > X, respectively. > 2. if one element was found, return that and abort these steps. > 3. otherwise if two or more elements were found, return a collection > of > those elements and abort these steps. > 4. return undefined. > > A _name element_ is applet, embed, form, iframe, img, object. > > An _id element_ is applet, embed, form, iframe, img, object. > > > * * * > > Now, as you might imagine, the biggest interoperability problem > arises from the fact that IE does its crazy thing with replacing > object elements with their contents. In particular the following case: > > <object id=x><embed name=x></object> > > Scripts will assume that document.x returns an element and not an > array. Opera will return an array. We can't do what IE does. So that > leaves the Safari approach and the Firefox approach. Safari seems to > be closer to IE. > > ----------------->8----------------- > > > I'd suggest to spec what Safari does, except s/whitespace and > <param>s/comments, PIs, whitespace and <param>s/ > > Test cases for that: http://simon.html5.org/test/html/dom/interfaces/HTMLDocument/Get-method/ > > -- > Simon Pieters > Opera Software >
Received on Friday, 5 October 2007 17:39:57 UTC