mirror of
https://github.com/servo/servo
synced 2026-04-25 17:15:48 +02:00
Update web-platform-tests to revision b'7a9307ef9e1e88229ced4a29991270d20911669c'
Signed-off-by: WPT Sync Bot <ghbot+wpt-sync@servo.org>
This commit is contained in:
committed by
WPT Sync Bot
parent
d8fc1d8bb8
commit
772b801f75
8675
tests/wpt/meta/MANIFEST.json
vendored
8675
tests/wpt/meta/MANIFEST.json
vendored
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -4,3 +4,6 @@
|
||||
|
||||
[Property dynamic-range-limit inherits]
|
||||
expected: FAIL
|
||||
|
||||
[Property dynamic-range-limit has initial value no-limit]
|
||||
expected: FAIL
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -1,2 +0,0 @@
|
||||
[table-cell-overflow-auto-scrolled.html]
|
||||
expected: FAIL
|
||||
@@ -1,2 +0,0 @@
|
||||
[preserve3d-and-flattening-001.html]
|
||||
expected: FAIL
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
36
tests/wpt/meta/dom/idlharness.window.js.ini
vendored
36
tests/wpt/meta/dom/idlharness.window.js.ini
vendored
@@ -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]
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
[createImageBitmap-serializable.html]
|
||||
expected: TIMEOUT
|
||||
expected: ERROR
|
||||
[Serialize ImageBitmap created from a vector SVGImageElement]
|
||||
expected: NOTRUN
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
15
tests/wpt/meta/url/a-element-xhtml.xhtml.ini
vendored
15
tests/wpt/meta/url/a-element-xhtml.xhtml.ini
vendored
@@ -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]
|
||||
|
||||
15
tests/wpt/meta/url/a-element.html.ini
vendored
15
tests/wpt/meta/url/a-element.html.ini
vendored
@@ -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
|
||||
|
||||
30
tests/wpt/meta/url/url-constructor.any.js.ini
vendored
30
tests/wpt/meta/url/url-constructor.any.js.ini
vendored
@@ -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>]
|
||||
|
||||
@@ -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
|
||||
|
||||
48
tests/wpt/meta/url/url-setters.any.js.ini
vendored
48
tests/wpt/meta/url/url-setters.any.js.ini
vendored
@@ -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]
|
||||
|
||||
|
||||
4
tests/wpt/tests/.github/workflows/docker.yml
vendored
4
tests/wpt/tests/.github/workflows/docker.yml
vendored
@@ -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
|
||||
|
||||
43
tests/wpt/tests/IndexedDB/request-event-ordering-large-mixed-with-small-values.any.js
vendored
Normal file
43
tests/wpt/tests/IndexedDB/request-event-ordering-large-mixed-with-small-values.any.js
vendored
Normal 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],
|
||||
]);
|
||||
28
tests/wpt/tests/IndexedDB/request-event-ordering-large-then-small-values.any.js
vendored
Normal file
28
tests/wpt/tests/IndexedDB/request-event-ordering-large-then-small-values.any.js
vendored
Normal 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],
|
||||
]);
|
||||
19
tests/wpt/tests/IndexedDB/request-event-ordering-large-values.any.js
vendored
Normal file
19
tests/wpt/tests/IndexedDB/request-event-ordering-large-values.any.js
vendored
Normal 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],
|
||||
]);
|
||||
20
tests/wpt/tests/IndexedDB/request-event-ordering-small-values.any.js
vendored
Normal file
20
tests/wpt/tests/IndexedDB/request-event-ordering-small-values.any.js
vendored
Normal 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],
|
||||
]);
|
||||
@@ -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],
|
||||
]);
|
||||
@@ -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 heading’s 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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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.
|
||||
});
|
||||
@@ -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.');
|
||||
|
||||
@@ -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) {
|
||||
|
||||
10
tests/wpt/tests/common/redirect.py
vendored
10
tests/wpt/tests/common/redirect.py
vendored
@@ -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')
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
'use strict';
|
||||
|
||||
test(() => {
|
||||
promise_test(async () => {
|
||||
const iframe = document.createElement('iframe');
|
||||
document.body.appendChild(iframe);
|
||||
const frame_window = iframe.contentWindow;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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>
|
||||
@@ -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';
|
||||
@@ -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>
|
||||
@@ -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';
|
||||
@@ -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>
|
||||
@@ -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'
|
||||
11
tests/wpt/tests/css/css-anchor-position/anchor-fallback-to-self-crash.html
vendored
Normal file
11
tests/wpt/tests/css/css-anchor-position/anchor-fallback-to-self-crash.html
vendored
Normal 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>
|
||||
66
tests/wpt/tests/css/css-anchor-position/position-try-order-inset-modified-containing-block.html
vendored
Normal file
66
tests/wpt/tests/css/css-anchor-position/position-try-order-inset-modified-containing-block.html
vendored
Normal 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>
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
|
||||
23
tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html
vendored
Normal file
23
tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html
vendored
Normal 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>
|
||||
32
tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-any.html
vendored
Normal file
32
tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-any.html
vendored
Normal 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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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]);
|
||||
}
|
||||
166
tests/wpt/tests/css/css-borders/tentative/corner-shape/resources/corner-shape.js
vendored
Normal file
166
tests/wpt/tests/css/css-borders/tentative/corner-shape/resources/corner-shape.js
vendored
Normal 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();
|
||||
}
|
||||
126
tests/wpt/tests/css/css-borders/tentative/corner-shape/resources/corner-utils.js
vendored
Normal file
126
tests/wpt/tests/css/css-borders/tentative/corner-shape/resources/corner-utils.js
vendored
Normal 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,
|
||||
},
|
||||
];
|
||||
})
|
||||
);
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
8
tests/wpt/tests/css/css-cascade/layer-namespace-sandwich-crash.html
vendored
Normal file
8
tests/wpt/tests/css/css-cascade/layer-namespace-sandwich-crash.html
vendored
Normal 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>
|
||||
64
tests/wpt/tests/css/css-color-hdr/computed.html
vendored
64
tests/wpt/tests/css/css-color-hdr/computed.html
vendored
@@ -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>
|
||||
|
||||
@@ -12,5 +12,5 @@
|
||||
</div>
|
||||
|
||||
<script>
|
||||
assert_inherited('dynamic-range-limit', 'high', 'standard');
|
||||
assert_inherited('dynamic-range-limit', 'no-limit', 'standard');
|
||||
</script>
|
||||
|
||||
@@ -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>
|
||||
|
||||
42
tests/wpt/tests/css/css-color-hdr/parsing.html
vendored
42
tests/wpt/tests/css/css-color-hdr/parsing.html
vendored
@@ -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>
|
||||
|
||||
31
tests/wpt/tests/css/css-color/currentcolor-005-ref.html
vendored
Normal file
31
tests/wpt/tests/css/css-color/currentcolor-005-ref.html
vendored
Normal 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>
|
||||
43
tests/wpt/tests/css/css-color/currentcolor-005.html
vendored
Normal file
43
tests/wpt/tests/css/css-color/currentcolor-005.html
vendored
Normal 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>
|
||||
@@ -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>
|
||||
|
||||
26
tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-001-ref.html
vendored
Normal file
26
tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-001-ref.html
vendored
Normal 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>
|
||||
43
tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-001.html
vendored
Normal file
43
tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-001.html
vendored
Normal 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>
|
||||
38
tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-002-ref.html
vendored
Normal file
38
tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-002-ref.html
vendored
Normal 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>
|
||||
40
tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-002.html
vendored
Normal file
40
tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-002.html
vendored
Normal 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>
|
||||
24
tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-003-ref.html
vendored
Normal file
24
tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-003-ref.html
vendored
Normal 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>
|
||||
35
tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-003.html
vendored
Normal file
35
tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-003.html
vendored
Normal 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>
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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>
|
||||
|
||||
16
tests/wpt/tests/css/css-images/radial-gradient-container-relative-units-001.html
vendored
Normal file
16
tests/wpt/tests/css/css-images/radial-gradient-container-relative-units-001.html
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
<!doctype html>
|
||||
<title>radial-gradient() with container relative unit <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>
|
||||
16
tests/wpt/tests/css/css-images/radial-gradient-container-relative-units-002.html
vendored
Normal file
16
tests/wpt/tests/css/css-images/radial-gradient-container-relative-units-002.html
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
<!doctype html>
|
||||
<title>radial-gradient() with container relative unit <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>
|
||||
16
tests/wpt/tests/css/css-images/radial-gradient-container-relative-units-003.html
vendored
Normal file
16
tests/wpt/tests/css/css-images/radial-gradient-container-relative-units-003.html
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
<!doctype html>
|
||||
<title>radial-gradient() with container relative unit <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>
|
||||
16
tests/wpt/tests/css/css-images/radial-gradient-container-relative-units-004.html
vendored
Normal file
16
tests/wpt/tests/css/css-images/radial-gradient-container-relative-units-004.html
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
<!doctype html>
|
||||
<title>radial-gradient() with container relative unit <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>
|
||||
10
tests/wpt/tests/css/css-images/radial-gradient-container-relative-units-ref.html
vendored
Normal file
10
tests/wpt/tests/css/css-images/radial-gradient-container-relative-units-ref.html
vendored
Normal 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>
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
34
tests/wpt/tests/css/css-mixins/dashed-function-named-arg.tentative.html
vendored
Normal file
34
tests/wpt/tests/css/css-mixins/dashed-function-named-arg.tentative.html
vendored
Normal file
@@ -0,0 +1,34 @@
|
||||
<!DOCTYPE html>
|
||||
<title>Custom Functions: <dashed-function> 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>
|
||||
46
tests/wpt/tests/css/css-mixins/dashed-function-standard-property.html
vendored
Normal file
46
tests/wpt/tests/css/css-mixins/dashed-function-standard-property.html
vendored
Normal file
@@ -0,0 +1,46 @@
|
||||
<!DOCTYPE html>
|
||||
<title>Custom Functions: Evaluating a <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>
|
||||
198
tests/wpt/tests/css/css-overflow/column-scroll-marker-focus-001.html
vendored
Normal file
198
tests/wpt/tests/css/css-overflow/column-scroll-marker-focus-001.html
vendored
Normal 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
Reference in New Issue
Block a user