| <!DOCTYPE html> | |
| <title>Resolving @keyframe name conflicts with cascade layers</title> | |
| <link rel="help" href="https://drafts.csswg.org/css-cascade-5/#layering"> | |
| <link rel="author" href="mailto:xiaochengh@chromium.org"> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <style> | |
| #target { | |
| font-size: 20px; | |
| width: min-content; | |
| } | |
| </style> | |
| <div id="target">Test</div> | |
| <script> | |
| // In all tests, width of #target should be 80px. | |
| const testCases = [ | |
| { | |
| title: '@font-face unlayered overrides layered', | |
| style: ` | |
| #target { | |
| font-family: custom-font; | |
| } | |
| @font-face { | |
| font-family: custom-font; | |
| src: url('/fonts/Ahem.ttf'); | |
| } | |
| @layer { | |
| @font-face { | |
| font-family: custom-font; | |
| src: url('/fonts/noto/noto-sans-v8-latin-regular.woff') format('woff'); | |
| } | |
| } | |
| ` | |
| }, | |
| { | |
| title: '@font-face override between layers', | |
| style: ` | |
| @layer base, override; | |
| #target { | |
| font-family: custom-font; | |
| } | |
| @layer override { | |
| @font-face { | |
| font-family: custom-font; | |
| src: url('/fonts/Ahem.ttf'); | |
| } | |
| } | |
| @layer base { | |
| @font-face { | |
| font-family: custom-font; | |
| src: url('/fonts/noto/noto-sans-v8-latin-regular.woff') format('woff'); | |
| } | |
| } | |
| ` | |
| }, | |
| { | |
| title: '@font-face override update with appended sheet 1', | |
| style: ` | |
| @layer base, override; | |
| #target { | |
| font-family: custom-font; | |
| } | |
| @layer override { | |
| @font-face { | |
| font-family: custom-font; | |
| src: url('/fonts/Ahem.ttf'); | |
| } | |
| } | |
| `, | |
| append: ` | |
| @layer base { | |
| @font-face { | |
| font-family: custom-font; | |
| src: url('/fonts/noto/noto-sans-v8-latin-regular.woff') format('woff'); | |
| } | |
| } | |
| ` | |
| }, | |
| { | |
| title: '@font-face override update with appended sheet 2', | |
| style: ` | |
| @layer base, override; | |
| #target { | |
| font-family: custom-font; | |
| } | |
| @layer base { | |
| @font-face { | |
| font-family: custom-font; | |
| src: url('/fonts/noto/noto-sans-v8-latin-regular.woff') format('woff'); | |
| } | |
| } | |
| `, | |
| append: ` | |
| @layer override { | |
| @font-face { | |
| font-family: custom-font; | |
| src: url('/fonts/Ahem.ttf'); | |
| } | |
| } | |
| ` | |
| }, | |
| ]; | |
| for (let testCase of testCases) { | |
| promise_test(async () => { | |
| var documentStyle = document.createElement('style'); | |
| documentStyle.appendChild(document.createTextNode(testCase['style'])); | |
| document.head.appendChild(documentStyle); | |
| var appendedStyle; | |
| if (testCase['append']) { | |
| document.body.offsetLeft; // Force style update | |
| appendedStyle = document.createElement('style'); | |
| appendedStyle.appendChild(document.createTextNode(testCase['append'])); | |
| document.head.appendChild(appendedStyle); | |
| } | |
| await document.fonts.load('20px/1 custom-font'); | |
| assert_equals(getComputedStyle(target).width, '80px'); | |
| if (appendedStyle) | |
| appendedStyle.remove(); | |
| documentStyle.remove(); | |
| }, testCase['title']); | |
| } | |
| </script> |