- From: Ryosuke Niwa <rniwa@apple.com>
- Date: Mon, 12 Jan 2015 14:14:16 -0800
- To: "Tab Atkins Jr." <jackalmage@gmail.com>
- Cc: Anne van Kesteren <annevk@annevk.nl>, "www-style@w3.org" <www-style@w3.org>, WebApps WG <public-webapps@w3.org>
> On Jan 12, 2015, at 1:28 PM, Tab Atkins Jr. <jackalmage@gmail.com> wrote: > > On Fri, Jan 9, 2015 at 5:40 AM, Anne van Kesteren <annevk@annevk.nl> wrote: >> I'm wondering if it's feasible to provide developers with the >> primitive that the combination of Shadow DOM and CSS Scoping provides. >> Namely a way to isolate a subtree from selector matching (of document >> stylesheets, not necessarily user and user agent stylesheets) and >> requiring a special selector, such as >>>, to pierce through the >> boundary. >> >> This is a bit different from the `all` property as that just changes >> the values of all properties, it does not make a selector such as >> "div" no longer match. >> >> So to be clear, the idea is that if you have a tree such as >> >> <section class=example> >> <h1>Example</h1> >> <div> ... </div> >> </section> >> >> Then a simple div selector would not match the innermost div if we >> isolated the section. Instead you would have to use section >>> div or >> some such. Or perhaps associate a set of selectors and style >> declarations with that subtree in some manner. > > It's probably feasible, sure. But I'm not sure that it's necessary, > or that browsers will go for it. Using a shadow root as the isolation > boundary is *really convenient*, because it's a separate tree > entirely; the fact that outside rules don't apply within it, and > inside rules don't apply outside, falls out for free. > > Let's assume we did it, though. We'd have to have some mechanism for > defining an isolation boundary, and denoting whether rules were > "inside" or "outside" the boundary. This sounds like an at-rule, > like: > > @isolate .example { > h1 { ... } > div { ... } > } > > Now, a problem here is that you have a conflict between nesting > isolated things and specifying isolation. Say you have <foo> and > <bar> elements, both of which need to be isolated. You'd think you > could just write: > > @isolate foo { > ... > } > @isolate bar { > ... > } > > But this won't work! If you have markup like > <foo><bar>...</bar></foo>, the <bar> there is inside the <foo>'s > isolation boundary, so the @isolate rule can't find it. You'd need to > *also* nest the "@isolate bar" rule (and all its styling rules) within > the foo one, and vice versa. The effect of this on *three* mutually > isolated components is, obviously, terrible; let's not even mention > trying to use multiple modules together that weren't explicitly > designed together. > > Alternately, say that it does work - the @isolate selector pierces > through isolation boundaries. Then you're still screwed, because if > the outer page wants to isolate .example blocks, but within your > component you use .example normally, without any isolation, whoops! > Suddenly your .example blocks are isolated, too, and getting weird > styles applied to them, while your own styles break since they can't > cross the unexpected boundary. Another alternative. We can add a host language dependent mechanism such as an element or an attribute to "end" the current isolation, just like insertion points in a shadow DOM would. Better yet, we can provide this mechanism in CSS. e.g. @isolate foo integrates(bar) { ... } @isolate bar { ... } (I'm not proposing this exact syntax. We can certainly do better.) > Let's check out JS. If you can mark some elements as always being > styling boundaries, then whenever they're constructed, whether > manually or via the parser, they'll get the right mechanics > automatically. And since this is JS, it shouldn't be too hard to say > "always attach this stylesheet to the element whenever it gets > created", or perhaps introduce some explicit ability to do this in the > platform. There is a huge benefit in providing declarative alternative. There are many use cases in which style/selector isolations are desirable on an existing element such as section and article elements. > This last one, though, is pretty much exactly Custom Elements, just > with the children staying in the light tree rather than being moved > into a shadow tree. But keeping them in the light tree has > complications; it means that everything in the platform needs to be > made aware of the isolation boundary. Should qSA respect the > isolation boundaries or not? Depends on what you're using it for. > What about things that aren't CSS at all, like getElementsByTagName()? > That's equivalent to a qSA with the same argument, but it's not a > "selector", per se. Manual tree-walking would also need to be made > aware of this, or else you might accidentally descend into something > that wants isolation. Shadow DOM at least gives an answer to all of > these, by putting the elements in a separate tree. You don't need to > think of every one individually, or deal with inconsistent design when > someone forgets to spec their new tree-searching thing to respect the > boundary. Let's not conflate style isolation with isolation of DOM subtrees. They're two distinct features. Even though I do agree it might be desirable to have both in many important use cases, there are use cases in which we don't need subtree isolations. - R. Niwa
Received on Monday, 12 January 2015 22:15:10 UTC