Update web-platform-tests to revision b'7a9307ef9e1e88229ced4a29991270d20911669c'

Signed-off-by: WPT Sync Bot <ghbot+wpt-sync@servo.org>
This commit is contained in:
Servo WPT Sync
2025-03-16 01:24:39 +00:00
committed by WPT Sync Bot
parent d8fc1d8bb8
commit 772b801f75
293 changed files with 14733 additions and 2014 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -1,26 +0,0 @@
[corner-shape-fill-any.html?corner-bottom-left-shape=scoop&border-radius=10%]
expected: FAIL
[corner-shape-fill-any.html?corner-bottom-right-shape=scoop&border-radius=50%]
expected: FAIL
[corner-shape-fill-any.html?corner-shape=squircle&border-radius=30px]
expected: FAIL
[corner-shape-fill-any.html?corner-shape=superellipse(5.2)&border-radius=50%]
expected: FAIL
[corner-shape-fill-any.html?corner-shape=squircle&border-radius=50%]
expected: FAIL
[corner-shape-fill-any.html?corner-shape=squircle&border-radius=10%]
expected: FAIL
[corner-shape-fill-any.html?corner-shape=straight&border-radius=5px]
expected: FAIL
[corner-shape-fill-any.html?corner-shape=superellipse(5.2)&border-radius=33px]
expected: FAIL
[corner-shape-fill-any.html?corner-top-right-shape=scoop&border-radius=50px]
expected: FAIL

View File

@@ -58,3 +58,60 @@
[Property dynamic-range-limit value 'dynamic-range-limit-mix(high 25%, standard 25%, standard 25%, standard 25%)']
expected: FAIL
[Property dynamic-range-limit value 'no-limit']
expected: FAIL
[Property dynamic-range-limit value 'constrained']
expected: FAIL
[Property dynamic-range-limit value 'dynamic-range-limit-mix(standard 75%, no-limit 25%)']
expected: FAIL
[Property dynamic-range-limit value 'dynamic-range-limit-mix(standard 25%, no-limit 75%)']
expected: FAIL
[Property dynamic-range-limit value 'dynamic-range-limit-mix(no-limit 100%, standard 0%)']
expected: FAIL
[Property dynamic-range-limit value 'dynamic-range-limit-mix(no-limit 100%, no-limit 0%)']
expected: FAIL
[Property dynamic-range-limit value 'dynamic-range-limit-mix(no-limit 25%, standard 25%, standard 25%, standard 25%)']
expected: FAIL
[Property dynamic-range-limit value 'dynamic-range-limit-mix(no-limit 25%, standard 75%)']
expected: FAIL
[Property dynamic-range-limit value 'dynamic-range-limit-mix(no-limit 100%, standard 100%)']
expected: FAIL
[Property dynamic-range-limit value 'dynamic-range-limit-mix(no-limit 80%, standard 60%, constrained 60%)']
expected: FAIL
[Property dynamic-range-limit value 'dynamic-range-limit-mix(standard 25%, constrained 75%)']
expected: FAIL
[Property dynamic-range-limit value 'dynamic-range-limit-mix(constrained 75%, standard 25%)']
expected: FAIL
[Property dynamic-range-limit value 'dynamic-range-limit-mix(constrained 25%, no-limit 25%)']
expected: FAIL
[Property dynamic-range-limit value 'dynamic-range-limit-mix(standard 25%, constrained 50%, no-limit 25%)']
expected: FAIL
[Property dynamic-range-limit value 'dynamic-range-limit-mix(standard 10%, constrained 20%, no-limit 20%)']
expected: FAIL
[Property dynamic-range-limit value 'dynamic-range-limit-mix(no-limit 10%, standard 30%)']
expected: FAIL
[Property dynamic-range-limit value 'dynamic-range-limit-mix(dynamic-range-limit-mix(standard 10%, no-limit 30%) 20%, standard 80%)']
expected: FAIL
[Property dynamic-range-limit value 'dynamic-range-limit-mix(dynamic-range-limit-mix(standard 25%, no-limit 75%) 20%, dynamic-range-limit-mix(standard 25%, constrained 75%) 40%, dynamic-range-limit-mix(constrained 25%, no-limit 75%) 40%)']
expected: FAIL
[Property dynamic-range-limit value 'dynamic-range-limit-mix(no-limit 10%, dynamic-range-limit-mix(standard 25%, constrained 75%) 20%, dynamic-range-limit-mix(constrained 10%, no-limit 30%) 20%)']
expected: FAIL

View File

@@ -4,3 +4,6 @@
[Property dynamic-range-limit inherits]
expected: FAIL
[Property dynamic-range-limit has initial value no-limit]
expected: FAIL

View File

@@ -190,3 +190,195 @@
[Web Animations: property <dynamic-range-limit> from [dynamic-range-limit-mix(constrained-high 90%, standard 10%)\] to [dynamic-range-limit-mix(high 10%, standard 90%)\] at (1) should be [dynamic-range-limit-mix(standard 90%, high 10%)\]]
expected: FAIL
[CSS Transitions: property <dynamic-range-limit> from [no-limit\] to [standard\] at (0) should be [no-limit\]]
expected: FAIL
[CSS Transitions: property <dynamic-range-limit> from [no-limit\] to [standard\] at (0.25) should be [dynamic-range-limit-mix(standard 25%, no-limit 75%)\]]
expected: FAIL
[CSS Transitions: property <dynamic-range-limit> from [no-limit\] to [standard\] at (0.75) should be [dynamic-range-limit-mix(standard 75%, no-limit 25%)\]]
expected: FAIL
[CSS Transitions: property <dynamic-range-limit> from [no-limit\] to [standard\] at (1) should be [standard\]]
expected: FAIL
[CSS Transitions with transition: all: property <dynamic-range-limit> from [no-limit\] to [standard\] at (0) should be [no-limit\]]
expected: FAIL
[CSS Transitions with transition: all: property <dynamic-range-limit> from [no-limit\] to [standard\] at (0.25) should be [dynamic-range-limit-mix(standard 25%, no-limit 75%)\]]
expected: FAIL
[CSS Transitions with transition: all: property <dynamic-range-limit> from [no-limit\] to [standard\] at (0.75) should be [dynamic-range-limit-mix(standard 75%, no-limit 25%)\]]
expected: FAIL
[CSS Transitions with transition: all: property <dynamic-range-limit> from [no-limit\] to [standard\] at (1) should be [standard\]]
expected: FAIL
[CSS Animations: property <dynamic-range-limit> from [no-limit\] to [standard\] at (0) should be [no-limit\]]
expected: FAIL
[CSS Animations: property <dynamic-range-limit> from [no-limit\] to [standard\] at (0.25) should be [dynamic-range-limit-mix(standard 25%, no-limit 75%)\]]
expected: FAIL
[CSS Animations: property <dynamic-range-limit> from [no-limit\] to [standard\] at (0.75) should be [dynamic-range-limit-mix(standard 75%, no-limit 25%)\]]
expected: FAIL
[CSS Animations: property <dynamic-range-limit> from [no-limit\] to [standard\] at (1) should be [standard\]]
expected: FAIL
[Web Animations: property <dynamic-range-limit> from [no-limit\] to [standard\] at (0) should be [no-limit\]]
expected: FAIL
[Web Animations: property <dynamic-range-limit> from [no-limit\] to [standard\] at (0.25) should be [dynamic-range-limit-mix(standard 25%, no-limit 75%)\]]
expected: FAIL
[Web Animations: property <dynamic-range-limit> from [no-limit\] to [standard\] at (0.75) should be [dynamic-range-limit-mix(standard 75%, no-limit 25%)\]]
expected: FAIL
[Web Animations: property <dynamic-range-limit> from [no-limit\] to [standard\] at (1) should be [standard\]]
expected: FAIL
[CSS Transitions: property <dynamic-range-limit> from [constrained\] to [standard\] at (0) should be [constrained\]]
expected: FAIL
[CSS Transitions: property <dynamic-range-limit> from [constrained\] to [standard\] at (0.5) should be [dynamic-range-limit-mix(standard 50%, constrained 50%)\]]
expected: FAIL
[CSS Transitions: property <dynamic-range-limit> from [constrained\] to [standard\] at (1) should be [standard\]]
expected: FAIL
[CSS Transitions with transition: all: property <dynamic-range-limit> from [constrained\] to [standard\] at (0) should be [constrained\]]
expected: FAIL
[CSS Transitions with transition: all: property <dynamic-range-limit> from [constrained\] to [standard\] at (0.5) should be [dynamic-range-limit-mix(standard 50%, constrained 50%)\]]
expected: FAIL
[CSS Transitions with transition: all: property <dynamic-range-limit> from [constrained\] to [standard\] at (1) should be [standard\]]
expected: FAIL
[CSS Animations: property <dynamic-range-limit> from [constrained\] to [standard\] at (0) should be [constrained\]]
expected: FAIL
[CSS Animations: property <dynamic-range-limit> from [constrained\] to [standard\] at (0.5) should be [dynamic-range-limit-mix(standard 50%, constrained 50%)\]]
expected: FAIL
[CSS Animations: property <dynamic-range-limit> from [constrained\] to [standard\] at (1) should be [standard\]]
expected: FAIL
[Web Animations: property <dynamic-range-limit> from [constrained\] to [standard\] at (0) should be [constrained\]]
expected: FAIL
[Web Animations: property <dynamic-range-limit> from [constrained\] to [standard\] at (0.5) should be [dynamic-range-limit-mix(standard 50%, constrained 50%)\]]
expected: FAIL
[Web Animations: property <dynamic-range-limit> from [constrained\] to [standard\] at (1) should be [standard\]]
expected: FAIL
[CSS Transitions: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 50%, no-limit 50%)\] to [standard\] at (0) should be [dynamic-range-limit-mix(standard 50%, no-limit 50%)\]]
expected: FAIL
[CSS Transitions: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 50%, no-limit 50%)\] to [standard\] at (0.75) should be [dynamic-range-limit-mix(standard 87.5%, no-limit 12.5%)\]]
expected: FAIL
[CSS Transitions: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 50%, no-limit 50%)\] to [standard\] at (1) should be [standard\]]
expected: FAIL
[CSS Transitions with transition: all: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 50%, no-limit 50%)\] to [standard\] at (0) should be [dynamic-range-limit-mix(standard 50%, no-limit 50%)\]]
expected: FAIL
[CSS Transitions with transition: all: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 50%, no-limit 50%)\] to [standard\] at (0.75) should be [dynamic-range-limit-mix(standard 87.5%, no-limit 12.5%)\]]
expected: FAIL
[CSS Transitions with transition: all: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 50%, no-limit 50%)\] to [standard\] at (1) should be [standard\]]
expected: FAIL
[CSS Animations: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 50%, no-limit 50%)\] to [standard\] at (0) should be [dynamic-range-limit-mix(standard 50%, no-limit 50%)\]]
expected: FAIL
[CSS Animations: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 50%, no-limit 50%)\] to [standard\] at (0.75) should be [dynamic-range-limit-mix(standard 87.5%, no-limit 12.5%)\]]
expected: FAIL
[CSS Animations: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 50%, no-limit 50%)\] to [standard\] at (1) should be [standard\]]
expected: FAIL
[Web Animations: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 50%, no-limit 50%)\] to [standard\] at (0) should be [dynamic-range-limit-mix(standard 50%, no-limit 50%)\]]
expected: FAIL
[Web Animations: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 50%, no-limit 50%)\] to [standard\] at (0.75) should be [dynamic-range-limit-mix(standard 87.5%, no-limit 12.5%)\]]
expected: FAIL
[Web Animations: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 50%, no-limit 50%)\] to [standard\] at (1) should be [standard\]]
expected: FAIL
[CSS Transitions: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 90%, no-limit 10%)\] to [dynamic-range-limit-mix(standard 10%, no-limit 90%)\] at (0) should be [dynamic-range-limit-mix(standard 90%, no-limit 10%)\]]
expected: FAIL
[CSS Transitions: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 90%, no-limit 10%)\] to [dynamic-range-limit-mix(standard 10%, no-limit 90%)\] at (0.5) should be [dynamic-range-limit-mix(standard 50%, no-limit 50%)\]]
expected: FAIL
[CSS Transitions: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 90%, no-limit 10%)\] to [dynamic-range-limit-mix(standard 10%, no-limit 90%)\] at (1) should be [dynamic-range-limit-mix(standard 10%, no-limit 90%)\]]
expected: FAIL
[CSS Transitions with transition: all: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 90%, no-limit 10%)\] to [dynamic-range-limit-mix(standard 10%, no-limit 90%)\] at (0) should be [dynamic-range-limit-mix(standard 90%, no-limit 10%)\]]
expected: FAIL
[CSS Transitions with transition: all: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 90%, no-limit 10%)\] to [dynamic-range-limit-mix(standard 10%, no-limit 90%)\] at (0.5) should be [dynamic-range-limit-mix(standard 50%, no-limit 50%)\]]
expected: FAIL
[CSS Transitions with transition: all: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 90%, no-limit 10%)\] to [dynamic-range-limit-mix(standard 10%, no-limit 90%)\] at (1) should be [dynamic-range-limit-mix(standard 10%, no-limit 90%)\]]
expected: FAIL
[CSS Animations: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 90%, no-limit 10%)\] to [dynamic-range-limit-mix(standard 10%, no-limit 90%)\] at (0) should be [dynamic-range-limit-mix(standard 90%, no-limit 10%)\]]
expected: FAIL
[CSS Animations: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 90%, no-limit 10%)\] to [dynamic-range-limit-mix(standard 10%, no-limit 90%)\] at (0.5) should be [dynamic-range-limit-mix(standard 50%, no-limit 50%)\]]
expected: FAIL
[CSS Animations: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 90%, no-limit 10%)\] to [dynamic-range-limit-mix(standard 10%, no-limit 90%)\] at (1) should be [dynamic-range-limit-mix(standard 10%, no-limit 90%)\]]
expected: FAIL
[Web Animations: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 90%, no-limit 10%)\] to [dynamic-range-limit-mix(standard 10%, no-limit 90%)\] at (0) should be [dynamic-range-limit-mix(standard 90%, no-limit 10%)\]]
expected: FAIL
[Web Animations: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 90%, no-limit 10%)\] to [dynamic-range-limit-mix(standard 10%, no-limit 90%)\] at (0.5) should be [dynamic-range-limit-mix(standard 50%, no-limit 50%)\]]
expected: FAIL
[Web Animations: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 90%, no-limit 10%)\] to [dynamic-range-limit-mix(standard 10%, no-limit 90%)\] at (1) should be [dynamic-range-limit-mix(standard 10%, no-limit 90%)\]]
expected: FAIL
[CSS Transitions: property <dynamic-range-limit> from [dynamic-range-limit-mix(constrained 90%, standard 10%)\] to [dynamic-range-limit-mix(no-limit 10%, standard 90%)\] at (0) should be [dynamic-range-limit-mix(standard 10%, constrained 90%)\]]
expected: FAIL
[CSS Transitions: property <dynamic-range-limit> from [dynamic-range-limit-mix(constrained 90%, standard 10%)\] to [dynamic-range-limit-mix(no-limit 10%, standard 90%)\] at (0.5) should be [dynamic-range-limit-mix(standard 50%, constrained 45%, no-limit 5%)\]]
expected: FAIL
[CSS Transitions: property <dynamic-range-limit> from [dynamic-range-limit-mix(constrained 90%, standard 10%)\] to [dynamic-range-limit-mix(no-limit 10%, standard 90%)\] at (1) should be [dynamic-range-limit-mix(standard 90%, no-limit 10%)\]]
expected: FAIL
[CSS Transitions with transition: all: property <dynamic-range-limit> from [dynamic-range-limit-mix(constrained 90%, standard 10%)\] to [dynamic-range-limit-mix(no-limit 10%, standard 90%)\] at (0) should be [dynamic-range-limit-mix(standard 10%, constrained 90%)\]]
expected: FAIL
[CSS Transitions with transition: all: property <dynamic-range-limit> from [dynamic-range-limit-mix(constrained 90%, standard 10%)\] to [dynamic-range-limit-mix(no-limit 10%, standard 90%)\] at (0.5) should be [dynamic-range-limit-mix(standard 50%, constrained 45%, no-limit 5%)\]]
expected: FAIL
[CSS Transitions with transition: all: property <dynamic-range-limit> from [dynamic-range-limit-mix(constrained 90%, standard 10%)\] to [dynamic-range-limit-mix(no-limit 10%, standard 90%)\] at (1) should be [dynamic-range-limit-mix(standard 90%, no-limit 10%)\]]
expected: FAIL
[CSS Animations: property <dynamic-range-limit> from [dynamic-range-limit-mix(constrained 90%, standard 10%)\] to [dynamic-range-limit-mix(no-limit 10%, standard 90%)\] at (0) should be [dynamic-range-limit-mix(standard 10%, constrained 90%)\]]
expected: FAIL
[CSS Animations: property <dynamic-range-limit> from [dynamic-range-limit-mix(constrained 90%, standard 10%)\] to [dynamic-range-limit-mix(no-limit 10%, standard 90%)\] at (0.5) should be [dynamic-range-limit-mix(standard 50%, constrained 45%, no-limit 5%)\]]
expected: FAIL
[CSS Animations: property <dynamic-range-limit> from [dynamic-range-limit-mix(constrained 90%, standard 10%)\] to [dynamic-range-limit-mix(no-limit 10%, standard 90%)\] at (1) should be [dynamic-range-limit-mix(standard 90%, no-limit 10%)\]]
expected: FAIL
[Web Animations: property <dynamic-range-limit> from [dynamic-range-limit-mix(constrained 90%, standard 10%)\] to [dynamic-range-limit-mix(no-limit 10%, standard 90%)\] at (0) should be [dynamic-range-limit-mix(standard 10%, constrained 90%)\]]
expected: FAIL
[Web Animations: property <dynamic-range-limit> from [dynamic-range-limit-mix(constrained 90%, standard 10%)\] to [dynamic-range-limit-mix(no-limit 10%, standard 90%)\] at (0.5) should be [dynamic-range-limit-mix(standard 50%, constrained 45%, no-limit 5%)\]]
expected: FAIL
[Web Animations: property <dynamic-range-limit> from [dynamic-range-limit-mix(constrained 90%, standard 10%)\] to [dynamic-range-limit-mix(no-limit 10%, standard 90%)\] at (1) should be [dynamic-range-limit-mix(standard 90%, no-limit 10%)\]]
expected: FAIL

