https://www.w3.org/Bugs/Public/show_bug.cgi?id=27775

            Bug ID: 27775
           Summary: [Shadow]: Define the behavior of *closed* shadow
                    trees.
           Product: WebAppsWG
           Version: unspecified
          Hardware: PC
                OS: All
            Status: NEW
          Severity: normal
          Priority: P2
         Component: Component Model
          Assignee: dglaz...@chromium.org
          Reporter: hay...@chromium.org
        QA Contact: public-webapps-bugzi...@w3.org
                CC: m...@w3.org, public-webapps@w3.org
            Blocks: 14978

The current spec uses a term of 'UA-provided shadow trees'. The spec assumes
that built-in elements, such as <video> elements, might be implemented with
shadow trees.
However, the behavior of UA-provided shadow trees isn't well defined in the
spec yet.

For example, in Blink, event.path API returns an array, however, it excludes
nodes in UA-provided shadow trees. Unfortunately, the spec doesn't mention this
behavior at all. That doesn't look good to me from the view of compatibility if
browser vendors would like to use shadow trees to implement their built-in
elements.

I am wondering whether it is worth or not to expose this *hidden* concept, UA
shadow trees, clearly in the spec, as a *closed shadow tree*, a tentative name
borrowed from the another thread, so that we can explain the behavior of
builtin elements in terms of Shadow DOM. I think this would fill one of missing
pieces for 'HTML as Custom Elements' concept.

In Blink, as some of you might know, ShadowRoot object has an enum internally,
UserAgentShadowRoot or AuthorShadowRoot. Some builtin elements, such as <video>
or <input>, use UserAgentShadowRoot in their implementation as you imagine.
Currently, the behavior of this kind of shadow trees is only explained by
Blink's C++ code.
It'd be nice that I could write down a well-defined behavior of a closed shadow
tree somewhere. That should be in the spec. I don't want other browser vendors
to do a kind of *reverse-engineering*.


The spec should mention the followings, but not limited to:

- Element.shadowRoot - If the youngest shadow tree is closed, return null. That
matches the current Blink's implementation.
- Element.getDestinationInsertionPoints - must filter out insertion points if
they are in a closed shadow tree. That matches the current Blink's
implementation. e.g. <detail><summary>
- Event.path - must filter out event targets if it is in a closed shadow tree.
(The exact condition is more complex than you imagine).
- Needs to discuss:
  Whether or not to allow calling Element.createShadowRoot() for the shadow
host which has the closed youngest shadow tree.
  If we allow it, we might have to consider the followings also:
  - InsertinonPoint.getDistributedNodes - Filter out nodes in a closed older
shadow tree. In Blink, we don't need this because there is not such UA and
author shadow trees, I think.
  - ShadowRoot.olderShadowRoot - If the older shadow tree is closed, return
null.
- The behavior of CSS selector which *crosses* shadow trees.
  '::shadow', '/deep/' - See
https://code.google.com/p/chromium/issues/detail?id=433977 also. This should be
mentioned in css-scoping spec.

What makes things complex is the case when a closed shadow tree and an open
shadow tree are mixed together within one shadow host:

e.g.
A).  ShadowHost => the oldest shadow tree (open) => older shadow tree (open) =>
youngest shadow tree (closed)
B).  ShadowHost => the oldest shadow tree (closed) => older shadow tree
(closed) => youngest shadow tree (open)

In Blink, there isn't a pattern A so far. We might need to consider this case
in the future.


Here, I'm not aiming to expose an API for creating a closed shadow tree to Web
developers.
Although this issue might resolve one of pre-requirements for that, as a
result, I don't have any idea about how we should prioritize exposing such a
API.

If we were to expose the API, the API might be:

- Element.createShadowRoot take an optional dictionary, such as ({'mode':
'closed'}).

I don't care which the *default* should be, `closed` or `open`. That sounds
non-essential to me. That's a domain of API. For compatibility, the default
should be 'open', I think.
Please use bug 20144 for this kind of topic.

-- 
You are receiving this mail because:
You are on the CC list for the bug.

Reply via email to