<!DOCTYPE html>
<title>CSS Custom Functions: Invalidation when @function rules change</title>
<link rel="help" href="https://drafts.csswg.org/css-mixins-1/#cssom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>

<!-- This stylesheet will be mutated during testing. -->
<style id=mutable_style>
  @function --f() {
    result: 10px;
  }
</style>

<style>
  #outer {
    width: 42px;
  }
  #target {
    width: --f();
  }
</style>

<div id=outer>
  <div>
    <div id=target>
    </div>
  </div>
<div>

<script>
  // Adds a cleanup step to recreate `original_element` in-place
  // (with the original text).
  function add_cleanup(t, original_element) {
    let original_text = original_element.textContent;
    t.add_cleanup(() => {
      let new_element = document.createElement('style');
      new_element.setAttribute('id', 'mutable_style');
      new_element.textContent = original_text;
      original_element.parentElement.replaceChild(new_element, original_element);
    });
  }

  test(t => {
    add_cleanup(t, mutable_style);
    let sheet = mutable_style.sheet;
    assert_equals(getComputedStyle(target).width, '10px');
    sheet.insertRule('@function --f() { result: 20px; }', 1);
    assert_equals(getComputedStyle(target).width, '20px');
  }, 'Appending a rule');

  test(t => {
    add_cleanup(t, mutable_style);
    let sheet = mutable_style.sheet;
    assert_equals(getComputedStyle(target).width, '10px');
    sheet.insertRule('@function --f() { result: 20px; }', 0);
    assert_equals(getComputedStyle(target).width, '10px'); // No change.
  }, 'Prepending a rule');

  test(t => {
    add_cleanup(t, mutable_style);
    let sheet = mutable_style.sheet;
    assert_equals(getComputedStyle(target).width, '10px');
    sheet.deleteRule(0);
    assert_equals(getComputedStyle(target).width, '42px');
  }, 'Deleting a rule');

  test(t => {
    add_cleanup(t, mutable_style);
    let sheet = mutable_style.sheet;
    assert_equals(getComputedStyle(target).width, '10px');
    sheet.insertRule('@function --f() { result: 20px; }', 0);
    assert_equals(getComputedStyle(target).width, '10px');
    sheet.deleteRule(1);
    assert_equals(getComputedStyle(target).width, '20px');
  }, 'Prepending a rule, then deleting last');
</script>