View File

@@ -34,3 +34,36 @@
[e.style['dynamic-range-limit'\] = "dynamic-range-limit-mix(high 1%)" should set the property value]
expected: FAIL
[e.style['dynamic-range-limit'\] = "no-limit" should set the property value]
expected: FAIL
[e.style['dynamic-range-limit'\] = "constrained" should set the property value]
expected: FAIL
[e.style['dynamic-range-limit'\] = "dynamic-range-limit-mix(no-limit 80%, standard 20%)" should set the property value]
expected: FAIL
[e.style['dynamic-range-limit'\] = "dynamic-range-limit-mix(no-limit 8%, standard 2%)" should set the property value]
expected: FAIL
[e.style['dynamic-range-limit'\] = "dynamic-range-limit-mix(no-limit 99%, standard 99%)" should set the property value]
expected: FAIL
[e.style['dynamic-range-limit'\] = "dynamic-range-limit-mix(no-limit 99%, standard 99%, constrained 10%)" should set the property value]
expected: FAIL
[e.style['dynamic-range-limit'\] = "dynamic-range-limit-mix(no-limit 1%)" should set the property value]
expected: FAIL
[e.style['dynamic-range-limit'\] = "dynamic-range-limit-mix(constrained 20%, no-limit 80%)" should set the property value]
expected: FAIL
[e.style['dynamic-range-limit'\] = "dynamic-range-limit-mix(dynamic-range-limit-mix(constrained 90%, no-limit 10%) 1%, no-limit 80%)" should set the property value]
expected: FAIL
[e.style['dynamic-range-limit'\] = "dynamic-range-limit-mix(no-limit 1%, dynamic-range-limit-mix(constrained 2%, no-limit 10%) 80%)" should set the property value]
expected: FAIL
[e.style['dynamic-range-limit'\] = "dynamic-range-limit-mix(dynamic-range-limit-mix(no-limit 1%, standard 2%) 3%, dynamic-range-limit-mix(constrained 5%, no-limit 5%) 6%)" should set the property value]
expected: FAIL

View File

@@ -1,102 +0,0 @@
[at-function-cssom.tentative.html]
[Empty CSSFunctionRule]
expected: FAIL
[Single CSSFunctionDeclarations]
expected: FAIL
[CSSFunctionDescriptors (result)]
expected: FAIL
[CSSFunctionDescriptors (result, repeated)]
expected: FAIL
[CSSFunctionDescriptors (local variables)]
expected: FAIL
[CSSFunctionDescriptors (local variables, repeated)]
expected: FAIL
[CSSFunctionDescriptors (local variables and result)]
expected: FAIL
[CSSFunctionDescriptors serialization]
expected: FAIL
[Unknown descriptors]
expected: FAIL
[Unknown descriptors (mutation)]
expected: FAIL
[item()]
expected: FAIL
[Indexed property getter]
expected: FAIL
[CSSFunctionRule.name]
expected: FAIL
[CSSFunctionRule.getParameters()]
expected: FAIL
[CSSFunctionRule.returnType]
expected: FAIL
[CSSFunctionRule escapes]
expected: FAIL
[CSSFunctionRule.cssText (--empty)]
expected: FAIL
[CSSFunctionRule.cssText (--ret-length)]
expected: FAIL
[CSSFunctionRule.cssText (--ret-length-auto)]
expected: FAIL
[CSSFunctionRule.cssText (--param-single)]
expected: FAIL
[CSSFunctionRule.cssText (--param-typed)]
expected: FAIL
[CSSFunctionRule.cssText (--param-typed-default)]
expected: FAIL
[CSSFunctionRule.cssText (--param-default)]
expected: FAIL
[CSSFunctionRule.cssText (--param-multi)]
expected: FAIL
[CSSFunctionRule.cssText (--param-multi-mixed)]
expected: FAIL
[CSSFunctionRule.cssText (--body-result)]
expected: FAIL
[CSSFunctionRule.cssText (--body-locals)]
expected: FAIL
[CSSFunctionRule.cssText (--param-type-fn)]
expected: FAIL
[CSSFunctionRule.cssText (--param-type-fn-uni)]
expected: FAIL
[CSSFunctionRule.cssText (--ret-type-fn)]
expected: FAIL
[CSSFunctionRule.cssText (--ret-type-fn-uni)]
expected: FAIL
[CSSFunctionRule.cssText (--body-result-multi)]
expected: FAIL
[CSSFunctionRule.cssText (--escaped-)]
expected: FAIL
[@supports in body]
expected: FAIL

View File

@@ -1,2 +0,0 @@
[table-cell-overflow-auto-scrolled.html]
expected: FAIL

View File

@@ -1,2 +0,0 @@
[preserve3d-and-flattening-001.html]
expected: FAIL

View File

@@ -2,9 +2,6 @@
[CSS Values and Units Test: attr]
expected: FAIL
[CSS Values and Units Test: attr 1]
expected: FAIL
[CSS Values and Units Test: attr 2]
expected: FAIL
@@ -23,9 +20,6 @@
[CSS Values and Units Test: attr 7]
expected: FAIL
[CSS Values and Units Test: attr 10]
expected: FAIL
[CSS Values and Units Test: attr 11]
expected: FAIL
@@ -38,12 +32,6 @@
[CSS Values and Units Test: attr 21]
expected: FAIL
[CSS Values and Units Test: attr 36]
expected: FAIL
[CSS Values and Units Test: attr 38]
expected: FAIL
[CSS Values and Units Test: attr 12]
expected: FAIL
@@ -56,9 +44,6 @@
[CSS Values and Units Test: attr 24]
expected: FAIL
[CSS Values and Units Test: attr 20]
expected: FAIL
[CSS Values and Units Test: attr 25]
expected: FAIL
@@ -119,9 +104,6 @@
[CSS Values and Units Test: attr 52]
expected: FAIL
[CSS Values and Units Test: attr 54]
expected: FAIL
[CSS Values and Units Test: attr 55]
expected: FAIL
@@ -227,9 +209,6 @@
[CSS Values and Units Test: attr 82]
expected: FAIL
[CSS Values and Units Test: attr 91]
expected: FAIL
[CSS Values and Units Test: attr 92]
expected: FAIL
@@ -238,3 +217,24 @@
[CSS Values and Units Test: attr 94]
expected: FAIL
[CSS Values and Units Test: attr 8]
expected: FAIL
[CSS Values and Units Test: attr 19]
expected: FAIL
[CSS Values and Units Test: attr 34]
expected: FAIL
[CSS Values and Units Test: attr 37]
expected: FAIL
[CSS Values and Units Test: attr 53]
expected: FAIL
[CSS Values and Units Test: attr 83]
expected: FAIL
[CSS Values and Units Test: attr 95]
expected: FAIL

View File

@@ -1,6 +0,0 @@
[calc-sibling-function-in-shadow-dom.html]
[originating element in Shadow DOM]
expected: FAIL
[Host children have sibling-index() and sibling-count() based on assignedNodes order]
expected: FAIL

View File

@@ -1,18 +0,0 @@
[calc-sibling-function-parsing.html]
[e.style['left'\] = "calc(1px * sibling-index())" should set the property value]
expected: FAIL
[e.style['left'\] = "calc(1px * sibling-index( ))" should set the property value]
expected: FAIL
[e.style['z-index'\] = "sibling-index()" should set the property value]
expected: FAIL
[e.style['left'\] = "calc(1px * sibling-count())" should set the property value]
expected: FAIL
[e.style['left'\] = "calc(1px * sibling-count( ))" should set the property value]
expected: FAIL
[e.style['z-index'\] = "sibling-count()" should set the property value]
expected: FAIL

View File

@@ -1,12 +0,0 @@
[calc-sibling-function.html]
[basic sibling-index() test]
expected: FAIL
[basic sibling-count() test]
expected: FAIL
[sibling-index() in calc() with percentage]
expected: FAIL
[sibling-count on pseudo-element]
expected: FAIL

View File

@@ -1,12 +0,0 @@
[sibling-function-invalidation.html]
[Initially 6th sibling]
expected: FAIL
[5th sibling after removal]
expected: FAIL
[Initially 6 siblings]
expected: FAIL
[5 siblings after removal]
expected: FAIL

View File

@@ -409,3 +409,39 @@
[AbortController interface: calling abort(optional any) on new AbortController() with too few arguments must throw TypeError]
expected: FAIL
[Document interface: operation moveBefore(Node, Node?)]
expected: FAIL
[Document interface: new Document() must inherit property "moveBefore(Node, Node?)" with the proper type]
expected: FAIL
[Document interface: calling moveBefore(Node, Node?) on new Document() with too few arguments must throw TypeError]
expected: FAIL
[Document interface: xmlDoc must inherit property "moveBefore(Node, Node?)" with the proper type]
expected: FAIL
[Document interface: calling moveBefore(Node, Node?) on xmlDoc with too few arguments must throw TypeError]
expected: FAIL
[DocumentFragment interface: operation moveBefore(Node, Node?)]
expected: FAIL
[DocumentFragment interface: document.createDocumentFragment() must inherit property "moveBefore(Node, Node?)" with the proper type]
expected: FAIL
[DocumentFragment interface: calling moveBefore(Node, Node?) on document.createDocumentFragment() with too few arguments must throw TypeError]
expected: FAIL
[Element interface: operation moveBefore(Node, Node?)]
expected: FAIL
[Element interface: element must inherit property "moveBefore(Node, Node?)" with the proper type]
expected: FAIL
[Element interface: calling moveBefore(Node, Node?) on element with too few arguments must throw TypeError]
expected: FAIL
[idlharness.window.html?include=Node]

View File

@@ -1,5 +1,5 @@
[createImageBitmap-serializable.html]
expected: TIMEOUT
expected: ERROR
[Serialize ImageBitmap created from a vector SVGImageElement]
expected: NOTRUN

View File

@@ -1,3 +1,3 @@
[iframe_sandbox_popups_escaping-1.html]
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
expected: FAIL
expected: TIMEOUT

View File

@@ -1,3 +1,3 @@
[iframe_sandbox_popups_escaping-2.html]
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
expected: TIMEOUT
expected: FAIL

View File

@@ -1,4 +1,4 @@
[iframe_sandbox_popups_escaping-3.html]
expected: TIMEOUT
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
expected: TIMEOUT
expected: FAIL

View File

@@ -1,5 +1,4 @@
[audio-tag.https.html]
expected: TIMEOUT
[Mixed-Content: Expects blocked for audio-tag to cross-http origin and keep-scheme redirection from https context.]
expected: FAIL

View File

@@ -1,3 +0,0 @@
[change-layout-in-error.html]
[Changing layout in window error handler should not result in lifecyle loop when resize observer loop limit is reached.]
expected: FAIL

View File

