blob: dbbc1dcaff65325b261ff8985824201e6afe7914 [file] [log] [blame]
<!DOCTYPE html>
<!--
Tests for Imperative Shadow DOM Distribution API.
See https://crbug.com/869308
-->
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="resources/shadow-dom.js"></script>
<div id="test1">
<div id="host"></div>
<div id="host1"></div>
<div id="host2"></div>
</div>
<script>
test(() => {
let n = createTestTree(test1);
assert_not_equals(n.host.attachShadow({ mode: 'open', slotting: 'manual' }),
null, 'slotting manual should work');
assert_not_equals(n.host1.attachShadow({ mode: 'open', slotting: 'auto' }),
null, 'slotting auto should work');
assert_throws(new TypeError(), () => {
n.host2.attachShadow({ mode: 'open', slotting: 'exceptional' })},
'others should throw exception');
}, 'attachShadow can take slotting parameter');
</script>
<div id="test2">
<div id="host">
<template id="shadow_root" data-mode="open" data-slotting="manual">
<slot id="s1"></slot>
<slot id="s2"></slot>
<slot id="s3"></slot>
</template>
<div id="c1"></div>
<div id="c2"></div>
<div id="c3"></div>
</div>
<div id="c4"></div>
<div id="host4">
<template id="shadow_root1" data-mode="open" data-slotting="manual">
<slot id="s5" name="s5"></slot>
</template>
</div>
</div>
<script>
test(() => {
let n = createTestTree(test2);
assert_array_equals(n.s2.assignedElements(), []);
assert_equals(n.c1.assignedSlot, null);
n.s2.assign([n.c1]);
assert_array_equals(n.s2.assignedNodes(), [n.c1]);
assert_equals(n.c1.assignedSlot, n.s2);
n.s1.assign([n.c2,n.c1]);
assert_array_equals(n.s1.assignedNodes(), [n.c1,n.c2]);
assert_array_equals(n.s2.assignedNodes(), []);
assert_equals(n.c1.assignedSlot, n.s1);
assert_equals(n.c2.assignedSlot, n.s1);
n.s1.assign([n.c2]);
assert_array_equals(n.s1.assignedNodes(), [n.c2]);
assert_array_equals(n.s2.assignedNodes(), [n.c1]);
}, 'assignedNodes/Slot can be used in manual slotting');
test(() => {
let n = createTestTree(test2);
n.s1.assign([n.c4]);
assert_array_equals(n.s1.assignedNodes(), []);
n.host.appendChild(n.c4);
assert_array_equals(n.s1.assignedNodes(), [n.c4]);
}, 'Nodes should be assigned to slot only when nodes are host\'s children');
test(() => {
let n = createTestTree(test2);
n.s5.assign([n.c1]);
assert_array_equals(n.s5.assignedNodes(), []);
n.shadow_root.insertBefore(n.s5,n.s1);
assert_array_equals(n.s5.assignedNodes(), [n.c1]);
}, 'Nodes should be assigned to a slot only when the slot is in host\'s shadowtree');
test(() => {
let n = createTestTree(test2);
n.s1.assign([n.c1]);
n.s2.assign([n.c1]);
assert_array_equals(n.s2.assignedNodes(), []);
n.shadow_root.insertBefore(n.s2,n.s1);
assert_array_equals(n.s2.assignedNodes(), [n.c1]);
}, 'A node should be assigned to a slot when the slot is inserted before the assigned slot');
test(() => {
let n = createTestTree(test2);
n.s1.assign([n.c1]);
n.s2.assign([n.c1]);
n.s3.assign([n.c1]);
n.shadow_root.insertBefore(n.s2,n.s1);
n.shadow_root.insertBefore(n.s3,n.s1);
n.s2.remove();
assert_array_equals(n.s1.assignedNodes(), []);
assert_array_equals(n.s3.assignedNodes(), [n.c1]);
}, 'A slot should be assigned to a node even after the slot is inserted after the assigned slot, and the assigned slot are removed')
test(() => {
let n = createTestTree(test2);
n.s1.assign([n.c1]);
assert_array_equals(n.s1.assignedNodes(), [n.c1]);
n.shadow_root1.insertBefore(n.s1,n.s5);
assert_array_equals(n.s1.assignedNodes(), []);
n.s1.assign([]);
n.shadow_root.insertBefore(n.s1,n.s2);
assert_array_equals(n.s1.assignedNodes(), []);
}, 'A slot should not be assigned to a node once after the slot is inserted in another shadow root, and assigned another slot.')
test(() => {
let n = createTestTree(test2);
n.shadow_root.insertBefore(n.s1,n.s2);
n.s2.assign([n.c1,n.c1]);
assert_array_equals(n.s2.assignedNodes(), [n.c1]);
n.s1.assign([n.c1]);
assert_array_equals(n.s2.assignedNodes(), []);
n.shadow_root1.appendChild(n.s2);
assert_array_equals(n.s2.assignedNodes(), []);
}, 'Same nodes should be ignored');
test(() => {
let n = createTestTree(test2);
n.s1.assign([n.c3]);
n.s1.assign([n.c3]);
n.s1.remove();
assert_equals(n.c3.assignedSlot, null);
}, 'Same assignment should be ignored');
</script>
<div id="test3">
<div id="host1">
<template id="shadow_root" data-mode="open">
<slot id="s1" name="s1"></slot>
</template>
<div id="c1" slot="s1"></div>
</div>
</div>
<script>
test(() => {
let n = createTestTree(test3);
assert_array_equals(n.s1.assignedElements(), [n.c1]);
assert_equals(n.c1.assignedSlot, n.s1);
n.s1.assign([]);
assert_array_equals(n.s1.assignedElements(), [n.c1]);
assert_equals(n.c1.assignedSlot, n.s1);
}, 'Slotting API should not have any effect in auto mode');
</script>