<!DOCTYPE html><!-- webkit-test-runner [ experimental:CSSCustomPropertiesAndValuesEnabled=true ] -->
<!-- https://chromium.googlesource.com/chromium/src/+/01ce431409e3a019858677626a983c55168da6dc/third_party/WebKit/LayoutTests/custom-properties/register-property.html -->
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>

<style>
  #test1 {
    --a: 10em;
    --b: 10em;
  }
</style>
<div>
  <div id=test1><p>test</p></div>
</div>
<script>

var computedStyle = getComputedStyle(test1);
var inlineStyle = test1.style;
var sheetStyle = document.styleSheets[0].cssRules[0].style;

test(function() {
  // Nothing registered yet, whatever you specify works
  assert_equals(computedStyle.getPropertyValue('--a'), ' 10em');
  assert_equals(computedStyle.getPropertyValue('--b'), ' 10em');

  inlineStyle.setProperty('--a', 'hello');
  inlineStyle.setProperty('--b', 'bonjour');

  assert_equals(inlineStyle.getPropertyValue('--a'), 'hello');
  assert_equals(inlineStyle.getPropertyValue('--b'), 'bonjour');
  assert_equals(computedStyle.getPropertyValue('--a'), 'hello');
  assert_equals(computedStyle.getPropertyValue('--b'), 'bonjour');
}, "CSSOM setters function as expected for unregistered properties");

test(function() {
  CSS.registerProperty({name: '--a', syntax: '<length>', initialValue: '0px', inherits: false});
  CSS.registerProperty({name: '--registered', syntax: '<length>', initialValue: '0px', inherits: false});
}, "CSS.registerProperty");

test(function() {
  assert_equals(inlineStyle.getPropertyValue('--a'), 'hello');
  assert_equals(inlineStyle.getPropertyValue('--b'), 'bonjour');
  assert_equals(computedStyle.getPropertyValue('--a'), '0px');
  assert_equals(computedStyle.getPropertyValue('--b'), 'bonjour');
}, "Formerly valid values are still readable from inline styles but are computed as the unset value");

test(function() {
  inlineStyle.setProperty('--a', 'hi');
  inlineStyle.setProperty('--b', 'hi');
  assert_equals(inlineStyle.getPropertyValue('--a'), 'hello');
  assert_equals(inlineStyle.getPropertyValue('--b'), 'hi');
}, "Values not matching the registered type can't be set");

test(function() {
  inlineStyle.removeProperty('--a');
  inlineStyle.setProperty('--b', '');
  assert_equals(inlineStyle.getPropertyValue('--a'), '');
  assert_equals(inlineStyle.getPropertyValue('--b'), '');
  assert_equals(computedStyle.getPropertyValue('--a'), '160px');
  assert_equals(computedStyle.getPropertyValue('--b'), ' 10em');
}, "Values can be removed from inline styles");

test(function() {
  sheetStyle.setProperty('--a', 'banana'); // Invalid, no change
  assert_equals(computedStyle.getPropertyValue('--a'), '160px');
  sheetStyle.setProperty('--a', '20px');
  assert_equals(computedStyle.getPropertyValue('--a'), '20px');
  sheetStyle.setProperty('--a', 'initial');
  assert_equals(computedStyle.getPropertyValue('--a'), '0px');
}, "Stylesheets can be modified by CSSOM");

test(function() {
  inlineStyle.setProperty('--a', '30em');
  inlineStyle.setProperty('--b', '20em');
  assert_equals(inlineStyle.getPropertyValue('--a'), '30em');
  assert_equals(inlineStyle.getPropertyValue('--b'), '20em');
  assert_equals(computedStyle.getPropertyValue('--a'), '480px');
  assert_equals(computedStyle.getPropertyValue('--b'), '20em');
  inlineStyle.setProperty('--a', 'inherit');
  assert_equals(inlineStyle.getPropertyValue('--a'), 'inherit');
  assert_equals(computedStyle.getPropertyValue('--a'), '0px');
}, "Valid values can be set on inline styles");

test(function() {
  inlineStyle.setProperty('--b', ' 20px');
  inlineStyle.setProperty('--a', 'calc(var(--b) + 10px)');
  assert_equals(inlineStyle.getPropertyValue('--b'), ' 20px');
  assert_equals(inlineStyle.getPropertyValue('--a'), 'calc(var(--b) + 10px)');
  assert_equals(computedStyle.getPropertyValue('--b'), ' 20px');
  assert_equals(computedStyle.getPropertyValue('--a'), '30px');
}, "Var values are accepted");

test(function() {
  inlineStyle.setProperty('--b', 'hello');
  inlineStyle.setProperty('--a', 'calc(var(--b) + 15px)');
  assert_equals(inlineStyle.getPropertyValue('--b'), 'hello');
  assert_equals(inlineStyle.getPropertyValue('--a'), 'calc(var(--b) + 15px)');
  assert_equals(computedStyle.getPropertyValue('--b'), 'hello');
  assert_equals(computedStyle.getPropertyValue('--a'), '0px');
}, "Var values are accepted without validation");

test(function() {
  inlineStyle.setProperty('--b', 'hello');
  inlineStyle.setProperty('--a', 'calc(var(--b) 15px)');
  assert_equals(inlineStyle.getPropertyValue('--b'), 'hello');
  assert_equals(inlineStyle.getPropertyValue('--a'), 'calc(var(--b) 15px)');
  assert_equals(computedStyle.getPropertyValue('--b'), 'hello');
  assert_equals(computedStyle.getPropertyValue('--a'), '0px');
}, "Var values are accepted without validation, even when it is obvious they will not parse");

test(function() {
  inlineStyle.setProperty('--b', 'hello');
  inlineStyle.setProperty('--a', 'calc(var(--registered) 15px)');
  assert_equals(inlineStyle.getPropertyValue('--b'), 'hello');
  assert_equals(inlineStyle.getPropertyValue('--a'), 'calc(var(--registered) 15px)');
  assert_equals(computedStyle.getPropertyValue('--b'), 'hello');
  assert_equals(computedStyle.getPropertyValue('--a'), '0px');
}, "Var values are accepted without validation, even when it is obvious they will not parse (typed)");

</script>
