- From: Tab Atkins Jr. <jackalmage@gmail.com>
- Date: Tue, 9 Sep 2014 07:48:16 -0700
- To: Boris Zbarsky <bzbarsky@mit.edu>
- Cc: "public-script-coord@w3.org" <public-script-coord@w3.org>, Ian Hickson <ian@hixie.ch>
On Tue, Sep 9, 2014 at 7:17 AM, Boris Zbarsky <bzbarsky@mit.edu> wrote:
> Now that we have the idea of "required" dictionary attributes, it seems like
> they can be used to solve a long-lasting pain point with event constructors.
>
> Consider this IDL from the webapps spec:
>
> dictionary TrackEventInit : EventInit {
> (VideoTrack or AudioTrack or TextTrack) track;
> };
>
> [Constructor(DOMString type, optional TrackEventInit eventInitDict)]
> interface TrackEvent : Event {
> readonly attribute (VideoTrack or AudioTrack or TextTrack) track;
> };
>
> with accompanying prose that says:
>
> The track attribute must return the value it was initialised to.
> When the object is created, this attribute must be initialised to
> null. It represents the context information for the event.
>
> There's an obvious mismatch between the prose and the IDL here: The prose
> wants to init to null, but the IDL wants to claim that null is never
> returned. Presumably this is because the actual uses of this event in the
> spec then go ahead and set the track attribute to a non-null value... but
> that doesn't help script that uses the constructor; in that situation the
> spec is just self-contradictory.
>
> Gecko resolves this problem at the moment by making the "track" attribute in
> both the dictionary and the interface nullable.
>
> However, now that we have the ability to require attributes in dictionaries
> it seems like we could do:
>
> dictionary TrackEventInit : EventInit {
> required (VideoTrack or AudioTrack or TextTrack) track;
> };
>
> and remove the bits about null, since now the constructor will always have a
> track to work with.
>
> Making the attribute nullable, with a default value of null, means you can
> do this:
>
> var ev = new TrackEventInit();
>
> without having to pass a dictionary. On the other hand it also means that
> you can create a TrackEvent with a null track. Making the attribute
> non-nullable but required means that you have to do something like:
>
> var ev = new TrackEventInit({ track: something });
>
> to create a TrackEvent, but guarantees that all TrackEvents have a useful
> .track...
>
> Do people have a preference for one or the other of these solutions in
> designing event APIs? What about other constructor APIs that take
> dictionary arguments?
It doesn't seem particularly useful to initialize a track event
without a track, so I'm fine with making track required and not
nullable.
~TJ
Received on Tuesday, 9 September 2014 14:49:05 UTC