@@ -575,5 +575,20 @@
[Parsing: <wss://host/ !"$%&'()*+,-./:;<=>@[\\\]^_`{|}~> against <about:blank>]
expected: FAIL
[Parsing: <non-special:opaque ?hi> against <about:blank>]
expected: FAIL
[Parsing: <non-special:opaque #hi> against <about:blank>]
expected: FAIL
[Parsing: <non-special:opaque \t\t \t#hi> against <about:blank>]
expected: FAIL
[Parsing: <non-special:opaque \t\t #hi> against <about:blank>]
expected: FAIL
[Parsing: <non-special:opaque\t\t \r #hi> against <about:blank>]
expected: FAIL
[a-element-xhtml.xhtml?include=mailto]

View File

@@ -576,3 +576,18 @@
[Parsing: <wss://host/ !"$%&'()*+,-./:;<=>@[\\\]^_`{|}~> against <about:blank>]
expected: FAIL
[Parsing: <non-special:opaque ?hi> against <about:blank>]
expected: FAIL
[Parsing: <non-special:opaque #hi> against <about:blank>]
expected: FAIL
[Parsing: <non-special:opaque \t\t \t#hi> against <about:blank>]
expected: FAIL
[Parsing: <non-special:opaque \t\t #hi> against <about:blank>]
expected: FAIL
[Parsing: <non-special:opaque\t\t \r #hi> against <about:blank>]
expected: FAIL

View File

@@ -908,6 +908,21 @@
[Parsing: <wss://host/ !"$%&'()*+,-./:;<=>@[\\\]^_`{|}~> without base]
expected: FAIL
[Parsing: <non-special:opaque ?hi> without base]
expected: FAIL
[Parsing: <non-special:opaque #hi> without base]
expected: FAIL
[Parsing: <non-special:opaque \t\t \t#hi> without base]
expected: FAIL
[Parsing: <non-special:opaque \t\t #hi> without base]
expected: FAIL
[Parsing: <non-special:opaque\t\t \r #hi> without base]
expected: FAIL
[url-constructor.any.worker.html?include=file]
[Parsing: </> against <file://h/C:/a/b>]
@@ -1281,6 +1296,21 @@
[Parsing: <wss://host/ !"$%&'()*+,-./:;<=>@[\\\]^_`{|}~> without base]
expected: FAIL
[Parsing: <non-special:opaque ?hi> without base]
expected: FAIL
[Parsing: <non-special:opaque #hi> without base]
expected: FAIL
[Parsing: <non-special:opaque \t\t \t#hi> without base]
expected: FAIL
[Parsing: <non-special:opaque \t\t #hi> without base]
expected: FAIL
[Parsing: <non-special:opaque\t\t \r #hi> without base]
expected: FAIL
[url-constructor.any.html?include=file]
[Parsing: </> against <file://h/C:/a/b>]

View File

@@ -49,3 +49,51 @@
[<area>: Setting <a:/>.pathname = '\x00\x01\t\n\r\x1f !"#$%&'()*+,-./09:;<=>?@AZ[\\\]^_`az{|}~€Éé' UTF-8 percent encoding with the default encode set. Tabs and newlines are removed.]
expected: FAIL
[<a>: Setting <data:space ?query>.search = '' Trailing spaces and opaque paths]
expected: FAIL
[<area>: Setting <data:space ?query>.search = '' Trailing spaces and opaque paths]
expected: FAIL
[<a>: Setting <sc:space ?query>.search = '']
expected: FAIL
[<area>: Setting <sc:space ?query>.search = '']
expected: FAIL
[<a>: Setting <data:space ?query#fragment>.search = '' Trailing spaces and opaque paths]
expected: FAIL
[<area>: Setting <data:space ?query#fragment>.search = '' Trailing spaces and opaque paths]
expected: FAIL
[<a>: Setting <sc:space ?query#fragment>.search = '']
expected: FAIL
[<area>: Setting <sc:space ?query#fragment>.search = '']
expected: FAIL
[<a>: Setting <data:space #fragment>.hash = '' Trailing spaces and opaque paths]
expected: FAIL
[<area>: Setting <data:space #fragment>.hash = '' Trailing spaces and opaque paths]
expected: FAIL
[<a>: Setting <sc:space #fragment>.hash = '']
expected: FAIL
[<area>: Setting <sc:space #fragment>.hash = '']
expected: FAIL
[<a>: Setting <data:space ?query#fragment>.hash = '' Trailing spaces and opaque paths]
expected: FAIL
[<area>: Setting <data:space ?query#fragment>.hash = '' Trailing spaces and opaque paths]
expected: FAIL
[<a>: Setting <sc:space ?query#fragment>.hash = '']
expected: FAIL
[<area>: Setting <sc:space ?query#fragment>.hash = '']
expected: FAIL

View File

@@ -23,6 +23,30 @@
[URL: Setting <a:/>.pathname = '\x00\x01\t\n\r\x1f !"#$%&'()*+,-./09:;<=>?@AZ[\\\]^_`az{|}~€Éé' UTF-8 percent encoding with the default encode set. Tabs and newlines are removed.]
expected: FAIL
[URL: Setting <data:space ?query>.search = '' Trailing spaces and opaque paths]
expected: FAIL
[URL: Setting <sc:space ?query>.search = '']
expected: FAIL
[URL: Setting <data:space ?query#fragment>.search = '' Trailing spaces and opaque paths]
expected: FAIL
[URL: Setting <sc:space ?query#fragment>.search = '']
expected: FAIL
[URL: Setting <data:space #fragment>.hash = '' Trailing spaces and opaque paths]
expected: FAIL
[URL: Setting <sc:space #fragment>.hash = '']
expected: FAIL
[URL: Setting <data:space ?query#fragment>.hash = '' Trailing spaces and opaque paths]
expected: FAIL
[URL: Setting <sc:space ?query#fragment>.hash = '']
expected: FAIL
[url-setters.any.worker.html?include=javascript]
@@ -69,6 +93,30 @@
[URL: Setting <a:/>.pathname = '\x00\x01\t\n\r\x1f !"#$%&'()*+,-./09:;<=>?@AZ[\\\]^_`az{|}~€Éé' UTF-8 percent encoding with the default encode set. Tabs and newlines are removed.]
expected: FAIL
[URL: Setting <data:space ?query>.search = '' Trailing spaces and opaque paths]
expected: FAIL
[URL: Setting <sc:space ?query>.search = '']
expected: FAIL
[URL: Setting <data:space ?query#fragment>.search = '' Trailing spaces and opaque paths]
expected: FAIL
[URL: Setting <sc:space ?query#fragment>.search = '']
expected: FAIL
[URL: Setting <data:space #fragment>.hash = '' Trailing spaces and opaque paths]
expected: FAIL
[URL: Setting <sc:space #fragment>.hash = '']
expected: FAIL
[URL: Setting <data:space ?query#fragment>.hash = '' Trailing spaces and opaque paths]
expected: FAIL
[URL: Setting <sc:space ?query#fragment>.hash = '']
expected: FAIL
[url-setters.any.worker.html?include=mailto]

View File

@@ -33,14 +33,14 @@ jobs:
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@818d4b7b91585d195f67373fd9cb0332e31a7175 # v4.6.0
uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5.7.0
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
tags: |
latest
type=raw,value=${{ inputs.tag }}
- name: Build and push the Docker image
uses: docker/build-push-action@0adf9959216b96bec444f325f1e493d4aa344497 # v6.14.0
uses: docker/build-push-action@471d1dc4e07e5cdedd4c2171150001c434f0b7a4 # v6.15.0
with:
context: ./tools/docker
push: true

View File

@@ -0,0 +1,43 @@
// META: title=IndexedDB: request result events are delivered in order
// META: global=window,worker
// META: script=resources/support-promises.js
// META: script=resources/support.js
// META: script=resources/request-event-ordering-common.js
// META: timeout=long
// Spec: https://w3c.github.io/IndexedDB/#abort-transaction
'use strict';
eventsTest('large values mixed with small values', [
['get', 1],
['get', 2],
['get-empty', 5],
['count', 4],
['continue-empty', null],
['open', 1],
['continue', 2],
['open-empty', 5],
['getall', 4],
['open', 2],
['continue-empty', null],
['add', 5],
['get', 3],
['count', 5],
['get-empty', 6],
['put-with-id', 5],
['getall', 5],
['continue', 3],
['open-empty', 6],
['put', 6],
['error', 1],
['continue', 2],
['open', 4],
['get-empty', 7],
['count', 6],
['continue', 3],
['add', 7],
['getall', 7],
['error', 3],
['count', 7],
]);

View File

@@ -0,0 +1,28 @@
// META: title=IndexedDB: request result events are delivered in order
// META: global=window,worker
// META: script=resources/support-promises.js
// META: script=resources/support.js
// META: script=resources/request-event-ordering-common.js
// META: timeout=long
// Spec: https://w3c.github.io/IndexedDB/#abort-transaction
'use strict';
eventsTest('large value followed by small values', [
['get', 1],
['getall', 4],
['open', 2],
['continue-empty', null],
['get', 2],
['get-empty', 5],
['count', 4],
['continue-empty', null],
['open-empty', 5],
['add', 5],
['error', 1],
['continue', 2],
['get-empty', 6],
['put-with-id', 5],
['put', 6],
]);

View File

@@ -0,0 +1,19 @@
// META: title=IndexedDB: request result events are delivered in order
// META: global=window,worker
// META: script=resources/support-promises.js
// META: script=resources/support.js
// META: script=resources/request-event-ordering-common.js
// META: timeout=long
// Spec: https://w3c.github.io/IndexedDB/#abort-transaction
'use strict';
eventsTest('large values', [
['open', 1],
['get', 1],
['getall', 4],
['get', 3],
['continue', 3],
['open', 3],
]);

View File

@@ -0,0 +1,20 @@
// META: title=IndexedDB: request result events are delivered in order
// META: global=window,worker
// META: script=resources/support-promises.js
// META: script=resources/support.js
// META: script=resources/request-event-ordering-common.js
// META: timeout=long
// Spec: https://w3c.github.io/IndexedDB/#abort-transaction
'use strict';
eventsTest('small values', [
['get', 2], ['count', 4], ['continue-empty', null],
['get-empty', 5], ['add', 5], ['open', 2],
['continue', 2], ['get', 4], ['get-empty', 6],
['count', 5], ['put-with-id', 5], ['put', 6],
['error', 3], ['continue', 4], ['count', 6],
['get-empty', 7], ['open', 4], ['open-empty', 7],
['add', 7],
]);

View File

@@ -1,12 +1,3 @@
// META: title=IndexedDB: request result events are delivered in order
// META: global=window,worker
// META: script=resources/support-promises.js
// META: script=resources/support.js
// META: timeout=long
// Spec: https://w3c.github.io/IndexedDB/#abort-transaction
'use strict';
// Should be large enough to trigger large value handling in the IndexedDB
// engines that have special code paths for large values.
@@ -289,73 +280,3 @@ function eventsTest(label, operations) {
});
}, label);
}
eventsTest('small values', [
['get', 2], ['count', 4], ['continue-empty', null],
['get-empty', 5], ['add', 5], ['open', 2],
['continue', 2], ['get', 4], ['get-empty', 6],
['count', 5], ['put-with-id', 5], ['put', 6],
['error', 3], ['continue', 4], ['count', 6],
['get-empty', 7], ['open', 4], ['open-empty', 7],
['add', 7],
]);
eventsTest('large values', [
['open', 1],
['get', 1],
['getall', 4],
['get', 3],
['continue', 3],
['open', 3],
]);
eventsTest('large value followed by small values', [
['get', 1],
['getall', 4],
['open', 2],
['continue-empty', null],
['get', 2],
['get-empty', 5],
['count', 4],
['continue-empty', null],
['open-empty', 5],
['add', 5],
['error', 1],
['continue', 2],
['get-empty', 6],
['put-with-id', 5],
['put', 6],
]);
eventsTest('large values mixed with small values', [
['get', 1],
['get', 2],
['get-empty', 5],
['count', 4],
['continue-empty', null],
['open', 1],
['continue', 2],
['open-empty', 5],
['getall', 4],
['open', 2],
['continue-empty', null],
['add', 5],
['get', 3],
['count', 5],
['get-empty', 6],
['put-with-id', 5],
['getall', 5],
['continue', 3],
['open-empty', 6],
['put', 6],
['error', 1],
['continue', 2],
['open', 4],
['get-empty', 7],
['count', 6],
['continue', 3],
['add', 7],
['getall', 7],
['error', 3],
['count', 7],
]);

View File

@@ -259,6 +259,109 @@
<h1 data-expectedlabel="Call Us" data-testname="heading name from content with text-transform:capitalize" class="ex" style="text-transform:capitalize;">Call us</h1>
<h1 data-expectedlabel="call us" data-testname="heading name from content with text-transform:lowercase" class="ex" style="text-transform:lowercase;">Call us</h1>
<!-- “びょういんのかんじゃサービス” means “Hospital patient services” -->
<!-- text-transform:full-size-kana risks changing the headings meaning -->
<!-- by transforming the following words: -->
<!-- 1. びょういん (byōin = hospital) into びよういん (biyōin = beauty parlor) -->
<!-- 2. かんじゃ (kanja = patient) into かんじや (kanjiya = [no meaning]) -->
<h1>heading which visually transforms <span lang="ja">びょういん</span> (hospital) to
<span lang="ja">びよういん</span> (beauty parlor) using CSS
<code>text-transform:full-size-kana</code></h1>
<h3
lang="ja"
data-expectedlabel="びょういんのかんじゃサービス"
data-testname="heading name from content with text-transform:full-size-kana"
class="ex"
style="text-transform:full-size-kana;"
>びょういんのかんじゃサービス</h3>
<!-- Tests `Name from Each Child` edge case failures with an embedded `term` as a child element role. -->
<!-- https://w3c.github.io/accname/#comp_name_from_content_for_each_child -->
<h2>Elements with implicit button, heading, link roles containing element with
implicit term role</h2>
<button
data-expectedlabel="this is an example"
data-testname="implicit button name from content containing a dfn element"
class="ex iblock"
><span>this is an </span><dfn>example</dfn></button>
<h3
data-expectedlabel="this is an example"
data-testname="implicit heading name from content containing a dfn element"
class="ex iblock"
><span>this is an </span><dfn>example</dfn></h3>
<a
href="#"
data-expectedlabel="this is an example"
data-testname="implicit link name from content containing a dfn element"
class="ex iblock"
><span>this is an </span><dfn>example</dfn></a>
<h2>Elements with implicit button, heading, link roles containing element with
explicit term role</h2>
<button
data-expectedlabel="this is an example"
data-testname="implicit button name from content containing an element with explicit term role"
class="ex iblock"
><span>this is an </span><span role="term">example</span></button>
<h3
data-expectedlabel="this is an example"
data-testname="implicit heading name from content containing an element with explicit term role"
class="ex iblock"
><span>this is an </span><span role="term">example</span></h3>
<a
href="#"
data-expectedlabel="this is an example"
data-testname="implicit link name from content containing an element explicit with term role"
class="ex iblock"
><span>this is an </span><span role="term">example</span></a>
<h2>Elements with explicit button, heading, link roles containing element with
implicit term role</h2>
<div
role="button"
tabindex="0"
data-expectedlabel="this is an example"
data-testname="explicit button name from content containing a dfn element"
class="ex iblock"
><span>this is an </span><dfn>example</dfn></div>
<div
role="heading"
data-expectedlabel="this is an example"
data-testname="explicit heading name from content containing a dfn element"
class="ex iblock"
><span>this is an </span><dfn>example</dfn></div>
<div
role="link"
tabindex="0"
data-expectedlabel="this is an example"
data-testname="explicit link name from content containing a dfn element"
class="ex iblock"
><span>this is an </span><dfn>example</dfn></div>
<h2>Elements with explicit button, heading, link roles containing element with
explicit term role</h2>
<div
role="button"
tabindex="0"
data-expectedlabel="this is an example"
data-testname="explicit button name from content containing an element explicit with term role"
class="ex iblock"
><span>this is an </span><span role="term">example</span></div>
<div
role="heading"
data-expectedlabel="this is an example"
data-testname="explicit heading name from content containing an element explicit with term role"
class="ex iblock"
><span>this is an </span><span role="term">example</span></div>
<div
role="link"
tabindex="0"
data-expectedlabel="this is an example"
data-testname="explicit link name from content containing an element explicit with term role"
class="ex iblock"
><span>this is an </span><span role="term">example</span></div>
<script>
AriaUtils.verifyLabelsBySelector(".ex");
</script>

View File

@@ -1,52 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<title>Name Comp: Name From Content (Tentative)</title>
<meta charset="utf-8">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/resources/testdriver-actions.js"></script>
<script src="/wai-aria/scripts/aria-utils.js"></script>
</head>
<body>
<!-- “びょういんのかんじゃサービス” means “Hospital patient services” -->
<!-- text-transform:full-size-kana visually changes: -->
<!-- 1. びょういん (byōin = hospital) into びよういん (biyōin = beauty parlor) -->
<!-- 2. かんじゃ (kanja = patient) into かんじや (kanjiya = [no meaning]) -->
<!-- ...causing the whole heading to become nonsensical. -->
<h1>heading which visually transforms <span lang="ja">びょういん</span> (hospital) to <span lang="ja">びよういん</span> (beauty parlor) using CSS <code>text-transform:full-size-kana</code></h1>
<h3 lang="ja" data-expectedlabel="びょういんのかんじゃサービス" data-testname="heading name from content with text-transform:full-size-kana" class="ex" style="text-transform:full-size-kana;">びょういんのかんじゃサービス</h3>
<!-- Tests `Name from Each Child` edge case failures with an embedded `term` as a child element role. -->
<!-- https://w3c.github.io/accname/#comp_name_from_content_for_each_child -->
<h2>Elements with implicit button, heading, link roles containing element with implicit term role</h2>
<button data-expectedlabel="this is an example" data-testname="implicit button name from content containing a dfn element" class="ex iblock"><span>this is an </span><dfn>example</dfn></button>
<h3 data-expectedlabel="this is an example" data-testname="implicit heading name from content containing a dfn element" class="ex iblock"><span>this is an </span><dfn>example</dfn></h3>
<a href="#" data-expectedlabel="this is an example" data-testname="implicit link name from content containing a dfn element" class="ex iblock"><span>this is an </span><dfn>example</dfn></a>
<h2>Elements with implicit button, heading, link roles containing element with explicit term role</h2>
<button data-expectedlabel="this is an example" data-testname="implicit button name from content containing an element with explicit term role" class="ex iblock"><span>this is an </span><span role="term">example</span></button>
<h3 data-expectedlabel="this is an example" data-testname="implicit heading name from content containing an element with explicit term role" class="ex iblock"><span>this is an </span><span role="term">example</span></h3>
<a href="#" data-expectedlabel="this is an example" data-testname="implicit link name from content containing an element explicit with term role" class="ex iblock"><span>this is an </span><span role="term">example</span></a>
<h2>Elements with explicit button, heading, link roles containing element with implicit term role</h2>
<div role="button" tabindex="0" data-expectedlabel="this is an example" data-testname="explicit button name from content containing a dfn element" class="ex iblock"><span>this is an </span><dfn>example</dfn></div>
<div role="heading" data-expectedlabel="this is an example" data-testname="explicit heading name from content containing a dfn element" class="ex iblock"><span>this is an </span><dfn>example</dfn></div>
<div role="link" tabindex="0" data-expectedlabel="this is an example" data-testname="explicit link name from content containing a dfn element" class="ex iblock"><span>this is an </span><dfn>example</dfn></div>
<h2>Elements with explicit button, heading, link roles containing element with explicit term role</h2>
<div role="button" tabindex="0" data-expectedlabel="this is an example" data-testname="explicit button name from content containing an element explicit with term role" class="ex iblock"><span>this is an </span><span role="term">example</span></div>
<div role="heading" data-expectedlabel="this is an example" data-testname="explicit heading name from content containing an element explicit with term role" class="ex iblock"><span>this is an </span><span role="term">example</span></div>
<div role="link" tabindex="0" data-expectedlabel="this is an example" data-testname="explicit link name from content containing an element explicit with term role" class="ex iblock"><span>this is an </span><span role="term">example</span></div>
<script>
AriaUtils.verifyLabelsBySelector(".ex");
</script>
</body>
</html>

View File

@@ -1,12 +1,13 @@
<!DOCTYPE html>
<title>Assures no crash upon call of LanguageDetectorFactory.capabilities() on a detached document</title>
<link rel="author" href="mailto:caseq@chromium.org">
<title>Assures no crash upon call of LanguageDetector.availability() on a detached document</title>
<link rel="author" href="mailto:christinesm@chromium.org">
<link rel="help" href="https://issues.chromium.org/issues/384233287">
<body>
<iframe src="about:blank"></iframe>
<script>
const factory = frames[0].ai.languageDetector;
const detector = factory.create();
document.getElementsByTagName("iframe")[0].remove();
factory.capabilities();
detector.availability();
</script>
</body>

View File

@@ -1,11 +0,0 @@
// META: title=capabilities test
// META: global=window,worker
'use strict';
promise_test(async t => {
const languageDetectorCapabilities = await ai.languageDetector.capabilities();
const availability = languageDetectorCapabilities.available;
assert_not_equals(availability, "no");
// TODO(crbug.com/349927087): Add languageDetectorCapabilities.languageAvailable("en") once implemented.
});

View File

@@ -3,6 +3,13 @@
'use strict';
promise_test(async t => {
// Language detection is available after call to `create()`.
const detector = await ai.languageDetector.create();
const availability = await detector.availability();
assert_equals(availability, 'available');
}, 'Simple AILanguageDetector.availability() call');
promise_test(async t => {
const detector = await ai.languageDetector.create();
const results = await detector.detect('this string is in English');
@@ -28,7 +35,8 @@ promise_test(async t => {
controller.abort();
const detector = await ai.languageDetector.create();
const detectPromise = await detector.detect('this string is in English');
const detectPromise =
detector.detect('this string is in English', {signal: controller.signal});
await promise_rejects_dom(t, 'AbortError', detectPromise);
}, 'AILanguageDetector.detect() call with an aborted signal.');

View File

@@ -27,17 +27,11 @@ promise_test(async t => {
// Creating the translator with user activation succeeds.
await createTranslator(languagePair);
// Creating it should have switched it to readily.
const capabilities = await ai.translator.capabilities();
const {sourceLanguage, targetLanguage} = languagePair;
assert_equals(
capabilities.languagePairAvailable(sourceLanguage, targetLanguage),
'readily');
// Creating it should have switched it to available.
const availability = await ai.translator.availability(languagePair);
assert_equals(availability, 'available');
// Now that it is readily, we should no longer need user activation.
// Now that it is available, we should no longer need user activation.
await ai.translator.create(languagePair);
}, 'AITranslator.create() requires user activation when availability is "downloadable.');
@@ -131,8 +125,10 @@ promise_test(async t => {
// Must have at least 2 progress events, one for 0 and one for 1.
assert_greater_than_equal(progressEvents.length, 2);
// 0 should be the first event and 1 should be the last event.
assert_equals(progressEvents.at(0).loaded, 0);
assert_equals(progressEvents.at(1).loaded, 1);
assert_equals(progressEvents.at(-1).loaded, 1);
// All progress events must have a total of 1.
for (const progressEvent of progressEvents) {

View File

@@ -4,6 +4,9 @@ def main(request, response):
The request should typically have two query parameters:
status - The status to use for the redirection. Defaults to 302.
location - The resource to redirect to.
This utility optionally supports CORS (iff the `enable-cors` query param is
present).
"""
status = 302
if b"status" in request.GET:
@@ -17,3 +20,10 @@ def main(request, response):
location = request.GET.first(b"location")
response.headers.set(b"Location", location)
if request.GET.get(b"enable-cors") is not None:
origin = request.headers.get(b"Origin")
if origin:
response.headers.set(b"Content-Type", b"text/plain")
response.headers.set(b"Access-Control-Allow-Origin", origin)
response.headers.set(b"Access-Control-Allow-Credentials", 'true')

View File

@@ -8,7 +8,7 @@
'use strict';
test(() => {
promise_test(async () => {
const iframe = document.createElement('iframe');
document.body.appendChild(iframe);
const frame_window = iframe.contentWindow;

View File

@@ -17,7 +17,7 @@ pressure_test(async (t) => {
});
const syncObserver = new SyncPressureObserver(t);
await syncObserver.observer().observe('cpu', {sampleInterval: 100});
await syncObserver.observer().observe('cpu');
await update_virtual_pressure_source('cpu', 'critical');
await syncObserver.waitForUpdate();
@@ -32,6 +32,30 @@ pressure_test(async (t) => {
assert_equals(syncObserver.changes()[1][0].state, 'nominal');
assert_equals(syncObserver.changes().length, 2);
}, 'Changes that fail the "has change in data" test are discarded.');
}, 'Changes that fail the "should dispatch" test are discarded.');
pressure_test(async (t) => {
await create_virtual_pressure_source('cpu');
t.add_cleanup(async () => {
await remove_virtual_pressure_source('cpu');
});
const syncObserver = new SyncPressureObserver(t);
await syncObserver.observer().observe('cpu', {sampleInterval: 100});
await update_virtual_pressure_source('cpu', 'critical');
await syncObserver.waitForUpdate();
assert_equals(syncObserver.changes()[0][0].state, 'critical');
await update_virtual_pressure_source('cpu', 'critical');
await syncObserver.waitForUpdate();
assert_equals(syncObserver.changes()[1][0].state, 'critical');
await update_virtual_pressure_source('cpu', 'nominal');
await syncObserver.waitForUpdate();
assert_equals(syncObserver.changes()[2][0].state, 'nominal');
assert_equals(syncObserver.changes().length, 3);
}, 'Updates should be received even when no changes when sampleInterval is set.');
mark_as_done();

View File

@@ -136,6 +136,12 @@ switch (_globalScope) {
throw new Error(`Invalid variant '${_globalScope}'`);
}
promise_setup(async () => {
// Ensure window's document has focus so that the global under test can
// receive data.
await test_driver.click(document.documentElement);
});
const pressure_test =
_pressureTestHelper.pressure_test.bind(_pressureTestHelper);
const mark_as_done = _pressureTestHelper.mark_as_done.bind(_pressureTestHelper);

View File

@@ -0,0 +1,103 @@
<!DOCTYPE HTML>
<html>
<head>
<title>Scripts injected via `eval` are not allowed with `trusted-types-eval` when `require-trusted-types-for 'script'` is report only.</title>
<script src='/resources/testharness.js' nonce='dummy'></script>
<script src='/resources/testharnessreport.js' nonce='dummy'></script>
<!-- CSP served: script-src 'nonce-dummy' 'trusted-types-eval' -->
<!-- Report Only CSP served: require-trusted-types-for 'script' -->
</head>
<body>
<h1>Scripts injected via `eval` are not allowed with `trusted-types-eval` when `require-trusted-types-for 'script'` is report only.</h1>
<div id='log'></div>
<script nonce='dummy'>
trustedTypes.createPolicy('default', { createScript: s => s });
var evalScriptRan = false;
var indirectEvalScriptRan = false;
var functionScriptRan = false;
var setTimeoutScriptRan = false;
async_test(function(t) {
var eventHandler = t.step_func_done(function(e) {
assert_false(evalScriptRan);
assert_equals(e.effectiveDirective, 'script-src');
assert_equals(e.blockedURI, 'eval');
});
window.addEventListener('securitypolicyviolation', eventHandler);
t.add_cleanup(() => {
window.removeEventListener('securitypolicyviolation', eventHandler);
});
assert_throws_js(Error,
function() {
try {
eval("evalScriptRan = true;");
} catch (e) {
throw new Error();
}
});
}, "Scripts injected via direct `eval` are not allowed with `trusted-types-eval` when `require-trusted-types-for 'script'` is report only.");
async_test(function(t) {
var eventHandler = t.step_func_done(function(e) {
assert_false(indirectEvalScriptRan);
assert_equals(e.effectiveDirective, 'script-src');
assert_equals(e.blockedURI, 'eval');
});
window.addEventListener('securitypolicyviolation', eventHandler);
t.add_cleanup(() => {
window.removeEventListener('securitypolicyviolation', eventHandler);
});
assert_throws_js(Error,
function() {
try {
eval?.("indirectEvalScriptRan = true;");
} catch (e) {
throw new Error();
}
});
}, "Scripts injected via indirect `eval` are not allowed with `trusted-types-eval` when `require-trusted-types-for 'script'` is report only.");
async_test(function(t) {
var eventHandler = t.step_func_done(function(e) {
assert_false(functionScriptRan);
assert_equals(e.effectiveDirective, 'script-src');
assert_equals(e.blockedURI, 'eval');
});
window.addEventListener('securitypolicyviolation', eventHandler);
t.add_cleanup(() => {
window.removeEventListener('securitypolicyviolation', eventHandler);
});
assert_throws_js(Error,
function() {
try {
new Function("functionScriptRan = true;")();
} catch (e) {
throw new Error();
}
});
}, "Scripts injected via `new Function` are not allowed with `trusted-types-eval` when `require-trusted-types-for 'script'` is report only.");
async_test(function(t) {
var eventHandler = t.step_func_done(function(e) {
assert_false(setTimeoutScriptRan);
assert_equals(e.effectiveDirective, 'script-src');
assert_equals(e.blockedURI, 'eval');
});
window.addEventListener('securitypolicyviolation', eventHandler);
t.add_cleanup(() => {
window.removeEventListener('securitypolicyviolation', eventHandler);
});
setTimeout("setTimeoutScriptRan = true;", 0);
}, "Scripts injected via `setTimeout` are not allowed with `trusted-types-eval` when `require-trusted-types-for 'script'` is report only.");
</script>
</body>
</html>

View File

@@ -0,0 +1,6 @@
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Cache-Control: post-check=0, pre-check=0, false
Pragma: no-cache
Content-Security-Policy: script-src 'nonce-dummy' 'trusted-types-eval'
Content-Security-Policy-Report-Only: require-trusted-types-for 'script';

View File

@@ -0,0 +1,88 @@
<!DOCTYPE HTML>
<html>
<head>
<title>Scripts injected via `eval` are allowed with `trusted-types-eval` and `require-trusted-types-for 'script'`.</title>
<script src='/resources/testharness.js' nonce='dummy'></script>
<script src='/resources/testharnessreport.js' nonce='dummy'></script>
<!-- CSP served: script-src 'nonce-dummy' 'trusted-types-eval'; require-trusted-types-for 'script'; -->
</head>
<body>
<h1>Scripts injected via `eval` are allowed with `trusted-types-eval` and `require-trusted-types-for 'script'`.</h1>
<div id='log'></div>
<script nonce='dummy'>
trustedTypes.createPolicy('default', {createScript: s => s});
var evalScriptRan = false;
var indirectEvalScriptRan = false;
var functionScriptRan = false;
var setTimeoutScriptRan = false;
async_test(function(t) {
var eventHandler = t.unreached_func('No CSP violation report has fired.');
window.addEventListener('securitypolicyviolation', eventHandler);
t.add_cleanup(() => {
window.removeEventListener('securitypolicyviolation', eventHandler);
});
try {
eval("evalScriptRan = true;");
} catch (e) {
assert_unreached("`eval` should be allowed with `trusted-types-eval` and `require-trusted-types-for 'script'`.");
}
assert_true(evalScriptRan);
t.done();
}, "Script injected via direct `eval` is allowed with `trusted-types-eval` and `require-trusted-types-for 'script'`.");
async_test(function(t) {
var eventHandler = t.unreached_func('No CSP violation report has fired.');
window.addEventListener('securitypolicyviolation', eventHandler);
t.add_cleanup(() => {
window.removeEventListener('securitypolicyviolation', eventHandler);
});
try {
eval?.("indirectEvalScriptRan = true;");
} catch (e) {
assert_unreached("indirect `eval` should be allowed with `trusted-types-eval` and `require-trusted-types-for 'script'`.");
}
assert_true(indirectEvalScriptRan);
t.done();
}, "Script injected via indirect `eval` is allowed with `trusted-types-eval` and `require-trusted-types-for 'script'`.");
async_test(function(t) {
var eventHandler = t.unreached_func('No CSP violation report has fired.');
window.addEventListener('securitypolicyviolation', eventHandler);
t.add_cleanup(() => {
window.removeEventListener('securitypolicyviolation', eventHandler);
});
try {
new Function("functionScriptRan = true;")();
} catch (e) {
assert_unreached("`new Function` should be allowed with `trusted-types-eval` and `require-trusted-types-for 'script'`.");
}
assert_true(functionScriptRan);
t.done();
}, "Script injected via `new Function` is allowed with `trusted-types-eval` and `require-trusted-types-for 'script'`.");
async_test(function(t) {
var eventHandler = t.unreached_func('No CSP violation report has fired.');
window.addEventListener('securitypolicyviolation', eventHandler);
t.add_cleanup(() => {
window.removeEventListener('securitypolicyviolation', eventHandler);
});
try {
setTimeout("setTimeoutScriptRan = true;", 0);
} catch (e) {
assert_unreached("`setTimeout` should be allowed with `trusted-types-eval` and `require-trusted-types-for 'script'`.");
}
setTimeout(() => {
assert_true(setTimeoutScriptRan);
t.done();
}, 0);
}, "Script injected via `setTimeout` is allowed with `trusted-types-eval` and `require-trusted-types-for 'script'`.");
</script>
</body>
</html>

View File

@@ -0,0 +1,5 @@
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Cache-Control: post-check=0, pre-check=0, false
Pragma: no-cache
Content-Security-Policy: script-src 'nonce-dummy' 'trusted-types-eval'; require-trusted-types-for 'script';

View File

@@ -0,0 +1,101 @@
<!DOCTYPE HTML>
<html>
<head>
<title>Scripts injected via `eval` are not allowed with `trusted-types-eval` without `require-trusted-types-for 'script'`.</title>
<script src='/resources/testharness.js' nonce='dummy'></script>
<script src='/resources/testharnessreport.js' nonce='dummy'></script>
<!-- CSP served: script-src 'nonce-dummy' 'trusted-types-eval' -->
</head>
<body>
<h1>Scripts injected via `eval` are not allowed with `trusted-types-eval` without `require-trusted-types-for 'script'`.</h1>
<div id='log'></div>
<script nonce='dummy'>
var evalScriptRan = false;
var indirectEvalScriptRan = false;
var functionScriptRan = false;
var setTimeoutScriptRan = false;
async_test(function(t) {
var eventHandler = t.step_func_done(function(e) {
assert_false(evalScriptRan);
assert_equals(e.effectiveDirective, 'script-src');
assert_equals(e.blockedURI, 'eval');
});
window.addEventListener('securitypolicyviolation', eventHandler);
t.add_cleanup(() => {
window.removeEventListener('securitypolicyviolation', eventHandler);
});
assert_throws_js(Error,
function() {
try {
eval("evalScriptRan = true;");
} catch (e) {
throw new Error();
}
});
}, "Scripts injected via direct `eval` are not allowed with `trusted-types-eval` without `require-trusted-types-for 'script'`.");
async_test(function(t) {
var eventHandler = t.step_func_done(function(e) {
assert_false(indirectEvalScriptRan);
assert_equals(e.effectiveDirective, 'script-src');
assert_equals(e.blockedURI, 'eval');
});
window.addEventListener('securitypolicyviolation', eventHandler);
t.add_cleanup(() => {
window.removeEventListener('securitypolicyviolation', eventHandler);
});
assert_throws_js(Error,
function() {
try {
eval?.("indirectEvalScriptRan = true;");
} catch (e) {
throw new Error();
}
});
}, "Scripts injected via indirect `eval` are not allowed with `trusted-types-eval` without `require-trusted-types-for 'script'`.");
async_test(function(t) {
var eventHandler = t.step_func_done(function(e) {
assert_false(functionScriptRan);
assert_equals(e.effectiveDirective, 'script-src');
assert_equals(e.blockedURI, 'eval');
});
window.addEventListener('securitypolicyviolation', eventHandler);
t.add_cleanup(() => {
window.removeEventListener('securitypolicyviolation', eventHandler);
});
assert_throws_js(Error,
function() {
try {
new Function("functionScriptRan = true;")();
} catch (e) {
throw new Error();
}
});
}, "Scripts injected via `new Function` are not allowed with `trusted-types-eval` without `require-trusted-types-for 'script'`.");
async_test(function(t) {
var eventHandler = t.step_func_done(function(e) {
assert_false(setTimeoutScriptRan);
assert_equals(e.effectiveDirective, 'script-src');
assert_equals(e.blockedURI, 'eval');
});
window.addEventListener('securitypolicyviolation', eventHandler);
t.add_cleanup(() => {
window.removeEventListener('securitypolicyviolation', eventHandler);
});
setTimeout("setTimeoutScriptRan = true;", 0);
}, "Scripts injected via `setTimeout` are not allowed with `trusted-types-eval` without `require-trusted-types-for 'script'`.");
</script>
</body>
</html>

View File

@@ -0,0 +1,5 @@
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Cache-Control: post-check=0, pre-check=0, false
Pragma: no-cache
Content-Security-Policy: script-src 'nonce-dummy' 'trusted-types-eval'

View File

@@ -0,0 +1,11 @@
<!DOCTYPE html>
<title>Anchor-positioned element attempting to anchor to itself as a fallback</title>
<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
<link rel="help" href="https://issues.chromium.org/issues/401633680">
<style>
@position-try --pf {
position-anchor: --problem;
}
</style>
<div style="anchor-name:--a;"></div>
<div style="position:absolute; anchor-name:--problem; position-anchor:--a; left:anchor(right); margin-left:10px; position-try-fallbacks:--pf;"></div>

View File

@@ -0,0 +1,66 @@
<!DOCTYPE html>
<title>CSS Anchor Positioning: position-try-order behavior with margins</title>
<link rel="help" href="https://drafts.csswg.org/css-anchor-position-1/#position-try-order-property">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<style>
#cb {
position: absolute;
width: 400px;
height: 400px;
border: 1px solid black;
}
#target, #ref {
position: absolute;
left: 450px; /* force fallback */
height: 40px;
background-color: skyblue;
}
#ref {
background-color: seagreen;
}
@position-try --margin {
left:0px;
right:0px;
margin: 100px;
}
@position-try --no-margin {
left:0px;
right:0px;
}
</style>
<style id=style>
</style>
<div id=cb>
<div id=target></div>
<div id=ref></div>
</div>
<script>
// Test that an element with the specified `position_try` gets the same
// position as a reference element with `position_try_expected`.
function test_position_try_order(position_try, position_try_expected) {
test((t) => {
style.textContent = `
#target {
position-try: ${position_try};
}
#ref {
position-try: ${position_try_expected};
}
`;
assert_true(CSS.supports('position-try', 'normal --x'));
assert_equals(target.offsetLeft, ref.offsetLeft, 'offsetLeft');
assert_equals(getComputedStyle(target).marginLeft, getComputedStyle(ref).marginLeft, 'marginLeft');
}, `${position_try} | ${position_try_expected}`);
}
// Margin does not affect the inset-modified containing block size so the first option should get picked.
test_position_try_order('most-width --margin, --no-margin', '--margin');
test_position_try_order('most-width --no-margin, --margin', '--no-margin');
test_position_try_order('most-height --margin, --no-margin', '--margin');
test_position_try_order('most-height --no-margin, --margin', '--no-margin');
</script>

View File

@@ -9,7 +9,7 @@
<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1910153">
<!-- The background-clip:text and simple block examples should theoretically render the same,
but we allow a slight difference because of different painting codepaths. -->
<meta name="fuzzy" content="maxDifference=0-2; totalPixels=0-6500">
<meta name="fuzzy" content="maxDifference=0-2; totalPixels=0-7100">
<link rel="match" href="background-gradient-interpolation-001.html">
<style>
:root {

View File

@@ -6,7 +6,7 @@
<link rel="author" title="Levi Weintraub" href="mailto:leviw@chromium.org">
<link rel="help" href="http://www.w3.org/TR/css3-background/#the-border-image-repeat">
<meta name="assert" content="border-image-repeat: space property spaces out background image that doesn't fit an even number of times.">
<meta name="fuzzy" content="maxDifference=0-80; totalPixels=0-1728">
<meta name="fuzzy" content="maxDifference=0-80; totalPixels=0-3850">
<link rel="match" href="reference/border-image-space-001-ref.html">
<style>
.borderContainer {

View File

@@ -10,7 +10,7 @@
-->
<link rel="help" href="http://www.w3.org/TR/css3-background/#the-border-image-repeat">
<link rel="match" href="reference/css3-border-image-repeat-repeat-ref.html">
<meta name="fuzzy" content="maxDifference=0-58;totalPixels=0-412">
<meta name="fuzzy" content="maxDifference=0-58;totalPixels=0-5300">
<style>
div {
border: red solid 18px;

View File

@@ -0,0 +1,23 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>CSS Borders and Box Decorations 4: 'corner-shape' parametric rendering</title>
<canvas id="target" width="400" height="400"></canvas>
<script src="resources/resolve-corner-style.js"></script>
<script src="resources/corner-utils.js"></script>
<script src="resources/corner-shape.js"></script>
<script>
const canvas = document.getElementById("target");
const params = new URLSearchParams(location.search);
const width = params.get("width") || 200;
const height = params.get("height") || 100;
canvas.width = width * 3;
canvas.height = height * 3;
canvas.style.top = -height + "px";
canvas.style.left = -width + "px";
canvas.style.position = "relative";
const ctx = canvas.getContext("2d");
ctx.translate(width, height);
const style = resolve_corner_style(Object.fromEntries(params.entries()), width, height);
style['background-color'] = "green";
render_rect_with_corner_shapes(style, ctx, width, height);
</script>

View File

@@ -0,0 +1,32 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>CSS Borders and Box Decorations 4: 'corner-shape' parametric rendering</title>
<link rel="help" href="https://drafts.csswg.org/css-borders-4/#corner-shaping">
<link rel="match" href="corner-shape-any-ref.html">
<meta name="variant" content="?corner-shape=squircle&border-radius=50%">
<meta name="variant" content="?corner-shape=squircle&border-top-left-radius=30%">
<meta name="variant" content="?corner-shape=squircle&border-top-right-radius=30px">
<meta name="variant" content="?corner-shape=straight&border-bottom-leftradius=5px">
<meta name="variant" content="?corner-shape=superellipse(5.2)&border-radius=40%">
<meta name="variant" content="?corner-top-left-shape=scoop&corner-top-right-shape=scoop&border-radius=50%">
<meta name="variant" content="?corner-shape=superellipse(8)&border-top-right-radius=33px">
<meta name="variant" content="?corner-top-right-shape=superellipse(0.1)&border-top-right-radius=50px">
<meta name="variant" content="?corner-bottom-left-shape=bevel&border-bottom-left-radius=30px">
<meta name="variant" content="?corner-bottom-right-shape=superellipse(1.9)&border-bottom-right-radius=50%">
<meta name="fuzzy" content="maxDifference=0-180;totalPixels=0-520">
<style>
#target {
width: 200px;
height: 100px;
box-sizing: border-box;
background: green;
}
</style>
<div id="target"></div>
<script>
const target = document.getElementById("target");
const params = new URLSearchParams(location.search);
for (const [k, v] of params) {
target.style[k] = v;
}
</script>

View File

@@ -1,48 +0,0 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>CSS Borders and Box Decorations 4: 'corner-shape' full squircle</title>
<canvas id="target" width="200" height="100"></canvas>
<script src="resources/resolve-corner-style.js"></script>
<script src="resources/corner-math.js"></script>
<script>
const canvas = document.getElementById("target");
const ctx = canvas.getContext("2d");
let cursor = [0, 0]
function cornerTo(x1, y1, k) {
// ctx.lineTo(x1, y1);
const cp = control_points_for_superellipse(k, cursor, [x1, y1]).map(
([x, y]) => [cursor[0] + x * (x1 - cursor[0]), cursor[1] + y * (y1 - cursor[1])]);
ctx.bezierCurveTo(...cp[0], ...cp[1], ...cp[2]);
ctx.bezierCurveTo(...cp[3], ...cp[4], x1, y1);
cursor = [x1, y1];
}
function moveTo(x, y) {
ctx.moveTo(x, y);
cursor = [x, y];
}
function lineTo(x, y) {
ctx.lineTo(x, y);
cursor = [x, y];
}
const params = new URLSearchParams(location.search);
const {width, height} = canvas;
const style = resolve_corner_style(Object.fromEntries(params.entries()), width, height);
ctx.beginPath();
moveTo(width - style["border-top-right-radius"][0], 0);
cornerTo(width, style["border-top-right-radius"][1], style["corner-top-right-shape"]);
lineTo(width, height - style["border-bottom-right-radius"][1]);
cornerTo(width - style["border-bottom-right-radius"][0], height, 1 / style["corner-bottom-right-shape"]);
lineTo(style["border-bottom-left-radius"][0], height);
cornerTo(0, height - style["border-bottom-left-radius"][1], style["corner-bottom-left-shape"])
lineTo(0, style["border-top-left-radius"][1]);
cornerTo(style["border-top-left-radius"][0], 0, 1 / style["corner-top-left-shape"]);
moveTo(width - style["border-top-right-radius"][0], 0);
ctx.fillStyle = "green";
ctx.closePath();
ctx.fill();
</script>

View File

@@ -1,31 +0,0 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>CSS Borders and Box Decorations 4: 'corner-shape' full squircle</title>
<link rel="help" href="https://drafts.csswg.org/css-borders-4/#corner-shaping">
<link rel="match" href="corner-shape-fill-any-ref.html">
<meta name="variant" content="?corner-shape=squircle&border-radius=50%">
<meta name="variant" content="?corner-shape=squircle&border-radius=10%">
<meta name="variant" content="?corner-shape=squircle&border-radius=30px">
<meta name="variant" content="?corner-shape=straight&border-radius=5px">
<meta name="variant" content="?corner-shape=superellipse(5.2)&border-radius=50%">
<meta name="variant" content="?corner-shape=superellipse(5.2)&border-radius=33px">
<meta name="variant" content="?corner-top-right-shape=scoop&border-radius=50px">
<meta name="variant" content="?corner-bottom-left-shape=scoop&border-radius=10%">
<meta name="variant" content="?corner-bottom-right-shape=scoop&border-radius=50%">
<meta name="fuzzy" content="maxDifference=0-128;totalPixels=0-500">
<style>
#target {
width: 200px;
height: 100px;
box-sizing: border-box;
background: green;
}
</style>
<div id="target"></div>
<script>
const target = document.getElementById("target");
const params = new URLSearchParams(location.search);
for (const [k, v] of params) {
target.style[k] = v;
}
</script>

View File

@@ -1,51 +0,0 @@
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/**
* @param {number} s
* @param {number} t
* @returns {x: number, y: number}
*/
function se(s, t = 0.5) {
const curvature = Math.pow(2, s);
const x = superellipse_at(curvature);
const y = superellipse_at(curvature, 1 - t);
return {x, y};
}
/**
*
* @param {number} k
* @returns Array<[number, number]>
*/
function control_points_for_superellipse(k) {
const p = [
1.2430920942724248, 2.010479023614843, 0.32922901179443753,
0.2823023142212073, 1.3473704261055421, 2.9149468637949814,
0.9106507102917086
];
const s = Math.log2(k);
const absS = Math.abs(s);
const slope =
p[0] + (p[6] - p[0]) * 0.5 * (1 + Math.tanh(p[5] * (absS - p[1])));
const base = 1 / (1 + Math.exp(-slope * (0 - p[1])));
const logistic = 1 / (1 + Math.exp(-slope * (absS - p[1])));
const a = (logistic - base) / (1 - base);
const b = p[2] * Math.exp(-p[3] * absS ** p[4]);
const P3 = se(absS, 0.5);
const P1 = {x: a, y: 1};
const P5 = {x: 1, y: a};
if (s < 0) {
[P1.x, P1.y] = [1 - P1.y, 1 - P1.x];
[P3.x, P3.y] = [1 - P3.y, 1 - P3.x];
[P5.x, P5.y] = [1 - P5.y, 1 - P5.x];
}
const P2 = {x: P3.x - b, y: P3.y + b};
const P4 = {x: P3.x + b, y: P3.y - b};
return [P1, P2, P3, P4, P5].map(({x, y}) => [x, 1 - y]);
}

View File

@@ -0,0 +1,166 @@
/**
* Use short lines that follow the superellipse formula to generate
* a path that approximates a superellipse.
*
* @param {CanvasRenderingContext2D} ctx
* @param {number} ax
* @param {number} ay
* @param {number} bx
* @param {number} by
* @param {number} curvature
* @param {*} phase
* @param {*} direction
* @returns
*/
function add_corner(ctx, ax, ay, bx, by, curvature) {
const vertical_first = Math.sign(bx - ax) === Math.sign(by - ay);
function map_point({ x, y }) {
if (vertical_first) {
y = 1 - y;
} else {
[x, y] = [1 - y, x];
}
return [ax + x * (bx - ax), ay + y * (by - ay)];
}
if (curvature > 1000) {
ctx.lineTo(...map_point({ x: 0, y: 1 }));
ctx.lineTo(...map_point({ x: 1, y: 1 }));
ctx.lineTo(...map_point({ x: 0, y: 1 }));
return;
}
if (curvature <= 0.001) {
ctx.lineTo(...map_point({ x: 0, y: 1 }));
ctx.lineTo(...map_point({ x: 0, y: 0 }));
ctx.lineTo(...map_point({ x: 1, y: 0 }));
return;
}
function xy_for_t(t) {
return map_point(superellipse(curvature, t));
}
ctx.lineTo(ax, ay);
const t_values = new Set();
const antialiasing_offset = 0.25;
for (
let x = Math.min(ax, bx) + antialiasing_offset;
x < Math.max(ax, bx);
++x
) {
const nx = (x - ax) / (bx - ax);
const t = vertical_first
? superellipse_t_for_x(nx, curvature)
: superellipse_t_for_y(1 - nx, curvature);
if (t > 0 && t < 1) t_values.add(t);
}
for (
let y = Math.min(ay, by) + antialiasing_offset;
y < Math.max(ay, by);
++y
) {
const ny = (y - ay) / (by - ay);
const t = vertical_first
? superellipse_t_for_y(1 - ny, curvature)
: superellipse_t_for_x(1 - ny, curvature);
if (t > 0 && t < 1) t_values.add(t);
}
for (const t of [...t_values].sort()) {
const [x, y] = xy_for_t(t);
ctx.lineTo(x, y);
}
ctx.lineTo(bx, by);
}
/**
*
* @param {{
* 'corner-top-left-shape': number,
* 'corner-top-right-shape': number,
* 'corner-bottom-right-shape': number,
* 'corner-bottom-left-shape': number,
* 'border-top-left-radius': [number, number],
* 'border-top-right-radius': [number, number],
* 'border-bottom-left-radius': [number, number],
* 'border-bottom-right-radius': [number, number],
* 'border-top-color': string,
* 'border-right-color': string,
* 'border-left-color': string,
* 'border-bottom-color': string,
* 'border-top-width': number,
* 'border-right-width': number,
* 'border-bottom-width': number,
* 'border-left-width': number,
* }} style
* @param {CanvasRenderingContext2D} ctx
* @param {number} width
* @param {number} height
*/
function render_rect_with_corner_shapes(style, ctx, width, height) {
const corner_params = resolve_corner_params(style, width, height);
function draw_outer_corner(corner, phase = "both", direction) {
const params = corner_params[corner];
add_corner(ctx, ...params.outer_rect, params.shape, phase, direction);
}
function draw_inner_corner_from_params(params, phase = "both", direction) {
add_corner(ctx, ...params.inner_rect, params.shape, phase, direction);
}
function draw_inner_corner(corner, phase = "both", direction) {
draw_inner_corner_from_params(corner_params[corner], phase, direction);
}
ctx.beginPath();
draw_outer_corner("top-right");
draw_outer_corner("bottom-right");
draw_outer_corner("bottom-left");
draw_outer_corner("top-left");
ctx.closePath();
ctx.clip("nonzero");
const inner_rect = [
style["border-left-width"],
style["border-top-width"],
width - style["border-right-width"],
height - style["border-bottom-width"],
];
ctx.save();
ctx.beginPath();
draw_inner_corner("top-right");
ctx.lineTo(inner_rect[2], inner_rect[3]);
ctx.lineTo(inner_rect[0], inner_rect[3]);
ctx.lineTo(inner_rect[0], inner_rect[1]);
ctx.closePath();
ctx.clip();
ctx.beginPath();
draw_inner_corner("bottom-right");
ctx.lineTo(inner_rect[0], inner_rect[3]);
ctx.lineTo(inner_rect[0], inner_rect[1]);
ctx.lineTo(inner_rect[2], inner_rect[1]);
ctx.closePath();
ctx.clip();
ctx.beginPath();
draw_inner_corner("bottom-left");
ctx.lineTo(inner_rect[0], inner_rect[1]);
ctx.lineTo(inner_rect[2], inner_rect[1]);
ctx.lineTo(inner_rect[2], inner_rect[3]);
ctx.closePath();
ctx.clip();
ctx.beginPath();
draw_inner_corner("top-left");
ctx.lineTo(inner_rect[2], inner_rect[1]);
ctx.lineTo(inner_rect[2], inner_rect[3]);
ctx.lineTo(inner_rect[0], inner_rect[3]);
ctx.closePath();
ctx.clip();
ctx.fillStyle = style["background-color"];
ctx.fill();
ctx.restore();
}

View File

@@ -0,0 +1,126 @@
/**
*
* @param {number} curvature
* @returns {[number, number]}
*/
function offset_for_curvature(curvature) {
// Find the superellipse's control point.
// we do that by approximating the superellipse as a quadratic
// curve that has the same point at t = 0.5.
if (curvature <= 0.001) return [1, -1];
const { x } = superellipse(curvature);
const [a, b] = [x, 1 - x].map((m) => 2 * m - 0.5);
const magnitude = Math.hypot(a, b);
// Normalize a & b
const norm_a = a / magnitude;
const norm_b = b / magnitude;
return [norm_a, -norm_b];
}
/**
*
* @param {number} curvature
* @param {number} t
* @returns {{x: number, y: number}}
*/
function superellipse(curvature, t = 0.5) {
// Make concave shapes symmetrical with convex ones.
if (curvature < 1) {
const { x, y } = superellipse(1 / curvature, t);
return { x: 1 - y, y: 1 - x };
}
const x = Math.pow(t, 1 / curvature);
const y = Math.pow(1 - t, 1 / curvature);
return { x, y };
}
function superellipse_t_for_x(x, curvature) {
if (curvature < 1) {
return 1 - superellipse_t_for_y(1 - x, 1 / curvature);
} else return Math.log(x) / Math.log(1 / curvature);
}
function superellipse_t_for_y(y, curvature) {
if (curvature < 1) {
return 1 - superellipse_t_for_x(1 - y, 1 / curvature);
} else return 1 - Math.log(y) / Math.log(1 / curvature);
}
function resolve_corner_params(style, width, height, outset = null) {
const params = {
"top-right": {
outer: [
width - style["border-top-right-radius"][0],
0,
width,
style["border-top-right-radius"][1],
],
inset: [style["border-top-width"], style["border-right-width"]],
},
"bottom-right": {
outer: [
width,
height - style["border-bottom-right-radius"][1],
width - style["border-bottom-right-radius"][0],
height,
],
inset: [style["border-right-width"], style["border-bottom-width"]],
},
"bottom-left": {
outer: [
style["border-bottom-left-radius"][0],
height,
0,
height - style["border-bottom-left-radius"][1],
],
inset: [style["border-bottom-width"], style["border-left-width"]],
},
"top-left": {
outer: [
0,
style["border-top-left-radius"][1],
style["border-top-left-radius"][0],
0,
],
inset: [style["border-left-width"], style["border-top-width"]],
},
};
return Object.fromEntries(
Object.entries(params).map(([corner, { outer, inset }]) => {
if (outset !== null) inset = [-outset, -outset];
const shape = style[`corner-${corner}-shape`];
const s1 = Math.sign(outer[2] - outer[0]);
const s2 = Math.sign(outer[3] - outer[1]);
const [sw1, sw2] = inset;
const inner_offset = [s1 * sw1, s2 * sw1, -s1 * sw2, -s2 * sw2];
const offset = offset_for_curvature(shape);
if (Math.sign(inner_offset[0]) === Math.sign(inner_offset[1])) {
offset.reverse();
}
const inner_rect = [
outer[0] + inner_offset[0] * offset[0],
outer[1] + inner_offset[1] * offset[1],
outer[2] + inner_offset[2] * offset[1],
outer[3] + inner_offset[3] * offset[0],
];
return [
corner,
{
outer_rect: outer,
shape,
inset,
inner_rect,
inner_offset,
},
];
})
);
}

View File

@@ -11,77 +11,26 @@ const keywords = {
straight: 1000,
};
function superellipse_at(curvature, t = 0.5) {
return Math.pow(t, 1 / curvature)
}
/**
* @param {number} s
* @param {number} t
* @returns {x: number, y: number}
*/
function se(s, t = 0.5) {
const curvature = Math.pow(2, s);
const x = superellipse_at(curvature);
const y = superellipse_at(curvature, 1 - t);
return {x, y};
}
/**
*
* @param {number} curvature
* @returns number
*/
function offset_for_curvature(curvature) {
if (curvature === 0)
return 1;
if (curvature >= 2)
return 0;
// Find the approximate slope & magnitude of the superellipse's tangent
const a = superellipse_at(curvature);
const b = 1 - a;
const slope = a / b;
const magnitude = Math.hypot(a, b);
// Normalize a & b
const norm_a = a / magnitude;
const norm_b = b / magnitude;
// The outer normal offset is the intercept of the line
// parallel to the tangent, at distance.
return norm_b + slope * (norm_a - 1);
}
function resolve_corner_style(style, width, height) {
function resolve_corner_style(style, w, h) {
['top', 'bottom'].forEach((vSide) => ['left', 'right'].forEach((hSide) => {
let shape = style[`corner-${vSide}-${hSide}-shape`] ||
style['corner-shape'] || 'round';
const match = shape.match(/superellipse\((\.?[0-9]+(.[0-9]+)?)\)/);
shape = match ? +match[1] : keywords[shape];
const hWidth = style[`border-${hSide}-width`] ?? style['border-width'] ?? 0;
const vWidth = style[`border-${vSide}-width`] ?? style['border-width'] ?? 0;
const hWidth = style[`border-${hSide}-width`] || style['border-width'] || 0;
const vWidth = style[`border-${vSide}-width`] || style['border-width'] || 0;
let radius =
style[`border-${vSide}-${hSide}-radius`] ?? style['border-radius'];
style[`border-${vSide}-${hSide}-radius`] || style['border-radius'] || 0;
if (!Array.isArray(radius))
radius = [radius, radius];
if (shape > 1000)
shape = 1000;
if (shape < 0.00000001)
shape = 0.00000001;
if (String(radius[0]).endsWith('%'))
radius[0] = (parseFloat(radius[0]) * width) / 100;
radius[0] = (parseFloat(radius[0]) * w) / 100;
if (String(radius[1]).endsWith('%'))
radius[1] = (parseFloat(radius[1]) * height) / 100;
radius = radius.map(r => parseFloat(r));
;
radius[1] = (parseFloat(radius[1]) * h) / 100;
radius = radius.map(parseFloat);
style[`corner-${vSide}-${hSide}-shape`] = shape;
const offset = offset_for_curvature(shape);
radius = [
Math.min(Math.max(radius[0], hWidth), width / 2 - hWidth * offset),
Math.min(Math.max(radius[1], vWidth), height / 2 - vWidth * offset)
];
style[`border-${vSide}-${hSide}-radius`] = radius;
style[`border-${hSide}-width`] = hWidth;
style[`border-${vSide}-width`] = vWidth;

View File

@@ -0,0 +1,8 @@
<!DOCTYPE html>
<title>Crash Test: @layer statement sandwiched between namespaces</title>
<link rel="help" href="https://issues.chromium.org/issues/402248410">
<style>
@namespace "hello";
@layer feh;
@namespace "world";
</style>

View File

@@ -10,37 +10,37 @@
<div id="target"></div>
<script>
test_computed_value("dynamic-range-limit", "high");
test_computed_value("dynamic-range-limit", "constrained-high");
test_computed_value("dynamic-range-limit", "no-limit");
test_computed_value("dynamic-range-limit", "constrained");
test_computed_value("dynamic-range-limit", "standard");
test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(standard 75%, high 25%)");
test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(standard 25%, high 75%)");
test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(high 100%, standard 0%)",
"high");
test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(high 100%, high 0%)",
"high");
test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(high 25%, standard 25%, standard 25%, standard 25%)",
"dynamic-range-limit-mix(standard 75%, high 25%)");
test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(high 25%, standard 75%)",
"dynamic-range-limit-mix(standard 75%, high 25%)");
test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(high 100%, standard 100%)",
"dynamic-range-limit-mix(standard 50%, high 50%)");
test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(high 80%, standard 60%, constrained-high 60%)",
"dynamic-range-limit-mix(standard 30%, constrained-high 30%, high 40%)");
test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(standard 25%, constrained-high 75%)");
test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(constrained-high 75%, standard 25%)",
"dynamic-range-limit-mix(standard 25%, constrained-high 75%)");
test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(constrained-high 25%, high 25%)",
"dynamic-range-limit-mix(constrained-high 50%, high 50%)");
test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(standard 25%, constrained-high 50%, high 25%)");
test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(standard 10%, constrained-high 20%, high 20%)",
"dynamic-range-limit-mix(standard 20%, constrained-high 40%, high 40%)");
test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(high 10%, standard 30%)",
"dynamic-range-limit-mix(standard 75%, high 25%)");
test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(dynamic-range-limit-mix(standard 10%, high 30%) 20%, standard 80%)",
"dynamic-range-limit-mix(standard 85%, high 15%)");
test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(dynamic-range-limit-mix(standard 25%, high 75%) 20%, dynamic-range-limit-mix(standard 25%, constrained-high 75%) 40%, dynamic-range-limit-mix(constrained-high 25%, high 75%) 40%)",
"dynamic-range-limit-mix(standard 15%, constrained-high 40%, high 45%)");
test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(high 10%, dynamic-range-limit-mix(standard 25%, constrained-high 75%) 20%, dynamic-range-limit-mix(constrained-high 10%, high 30%) 20%)",
"dynamic-range-limit-mix(standard 10%, constrained-high 40%, high 50%)");
test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(standard 75%, no-limit 25%)");
test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(standard 25%, no-limit 75%)");
test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 100%, standard 0%)",
"no-limit");
test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 100%, no-limit 0%)",
"no-limit");
test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 25%, standard 25%, standard 25%, standard 25%)",
"dynamic-range-limit-mix(standard 75%, no-limit 25%)");
test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 25%, standard 75%)",
"dynamic-range-limit-mix(standard 75%, no-limit 25%)");
test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 100%, standard 100%)",
"dynamic-range-limit-mix(standard 50%, no-limit 50%)");
test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 80%, standard 60%, constrained 60%)",
"dynamic-range-limit-mix(standard 30%, constrained 30%, no-limit 40%)");
test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(standard 25%, constrained 75%)");
test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(constrained 75%, standard 25%)",
"dynamic-range-limit-mix(standard 25%, constrained 75%)");
test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(constrained 25%, no-limit 25%)",
"dynamic-range-limit-mix(constrained 50%, no-limit 50%)");
test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(standard 25%, constrained 50%, no-limit 25%)");
test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(standard 10%, constrained 20%, no-limit 20%)",
"dynamic-range-limit-mix(standard 20%, constrained 40%, no-limit 40%)");
test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 10%, standard 30%)",
"dynamic-range-limit-mix(standard 75%, no-limit 25%)");
test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(dynamic-range-limit-mix(standard 10%, no-limit 30%) 20%, standard 80%)",
"dynamic-range-limit-mix(standard 85%, no-limit 15%)");
test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(dynamic-range-limit-mix(standard 25%, no-limit 75%) 20%, dynamic-range-limit-mix(standard 25%, constrained 75%) 40%, dynamic-range-limit-mix(constrained 25%, no-limit 75%) 40%)",
"dynamic-range-limit-mix(standard 15%, constrained 40%, no-limit 45%)");
test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 10%, dynamic-range-limit-mix(standard 25%, constrained 75%) 20%, dynamic-range-limit-mix(constrained 10%, no-limit 30%) 20%)",
"dynamic-range-limit-mix(standard 10%, constrained 40%, no-limit 50%)");
</script>

View File

@@ -12,5 +12,5 @@
</div>
<script>
assert_inherited('dynamic-range-limit', 'high', 'standard');
assert_inherited('dynamic-range-limit', 'no-limit', 'standard');
</script>

View File

@@ -14,52 +14,52 @@
<script>
test_interpolation({
property: "dynamic-range-limit",
from: "high",
from: "no-limit",
to: "standard",
}, [
{at: 0.0, expect: "high"},
{at: 0.25, expect: "dynamic-range-limit-mix(standard 25%, high 75%)"},
{at: 0.75, expect: "dynamic-range-limit-mix(standard 75%, high 25%)"},
{at: 0.0, expect: "no-limit"},
{at: 0.25, expect: "dynamic-range-limit-mix(standard 25%, no-limit 75%)"},
{at: 0.75, expect: "dynamic-range-limit-mix(standard 75%, no-limit 25%)"},
{at: 1.0, expect: "standard"},
]);
test_interpolation({
property: "dynamic-range-limit",
from: "constrained-high",
from: "constrained",
to: "standard",
}, [
{at: 0.0, expect: "constrained-high"},
{at: 0.5, expect: "dynamic-range-limit-mix(standard 50%, constrained-high 50%)"},
{at: 0.0, expect: "constrained"},
{at: 0.5, expect: "dynamic-range-limit-mix(standard 50%, constrained 50%)"},
{at: 1.0, expect: "standard"},
]);
test_interpolation({
property: "dynamic-range-limit",
from: "dynamic-range-limit-mix(standard 50%, high 50%)",
from: "dynamic-range-limit-mix(standard 50%, no-limit 50%)",
to: "standard",
}, [
{at: 0.0, expect: "dynamic-range-limit-mix(standard 50%, high 50%)"},
{at: 0.75, expect: "dynamic-range-limit-mix(standard 87.5%, high 12.5%)"},
{at: 0.0, expect: "dynamic-range-limit-mix(standard 50%, no-limit 50%)"},
{at: 0.75, expect: "dynamic-range-limit-mix(standard 87.5%, no-limit 12.5%)"},
{at: 1.0, expect: "standard"},
]);
test_interpolation({
property: "dynamic-range-limit",
from: "dynamic-range-limit-mix(standard 90%, high 10%)",
to: "dynamic-range-limit-mix(standard 10%, high 90%)",
from: "dynamic-range-limit-mix(standard 90%, no-limit 10%)",
to: "dynamic-range-limit-mix(standard 10%, no-limit 90%)",
}, [
{at: 0.0, expect: "dynamic-range-limit-mix(standard 90%, high 10%)"},
{at: 0.5, expect: "dynamic-range-limit-mix(standard 50%, high 50%)"},
{at: 1.0, expect: "dynamic-range-limit-mix(standard 10%, high 90%)"},
{at: 0.0, expect: "dynamic-range-limit-mix(standard 90%, no-limit 10%)"},
{at: 0.5, expect: "dynamic-range-limit-mix(standard 50%, no-limit 50%)"},
{at: 1.0, expect: "dynamic-range-limit-mix(standard 10%, no-limit 90%)"},
]);
test_interpolation({
property: "dynamic-range-limit",
from: "dynamic-range-limit-mix(constrained-high 90%, standard 10%)",
to: "dynamic-range-limit-mix(high 10%, standard 90%)",
from: "dynamic-range-limit-mix(constrained 90%, standard 10%)",
to: "dynamic-range-limit-mix(no-limit 10%, standard 90%)",
}, [
{at: 0.0, expect: "dynamic-range-limit-mix(standard 10%, constrained-high 90%)"},
{at: 0.5, expect: "dynamic-range-limit-mix(standard 50%, constrained-high 45%, high 5%)"},
{at: 1.0, expect: "dynamic-range-limit-mix(standard 90%, high 10%)"},
{at: 0.0, expect: "dynamic-range-limit-mix(standard 10%, constrained 90%)"},
{at: 0.5, expect: "dynamic-range-limit-mix(standard 50%, constrained 45%, no-limit 5%)"},
{at: 1.0, expect: "dynamic-range-limit-mix(standard 90%, no-limit 10%)"},
]);
</script>

View File

@@ -9,31 +9,31 @@
<script>
test_valid_value("dynamic-range-limit", "standard");
test_valid_value("dynamic-range-limit", "high");
test_valid_value("dynamic-range-limit", "constrained-high");
test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(high 80%, standard 20%)");
test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(high 8%, standard 2%)");
test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(high 99%, standard 99%)");
test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(high 99%, standard 99%, constrained-high 10%)");
test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(high 1%)");
test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(constrained-high 20%, high 80%)");
test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(dynamic-range-limit-mix(constrained-high 90%, high 10%) 1%, high 80%)");
test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(high 1%, dynamic-range-limit-mix(constrained-high 2%, high 10%) 80%)");
test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(dynamic-range-limit-mix(high 1%, standard 2%) 3%, dynamic-range-limit-mix(constrained-high 5%, high 5%) 6%)");
test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(high 80%, standard 20%, )");
test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(high, standard 20%)");
test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(constrained-high, high, 80%)");
test_valid_value("dynamic-range-limit", "no-limit");
test_valid_value("dynamic-range-limit", "constrained");
test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 80%, standard 20%)");
test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 8%, standard 2%)");
test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 99%, standard 99%)");
test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 99%, standard 99%, constrained 10%)");
test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 1%)");
test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(constrained 20%, no-limit 80%)");
test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(dynamic-range-limit-mix(constrained 90%, no-limit 10%) 1%, no-limit 80%)");
test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 1%, dynamic-range-limit-mix(constrained 2%, no-limit 10%) 80%)");
test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(dynamic-range-limit-mix(no-limit 1%, standard 2%) 3%, dynamic-range-limit-mix(constrained 5%, no-limit 5%) 6%)");
test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 80%, standard 20%, )");
test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit, standard 20%)");
test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(constrained, no-limit, 80%)");
test_invalid_value("dynamic-range-limit", "");
test_invalid_value("dynamic-range-limit", "none");
test_invalid_value("dynamic-range-limit", "default");
test_invalid_value("dynamic-range-limit", "hdr");
test_invalid_value("dynamic-range-limit", "sdr");
test_invalid_value("dynamic-range-limit", "low");
test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(high 80% standard 20%)");
test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(low, high, 10%)");
test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(high 101%, standard 1%)");
test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(high -1%, standard 1%)");
test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(standard, high, 0.1)");
test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(high 0%, standard 0%)");
test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(dynamic-range-limit-mix(high 1%, standard 2%) 3%, dynamic-range-limit-mix(constrained-high 0%, high 0%) 6%)");
test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 80% standard 20%)");
test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(low, no-limit, 10%)");
test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 101%, standard 1%)");
test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit -1%, standard 1%)");
test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(standard, no-limit, 0.1)");
test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 0%, standard 0%)");
test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(dynamic-range-limit-mix(no-limit 1%, standard 2%) 3%, dynamic-range-limit-mix(constrained 0%, no-limit 0%) 6%)");
</script>

View File

@@ -0,0 +1,31 @@
<!DOCTYPE html>
<html>
<head>
<title>Others depend on currentcolor should be recomputed when currentcolor changes</title>
<link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com">
<style>
#column-rule-color-currentcolor {
columns: 2;
column-rule-style: solid;
column-rule-width: 10px;
height: 1em;
column-rule-color: green;
color: green;
}
#column-rule-color-color-mix-currentcolor {
columns: 2;
column-rule-style: solid;
column-rule-width: 10px;
height: 1em;
column-rule-color: color-mix(in hsl, green 50%, white);
color: green;
}
</style>
</head>
<body>
<div id="column-rule-color-currentcolor">XXX<br>YYY</div>
<div id="column-rule-color-color-mix-currentcolor">XXX<br>YYY</div>
</body>
</html>

View File

@@ -0,0 +1,43 @@
<!DOCTYPE html>
<html class="reftest-wait">
<head>
<title>column-rule-color that depend on currentcolor should be recomputed when currentcolor changes</title>
<link rel="match" href="currentcolor-005-ref.html">
<link rel="help" href="https://drafts.csswg.org/css-color-4/#resolving-other-colors">
<link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com">
<style>
#column-rule-color-currentcolor {
columns: 2;
column-rule-style: solid;
column-rule-width: 10px;
height: 1em;
column-rule-color: currentcolor;
}
#column-rule-color-color-mix-currentcolor {
columns: 2;
column-rule-style: solid;
column-rule-width: 10px;
height: 1em;
column-rule-color: color-mix(in hsl, currentcolor 50%, white);
}
</style>
</head>
<body>
<div id="column-rule-color-currentcolor">XXX<br>YYY</div>
<div id="column-rule-color-color-mix-currentcolor">XXX<br>YYY</div>
<script>
// Use double requestAnimationFrame to remove need of setTimeout.
// Wait for the first frame to ensure that the style is computed.
requestAnimationFrame(() => {
// Wait for the second frame to ensure that the style is painted.
requestAnimationFrame(() => {
document.getElementById("column-rule-color-currentcolor").style.color = "green";
document.getElementById("column-rule-color-color-mix-currentcolor").style.color = "green";
document.documentElement.classList.remove("reftest-wait");
});
});
</script>
</body>
</html>

View File

@@ -1,19 +1,13 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>CSS Color 4: System color consistency</title>
<link rel="author" title="Jan Keitel" href="mailto:jkeitel@google.com">
<link rel="help" href="https://www.w3.org/TR/css-color-4/#css-system-colors">
<meta name="assert" content="computed style of form elements is consistent with definition of system colors">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/css/support/computed-testcommon.js"></script>
</head>
<body>
<div style="display: none">
<meta charset="utf-8">
<title>CSS Color 4: System color consistency</title>
<link rel="author" title="Jan Keitel" href="mailto:jkeitel@google.com">
<link rel="help" href="https://www.w3.org/TR/css-color-4/#css-system-colors">
<meta name="assert" content="computed style of form elements is consistent with definition of system colors">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/css/support/computed-testcommon.js"></script>
<div style="display: none">
<div id="target"></div>
<!-- Reference elements -->
<!-- Buttons -->
@@ -31,41 +25,55 @@
<mark id="mark">Marked text</mark>
<!-- Link -->
<a href="#" id="link">Link</a>
</div>
<div id="canvas" style="color: CanvasText; background-color: Canvas">Canvas Colors</mark>
</div>
<script>
function test_not_canvas(color, colorScheme) {
test(function() {
let target = document.getElementById("target");
target.style.color = color;
<script>
['light', 'dark'].forEach(colorScheme => {
document.documentElement.style.colorScheme = colorScheme;
let canvas = document.getElementById("canvas");
assert_not_equals(getComputedStyle(target).color, getComputedStyle(canvas).backgroundColor, `${color} should not match Canvas`);
}, `${color} should not match Canvas in ${colorScheme} mode`);
}
// Buttons
for (let element of document.getElementById("buttons").children) {
style = document.defaultView.getComputedStyle(element);
test_computed_value('color', 'ButtonBorder', style.getPropertyValue('border-color'), `resolves to the same color as the border-color of a ${element.name} (${colorScheme})`);
test_computed_value('color', 'ButtonFace', style.getPropertyValue('background-color'), `resolves to the same color as the background-color of a ${element.name} (${colorScheme})`);
test_computed_value('color', 'ButtonText', style.getPropertyValue('color'), `resolves to the same color as text on a ${element.name} (${colorScheme})`);
}
['light', 'dark'].forEach(colorScheme => {
document.documentElement.style.colorScheme = colorScheme;
// CanvasText
style = document.defaultView.getComputedStyle(document.getElementsByTagName('html')[0]);
test_computed_value('color', 'CanvasText', style.getPropertyValue('color'), `has the same color as the color of the html element (${colorScheme})`);
// Buttons
for (let element of document.getElementById("buttons").children) {
style = getComputedStyle(element);
test_computed_value('color', 'ButtonBorder', style.getPropertyValue('border-color'), `resolves to the same color as the border-color of a ${element.name} (${colorScheme})`);
test_computed_value('color', 'ButtonFace', style.getPropertyValue('background-color'), `resolves to the same color as the background-color of a ${element.name} (${colorScheme})`);
test_computed_value('color', 'ButtonText', style.getPropertyValue('color'), `resolves to the same color as text on a ${element.name} (${colorScheme})`);
}
// Field and FieldText
for (let element of document.getElementById("fields").children) {
style = document.defaultView.getComputedStyle(element);
test_computed_value('color', 'Field', style.getPropertyValue('background-color'), `resolves to the same color as the background-color of a ${element.name} (${colorScheme})`);
test_computed_value('color', 'FieldText', style.getPropertyValue('color'), `resolves to the same color as text on a ${element.name} (${colorScheme})`);
}
// CanvasText
style = getComputedStyle(document.getElementsByTagName('html')[0]);
test_computed_value('color', 'CanvasText', style.getPropertyValue('color'), `has the same color as the color of the html element (${colorScheme})`);
// Mark and MarkText
style = document.defaultView.getComputedStyle(document.getElementById('mark'));
test_computed_value('color', 'Mark', style.getPropertyValue('background-color'), `has the same color as the background-color of a mark element (${colorScheme})`);
test_computed_value('color', 'MarkText', style.getPropertyValue('color'), `has the same color as the color of a mark element (${colorScheme})`);
// Field and FieldText
for (let element of document.getElementById("fields").children) {
style = getComputedStyle(element);
test_computed_value('color', 'Field', style.getPropertyValue('background-color'), `resolves to the same color as the background-color of a ${element.name} (${colorScheme})`);
test_computed_value('color', 'FieldText', style.getPropertyValue('color'), `resolves to the same color as text on a ${element.name} (${colorScheme})`);
}
// LinkText
style = document.defaultView.getComputedStyle(document.getElementById('link'));
test_computed_value('color', 'LinkText', style.getPropertyValue('color'), `has the same color as the color of an anchor element (${colorScheme})`);
});
</script>
</body>
// Mark and MarkText
style = getComputedStyle(document.getElementById('mark'));
test_computed_value('color', 'Mark', style.getPropertyValue('background-color'), `has the same color as the background-color of a mark element (${colorScheme})`);
test_computed_value('color', 'MarkText', style.getPropertyValue('color'), `has the same color as the color of a mark element (${colorScheme})`);
</html>
// LinkText
style = getComputedStyle(document.getElementById('link'));
test_computed_value('color', 'LinkText', style.getPropertyValue('color'), `has the same color as the color of an anchor element (${colorScheme})`);
// These colors are only text colors and do not have corresponding
// backgrounds, so they should not match the canvas background (as
// otherwise they'd be invisible)
test_not_canvas("LinkText", colorScheme);
test_not_canvas("ActiveText", colorScheme);
test_not_canvas("VisitedText", colorScheme);
});
</script>

View File

@@ -0,0 +1,26 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Gradient analogous missing components carry forward logic tests</title>
<link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com">
<link rel="author" title="一丝" href="mailto:yiorsi@gmail.com">
<link rel="help" href="https://www.w3.org/TR/css-color-4/#interpolation">
<style>
.test {
margin: 50px;
width: 200px;
height: 50px;
border: 1px solid black;
background: linear-gradient(90deg in srgb, hsl(0deg 0% 50%), yellow);
}
</style>
</head>
<body>
<div class="test"></div>
<div class="test"></div>
<div class="test"></div>
<div class="test"></div>
<div class="test"></div>
</body>
</html>

View File

@@ -0,0 +1,43 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Gradient analogous missing components carry forward logic tests</title>
<link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com">
<link rel="author" title="一丝" href="mailto:yiorsi@gmail.com">
<link rel="help" href="https://www.w3.org/TR/css-color-4/#interpolation">
<meta name="assert" content="Tests that analogous missing components logic works.">
<link rel="match" href="gradient-analogous-missing-components-001-ref.html">
<style>
.test {
margin: 50px;
width: 200px;
height: 50px;
border: 1px solid black;
}
.test1 {
background: linear-gradient(90deg in srgb, hsl(60deg 0 50%), yellow);
}
.test2 {
background: linear-gradient(90deg in srgb, hsl(20deg 0 50%), yellow);
}
.test3 {
background: linear-gradient(90deg in srgb, hsl(60deg none 50%), yellow);
}
.test4 {
background: linear-gradient(90deg in srgb, hsl(none 0 50%), yellow);
}
.test5 {
background: linear-gradient(90deg in srgb, hsl(none none 50%), yellow);
}
</style>
</head>
<body>
<div class="test test1"></div>
<div class="test test2"></div>
<div class="test test3"></div>
<div class="test test4"></div>
<div class="test test5"></div>
</body>
</html>

View File

@@ -0,0 +1,38 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Gradient analogous missing components carry forward logic tests</title>
<link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com">
<link rel="author" title="一丝" href="mailto:yiorsi@gmail.com">
<style>
.test {
margin: 10px 50px;
width: 200px;
height: 50px;
border: 1px solid black;
--color: lime;
}
.test1 {
background: linear-gradient(to right, var(--color));
}
.test2 {
background: linear-gradient(to right in srgb, var(--color));
}
.test3 {
background: linear-gradient(to right in oklab, var(--color));
}
.test4 {
background: linear-gradient(to right in display-p3, var(--color));
}
</style>
</head>
<body>
<p>They should be equivalent to `background: color-mix(in srgb, color(srgb none 1 none), lime)`</p>
<div class="test test1">This should be a lime background.</div>
<div class="test test2">This should be a lime background.</div>
<div class="test test3">This should be a lime background.</div>
<div class="test test4">This should be a lime background.</div>
</body>
</html>

View File

@@ -0,0 +1,40 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Gradient analogous missing components carry forward logic tests</title>
<link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com">
<link rel="author" title="一丝" href="mailto:yiorsi@gmail.com">
<link rel="help" href="https://www.w3.org/TR/css-color-4/#interpolation">
<link rel="match" href="gradient-analogous-missing-components-002-ref.html">
<meta name="assert" content="Tests that analogous missing components logic works.">
<style>
.test {
margin: 10px 50px;
width: 200px;
height: 50px;
border: 1px solid black;
--stop2: rgb(0 255 0); /* lime */
}
.test1 {
background: linear-gradient(to right, color(srgb none 1 none), var(--stop2));
}
.test2 {
background: linear-gradient(to right in srgb, color(srgb none 1 none), var(--stop2));
}
.test3 {
background: linear-gradient(to right in oklab, color(srgb none 1 none), var(--stop2));
}
.test4 {
background: linear-gradient(to right in display-p3, color(srgb none 1 none), var(--stop2));
}
</style>
</head>
<body>
<p>They should be equivalent to `background: color-mix(in srgb, color(srgb none 1 none), lime)`</p>
<div class="test test1">This should be a lime background.</div>
<div class="test test2">This should be a lime background.</div>
<div class="test test3">This should be a lime background.</div>
<div class="test test4">This should be a lime background.</div>
</body>
</html>

View File

@@ -0,0 +1,24 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Gradient analogous missing components carry forward logic tests</title>
<link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com">
<link rel="author" title="一丝" href="mailto:yiorsi@gmail.com">
<link rel="help" href="https://www.w3.org/TR/css-color-4/#interpolation">
<style>
.test {
margin: 10px 50px;
width: 200px;
height: 50px;
border: 1px solid black;
background: lime;
}
</style>
</head>
<body>
<div class="test test1">This should be a lime background.</div>
<div class="test test2">This should be a lime background.</div>
<div class="test test3">This should be a lime background.</div>
</body>
</html>

View File

@@ -0,0 +1,35 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Gradient analogous missing components carry forward logic tests</title>
<link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com">
<link rel="author" title="一丝" href="mailto:yiorsi@gmail.com">
<link rel="help" href="https://www.w3.org/TR/css-color-4/#interpolation">
<meta name="assert" content="Tests that analogous missing components logic works.">
<link rel="match" href="gradient-analogous-missing-components-003-ref.html">
<style>
.test {
margin: 10px 50px;
width: 200px;
height: 50px;
border: 1px solid black;
--stop2: rgb(0 255 0); /* lime */
}
.test1 {
background: linear-gradient(to right in hsl shorter hue, color(srgb none 1 none), var(--stop2));
}
.test2 {
background: linear-gradient(to right in hsl increasing hue, color(srgb none 1 none), var(--stop2));
}
.test3 {
background: linear-gradient(to right in hsl decreasing hue, color(srgb none 1 none), var(--stop2));
}
</style>
</head>
<body>
<div class="test test1">This should be a lime background.</div>
<div class="test test2">This should be a lime background.</div>
<div class="test test3">This should be a lime background.</div>
</body>
</html>

View File

@@ -7,7 +7,7 @@
<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com">
<link rel="help" href="https://www.w3.org/TR/css-color-4/#interpolation">
<meta name="assert" content="Tests that 'increasing' hue renders the expected gradient">
<meta name="fuzzy" content="maxDifference=0-18;totalPixels=0-23900">
<meta name="fuzzy" content="maxDifference=0-18;totalPixels=0-24900">
<link rel="match" href="gradient-increasing-hue-lch-ref.html">
<style>
body {

View File

@@ -6,7 +6,7 @@
<link rel="help" href="https://www.w3.org/TR/css-color-4/#interpolation">
<link rel="match" href="gradient-longer-hue-lch-004-ref.html">
<meta name="assert" content="Tests that gradient with 'longer hue' renders correctly">
<meta name="fuzzy" content="maxDifference=0-9;totalPixels=0-1240">
<meta name="fuzzy" content="maxDifference=0-9;totalPixels=0-1540">
<style>
div {

View File

@@ -3,7 +3,7 @@
<head>
<style>
div {
height: 100px;
height: 50px;
}
#basic {
/* "none" should split into two and take each neighboring value. */
@@ -28,6 +28,9 @@
oklch(0.451981 0.31321 264.051) = "blue" */
background: linear-gradient(to right in oklch, oklch(0.627966 0.257704 29.2346), oklch(0 0 29.2346 / 0) 50%, oklch(0 0 264.051 / 0) 50%, oklch(0.451981 0.31321 264.051));
}
#srgb-mixing-with-named-color {
background: yellow;
}
</style>
</head>
<body>
@@ -37,5 +40,6 @@
<div id="noneHue"></div>
<div id="noneHueLonger"></div>
<div id="transparentHueIsPowerless"></div>
<div id="srgb-mixing-with-named-color"></div>
</body>
</html>

View File

@@ -6,10 +6,10 @@
<link rel="help" href="https://www.w3.org/TR/css-color-4/#interpolation">
<meta name="assert" content="Color stops with missing components should split into two stops and take their neighboring values.">
<link rel="match" href="gradient-none-interpolation-ref.html">
<meta name="fuzzy" content="maxDifference=1; totalPixels=0-5000">
<meta name="fuzzy" content="maxDifference=1; totalPixels=0-15000">
<style>
div {
height: 100px;
height: 50px;
}
#basic {
/* "none" should split into two and take each neighboring value. */
@@ -33,6 +33,9 @@
/* When "transparent" is converted to oklch, the hue of the resulting stop should act as if it were missing. */
background: linear-gradient(to right in oklch, red, transparent, blue);
}
#srgb-mixing-with-named-color {
background: linear-gradient(90deg in srgb, rgb(none 255 none), yellow);
}
</style>
</head>
<body>
@@ -42,5 +45,6 @@
<div id="noneHue"></div>
<div id="noneHueLonger"></div>
<div id="transparentHueIsPowerless"></div>
<div id="srgb-mixing-with-named-color"></div>
</body>
</html>

View File

@@ -8,7 +8,7 @@
<link rel="help" href="https://drafts.csswg.org/css-images-3/#color-stop-syntax">
<link rel="help" href="https://drafts.csswg.org/css-images-3/#coloring-gradient-line">
<meta name="assert" content="Tests that gradient with a single color stop renders the expected solid color">
<meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-4500">
<meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-6000">
<link rel="match" href="/css/reference/ref-filled-green-100px-square-only.html">
<style>
body {

View File

@@ -8,7 +8,7 @@
<link rel="help" href="https://drafts.csswg.org/css-images-3/#color-stop-syntax">
<link rel="help" href="https://drafts.csswg.org/css-images-3/#coloring-gradient-line">
<meta name="assert" content="Tests that gradient with a single color stop renders the expected solid color">
<meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-4500">
<meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-6000">
<link rel="match" href="/css/reference/ref-filled-green-100px-square-only.html">
<style>
body {

View File

@@ -8,7 +8,7 @@
<link rel="help" href="https://drafts.csswg.org/css-images-3/#color-stop-syntax">
<link rel="help" href="https://drafts.csswg.org/css-images-3/#coloring-gradient-line">
<meta name="assert" content="Tests that gradient with a single color stop renders the expected solid color">
<meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-4500">
<meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-6000">
<link rel="match" href="/css/reference/ref-filled-green-100px-square-only.html">
<style>
body {

View File

@@ -8,7 +8,7 @@
<link rel="help" href="https://drafts.csswg.org/css-images-3/#color-stop-syntax">
<link rel="help" href="https://drafts.csswg.org/css-images-3/#coloring-gradient-line">
<meta name="assert" content="Tests that gradient with a single color stop renders the expected solid color">
<meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-4500">
<meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-6000">
<link rel="match" href="/css/reference/ref-filled-green-100px-square-only.html">
<style>
body {

View File

@@ -8,7 +8,7 @@
<link rel="help" href="https://drafts.csswg.org/css-images-3/#color-stop-syntax">
<link rel="help" href="https://drafts.csswg.org/css-images-3/#coloring-gradient-line">
<meta name="assert" content="Tests that gradient with a single color stop renders the expected solid color">
<meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-4500">
<meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-6000">
<link rel="match" href="/css/reference/ref-filled-green-100px-square-only.html">
<style>
body {

View File

@@ -4,7 +4,7 @@
<head>
<meta charset="utf-8">
<title>Gradient in HSL space</title>
<meta name="fuzzy" content="maxDifference=0-8;totalPixels=0-9050">
<meta name="fuzzy" content="maxDifference=0-8;totalPixels=0-18000">
<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com">
<link rel="help" href="https://www.w3.org/TR/css-color-4/#interpolation">
<meta name="assert" content="Tests that a single-stop longer-hue gradient renders a solid color, for various stop positions">

View File

@@ -3,6 +3,7 @@
<link rel="help" href="https://drafts.csswg.org/css-images/#linear-gradients">
<link rel="help" href="https://drafts.csswg.org/css-color-5/#typedef-color">
<link rel="match" href="../reference/100x100-blue-green.html">
<meta name="fuzzy" content="maxDifference=1; totalPixels=0-5000">
<style>
.g {
background-image: linear-gradient(rgb(from currentcolor r g b), rgb(from currentcolor r g b));

View File

@@ -4,6 +4,7 @@
<meta charset="utf-8">
<title>CSS Images Module Level 4: parsing invalid gradients with color interpolation methods</title>
<link rel="author" title="Sam Weinig" href="mailto:weinig@apple.com">
<link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com">
<link rel="help" href="https://drafts.csswg.org/css-images-4/#gradients">
<link rel="help" href="https://drafts.csswg.org/css-color-4/#color-interpolation-method">
<meta name="assert" content="gradients supports the addition of color-interpolation-method to the grammar">
@@ -41,6 +42,19 @@ function test_each_interpolation_method(gradientFunction) {
test_each_interpolation_method("linear-gradient")
test_each_interpolation_method("radial-gradient")
test_each_interpolation_method("conic-gradient")
// lacking of color-space after `in`
test_invalid_value(`background-image`, `linear-gradient(in, black, transparent)`)
test_invalid_value(`background-image`, `linear-gradient(45deg in, black, transparent)`)
test_invalid_value(`background-image`, `linear-gradient(in 45deg, black, transparent)`)
test_invalid_value(`background-image`, `linear-gradient(in to right, black, transparent)`)
test_invalid_value(`background-image`, `radial-gradient(closest-side in, black, transparent)`)
test_invalid_value(`background-image`, `conic-gradient(in from 90deg, black, transparent)`)
// lacking of `hue` keyword
test_invalid_value(`background-image`, `linear-gradient(90deg in hsl longer, black, transparent)`)
test_invalid_value(`background-image`, `linear-gradient(90deg in hsl shorter, black)`)
test_invalid_value(`background-image`, `linear-gradient(to right in hsl increasing, black, transparent)`)
test_invalid_value(`background-image`, `linear-gradient(to right in hsl decreasing, black, transparent)`)
</script>
</body>
</html>

View File

@@ -0,0 +1,16 @@
<!doctype html>
<title>radial-gradient() with container relative unit &lt;position> (horizontal)</title>
<link rel="help" href="https://drafts.csswg.org/css-images/#radial-gradient-syntax">
<link rel="help" href="https://drafts.csswg.org/css-conditional-5/#container-lengths">
<link rel="match" href="radial-gradient-container-relative-units-ref.html">
<style>
#container { container-type: size; width: 100px; height: 100px; }
#inner {
width: 100%;
height: 100%;
background-image: radial-gradient(50px 50px ellipse at 50cqw 50px, green, blue);
}
</style>
<div id="container">
<div id="inner"></div>
</div>

View File

@@ -0,0 +1,16 @@
<!doctype html>
<title>radial-gradient() with container relative unit &lt;position> (vertical)</title>
<link rel="help" href="https://drafts.csswg.org/css-images/#radial-gradient-syntax">
<link rel="help" href="https://drafts.csswg.org/css-conditional-5/#container-lengths">
<link rel="match" href="radial-gradient-container-relative-units-ref.html">
<style>
#container { container-type: size; width: 100px; height: 100px; }
#inner {
width: 100%;
height: 100%;
background-image: radial-gradient(50px 50px ellipse at 50px 50cqh, green, blue);
}
</style>
<div id="container">
<div id="inner"></div>
</div>

View File

@@ -0,0 +1,16 @@
<!doctype html>
<title>radial-gradient() with container relative unit &lt;radial-size> (horizontal)</title>
<link rel="help" href="https://drafts.csswg.org/css-images/#radial-gradient-syntax">
<link rel="help" href="https://drafts.csswg.org/css-conditional-5/#container-lengths">
<link rel="match" href="radial-gradient-container-relative-units-ref.html">
<style>
#container { container-type: size; width: 100px; height: 100px; }
#inner {
width: 100%;
height: 100%;
background-image: radial-gradient(50cqi 50px ellipse at 50px 50px, green, blue);
}
</style>
<div id="container">
<div id="inner"></div>
</div>

View File

@@ -0,0 +1,16 @@
<!doctype html>
<title>radial-gradient() with container relative unit &lt;radial-size> (vertical)</title>
<link rel="help" href="https://drafts.csswg.org/css-images/#radial-gradient-syntax">
<link rel="help" href="https://drafts.csswg.org/css-conditional-5/#container-lengths">
<link rel="match" href="radial-gradient-container-relative-units-ref.html">
<style>
#container { container-type: size; width: 100px; height: 100px; }
#inner {
width: 100%;
height: 100%;
background-image: radial-gradient(50px 50cqb ellipse at 50px 50px, green, blue);
}
</style>
<div id="container">
<div id="inner"></div>
</div>

View File

@@ -0,0 +1,10 @@
<!doctype html>
<title>radial-gradient() with container relative unit (reference)</title>
<style>
#gradient {
width: 100px;
height: 100px;
background-image: radial-gradient(50px circle at 50px, green, blue);
}
</style>
<div id="gradient"></div>

View File

@@ -7,7 +7,7 @@
<link rel="author" title="Mozilla" href="https://www.mozilla.org">
<link rel="help" href="https://www.w3.org/TR/css-masking-1/#the-clip-path">
<link rel="match" href="clip-path-geometryBox-1-ref.html">
<meta name="fuzzy" content="maxDifference=0-65; totalPixels=0-368">
<meta name="fuzzy" content="maxDifference=0-65; totalPixels=0-750">
<meta name="assert" content="Test checks whether clip-path border-box works correctly or not. This test is for clip-path applied to an SVG SVG element.">
<style>
svg {

View File

@@ -7,7 +7,7 @@
<link rel="author" title="Mozilla" href="https://www.mozilla.org">
<link rel="help" href="https://www.w3.org/TR/css-masking-1/#the-clip-path">
<link rel="match" href="clip-path-geometryBox-1-ref.html">
<meta name="fuzzy" content="maxDifference=0-65; totalPixels=0-368">
<meta name="fuzzy" content="maxDifference=0-65; totalPixels=0-750">
<meta name="assert" content="Test checks whether clip-path stroke-box works correctly or not. This test is for clip-path applied to an SVG SVG element.">
<style>
svg {

View File

@@ -7,7 +7,7 @@
<link rel="author" title="Mozilla" href="https://www.mozilla.org">
<link rel="help" href="https://www.w3.org/TR/css-masking-1/#the-clip-path">
<link rel="match" href="clip-path-geometryBox-1-ref.html">
<meta name="fuzzy" content="maxDifference=0-65; totalPixels=0-368">
<meta name="fuzzy" content="maxDifference=0-65; totalPixels=0-750">
<meta name="assert" content="Test checks whether clip-path view-box works correctly or not. This test is for clip-path applied to an SVG SVG element.">
<style>
svg {

View File

@@ -2,7 +2,7 @@
<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
<link rel="help" href="https://drafts.csswg.org/css-shapes/#supported-basic-shapes">
<link rel="match" href="svg-clip-path-fixed-values-ref.html">
<meta name="fuzzy" content="maxDifference=0-62; totalPixels=0-608">
<meta name="fuzzy" content="maxDifference=0-62; totalPixels=0-990">
<meta name="assert" content="clip-path clips correctly">
<style>
svg {

View File

@@ -0,0 +1,34 @@
<!DOCTYPE html>
<title>Custom Functions: &lt;dashed-function&gt; with named argument syntax</title>
<link rel="help" href="https://drafts.csswg.org/css-mixins-1/#function-rule">
<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/11749">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/css/support/parsing-testcommon.js"></script>
<script>
test_valid_value('top', '--func(myident)');
test_valid_value('top', '--func(--myident)');
test_valid_value('top', '--func(--)');
test_valid_value('top', '--func(50px --myident:)');
// Arguments may not begin within <dashed-ident> <colon> (ignoring whitespace);
// this pattern is reserved for named arguments in the future.
//
// https://github.com/w3c/csswg-drafts/issues/11749
//
// Note: This matches the "bad declaration" handling in
// https://drafts.csswg.org/css-syntax/#consume-qualified-rule
test_invalid_value('top', '--func(--myident:)');
test_invalid_value('top', '--func( --myident:)');
test_invalid_value('top', '--func(--myident :)');
test_invalid_value('top', '--func(--myident: )');
test_invalid_value('top', '--func( --myident : )');
test_invalid_value('top', '--func(10px, --myident : )');
// It's valid when wrapped in {}, though:
test_valid_value('top', '--func({--myident:})');
test_valid_value('top', '--func({ --myident:})');
test_valid_value('top', '--func({--myident :})');
test_valid_value('top', '--func({--myident: })');
test_valid_value('top', '--func(10px, { --myident : })');
</script>

View File

@@ -0,0 +1,46 @@
<!DOCTYPE html>
<title>Custom Functions: Evaluating a &lt;dashed-function> in standard properties</title>
<link rel="help" href="https://drafts.csswg.org/css-mixins-1/#substitute-a-dashed-function">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<style>
@function --ten-px() {
result: 10px;
}
@function --ten-px-typed() returns <length> {
result: 10px;
}
@function --green() {
result: green;
}
#target {
width: --ten-px();
height: --ten-px-typed();
color: --green();
padding: --ten-px();
}
</style>
<div id=target></div>
<script>
test(() => {
assert_equals(getComputedStyle(target).width, '10px');
}, '<dashed-function> in longhand');
test(() => {
assert_equals(getComputedStyle(target).height, '10px');
}, '<dashed-function> with typed result in longhand');
test(() => {
assert_equals(getComputedStyle(target).color, 'rgb(0, 128, 0)');
}, '<dashed-function> with in inherited longhand');
test(() => {
assert_equals(getComputedStyle(target).padding, '10px');
}, '<dashed-function> with typed result in shorthand');
</script>

View File

@@ -0,0 +1,198 @@
<!DOCTYPE html>
<title>Tab focus and ::colum::scroll-marker</title>
<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
<link rel="help" href="https://drafts.csswg.org/css-overflow-5/#scroll-marker-next-focus">
<style>
body {
margin: 0;
}
#container {
scroll-marker-group: before;
overflow: hidden;
columns: 9;
column-fill: auto;
column-rule: solid;
height: 100px;
line-height: 20px;
}
#container::scroll-marker-group {
display: flex;
height: 20px;
background: hotpink;
}
#container::column::scroll-marker {
content: "";
width: 20px;
height: 20px;
margin-right: 5px;
background: blue;
}
#container::column::scroll-marker:focus {
background: cyan;
}
</style>
<div id="container">
<!-- Column #0 -->
<div style="height:100px;">Nothing</div>
<!-- Column #1 -->
<div tabindex="0" id="c1first">line</div>
<div tabindex="0" id="c1second" style="height:180px;">line</div>
<!-- Column #2 only has a resumed block (#c1second). -->
<!-- Column #3 -->
<div tabindex="0" id="inlineBlock" style="display:inline-block; box-sizing:border-box; width:100%; height:90px; border:solid;"></div>
<!-- Column #4 -->
<div>
<div style="display:flex; flex-flow:wrap row-reverse;">
<div tabindex="0" id="flex1" style="width:30%; height:100px;">A</div>
<div tabindex="0" id="flex2" style="width:30%;">B</div>
<div tabindex="0" id="flex3" style="width:30%;">C</div>
<!-- Column #5 -->
<div tabindex="0" id="flex4" style="width:30%;">D</div>
<div tabindex="0" id="flex5" style="width:30%;">E</div>
<div tabindex="0" id="flex6" style="width:30%;">F</div>
</div>
</div>
<div style="display:table;">
<div style="display:table-caption; height:70px; background:cyan;">caption</div>
<!-- Column #6 -->
<div tabindex="0" id="tfoot" style="display:table-footer-group;">footer</div>
<div tabindex="0" id="thead" style="display:table-header-group;">header</div>
<div tabindex="0" id="tbody" style="display:table-row-group;">body</div>
</div>
<div style="position:relative;">
<div style="height:50px; background:black;"></div>
<!-- Column #7 -->
<div tabindex="0" id="c6Abs" style="position:absolute; left:50px;">abs</div>
<div tabindex="0" id="c6Block" style="width:50px;">block</div>
<div style="height:80px; background:black;"></div>
<!-- Column #8 -->
<div tabindex="0" id="c7Block" style="width:50px;">block</div>
<div tabindex="0" id="c7Abs" style="position:absolute; margin-top:-20px; left:50px;">abs</div>
</div>
</div>
<div tabindex="0" id="after">after</div>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-actions.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script>
async function activateMarker(idx) {
await new test_driver.Actions()
.pointerMove(5 + idx*25, 5)
.pointerDown()
.pointerUp()
.send();
}
async function focusNext() {
// https://w3c.github.io/webdriver/#keyboard-actions
const kTab = '\uE004';
await new test_driver.Actions()
.keyDown(kTab)
.keyUp(kTab)
.send();
}
promise_test(async t => {
await activateMarker(4);
await focusNext();
assert_equals(document.activeElement, flex1);
await focusNext();
assert_equals(document.activeElement, flex2);
await focusNext();
assert_equals(document.activeElement, flex3);
await focusNext();
assert_equals(document.activeElement, flex4);
}, "Column 4");
promise_test(async t => {
await activateMarker(3);
await focusNext();
assert_equals(document.activeElement, inlineBlock);
await focusNext();
assert_equals(document.activeElement, flex1);
}, "Column #3");
// TODO(https://github.com/w3c/csswg-drafts/issues/11882): Figure out how to
// treat columns with no elements, and test it here. Column #2 has no start
// elements.
promise_test(async t => {
// At the very least, we should not crash. :)
await activateMarker(2);
await focusNext();
}, "Column #2");
promise_test(async t => {
await activateMarker(1);
await focusNext();
assert_equals(document.activeElement, c1first);
await focusNext();
assert_equals(document.activeElement, c1second);
await focusNext();
assert_equals(document.activeElement, inlineBlock);
}, "Column #1");
promise_test(async t => {
// Column #0 has nothing focusable. The next column has something.
await activateMarker(0);
await focusNext();
assert_equals(document.activeElement, c1first);
}, "Column #0");
promise_test(async t => {
await activateMarker(8);
await focusNext();
assert_equals(document.activeElement, c7Block);
await focusNext();
assert_equals(document.activeElement, c7Abs);
await focusNext();
assert_equals(document.activeElement, after);
}, "Column #8");
promise_test(async t => {
await activateMarker(7);
await focusNext();
assert_equals(document.activeElement, c6Abs);
await focusNext();
assert_equals(document.activeElement, c6Block);
await focusNext();
assert_equals(document.activeElement, c7Block);
}, "Column 7");
promise_test(async t => {
await activateMarker(6);
await focusNext();
assert_equals(document.activeElement, tfoot);
await focusNext();
assert_equals(document.activeElement, thead);
await focusNext();
assert_equals(document.activeElement, tbody);
await focusNext();
assert_equals(document.activeElement, c6Abs);
}, "Column 6");
promise_test(async t => {
await activateMarker(5);
await focusNext();
assert_equals(document.activeElement, flex4);
await focusNext();
assert_equals(document.activeElement, flex5);
await focusNext();
assert_equals(document.activeElement, flex6);
await focusNext();
assert_equals(document.activeElement, tfoot);
}, "Column 5");
</script>

Some files were not shown because too many files have changed in this diff Show More