- From: Boris Zbarsky <bzbarsky@MIT.EDU>
- Date: Tue, 31 Jul 2012 01:17:11 -0400
- To: "public-script-coord@w3.org" <public-script-coord@w3.org>
I've run into several issues with platform array objects that I think
are worth addressing:
1) Spec authors find them incredibly confusing. It's common to see
specs using them for arguments that are supposed to be JS arrays, where
a sequence would make more sense (e.g. be faster). It's also common to
see specs using these as return values without specifying whether the
same object is returned each time or not or what the modification
behavior is (more on this below). I'm not quite sure how to resolve
this; perhaps more informative text and examples in the WebIDL spec?
It's worth thinking carefully about the use cases here. For example,
are there good use cases so far for platform array object arguments? (I
suspect there are.) Are there use cases for auto-coercion from JS
arrays to a platform array object arguments? (Not sure there are.)
That sort of thing. That would inform the explanatory text, if nothing
else.
2) There are actually three different kinds of objects that are all
called "platform array objects" in WebIDL. The expectation seems to be
that spec prose in a spec using WebIDL will indicate which kind is used
in which case, but in practice I have never seen a spec that uses
platform array objects do so.
The three kinds of array objects are:
i) Variable length (implies writable).
ii) Fixed length but writable
iii) Readonly
Type (i) allows truncating or expanding the array (though it's not clear
what happens when you expand it) and changing the values in the array.
Type (ii) allows only changing the values but not the length, and Type
(iii) doesn't allow any changes.
WebIDL says that unless otherwise specified typed arrays are not of type
(i), but says nothing about (ii) vs (iii).
There are a number of issues due to the type of the platform array
object not being annotated in the WebIDL. For example, consider this IDL:
[Constructor()] interface A {
readonly attribute long[] myNumbers; // Returns a readonly object
};
[Constructor()] interface B {
void getData(long[] putItHere); // Expects a variable length object
};
and someone doing:
(new B()).getData((new A()).myNumbers);
I would argue this should throw, but there's no way to determine that
from the IDL, and nothing in WebIDL says it actually _will_ throw.
I would argue that platform array object arguments, if supported, should
require explicit indication when the argument is not readonly, and the
explicit indication should say whether they're fixed length. Attempts
to pass a readonly or fixed length array to a method that wants one that
is writable or variable length respectively should throw.
I'm not sure what the right semantics are for return values. Once
again, I think they should require explicit indication of cases when the
caller will be able to modify the array, so spec authors don't
accidentally create specs that make private state modifiable. But it
could be argued that a "readonly" annotation here should also imply that
the callee promises the platform array object won't change in the future
or something... I don't think that last would be desirable, for what
it's worth.
Thoughts?
-Boris
Received on Tuesday, 31 July 2012 05:17:40 UTC