RE: Custom elements "Constructor-Dmitry" baseline proposal

From: Maciej Stachowiak [mailto:mjs@apple.com]


> On Aug 17, 2015, at 3:19 PM, Domenic Denicola <d@domenic.me> wrote:
>
> > - Parser-created custom elements and upgraded custom elements will
> have their constructor and attributeChange callbacks called at a time when all
> their children and attributes are already present, but
> 
> Did you change that relative to the spec? Previously, parser-created custom
> elements would have their constructor called at a time when an
> unpredictable number of their children were present.

You're right that I didn't get this quite spelled out. Fortunately, given your below suggestion, I would have had to rewrite it anyway :).

> > - Elements created via new XCustomElement() or
> document.createElement("x-custom-element") will have their constructor
> run at a time when no children or attributes are present.
> 
> If you really got it down to two states, I like reducing the number of word
> states, but I would prefer to put parser-created custom elements in this
> second bucket. They should have their constructor called while they have no
> children and attributes, instead of when they have all of them.

This seems reasonable and doable. Here's my try at making it work:

- Diff from previous revision: https://github.com/w3c/webcomponents/pull/297/files?short_path=876522d#diff-876522df93719f9da9871064880af5d2

- All together: https://github.com/domenic/webcomponents/blob/constructor-dmitry-revisions/proposals/Constructor-Dmitry.md


> If any of this happens, an upgradeable element will be stuck in the pre-
> upgrade state for a possibly unboundedly long amount of time.

This seems totally fine to me though. You're basically saying that you don't upgrade elements that are left often. Not a big deal. You have to actually have a full `<x-custom-foo>...</x-custom-foo>` before you get a proper custom element. Just `<x-custom-foo>...` alone does not cut it.

> Against this, we have the proposal to forcibly put elements in a naked state
> before calling the constructor for upgrade, then restore them. That has the
> known bad property of forcing iframe children to reload. I owe the group
> thoughts on whether we can avoid that problem.
>
> ...
>
> I will read the document more closely soon, to see if it seems like a
> reasonable baseline. I agree it would be fine to start with something good
> that uses the constructor and has two possible stats for constructor
> invocation, then see if we can get it down to one.

Awesome! And yeah, the intent of this was exactly to provide such a baseline, and see if we could come up with a good solution for reducing the two states down to one using trickery such as that you mention. As a summary, after the above changes we have these two states:

- Upgraded custom elements, or elements created via other algorithms that are constructing a larger tree (such as cloneNode), will have their constructor and attributeChange callbacks called at a time when all their children and attributes are already present.
- Elements created via new XCustomElement() or document.createElement("x-custom-element") or via the parser will have their constructor run at a time when no children or attributes are present.

Note that we could move "elements created via other algorithms that are constructing a larger tree" into the latter bucket too, at the cost of synchronous script execution during all such algorithms. But the UA appetite for that was... mixed, and I don't think we should do so. It seems fine to leave their fate the same as upgrades, whichever way it shakes out.

Received on Friday, 21 August 2015 16:29:38 UTC