On 2/5/13 11:01 PM, Erik Arvidsson wrote:
On Tue, Feb 5, 2013 at 5:28 PM, Boris Zbarsky <bzbar...@mit.edu> wrote:
So in particular this allows creation of "uninitialized" instances in some
sense, yes?

Depends how much logic is put in the constructor vs @@create. For DOM
Elements I think we want to put *all* the logic in create.

OK, I can live with that as long as the only arguments are things like for Image. We'll have to be pretty careful about how we define our Element subclass constructors in the future, though...

And there are knock-on effects on all other objects in WebIDL.  See below.

This won't work right given how HTMLButtonElement is currently defined in
WebIDL.  Need to fix that at the very least.

Yes, but for document.register I think we can get away without
changing this.

No, you can't.  You really need to get WebIDL fixed here.

We might need to add no op call methods to these
functions

They already have [[Call]]. What they don't have is a custom [[Construct]]. Which means that they end up invoking the [[Construct]] defined in ES5 section 13.2.2, which in step 8 calls the [[Call]] and if that returns an object (which the WebIDL [[Call]] does) throws away the object that [[construct]] just created and returns the object [[Call]] returned.

And you can't no-op the [[Call]] because web pages, afaik, use things like:

  var myImage = Image();

and

  var xhr = XMLHttpRequest();

just like they use Date() and Object() and Array(). The above is supported for DOM constructors in at least Gecko and Presto, though apparently not Chrome or Safari; I don't have IE to test right now. But the point is that right now those constructors are not particularly weird in Gecko and Presto, and I'm not entirely happy making them _more_ weird.

Maybe the fact that Chrome and Safari don't support this means that we can in fact redefine the [[Construct]] to create the right sort of object and then invoke [[Call]] which will actually initialize the object. But that brings us back to being able to create partially-initialized objects for all IDL interfaces, not just elements....

Perhaps we need to define an IDL annotation for interfaces that opt in to this split between [[Call]] and [[Construct]] and then have elements opt in to it?

but that seems like the right thing to do anyway. The WebIDL
interface constructors are already strange as they are

Not in Gecko and Presto as far as I can tell... Certainly not any stranger than Date or Array.

and I doubt anyone would object to making them less strange.

I have no problem with less strange, but you're proposing more strange. Again, as far as I can tell.

What happens if the same function is registered for several different tag
names, in terms of what happens with the [[Construct]]?

I vote for throwing. We could allow the tag name to be used as an
alias but I don't really understand the use case you have in mind
here.

I don't have a use case. What I have is an edge case that I can see implementations doing random non-interoperable crap for if we don't define it.

Throwing sounds fine to me.

Define, please.  How does one determine this, in a rendering engine
implementation?  I certainly have no way to tell, in Gecko, when I'm
"entering script", offhand....

I was told this is needed for mutation observers that are queued up
during parse. I'll let Dimitri or Rafael chime in with details.

Ah, OK. Defining this stuff to happen at end of microtask or whatever it is that normally triggers mutation observers makes a lot more sense than "before entering script". ;)

Thanks,
Boris


Reply via email to