Instead of shadowRoot(), we should implement youngestShadowRoot() and oldestShadowRoot(). youngestShadowRoot() will be used in renderer, and oldestShadowRoot() will be used in elements.
I think shadow roots should be a doubly linked list. new ShadowRoot() pushes on the front of the list. Tree flattening iterator uses the back pointer to get from the last child of a SR to the next sibling of the <shadow> element that output it. Do we need oldestShadowRoot? Could callers just walk the list of roots themselves. I feel like this is builtInShadowRoot with a different name.
(In reply to comment #1) > I think shadow roots should be a doubly linked list. new ShadowRoot() pushes on the front of the list. Tree flattening iterator uses the back pointer to get from the last child of a SR to the next sibling of the <shadow> element that output it. > > Do we need oldestShadowRoot? Could callers just walk the list of roots themselves. I feel like this is builtInShadowRoot with a different name. Yeah, it's almost the same as builtinShadowRoot(). I and morrita discussed it. We concluded that it would be better to have it instead of having a reference for now, because it's too error-prone. Of course we can remove oldestShadowRoot later...
Since we will introduce ShadowRootList in Bug 78069, I make this INVALID.