- From: Boris Zbarsky <bzbarsky@mit.edu>
- Date: Tue, 13 Jan 2015 00:04:50 -0500
- To: public-webapps@w3.org
On 1/11/15 3:13 PM, Domenic Denicola wrote: > So, at least as a thought experiment: what if we got rid of all the local name checks in implementations and the spec. I think then `<my-q>` could work, as long as it was done *after* `document.registerElement` calls. Yes. > However, I don't understand how to make it work for upgraded elements at all, i.e., in the case where `<my-q>` is parsed, and then later `document.registerElement("my-q", MyQ)` happens. You'd have to somehow graft the internal slots onto all MyQ instances after the fact Yep. It's no fun. > Is there any way around this you could imagine? Not without making the set of internal slots mutable. Note that in some implementations (e.g. a self-hosted implementation using WeakMaps for internal slots) this might not be so difficult. But in general it does constrain implementation strategies quite significantly. > I know how seriously you were considering my suggestion to rewrite them all ;) I've pretty seriously considered it on and off.... > The story is still pretty unsatisfactory, however. Consider the case where your document consists of `<my-el></my-el>`, and then later you do `class MyEl extends HTMLElement {}; document.registerElement("my-el", MyEl)`. (Note how I don't save the return value of document.registerElement.) When the parser encountered `<my-el>`, it called `new HTMLUnknownElement(...)`, allocating a HTMLUnknownElement. The current design says to `__proto__`-munge the element after the fact, i.e. `document.body.firstChild.__proto__ = MyEl.prototype`. But it never calls the `MyEl` constructor! Yeah, I'm not a fan of this part either. > - It means that the code `class MyEl extends HTMLElement {}` is largely a lie. I think this part of the spec was largely written before ES6 class stuff stabilized, fwiw. Which is not hard, since it's still not stabilized. ;) > - It means that what you get when doing `new MyEl()` is different from what you got when parsing-then-upgrading `<my-el></my-el>`. This seems pretty undesirable. > (The same problems apply with <q is="qq">, by the way. It needs to be upgraded from HTMLQuoteElement to QQ, but we can only `__proto__`-munge, not call the constructor.) Hmm. So given the current direction whereby ES6 constructors may not even be [[Call]]-able at all, I'm not sure we have any great options here. :( Basically, ES6 is moving toward coupling allocation and initialization but the upgrade scenario can't really be expressed by coupled alloc+init if it preserves object identity, right? > I was hopeful that ES6 would give us a way out of this, but after thinking things through, I don't see any improvement at all. In particular it seems you're always going to have to have `var C2 = document.registerElement("my-el", C1)` giving `C2 !== C1`. This part is not immediately obvious to me. Why does that have to be true? -Boris
Received on Tuesday, 13 January 2015 05:05:22 UTC