On Thu, Mar 26, 2015 at 11:36 AM, Travis Leithead <
travis.leithead@microsoft.com> wrote:
> > From: Justin Fagnani [mailto:justinfagnani@google.com]
> >> Elements expose this “shadow node list” via APIs that are very similar
> to
> >> existing node list management, e.g., appendShadowChild(),
> insertShadowBefore(),
> >> removeShadowChild(), replaceShadowChild(), shadowChildren[],
> shadowChildNodes[].
> >
> >This part seems like a big step back to me. Shadow roots being actual
> nodes means
> >that existing code and knowledge work against them.
>
> "existing code and knowledge work against them" -- I'm not sure you
> understood correctly.
> Nodes in the "shadow child list" wouldn't show up in the childNodes list,
> nor in any of the
> node traversal APIs (e.g., not visible to qSA, nextSibling,
> previousSibling, children, childNodes,
> ect.
>
> Trivially speaking, if you wanted to hide two divs that implement a "stack
> panel" and have some
> element render it, you'd just do:
> element.appendShadowChild(document.createElement('div'))
> element.appendShadowChild(document.createElement('div'))
>
> Those divs would not be discoverable by any traditional DOM APIs (they
> would now be on the
> "shadow side"), and the only way to see/use them would be to use the new
> element.shadowChildren
> collection.
>
> But perhaps I'm misunderstanding your point.
>
> >The API surface that you'd have to duplicate with shadow*() methods would
> be quite large.
>
> That's true. Actually, I think the list above is probably about it.
>
>
So if I want to query down into those children I need to do
element.shadowFirstChild.querySelectorAll or
shadowFirstChild.getElementById? That requires looking at all siblings in
the shadowChildList, so I suppose you'd want shadowQuerySelector,
shadowGetElementById, etc? You also need to duplicate elementFromPoint
(FromRect, etc.) down to Element/Text or add special shadow* versions since
right now they only exist on Document and ShadowRoot.
I have to admit I have an allergic reaction to having an element like <div
id="foo"> and then doing element.parentNode.querySelector("#foo") != div.
Another fundamental requirement of Shadow DOM is that you never
accidentally "fall out" or "fall into" a shadow and must always take an
explicit step to get there. Having shadow node's parentNode be the host
breaks that.
We could make the parentNode be null like ShadowRoot of today, but you're
still stuck adding API duplication or writing code to iterate the
shadowChildren list.
- E