- From: Boris Zbarsky <bzbarsky@MIT.EDU>
- Date: Fri, 15 Jun 2012 13:45:56 -0400
- To: public-script-coord@w3.org, HTML WG <public-html@w3.org>
Consider this testcase:
<!DOCTYPE html>
<form><input name="1"></form>
<script>
var list = document.forms[0].elements;
alert(list[list.length])
</script>
Browsers mostly interoperably alert "undefined" (well, at least Gecko,
WebKit+V8, Presto, Trident all do; WebKit+JSC alerts "[object
HTMLInputElement]").
However the current WebIDL spec plus the current HTML spec seem to
require that "[object HTMLInputElement]" be alerted. Indeed in WebIDL
section 4.6.2 step 1 substep 2, ToUint32("1") is not a supported
property index, so we move on to step 2. form.elements supports named
properties, so step 2 involves us calling the named property getter, and
the HTML spec says the set of supported property names is "all the id
and name attributes of all the elements represented by the collection".
I think that Safari's behavior here is buggy; in particular it would
break loops of the form:
for (var i = 0; list[i]; ++i) {
}
which are in fact used in the wild (though possibly not on nodes with
ids that look like integers).
If the specs want to align with the non-Safari behavior, I think there
are two options. Either HTML needs to exclude ids and names that look
like integers from the set of supported property names, or WebIDL needs
to be changed so that for objects which support indexed properties step
2 of 4.6.2 is skipped if the given property name is an array index
property name.
Personally, I would prefer this be changed in WebIDL.
-Boris
Received on Friday, 15 June 2012 17:46:29 UTC