test_selectormatcheselement_scope.html (5033B)
1 <!DOCTYPE HTML> 2 <!-- 3 https://bugzilla.mozilla.org/show_bug.cgi?id=1934914a 4 --> 5 <title>Test for CSSStyleRule::selectorMatchesElement with @scope</title> 6 <script src="/tests/SimpleTest/SimpleTest.js"></script> 7 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> 8 <script> 9 const InspectorUtils = SpecialPowers.InspectorUtils; 10 </script> 11 12 <main id=main></main> 13 <template id=test_scope_explicit_nesting_outside> 14 <style> 15 .a { 16 .b { 17 @scope (.c) to (& .foo) { 18 .d { 19 .e { 20 @scope (.f) to (:scope .bar) { 21 .g { 22 .h { 23 color: red; 24 } 25 } 26 } 27 } 28 } 29 } 30 } 31 } 32 </style> 33 <div class=a> 34 <div class=b> 35 <div class=c> 36 <div class=d> 37 <div class=e> 38 <div class=f> 39 <div class=g> 40 <div id=scoped class=h></div> 41 </div> 42 </div> 43 </div> 44 </div> 45 </div> 46 </div> 47 </div> 48 </template> 49 <script> 50 add_task(async () => { 51 SimpleTest.registerCurrentTaskCleanupFunction(async () => main.replaceChildren()); 52 main.append(test_scope_explicit_nesting_outside.content.cloneNode(true)); 53 54 const scopedElementRules = InspectorUtils.getMatchingCSSRules(scoped); 55 const scopedRule = scopedElementRules[2]; 56 is(scopedRule.selectorText, `& .h`, "Got expected nested rule"); 57 is( 58 scopedRule.selectorMatchesElement(0, scoped), 59 true, 60 ":scope selector matches the root scoped element" 61 ); 62 }); 63 </script> 64 65 <template id=test_scope_explicit_scope_outside> 66 <style> 67 @scope(.a) { 68 .b { 69 .c { 70 @scope(.d) { 71 .e { 72 .f { 73 @scope(.g) { 74 .h { 75 .i { 76 color: red; 77 } 78 } 79 } 80 } 81 } 82 } 83 } 84 } 85 } 86 </style> 87 <div class=a> 88 <div class=b> 89 <div class=c> 90 <div class=d> 91 <div class=e> 92 <div class=f> 93 <div class=g> 94 <div class=h> 95 <div id=scoped class=i></div> 96 </div> 97 </div> 98 </div> 99 </div> 100 </div> 101 </div> 102 </div> 103 </div> 104 </template> 105 <script> 106 add_task(async () => { 107 SimpleTest.registerCurrentTaskCleanupFunction(async () => main.replaceChildren()); 108 main.append(test_scope_explicit_scope_outside.content.cloneNode(true)); 109 110 const scopedElementRules = InspectorUtils.getMatchingCSSRules(scoped); 111 const scopedRule = scopedElementRules[2]; 112 is(scopedRule.selectorText, `& .i`, "Got expected nested rule"); 113 is( 114 scopedRule.selectorMatchesElement(0, scoped), 115 true, 116 ":scope selector matches the root scoped element" 117 ); 118 }); 119 </script> 120 121 <template id=test_scope_implicit> 122 <div id=scoped> 123 <style> 124 @scope { 125 :scope { 126 color: red; 127 } 128 } 129 </style> 130 </div> 131 </template> 132 <script> 133 add_task(async () => { 134 SimpleTest.registerCurrentTaskCleanupFunction(async () => main.replaceChildren()); 135 main.append(test_scope_implicit.content.cloneNode(true)); 136 137 const scopedElementRules = InspectorUtils.getMatchingCSSRules(scoped); 138 const scopedRule = scopedElementRules[2]; 139 is(scopedRule.selectorText, `:scope`, "Got expected nested rule"); 140 is( 141 scopedRule.selectorMatchesElement(0, scoped), 142 true, 143 ":scope selector matches the root scoped element" 144 ); 145 }); 146 </script> 147 148 <template id=test_scope_implicit_shadow> 149 <div id=host1></div> 150 <div id=host2></div> 151 <template id=shadow_template> 152 <style> 153 @scope { 154 :scope { 155 background: red; 156 } 157 div { 158 background: blue; 159 } 160 } 161 </style> 162 <div id=scoped></div> 163 </template> 164 </template> 165 <script> 166 add_task(async () => { 167 SimpleTest.registerCurrentTaskCleanupFunction(async () => main.replaceChildren()); 168 main.append(test_scope_implicit_shadow.content.cloneNode(true)); 169 170 const hosts = [host1, host2]; 171 for (const host of hosts) { 172 const shadowRoot = host.attachShadow({ mode: "open" }); 173 shadowRoot.append(shadow_template.content.cloneNode(true)); 174 } 175 176 for (const host of hosts) { 177 const hostElementRules = InspectorUtils.getMatchingCSSRules(host); 178 const hostScopedRule = hostElementRules[2]; 179 is(hostScopedRule.selectorText, `:scope`, "Got expected nested rule"); 180 is( 181 hostScopedRule.selectorMatchesElement(0, host), 182 true, 183 ":scope selector matches the root scoped host element" 184 ); 185 const scoped = host.shadowRoot.getElementById("scoped"); 186 const scopedElementRules = InspectorUtils.getMatchingCSSRules(scoped); 187 const scopedRule = scopedElementRules[2]; 188 is(scopedRule.selectorText, `div`, "Got expected nested rule"); 189 is( 190 scopedRule.selectorMatchesElement(0, scoped), 191 true, 192 ":scope selector matches the root scoped element" 193 ); 194 } 195 }); 196 </script>