| <!DOCTYPE html><!-- webkit-test-runner [ experimental:CSSCustomPropertiesAndValuesEnabled=true ] --> |
| <script src="../resources/testharness.js"></script> |
| <script src="../resources/testharnessreport.js"></script> |
| |
| <style> |
| #parent1 { |
| width: 500px; |
| background: blue; |
| --my-custom-prop: 100px; |
| } |
| #child1 { |
| background: green; |
| width: var(--my-custom-prop); |
| } |
| |
| #parent2 { |
| width: 500px; |
| background: blue; |
| --my-custom-prop2: 100px; |
| } |
| #child2 { |
| background: green; |
| width: var(--my-custom-prop2); |
| } |
| |
| #parent3 { |
| width: 500px; |
| background: blue; |
| --my-custom-prop3: 100px; |
| } |
| #child3 { |
| background: green; |
| width: var(--my-custom-prop3); |
| } |
| |
| #parent4 { |
| width: 500px; |
| background: blue; |
| --my-custom-prop: 100px; |
| } |
| #child4 { |
| background: green; |
| --my-custom-prop: initial; |
| width: var(--my-custom-prop, 300px); |
| } |
| |
| #parent5 { |
| width: 500px; |
| background: blue; |
| --my-custom-prop: 100px; |
| } |
| #child5 { |
| background: green; |
| --my-custom-prop: unset; |
| width: var(--my-custom-prop, 300px); |
| } |
| |
| #parent6 { |
| width: 500px; |
| background: blue; |
| --my-custom-prop2: 100px; |
| } |
| #child6 { |
| background: green; |
| --my-custom-prop2: unset; |
| width: var(--my-custom-prop2, 300px); |
| } |
| |
| #parent7 { |
| width: 500px; |
| background: blue; |
| --my-custom-prop: 100px; |
| } |
| #child7 { |
| background: green; |
| --my-custom-prop: var(--my-custom-prop2); |
| --my-custom-prop2: var(--my-custom-prop); |
| width: var(--my-custom-prop2, 300px); |
| } |
| |
| #parent8 { |
| width: 500px; |
| background: blue; |
| } |
| #child8 { |
| background: green; |
| --my-custom-prop: 400px; |
| --my-custom-prop2: var(--my-custom-prop); |
| --my-custom-prop: var(--my-custom-prop2); |
| width: var(--my-custom-prop, 300px); |
| } |
| |
| #parent9 { |
| width: 500px; |
| background: blue; |
| --my-custom-prop: 100px; |
| } |
| #child9 { |
| background: green; |
| --my-custom-prop: var(--my-custom-prop2, 400px); |
| --my-custom-prop2: var(--my-custom-prop); |
| width: var(--my-custom-prop2, 300px); |
| } |
| |
| #parent10 { |
| width: 500px; |
| background: blue; |
| --my-custom-prop: 100px; |
| } |
| #child10 { |
| background: green; |
| --my-custom-prop2: calc(var(--my-custom-prop) + 10px); |
| width: var(--my-custom-prop2, 300px); |
| } |
| |
| #parent11 { |
| width: 500px; |
| background: blue; |
| --my-custom-prop-unreg2: 100px; |
| } |
| #child11 { |
| background: green; |
| --my-custom-prop-unreg: var(--my-custom-prop2-unreg); |
| --my-custom-prop2-unreg: var(--my-custom-prop-unreg); |
| width: var(--my-custom-prop2-unreg, 300px); |
| } |
| |
| #parent12 { |
| width: 500px; |
| background: blue; |
| --my-custom-prop: 100px; |
| } |
| #child12 { |
| background: green; |
| --my-custom-prop: 190px; |
| width: calc(var(--my-custom-prop, 300px) + 5px); |
| } |
| #childchild12 { |
| background: purple; |
| --my-custom-prop: revert; |
| width: var(--my-custom-prop, 300px); |
| } |
| |
| #parent13 { |
| width: 500px; |
| background: blue; |
| --my-custom-prop2: 100px; |
| } |
| #child13 { |
| background: green; |
| --my-custom-prop2: 190px; |
| width: var(--my-custom-prop2, 300px); |
| } |
| #childchild13 { |
| background: purple; |
| --my-custom-prop2: revert; |
| width: var(--my-custom-prop2, 300px); |
| } |
| |
| #parent14 { |
| width: 500px; |
| background: blue; |
| --my-custom-prop-unreg: 100px; |
| } |
| #child14 { |
| background: green; |
| --my-custom-prop-unreg: 190px; |
| width: calc(var(--my-custom-prop-unreg, 300px) + 5px); |
| } |
| #childchild14 { |
| background: purple; |
| --my-custom-prop-unreg: revert; |
| width: var(--my-custom-prop-unreg, 300px); |
| } |
| |
| #parent14-1 { |
| width: 500px; |
| background: blue; |
| --my-custom-prop-unreg: 100px; |
| } |
| #child14-1 { |
| background: green; |
| --my-custom-prop-unreg: 190px; |
| width: calc(var(--my-custom-prop-unreg, 300px) + 5px); |
| } |
| #childchild14-1 { |
| background: purple; |
| --my-custom-prop-unreg: inherit; |
| width: var(--my-custom-prop-unreg, 300px); |
| } |
| |
| #parent15 { |
| width: 500px; |
| background: blue; |
| font-size: 16px; |
| --my-custom-prop: calc(1em + 10px); |
| word-spacing: var(--my-custom-prop); |
| } |
| #child15 { |
| font-size: 32px; |
| } |
| |
| #parent16 { |
| width: 500px; |
| background: blue; |
| font-size: 16px; |
| --my-custom-prop-unreg: calc(1em + 10px); |
| word-spacing: var(--my-custom-prop-unreg); |
| } |
| #child16 { |
| font-size: 32px; |
| } |
| |
| #parent17 { |
| width: 500px; |
| background: blue; |
| --my-custom-prop2: 100px; |
| } |
| #child17 { |
| background: green; |
| width: var(--my-custom-prop2); |
| } |
| |
| #parent18 { |
| width: 500px; |
| background: blue; |
| --my-custom-prop-no-initial-value: 100px; |
| } |
| #child18 { |
| background: green; |
| width: var(--my-custom-prop-no-initial-value); |
| } |
| |
| #parent19 { |
| width: 500px; |
| background: blue; |
| --my-custom-prop-unreg: 100px; |
| } |
| #child19 { |
| background: green; |
| --my-custom-prop-unreg: inherit; |
| width: var(--my-custom-prop-unreg); |
| } |
| </style> |
| <div> |
| <p> Specified in parent, inherits=true</p> |
| <div id="parent1"><div id="child1"><p>test</p></div> </div> |
| <p> Specified in parent, inherits=false </p> |
| <div id="parent2"><div id="child2"><p>test</p></div> </div> |
| <p> Specified in parent, not registered </p> |
| <div id="parent3"><div id="child3"><p>test</p></div> </div> |
| <p> Initial </p> |
| <div id="parent4"><div id="child4"><p>test</p></div> </div> |
| <p> Unset, inherits=true </p> |
| <div id="parent5"><div id="child5"><p>test</p></div> </div> |
| <p> Unset, inherits=false </p> |
| <div id="parent6"><div id="child6"><p>test</p></div> </div> |
| <p> A cycle between an inherits=true and inherits=false property </p> |
| <div id="parent7"><div id="child7"><p>test</p></div> </div> |
| <p> A cycle between an inherits=true and inherits=false property </p> |
| <div id="parent8"><div id="child8"><p>test</p></div> </div> |
| <p> A cycle between an inherits=true and inherits=false property with fallback </p> |
| <div id="parent9"><div id="child9"><p>test</p></div> </div> |
| <p> Inheritance should not create a cycle </p> |
| <div id="parent10"><div id="child10"><p>test</p></div></div> |
| <p> A cycle between two unregistered properties </p> |
| <div id="parent11"><div id="child11"><p>test</p></div> </div> |
| |
| <p> Revert, inherits=true </p> |
| <div id="parent12"><div id="child12"><div id="childchild12"><p>test</p></div></div></div> |
| <p> Revert, inherits=false </p> |
| <div id="parent13"><div id="child13"><div id="childchild13"><p>test</p></div></div> </div> |
| <p> Revert, unregistered </p> |
| <div id="parent14"><div id="child14"><div id="childchild14"><p>test</p></div></div> </div> |
| <p> Inherit, unregistered </p> |
| <div id="parent14-1"><div id="child14-1"><div id="childchild14-1"><p>test</p></div></div> </div> |
| |
| <p> Test that inherited properties do variable substitution before being inherited - registered</p> |
| <div id="parent15"><div id="child15"><p>test</p></div> </div> |
| <p> Test that inherited properties do variable substitution before being inherited - unregistered</p> |
| <div id="parent16"><div id="child16"><p>test</p></div> </div> |
| |
| <p> No initial value in registered property should act like unregistered</p> |
| <div id="parent17"><div id="child17"><p>test</p></div> </div> |
| <p> (unregistered) </p> |
| <div id="parent18"><div id="child18"><p>test</p></div> </div> |
| |
| <p>Inherit should be substituted for unregistered property</p> |
| <div id="parent19"><div id="child19"><p>test</p></div> </div> |
| </div> |
| <script> |
| |
| function test_prop(id, prop, expected) { |
| assert_equals(window.getComputedStyle(document.getElementById(id)).getPropertyValue(prop).trim(), expected); |
| } |
| |
| test(function() { |
| CSS.registerProperty({ |
| name: '--my-custom-prop', |
| syntax: '<length>', |
| inherits: true, |
| initialValue: '200px' |
| }) |
| |
| CSS.registerProperty({ |
| name: '--my-custom-prop2', |
| syntax: '<length>', |
| inherits: false, |
| initialValue: '200px' |
| }) |
| |
| CSS.registerProperty({ |
| name: '--my-custom-prop-no-initial-value', |
| syntax: '*', |
| inherits: false |
| }) |
| }, "Registration is successful"); |
| test(function() { |
| test_prop('child1', 'width', '100px'); |
| test_prop('child1', '--my-custom-prop', '100px'); |
| test_prop('child1', '--my-custom-prop2', '200px'); |
| }, "JS Attributes are valid for element 1"); |
| test(function() { |
| test_prop('child2', 'width', '200px'); |
| test_prop('child2', '--my-custom-prop', '200px'); |
| test_prop('child2', '--my-custom-prop2', '200px'); |
| }, "JS Attributes are valid for element 2"); |
| test(function() { |
| test_prop('child3', 'width', '100px'); |
| test_prop('child3', '--my-custom-prop3', '100px'); |
| test_prop('child3', '--my-custom-prop2', '200px'); |
| }, "JS Attributes are valid for element 3"); |
| test(function() { |
| test_prop('child4', 'width', '200px'); |
| test_prop('child4', '--my-custom-prop', '200px'); |
| test_prop('child4', '--my-custom-prop2', '200px'); |
| }, "JS Attributes are valid for element 4"); |
| test(function() { |
| test_prop('child5', 'width', '100px'); |
| test_prop('child5', '--my-custom-prop', '100px'); |
| test_prop('child5', '--my-custom-prop2', '200px'); |
| }, "JS Attributes are valid for element 5"); |
| test(function() { |
| test_prop('child6', 'width', '200px'); |
| test_prop('child6', '--my-custom-prop', '200px'); |
| test_prop('child6', '--my-custom-prop2', '200px'); |
| }, "JS Attributes are valid for element 6"); |
| test(function() { |
| test_prop('child7', 'width', '300px'); |
| test_prop('child7', '--my-custom-prop', ''); |
| test_prop('child7', '--my-custom-prop2', ''); |
| }, "JS Attributes are valid for element 7"); |
| test(function() { |
| test_prop('child8', 'width', '300px'); |
| test_prop('child8', '--my-custom-prop', ''); |
| test_prop('child8', '--my-custom-prop2', ''); |
| }, "JS Attributes are valid for element 8"); |
| test(function() { |
| test_prop('child9', 'width', '300px'); |
| test_prop('child9', '--my-custom-prop', ''); |
| test_prop('child9', '--my-custom-prop2', ''); |
| }, "JS Attributes are valid for element 9"); |
| test(function() { |
| test_prop('child10', 'width', '110px'); |
| test_prop('child10', '--my-custom-prop', '100px'); |
| test_prop('child10', '--my-custom-prop2', '110px'); |
| }, "JS Attributes are valid for element 10"); |
| test(function() { |
| test_prop('child11', 'width', '300px'); |
| test_prop('child11', '--my-custom-prop-unreg', ''); |
| test_prop('child11', '--my-custom-prop2-unreg', ''); |
| }, "JS Attributes are valid for element 11"); |
| |
| test(function() { |
| test_prop('childchild12', 'width', '190px'); |
| test_prop('childchild12', '--my-custom-prop', '190px'); |
| test_prop('child12', 'width', '195px'); |
| test_prop('child12', '--my-custom-prop', '190px'); |
| test_prop('parent12', '--my-custom-prop', '100px'); |
| }, "JS Attributes are valid for element 12"); |
| test(function() { |
| test_prop('childchild13', 'width', '200px'); |
| test_prop('childchild13', '--my-custom-prop2', '200px'); |
| test_prop('child13', 'width', '190px'); |
| test_prop('child13', '--my-custom-prop2', '190px'); |
| test_prop('parent13', '--my-custom-prop2', '100px'); |
| }, "JS Attributes are valid for element 13"); |
| test(function() { |
| // Chrome and firefox do not pass this because they do not |
| // support revert, as of September 2018 |
| test_prop('childchild14', 'width', '190px'); |
| test_prop('childchild14', '--my-custom-prop-unreg', '190px'); |
| test_prop('child14', 'width', '195px'); |
| test_prop('child14', '--my-custom-prop-unreg', '190px'); |
| test_prop('parent14', '--my-custom-prop-unreg', '100px'); |
| }, "JS Attributes are valid for element 14"); |
| test(function() { |
| test_prop('childchild14-1', 'width', '190px'); |
| test_prop('childchild14-1', '--my-custom-prop-unreg', '190px'); |
| test_prop('child14-1', 'width', '195px'); |
| test_prop('child14-1', '--my-custom-prop-unreg', '190px'); |
| test_prop('parent14-1', '--my-custom-prop-unreg', '100px'); |
| }, "JS Attributes are valid for element 14-1"); |
| |
| test(function() { |
| test_prop('parent15', 'word-spacing', '26px'); |
| test_prop('child15', 'word-spacing', '26px'); |
| test_prop('parent15', '--my-custom-prop', '26px'); |
| test_prop('child15', '--my-custom-prop', '26px'); |
| }, "JS Attributes are valid for element 15"); |
| test(function() { |
| test_prop('parent16', 'word-spacing', '26px'); |
| test_prop('child16', 'word-spacing', '26px'); |
| test_prop('parent16', '--my-custom-prop-unreg', 'calc(1em + 10px)'); |
| test_prop('child16', '--my-custom-prop-unreg', 'calc(1em + 10px)'); |
| }, "JS Attributes are valid for element 16"); |
| |
| test(function() { |
| test_prop('child17', 'width', '200px'); |
| test_prop('child17', '--my-custom-prop2', '200px'); |
| }, "JS Attributes are valid for element 17"); |
| test(function() { |
| test_prop('child18', 'width', '500px'); |
| test_prop('child18', '--my-custom-prop-no-initial-value', ''); |
| }, "JS Attributes are valid for element 18"); |
| |
| test(function() { |
| test_prop('child19', 'width', '100px'); |
| test_prop('child19', '--my-custom-prop-unreg', '100px'); |
| }, "JS Attributes are valid for element 19"); |
| </script> |