- From: Boris Zbarsky <bzbarsky@MIT.EDU>
- Date: Tue, 09 Oct 2012 14:33:25 -0400
- To: public-webapps@w3.org
I was just looking at http://dvcs.w3.org/hg/IndexedDB/raw-file/tip/Overview.html#dfn-valid-key and I had some concerns about it. Specifically: 1) The definition of "valid key" mentions "Array JavaScript objects" without making it clear what that means. Does that mean that the [[Class]] is Array? That the prototype is Array.prototype? Something else? 2) The text about "float" makes no sense, because "float" in WebIDL can't be infinite. Presumably what's meant here is "unrestricted float"? 3) It's not clear what the algorithm for determining whether a key is valid in the Array case is. Is the following key valid: var obj = []; Object.defineProperty(foo, "0", { value: 1 }); ? What about this one: function getItem() { return 1; } var obj = []; Object.defineProperty(foo, "0", { get: getItem }); ? What about this one: var obj = []; function getItem() { if (Math.random() < 0.99) { return 1; } else { return obj; } } Object.defineProperty(foo, "0", { get: getItem }); Note that for all of these arrays "every item in the array is defined". 4) The thing about float and DOMString is a bit confusing to me. Seems like the intent is that "NaN" is a valid key, right? And that "5" and 5 are different keys? So if you're using keys that came from cookies or form controls or whatnot you have to be very careful to convert from string to numeric representation as needed? Note that generally in WebIDL string and float are not treated as distinguishable, for precisely these reasons... Also note that there is no way to ask whether something "is" a DOMString or a WebIDL "float". All WebIDL provides is a way to _convert_ a given value to one of those types. Any sort of asking what type something "is" for an "any" value sort of needs to happen on ECMAScript types, not WebIDL ones. As a particularly interesting example, is this a valid key: var key = { toString: function() { return "foo"; }, valueOf: function() { return 5; } }; ? This is convertible to both WebIDL DOMString (giving "foo") and WebIDL float (giving 5). So it's not clear to me exactly how a UA is supposed to decide whether a key "is" of "type" DOMString or float. 5) It's not clear what meaning of "Date" is being used here. Again, is it some particular [[Class]] or is it some particular prototype, or something else? 6) The comparison algorithm for arrays needs to say whether A[i] or B[i] is evaluated first, if arrays with indexed accessor properties are valid keys, because the get can have side effects. 7) Similarly, if arrays with indexed accessor properties are valid keys, the recursive calls in steps 4 and 5 of the comparison algorithm need to explicitly say which of A[i] and B[i] become the new A and B. And I suspect that actually the algorithm doesn't mean to invoke itself twice recursively in this situation anyway... Unfortunately, if arrays with indexed accessor properties are valid keys UAs can't combine the two recursive calls into one call in case when A[i] and B[i] are in fact equal arrays. I suspect the right answer to #3, #6, #7, is to require that all the properties 0,...length-1 on the array be own value properties in a valid Array key, for what it's worth. -Boris
Received on Tuesday, 9 October 2012 18:33:55 UTC