- From: François REMY <fremycompany_pub@yahoo.fr>
- Date: Wed, 20 Jun 2012 17:36:34 +0200
- To: "Dimitri Glazkov" <dglazkov@google.com>
- Cc: <www-style@w3.org>, "Roland Steiner" <rolandsteiner@google.com>
FWIW, I noticed that the model I proposed is not working because
rule-matching implies recursive knowledge of the tree (because the ::host
pseudo-element walk the layout tree in the reverse direction). I'm proposing
here a simpler solution that doesn't have that problem, which only uses
pseudo-classes:
@global {
/*
selectors in this at-rule can target any element,
not only the elements of the current tree
*/
:root { /* the root of the document */ }
:tree-root { /* the root the current tree */ }
:host { /* the host of current shadow DOM tree */ }
:host-tree-root { /* the root of the tree containing :host */ }
/*
the '=>' and '==>' combinators works as decribed before
*/
}
This is also closer of the spirit of your current @host syntax.
-----Message d'origine-----
From: Dimitri Glazkov
Sent: Saturday, June 16, 2012 5:44 PM
To: François REMY
Cc: www-style@w3.org ; Roland Steiner
Subject: Re: CSS + Shadow DOM = <3 + more
On Sat, Jun 16, 2012 at 6:35 AM, François REMY
<fremycompany_pub@yahoo.fr> wrote:
> Just a thought: since you can have multiple nested levels of shadow trees,
> you may experience problems (with an @host at-rule) in getting the 'root'
> level (where html & body lives) or the 'n-2' level.
-- great example skipped for brevity --
> If you want to control ctlr2's input styling based on document's <body>
> classes (Modernizr...) you can't use @host as you defined it.
You're exactly right. I outlined a similar concern here:
https://www.w3.org/Bugs/Public/show_bug.cgi?id=16519#c6
However, my feeling is that this should not be solved with @host. The
purpose of @host is to provide some styling of the host element by the
shadow DOM subtree, and that's it. The patterns where a subtree reacts
to document's DOM changes are explicitly not handled.
Which reminds me -- what does the @host do when the tree is itself
assigned into a shadow insertion point? Filed
https://www.w3.org/Bugs/Public/show_bug.cgi?id=17515 to investigate.
> There are probably numerous ways to soleve this problem, here's the one I
> thought of: adding the "::host()" and "::host-root()" pseudo-elements that
> only the ":root" elements of a shadow trees have and which refers to their
> host.
>
> Some notes:
> - By 'layout tree' I mean the 'tree has rendered'.
> - I use '=>' as the "direct child in the layout tree" combinator, and
> '==>' as the "descendant in the layout tree" combinator.
>
> Examples using that proposal (content of the style tag of ctrl2's shadow
> tree):
>
> * {
> matches every node of the <ctrl2>'s shadow tree (<:root>, <input>,
> <style>)
> }
>
> ::host {
> // matches the <ctrl2> tag, in <ctrl1>'s shadow tree
> // identical to ":root::host" because <:root> is the only selectable
> element by "*" which has the "::host" pseudo-element
> }
>
> ::host:hover {
> // matches the <ctrl2> tag, if the mouse pointer is over it
> }
>
> ::host:matches(div, span) {
> // doesn't match anything, the host element is a <ctrl2> tag
> }
>
> ::host-root {
> // matches the <:root> of the <ctrl1>'s shadow tree
> // identical to ":root::host-root" because <:root> is the only
> selectable element which has the "::host" pseudo-element
> }
>
> ::host-root > div {
> // matches <div#insertionPoint> in <ctrl1>'s shadow tree
> }
>
> ::host-root > div => * {
> // matches <div#box1> because it is a direct child, in the layout
> tree, of <div#insertionPoint> (which matches the "::host-root > div"
> selector)
> }
>
> body ==> :root input {
> // matches <ctlr2>'s shadow tree's <input>, because it is a
> descendant, in the layout tree, of the <body> tag (which matches the
> "body"
> selector)
> }
>
> ::host ==> * {
> // matches the <:root>, <input> and <style> tags of <ctrl2>'s shadow
> tree, because they are descendants; in the layout tree, of the <ctrl2> tag
> (which matches ::host)
> }
>
> ::host => *::host {
> // creepy example, that also matches the <ctrl2>'s tag because
> "::host
> => *" matches the <:root> element of the <ctrl2>'s shadow tree, which as a
> "::host" pseudo-element which is <ctrl2>
> // identical to "::host => *::host => *::host" for the same reason
> }
>
> I think you can make select any element you want accross the branches of
> the
> shadow trees with those four additions to CSS. But this is just an idea,
> maybe there are other ways to achieve this which are more intuitive.
This is interesting! Filed a bug
https://www.w3.org/Bugs/Public/show_bug.cgi?id=17516 as a starting
point.
:DG<
Received on Wednesday, 20 June 2012 15:37:08 UTC