wpt / css / css-mixins / functions / function-shadow.html

Status: FAIL | Duration: 55ms | Subtests: 0/11 | Open test on wpt.live | wpt.fyi

Data from commit:
a50cb89 wpt: run reference-named files which are themselves tests (#836) (2026-09-03)

SubtestStatusMessage
@function works inside shadowFAILassert_true: expected true got false
Looking up document-global functionFAILassert_true: expected true got false
@function works inside nested shadowFAILassert_true: expected true got false
@function defined in outer shadow is visibleFAILassert_true: expected true got false
Combining functions from various scopesFAILassert_true: expected true got false
::part() can not see inner functionsFAILassert_true: expected true got false
::slotted() can see inner functionsFAILassert_true: expected true got false
:host can see inner functionsFAILassert_true: expected true got false
Outer functions can't see inner functionsFAILassert_true: expected true got false
Outer functions can't see inner functions (local vars)FAILassert_true: expected true got false
Function with same name in different scopesFAILassert_true: expected true got false

/css/css-mixins/functions/function-shadow.html

<!DOCTYPE html>
<title>Custom Functions: ShadowDOM</title>
<link rel="help" href="https://drafts.csswg.org/css-mixins-1/#using-custom-functions">
<link rel="help" href="https://drafts.csswg.org/css-shadow-1/#css-tree-scoped-reference">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../resources/utils.js"></script>

<style>
  @function --a() { result: 42px; }
</style>

<!--
  Each element <div data-name="test case name"> represents a test.
  Inside each such element (including all shadow trees), there must be
  an element #target, with identical computed values for --actual and --expected.
-->

<div data-name="@function works inside shadow">
  <template shadowrootmode=open>
    <style>
      @function --a() {
        result: 10px;
      }
      #target {
        --actual: --a();
        --expected: 10px;
      }
    </style>
    <div id=target></div>
  </template>
</div>

<div data-name="Looking up document-global function">
  <template shadowrootmode=open>
    <style>
      #target {
        --actual: --a();
        --expected: 42px;
      }
    </style>
    <div id=target></div>
  </template>
</div>

<div data-name="@function works inside nested shadow">
  <template shadowrootmode=open>
    <div>
      <template shadowrootmode=open>
        <style>
          @function --a() {
            result: 11px;
          }
          #target {
            --actual: --a();
            --expected: 11px;
          }
        </style>
        <div id=target></div>
      </template>
    </div>
  </template>
</div>

<div data-name="@function defined in outer shadow is visible">
  <template shadowrootmode=open>
    <style>
      @function --a() {
        result: 12px;
      }
    </style>
    <div>
      <template shadowrootmode=open>
        <style>
          #target {
            --actual: --a();
            --expected: 12px;
          }
        </style>
        <div id=target></div>
      </template>
    </div>
  </template>
</div>

<div data-name="Combining functions from various scopes">
  <template shadowrootmode=open>
    <style>
      @function --b() {
        result: B;
      }
    </style>
    <div>
      <template shadowrootmode=open>
        <style>
          @function --c() {
            result: C;
          }
          #target {
            --actual: --a() --b() --c();
            --expected: 42px B C;
          }
        </style>
        <div id=target></div>
      </template>
    </div>
  </template>
</div>

<div data-name="::part() can not see inner functions">
  <template shadowrootmode=open>
    <style>
      @function --b() {
        result: 14px;
      }
      ::part(target) {
        --actual: --a() --b();
        --expected: 42px 14px;
      }
    </style>
    <div>
      <template shadowrootmode=open>
        <style>
          @function --a() {
            result: FAIL-a;
          }
          @function --b() {
            result: FAIL-b;
          }
        </style>
        <div id=target part=target></div>
      </template>
    </div>
  </template>
</div>

<div data-name="::slotted() can see inner functions">
  <template shadowrootmode=open>
    <style>
      @function --b() {
        result: 16px;
      }
    </style>
    <div>
      <template shadowrootmode=open>
        <style>
          @function --c() {
            result: 15px;
          }
          ::slotted(#target) {
            --actual: --a() --b() --c();
            --expected: 42px 16px 15px;
          }
        </style>
        <slot></slot>
      </template>
      <div id=target></div>
    </div>
  </template>
</div>

<div data-name=":host can see inner functions">
  <template shadowrootmode=open>
    <style>
      @function --b() {
        result: 17px;
      }
    </style>
    <div id=target>
      <template shadowrootmode=open>
        <style>
          @function --c() {
            result: 18px;
          }
          :host {
            --actual: --a() --b() --c();
            --expected: 42px 17px 18px;
          }
        </style>
      </template>
    </div>
  </template>
</div>

<div data-name="Outer functions can't see inner functions">
  <template shadowrootmode=open>
    <style>
      @function --b() {
        result: --c(); /* 20px */
      }
      @function --c() {
        result: 20px;
      }
    </style>
    <div>
      <template shadowrootmode=open>
        <style>
          @function --c() {
            result: C;
          }
          #target {
            --actual: --b() --c();
            --expected: 20px C;
          }
        </style>
        <div id=target></div>
      </template>
    </div>
  </template>
</div>

<div data-name="Outer functions can't see inner functions (local vars)">
  <template shadowrootmode=open>
    <style>
      @function --b() {
        --lb: --c();
        result: var(--lb); /* 22px */
      }
      @function --c() {
        result: 22px;
      }
    </style>
    <div>
      <template shadowrootmode=open>
        <style>
          @function --c() {
            result: C;
          }
          @function --d() {
            --ld: --b() --c();
            result: var(--ld);
          }
          #target {
            --actual: --d();
            --expected: 22px C;
          }
        </style>
        <div id=target></div>
      </template>
    </div>
  </template>
</div>

<div data-name="Function with same name in different scopes">
  <template shadowrootmode=open>
    <style>
      @function --a() {
        result: 24px;
      }
      @function --b() {
        result: --a(); /* 24px */
      }
    </style>
    <div>
      <template shadowrootmode=open>
        <style>
          @function --a() {
            result: --b(); /* Calls --b() in outer scope. */
          }
          #target {
            /* Nothing is in a cycle here. */
            --actual: --a();
            --expected: 24px;
          }
        </style>
        <div id=target></div>
      </template>
    </div>
  </template>
</div>

<script>
  test_all_shadows();
</script>