Status: FAIL | Duration: 50ms | Subtests: 0/12 | Open test on wpt.live | wpt.fyi
Data from commit:
1884860 Copy-on-write style attribute blocks that are in the rule tree (#831) (2026-09-02)
| Subtest | Status | Message |
|---|---|---|
| Trailing declarations | FAIL | CSSStyleSheet is not defined |
| Mixed declarations | FAIL | CSSStyleSheet is not defined |
| CSSNestedDeclarations.style | FAIL | CSSStyleSheet is not defined |
| Nested group rule | FAIL | CSSStyleSheet is not defined |
| Nested @scope rule | FAIL | CSSStyleSheet is not defined |
| Inner rule starting with an ident | FAIL | CSSStyleSheet is not defined |
| Inserting a CSSNestedDeclaration rule into style rule | FAIL | CSSStyleSheet is not defined |
| Inserting a CSSNestedDeclaration rule into nested group rule | FAIL | CSSStyleSheet is not defined |
| Attempting to insert a CSSNestedDeclaration rule into top-level @media rule | FAIL | CSSStyleSheet is not defined |
| Attempting to insert a CSSNestedDeclaration rule into a stylesheet | FAIL | CSSStyleSheet is not defined |
| Attempting to insert a CSSNestedDeclaration rule, empty block | FAIL | CSSStyleSheet is not defined |
| Attempting to insert a CSSNestedDeclaration rule, all invalid declarations | FAIL | CSSStyleSheet is not defined |
/css/css-nesting/nested-declarations-cssom.html
<!DOCTYPE html> <title>CSS Nesting: CSSNestedDeclarations CSSOM</title> <link rel="help" href="https://drafts.csswg.org/css-nesting-1/#nested-declarations-rule"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script> test(() => { let s = new CSSStyleSheet(); s.replaceSync(` .a { & { --x:1; } --x:2; } `); assert_equals(s.cssRules.length, 1); let outer = s.cssRules[0]; assert_equals(outer.cssRules.length, 2); assert_equals(outer.cssRules[0].cssText, `& { --x: 1; }`); assert_equals(outer.cssRules[1].cssText, `--x: 2;`); }, 'Trailing declarations'); test(() => { let s = new CSSStyleSheet(); s.replaceSync(` .a { --a:1; --b:1; & { --c:1; } --d:1; --e:1; & { --f:1; } --g:1; --h:1; --i:1; & { --j:1; } --k:1; --l:1; } `); assert_equals(s.cssRules.length, 1); let outer = s.cssRules[0]; assert_equals(outer.cssRules.length, 6); assert_equals(outer.cssRules[0].cssText, `& { --c: 1; }`); assert_equals(outer.cssRules[1].cssText, `--d: 1; --e: 1;`); assert_equals(outer.cssRules[2].cssText, `& { --f: 1; }`); assert_equals(outer.cssRules[3].cssText, `--g: 1; --h: 1; --i: 1;`); assert_equals(outer.cssRules[4].cssText, `& { --j: 1; }`); assert_equals(outer.cssRules[5].cssText, `--k: 1; --l: 1;`); }, 'Mixed declarations'); test(() => { let s = new CSSStyleSheet(); s.replaceSync(` .a { & { --x:1; } --y:2; --z:3; } `); assert_equals(s.cssRules.length, 1); let outer = s.cssRules[0]; assert_equals(outer.cssRules.length, 2); let nested_declarations = outer.cssRules[1]; assert_true(nested_declarations instanceof CSSNestedDeclarations); assert_equals(nested_declarations.style.length, 2); assert_equals(nested_declarations.style.getPropertyValue('--x'), ''); assert_equals(nested_declarations.style.getPropertyValue('--y'), '2'); assert_equals(nested_declarations.style.getPropertyValue('--z'), '3'); }, 'CSSNestedDeclarations.style'); test(() => { let s = new CSSStyleSheet(); s.replaceSync(` .a { @media (width > 100px) { --x:1; --y:1; .b { } --z:1; } --w:1; } `); assert_equals(s.cssRules.length, 1); let outer = s.cssRules[0]; assert_equals(outer.cssRules.length, 2); // @media let media = outer.cssRules[0]; assert_equals(media.cssRules.length, 3); assert_true(media.cssRules[0] instanceof CSSNestedDeclarations); assert_equals(media.cssRules[0].cssText, `--x: 1; --y: 1;`); assert_equals(media.cssRules[1].cssText, `& .b { }`); assert_true(media.cssRules[2] instanceof CSSNestedDeclarations); assert_equals(media.cssRules[2].cssText, `--z: 1;`); assert_true(outer.cssRules[1] instanceof CSSNestedDeclarations); assert_equals(outer.cssRules[1].cssText, `--w: 1;`); }, 'Nested group rule'); test(() => { let s = new CSSStyleSheet(); s.replaceSync(` .a { @scope (.foo) { --x:1; --y:1; .b { } --z:1; } --w:1; } `); assert_equals(s.cssRules.length, 1); let outer = s.cssRules[0]; if (window.CSSScopeRule) { assert_equals(outer.cssRules.length, 2); // @scope let scope = outer.cssRules[0]; assert_true(scope instanceof CSSScopeRule); assert_equals(scope.cssRules.length, 3); assert_true(scope.cssRules[0] instanceof CSSNestedDeclarations); assert_equals(scope.cssRules[0].cssText, `--x: 1; --y: 1;`); assert_equals(scope.cssRules[1].cssText, `.b { }`); // Implicit :scope here. assert_true(scope.cssRules[2] instanceof CSSNestedDeclarations); assert_equals(scope.cssRules[2].cssText, `--z: 1;`); assert_true(outer.cssRules[1] instanceof CSSNestedDeclarations); assert_equals(outer.cssRules[1].cssText, `--w: 1;`); } else { assert_equals(outer.cssRules.length, 0); } }, 'Nested @scope rule'); test(() => { let s = new CSSStyleSheet(); s.replaceSync(` a { & { --x:1; } width: 100px; height: 200px; color:hover {} --y: 2; } `); assert_equals(s.cssRules.length, 1); let outer = s.cssRules[0]; assert_equals(outer.cssRules.length, 4); assert_equals(outer.cssRules[0].cssText, `& { --x: 1; }`); assert_equals(outer.cssRules[1].cssText, `width: 100px; height: 200px;`); assert_equals(outer.cssRules[2].cssText, `& color:hover { }`); assert_equals(outer.cssRules[3].cssText, `--y: 2;`); }, 'Inner rule starting with an ident'); test(() => { let s = new CSSStyleSheet(); s.replaceSync('.a {}'); assert_equals(s.cssRules.length, 1); let a_rule = s.cssRules[0]; assert_equals(a_rule.cssRules.length, 0); a_rule.insertRule(` width: 100px; height: 200px; `); assert_equals(a_rule.cssRules.length, 1); assert_true(a_rule.cssRules[0] instanceof CSSNestedDeclarations); assert_equals(a_rule.cssRules[0].cssText, `width: 100px; height: 200px;`); }, 'Inserting a CSSNestedDeclaration rule into style rule'); test(() => { let s = new CSSStyleSheet(); s.replaceSync('.a { @media (width > 100px) {} }'); assert_equals(s.cssRules.length, 1); assert_equals(s.cssRules[0].cssRules.length, 1); let media_rule = s.cssRules[0].cssRules[0]; assert_true(media_rule instanceof CSSMediaRule); assert_equals(media_rule.cssRules.length, 0); media_rule.insertRule(` width: 100px; height: 200px; `); assert_equals(media_rule.cssRules.length, 1); assert_true(media_rule.cssRules[0] instanceof CSSNestedDeclarations); assert_equals(media_rule.cssRules[0].cssText, `width: 100px; height: 200px;`); }, 'Inserting a CSSNestedDeclaration rule into nested group rule'); test(() => { let s = new CSSStyleSheet(); s.replaceSync('@media (width > 100px) {}'); assert_equals(s.cssRules.length, 1); let media_rule = s.cssRules[0]; assert_true(media_rule instanceof CSSMediaRule); assert_equals(media_rule.cssRules.length, 0); assert_throws_dom('SyntaxError', () => { media_rule.insertRule(` width: 100px; height: 200px; `); }); }, 'Attempting to insert a CSSNestedDeclaration rule into top-level @media rule'); test(() => { let sheet = new CSSStyleSheet(); assert_throws_dom('SyntaxError', () => { sheet.insertRule(` width: 100px; height: 200px; `); }); }, 'Attempting to insert a CSSNestedDeclaration rule into a stylesheet'); test(() => { let s = new CSSStyleSheet(); s.replaceSync('.a {}'); assert_equals(s.cssRules.length, 1); let a_rule = s.cssRules[0]; assert_equals(a_rule.cssRules.length, 0); assert_throws_dom('SyntaxError', () => { a_rule.insertRule(''); }); }, 'Attempting to insert a CSSNestedDeclaration rule, empty block'); test(() => { let s = new CSSStyleSheet(); s.replaceSync('.a {}'); assert_equals(s.cssRules.length, 1); let a_rule = s.cssRules[0]; assert_equals(a_rule.cssRules.length, 0); assert_throws_dom('SyntaxError', () => { a_rule.insertRule(` xwidth: 100px; xheight: 200px; `); }); }, 'Attempting to insert a CSSNestedDeclaration rule, all invalid declarations'); </script>