| <!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-scoping-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> |