Support slot element's fallback content feature
The spec discussion is:
- https://github.com/w3c/webcomponents/issues/317
The relevant algorithm sections in the Shadow DOM spec are:
- Distributed nodes algorithm: http://w3c.github.io/webcomponents/spec/shadow/#distributed-nodes-algorithm
- Composition algorithm: http://w3c.github.io/webcomponents/spec/shadow/#composition-algorithm
Now, if a slot does not have any assigned node, its child nodes are used as fallback contents.
This fallback ability will *chain* recursively. That means we can use *another* slot as a slot's fallback contents.
That gives us a great flexibility to compose a composed tree.
e.g.
Suppose we have the following tree of trees, which is borrowed from `v1-slots-fallback2.thml` test:
<div id='host'>
<template data-mode='open'>
<slot name='slot1'>
<div id='fallback1'></div>
<slot name='slot2'>
<div id='fallback2'></div>
</slot>
</slot>
<slot name='slot3'>
<slot name='slot4'>
<div id='fallback3'></div>
</slot>
</slot>
</template>
<div id='child1' slot='slot2'></div>
</div>
This can be composed into the following composed tree:
<div id='host'>
<div id='fallback1'></div>
<div id='child1'></div>
<div id='fallback3'></div>
</div>
The following feature is not yet supported:
- A slot API, HTMLSlotElement::getDistributedNodes does not work in a document tree nor v0 shadow tree
I'll support this as separate patches. This requires non-trivial changes to the distribution code.
Review URL: https://codereview.chromium.org/1530643003
Cr-Commit-Position: refs/heads/master@{#367789}
22 files changed