position-try-tree-scoped.html (4821B)
1 <!DOCTYPE html> 2 <title>CSS Anchor Positioning Test: @position-try - tree scoped names</title> 3 <link rel="help" href="https://drafts.csswg.org/css-anchor-1/#fallback-rule"> 4 <link rel="help" href="https://drafts.csswg.org/css-scoping/#shadow-names"> 5 <script src="/resources/testharness.js"></script> 6 <script src="/resources/testharnessreport.js"></script> 7 8 <style> 9 body { margin: 0; } 10 11 @position-try --doc { 12 left: 100px; 13 } 14 15 .abs { 16 width: 100px; 17 position: absolute; 18 left: 999999px; /* force fallback */ 19 } 20 21 #doc_pf_doc { position-try-fallbacks: --doc; } 22 #doc_pf_outer { position-try-fallbacks: --outer; } 23 #doc_pf_inner { position-try-fallbacks: --inner; } 24 </style> 25 26 <div id="doc_pf_doc" class="abs"></div> 27 <div id="doc_pf_outer" class="abs"></div> 28 <div id="doc_pf_inner" class="abs"></div> 29 <div id="outer_host"> 30 <template shadowrootmode="open"> 31 <style> 32 @position-try --outer { 33 left: 200px; 34 } 35 36 .abs { 37 position: absolute; 38 left: 999999px; /* force fallback */ 39 } 40 41 #outer_pf_doc { position-try-fallbacks: --doc; } 42 #outer_pf_outer { position-try-fallbacks: --outer; } 43 #outer_pf_inner { position-try-fallbacks: --inner; } 44 </style> 45 <div id="outer_pf_doc" class="abs"></div> 46 <div id="outer_pf_outer" class="abs"></div> 47 <div id="outer_pf_inner" class="abs"></div> 48 <div id="inner_host"> 49 <template shadowrootmode="open"> 50 <style> 51 @position-try --inner { 52 left: 300px; 53 } 54 55 .abs { 56 position: absolute; 57 left: 999999px; /* force fallback */ 58 } 59 60 #inner_pf_doc { position-try-fallbacks: --doc; } 61 #inner_pf_outer { position-try-fallbacks: --outer; } 62 #inner_pf_inner { position-try-fallbacks: --inner; } 63 </style> 64 <div id="inner_pf_doc" class="abs"></div> 65 <div id="inner_pf_outer" class="abs"></div> 66 <div id="inner_pf_inner" class="abs"></div> 67 </template> 68 </div> 69 </template> 70 </div> 71 72 73 <style> 74 #host_slotted_part { 75 width: 100px; 76 } 77 @position-try --host-slot-part { 78 left: 1px; 79 } 80 #host_slotted_part::part(part) { 81 position-try-fallbacks: --host-slot-part; 82 } 83 </style> 84 <div id="host_slotted_part"> 85 <template shadowrootmode="open"> 86 <style> 87 @position-try --host-slot-part { 88 left: 2px; 89 } 90 ::slotted(#slotted), :host { 91 position: absolute; 92 left: 999999px; /* force fallback */ 93 position-try-fallbacks: --host-slot-part; 94 } 95 #part { 96 position: absolute; 97 left: 999999px; /* force fallback */ 98 } 99 </style> 100 <div id="part" part="part"></div> 101 <slot></slot> 102 </template> 103 <div id="slotted"></div> 104 </div> 105 106 107 <script> 108 test(() => { 109 assert_equals(doc_pf_doc.offsetLeft, 100); 110 }, "Document position-try-fallbacks matches @position-try in document scope"); 111 112 test(() => { 113 assert_equals(doc_pf_outer.offsetLeft, 999999); 114 }, "Document position-try-fallbacks does not match @position-try in #outer_host scope"); 115 116 test(() => { 117 assert_equals(doc_pf_inner.offsetLeft, 999999); 118 }, "Document position-try-fallbacks does not match @position-try in #inner_host scope"); 119 120 const outer_root = outer_host.shadowRoot; 121 const inner_root = outer_root.querySelector("#inner_host").shadowRoot; 122 123 test(() => { 124 assert_equals(outer_root.querySelector("#outer_pf_doc").offsetLeft, 100); 125 }, "Outer position-try-fallbacks matches @position-try in document scope"); 126 127 test(() => { 128 assert_equals(outer_root.querySelector("#outer_pf_outer").offsetLeft, 200); 129 }, "Outer position-try-fallbacks matches @position-try in #outer_host scope"); 130 131 test(() => { 132 assert_equals(outer_root.querySelector("#outer_pf_inner").offsetLeft, 999999); 133 }, "Outer position-try-fallbacks does not match @position-try in #inner_host scope"); 134 135 test(() => { 136 assert_equals(inner_root.querySelector("#inner_pf_doc").offsetLeft, 100) 137 }, "Inner position-try-fallbacks matches @position-try in document scope"); 138 139 test(() => { 140 assert_equals(inner_root.querySelector("#inner_pf_outer").offsetLeft, 200); 141 }, "Inner position-try-fallbacks matches @position-try in #outer_host scope"); 142 143 test(() => { 144 assert_equals(inner_root.querySelector("#inner_pf_inner").offsetLeft, 300); 145 }, "Inner position-try-fallbacks matches @position-try in #inner_host scope"); 146 147 test(() => { 148 assert_equals(host_slotted_part.offsetLeft, 2); 149 }, "@position-try from same scope as :host rule"); 150 151 test(() => { 152 assert_equals(slotted.offsetLeft, 2); 153 }, "@position-try from same scope as ::slotted() rule"); 154 155 test(() => { 156 assert_equals(host_slotted_part.shadowRoot.querySelector("#part").offsetLeft, 1); 157 }, "@position-try from same scope as ::part() rule"); 158 </script>