- From: David Flanagan <dflanagan@mozilla.com>
- Date: Thu, 28 Jul 2011 15:42:48 -0700
- To: Alex Russell <slightlyoff@google.com>
- CC: Cameron McCormack <cam@mcc.id.au>, public-script-coord@w3.org, Brendan Eich <brendan@mozilla.com>
On 7/28/11 2:18 PM, Alex Russell wrote: > On Thu, Jul 28, 2011 at 12:11 PM, David Flanagan<dflanagan@mozilla.com> wrote: >> On 7/28/11 11:35 AM, Alex Russell wrote: >>> On Wed, Jul 27, 2011 at 11:07 PM, Cameron McCormack<cam@mcc.id.au> wrote: >>> >>>> So this would eliminate the need for [Constructor], since all interface >>>> objects would be constructable? >>> Yep! >> Don't you still need [Constructor] for declaring constructors that take >> arguments? Image has multiple constructors, for example (though it uses >> NamedConstructor to declare them since the interface name is >> HTMLImageElement). > My only proposal here is that in the absence of [Constructor], one is > provided for you, it's not meant to preclude allowing more and more > expressive constructors with better argument handling. When Cameron wrote "eliminate... [Constructor]" I thought he meant to eliminate it from WebIDL. Now I think I understand: your proposal would simply eliminate the need for a bare [Constructor] declaration on the interfaces that currently use it because they could leave it out and get it by default. With that clear, all of my points about constructors with arguments don't make any sense, since they could still be declared with [Constructor(...)] as they are now. >> And what about interfaces for which a no-arg constructor is not wanted? > It's JS. Passing no args is the special case of passing args. > >> If >> you're going to create Text nodes with a constructor instead of >> document.createTextNode(), for example, you want a constructor that takes a >> string argument. You don't want to have to use a no-arg constructor and >> then set the data property of the resulting object. > Right, but it shouldn't blow up. These should be equivalent: > > var blank = new Text(""); > var alsoBlank = new Text(); I brought up the Text example because I thought your proposal would not allow a Text constructor with an argument to be declared. Now I see that this is just a DOMCore issue. You'd like that spec to declare the Text interface with [Constructor(optional DOMString)], and then the specification text for that constructor to say what to do if the argument was omitted... I think WebIDL already provides everything needed here. >> So if you make creating >> a no-arg constructor the default, then I think you also need to add a >> [NoDefaultConstructor] attribute to WebIDL >> >> Also: What would happen for interfaces declared [NoInterfaceObject] and >> [Callback]? Both of those would imply [NoDefaultConstructor], right? > I'm pretty sure that there's no need for [NoDefaultConstructor]. We > just need to explain the JS-side results if passing no args to the > ctor when you specify ctors that would otherwise take them. But there must be *some* interfaces for which no constructors (with or without arguments) are desired... Perhaps the set of interfaces that do not want constructors is identical to the set that is currently declared [NoInterfaceObject] or [Callback] >>> It also opens the door for overdue fixes, like defining the arguments >>> these constructors should take, the document object that owns them, >>> and starting the discussion about how to give them shorter names = ) >> WebIDL already allows constructor arguments to be defined. > My point was only that we need to do the work of defining what good, > useful args for Node and Element ctors should be. Yes, that's work for > DOM to do, but WebIDL lays the groundwork here. Ah. Sorry; I thought you were talking about WebIDL rather than DOM Core... >> Setting the ownerDocument correctly seems like a serious problem for default >> constructors for nodes. > Nah. Image muddles through just fine. In any case, we can provide ways > to accomodate it, either through de-reference (getter-style): > > new d = new otherdoc.Div(...); Are you actually proposing to define DOM constructors on the document object? I kind of like that idea, but I assume you meant otherwin rather than otherdoc in the above... Of course that doesn't work for documents created by document.implementation.createHTMLDocument(), since they don't have windows. > or by allowing the document to be passed into the args: > > var d = new Div({ ownerDocument: otherdoc }); Right, and if you take this approach, then the DOM Core and HTML specifications will have to explicitly define [Constructor] attributes that specify the arguments. So none of the Node subtypes (including all of the HTML*Element interfaces) would benefit from your create a default no-arg constructor if none is explicitly specified proposal. I am not a spec writer, but it seems to me that since spec writers will have to write paragraphs of prose describing what each constructor does, it would actually be nicer to have those constructors explicitly declared in the IDL. Then, for example, the constructor declaration can be hyperlinked to the prose that defines what it does. With constructors created by default, spec authors will just have to remember to define the behavior of this important function that has no IDL representation. Adding constructors to all the DOM interfaces will be a non-trivial amount of work for the spec authors. It doesn't seem to me that modifying WebIDL to define constructors even without a [Constructor] declaration reduces that amount of work required in any substantial way. > I don't know what you mean about shorter names. WebIDL already gives spec > authors the ability to use NamedConstructor to define shorthand factory > names like Image() and Audio(). > Again, not WebIDL's problem per sae, but "HTMLDivElement" sucks vs. > "Div". Image and Audio are good precedents for Doing It Right (TM). For web compatibility, you're not going to be able to do away with HTMLDivElement, are you? How about just leaving it alone as a non-constructor and adding a Div() constructor? (Though it seems like adding one constructor to the Window object per HTML tag is going to break existing code...) And given that WebIDL already has [NamedConstructor], this is basically a job for DOMCore and HTML, right? One WebIDL issue that might be worth changing is to require named constructors to have the same prototype object as the current interface object. For example, WebIDL should probably require that: Image.prototype === HTMLImageElement.prototype Currently this comparison is false in both FF and Chrome. David
Received on Thursday, 28 July 2011 22:43:17 UTC