- From: Andrew Fedoniouk <news@terrainformatica.com>
- Date: Thu, 9 Jan 2014 23:54:23 -0800
- To: Boris Zbarsky <bzbarsky@mit.edu>
- Cc: Ryosuke Niwa <rniwa@apple.com>, Erik Arvidsson <arv@chromium.org>, WebApps WG <public-webapps@w3.org>, Jonas Sicking <jonas@sicking.cc>, "Edward O'Connor" <eoconnor@apple.com>, William Chen <wchen@mozilla.com>
On Thu, Jan 9, 2014 at 9:27 PM, Boris Zbarsky <bzbarsky@mit.edu> wrote:
> On 1/9/14 10:57 PM, Ryosuke Niwa wrote:
>>>
>>> Given that, we could maybe cheat and in fact do some sort of delayed
>>> calling of the constructor of ES6 subclasses of elements. You'd still be
>>> able to observe these objects in an "unconstructed" state from the subclass
>>> pov, but at least it wouldn't be a security issue in terms of operating on a
>>> DOM that's in an inconsistent state from the point of view of privileged
>>> code.
>>
>>
>> Calling constructors after the tree had been constructed will be an issue
>> because then you could access “unconstructed” nodes via nextSibling,
>> parentNode, etc...
>
>
> Right, I did say that above. Is that really a problem in practice, though?
>
>> One idea that came out of our discussion is was to add an additional step
>> in the parser to call constructors on all “pending” elements before they’re
>> being constructed into the DOM tree.
>
>
> Isn't that the bad thing we _don't_ want to do? That is, invoke arbitrary
> page JS from the middle of the parsing algorithm?
>
>> On the other hand, solving this seems to require running some author
>> scripts at the element creation time, at some later time but before the node
>> is inserted into the document.
>
>
> The parser is expected to insert the nodes into the document pretty much
> immediately after creating them, no?
>
> -Boris
>
Calling of constructors (in JS/ES sense) instead of callbacks is not
semantically correct I would say.
Consider this declaration:
class MyElement inherits HTMLElement {
public prop = 1;
constructor( text ) {
super("my-element");
this.textContent = text;
}
}
UA simply cannot call such constructor as it requires parameter.
UA can call only implicit default constructor, : ({ prop:1
}).__proto__ = MyElement; in this case.
And call some designated method of the class ('callback' in this
discussion) when element gets
attached to the DOM tree.
Constructors are used for 'external' element creation:
var myel = new MyElement("woo-hoo!");
About "callbacks":
It should be two callbacks actually:
attached() - called when element *gets attached to the DOM*, it is not
a constructor, sic!
detached() - when it gets detached from the DOM.
so here:
var myel = new MyElement("woo-hoo!");
someParent.append(myel);
call of myel.attached() will happen inside the append() above.
detached() is called when parent.removeChild() for the element is called.
Just in case: this is how it is implemented and works in my Sciter [1]
and I didn't find any problems with element/script life cycles.
And yet. I also have dynamic element class assignment
by CSS with custom 'prototype' property, e.g.:
input[type="masked"] { prototype: MaskedInput url(code/widgets.tis); }
In that case attached/detached are also called when the element
gets/looses that style. But that's probably another story.
[1] http://terrainformatica.com/sciter
--
Andrew Fedoniouk.
http://terrainformatica.com
Received on Friday, 10 January 2014 07:54:51 UTC