aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini2
-rw-r--r--tests/wpt/metadata/FileAPI/url/url-with-fetch.any.js.ini3
-rw-r--r--tests/wpt/metadata/MANIFEST.json816
-rw-r--r--tests/wpt/metadata/css/css-color/animation/color-composition.html.ini28
-rw-r--r--tests/wpt/metadata/css/css-flexbox/animation/flex-basis-composition.html.ini76
-rw-r--r--tests/wpt/metadata/css/css-images/animations/object-position-interpolation.html.ini640
-rw-r--r--tests/wpt/metadata/css/css-transforms/animation/perspective-composition.html.ini61
-rw-r--r--tests/wpt/metadata/css/css-transforms/animation/rotate-composition.html.ini187
-rw-r--r--tests/wpt/metadata/css/css-transforms/animation/scale-composition.html.ini115
-rw-r--r--tests/wpt/metadata/css/css-transforms/animation/transform-composition.html.ini64
-rw-r--r--tests/wpt/metadata/css/css-transforms/animation/transform-matrix-composition.html.ini169
-rw-r--r--tests/wpt/metadata/css/css-transforms/animation/transform-perspective-composition.html.ini40
-rw-r--r--tests/wpt/metadata/css/css-transforms/animation/transform-rotate-composition.html.ini190
-rw-r--r--tests/wpt/metadata/css/css-transforms/animation/transform-scale-composition.html.ini148
-rw-r--r--tests/wpt/metadata/css/css-transforms/animation/transform-skew-composition.html.ini130
-rw-r--r--tests/wpt/metadata/css/css-transforms/animation/transform-translate-composition.html.ini169
-rw-r--r--tests/wpt/metadata/css/css-transforms/animation/translate-composition.html.ini154
-rw-r--r--tests/wpt/metadata/css/css-transitions/animations/vertical-align-composition.html.ini61
-rw-r--r--tests/wpt/metadata/fetch/content-type/response.window.js.ini18
-rw-r--r--tests/wpt/metadata/fetch/metadata/appcache.tentative.https.sub.html.ini4
-rw-r--r--tests/wpt/metadata/fetch/security/embedded-credentials.tentative.sub.html.ini2
-rw-r--r--tests/wpt/metadata/html/cross-origin-opener-policy/popup-none.https.html.ini55
-rw-r--r--tests/wpt/metadata/html/cross-origin-opener-policy/popup-same-origin-unsafe-allow-outgoing.https.html.ini55
-rw-r--r--tests/wpt/metadata/html/cross-origin-opener-policy/popup-same-origin.https.html.ini55
-rw-r--r--tests/wpt/metadata/html/cross-origin-opener-policy/popup-same-site-unsafe-allow-outgoing.https.html.ini55
-rw-r--r--tests/wpt/metadata/html/cross-origin-opener-policy/popup-same-site.https.html.ini55
-rw-r--r--tests/wpt/metadata/html/dom/idlharness.worker.js.ini3
-rw-r--r--tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/skip-document-with-fragment.html.ini4
-rw-r--r--tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini12
-rw-r--r--tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-rangeOverflow.html.ini12
-rw-r--r--tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-rangeUnderflow.html.ini12
-rw-r--r--tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-valueMissing.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/forms/the-input-element/input-valueasdate.html.ini79
-rw-r--r--tests/wpt/metadata/html/semantics/forms/the-input-element/input-valueasnumber.html.ini136
-rw-r--r--tests/wpt/metadata/html/semantics/forms/the-input-element/radio.html.ini4
-rw-r--r--tests/wpt/metadata/webmessaging/with-ports/018.html.ini5
-rw-r--r--tests/wpt/metadata/webxr/xrSession_input_events_end.https.html.ini3
-rw-r--r--tests/wpt/metadata/workers/semantics/multiple-workers/005.html.ini1
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/async-interfaces.https.html6
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-rdfa/0234-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-rdfa/0234-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-rdfa/0303-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-rdfa/0303-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-rdfalite/0015-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-rdfalite/0015-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-rdfalite/0030-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-rdfalite/0030-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-rdfalite/0071-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-rdfalite/0071-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-rdfalite/0074-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-rdfalite/0074-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/messages.json6
-rw-r--r--tests/wpt/web-platform-tests/cookies/http-state/general-tests.html3
-rw-r--r--tests/wpt/web-platform-tests/cookies/http-state/resources/cookie-http-state-template.js2
-rw-r--r--tests/wpt/web-platform-tests/cookies/http-state/resources/test-files/0026-test2
-rw-r--r--tests/wpt/web-platform-tests/cookies/http-state/resources/test-files/0028-expected2
-rw-r--r--tests/wpt/web-platform-tests/cookies/http-state/resources/test-files/0028-test2
-rw-r--r--tests/wpt/web-platform-tests/css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background-ref.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background.html6
-rw-r--r--tests/wpt/web-platform-tests/css/css-color-adjust/rendering/dark-color-scheme/color-scheme-root-background.html15
-rw-r--r--tests/wpt/web-platform-tests/css/css-color-adjust/rendering/dark-color-scheme/support/assert-preferred-dark.css9
-rw-r--r--tests/wpt/web-platform-tests/css/css-color-adjust/rendering/dark-color-scheme/support/dark-frame-ref.html5
-rw-r--r--tests/wpt/web-platform-tests/css/css-color-adjust/rendering/dark-color-scheme/support/dark-frame.html6
-rw-r--r--tests/wpt/web-platform-tests/css/css-color/animation/color-composition.html50
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox/animation/flex-basis-composition.html78
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-align-content-distribution-vertical-lr.html358
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-align-content-distribution-vertical-rl.html358
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-align-content-distribution.html358
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/animations/object-position-interpolation.html158
-rw-r--r--tests/wpt/web-platform-tests/css/css-masking/animations/clip-path-composition.html189
-rw-r--r--tests/wpt/web-platform-tests/css/css-position/animations/bottom-composition.html78
-rw-r--r--tests/wpt/web-platform-tests/css/css-position/animations/left-composition.html91
-rw-r--r--tests/wpt/web-platform-tests/css/css-position/animations/position-interpolation.html (renamed from tests/wpt/web-platform-tests/css/css-position/animation/position-interpolation.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-position/animations/right-composition.html78
-rw-r--r--tests/wpt/web-platform-tests/css/css-position/animations/top-composition.html78
-rw-r--r--tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-relayout/changing-scroll-snap-align.html121
-rw-r--r--tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-relayout/changing-scroll-snap-type.html96
-rw-r--r--tests/wpt/web-platform-tests/css/css-transforms/animation/perspective-composition.html65
-rw-r--r--tests/wpt/web-platform-tests/css/css-transforms/animation/rotate-composition.html167
-rw-r--r--tests/wpt/web-platform-tests/css/css-transforms/animation/scale-composition.html101
-rw-r--r--tests/wpt/web-platform-tests/css/css-transforms/animation/transform-composition.html86
-rw-r--r--tests/wpt/web-platform-tests/css/css-transforms/animation/transform-matrix-composition.html208
-rw-r--r--tests/wpt/web-platform-tests/css/css-transforms/animation/transform-perspective-composition.html67
-rw-r--r--tests/wpt/web-platform-tests/css/css-transforms/animation/transform-rotate-composition.html164
-rw-r--r--tests/wpt/web-platform-tests/css/css-transforms/animation/transform-scale-composition.html129
-rw-r--r--tests/wpt/web-platform-tests/css/css-transforms/animation/transform-skew-composition.html124
-rw-r--r--tests/wpt/web-platform-tests/css/css-transforms/animation/transform-translate-composition.html147
-rw-r--r--tests/wpt/web-platform-tests/css/css-transforms/animation/translate-composition.html147
-rw-r--r--tests/wpt/web-platform-tests/css/css-transitions/animations/vertical-align-composition.html65
-rw-r--r--tests/wpt/web-platform-tests/fetch/metadata/appcache.tentative.https.sub.html34
-rw-r--r--tests/wpt/web-platform-tests/fetch/metadata/portal.tentative.https.sub.html6
-rw-r--r--tests/wpt/web-platform-tests/fetch/metadata/resources/record-header.py9
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/coep-navigate-popup.https.html14
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/coep-redirect.https.html11
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/coep.https.html13
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/coop-navigated-popup.https.html2
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/coop-navigated-popup.https.html.headers2
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/coop-sandbox.https.html8
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/coep-navigate-popup-unsafe-inherit.https.html39
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-cross-origin.https.html26
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-cross-origin.https.html.headers (renamed from tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-unsafe-allow-outgoing.https.html.headers)0
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-origin.https.html26
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-origin.https.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-site.https.html26
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-site.https.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-cross-origin.https.html26
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-cross-origin.https.html.headers (renamed from tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-site-unsafe-allow-outgoing.https.html.headers)0
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-origin.https.html26
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-origin.https.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-site.https.html26
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-site.https.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-with-cross-origin.https.html26
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-with-cross-origin.https.html.headers (renamed from tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-site.https.html.headers)0
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-with-same-origin.https.html26
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-with-same-origin.https.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-with-same-site.https.html26
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-with-same-site.https.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/no-https.html15
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-meta-http-equiv.https.html.headers (renamed from tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin.https.html.headers)0
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-none.https.html37
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-cross-origin.https.html26
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-cross-origin.https.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-origin.https.html26
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-origin.https.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-site.https.html26
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-site.https.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-non-initial-about-blank.https.html12
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-unsafe-allow-outgoing.https.html37
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-with-cross-origin.https.html26
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-with-cross-origin.https.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-with-same-origin.https.html26
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-with-same-origin.https.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-with-same-site.https.html26
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-with-same-site.https.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin.https.html37
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-site-unsafe-allow-outgoing.https.html37
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-site.https.html37
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-unsafe-none-with-cross-origin.https.html26
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-unsafe-none-with-same-origin.https.html26
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-unsafe-none-with-same-origin.https.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-unsafe-none-with-same-site.https.html26
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-unspecified-with-cross-origin.https.html26
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-unspecified-with-same-origin.https.html26
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-unspecified-with-same-site.https.html26
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/resources/call-functionCalledByOpenee.html5
-rw-r--r--tests/wpt/web-platform-tests/html/dom/idlharness.worker.js1
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-rangeOverflow.html6
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-rangeUnderflow.html6
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-valueMissing.html3
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-valueasdate.html109
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-valueasnumber.html146
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/radio.html30
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/valueMode.html27
-rw-r--r--tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/assumptions/allowed-to-play.html.ini2
-rw-r--r--tests/wpt/web-platform-tests/lint.whitelist1
-rw-r--r--tests/wpt/web-platform-tests/resources/chromium/nfc-mock.js14
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/opaque-script.https.html71
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/opaque-script-frame.html21
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/opaque-script-large.js41
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/opaque-script-small.js3
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/opaque-script-sw.js37
-rw-r--r--tests/wpt/web-platform-tests/trusted-types/DOMParser-parseFromString-regression.tentative.https.html33
-rw-r--r--tests/wpt/web-platform-tests/trusted-types/TrustedTypePolicyFactory-createPolicy-createXYZTests.tentative.html14
-rw-r--r--tests/wpt/web-platform-tests/trusted-types/support/helper.sub.js12
-rw-r--r--tests/wpt/web-platform-tests/web-nfc/NDEFRecord_constructor.https.html22
-rw-r--r--tests/wpt/web-platform-tests/web-nfc/NDEFWriter_push.https.html19
160 files changed, 6188 insertions, 2598 deletions
diff --git a/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini b/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini
index a9e46713244..76b398963ae 100644
--- a/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini
+++ b/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini
@@ -7,7 +7,7 @@
expected: FAIL
[Opening a blob URL in a new window immediately before revoking it works.]
- expected: TIMEOUT
+ expected: FAIL
[Opening a blob URL in a noopener about:blank window immediately before revoking it works.]
expected: FAIL
diff --git a/tests/wpt/metadata/FileAPI/url/url-with-fetch.any.js.ini b/tests/wpt/metadata/FileAPI/url/url-with-fetch.any.js.ini
index 4c1aa18e695..abf0d50aff3 100644
--- a/tests/wpt/metadata/FileAPI/url/url-with-fetch.any.js.ini
+++ b/tests/wpt/metadata/FileAPI/url/url-with-fetch.any.js.ini
@@ -2,9 +2,6 @@
[Revoke blob URL after creating Request, will fetch]
expected: FAIL
- [Revoke blob URL after calling fetch, fetch should succeed]
- expected: FAIL
-
[url-with-fetch.any.html]
[Revoke blob URL after creating Request, will fetch]
diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json
index 90cda09b09e..be1d74a725a 100644
--- a/tests/wpt/metadata/MANIFEST.json
+++ b/tests/wpt/metadata/MANIFEST.json
@@ -111515,6 +111515,18 @@
{}
]
],
+ "css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background.html": [
+ [
+ "css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background.html",
+ [
+ [
+ "/css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-color/border-bottom-color.xht": [
[
"css/css-color/border-bottom-color.xht",
@@ -221798,7 +221810,7 @@
"conformance-checkers/html-rdfa/0233-isvalid.html": [
[]
],
- "conformance-checkers/html-rdfa/0234-novalid.html": [
+ "conformance-checkers/html-rdfa/0234-isvalid.html": [
[]
],
"conformance-checkers/html-rdfa/0235-isvalid.html": [
@@ -221981,7 +221993,7 @@
"conformance-checkers/html-rdfa/0302-isvalid.html": [
[]
],
- "conformance-checkers/html-rdfa/0303-novalid.html": [
+ "conformance-checkers/html-rdfa/0303-isvalid.html": [
[]
],
"conformance-checkers/html-rdfa/0305-isvalid.html": [
@@ -222065,7 +222077,7 @@
"conformance-checkers/html-rdfa/0331-isvalid.html": [
[]
],
- "conformance-checkers/html-rdfalite/0015-novalid.html": [
+ "conformance-checkers/html-rdfalite/0015-isvalid.html": [
[]
],
"conformance-checkers/html-rdfalite/0021-isvalid.html": [
@@ -222074,7 +222086,7 @@
"conformance-checkers/html-rdfalite/0023-isvalid.html": [
[]
],
- "conformance-checkers/html-rdfalite/0030-novalid.html": [
+ "conformance-checkers/html-rdfalite/0030-isvalid.html": [
[]
],
"conformance-checkers/html-rdfalite/0050-isvalid.html": [
@@ -222092,10 +222104,10 @@
"conformance-checkers/html-rdfalite/0067-isvalid.html": [
[]
],
- "conformance-checkers/html-rdfalite/0071-novalid.html": [
+ "conformance-checkers/html-rdfalite/0071-isvalid.html": [
[]
],
- "conformance-checkers/html-rdfalite/0074-novalid.html": [
+ "conformance-checkers/html-rdfalite/0074-isvalid.html": [
[]
],
"conformance-checkers/html-rdfalite/0075-isvalid.html": [
@@ -248252,6 +248264,18 @@
"css/css-color-adjust/meta/support/compute-root-color-scheme.js": [
[]
],
+ "css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background-ref.html": [
+ []
+ ],
+ "css/css-color-adjust/rendering/dark-color-scheme/support/assert-preferred-dark.css": [
+ []
+ ],
+ "css/css-color-adjust/rendering/dark-color-scheme/support/dark-frame-ref.html": [
+ []
+ ],
+ "css/css-color-adjust/rendering/dark-color-scheme/support/dark-frame.html": [
+ []
+ ],
"css/css-color/LICENSE": [
[]
],
@@ -273371,25 +273395,67 @@
"html/cross-origin-opener-policy/coop-sandbox.https.html.headers": [
[]
],
+ "html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-cross-origin.https.html.headers": [
+ []
+ ],
+ "html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-origin.https.html.headers": [
+ []
+ ],
+ "html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-site.https.html.headers": [
+ []
+ ],
+ "html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-cross-origin.https.html.headers": [
+ []
+ ],
+ "html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-origin.https.html.headers": [
+ []
+ ],
+ "html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-site.https.html.headers": [
+ []
+ ],
+ "html/cross-origin-opener-policy/historical/popup-same-site-with-cross-origin.https.html.headers": [
+ []
+ ],
+ "html/cross-origin-opener-policy/historical/popup-same-site-with-same-origin.https.html.headers": [
+ []
+ ],
+ "html/cross-origin-opener-policy/historical/popup-same-site-with-same-site.https.html.headers": [
+ []
+ ],
"html/cross-origin-opener-policy/no-https.html.headers": [
[]
],
+ "html/cross-origin-opener-policy/popup-meta-http-equiv.https.html.headers": [
+ []
+ ],
"html/cross-origin-opener-policy/popup-redirect-cache.https.html.headers": [
[]
],
+ "html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-cross-origin.https.html.headers": [
+ []
+ ],
+ "html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-origin.https.html.headers": [
+ []
+ ],
+ "html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-site.https.html.headers": [
+ []
+ ],
"html/cross-origin-opener-policy/popup-same-origin-non-initial-about-blank.https.html.headers": [
[]
],
- "html/cross-origin-opener-policy/popup-same-origin-unsafe-allow-outgoing.https.html.headers": [
+ "html/cross-origin-opener-policy/popup-same-origin-with-cross-origin.https.html.headers": [
[]
],
- "html/cross-origin-opener-policy/popup-same-origin.https.html.headers": [
+ "html/cross-origin-opener-policy/popup-same-origin-with-same-origin.https.html.headers": [
[]
],
- "html/cross-origin-opener-policy/popup-same-site-unsafe-allow-outgoing.https.html.headers": [
+ "html/cross-origin-opener-policy/popup-same-origin-with-same-site.https.html.headers": [
[]
],
- "html/cross-origin-opener-policy/popup-same-site.https.html.headers": [
+ "html/cross-origin-opener-policy/popup-unsafe-none-with-same-origin.https.html.headers": [
+ []
+ ],
+ "html/cross-origin-opener-policy/resources/call-functionCalledByOpenee.html": [
[]
],
"html/cross-origin-opener-policy/resources/common.js": [
@@ -286490,6 +286556,18 @@
"service-workers/service-worker/resources/opaque-response-preloaded-xhr.html": [
[]
],
+ "service-workers/service-worker/resources/opaque-script-frame.html": [
+ []
+ ],
+ "service-workers/service-worker/resources/opaque-script-large.js": [
+ []
+ ],
+ "service-workers/service-worker/resources/opaque-script-small.js": [
+ []
+ ],
+ "service-workers/service-worker/resources/opaque-script-sw.js": [
+ []
+ ],
"service-workers/service-worker/resources/other.html": [
[]
],
@@ -323199,6 +323277,18 @@
{}
]
],
+ "css/css-color-adjust/rendering/dark-color-scheme/color-scheme-root-background.html": [
+ [
+ "css/css-color-adjust/rendering/dark-color-scheme/color-scheme-root-background.html",
+ {}
+ ]
+ ],
+ "css/css-color/animation/color-composition.html": [
+ [
+ "css/css-color/animation/color-composition.html",
+ {}
+ ]
+ ],
"css/css-color/animation/color-interpolation.html": [
[
"css/css-color/animation/color-interpolation.html",
@@ -323573,6 +323663,12 @@
{}
]
],
+ "css/css-flexbox/animation/flex-basis-composition.html": [
+ [
+ "css/css-flexbox/animation/flex-basis-composition.html",
+ {}
+ ]
+ ],
"css/css-flexbox/animation/flex-basis-interpolation.html": [
[
"css/css-flexbox/animation/flex-basis-interpolation.html",
@@ -325311,24 +325407,6 @@
{}
]
],
- "css/css-grid/alignment/grid-align-content-distribution-vertical-lr.html": [
- [
- "css/css-grid/alignment/grid-align-content-distribution-vertical-lr.html",
- {}
- ]
- ],
- "css/css-grid/alignment/grid-align-content-distribution-vertical-rl.html": [
- [
- "css/css-grid/alignment/grid-align-content-distribution-vertical-rl.html",
- {}
- ]
- ],
- "css/css-grid/alignment/grid-align-content-distribution.html": [
- [
- "css/css-grid/alignment/grid-align-content-distribution.html",
- {}
- ]
- ],
"css/css-grid/alignment/grid-align-content.html": [
[
"css/css-grid/alignment/grid-align-content.html",
@@ -327177,12 +327255,6 @@
{}
]
],
- "css/css-images/animations/object-position-interpolation.html": [
- [
- "css/css-images/animations/object-position-interpolation.html",
- {}
- ]
- ],
"css/css-images/gradient/color-stops-parsing.html": [
[
"css/css-images/gradient/color-stops-parsing.html",
@@ -328095,6 +328167,12 @@
{}
]
],
+ "css/css-masking/animations/clip-path-composition.html": [
+ [
+ "css/css-masking/animations/clip-path-composition.html",
+ {}
+ ]
+ ],
"css/css-masking/animations/clip-path-interpolation-001.html": [
[
"css/css-masking/animations/clip-path-interpolation-001.html",
@@ -328701,9 +328779,9 @@
{}
]
],
- "css/css-position/animation/position-interpolation.html": [
+ "css/css-position/animations/bottom-composition.html": [
[
- "css/css-position/animation/position-interpolation.html",
+ "css/css-position/animations/bottom-composition.html",
{}
]
],
@@ -328713,18 +328791,42 @@
{}
]
],
+ "css/css-position/animations/left-composition.html": [
+ [
+ "css/css-position/animations/left-composition.html",
+ {}
+ ]
+ ],
"css/css-position/animations/left-interpolation.html": [
[
"css/css-position/animations/left-interpolation.html",
{}
]
],
+ "css/css-position/animations/position-interpolation.html": [
+ [
+ "css/css-position/animations/position-interpolation.html",
+ {}
+ ]
+ ],
+ "css/css-position/animations/right-composition.html": [
+ [
+ "css/css-position/animations/right-composition.html",
+ {}
+ ]
+ ],
"css/css-position/animations/right-interpolation.html": [
[
"css/css-position/animations/right-interpolation.html",
{}
]
],
+ "css/css-position/animations/top-composition.html": [
+ [
+ "css/css-position/animations/top-composition.html",
+ {}
+ ]
+ ],
"css/css-position/animations/top-interpolation.html": [
[
"css/css-position/animations/top-interpolation.html",
@@ -330017,6 +330119,18 @@
{}
]
],
+ "css/css-scroll-snap/snap-after-relayout/changing-scroll-snap-align.html": [
+ [
+ "css/css-scroll-snap/snap-after-relayout/changing-scroll-snap-align.html",
+ {}
+ ]
+ ],
+ "css/css-scroll-snap/snap-after-relayout/changing-scroll-snap-type.html": [
+ [
+ "css/css-scroll-snap/snap-after-relayout/changing-scroll-snap-type.html",
+ {}
+ ]
+ ],
"css/css-scroll-snap/snap-after-relayout/move-current-target.html": [
[
"css/css-scroll-snap/snap-after-relayout/move-current-target.html",
@@ -333959,6 +334073,12 @@
{}
]
],
+ "css/css-transforms/animation/perspective-composition.html": [
+ [
+ "css/css-transforms/animation/perspective-composition.html",
+ {}
+ ]
+ ],
"css/css-transforms/animation/perspective-interpolation.html": [
[
"css/css-transforms/animation/perspective-interpolation.html",
@@ -333971,18 +334091,36 @@
{}
]
],
+ "css/css-transforms/animation/rotate-composition.html": [
+ [
+ "css/css-transforms/animation/rotate-composition.html",
+ {}
+ ]
+ ],
"css/css-transforms/animation/rotate-interpolation.html": [
[
"css/css-transforms/animation/rotate-interpolation.html",
{}
]
],
+ "css/css-transforms/animation/scale-composition.html": [
+ [
+ "css/css-transforms/animation/scale-composition.html",
+ {}
+ ]
+ ],
"css/css-transforms/animation/scale-interpolation.html": [
[
"css/css-transforms/animation/scale-interpolation.html",
{}
]
],
+ "css/css-transforms/animation/transform-composition.html": [
+ [
+ "css/css-transforms/animation/transform-composition.html",
+ {}
+ ]
+ ],
"css/css-transforms/animation/transform-interpolation-001.html": [
[
"css/css-transforms/animation/transform-interpolation-001.html",
@@ -334019,12 +334157,54 @@
{}
]
],
+ "css/css-transforms/animation/transform-matrix-composition.html": [
+ [
+ "css/css-transforms/animation/transform-matrix-composition.html",
+ {}
+ ]
+ ],
"css/css-transforms/animation/transform-origin-interpolation.html": [
[
"css/css-transforms/animation/transform-origin-interpolation.html",
{}
]
],
+ "css/css-transforms/animation/transform-perspective-composition.html": [
+ [
+ "css/css-transforms/animation/transform-perspective-composition.html",
+ {}
+ ]
+ ],
+ "css/css-transforms/animation/transform-rotate-composition.html": [
+ [
+ "css/css-transforms/animation/transform-rotate-composition.html",
+ {}
+ ]
+ ],
+ "css/css-transforms/animation/transform-scale-composition.html": [
+ [
+ "css/css-transforms/animation/transform-scale-composition.html",
+ {}
+ ]
+ ],
+ "css/css-transforms/animation/transform-skew-composition.html": [
+ [
+ "css/css-transforms/animation/transform-skew-composition.html",
+ {}
+ ]
+ ],
+ "css/css-transforms/animation/transform-translate-composition.html": [
+ [
+ "css/css-transforms/animation/transform-translate-composition.html",
+ {}
+ ]
+ ],
+ "css/css-transforms/animation/translate-composition.html": [
+ [
+ "css/css-transforms/animation/translate-composition.html",
+ {}
+ ]
+ ],
"css/css-transforms/animation/translate-interpolation.html": [
[
"css/css-transforms/animation/translate-interpolation.html",
@@ -334331,6 +334511,12 @@
{}
]
],
+ "css/css-transitions/animations/vertical-align-composition.html": [
+ [
+ "css/css-transitions/animations/vertical-align-composition.html",
+ {}
+ ]
+ ],
"css/css-transitions/animations/vertical-align-interpolation.html": [
[
"css/css-transitions/animations/vertical-align-interpolation.html",
@@ -358406,14 +358592,6 @@
{}
]
],
- "fetch/metadata/appcache.tentative.https.sub.html": [
- [
- "fetch/metadata/appcache.tentative.https.sub.html",
- {
- "timeout": "long"
- }
- ]
- ],
"fetch/metadata/download.tentative.https.sub.html": [
[
"fetch/metadata/download.tentative.https.sub.html",
@@ -361690,6 +361868,66 @@
{}
]
],
+ "html/cross-origin-opener-policy/historical/coep-navigate-popup-unsafe-inherit.https.html": [
+ [
+ "html/cross-origin-opener-policy/historical/coep-navigate-popup-unsafe-inherit.https.html",
+ {}
+ ]
+ ],
+ "html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-cross-origin.https.html": [
+ [
+ "html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-cross-origin.https.html",
+ {}
+ ]
+ ],
+ "html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-origin.https.html": [
+ [
+ "html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-origin.https.html",
+ {}
+ ]
+ ],
+ "html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-site.https.html": [
+ [
+ "html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-site.https.html",
+ {}
+ ]
+ ],
+ "html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-cross-origin.https.html": [
+ [
+ "html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-cross-origin.https.html",
+ {}
+ ]
+ ],
+ "html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-origin.https.html": [
+ [
+ "html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-origin.https.html",
+ {}
+ ]
+ ],
+ "html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-site.https.html": [
+ [
+ "html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-site.https.html",
+ {}
+ ]
+ ],
+ "html/cross-origin-opener-policy/historical/popup-same-site-with-cross-origin.https.html": [
+ [
+ "html/cross-origin-opener-policy/historical/popup-same-site-with-cross-origin.https.html",
+ {}
+ ]
+ ],
+ "html/cross-origin-opener-policy/historical/popup-same-site-with-same-origin.https.html": [
+ [
+ "html/cross-origin-opener-policy/historical/popup-same-site-with-same-origin.https.html",
+ {}
+ ]
+ ],
+ "html/cross-origin-opener-policy/historical/popup-same-site-with-same-site.https.html": [
+ [
+ "html/cross-origin-opener-policy/historical/popup-same-site-with-same-site.https.html",
+ {}
+ ]
+ ],
"html/cross-origin-opener-policy/no-https.html": [
[
"html/cross-origin-opener-policy/no-https.html",
@@ -361698,12 +361936,6 @@
}
]
],
- "html/cross-origin-opener-policy/popup-none.https.html": [
- [
- "html/cross-origin-opener-policy/popup-none.https.html",
- {}
- ]
- ],
"html/cross-origin-opener-policy/popup-redirect-cache.https.html": [
[
"html/cross-origin-opener-policy/popup-redirect-cache.https.html",
@@ -361712,33 +361944,81 @@
}
]
],
+ "html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-cross-origin.https.html": [
+ [
+ "html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-cross-origin.https.html",
+ {}
+ ]
+ ],
+ "html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-origin.https.html": [
+ [
+ "html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-origin.https.html",
+ {}
+ ]
+ ],
+ "html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-site.https.html": [
+ [
+ "html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-site.https.html",
+ {}
+ ]
+ ],
"html/cross-origin-opener-policy/popup-same-origin-non-initial-about-blank.https.html": [
[
"html/cross-origin-opener-policy/popup-same-origin-non-initial-about-blank.https.html",
{}
]
],
- "html/cross-origin-opener-policy/popup-same-origin-unsafe-allow-outgoing.https.html": [
+ "html/cross-origin-opener-policy/popup-same-origin-with-cross-origin.https.html": [
[
- "html/cross-origin-opener-policy/popup-same-origin-unsafe-allow-outgoing.https.html",
+ "html/cross-origin-opener-policy/popup-same-origin-with-cross-origin.https.html",
{}
]
],
- "html/cross-origin-opener-policy/popup-same-origin.https.html": [
+ "html/cross-origin-opener-policy/popup-same-origin-with-same-origin.https.html": [
[
- "html/cross-origin-opener-policy/popup-same-origin.https.html",
+ "html/cross-origin-opener-policy/popup-same-origin-with-same-origin.https.html",
{}
]
],
- "html/cross-origin-opener-policy/popup-same-site-unsafe-allow-outgoing.https.html": [
+ "html/cross-origin-opener-policy/popup-same-origin-with-same-site.https.html": [
[
- "html/cross-origin-opener-policy/popup-same-site-unsafe-allow-outgoing.https.html",
+ "html/cross-origin-opener-policy/popup-same-origin-with-same-site.https.html",
{}
]
],
- "html/cross-origin-opener-policy/popup-same-site.https.html": [
+ "html/cross-origin-opener-policy/popup-unsafe-none-with-cross-origin.https.html": [
[
- "html/cross-origin-opener-policy/popup-same-site.https.html",
+ "html/cross-origin-opener-policy/popup-unsafe-none-with-cross-origin.https.html",
+ {}
+ ]
+ ],
+ "html/cross-origin-opener-policy/popup-unsafe-none-with-same-origin.https.html": [
+ [
+ "html/cross-origin-opener-policy/popup-unsafe-none-with-same-origin.https.html",
+ {}
+ ]
+ ],
+ "html/cross-origin-opener-policy/popup-unsafe-none-with-same-site.https.html": [
+ [
+ "html/cross-origin-opener-policy/popup-unsafe-none-with-same-site.https.html",
+ {}
+ ]
+ ],
+ "html/cross-origin-opener-policy/popup-unspecified-with-cross-origin.https.html": [
+ [
+ "html/cross-origin-opener-policy/popup-unspecified-with-cross-origin.https.html",
+ {}
+ ]
+ ],
+ "html/cross-origin-opener-policy/popup-unspecified-with-same-origin.https.html": [
+ [
+ "html/cross-origin-opener-policy/popup-unspecified-with-same-origin.https.html",
+ {}
+ ]
+ ],
+ "html/cross-origin-opener-policy/popup-unspecified-with-same-site.https.html": [
+ [
+ "html/cross-origin-opener-policy/popup-unspecified-with-same-site.https.html",
{}
]
],
@@ -368159,12 +368439,24 @@
{}
]
],
+ "html/semantics/forms/the-input-element/input-valueasdate.html": [
+ [
+ "html/semantics/forms/the-input-element/input-valueasdate.html",
+ {}
+ ]
+ ],
"html/semantics/forms/the-input-element/input-valueasnumber-invalidstateerr.html": [
[
"html/semantics/forms/the-input-element/input-valueasnumber-invalidstateerr.html",
{}
]
],
+ "html/semantics/forms/the-input-element/input-valueasnumber.html": [
+ [
+ "html/semantics/forms/the-input-element/input-valueasnumber.html",
+ {}
+ ]
+ ],
"html/semantics/forms/the-input-element/input-width.html": [
[
"html/semantics/forms/the-input-element/input-width.html",
@@ -411784,6 +412076,12 @@
{}
]
],
+ "service-workers/service-worker/opaque-script.https.html": [
+ [
+ "service-workers/service-worker/opaque-script.https.html",
+ {}
+ ]
+ ],
"service-workers/service-worker/performance-timeline.https.html": [
[
"service-workers/service-worker/performance-timeline.https.html",
@@ -421507,6 +421805,12 @@
{}
]
],
+ "trusted-types/DOMParser-parseFromString-regression.tentative.https.html": [
+ [
+ "trusted-types/DOMParser-parseFromString-regression.tentative.https.html",
+ {}
+ ]
+ ],
"trusted-types/DOMParser-parseFromString.tentative.html": [
[
"trusted-types/DOMParser-parseFromString.tentative.html",
@@ -476223,7 +476527,7 @@
"support"
],
"clipboard-apis/async-interfaces.https.html": [
- "e19c958f975d7967b8028a13d6901bdbd2ab4553",
+ "1c423e95b669a30a6af86db7a84d76a5a9c176b4",
"testharness"
],
"clipboard-apis/async-navigator-clipboard-basics.https.html": [
@@ -481130,7 +481434,7 @@
"586778ecf3e36244968d54a711fef6a035986c05",
"support"
],
- "conformance-checkers/html-rdfa/0234-novalid.html": [
+ "conformance-checkers/html-rdfa/0234-isvalid.html": [
"3dfbdaa03d93769c270dfaf87cdec0cf120d5751",
"support"
],
@@ -481374,7 +481678,7 @@
"21020d0fc4c41b3449e5b2e2f56ac63367e076d1",
"support"
],
- "conformance-checkers/html-rdfa/0303-novalid.html": [
+ "conformance-checkers/html-rdfa/0303-isvalid.html": [
"644420959045203ee02cc940a62876d714a1b778",
"support"
],
@@ -481486,7 +481790,7 @@
"f54979398d563a4f38b1e7375cdb42dce8e61336",
"support"
],
- "conformance-checkers/html-rdfalite/0015-novalid.html": [
+ "conformance-checkers/html-rdfalite/0015-isvalid.html": [
"94742da735dc35c176558f3116912d9cb5191835",
"support"
],
@@ -481498,7 +481802,7 @@
"5859d4578811a169c7301ae4aac46a04e71b30ab",
"support"
],
- "conformance-checkers/html-rdfalite/0030-novalid.html": [
+ "conformance-checkers/html-rdfalite/0030-isvalid.html": [
"7fd1a85ec7a8be9415b93a5499999f073c6f79ea",
"support"
],
@@ -481522,11 +481826,11 @@
"e60e30e04da0c258209049899af231dd045d56fb",
"support"
],
- "conformance-checkers/html-rdfalite/0071-novalid.html": [
+ "conformance-checkers/html-rdfalite/0071-isvalid.html": [
"511e0b7107bec347b54ff2963dcd5dca11cc8192",
"support"
],
- "conformance-checkers/html-rdfalite/0074-novalid.html": [
+ "conformance-checkers/html-rdfalite/0074-isvalid.html": [
"d25af2d53237d2ca2b46a853dc40efb7d25b40b3",
"support"
],
@@ -493871,7 +494175,7 @@
"support"
],
"conformance-checkers/messages.json": [
- "4439888f1753132daf7aa6c07dc55397a18d94fd",
+ "6c0e2c035e931e12e701fd9d6c145216e4a8bb6f",
"support"
],
"conformance-checkers/tools/build-svg-tests.py": [
@@ -497579,7 +497883,7 @@
"testharness"
],
"cookies/http-state/general-tests.html": [
- "c8b7ea4ecb1c1203ad23afa5a6436693d4b125f6",
+ "d80527f9b0aa22c0611edff546d5663198a412bb",
"testharness"
],
"cookies/http-state/mozilla-tests.html": [
@@ -497603,7 +497907,7 @@
"support"
],
"cookies/http-state/resources/cookie-http-state-template.js": [
- "62459f059fd147779354140d1e830ea52a263abe",
+ "b2af226e22ead4870133c402df00ca50cf9b0d97",
"support"
],
"cookies/http-state/resources/cookie-setter.py": [
@@ -497827,7 +498131,7 @@
"support"
],
"cookies/http-state/resources/test-files/0026-test": [
- "609c6680b8281f845faa605b7d812bbecb8d615d",
+ "5ac72745f978b8394b583d10f1ae466d1055e2d4",
"support"
],
"cookies/http-state/resources/test-files/0027-expected": [
@@ -497839,11 +498143,11 @@
"support"
],
"cookies/http-state/resources/test-files/0028-expected": [
- "609c6680b8281f845faa605b7d812bbecb8d615d",
+ "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
"support"
],
"cookies/http-state/resources/test-files/0028-test": [
- "609c6680b8281f845faa605b7d812bbecb8d615d",
+ "fea1e1a643b97d4a101d704bd1497376a4997b3c",
"support"
],
"cookies/http-state/resources/test-files/attribute0001-expected": [
@@ -565466,6 +565770,30 @@
"5fb481783f0134b3b233ceb17ea4a0897eeee403",
"testharness"
],
+ "css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background-ref.html": [
+ "8cc4618ede4af030adc8fe5f119deccf3c2e3882",
+ "support"
+ ],
+ "css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background.html": [
+ "ee0f006b5b25702f0b2c485c46e7b8ef6788147c",
+ "reftest"
+ ],
+ "css/css-color-adjust/rendering/dark-color-scheme/color-scheme-root-background.html": [
+ "a6363971819a44e4bfc29891cbf51af6d24d1279",
+ "testharness"
+ ],
+ "css/css-color-adjust/rendering/dark-color-scheme/support/assert-preferred-dark.css": [
+ "73671b8a819ed81958b4359a1a3904f86cc98ec6",
+ "support"
+ ],
+ "css/css-color-adjust/rendering/dark-color-scheme/support/dark-frame-ref.html": [
+ "0975119f56eee163041d58b96b80bd57173c44a9",
+ "support"
+ ],
+ "css/css-color-adjust/rendering/dark-color-scheme/support/dark-frame.html": [
+ "11f88db4a0b3e94d620b5a92314c88040210cfae",
+ "support"
+ ],
"css/css-color/LICENSE": [
"d47f50cca8a2d9dc40dee384ae256f8aecf44e0a",
"support"
@@ -565474,6 +565802,10 @@
"a0e70aa6539e88373bc8615c3f4e1453010e85d5",
"support"
],
+ "css/css-color/animation/color-composition.html": [
+ "c3e481830b6155114e6e6f543acc27c02c59c687",
+ "testharness"
+ ],
"css/css-color/animation/color-interpolation.html": [
"4b39fdcf796083ace917f0a021a697c6e4eb7214",
"testharness"
@@ -570254,6 +570586,10 @@
"f16d29835f7aef92f278fa5bc28317dc913f3544",
"reftest"
],
+ "css/css-flexbox/animation/flex-basis-composition.html": [
+ "122761e47679945d000623b6ae6fbe6d13cd5fba",
+ "testharness"
+ ],
"css/css-flexbox/animation/flex-basis-interpolation.html": [
"d66e81d4924f6b419a0e467119e5ce6dd27e2966",
"testharness"
@@ -582370,18 +582706,6 @@
"d45df4bc2231cbda5dee1bafc3f386f008024d79",
"support"
],
- "css/css-grid/alignment/grid-align-content-distribution-vertical-lr.html": [
- "8217f4dd2c3cfd031aece87d54a78d5bcec640ca",
- "testharness"
- ],
- "css/css-grid/alignment/grid-align-content-distribution-vertical-rl.html": [
- "096e3fd6910a09ba5097b66acdb1dcf8a6d5326e",
- "testharness"
- ],
- "css/css-grid/alignment/grid-align-content-distribution.html": [
- "7b66ddb995191c67278d861aa6cb6a637bc6adaf",
- "testharness"
- ],
"css/css-grid/alignment/grid-align-content.html": [
"fb3f7007ee19189a09de9c1f786176c317b7ee14",
"testharness"
@@ -585186,10 +585510,6 @@
"8d3b9472b2c9a2ee88dc97f907f9d16eb4fa3755",
"support"
],
- "css/css-images/animations/object-position-interpolation.html": [
- "055cbc8421b6af58e636729268f7323e1710458c",
- "testharness"
- ],
"css/css-images/css-image-fallbacks-and-annotations-ref.html": [
"f3193036766e428bf946e81b7df72bfc7f4901db",
"support"
@@ -587398,6 +587718,10 @@
"322ebd724e8524e85d8afe369b6bafaabbec8c79",
"testharness"
],
+ "css/css-masking/animations/clip-path-composition.html": [
+ "2275ae70a330e06214f3c612acdba186efde99cd",
+ "testharness"
+ ],
"css/css-masking/animations/clip-path-interpolation-001.html": [
"21c34f1f2b75ec7345a97b00db62a49b038cf026",
"testharness"
@@ -591810,22 +592134,38 @@
"c1ce1ff602eee4668b9cb5d0168c4372193a8d3a",
"support"
],
- "css/css-position/animation/position-interpolation.html": [
- "a4ad50240a40674afe76b4c76a08feb9c4e27b12",
+ "css/css-position/animations/bottom-composition.html": [
+ "68a830dfbda2e4f15372ccc89be65d67602bf4b1",
"testharness"
],
"css/css-position/animations/bottom-interpolation.html": [
"272e79fc05b0267afe696c11ea0572299559d223",
"testharness"
],
+ "css/css-position/animations/left-composition.html": [
+ "14b3dfda76dc219bda706e48f7e6846b20e242cf",
+ "testharness"
+ ],
"css/css-position/animations/left-interpolation.html": [
"33ed0b4ec3b961bc0f71fc1b784b51201f50ebfa",
"testharness"
],
+ "css/css-position/animations/position-interpolation.html": [
+ "a4ad50240a40674afe76b4c76a08feb9c4e27b12",
+ "testharness"
+ ],
+ "css/css-position/animations/right-composition.html": [
+ "995bb8d6bec8056c1e72ddbaa05b624a1072c9a8",
+ "testharness"
+ ],
"css/css-position/animations/right-interpolation.html": [
"284d435e56eac5370edd570d2f67b0dfeaa6bbf6",
"testharness"
],
+ "css/css-position/animations/top-composition.html": [
+ "47782e8536fa2895d67fc4f91a182899f5da0d50",
+ "testharness"
+ ],
"css/css-position/animations/top-interpolation.html": [
"f5af530c387a7b52a78a4ca13b27d976f60b2dc9",
"testharness"
@@ -596594,6 +596934,14 @@
"d26359658f479c61df8d0a559fcb5558f63106a6",
"testharness"
],
+ "css/css-scroll-snap/snap-after-relayout/changing-scroll-snap-align.html": [
+ "3be68fe841a0d6183b83d5b7287b70883c3cfce7",
+ "testharness"
+ ],
+ "css/css-scroll-snap/snap-after-relayout/changing-scroll-snap-type.html": [
+ "70774b3d40f691fe4feb623b4dfe430b12f4e8c0",
+ "testharness"
+ ],
"css/css-scroll-snap/snap-after-relayout/move-current-target.html": [
"83c2c478bf5921cedd9cb4d48b5de14533f4bbcd",
"testharness"
@@ -608298,6 +608646,10 @@
"a326e7c92f21aca39613c6964055b9592b35b034",
"testharness"
],
+ "css/css-transforms/animation/perspective-composition.html": [
+ "6fa745d6ed2266cd4535a114a073e386eeb07488",
+ "testharness"
+ ],
"css/css-transforms/animation/perspective-interpolation.html": [
"a27f84a11bdc3999eb5183dc3251878053c43bac",
"testharness"
@@ -608306,14 +608658,26 @@
"0a1e74cb8ec6d0539fe04f0be765ec67b3d78b7e",
"testharness"
],
+ "css/css-transforms/animation/rotate-composition.html": [
+ "fa0118d50f457b3021a28a7e12a21c96c1c5a23c",
+ "testharness"
+ ],
"css/css-transforms/animation/rotate-interpolation.html": [
"eff60ba72f72c126ce442a02e89a6b1875190297",
"testharness"
],
+ "css/css-transforms/animation/scale-composition.html": [
+ "6fc4de61132cd2b3c887f9a932c2e820fd5cdb38",
+ "testharness"
+ ],
"css/css-transforms/animation/scale-interpolation.html": [
"0e33371955bb7ea630939de5c0333355f9830586",
"testharness"
],
+ "css/css-transforms/animation/transform-composition.html": [
+ "928da71a9b9c0ff8d5552976ee2b635f1f3567b6",
+ "testharness"
+ ],
"css/css-transforms/animation/transform-interpolation-001.html": [
"4647c2c9119baa9d998f14f2f4973fc3607fd51b",
"testharness"
@@ -608338,10 +608702,38 @@
"c69bad7c93b8448b763e7f98d0ed6b50783ed7d2",
"testharness"
],
+ "css/css-transforms/animation/transform-matrix-composition.html": [
+ "2586ff3d4a577b9c4b43a2841884c6f490d7ccf3",
+ "testharness"
+ ],
"css/css-transforms/animation/transform-origin-interpolation.html": [
"02b8b59b0b92cb37c4cce43a06ff1e9eff2b41e4",
"testharness"
],
+ "css/css-transforms/animation/transform-perspective-composition.html": [
+ "82f8dad59b6590c325ae7b4d2de7cf7b72959c71",
+ "testharness"
+ ],
+ "css/css-transforms/animation/transform-rotate-composition.html": [
+ "e062860e72937121ed290c81a1e14276899ec383",
+ "testharness"
+ ],
+ "css/css-transforms/animation/transform-scale-composition.html": [
+ "87c33a85ed672612ec60570001f1b9a2bf4f05c9",
+ "testharness"
+ ],
+ "css/css-transforms/animation/transform-skew-composition.html": [
+ "cda44b60c0ed9683291ee6341d14c28cf327a4af",
+ "testharness"
+ ],
+ "css/css-transforms/animation/transform-translate-composition.html": [
+ "49214c4a93c8c1d16416c131a6780564e474e723",
+ "testharness"
+ ],
+ "css/css-transforms/animation/translate-composition.html": [
+ "3abdb4522b07094ca689acee9fc7e252f18438ec",
+ "testharness"
+ ],
"css/css-transforms/animation/translate-interpolation.html": [
"67d9b136211670a4fe664e880feff802c95d897b",
"testharness"
@@ -612662,6 +613054,10 @@
"c007816ecb04236421ff0aea8861da19c244338a",
"testharness"
],
+ "css/css-transitions/animations/vertical-align-composition.html": [
+ "222a511679b999cc684d26fc3c5e73bfc1d0ee46",
+ "testharness"
+ ],
"css/css-transitions/animations/vertical-align-interpolation.html": [
"c81c83239354cc3c179612f26f95891dac8e3676",
"testharness"
@@ -648986,10 +649382,6 @@
"34864d4a4b6bd911f496026ada7bdc41ba3a6905",
"support"
],
- "fetch/metadata/appcache.tentative.https.sub.html": [
- "3dc47c696fb87ead0ef808b99b7e6e52cff01ebe",
- "testharness"
- ],
"fetch/metadata/download.tentative.https.sub.html": [
"6f2a0434d497f695a44cc0d8972083d7cfa194c9",
"testharness"
@@ -649051,7 +649443,7 @@
"testharness"
],
"fetch/metadata/portal.tentative.https.sub.html": [
- "4e50b6b24b356dac6c6c7f5b7d17b7f4f01431c1",
+ "96067ae82ab7838784f6350dda7cee7840e277f8",
"testharness"
],
"fetch/metadata/prefetch.tentative.https.sub.html": [
@@ -649155,7 +649547,7 @@
"support"
],
"fetch/metadata/resources/record-header.py": [
- "3bfb1fcdfaab6f166149b5a451f58e82bbc48531",
+ "364c800a19ce6f2060a97019d222acbf71045e93",
"support"
],
"fetch/metadata/resources/redirectTestHelper.sub.js": [
@@ -653903,7 +654295,7 @@
"support"
],
"html/cross-origin-opener-policy/coep-navigate-popup.https.html": [
- "21320a61b2eaa8b17cbb518d2028a5dce4134bf7",
+ "faa2793e5faaa81d4d819110ec1045dac9d9cde0",
"testharness"
],
"html/cross-origin-opener-policy/coep-navigate-popup.https.html.headers": [
@@ -653911,7 +654303,7 @@
"support"
],
"html/cross-origin-opener-policy/coep-redirect.https.html": [
- "73f07ddef88877aacf36ea43d47cc7aee85e5508",
+ "2727013783fa3d3c6a26f6746c1a0c28c59fdf19",
"testharness"
],
"html/cross-origin-opener-policy/coep-redirect.https.html.headers": [
@@ -653919,7 +654311,7 @@
"support"
],
"html/cross-origin-opener-policy/coep.https.html": [
- "64994cdfb76f18cb11c42cc8258209fcfd1091e3",
+ "de1dd56d9d55e5e3f1de62b16058139204c2e098",
"testharness"
],
"html/cross-origin-opener-policy/coep.https.html.headers": [
@@ -653927,32 +654319,108 @@
"support"
],
"html/cross-origin-opener-policy/coop-navigated-popup.https.html": [
- "9a92dd9bde885e9e3ee19c6e4ef93a0e7b82e418",
+ "3c6019ace0b308562cca08d6d6bfd6484882e1db",
"testharness"
],
"html/cross-origin-opener-policy/coop-navigated-popup.https.html.headers": [
- "a19f4400cea33a60c99807330704a23ee363b146",
+ "d83ed86fb9b5d159b9f380424887402edc96cb75",
"support"
],
"html/cross-origin-opener-policy/coop-sandbox.https.html": [
- "e471b1eda2ef28a1022e86a9d254608d02578e55",
+ "fc16c186cadf44bd1639d0eacf610e7781bc02bd",
"testharness"
],
"html/cross-origin-opener-policy/coop-sandbox.https.html.headers": [
"46ad58d83bf6e98913ca4c564b7acb8f19fa0093",
"support"
],
+ "html/cross-origin-opener-policy/historical/coep-navigate-popup-unsafe-inherit.https.html": [
+ "73ef1ea29a2e91f0e4f9a9867081fe8aa5a9c81b",
+ "testharness"
+ ],
+ "html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-cross-origin.https.html": [
+ "a8b6d543cd018b06b962b4ad1ef41b8c043ae496",
+ "testharness"
+ ],
+ "html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-cross-origin.https.html.headers": [
+ "a19f4400cea33a60c99807330704a23ee363b146",
+ "support"
+ ],
+ "html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-origin.https.html": [
+ "aaaae2dc31799bc46d58424133edb47a8b31794c",
+ "testharness"
+ ],
+ "html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-origin.https.html.headers": [
+ "a19f4400cea33a60c99807330704a23ee363b146",
+ "support"
+ ],
+ "html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-site.https.html": [
+ "fd58b06f783966f2ad24c2c2443c422fce2e94d0",
+ "testharness"
+ ],
+ "html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-site.https.html.headers": [
+ "a19f4400cea33a60c99807330704a23ee363b146",
+ "support"
+ ],
+ "html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-cross-origin.https.html": [
+ "7330ff75bcff697490ee248f938bdbb9c79f6b88",
+ "testharness"
+ ],
+ "html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-cross-origin.https.html.headers": [
+ "ab7b28948150ff64101ef080b0d9c7cc9a6a34d2",
+ "support"
+ ],
+ "html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-origin.https.html": [
+ "01cc6719fd3a202514444765ff6a4e4d2153f2f1",
+ "testharness"
+ ],
+ "html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-origin.https.html.headers": [
+ "ab7b28948150ff64101ef080b0d9c7cc9a6a34d2",
+ "support"
+ ],
+ "html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-site.https.html": [
+ "b1a664dd9a5b8e8dd4cf561a31f85e8f2e88ae2d",
+ "testharness"
+ ],
+ "html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-site.https.html.headers": [
+ "ab7b28948150ff64101ef080b0d9c7cc9a6a34d2",
+ "support"
+ ],
+ "html/cross-origin-opener-policy/historical/popup-same-site-with-cross-origin.https.html": [
+ "d0fc7c79841eab57d810566e4eedc3e4f338d954",
+ "testharness"
+ ],
+ "html/cross-origin-opener-policy/historical/popup-same-site-with-cross-origin.https.html.headers": [
+ "34bd099a302f893f92586241ea38aac812bf28d0",
+ "support"
+ ],
+ "html/cross-origin-opener-policy/historical/popup-same-site-with-same-origin.https.html": [
+ "67d2523e28d9af525449a192f659d5be1768532c",
+ "testharness"
+ ],
+ "html/cross-origin-opener-policy/historical/popup-same-site-with-same-origin.https.html.headers": [
+ "34bd099a302f893f92586241ea38aac812bf28d0",
+ "support"
+ ],
+ "html/cross-origin-opener-policy/historical/popup-same-site-with-same-site.https.html": [
+ "78b7ca8fcad0f5a68dbf3fefd3d1945564783fad",
+ "testharness"
+ ],
+ "html/cross-origin-opener-policy/historical/popup-same-site-with-same-site.https.html.headers": [
+ "34bd099a302f893f92586241ea38aac812bf28d0",
+ "support"
+ ],
"html/cross-origin-opener-policy/no-https.html": [
- "014ba1f333b5e254609819bd99618ebcc6b7391b",
+ "f4e926b2eb2838c443f2e8f4d3bc024e719039a7",
"testharness"
],
"html/cross-origin-opener-policy/no-https.html.headers": [
"46ad58d83bf6e98913ca4c564b7acb8f19fa0093",
"support"
],
- "html/cross-origin-opener-policy/popup-none.https.html": [
- "62633457d3f57135658fb4bdf959fce278dc9851",
- "testharness"
+ "html/cross-origin-opener-policy/popup-meta-http-equiv.https.html.headers": [
+ "46ad58d83bf6e98913ca4c564b7acb8f19fa0093",
+ "support"
],
"html/cross-origin-opener-policy/popup-redirect-cache.https.html": [
"0524878a03a8d3764c63b77b5c8c4f1453c5a288",
@@ -653962,44 +654430,92 @@
"46ad58d83bf6e98913ca4c564b7acb8f19fa0093",
"support"
],
+ "html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-cross-origin.https.html": [
+ "cea3788ba83d41a97b3b59bd2744db079f272a45",
+ "testharness"
+ ],
+ "html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-cross-origin.https.html.headers": [
+ "d83ed86fb9b5d159b9f380424887402edc96cb75",
+ "support"
+ ],
+ "html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-origin.https.html": [
+ "a50231f82287b03d15c186472767c215035886f6",
+ "testharness"
+ ],
+ "html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-origin.https.html.headers": [
+ "d83ed86fb9b5d159b9f380424887402edc96cb75",
+ "support"
+ ],
+ "html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-site.https.html": [
+ "53b4263a70fd41bd044440abeddce3b9585e5850",
+ "testharness"
+ ],
+ "html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-site.https.html.headers": [
+ "d83ed86fb9b5d159b9f380424887402edc96cb75",
+ "support"
+ ],
"html/cross-origin-opener-policy/popup-same-origin-non-initial-about-blank.https.html": [
- "65ec3b26aa0c6e7e5df857bde88f67d394af2e9e",
+ "d4005ac20d8d7d9b215fe73785d9a1a3466fcef3",
"testharness"
],
"html/cross-origin-opener-policy/popup-same-origin-non-initial-about-blank.https.html.headers": [
"46ad58d83bf6e98913ca4c564b7acb8f19fa0093",
"support"
],
- "html/cross-origin-opener-policy/popup-same-origin-unsafe-allow-outgoing.https.html": [
- "2f8ebc3be3fcc7e23e64c95d5ceaaf83dfa1f67f",
+ "html/cross-origin-opener-policy/popup-same-origin-with-cross-origin.https.html": [
+ "9f7d27b3c8dc381f893c6ccf84c463db7f503f9b",
"testharness"
],
- "html/cross-origin-opener-policy/popup-same-origin-unsafe-allow-outgoing.https.html.headers": [
- "a19f4400cea33a60c99807330704a23ee363b146",
+ "html/cross-origin-opener-policy/popup-same-origin-with-cross-origin.https.html.headers": [
+ "46ad58d83bf6e98913ca4c564b7acb8f19fa0093",
"support"
],
- "html/cross-origin-opener-policy/popup-same-origin.https.html": [
- "964011ff7621155446925010c143b025954a5a61",
+ "html/cross-origin-opener-policy/popup-same-origin-with-same-origin.https.html": [
+ "c84219a80f5c83ca6e4dc244406db9f05461fa83",
"testharness"
],
- "html/cross-origin-opener-policy/popup-same-origin.https.html.headers": [
+ "html/cross-origin-opener-policy/popup-same-origin-with-same-origin.https.html.headers": [
"46ad58d83bf6e98913ca4c564b7acb8f19fa0093",
"support"
],
- "html/cross-origin-opener-policy/popup-same-site-unsafe-allow-outgoing.https.html": [
- "18ee909d1865567706674b75b40a6615ef75908c",
+ "html/cross-origin-opener-policy/popup-same-origin-with-same-site.https.html": [
+ "b875cc2e0e4abbc215be36111a22414f72126138",
"testharness"
],
- "html/cross-origin-opener-policy/popup-same-site-unsafe-allow-outgoing.https.html.headers": [
- "ab7b28948150ff64101ef080b0d9c7cc9a6a34d2",
+ "html/cross-origin-opener-policy/popup-same-origin-with-same-site.https.html.headers": [
+ "46ad58d83bf6e98913ca4c564b7acb8f19fa0093",
"support"
],
- "html/cross-origin-opener-policy/popup-same-site.https.html": [
- "9a0db2765daeb445a892a8ece7347c6b97f24917",
+ "html/cross-origin-opener-policy/popup-unsafe-none-with-cross-origin.https.html": [
+ "5cbf5b4c20c9b89c5cf946ebeea1733fbfb57c2c",
"testharness"
],
- "html/cross-origin-opener-policy/popup-same-site.https.html.headers": [
- "34bd099a302f893f92586241ea38aac812bf28d0",
+ "html/cross-origin-opener-policy/popup-unsafe-none-with-same-origin.https.html": [
+ "f8a4ebe71288d6071f3d644607132a32b0c63f79",
+ "testharness"
+ ],
+ "html/cross-origin-opener-policy/popup-unsafe-none-with-same-origin.https.html.headers": [
+ "073ce7adfbd81cb7c0b2f91f96c8349b6677f26c",
+ "support"
+ ],
+ "html/cross-origin-opener-policy/popup-unsafe-none-with-same-site.https.html": [
+ "e38acf4fcb1e1d0b039894013ab56e011c5efa8f",
+ "testharness"
+ ],
+ "html/cross-origin-opener-policy/popup-unspecified-with-cross-origin.https.html": [
+ "d89398cd653de327a10ff53b58b29a62e422ffb8",
+ "testharness"
+ ],
+ "html/cross-origin-opener-policy/popup-unspecified-with-same-origin.https.html": [
+ "cb6fc02ac171f606cb00a315d327062d13f32e91",
+ "testharness"
+ ],
+ "html/cross-origin-opener-policy/popup-unspecified-with-same-site.https.html": [
+ "6e0edfa04233865f802a12a3ad3c4f26d50866f7",
+ "testharness"
+ ],
+ "html/cross-origin-opener-policy/resources/call-functionCalledByOpenee.html": [
+ "d0ff0b723e0f31c6ed635db95851769a598ce2a1",
"support"
],
"html/cross-origin-opener-policy/resources/common.js": [
@@ -655071,7 +655587,7 @@
"testharness"
],
"html/dom/idlharness.worker.js": [
- "b720d54f3d953633bd7abd1e73097a31a369e825",
+ "feddaf54c9235dbb766f79990f729c8e441cbbec",
"testharness"
],
"html/dom/new-harness.js": [
@@ -664807,11 +665323,11 @@
"testharness"
],
"html/semantics/forms/constraints/form-validation-validity-rangeOverflow.html": [
- "fedf2ea4e4f0aa5018db5bb24ec3bf0e15333992",
+ "2f69407592ecf0502a75782f6094beaf9310986d",
"testharness"
],
"html/semantics/forms/constraints/form-validation-validity-rangeUnderflow.html": [
- "8ac3aae1279c0f6df2203251aae26854ba551b57",
+ "c939a94c37e160f374445ec1def14137764e54d4",
"testharness"
],
"html/semantics/forms/constraints/form-validation-validity-stepMismatch.html": [
@@ -664835,7 +665351,7 @@
"testharness"
],
"html/semantics/forms/constraints/form-validation-validity-valueMissing.html": [
- "2e1c666436a19bc759026ebf55df4a17073ecb5d",
+ "3229527fabc00880bd2f95d7aa4f494ce9884fa3",
"testharness"
],
"html/semantics/forms/constraints/form-validation-willValidate.html": [
@@ -665546,10 +666062,18 @@
"bd49a15fc82136105c17818561cc1e8f7fbfe7ee",
"testharness"
],
+ "html/semantics/forms/the-input-element/input-valueasdate.html": [
+ "a958e991ec53a22413bc311d832bc28b3b4baccf",
+ "testharness"
+ ],
"html/semantics/forms/the-input-element/input-valueasnumber-invalidstateerr.html": [
"a3187ff3fbca4252d701b30c761819f5075611cc",
"testharness"
],
+ "html/semantics/forms/the-input-element/input-valueasnumber.html": [
+ "321c981c74d2293694fecf18284126b089aca1c2",
+ "testharness"
+ ],
"html/semantics/forms/the-input-element/input-width.html": [
"5278ff77e1e7523a74970c5b85a94e29e66ea8e4",
"testharness"
@@ -665619,7 +666143,7 @@
"testharness"
],
"html/semantics/forms/the-input-element/radio.html": [
- "c37fa7acd0c705e4711be719b9f99ce4db929560",
+ "7dcc9a14a8980898917d8d771041bd691e99785f",
"testharness"
],
"html/semantics/forms/the-input-element/range-2.html": [
@@ -665703,7 +666227,7 @@
"testharness"
],
"html/semantics/forms/the-input-element/valueMode.html": [
- "9525d3ca1feedb651b18fefed8391d3584f36189",
+ "5502011794fcfdcfae5161ca861448ceb503dc54",
"testharness"
],
"html/semantics/forms/the-input-element/week.html": [
@@ -671907,7 +672431,7 @@
"support"
],
"infrastructure/metadata/infrastructure/assumptions/allowed-to-play.html.ini": [
- "c6f136d9715e86db9952dd6eac80b09b7782eed8",
+ "87726f492394955e3835a6a6675cae490669d5de",
"support"
],
"infrastructure/metadata/infrastructure/assumptions/document-fonts-ready.html.ini": [
@@ -673847,7 +674371,7 @@
"testharness"
],
"lint.whitelist": [
- "62644762ce2bce2cbf0c3c8527cac8384ce00256",
+ "353922a456c4dbeacd2ab6d651b64be00c9a4903",
"support"
],
"loading/lazyload/META.yml": [
@@ -701899,7 +702423,7 @@
"support"
],
"resources/chromium/nfc-mock.js": [
- "2c1724b7592eb1d6e66177544998abbec70fbfe6",
+ "be86dedd4d8877dcb01ade039c95cbb8f7acc99f",
"support"
],
"resources/chromium/sensor.mojom.js": [
@@ -704542,6 +705066,10 @@
"417aa4ebec8380ec778bbe42f3ee8fb45649292f",
"testharness"
],
+ "service-workers/service-worker/opaque-script.https.html": [
+ "7d2121855dfa17649b81fd96aad03d93e85be22b",
+ "testharness"
+ ],
"service-workers/service-worker/performance-timeline.https.html": [
"1fe19da53be6c460cae5f069794bbdee3f4a0da8",
"testharness"
@@ -705506,6 +706034,22 @@
"f31ac9b5c4ce372b182d53dd6690f1c3b498ecd1",
"support"
],
+ "service-workers/service-worker/resources/opaque-script-frame.html": [
+ "a57aacec7c6f32d9c321b99057032947c877e4b8",
+ "support"
+ ],
+ "service-workers/service-worker/resources/opaque-script-large.js": [
+ "7e1c598efc5cf15f23789fefa0993e1d07ac214e",
+ "support"
+ ],
+ "service-workers/service-worker/resources/opaque-script-small.js": [
+ "8b890985752fd01d47d8cb553d6dad945dbc00bb",
+ "support"
+ ],
+ "service-workers/service-worker/resources/opaque-script-sw.js": [
+ "4d882c617d8dc6b790a51b82f3edeb65e7f18d22",
+ "support"
+ ],
"service-workers/service-worker/resources/other.html": [
"b9f3504387722c4583a0904cb7b7f7a4f9706b71",
"support"
@@ -718970,6 +719514,10 @@
"1b723b7bb3c5cebc0701e2393e334a1e99ce2ef3",
"testharness"
],
+ "trusted-types/DOMParser-parseFromString-regression.tentative.https.html": [
+ "30986e45d2671caec84879314b43891664dd10ae",
+ "testharness"
+ ],
"trusted-types/DOMParser-parseFromString.tentative.html": [
"2dfc37686bca15431c216a50d29f9f9eed2782e0",
"testharness"
@@ -719051,7 +719599,7 @@
"testharness"
],
"trusted-types/TrustedTypePolicyFactory-createPolicy-createXYZTests.tentative.html": [
- "8608bcc24fed0fb050925bd52830db38082ae3b1",
+ "a78b3dbf0fd7a9532a45957970076cce16819231",
"testharness"
],
"trusted-types/TrustedTypePolicyFactory-createPolicy-cspTests-noNamesGiven.tentative.html": [
@@ -719215,7 +719763,7 @@
"support"
],
"trusted-types/support/helper.sub.js": [
- "d13ad567a726f39299a7e7f58aeffec4ba90a908",
+ "20f56c3cbc7af094a7fd8db5d73b546804f8e9d0",
"support"
],
"trusted-types/support/navigation-report-only-support.html": [
@@ -725003,7 +725551,7 @@
"testharness"
],
"web-nfc/NDEFRecord_constructor.https.html": [
- "2da7ca91078aa5ec8232f5347fb276618dad3c3c",
+ "0e0f1a771394570747117980c824c133ca3b060d",
"testharness"
],
"web-nfc/NDEFWriter-document-hidden-manual.https.html": [
@@ -725011,7 +725559,7 @@
"manual"
],
"web-nfc/NDEFWriter_push.https.html": [
- "cb6b3941410035c5c5736e13d59fbbfb85f0d4cc",
+ "bf7c1f86ad0b4fdf066b4bc4584f9409d840d823",
"testharness"
],
"web-nfc/README.md": [
diff --git a/tests/wpt/metadata/css/css-color/animation/color-composition.html.ini b/tests/wpt/metadata/css/css-color/animation/color-composition.html.ini
new file mode 100644
index 00000000000..6c2ecd50442
--- /dev/null
+++ b/tests/wpt/metadata/css/css-color/animation/color-composition.html.ini
@@ -0,0 +1,28 @@
+[color-composition.html]
+ [Compositing: property <color> underlying [rgb(60, 60, 60)\] from add [rgb(0, 0, 0)\] to replace [rgb(50, 50, 50)\] at (1.2) should be [rgb(48, 48, 48)\]]
+ expected: FAIL
+
+ [Compositing: property <color> underlying [rgb(50, 50, 50)\] from add [rgb(10, 10, 10)\] to replace [rgb(30, 30, 30)\] at (1.2) should be [rgb(24, 24, 24)\]]
+ expected: FAIL
+
+ [Compositing: property <color> underlying [rgb(50, 50, 50)\] from add [rgb(10, 10, 10)\] to replace [rgb(30, 30, 30)\] at (1) should be [rgb(30, 30, 30)\]]
+ expected: FAIL
+
+ [Compositing: property <color> underlying [rgb(60, 60, 60)\] from add [rgb(0, 0, 0)\] to replace [rgb(50, 50, 50)\] at (1) should be [rgb(50, 50, 50)\]]
+ expected: FAIL
+
+ [Compositing: property <color> underlying [rgb(60, 60, 60)\] from add [rgb(0, 0, 0)\] to replace [rgb(50, 50, 50)\] at (0.5) should be [rgb(55, 55, 55)\]]
+ expected: FAIL
+
+ [Compositing: property <color> underlying [rgb(50, 50, 50)\] from add [rgb(10, 10, 10)\] to replace [rgb(30, 30, 30)\] at (0) should be [rgb(60, 60, 60)\]]
+ expected: FAIL
+
+ [Compositing: property <color> underlying [rgb(50, 50, 50)\] from add [rgb(10, 10, 10)\] to replace [rgb(30, 30, 30)\] at (0.2) should be [rgb(54, 54, 54)\]]
+ expected: FAIL
+
+ [Compositing: property <color> underlying [rgb(60, 60, 60)\] from add [rgb(0, 0, 0)\] to replace [rgb(50, 50, 50)\] at (1.5) should be [rgb(45, 45, 45)\]]
+ expected: FAIL
+
+ [Compositing: property <color> underlying [rgb(50, 50, 50)\] from add [rgb(10, 10, 10)\] to replace [rgb(30, 30, 30)\] at (1.5) should be [rgb(15, 15, 15)\]]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-flexbox/animation/flex-basis-composition.html.ini b/tests/wpt/metadata/css/css-flexbox/animation/flex-basis-composition.html.ini
new file mode 100644
index 00000000000..d98f8d9f081
--- /dev/null
+++ b/tests/wpt/metadata/css/css-flexbox/animation/flex-basis-composition.html.ini
@@ -0,0 +1,76 @@
+[flex-basis-composition.html]
+ [Compositing: property <flex-basis> underlying [100px\] from add [100px\] to add [auto\] at (1.5) should be [auto\]]
+ expected: FAIL
+
+ [Compositing: property <flex-basis> underlying [100px\] from add [10px\] to add [2px\] at (1) should be [102px\]]
+ expected: FAIL
+
+ [Compositing: property <flex-basis> underlying [50px\] from add [100px\] to add [200px\] at (1.5) should be [300px\]]
+ expected: FAIL
+
+ [Compositing: property <flex-basis> underlying [100px\] from add [10px\] to add [2px\] at (0.5) should be [106px\]]
+ expected: FAIL
+
+ [Compositing: property <flex-basis> underlying [100px\] from add [10px\] to add [2px\] at (-0.5) should be [114px\]]
+ expected: FAIL
+
+ [Compositing: property <flex-basis> underlying [100px\] from add [10px\] to add [2px\] at (1.5) should be [98px\]]
+ expected: FAIL
+
+ [Compositing: property <flex-basis> underlying [50px\] from add [100px\] to replace [200px\] at (1) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <flex-basis> underlying [10%\] from add [100px\] to add [20%\] at (1.5) should be [calc(-50px + 40%)\]]
+ expected: FAIL
+
+ [Compositing: property <flex-basis> underlying [10%\] from add [100px\] to add [20%\] at (0) should be [calc(100px + 10%)\]]
+ expected: FAIL
+
+ [Compositing: property <flex-basis> underlying [10%\] from add [100px\] to add [20%\] at (-0.3) should be [calc(130px + 4%)\]]
+ expected: FAIL
+
+ [Compositing: property <flex-basis> underlying [100px\] from add [100px\] to add [auto\] at (-0.3) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <flex-basis> underlying [100px\] from add [100px\] to add [auto\] at (1) should be [auto\]]
+ expected: FAIL
+
+ [Compositing: property <flex-basis> underlying [50px\] from add [100px\] to replace [200px\] at (0.5) should be [175px\]]
+ expected: FAIL
+
+ [Compositing: property <flex-basis> underlying [50px\] from add [100px\] to replace [200px\] at (-0.3) should be [135px\]]
+ expected: FAIL
+
+ [Compositing: property <flex-basis> underlying [50px\] from add [100px\] to add [200px\] at (-0.3) should be [120px\]]
+ expected: FAIL
+
+ [Compositing: property <flex-basis> underlying [10%\] from add [100px\] to add [20%\] at (0.5) should be [calc(50px + 20%)\]]
+ expected: FAIL
+
+ [Compositing: property <flex-basis> underlying [50px\] from add [100px\] to add [200px\] at (1) should be [250px\]]
+ expected: FAIL
+
+ [Compositing: property <flex-basis> underlying [50px\] from add [100px\] to add [200px\] at (0) should be [150px\]]
+ expected: FAIL
+
+ [Compositing: property <flex-basis> underlying [100px\] from add [100px\] to add [auto\] at (0.5) should be [auto\]]
+ expected: FAIL
+
+ [Compositing: property <flex-basis> underlying [50px\] from add [100px\] to replace [200px\] at (0) should be [150px\]]
+ expected: FAIL
+
+ [Compositing: property <flex-basis> underlying [100px\] from add [100px\] to add [auto\] at (0) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <flex-basis> underlying [50px\] from add [100px\] to add [200px\] at (0.5) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <flex-basis> underlying [50px\] from add [100px\] to replace [200px\] at (1.5) should be [225px\]]
+ expected: FAIL
+
+ [Compositing: property <flex-basis> underlying [10%\] from add [100px\] to add [20%\] at (1) should be [30%\]]
+ expected: FAIL
+
+ [Compositing: property <flex-basis> underlying [100px\] from add [10px\] to add [2px\] at (0) should be [110px\]]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-images/animations/object-position-interpolation.html.ini b/tests/wpt/metadata/css/css-images/animations/object-position-interpolation.html.ini
deleted file mode 100644
index 21f1c21b7a0..00000000000
--- a/tests/wpt/metadata/css/css-images/animations/object-position-interpolation.html.ini
+++ /dev/null
@@ -1,640 +0,0 @@
-[object-position-interpolation.html]
- [object-position-interpolation]
- expected: FAIL
-
- [Web Animations: property <object-position> from [100px 200px\] to [0px 0px\] at (0.5) should be [50px 100px\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [50% 100%\] to [50px 100px\] at (0.5) should be [calc(25% + 25px) calc(50% + 50px)\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [center\] to [right 0% bottom 50%\] at (1) should be [100% 50%\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [initial\] to [20px 20px\] at (1) should be [calc(20px + 0%) calc(20px + 0%)\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [unset\] to [20px 20px\] at (0.5) should be [calc(10px + 25%) calc(10px + 25%)\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from neutral to [20px 20px\] at (1.5) should be [25px 15px\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [inherit\] to [20px 20px\] at (0) should be [30px 10px\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [center\] to [top right\] at (0) should be [50% 50%\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [100px 200px\] to [0px 0px\] at (0.5) should be [50px 100px\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from neutral to [20px 20px\] at (0) should be [10px 30px\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [50% 100%\] to [50px 100px\] at (0.5) should be [calc(25% + 25px) calc(50% + 50px)\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [50% 50%\] to [100% 100%\] at (-0.3) should be [35% 35%\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [50% 50%\] to [100% 100%\] at (1.5) should be [125% 125%\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [initial\] to [20px 20px\] at (1) should be [calc(20px + 0%) calc(20px + 0%)\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [center\] to [right 0% bottom 50%\] at (-0.5) should be [25% 50%\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [50% 100%\] to [50px 100px\] at (0) should be [50% 100%\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [100px 200px\] to [0px 0px\] at (0.5) should be [50px 100px\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [center\] to [top right\] at (1) should be [100% 0%\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from neutral to [20px 20px\] at (1.5) should be [25px 15px\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [unset\] to [20px 20px\] at (1) should be [calc(20px + 0%) calc(20px + 0%)\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [50% 100%\] to [50px 100px\] at (0) should be [50% 100%\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [50% 100%\] to [50px 100px\] at (0) should be [50% 100%\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from neutral to [20px 20px\] at (-0.3) should be [7px 33px\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [50% 100%\] to [0px 0px\] at (1) should be [0px 0px\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [50% 100%\] to [0px 0px\] at (-0.3) should be [65% 130%\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [50% 100%\] to [50px 100px\] at (-0.3) should be [calc(65% + -15px) calc(130% + -30px)\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from neutral to [20px 20px\] at (-0.3) should be [7px 33px\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from neutral to [20px 20px\] at (-0.3) should be [7px 33px\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [50% 100%\] to [0px 0px\] at (0.5) should be [25% 50%\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [center\] to [right 0% bottom 50%\] at (0.5) should be [75% 50%\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [initial\] to [20px 20px\] at (1) should be [calc(20px + 0%) calc(20px + 0%)\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [50% 100%\] to [0px 0px\] at (0) should be [50% 100%\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [50% 50%\] to [100% 100%\] at (0) should be [50% 50%\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [100px 200px\] to [0px 0px\] at (1.5) should be [-50px -100px\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [center\] to [top right\] at (1.5) should be [125% -25%\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [50% 50%\] to [100% 100%\] at (0.5) should be [75% 75%\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [inherit\] to [20px 20px\] at (1.5) should be [15px 25px\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [50% 100%\] to [50px 100px\] at (1.5) should be [calc(-25% + 75px) calc(-50% + 150px)\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [center\] to [right 0% bottom 50%\] at (0.3) should be [65% 50%\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [50% 100%\] to [0px 0px\] at (1) should be [0px 0px\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [50% 100%\] to [50px 100px\] at (-0.3) should be [calc(65% + -15px) calc(130% + -30px)\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [100px 200px\] to [0px 0px\] at (1.5) should be [-50px -100px\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [100px 200px\] to [0px 0px\] at (-0.3) should be [130px 260px\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [initial\] to [20px 20px\] at (1.5) should be [calc(30px + -25%) calc(30px + -25%)\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [50% 100%\] to [50px 100px\] at (1) should be [calc(0% + 50px) calc(0% + 100px)\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [initial\] to [20px 20px\] at (0.5) should be [calc(10px + 25%) calc(10px + 25%)\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [50% 100%\] to [50px 100px\] at (1.5) should be [calc(-25% + 75px) calc(-50% + 150px)\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [center\] to [right 0% bottom 50%\] at (0.9) should be [95% 50%\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [50% 100%\] to [0px 0px\] at (1) should be [0px 0px\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [50% 100%\] to [50px 100px\] at (0) should be [50% 100%\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [50% 50%\] to [100% 100%\] at (0) should be [50% 50%\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from neutral to [20px 20px\] at (0.5) should be [15px 25px\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [50% 100%\] to [0px 0px\] at (0.5) should be [25% 50%\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [inherit\] to [20px 20px\] at (0.5) should be [25px 15px\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [initial\] to [20px 20px\] at (0) should be [50% 50%\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [initial\] to [20px 20px\] at (0) should be [50% 50%\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [inherit\] to [20px 20px\] at (0) should be [30px 10px\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [unset\] to [20px 20px\] at (1.5) should be [calc(30px + -25%) calc(30px + -25%)\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [unset\] to [20px 20px\] at (0.5) should be [calc(10px + 25%) calc(10px + 25%)\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [50% 100%\] to [50px 100px\] at (1) should be [calc(0% + 50px) calc(0% + 100px)\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [inherit\] to [20px 20px\] at (0.5) should be [25px 15px\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [100px 200px\] to [0px 0px\] at (1) should be [0px 0px\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from neutral to [20px 20px\] at (1) should be [20px 20px\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [unset\] to [20px 20px\] at (1.5) should be [calc(30px + -25%) calc(30px + -25%)\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [50% 50%\] to [100% 100%\] at (1.5) should be [125% 125%\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [unset\] to [20px 20px\] at (1) should be [calc(20px + 0%) calc(20px + 0%)\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [initial\] to [20px 20px\] at (1.5) should be [calc(30px + -25%) calc(30px + -25%)\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [center\] to [right 0% bottom 50%\] at (0.5) should be [75% 50%\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [center\] to [right 0% bottom 50%\] at (1.5) should be [125% 50%\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [100px 200px\] to [0px 0px\] at (0) should be [100px 200px\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [50% 50%\] to [100% 100%\] at (0) should be [50% 50%\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [center\] to [right 0% bottom 50%\] at (1) should be [100% 50%\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [center\] to [top right\] at (1.5) should be [125% -25%\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [center\] to [top right\] at (0) should be [50% 50%\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [unset\] to [20px 20px\] at (0) should be [50% 50%\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [50% 50%\] to [100% 100%\] at (0.5) should be [75% 75%\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from neutral to [20px 20px\] at (1) should be [20px 20px\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [inherit\] to [20px 20px\] at (-0.3) should be [33px 7px\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [center\] to [right 0% bottom 50%\] at (2) should be [150% 50%\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [center\] to [right 0% bottom 50%\] at (1) should be [100% 50%\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [initial\] to [20px 20px\] at (-0.3) should be [calc(-6px + 65%) calc(-6px + 65%)\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [center\] to [top right\] at (1) should be [100% 0%\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [unset\] to [20px 20px\] at (1) should be [calc(20px + 0%) calc(20px + 0%)\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [center\] to [top right\] at (1.5) should be [125% -25%\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [center\] to [top right\] at (0.5) should be [75% 25%\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [center\] to [right 0% bottom 50%\] at (2) should be [150% 50%\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [100px 200px\] to [0px 0px\] at (1.5) should be [-50px -100px\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [initial\] to [20px 20px\] at (0.5) should be [calc(10px + 25%) calc(10px + 25%)\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [center\] to [right 0% bottom 50%\] at (2) should be [150% 50%\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [50% 50%\] to [100% 100%\] at (1) should be [100% 100%\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [center\] to [right 0% bottom 50%\] at (0.3) should be [65% 50%\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [inherit\] to [20px 20px\] at (0.5) should be [25px 15px\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from neutral to [20px 20px\] at (1) should be [20px 20px\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [100px 200px\] to [0px 0px\] at (1.5) should be [-50px -100px\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [center\] to [right 0% bottom 50%\] at (0) should be [center\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [50% 50%\] to [100% 100%\] at (-0.3) should be [35% 35%\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [50% 100%\] to [0px 0px\] at (0.5) should be [25% 50%\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [unset\] to [20px 20px\] at (-0.3) should be [calc(-6px + 65%) calc(-6px + 65%)\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [inherit\] to [20px 20px\] at (1) should be [20px 20px\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [inherit\] to [20px 20px\] at (1.5) should be [15px 25px\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [center\] to [top right\] at (0.5) should be [75% 25%\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from neutral to [20px 20px\] at (0.5) should be [15px 25px\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [50% 50%\] to [100% 100%\] at (-0.3) should be [35% 35%\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [50% 50%\] to [100% 100%\] at (1) should be [100% 100%\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [center\] to [top right\] at (-0.3) should be [35% 65%\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [center\] to [right 0% bottom 50%\] at (-0.5) should be [25% 50%\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [50% 100%\] to [0px 0px\] at (-0.3) should be [65% 130%\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [unset\] to [20px 20px\] at (0) should be [50% 50%\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [50% 50%\] to [100% 100%\] at (0.5) should be [75% 75%\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [center\] to [right 0% bottom 50%\] at (0) should be [center\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [inherit\] to [20px 20px\] at (-0.3) should be [33px 7px\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [center\] to [top right\] at (1) should be [100% 0%\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [100px 200px\] to [0px 0px\] at (1) should be [0px 0px\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [center\] to [top right\] at (-0.3) should be [35% 65%\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [50% 50%\] to [100% 100%\] at (1) should be [100% 100%\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [initial\] to [20px 20px\] at (0) should be [50% 50%\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from neutral to [20px 20px\] at (0.5) should be [15px 25px\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [unset\] to [20px 20px\] at (0.5) should be [calc(10px + 25%) calc(10px + 25%)\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from neutral to [20px 20px\] at (0) should be [10px 30px\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [initial\] to [20px 20px\] at (0.5) should be [calc(10px + 25%) calc(10px + 25%)\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [center\] to [right 0% bottom 50%\] at (0.5) should be [75% 50%\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [inherit\] to [20px 20px\] at (1) should be [20px 20px\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [initial\] to [20px 20px\] at (0) should be [50% 50%\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [initial\] to [20px 20px\] at (1.5) should be [calc(30px + -25%) calc(30px + -25%)\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [50% 100%\] to [50px 100px\] at (1.5) should be [calc(-25% + 75px) calc(-50% + 150px)\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [50% 100%\] to [0px 0px\] at (1.5) should be [-25% -50%\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [center\] to [top right\] at (-0.3) should be [35% 65%\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [50% 100%\] to [50px 100px\] at (-0.3) should be [calc(65% + -15px) calc(130% + -30px)\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [unset\] to [20px 20px\] at (1) should be [calc(20px + 0%) calc(20px + 0%)\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [100px 200px\] to [0px 0px\] at (-0.3) should be [130px 260px\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [inherit\] to [20px 20px\] at (-0.3) should be [33px 7px\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [50% 100%\] to [50px 100px\] at (0.5) should be [calc(25% + 25px) calc(50% + 50px)\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [inherit\] to [20px 20px\] at (1.5) should be [15px 25px\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [center\] to [right 0% bottom 50%\] at (0.9) should be [95% 50%\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [center\] to [right 0% bottom 50%\] at (0.3) should be [65% 50%\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [center\] to [right 0% bottom 50%\] at (0) should be [center\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [center\] to [right 0% bottom 50%\] at (0.3) should be [65% 50%\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [50% 100%\] to [0px 0px\] at (1.5) should be [-25% -50%\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [unset\] to [20px 20px\] at (0.5) should be [calc(10px + 25%) calc(10px + 25%)\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [50% 50%\] to [100% 100%\] at (1.5) should be [125% 125%\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [100px 200px\] to [0px 0px\] at (-0.3) should be [130px 260px\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [50% 100%\] to [50px 100px\] at (0.5) should be [calc(25% + 25px) calc(50% + 50px)\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [center\] to [right 0% bottom 50%\] at (0.5) should be [75% 50%\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [100px 200px\] to [0px 0px\] at (0) should be [100px 200px\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [center\] to [top right\] at (0) should be [50% 50%\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [initial\] to [20px 20px\] at (0.5) should be [calc(10px + 25%) calc(10px + 25%)\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [50% 100%\] to [50px 100px\] at (1) should be [calc(0% + 50px) calc(0% + 100px)\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [100px 200px\] to [0px 0px\] at (0.5) should be [50px 100px\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [center\] to [top right\] at (1) should be [100% 0%\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [50% 100%\] to [0px 0px\] at (0) should be [50% 100%\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [center\] to [right 0% bottom 50%\] at (-0.5) should be [25% 50%\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [center\] to [right 0% bottom 50%\] at (1.5) should be [125% 50%\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [50% 50%\] to [100% 100%\] at (1.5) should be [125% 125%\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [100px 200px\] to [0px 0px\] at (1) should be [0px 0px\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [center\] to [right 0% bottom 50%\] at (1.5) should be [125% 50%\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [100px 200px\] to [0px 0px\] at (1) should be [0px 0px\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [center\] to [right 0% bottom 50%\] at (0.9) should be [95% 50%\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [unset\] to [20px 20px\] at (0) should be [50% 50%\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [center\] to [right 0% bottom 50%\] at (0.9) should be [95% 50%\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [50% 50%\] to [100% 100%\] at (0) should be [50% 50%\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from neutral to [20px 20px\] at (1.5) should be [25px 15px\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [center\] to [top right\] at (0) should be [50% 50%\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from neutral to [20px 20px\] at (0) should be [10px 30px\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [initial\] to [20px 20px\] at (1.5) should be [calc(30px + -25%) calc(30px + -25%)\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [initial\] to [20px 20px\] at (-0.3) should be [calc(-6px + 65%) calc(-6px + 65%)\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from neutral to [20px 20px\] at (1) should be [20px 20px\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [50% 50%\] to [100% 100%\] at (1) should be [100% 100%\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [initial\] to [20px 20px\] at (-0.3) should be [calc(-6px + 65%) calc(-6px + 65%)\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [50% 100%\] to [0px 0px\] at (-0.3) should be [65% 130%\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [50% 100%\] to [50px 100px\] at (-0.3) should be [calc(65% + -15px) calc(130% + -30px)\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [50% 100%\] to [0px 0px\] at (1) should be [0px 0px\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [center\] to [top right\] at (0.5) should be [75% 25%\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [center\] to [right 0% bottom 50%\] at (0) should be [center\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [50% 100%\] to [50px 100px\] at (1.5) should be [calc(-25% + 75px) calc(-50% + 150px)\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [inherit\] to [20px 20px\] at (1) should be [20px 20px\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [inherit\] to [20px 20px\] at (0) should be [30px 10px\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [inherit\] to [20px 20px\] at (1) should be [20px 20px\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [50% 100%\] to [0px 0px\] at (0) should be [50% 100%\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [initial\] to [20px 20px\] at (-0.3) should be [calc(-6px + 65%) calc(-6px + 65%)\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [50% 100%\] to [50px 100px\] at (1) should be [calc(0% + 50px) calc(0% + 100px)\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [50% 100%\] to [0px 0px\] at (-0.3) should be [65% 130%\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [100px 200px\] to [0px 0px\] at (0) should be [100px 200px\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [initial\] to [20px 20px\] at (1) should be [calc(20px + 0%) calc(20px + 0%)\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [unset\] to [20px 20px\] at (1.5) should be [calc(30px + -25%) calc(30px + -25%)\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [50% 100%\] to [0px 0px\] at (1.5) should be [-25% -50%\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [unset\] to [20px 20px\] at (-0.3) should be [calc(-6px + 65%) calc(-6px + 65%)\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [inherit\] to [20px 20px\] at (0.5) should be [25px 15px\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [center\] to [top right\] at (1.5) should be [125% -25%\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from neutral to [20px 20px\] at (0) should be [10px 30px\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [center\] to [top right\] at (-0.3) should be [35% 65%\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [100px 200px\] to [0px 0px\] at (-0.3) should be [130px 260px\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [center\] to [right 0% bottom 50%\] at (2) should be [150% 50%\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [center\] to [right 0% bottom 50%\] at (-0.5) should be [25% 50%\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from neutral to [20px 20px\] at (1.5) should be [25px 15px\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [inherit\] to [20px 20px\] at (1.5) should be [15px 25px\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [unset\] to [20px 20px\] at (0) should be [50% 50%\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [50% 50%\] to [100% 100%\] at (-0.3) should be [35% 35%\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [50% 100%\] to [0px 0px\] at (1.5) should be [-25% -50%\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [center\] to [right 0% bottom 50%\] at (1) should be [100% 50%\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from neutral to [20px 20px\] at (0.5) should be [15px 25px\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [unset\] to [20px 20px\] at (-0.3) should be [calc(-6px + 65%) calc(-6px + 65%)\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [unset\] to [20px 20px\] at (1.5) should be [calc(30px + -25%) calc(30px + -25%)\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [50% 50%\] to [100% 100%\] at (0.5) should be [75% 75%\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [100px 200px\] to [0px 0px\] at (0) should be [100px 200px\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [inherit\] to [20px 20px\] at (-0.3) should be [33px 7px\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [50% 100%\] to [0px 0px\] at (0.5) should be [25% 50%\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from neutral to [20px 20px\] at (-0.3) should be [7px 33px\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [50% 100%\] to [0px 0px\] at (0) should be [50% 100%\]]
- expected: FAIL
-
- [Web Animations: property <object-position> from [inherit\] to [20px 20px\] at (0) should be [30px 10px\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <object-position> from [unset\] to [20px 20px\] at (-0.3) should be [calc(-6px + 65%) calc(-6px + 65%)\]]
- expected: FAIL
-
- [CSS Transitions: property <object-position> from [center\] to [right 0% bottom 50%\] at (1.5) should be [125% 50%\]]
- expected: FAIL
-
- [CSS Animations: property <object-position> from [center\] to [top right\] at (0.5) should be [75% 25%\]]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/css/css-transforms/animation/perspective-composition.html.ini b/tests/wpt/metadata/css/css-transforms/animation/perspective-composition.html.ini
new file mode 100644
index 00000000000..35a7d86f0ac
--- /dev/null
+++ b/tests/wpt/metadata/css/css-transforms/animation/perspective-composition.html.ini
@@ -0,0 +1,61 @@
+[perspective-composition.html]
+ [Compositing: property <perspective> underlying [50px\] from add [100px\] to replace [200px\] at (1.5) should be [225px\]]
+ expected: FAIL
+
+ [Compositing: property <perspective> underlying [100px\] from add [100px\] to add [none\] at (1.5) should be [none\]]
+ expected: FAIL
+
+ [Compositing: property <perspective> underlying [50px\] from add [100px\] to add [200px\] at (0.5) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <perspective> underlying [100px\] from add [100px\] to add [none\] at (1) should be [none\]]
+ expected: FAIL
+
+ [Compositing: property <perspective> underlying [100px\] from add [100px\] to add [none\] at (-0.3) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <perspective> underlying [100px\] from add [10px\] to add [2px\] at (0.5) should be [106px\]]
+ expected: FAIL
+
+ [Compositing: property <perspective> underlying [100px\] from add [10px\] to add [2px\] at (1) should be [102px\]]
+ expected: FAIL
+
+ [Compositing: property <perspective> underlying [100px\] from add [10px\] to add [2px\] at (-0.5) should be [114px\]]
+ expected: FAIL
+
+ [Compositing: property <perspective> underlying [50px\] from add [100px\] to add [200px\] at (1) should be [250px\]]
+ expected: FAIL
+
+ [Compositing: property <perspective> underlying [100px\] from add [100px\] to add [none\] at (0.5) should be [none\]]
+ expected: FAIL
+
+ [Compositing: property <perspective> underlying [50px\] from add [100px\] to add [200px\] at (1.5) should be [300px\]]
+ expected: FAIL
+
+ [Compositing: property <perspective> underlying [100px\] from add [10px\] to add [2px\] at (0) should be [110px\]]
+ expected: FAIL
+
+ [Compositing: property <perspective> underlying [50px\] from add [100px\] to replace [200px\] at (0.5) should be [175px\]]
+ expected: FAIL
+
+ [Compositing: property <perspective> underlying [50px\] from add [100px\] to replace [200px\] at (1) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <perspective> underlying [50px\] from add [100px\] to add [200px\] at (0) should be [150px\]]
+ expected: FAIL
+
+ [Compositing: property <perspective> underlying [50px\] from add [100px\] to replace [200px\] at (0) should be [150px\]]
+ expected: FAIL
+
+ [Compositing: property <perspective> underlying [50px\] from add [100px\] to add [200px\] at (-0.3) should be [120px\]]
+ expected: FAIL
+
+ [Compositing: property <perspective> underlying [100px\] from add [100px\] to add [none\] at (0) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <perspective> underlying [100px\] from add [10px\] to add [2px\] at (1.5) should be [98px\]]
+ expected: FAIL
+
+ [Compositing: property <perspective> underlying [50px\] from add [100px\] to replace [200px\] at (-0.3) should be [135px\]]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-transforms/animation/rotate-composition.html.ini b/tests/wpt/metadata/css/css-transforms/animation/rotate-composition.html.ini
new file mode 100644
index 00000000000..4840f4b1bca
--- /dev/null
+++ b/tests/wpt/metadata/css/css-transforms/animation/rotate-composition.html.ini
@@ -0,0 +1,187 @@
+[rotate-composition.html]
+ [Compositing: property <rotate> underlying [1 2 3 90deg\] from add [none\] to replace [0 1 0 100deg\] at (-1) should be [0.31 -0.22 0.92 131.66deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [1 2 3 270deg\] from add [1 2 3 90deg\] to replace [0 1 0 100deg\] at (0.75) should be [-1.51909e-17 1 -4.55726e-17 75deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [none\] from add [none\] to replace [0 1 0 100deg\] at (-1) should be [0 1 0 -100deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [1 2 3 90deg\] from add [none\] to replace [0 1 0 100deg\] at (1) should be [0 1 0 100deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [1 0 0 200deg\] from add [1 0 0 -100deg\] to replace [1 0 0 40deg\] at (-1) should be [1 0 0 160deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [1 2 3 90deg\] from add [2 4 6 270deg\] to replace [none\] at (0.25) should be [1 2 3 270deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [1 0 0 90deg\] from add [0 1 0 180deg\] to replace [0 0 1 90deg\] at (0.25) should be [-1.48952e-16 -0.894427 -0.447214 131.81deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [none\] from add [none\] to replace [0 1 0 100deg\] at (1) should be [0 1 0 100deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [1 2 3 270deg\] from add [1 2 3 90deg\] to replace [0 1 0 100deg\] at (0.25) should be [-1.20172e-16 1 -3.60516e-16 25deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [1 2 3 90deg\] from add [2 4 6 270deg\] to replace [0 1 0 100deg\] at (0.75) should be [-1.51909e-17 1 -4.55726e-17 75deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [1 0 0 90deg\] from add [0 1 0 180deg\] to replace [0 0 1 90deg\] at (-1) should be [-6.12323e-17 -1 1.57009e-16 90deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [1 2 3 90deg\] from add [none\] to replace [0 1 0 100deg\] at (2) should be [-0.2 0.79 -0.59 151.11deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [1 2 3 90deg\] from add [2 4 6 270deg\] to replace [none\] at (2) should be [1 2 3 -360deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [0 1 0 -40deg\] from replace [0 1 0 50deg\] to add [0 1 0 10deg\] at (-1) should be [0 1 0 130deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [none\] from add [none\] to replace [0 1 0 100deg\] at (0.75) should be [0 1 0 75deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [1 0 0 200deg\] from add [1 0 0 -100deg\] to replace [1 0 0 40deg\] at (0) should be [1 0 0 100deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [1 2 3 90deg\] from add [2 4 6 270deg\] to replace [0 1 0 100deg\] at (0.25) should be [-1.20172e-16 1 -3.60516e-16 25deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [1 2 3 90deg\] from add [2 4 6 270deg\] to replace [0 1 0 100deg\] at (2) should be [-3.3235e-17 -1 -9.97049e-17 160deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [1 2 3 40deg\] from add [2 4 6 10deg\] to add [3 6 9 50deg\] at (0) should be [1 2 3 50deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [0 1 0 -40deg\] from replace [0 1 0 50deg\] to add [0 1 0 10deg\] at (2) should be [0 1 0 -110deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [1 0 0 90deg\] from add [0 1 0 180deg\] to replace [0 0 1 90deg\] at (1) should be [90deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [1 2 3 270deg\] from add [1 2 3 90deg\] to replace [0 1 0 100deg\] at (2) should be [-3.3235e-17 -1 -9.97049e-17 160deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [100deg\] from add [10deg\] to add [30deg\] at (1) should be [130deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [none\] from add [2 4 6 270deg\] to replace [none\] at (0) should be [2 4 6 270deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [none\] from add [2 4 6 270deg\] to replace [none\] at (-1) should be [2 4 6 540deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [1 2 3 90deg\] from add [2 4 6 270deg\] to replace [0 1 0 100deg\] at (1) should be [0 1 0 100deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [1 2 3 40deg\] from add [2 4 6 10deg\] to add [3 6 9 50deg\] at (0.75) should be [1 2 3 80deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [1 2 3 270deg\] from add [1 2 3 90deg\] to replace [0 1 0 100deg\] at (0) should be [1 2 3 360deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [1 2 3 270deg\] from add [1 2 3 90deg\] to replace [0 1 0 100deg\] at (-1) should be [-5.49276e-17 -1 -1.64783e-16 100deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [1 2 3 40deg\] from add [2 4 6 10deg\] to add [3 6 9 50deg\] at (-1) should be [1 2 3 10deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [1 2 3 270deg\] from add [1 2 3 90deg\] to replace [0 1 0 100deg\] at (1) should be [0 1 0 100deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [1 2 3 40deg\] from add [2 4 6 10deg\] to add [3 6 9 50deg\] at (1) should be [1 2 3 90deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [1 2 3 90deg\] from add [2 4 6 270deg\] to replace [none\] at (1) should be [none\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [1 0 0 200deg\] from add [1 0 0 -100deg\] to replace [1 0 0 40deg\] at (2) should be [1 0 0 -20deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [100deg\] from add [10deg\] to add [30deg\] at (2) should be [150deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [1 2 3 90deg\] from add [none\] to replace [0 1 0 100deg\] at (0.25) should be [0.21 0.73 0.64 86.72deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [100deg\] from add [10deg\] to add [30deg\] at (-1) should be [90deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [1 0 0 200deg\] from add [1 0 0 -100deg\] to replace [1 0 0 40deg\] at (1) should be [1 0 0 40deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [1 2 3 90deg\] from add [2 4 6 270deg\] to replace [none\] at (-1) should be [1 2 3 720deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [1 2 3 40deg\] from add [2 4 6 10deg\] to add [3 6 9 50deg\] at (0.25) should be [1 2 3 60deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [100deg\] from add [10deg\] to add [30deg\] at (0) should be [110deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [1 0 0 200deg\] from add [1 0 0 -100deg\] to replace [1 0 0 40deg\] at (0.75) should be [1 0 0 55deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [1 0 0 200deg\] from add [1 0 0 -100deg\] to replace [1 0 0 40deg\] at (0.25) should be [1 0 0 85deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [1 0 0 90deg\] from add [0 1 0 180deg\] to replace [0 0 1 90deg\] at (2) should be [-6.12323e-17 -1 -4.71028e-16 90deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [1 2 3 90deg\] from add [2 4 6 270deg\] to replace [0 1 0 100deg\] at (-1) should be [-5.49276e-17 -1 -1.64783e-16 100deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [0 1 0 -40deg\] from replace [0 1 0 50deg\] to add [0 1 0 10deg\] at (0.25) should be [0 1 0 30deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [none\] from add [2 4 6 270deg\] to replace [none\] at (0.75) should be [2 4 6 67.5deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [1 2 3 90deg\] from add [2 4 6 270deg\] to replace [0 1 0 100deg\] at (0) should be [1 2 3 360deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [none\] from add [none\] to replace [0 1 0 100deg\] at (2) should be [0 1 0 200deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [1 2 3 90deg\] from add [none\] to replace [0 1 0 100deg\] at (0.75) should be [0.07 0.97 0.21 92.05deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [100deg\] from add [10deg\] to add [30deg\] at (0.75) should be [125deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [none\] from add [2 4 6 270deg\] to replace [none\] at (0.25) should be [2 4 6 202.5deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [none\] from add [2 4 6 270deg\] to replace [none\] at (2) should be [2 4 6 -270deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [0 1 0 -40deg\] from replace [0 1 0 50deg\] to add [0 1 0 10deg\] at (0.75) should be [0 1 0 -10deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [0 1 0 -40deg\] from replace [0 1 0 50deg\] to add [0 1 0 10deg\] at (1) should be [0 1 0 -30deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [100deg\] from add [10deg\] to add [30deg\] at (0.25) should be [115deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [1 2 3 40deg\] from add [2 4 6 10deg\] to add [3 6 9 50deg\] at (2) should be [1 2 3 130deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [none\] from add [none\] to replace [0 1 0 100deg\] at (0.25) should be [0 1 0 25deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [1 2 3 90deg\] from add [2 4 6 270deg\] to replace [none\] at (0) should be [1 2 3 360deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [0 1 0 -40deg\] from replace [0 1 0 50deg\] to add [0 1 0 10deg\] at (0) should be [0 1 0 50deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [1 0 0 90deg\] from add [0 1 0 180deg\] to replace [0 0 1 90deg\] at (0.75) should be [-2.94392e-17 -0.707107 0.707107 70.5288deg\]]
+ expected: FAIL
+
+ [Compositing: property <rotate> underlying [1 0 0 90deg\] from add [0 1 0 180deg\] to replace [0 0 1 90deg\] at (0) should be [-4.32978e-17 -0.707107 -0.707107 180deg\]]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-transforms/animation/scale-composition.html.ini b/tests/wpt/metadata/css/css-transforms/animation/scale-composition.html.ini
new file mode 100644
index 00000000000..1c0dfb8d29d
--- /dev/null
+++ b/tests/wpt/metadata/css/css-transforms/animation/scale-composition.html.ini
@@ -0,0 +1,115 @@
+[scale-composition.html]
+ [Compositing: property <scale> underlying [1 2 3\] from add [none\] to replace [7 8 9\] at (-0.5) should be [-2 -1 0\]]
+ expected: FAIL
+
+ [Compositing: property <scale> underlying [1 2 3\] from add [4 5 6\] to replace [none\] at (1.5) should be [-0.5 -3.5 -7.5\]]
+ expected: FAIL
+
+ [Compositing: property <scale> underlying [1 2 3\] from add [4 5 6\] to replace [7 8 9\] at (-0.5) should be [2.5 11 22.5\]]
+ expected: FAIL
+
+ [Compositing: property <scale> underlying [none\] from add [none\] to replace [1.5 1\] at (2) should be [2 1\]]
+ expected: FAIL
+
+ [Compositing: property <scale> underlying [none\] from add [none\] to replace [1.5 1\] at (0) should be [1\]]
+ expected: FAIL
+
+ [Compositing: property <scale> underlying [1 2 3\] from add [4 5 6\] to replace [none\] at (-0.5) should be [5.5 14.5 26.5\]]
+ expected: FAIL
+
+ [Compositing: property <scale> underlying [none\] from add [none\] to replace [1.5 1\] at (-1) should be [0.5 1\]]
+ expected: FAIL
+
+ [Compositing: property <scale> underlying [2 1\] from add [3 1\] to add [4 1\] at (0.25) should be [6.5 1\]]
+ expected: FAIL
+
+ [Compositing: property <scale> underlying [1 2 3\] from add [4 5 6\] to replace [none\] at (1) should be [none\]]
+ expected: FAIL
+
+ [Compositing: property <scale> underlying [2 1\] from add [3 1\] to add [4 1\] at (0.75) should be [7.5 1\]]
+ expected: FAIL
+
+ [Compositing: property <scale> underlying [1 2 3\] from add [none\] to replace [7 8 9\] at (0.75) should be [5.5 6.5 7.5\]]
+ expected: FAIL
+
+ [Compositing: property <scale> underlying [1 2 3\] from add [4 5 6\] to replace [7 8 9\] at (0.75) should be [6.25 8.5 11.25\]]
+ expected: FAIL
+
+ [Compositing: property <scale> underlying [none\] from add [none\] to replace [1.5 1\] at (1) should be [1.5 1\]]
+ expected: FAIL
+
+ [Compositing: property <scale> underlying [1 2 3\] from add [4 5 6\] to replace [7 8 9\] at (1.5) should be [8.5 7 4.5\]]
+ expected: FAIL
+
+ [Compositing: property <scale> underlying [1 2 3\] from add [4 5 6\] to replace [7 8 9\] at (0) should be [4 10 18\]]
+ expected: FAIL
+
+ [Compositing: property <scale> underlying [none\] from add [4 5 6\] to replace [none\] at (0.75) should be [1.75 2 2.25\]]
+ expected: FAIL
+
+ [Compositing: property <scale> underlying [2 1\] from add [3 1\] to add [4 1\] at (1) should be [8 1\]]
+ expected: FAIL
+
+ [Compositing: property <scale> underlying [1 2 3\] from add [none\] to replace [7 8 9\] at (1) should be [7 8 9\]]
+ expected: FAIL
+
+ [Compositing: property <scale> underlying [1 2 3\] from add [4 5 6\] to replace [none\] at (0.25) should be [3.25 7.75 13.75\]]
+ expected: FAIL
+
+ [Compositing: property <scale> underlying [none\] from add [none\] to replace [1.5 1\] at (0.25) should be [1.125 1\]]
+ expected: FAIL
+
+ [Compositing: property <scale> underlying [1 2 3\] from add [4 5 6\] to replace [7 8 9\] at (1) should be [7 8 9\]]
+ expected: FAIL
+
+ [Compositing: property <scale> underlying [2 1\] from add [3 1\] to add [4 1\] at (1.5) should be [9 1\]]
+ expected: FAIL
+
+ [Compositing: property <scale> underlying [none\] from add [4 5 6\] to replace [none\] at (0.25) should be [3.25 4 4.75\]]
+ expected: FAIL
+
+ [Compositing: property <scale> underlying [1 2 3\] from add [4 5 6\] to replace [7 8 9\] at (0.25) should be [4.75 9.5 15.75\]]
+ expected: FAIL
+
+ [Compositing: property <scale> underlying [1 2 3\] from add [4 5 6\] to replace [none\] at (0) should be [4 10 18\]]
+ expected: FAIL
+
+ [Compositing: property <scale> underlying [1 2 3\] from add [4 5 6\] to replace [none\] at (0.5) should be [2.5 5.5 9.5\]]
+ expected: FAIL
+
+ [Compositing: property <scale> underlying [1 2 3\] from add [none\] to replace [7 8 9\] at (0.25) should be [2.5 3.5 4.5\]]
+ expected: FAIL
+
+ [Compositing: property <scale> underlying [2 1\] from add [3 1\] to add [4 1\] at (0) should be [6 1\]]
+ expected: FAIL
+
+ [Compositing: property <scale> underlying [1 2 3\] from add [4 5 6\] to replace [7 8 9\] at (0.5) should be [5.5 9 13.5\]]
+ expected: FAIL
+
+ [Compositing: property <scale> underlying [1 2 3\] from add [4 5 6\] to replace [none\] at (0.75) should be [1.75 3.25 5.25\]]
+ expected: FAIL
+
+ [Compositing: property <scale> underlying [none\] from add [4 5 6\] to replace [none\] at (0) should be [4 5 6\]]
+ expected: FAIL
+
+ [Compositing: property <scale> underlying [none\] from add [4 5 6\] to replace [none\] at (2) should be [-2 -3 -4\]]
+ expected: FAIL
+
+ [Compositing: property <scale> underlying [2 1\] from add [3 1\] to add [4 1\] at (-0.5) should be [5 1\]]
+ expected: FAIL
+
+ [Compositing: property <scale> underlying [1 2 3\] from add [none\] to replace [7 8 9\] at (0.5) should be [4 5 6\]]
+ expected: FAIL
+
+ [Compositing: property <scale> underlying [2 1\] from add [3 1\] to add [4 1\] at (0.5) should be [7 1\]]
+ expected: FAIL
+
+ [Compositing: property <scale> underlying [none\] from add [4 5 6\] to replace [none\] at (-1) should be [7 9 11\]]
+ expected: FAIL
+
+ [Compositing: property <scale> underlying [1 2 3\] from add [none\] to replace [7 8 9\] at (1.5) should be [10 11 12\]]
+ expected: FAIL
+
+ [Compositing: property <scale> underlying [none\] from add [none\] to replace [1.5 1\] at (0.75) should be [1.375 1\]]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-transforms/animation/transform-composition.html.ini b/tests/wpt/metadata/css/css-transforms/animation/transform-composition.html.ini
new file mode 100644
index 00000000000..43186f806a2
--- /dev/null
+++ b/tests/wpt/metadata/css/css-transforms/animation/transform-composition.html.ini
@@ -0,0 +1,64 @@
+[transform-composition.html]
+ [Compositing: property <transform> underlying [rotateX(90deg)\] from add [translate(100px, 100px)\] to add [scale(2)\] at (1) should be [matrix3d(2, 0, 0, 0, 0, 1.22465e-16, 2, 0, 0, -1, 6.12323e-17, 0, 0, 0, 0, 1)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(90deg)\] from add [translate(100px, 100px)\] to add [scale(2)\] at (0) should be [matrix3d(1, 0, 0, 0, 0, 6.12323e-17, 1, 0, 0, -1, 6.12323e-17, 0, 100, 6.12323e-15, 100, 1)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(100deg) rotateY(100deg)\] from add [translate(10px, 20px)\] to replace [rotateX(200deg) rotateY(200deg) translate(110px, 220px)\] at (0.5) should be [rotateX(150deg) rotateY(150deg) translate(60px, 120px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(100deg) rotateY(100deg)\] from add [translate(10px, 20px)\] to replace [rotateX(200deg) rotateY(200deg) translate(110px, 220px)\] at (1) should be [rotateX(200deg) rotateY(200deg) translate(110px, 220px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(90deg)\] from add [translate(100px, 100px)\] to add [scale(2)\] at (0.75) should be [matrix3d(1.75, 0, 0, 0, 0, 3.88578e-16, 1.75, 0, 0, -1, 2.22045e-16, 0, 25, 1.53081e-15, 25, 1)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(100deg) rotateY(100deg)\] from add [translate(10px, 20px)\] to replace [rotateX(200deg) rotateY(200deg) translate(110px, 220px)\] at (1.5) should be [rotateX(250deg) rotateY(250deg) translate(160px, 320px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(100deg) rotateY(100deg)\] from add [translate(10px, 20px)\] to replace [rotateX(200deg) rotateY(200deg) translate(110px, 220px)\] at (-0.5) should be [rotateX(50deg) rotateY(50deg) translate(-40px, -80px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(45deg)\] from add [none\] to add [rotateY(360deg)\] at (0.5) should be [rotateX(45deg) rotateY(180deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(100deg) rotateY(100deg)\] from add [translate(10px, 20px)\] to replace [rotateX(200deg) rotateY(200deg) translate(110px, 220px)\] at (0) should be [rotateX(100deg) rotateY(100deg) translate(10px, 20px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(90deg)\] from add [translate(100px, 100px)\] to add [scale(2)\] at (0.5) should be [matrix3d(1.5, 0, 0, 0, 0, 3.33067e-16, 1.5, 0, 0, -1, 2.22045e-16, 0, 50, 3.06162e-15, 50, 1)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(90deg)\] from add [translate(100px, 100px)\] to add [scale(2)\] at (0.25) should be [matrix3d(1.25, 0, 0, 0, 0, 2.77556e-16, 1.25, 0, 0, -1, 2.22045e-16, 0, 75, 4.59243e-15, 75, 1)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(45deg)\] from add [none\] to add [rotateY(360deg)\] at (0) should be [rotateX(45deg) rotateY(0deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(90deg)\] from add [translate(100px, 100px)\] to add [scale(2)\] at (-0.5) should be [matrix3d(0.5, 0, 0, 0, 0, 1.11022e-16, 0.5, 0, 0, -1, 2.22045e-16, 0, 150, 9.18485e-15, 150, 1)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(100deg) rotateY(100deg)\] from add [translate(10px, 20px)\] to replace [rotateX(200deg) rotateY(200deg) translate(110px, 220px)\] at (0.75) should be [rotateX(175deg) rotateY(175deg) translate(85px, 170px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(45deg)\] from add [none\] to add [rotateY(360deg)\] at (1) should be [rotateX(45deg) rotateY(360deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(90deg)\] from add [translate(100px, 100px)\] to add [scale(2)\] at (1.5) should be [matrix3d(2.5, 0, 0, 0, 0, 5.55112e-16, 2.5, 0, 0, -1, 2.22045e-16, 0, -50, -3.06162e-15, -50, 1)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(45deg)\] from add [none\] to add [rotateY(360deg)\] at (1.5) should be [rotateX(45deg) rotateY(540deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(45deg)\] from add [none\] to add [rotateY(360deg)\] at (0.75) should be [rotateX(45deg) rotateY(270deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(100deg) rotateY(100deg)\] from add [translate(10px, 20px)\] to replace [rotateX(200deg) rotateY(200deg) translate(110px, 220px)\] at (0.25) should be [rotateX(125deg) rotateY(125deg) translate(35px, 70px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(45deg)\] from add [none\] to add [rotateY(360deg)\] at (-0.5) should be [rotateX(45deg) rotateY(-180deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(45deg)\] from add [none\] to add [rotateY(360deg)\] at (0.25) should be [rotateX(45deg) rotateY(90deg)\]]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-transforms/animation/transform-matrix-composition.html.ini b/tests/wpt/metadata/css/css-transforms/animation/transform-matrix-composition.html.ini
new file mode 100644
index 00000000000..c1bb84468ec
--- /dev/null
+++ b/tests/wpt/metadata/css/css-transforms/animation/transform-matrix-composition.html.ini
@@ -0,0 +1,169 @@
+[transform-matrix-composition.html]
+ [Compositing: property <transform> underlying [matrix3d(0.8535533905932737,0.1464466094067262,-0.5,0,0.1464466094067262,0.8535533905932737,0.5,0,0.5,-0.5,0.7071067811865476,0,100,0,0,1)\] from add [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 100, 0, 0, 1)\] to add [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 200, 0, 0, 1)\] at (0.5) should be [translateX(100px) rotate3d(1, 1, 0, 45deg) translateX(150px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(1, 1, 0, 0, 0, 100)\] from accumulate [matrix(1, 0, 0, 1, 100, 0)\] to accumulate [matrix(1, 0, 0, 1, 200, 0)\] at (0.25) should be [matrix(1, 0, 0, 1, 125, 0)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)\] from add [matrix(1, 1, 0, 0, 0, 100)\] to add [matrix(1, 0, 0, 1, 200, 0)\] at (0.25) should be [matrix(1, 1, 0, 0, 100, 100)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix3d(0.8535533905932737,0.1464466094067262,-0.5,0,0.1464466094067262,0.8535533905932737,0.5,0,0.5,-0.5,0.7071067811865476,0,100,0,0,1)\] from add [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 100, 0, 0, 1)\] to add [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 200, 0, 0, 1)\] at (1) should be [translateX(100px) rotate3d(1, 1, 0, 45deg) translateX(200px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)\] from add [matrix(1, 1, 0, 0, 0, 100)\] to add [matrix(1, 0, 0, 1, 200, 0)\] at (0) should be [matrix(1, 1, 0, 0, 100, 100)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix3d(0.8535533905932737,0.1464466094067262,-0.5,0,0.1464466094067262,0.8535533905932737,0.5,0,0.5,-0.5,0.7071067811865476,0,100,0,0,1)\] from add [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 100, 0, 0, 1)\] to add [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 200, 0, 0, 1)\] at (0) should be [translateX(100px) rotate3d(1, 1, 0, 45deg) translateX(100px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(0, 1, -1, 0, 100, 0)\] from add [matrix(1, 0, 0, 1, 100, 0)\] to add [matrix(1, 0, 0, 1, 200, 0)\] at (0.25) should be [matrix(0, 1, -1, 0, 100, 125)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(1, 1, 0, 0, 0, 100)\] from accumulate [matrix(1, 0, 0, 1, 100, 0)\] to accumulate [matrix(1, 0, 0, 1, 200, 0)\] at (0.75) should be [matrix(1, 0, 0, 1, 175, 0)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(0, 1, -1, 0, 100, 0)\] from add [matrix(1, 0, 0, 1, 100, 0)\] to add [matrix(1, 0, 0, 1, 200, 0)\] at (1) should be [matrix(0, 1, -1, 0, 100, 200)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix3d(0.8535533905932737,0.1464466094067262,-0.5,0,0.1464466094067262,0.8535533905932737,0.5,0,0.5,-0.5,0.7071067811865476,0,100,0,0,1)\] from accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 100, 0, 0, 1)\] to accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 200, 0, 0, 1)\] at (0.25) should be [translateX(225px) rotate3d(1, 1, 0, 45deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(0, 1, -1, 0, 100, 0)\] from accumulate [matrix(1, 0, 0, 1, 100, 0)\] to accumulate [matrix(1, 0, 0, 1, 200, 0)\] at (1.5) should be [matrix(0, 1, -1, 0, 350, 0)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)\] from accumulate [matrix(1, 1, 0, 0, 0, 100)\] to accumulate [matrix(1, 0, 0, 1, 200, 0)\] at (-0.5) should be [matrix(1, 1, 0, 0, 0, 100)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix3d(0.8535533905932737,0.1464466094067262,-0.5,0,0.1464466094067262,0.8535533905932737,0.5,0,0.5,-0.5,0.7071067811865476,0,100,0,0,1)\] from add [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 100, 0, 0, 1)\] to add [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 200, 0, 0, 1)\] at (1.5) should be [translateX(100px) rotate3d(1, 1, 0, 45deg) translateX(250px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(1, 1, 0, 0, 0, 100)\] from add [matrix(1, 0, 0, 1, 100, 0)\] to add [matrix(1, 0, 0, 1, 200, 0)\] at (0.25) should be [matrix(1, 1, 0, 0, 100, 200)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix3d(0.8535533905932737,0.1464466094067262,-0.5,0,0.1464466094067262,0.8535533905932737,0.5,0,0.5,-0.5,0.7071067811865476,0,100,0,0,1)\] from accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 100, 0, 0, 1)\] to accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 200, 0, 0, 1)\] at (0.75) should be [translateX(275px) rotate3d(1, 1, 0, 45deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(1, 1, 0, 0, 0, 100)\] from add [matrix(1, 0, 0, 1, 100, 0)\] to add [matrix(1, 0, 0, 1, 200, 0)\] at (-0.5) should be [matrix(1, 1, 0, 0, 100, 200)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)\] from accumulate [matrix(1, 1, 0, 0, 0, 100)\] to accumulate [matrix(1, 0, 0, 1, 200, 0)\] at (0.5) should be [matrix(1, 0, 0, 1, 300, 0)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix3d(0.8535533905932737,0.1464466094067262,-0.5,0,0.1464466094067262,0.8535533905932737,0.5,0,0.5,-0.5,0.7071067811865476,0,100,0,0,1)\] from accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 100, 0, 0, 1)\] to accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 200, 0, 0, 1)\] at (1.5) should be [translateX(350px) rotate3d(1, 1, 0, 45deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(1, 1, 0, 0, 0, 100)\] from add [matrix(1, 0, 0, 1, 100, 0)\] to add [matrix(1, 0, 0, 1, 200, 0)\] at (1) should be [matrix(1, 1, 0, 0, 200, 300)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(1, 1, 0, 0, 0, 100)\] from add [matrix(1, 0, 0, 1, 100, 0)\] to add [matrix(1, 0, 0, 1, 200, 0)\] at (1.5) should be [matrix(1, 1, 0, 0, 200, 300)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)\] from add [matrix(1, 1, 0, 0, 0, 100)\] to add [matrix(1, 0, 0, 1, 200, 0)\] at (1) should be [matrix(1, 0, 0, 1, 300, 0)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(1, 1, 0, 0, 0, 100)\] from accumulate [matrix(1, 0, 0, 1, 100, 0)\] to accumulate [matrix(1, 0, 0, 1, 200, 0)\] at (1) should be [matrix(1, 0, 0, 1, 200, 0)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(0, 1, -1, 0, 100, 0)\] from accumulate [matrix(1, 0, 0, 1, 100, 0)\] to accumulate [matrix(1, 0, 0, 1, 200, 0)\] at (0) should be [matrix(0, 1, -1, 0, 200, 0)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(1, 1, 0, 0, 0, 100)\] from accumulate [matrix(1, 0, 0, 1, 100, 0)\] to accumulate [matrix(1, 0, 0, 1, 200, 0)\] at (0.5) should be [matrix(1, 0, 0, 1, 150, 0)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix3d(0.8535533905932737,0.1464466094067262,-0.5,0,0.1464466094067262,0.8535533905932737,0.5,0,0.5,-0.5,0.7071067811865476,0,100,0,0,1)\] from accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 100, 0, 0, 1)\] to accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 200, 0, 0, 1)\] at (-0.5) should be [translateX(150px) rotate3d(1, 1, 0, 45deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(0, 1, -1, 0, 100, 0)\] from accumulate [matrix(1, 0, 0, 1, 100, 0)\] to accumulate [matrix(1, 0, 0, 1, 200, 0)\] at (-0.5) should be [matrix(0, 1, -1, 0, 150, 0)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)\] from accumulate [matrix(1, 1, 0, 0, 0, 100)\] to accumulate [matrix(1, 0, 0, 1, 200, 0)\] at (0) should be [matrix(1, 1, 0, 0, 0, 100)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(0, 1, -1, 0, 100, 0)\] from accumulate [matrix(1, 0, 0, 1, 100, 0)\] to accumulate [matrix(1, 0, 0, 1, 200, 0)\] at (0.25) should be [matrix(0, 1, -1, 0, 225, 0)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(1, 1, 0, 0, 0, 100)\] from accumulate [matrix(1, 0, 0, 1, 100, 0)\] to accumulate [matrix(1, 0, 0, 1, 200, 0)\] at (-0.5) should be [matrix(1, 0, 0, 1, 50, 0)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(1, 1, 0, 0, 0, 100)\] from add [matrix(1, 0, 0, 1, 100, 0)\] to add [matrix(1, 0, 0, 1, 200, 0)\] at (0) should be [matrix(1, 1, 0, 0, 100, 200)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)\] from accumulate [matrix(1, 1, 0, 0, 0, 100)\] to accumulate [matrix(1, 0, 0, 1, 200, 0)\] at (0.75) should be [matrix(1, 0, 0, 1, 300, 0)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix3d(0.8535533905932737,0.1464466094067262,-0.5,0,0.1464466094067262,0.8535533905932737,0.5,0,0.5,-0.5,0.7071067811865476,0,100,0,0,1)\] from accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 100, 0, 0, 1)\] to accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 200, 0, 0, 1)\] at (0) should be [translateX(200px) rotate3d(1, 1, 0, 45deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)\] from add [matrix(1, 1, 0, 0, 0, 100)\] to add [matrix(1, 0, 0, 1, 200, 0)\] at (0.75) should be [matrix(1, 0, 0, 1, 300, 0)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix3d(0.8535533905932737,0.1464466094067262,-0.5,0,0.1464466094067262,0.8535533905932737,0.5,0,0.5,-0.5,0.7071067811865476,0,100,0,0,1)\] from add [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 100, 0, 0, 1)\] to add [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 200, 0, 0, 1)\] at (0.75) should be [translateX(100px) rotate3d(1, 1, 0, 45deg) translateX(175px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix3d(0.8535533905932737,0.1464466094067262,-0.5,0,0.1464466094067262,0.8535533905932737,0.5,0,0.5,-0.5,0.7071067811865476,0,100,0,0,1)\] from accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 100, 0, 0, 1)\] to accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 200, 0, 0, 1)\] at (0.5) should be [translateX(250px) rotate3d(1, 1, 0, 45deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)\] from add [matrix(1, 1, 0, 0, 0, 100)\] to add [matrix(1, 0, 0, 1, 200, 0)\] at (-0.5) should be [matrix(1, 1, 0, 0, 100, 100)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(1, 1, 0, 0, 0, 100)\] from add [matrix(1, 0, 0, 1, 100, 0)\] to add [matrix(1, 0, 0, 1, 200, 0)\] at (0.75) should be [matrix(1, 1, 0, 0, 200, 300)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(1, 1, 0, 0, 0, 100)\] from accumulate [matrix(1, 0, 0, 1, 100, 0)\] to accumulate [matrix(1, 0, 0, 1, 200, 0)\] at (1.5) should be [matrix(1, 0, 0, 1, 250, 0)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(0, 1, -1, 0, 100, 0)\] from add [matrix(1, 0, 0, 1, 100, 0)\] to add [matrix(1, 0, 0, 1, 200, 0)\] at (-0.5) should be [matrix(0, 1, -1, 0, 100, 50)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)\] from accumulate [matrix(1, 1, 0, 0, 0, 100)\] to accumulate [matrix(1, 0, 0, 1, 200, 0)\] at (1.5) should be [matrix(1, 0, 0, 1, 300, 0)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(1, 1, 0, 0, 0, 100)\] from add [matrix(1, 0, 0, 1, 100, 0)\] to add [matrix(1, 0, 0, 1, 200, 0)\] at (0.5) should be [matrix(1, 1, 0, 0, 200, 300)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix3d(0.8535533905932737,0.1464466094067262,-0.5,0,0.1464466094067262,0.8535533905932737,0.5,0,0.5,-0.5,0.7071067811865476,0,100,0,0,1)\] from add [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 100, 0, 0, 1)\] to add [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 200, 0, 0, 1)\] at (0.25) should be [translateX(100px) rotate3d(1, 1, 0, 45deg) translateX(125px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(0, 1, -1, 0, 100, 0)\] from add [matrix(1, 0, 0, 1, 100, 0)\] to add [matrix(1, 0, 0, 1, 200, 0)\] at (0.5) should be [matrix(0, 1, -1, 0, 100, 150)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(0, 1, -1, 0, 100, 0)\] from add [matrix(1, 0, 0, 1, 100, 0)\] to add [matrix(1, 0, 0, 1, 200, 0)\] at (1.5) should be [matrix(0, 1, -1, 0, 100, 250)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(1, 1, 0, 0, 0, 100)\] from accumulate [matrix(1, 0, 0, 1, 100, 0)\] to accumulate [matrix(1, 0, 0, 1, 200, 0)\] at (0) should be [matrix(1, 0, 0, 1, 100, 0)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(0, 1, -1, 0, 100, 0)\] from accumulate [matrix(1, 0, 0, 1, 100, 0)\] to accumulate [matrix(1, 0, 0, 1, 200, 0)\] at (0.75) should be [matrix(0, 1, -1, 0, 275, 0)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)\] from accumulate [matrix(1, 1, 0, 0, 0, 100)\] to accumulate [matrix(1, 0, 0, 1, 200, 0)\] at (0.25) should be [matrix(1, 1, 0, 0, 0, 100)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix3d(0.8535533905932737,0.1464466094067262,-0.5,0,0.1464466094067262,0.8535533905932737,0.5,0,0.5,-0.5,0.7071067811865476,0,100,0,0,1)\] from accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 100, 0, 0, 1)\] to accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 200, 0, 0, 1)\] at (1) should be [translateX(300px) rotate3d(1, 1, 0, 45deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)\] from add [matrix(1, 1, 0, 0, 0, 100)\] to add [matrix(1, 0, 0, 1, 200, 0)\] at (0.5) should be [matrix(1, 0, 0, 1, 300, 0)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix3d(0.8535533905932737,0.1464466094067262,-0.5,0,0.1464466094067262,0.8535533905932737,0.5,0,0.5,-0.5,0.7071067811865476,0,100,0,0,1)\] from add [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 100, 0, 0, 1)\] to add [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 200, 0, 0, 1)\] at (-0.5) should be [translateX(100px) rotate3d(1, 1, 0, 45deg) translateX(50px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)\] from add [matrix(1, 1, 0, 0, 0, 100)\] to add [matrix(1, 0, 0, 1, 200, 0)\] at (1.5) should be [matrix(1, 0, 0, 1, 300, 0)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)\] from accumulate [matrix(1, 1, 0, 0, 0, 100)\] to accumulate [matrix(1, 0, 0, 1, 200, 0)\] at (1) should be [matrix(1, 0, 0, 1, 300, 0)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(0, 1, -1, 0, 100, 0)\] from accumulate [matrix(1, 0, 0, 1, 100, 0)\] to accumulate [matrix(1, 0, 0, 1, 200, 0)\] at (0.5) should be [matrix(0, 1, -1, 0, 250, 0)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(0, 1, -1, 0, 100, 0)\] from accumulate [matrix(1, 0, 0, 1, 100, 0)\] to accumulate [matrix(1, 0, 0, 1, 200, 0)\] at (1) should be [matrix(0, 1, -1, 0, 300, 0)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(0, 1, -1, 0, 100, 0)\] from add [matrix(1, 0, 0, 1, 100, 0)\] to add [matrix(1, 0, 0, 1, 200, 0)\] at (0.75) should be [matrix(0, 1, -1, 0, 100, 175)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [matrix(0, 1, -1, 0, 100, 0)\] from add [matrix(1, 0, 0, 1, 100, 0)\] to add [matrix(1, 0, 0, 1, 200, 0)\] at (0) should be [matrix(0, 1, -1, 0, 100, 100)\]]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-transforms/animation/transform-perspective-composition.html.ini b/tests/wpt/metadata/css/css-transforms/animation/transform-perspective-composition.html.ini
new file mode 100644
index 00000000000..891dc0a4253
--- /dev/null
+++ b/tests/wpt/metadata/css/css-transforms/animation/transform-perspective-composition.html.ini
@@ -0,0 +1,40 @@
+[transform-perspective-composition.html]
+ [Compositing: property <transform> underlying [perspective(10px)\] from accumulate [perspective(10px)\] to accumulate [perspective(50px)\] at (1.5) should be [perspective(12.5px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [perspective(10px)\] from accumulate [perspective(10px)\] to accumulate [perspective(50px)\] at (0) should be [perspective(5px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [perspective(10px)\] from add [perspective(10px)\] to add [perspective(50px)\] at (-0.5) should be [perspective(4.12px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [perspective(10px)\] from accumulate [perspective(10px)\] to accumulate [perspective(50px)\] at (1) should be [perspective(8.33px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [perspective(10px)\] from accumulate [perspective(10px)\] to accumulate [perspective(50px)\] at (0.75) should be [perspective(7.06px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [perspective(10px)\] from accumulate [perspective(10px)\] to accumulate [perspective(50px)\] at (-0.5) should be [perspective(4.12px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [perspective(10px)\] from accumulate [perspective(10px)\] to accumulate [perspective(50px)\] at (0.25) should be [perspective(5.45px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [perspective(10px)\] from add [perspective(10px)\] to add [perspective(50px)\] at (1) should be [perspective(8.33px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [perspective(10px)\] from add [perspective(10px)\] to add [perspective(50px)\] at (0.75) should be [perspective(7.06px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [perspective(10px)\] from add [perspective(10px)\] to add [perspective(50px)\] at (0.25) should be [perspective(5.45px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [perspective(10px)\] from accumulate [perspective(10px)\] to accumulate [perspective(50px)\] at (0.5) should be [perspective(6.15px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [perspective(10px)\] from add [perspective(10px)\] to add [perspective(50px)\] at (0) should be [perspective(5px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [perspective(10px)\] from add [perspective(10px)\] to add [perspective(50px)\] at (0.5) should be [perspective(6.15px)\]]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-transforms/animation/transform-rotate-composition.html.ini b/tests/wpt/metadata/css/css-transforms/animation/transform-rotate-composition.html.ini
new file mode 100644
index 00000000000..42f41c7b65b
--- /dev/null
+++ b/tests/wpt/metadata/css/css-transforms/animation/transform-rotate-composition.html.ini
@@ -0,0 +1,190 @@
+[transform-rotate-composition.html]
+ [Compositing: property <transform> underlying [rotateY(20deg)\] from accumulate [rotateY(40deg)\] to accumulate [rotateY(60deg)\] at (1.5) should be [rotateY(90deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateZ(20deg)\] from add [rotateZ(40deg)\] to add [rotateZ(60deg)\] at (-0.5) should be [rotateZ(50deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotate(45deg) skew(10deg, 20deg)\] from add [rotate(45deg)\] to add [rotate(225deg)\] at (1.5) should be [rotate(45deg) skew(10deg, 20deg) rotate(315deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotate(45deg) skew(10deg, 20deg)\] from accumulate [rotate(45deg)\] to accumulate [rotate(225deg)\] at (0) should be [rotate(90deg) skew(10deg, 20deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(20deg)\] from accumulate [rotateX(40deg)\] to accumulate [rotateX(60deg)\] at (-0.5) should be [rotateX(50deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotate(45deg) skew(10deg, 20deg)\] from accumulate [rotate(45deg)\] to accumulate [rotate(225deg)\] at (-0.5) should be [rotate(0deg) skew(10deg, 20deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateZ(20deg)\] from add [rotateZ(40deg)\] to add [rotateZ(60deg)\] at (0) should be [rotateZ(60deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(20deg)\] from accumulate [rotateX(40deg)\] to accumulate [rotateX(60deg)\] at (0.75) should be [rotateX(75deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(20deg)\] from add [rotateX(40deg)\] to add [rotateX(60deg)\] at (-0.5) should be [rotateX(50deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateY(20deg)\] from add [rotateY(40deg)\] to add [rotateY(60deg)\] at (1) should be [rotateY(80deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(45deg)\] from accumulate [rotateY(30deg)\] to accumulate [rotateY(70deg)\] at (1.5) should be [rotateX(45deg) rotateY(90deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotate(45deg) skew(10deg, 20deg)\] from add [rotate(45deg)\] to add [rotate(225deg)\] at (1) should be [rotate(45deg) skew(10deg, 20deg) rotate(225deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(20deg)\] from accumulate [rotateX(40deg)\] to accumulate [rotateX(60deg)\] at (1) should be [rotateX(80deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateZ(20deg)\] from accumulate [rotateZ(40deg)\] to accumulate [rotateZ(60deg)\] at (1) should be [rotateZ(80deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateY(20deg)\] from accumulate [rotateY(40deg)\] to accumulate [rotateY(60deg)\] at (0.5) should be [rotateY(70deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotate(45deg) skew(10deg, 20deg)\] from accumulate [rotate(45deg)\] to accumulate [rotate(225deg)\] at (0.75) should be [rotate(225deg) skew(10deg, 20deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(20deg)\] from accumulate [rotateX(40deg)\] to accumulate [rotateX(60deg)\] at (0) should be [rotateX(60deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateY(20deg)\] from accumulate [rotateY(40deg)\] to accumulate [rotateY(60deg)\] at (0) should be [rotateY(60deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateZ(20deg)\] from add [rotateZ(40deg)\] to add [rotateZ(60deg)\] at (1) should be [rotateZ(80deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotate(45deg) skew(10deg, 20deg)\] from add [rotate(45deg)\] to add [rotate(225deg)\] at (-0.5) should be [rotate(45deg) skew(10deg, 20deg) rotate(-45deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(20deg)\] from add [rotateX(40deg)\] to add [rotateX(60deg)\] at (1.5) should be [rotateX(90deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateZ(20deg)\] from add [rotateZ(40deg)\] to add [rotateZ(60deg)\] at (0.5) should be [rotateZ(70deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateY(20deg)\] from accumulate [rotateY(40deg)\] to accumulate [rotateY(60deg)\] at (0.75) should be [rotateY(75deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(20deg)\] from add [rotateX(40deg)\] to add [rotateX(60deg)\] at (1) should be [rotateX(80deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotate(45deg) skew(10deg, 20deg)\] from add [rotate(45deg)\] to add [rotate(225deg)\] at (0) should be [rotate(45deg) skew(10deg, 20deg) rotate(45deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateZ(20deg)\] from accumulate [rotateZ(40deg)\] to accumulate [rotateZ(60deg)\] at (1.5) should be [rotateZ(90deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateY(20deg)\] from add [rotateY(40deg)\] to add [rotateY(60deg)\] at (0) should be [rotateY(60deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotate(45deg) skew(10deg, 20deg)\] from add [rotate(45deg)\] to add [rotate(225deg)\] at (0.5) should be [rotate(45deg) skew(10deg, 20deg) rotate(135deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateY(20deg)\] from add [rotateY(40deg)\] to add [rotateY(60deg)\] at (0.5) should be [rotateY(70deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateZ(20deg)\] from accumulate [rotateZ(40deg)\] to accumulate [rotateZ(60deg)\] at (0.75) should be [rotateZ(75deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotate(45deg) skew(10deg, 20deg)\] from add [rotate(45deg)\] to add [rotate(225deg)\] at (0.75) should be [rotate(45deg) skew(10deg, 20deg) rotate(180deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateY(20deg)\] from add [rotateY(40deg)\] to add [rotateY(60deg)\] at (0.75) should be [rotateY(75deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(20deg)\] from add [rotateX(40deg)\] to add [rotateX(60deg)\] at (0.75) should be [rotateX(75deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateZ(20deg)\] from add [rotateZ(40deg)\] to add [rotateZ(60deg)\] at (0.25) should be [rotateZ(65deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateY(20deg)\] from add [rotateY(40deg)\] to add [rotateY(60deg)\] at (0.25) should be [rotateY(65deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(20deg)\] from accumulate [rotateX(40deg)\] to accumulate [rotateX(60deg)\] at (0.25) should be [rotateX(65deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateZ(20deg)\] from accumulate [rotateZ(40deg)\] to accumulate [rotateZ(60deg)\] at (0.5) should be [rotateZ(70deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateY(20deg)\] from accumulate [rotateY(40deg)\] to accumulate [rotateY(60deg)\] at (-0.5) should be [rotateY(50deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(45deg)\] from accumulate [rotateY(30deg)\] to accumulate [rotateY(70deg)\] at (0.25) should be [rotateX(45deg) rotateY(40deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotate(45deg) skew(10deg, 20deg)\] from accumulate [rotate(45deg)\] to accumulate [rotate(225deg)\] at (0.5) should be [rotate(180deg) skew(10deg, 20deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateZ(20deg)\] from accumulate [rotateZ(40deg)\] to accumulate [rotateZ(60deg)\] at (-0.5) should be [rotateZ(50deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(20deg)\] from accumulate [rotateX(40deg)\] to accumulate [rotateX(60deg)\] at (1.5) should be [rotateX(90deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(20deg)\] from accumulate [rotateX(40deg)\] to accumulate [rotateX(60deg)\] at (0.5) should be [rotateX(70deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(45deg)\] from accumulate [rotateY(30deg)\] to accumulate [rotateY(70deg)\] at (0) should be [rotateX(45deg) rotateY(30deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotate(45deg) skew(10deg, 20deg)\] from add [rotate(45deg)\] to add [rotate(225deg)\] at (0.25) should be [rotate(45deg) skew(10deg, 20deg) rotate(90deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateY(20deg)\] from add [rotateY(40deg)\] to add [rotateY(60deg)\] at (1.5) should be [rotateY(90deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateY(20deg)\] from add [rotateY(40deg)\] to add [rotateY(60deg)\] at (-0.5) should be [rotateY(50deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateY(20deg)\] from accumulate [rotateY(40deg)\] to accumulate [rotateY(60deg)\] at (1) should be [rotateY(80deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(45deg)\] from accumulate [rotateY(30deg)\] to accumulate [rotateY(70deg)\] at (0.75) should be [rotateX(45deg) rotateY(60deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotate(45deg) skew(10deg, 20deg)\] from accumulate [rotate(45deg)\] to accumulate [rotate(225deg)\] at (1.5) should be [rotate(360deg) skew(10deg, 20deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotate(45deg) skew(10deg, 20deg)\] from accumulate [rotate(45deg)\] to accumulate [rotate(225deg)\] at (0.25) should be [rotate(135deg) skew(10deg, 20deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateY(20deg)\] from accumulate [rotateY(40deg)\] to accumulate [rotateY(60deg)\] at (0.25) should be [rotateY(65deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(20deg)\] from add [rotateX(40deg)\] to add [rotateX(60deg)\] at (0.25) should be [rotateX(65deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateZ(20deg)\] from add [rotateZ(40deg)\] to add [rotateZ(60deg)\] at (1.5) should be [rotateZ(90deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateZ(20deg)\] from accumulate [rotateZ(40deg)\] to accumulate [rotateZ(60deg)\] at (0) should be [rotateZ(60deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotate(45deg) skew(10deg, 20deg)\] from accumulate [rotate(45deg)\] to accumulate [rotate(225deg)\] at (1) should be [rotate(270deg) skew(10deg, 20deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(20deg)\] from add [rotateX(40deg)\] to add [rotateX(60deg)\] at (0.5) should be [rotateX(70deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateZ(20deg)\] from accumulate [rotateZ(40deg)\] to accumulate [rotateZ(60deg)\] at (0.25) should be [rotateZ(65deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(20deg)\] from add [rotateX(40deg)\] to add [rotateX(60deg)\] at (0) should be [rotateX(60deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateZ(20deg)\] from add [rotateZ(40deg)\] to add [rotateZ(60deg)\] at (0.75) should be [rotateZ(75deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(45deg)\] from accumulate [rotateY(30deg)\] to accumulate [rotateY(70deg)\] at (0.5) should be [rotateX(45deg) rotateY(50deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(45deg)\] from accumulate [rotateY(30deg)\] to accumulate [rotateY(70deg)\] at (1) should be [rotateX(45deg) rotateY(70deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [rotateX(45deg)\] from accumulate [rotateY(30deg)\] to accumulate [rotateY(70deg)\] at (-0.5) should be [rotateX(45deg) rotateY(10deg)\]]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-transforms/animation/transform-scale-composition.html.ini b/tests/wpt/metadata/css/css-transforms/animation/transform-scale-composition.html.ini
new file mode 100644
index 00000000000..6a32547081a
--- /dev/null
+++ b/tests/wpt/metadata/css/css-transforms/animation/transform-scale-composition.html.ini
@@ -0,0 +1,148 @@
+[transform-scale-composition.html]
+ [Compositing: property <transform> underlying [scaleZ(2)\] from accumulate [scaleZ(3)\] to accumulate [scaleZ(4)\] at (-0.5) should be [scaleZ(3.5)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleY(2)\] from accumulate [scaleY(3)\] to accumulate [scaleY(4)\] at (0.5) should be [scaleY(4.5)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleX(2)\] from add [scaleX(3)\] to add [scaleX(4)\] at (1.5) should be [scaleX(9)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleZ(2)\] from add [scaleZ(3)\] to add [scaleZ(4)\] at (-0.5) should be [scaleZ(5)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleX(2)\] from accumulate [scaleX(3)\] to accumulate [scaleX(4)\] at (0) should be [scaleX(4)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleZ(2)\] from add [scaleZ(3)\] to add [scaleZ(4)\] at (0.25) should be [scaleZ(6.5)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleZ(2)\] from accumulate [scaleZ(3)\] to accumulate [scaleZ(4)\] at (1) should be [scaleZ(5)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scale(2, 4)\] from accumulate [scaleZ(3)\] to accumulate [scaleZ(4)\] at (0.5) should be [scale3d(2, 4, 3.5)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleX(2)\] from accumulate [scaleX(3)\] to accumulate [scaleX(4)\] at (-0.5) should be [scaleX(3.5)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scale(2, 4)\] from accumulate [scaleZ(3)\] to accumulate [scaleZ(4)\] at (0.75) should be [scale3d(2, 4, 3.75)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleZ(2)\] from accumulate [scaleZ(3)\] to accumulate [scaleZ(4)\] at (0) should be [scaleZ(4)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleZ(2)\] from accumulate [scaleZ(3)\] to accumulate [scaleZ(4)\] at (0.5) should be [scaleZ(4.5)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleX(2)\] from add [scaleX(3)\] to add [scaleX(4)\] at (1) should be [scaleX(8)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleY(2)\] from accumulate [scaleY(3)\] to accumulate [scaleY(4)\] at (0) should be [scaleY(4)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleX(2)\] from add [scaleX(3)\] to add [scaleX(4)\] at (0.25) should be [scaleX(6.5)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleY(2)\] from accumulate [scaleY(3)\] to accumulate [scaleY(4)\] at (1) should be [scaleY(5)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleZ(2)\] from add [scaleZ(3)\] to add [scaleZ(4)\] at (1.5) should be [scaleZ(9)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scale(2, 4)\] from accumulate [scaleZ(3)\] to accumulate [scaleZ(4)\] at (1) should be [scale3d(2, 4, 4)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleZ(2)\] from accumulate [scaleZ(3)\] to accumulate [scaleZ(4)\] at (1.5) should be [scaleZ(5.5)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleY(2)\] from accumulate [scaleY(3)\] to accumulate [scaleY(4)\] at (-0.5) should be [scaleY(3.5)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleX(2)\] from accumulate [scaleX(3)\] to accumulate [scaleX(4)\] at (0.25) should be [scaleX(4.25)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleX(2)\] from accumulate [scaleX(3)\] to accumulate [scaleX(4)\] at (1) should be [scaleX(5)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scale(2, 4)\] from accumulate [scaleZ(3)\] to accumulate [scaleZ(4)\] at (1.5) should be [scale3d(2, 4, 4.5)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleY(2)\] from add [scaleY(3)\] to add [scaleY(4)\] at (0.75) should be [scaleY(7.5)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleX(2)\] from accumulate [scaleX(3)\] to accumulate [scaleX(4)\] at (0.75) should be [scaleX(4.75)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleY(2)\] from add [scaleY(3)\] to add [scaleY(4)\] at (0.5) should be [scaleY(7)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleY(2)\] from add [scaleY(3)\] to add [scaleY(4)\] at (0.25) should be [scaleY(6.5)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scale(2, 4)\] from accumulate [scaleZ(3)\] to accumulate [scaleZ(4)\] at (0) should be [scale3d(2, 4, 3)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scale(2, 4)\] from accumulate [scaleZ(3)\] to accumulate [scaleZ(4)\] at (-0.5) should be [scale3d(2, 4, 2.5)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleZ(2)\] from add [scaleZ(3)\] to add [scaleZ(4)\] at (0.75) should be [scaleZ(7.5)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleZ(2)\] from accumulate [scaleZ(3)\] to accumulate [scaleZ(4)\] at (0.75) should be [scaleZ(4.75)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleY(2)\] from add [scaleY(3)\] to add [scaleY(4)\] at (-0.5) should be [scaleY(5)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleX(2)\] from accumulate [scaleX(3)\] to accumulate [scaleX(4)\] at (0.5) should be [scaleX(4.5)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scale(2, 4)\] from accumulate [scaleZ(3)\] to accumulate [scaleZ(4)\] at (0.25) should be [scale3d(2, 4, 3.25)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleY(2)\] from accumulate [scaleY(3)\] to accumulate [scaleY(4)\] at (1.5) should be [scaleY(5.5)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleX(2)\] from add [scaleX(3)\] to add [scaleX(4)\] at (0) should be [scaleX(6)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleY(2)\] from accumulate [scaleY(3)\] to accumulate [scaleY(4)\] at (0.75) should be [scaleY(4.75)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleY(2)\] from add [scaleY(3)\] to add [scaleY(4)\] at (0) should be [scaleY(6)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleZ(2)\] from add [scaleZ(3)\] to add [scaleZ(4)\] at (1) should be [scaleZ(8)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleZ(2)\] from add [scaleZ(3)\] to add [scaleZ(4)\] at (0) should be [scaleZ(6)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleX(2)\] from add [scaleX(3)\] to add [scaleX(4)\] at (0.75) should be [scaleX(7.5)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleX(2)\] from add [scaleX(3)\] to add [scaleX(4)\] at (-0.5) should be [scaleX(5)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleY(2)\] from add [scaleY(3)\] to add [scaleY(4)\] at (1) should be [scaleY(8)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleY(2)\] from accumulate [scaleY(3)\] to accumulate [scaleY(4)\] at (0.25) should be [scaleY(4.25)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleX(2)\] from accumulate [scaleX(3)\] to accumulate [scaleX(4)\] at (1.5) should be [scaleX(5.5)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleY(2)\] from add [scaleY(3)\] to add [scaleY(4)\] at (1.5) should be [scaleY(9)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleZ(2)\] from accumulate [scaleZ(3)\] to accumulate [scaleZ(4)\] at (0.25) should be [scaleZ(4.25)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleZ(2)\] from add [scaleZ(3)\] to add [scaleZ(4)\] at (0.5) should be [scaleZ(7)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [scaleX(2)\] from add [scaleX(3)\] to add [scaleX(4)\] at (0.5) should be [scaleX(7)\]]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-transforms/animation/transform-skew-composition.html.ini b/tests/wpt/metadata/css/css-transforms/animation/transform-skew-composition.html.ini
new file mode 100644
index 00000000000..34ad53579f8
--- /dev/null
+++ b/tests/wpt/metadata/css/css-transforms/animation/transform-skew-composition.html.ini
@@ -0,0 +1,130 @@
+[transform-skew-composition.html]
+ [Compositing: property <transform> underlying [skew(10deg, 20deg)\] from add [skew(30deg, 10deg)\] to add [skew(50deg, 50deg)\] at (0.25) should be [skew(10deg, 20deg) skew(35deg, 20deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skewY(10deg)\] from add [skewY(30deg)\] to add [skewY(50deg)\] at (0) should be [skewY(10deg) skewY(30deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skewX(10deg)\] from add [skewX(30deg)\] to add [skewX(50deg)\] at (0.5) should be [skewX(10deg) skewX(40deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skew(10deg, 20deg)\] from add [skew(30deg, 10deg)\] to add [skew(50deg, 50deg)\] at (0.75) should be [skew(10deg, 20deg) skew(45deg, 40deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skew(10deg, 20deg)\] from add [skew(30deg, 10deg)\] to add [skew(50deg, 50deg)\] at (-0.5) should be [skew(10deg, 20deg) skew(20deg, -10deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skew(10deg, 45deg)\] from accumulate [skew(20deg, 30deg)\] to accumulate [skew(40deg, 70deg)\] at (1.5) should be [skew(60deg, 135deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skewY(45deg)\] from accumulate [skewY(30deg)\] to accumulate [skewY(70deg)\] at (0) should be [skewY(75deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skewX(10deg)\] from add [skewX(30deg)\] to add [skewX(50deg)\] at (0) should be [skewX(10deg) skewX(30deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skewX(45deg)\] from accumulate [skewX(30deg)\] to accumulate [skewX(70deg)\] at (0.5) should be [skewX(95deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skewY(45deg)\] from accumulate [skewY(30deg)\] to accumulate [skewY(70deg)\] at (-0.5) should be [skewY(55deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skewX(45deg)\] from accumulate [skewX(30deg)\] to accumulate [skewX(70deg)\] at (0) should be [skewX(75deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skewX(45deg)\] from accumulate [skewX(30deg)\] to accumulate [skewX(70deg)\] at (0.75) should be [skewX(105deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skewY(10deg)\] from add [skewY(30deg)\] to add [skewY(50deg)\] at (1.5) should be [skewY(10deg) skewY(60deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skew(10deg, 20deg)\] from add [skew(30deg, 10deg)\] to add [skew(50deg, 50deg)\] at (1) should be [skew(10deg, 20deg) skew(50deg, 50deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skew(10deg, 45deg)\] from accumulate [skew(20deg, 30deg)\] to accumulate [skew(40deg, 70deg)\] at (1) should be [skew(50deg, 115deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skewY(10deg)\] from add [skewY(30deg)\] to add [skewY(50deg)\] at (0.5) should be [skewY(10deg) skewY(40deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skewY(45deg)\] from accumulate [skewY(30deg)\] to accumulate [skewY(70deg)\] at (1) should be [skewY(115deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skewX(45deg)\] from accumulate [skewX(30deg)\] to accumulate [skewX(70deg)\] at (1) should be [skewX(115deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skewY(45deg)\] from accumulate [skewY(30deg)\] to accumulate [skewY(70deg)\] at (1.5) should be [skewY(135deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skewX(10deg)\] from add [skewX(30deg)\] to add [skewX(50deg)\] at (1.5) should be [skewX(10deg) skewX(60deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skew(10deg, 45deg)\] from accumulate [skew(20deg, 30deg)\] to accumulate [skew(40deg, 70deg)\] at (-0.5) should be [skew(20deg, 55deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skew(10deg, 20deg)\] from add [skew(30deg, 10deg)\] to add [skew(50deg, 50deg)\] at (0.5) should be [skew(10deg, 20deg) skew(40deg, 30deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skew(10deg, 20deg)\] from add [skew(30deg, 10deg)\] to add [skew(50deg, 50deg)\] at (1.5) should be [skew(10deg, 20deg) skew(60deg, 70deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skewY(10deg)\] from add [skewY(30deg)\] to add [skewY(50deg)\] at (1) should be [skewY(10deg) skewY(50deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skewX(10deg)\] from add [skewX(30deg)\] to add [skewX(50deg)\] at (-0.5) should be [skewX(10deg) skewX(20deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skewX(10deg)\] from add [skewX(30deg)\] to add [skewX(50deg)\] at (1) should be [skewX(10deg) skewX(50deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skew(10deg, 45deg)\] from accumulate [skew(20deg, 30deg)\] to accumulate [skew(40deg, 70deg)\] at (0.75) should be [skew(45deg, 105deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skew(10deg, 45deg)\] from accumulate [skew(20deg, 30deg)\] to accumulate [skew(40deg, 70deg)\] at (0.25) should be [skew(35deg, 85deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skewY(45deg)\] from accumulate [skewY(30deg)\] to accumulate [skewY(70deg)\] at (0.5) should be [skewY(95deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skewY(45deg)\] from accumulate [skewY(30deg)\] to accumulate [skewY(70deg)\] at (0.75) should be [skewY(105deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skewX(45deg)\] from accumulate [skewX(30deg)\] to accumulate [skewX(70deg)\] at (1.5) should be [skewX(135deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skewX(10deg)\] from add [skewX(30deg)\] to add [skewX(50deg)\] at (0.25) should be [skewX(10deg) skewX(35deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skewX(45deg)\] from accumulate [skewX(30deg)\] to accumulate [skewX(70deg)\] at (-0.5) should be [skewX(55deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skewY(10deg)\] from add [skewY(30deg)\] to add [skewY(50deg)\] at (0.75) should be [skewY(10deg) skewY(45deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skewX(45deg)\] from accumulate [skewY(45deg)\] to accumulate [skewY(45deg)\] at (0.5) should be [matrix(1, 1, 0.5, 1.5, 0, 0)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skewX(45deg)\] from accumulate [skewX(30deg)\] to accumulate [skewX(70deg)\] at (0.25) should be [skewX(85deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skew(10deg, 45deg)\] from accumulate [skew(20deg, 30deg)\] to accumulate [skew(40deg, 70deg)\] at (0) should be [skew(30deg, 75deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skewX(10deg)\] from add [skewX(30deg)\] to add [skewX(50deg)\] at (0.75) should be [skewX(10deg) skewX(45deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skewY(45deg)\] from accumulate [skewY(30deg)\] to accumulate [skewY(70deg)\] at (0.25) should be [skewY(85deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skew(10deg, 45deg)\] from accumulate [skew(20deg, 30deg)\] to accumulate [skew(40deg, 70deg)\] at (0.5) should be [skew(40deg, 95deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skew(10deg, 20deg)\] from add [skew(30deg, 10deg)\] to add [skew(50deg, 50deg)\] at (0) should be [skew(10deg, 20deg) skew(30deg, 10deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skewY(10deg)\] from add [skewY(30deg)\] to add [skewY(50deg)\] at (-0.5) should be [skewY(10deg) skewY(20deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [skewY(10deg)\] from add [skewY(30deg)\] to add [skewY(50deg)\] at (0.25) should be [skewY(10deg) skewY(35deg)\]]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-transforms/animation/transform-translate-composition.html.ini b/tests/wpt/metadata/css/css-transforms/animation/transform-translate-composition.html.ini
new file mode 100644
index 00000000000..9da857698c1
--- /dev/null
+++ b/tests/wpt/metadata/css/css-transforms/animation/transform-translate-composition.html.ini
@@ -0,0 +1,169 @@
+[transform-translate-composition.html]
+ [Compositing: property <transform> underlying [translateX(100px) rotate(90deg)\] from accumulate [translateX(100px)\] to accumulate [translateX(200px)\] at (0.25) should be [translateX(225px) rotate(90deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translate(100px, 50px)\] from accumulate [translateZ(50px)\] to accumulate [translateZ(250px)\] at (-0.5) should be [translate3d(100px, 50px, -50px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translate(100px, 50px)\] from accumulate [translateZ(50px)\] to accumulate [translateZ(250px)\] at (1.5) should be [translate3d(100px, 50px, 350px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translateX(100px) rotate(90deg)\] from accumulate [translateX(100px)\] to accumulate [translateX(200px)\] at (0.5) should be [translateX(250px) rotate(90deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translateX(100px)\] from accumulate [translateX(50px)\] to accumulate [translateX(250px)\] at (1) should be [translateX(350px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translate(100px, 50px)\] from accumulate [translateZ(50px)\] to accumulate [translateZ(250px)\] at (0.75) should be [translate3d(100px, 50px, 200px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translate(10px, 20px)\] from add [translate(100px, 200px)\] to add [translate(200px, 400px)\] at (0.5) should be [translate(160px, 320px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translateX(100px) rotate(90deg)\] from add [translateX(100px)\] to add [translateX(200px)\] at (0.25) should be [translateX(100px) rotate(90deg) translateX(125px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translate(100px, 50px)\] from accumulate [translateZ(50px)\] to accumulate [translateZ(250px)\] at (0.5) should be [translate3d(100px, 50px, 150px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translateZ(100px)\] from accumulate [translateZ(50px)\] to accumulate [translateZ(250px)\] at (1.5) should be [translateZ(450px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translateX(100px)\] from accumulate [translateX(50px)\] to accumulate [translateX(250px)\] at (0.25) should be [translateX(200px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translate(10px, 20px)\] from add [translate(100px, 200px)\] to replace [translate(210px, 420px)\] at (1) should be [translate(210px, 420px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translate(10px, 20px)\] from add [translate(100px, 200px)\] to replace [translate(210px, 420px)\] at (-0.5) should be [translate(60px, 120px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translateX(100px)\] from accumulate [translateX(50px)\] to accumulate [translateX(250px)\] at (0.75) should be [translateX(300px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translateZ(100px)\] from accumulate [translateZ(50px)\] to accumulate [translateZ(250px)\] at (0.5) should be [translateZ(250px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translateX(100px) rotate(90deg)\] from accumulate [translateX(100px)\] to accumulate [translateX(200px)\] at (-0.5) should be [translateX(150px) rotate(90deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translate(10px, 20px)\] from add [translate(100px, 200px)\] to add [translate(200px, 400px)\] at (0) should be [translate(110px, 220px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translate(10px, 20px)\] from add [translate(100px, 200px)\] to replace [translate(210px, 420px)\] at (0) should be [translate(110px, 220px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translate(10px, 20px)\] from add [translate(100px, 200px)\] to replace [translate(210px, 420px)\] at (0.25) should be [translate(135px, 270px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translateY(100px)\] from accumulate [translateY(50px)\] to accumulate [translateY(250px)\] at (0.75) should be [translateY(300px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translateX(100px) rotate(90deg)\] from add [translateX(100px)\] to add [translateX(200px)\] at (-0.5) should be [translateX(100px) rotate(90deg) translateX(50px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translateX(100px) rotate(90deg)\] from accumulate [translateX(100px)\] to accumulate [translateX(200px)\] at (1) should be [translateX(300px) rotate(90deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translate(10px, 20px)\] from add [translate(100px, 200px)\] to add [translate(200px, 400px)\] at (-0.5) should be [translate(60px, 120px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translateY(100px)\] from accumulate [translateY(50px)\] to accumulate [translateY(250px)\] at (0.5) should be [translateY(250px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translateX(100px) rotate(90deg)\] from accumulate [translateX(100px)\] to accumulate [translateX(200px)\] at (1.5) should be [translateX(350px) rotate(90deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translateX(100px) rotate(90deg)\] from accumulate [translateX(100px)\] to accumulate [translateX(200px)\] at (0.75) should be [translateX(275px) rotate(90deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translate(10px, 20px)\] from add [translate(100px, 200px)\] to add [translate(200px, 400px)\] at (1.5) should be [translate(260px, 520px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translate(100px, 50px)\] from accumulate [translateZ(50px)\] to accumulate [translateZ(250px)\] at (0) should be [translate3d(100px, 50px, 50px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translateX(100px)\] from accumulate [translateX(50px)\] to accumulate [translateX(250px)\] at (0) should be [translateX(150px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translateX(100px) rotate(90deg)\] from add [translateX(100px)\] to add [translateX(200px)\] at (1) should be [translateX(100px) rotate(90deg) translateX(200px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translate(10px, 20px)\] from add [translate(100px, 200px)\] to replace [translate(210px, 420px)\] at (1.5) should be [translate(260px, 520px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translate(10px, 20px)\] from add [translate(100px, 200px)\] to add [translate(200px, 400px)\] at (1) should be [translate(210px, 420px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translateX(100px) rotate(90deg)\] from add [translateX(100px)\] to add [translateX(200px)\] at (0) should be [translateX(100px) rotate(90deg) translateX(100px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translateX(100px) rotate(90deg)\] from add [translateX(100px)\] to add [translateX(200px)\] at (0.75) should be [translateX(100px) rotate(90deg) translateX(175px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translateY(100px)\] from accumulate [translateY(50px)\] to accumulate [translateY(250px)\] at (-0.5) should be [translateY(50px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translateZ(100px)\] from accumulate [translateZ(50px)\] to accumulate [translateZ(250px)\] at (0.75) should be [translateZ(300px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translateX(100px)\] from accumulate [translateX(50px)\] to accumulate [translateX(250px)\] at (1.5) should be [translateX(450px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translateX(100px) rotate(90deg)\] from accumulate [translateX(100px)\] to accumulate [translateX(200px)\] at (0) should be [translateX(200px) rotate(90deg)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translateX(100px) rotate(90deg)\] from add [translateX(100px)\] to add [translateX(200px)\] at (0.5) should be [translateX(100px) rotate(90deg) translateX(150px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translateX(100px)\] from accumulate [translateX(50px)\] to accumulate [translateX(250px)\] at (-0.5) should be [translateX(50px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translateZ(100px)\] from accumulate [translateZ(50px)\] to accumulate [translateZ(250px)\] at (0.25) should be [translateZ(200px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translate(100px, 50px)\] from accumulate [translateZ(50px)\] to accumulate [translateZ(250px)\] at (0.25) should be [translate3d(100px, 50px, 100px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translateZ(100px)\] from accumulate [translateZ(50px)\] to accumulate [translateZ(250px)\] at (-0.5) should be [translateZ(50px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translateX(100px)\] from accumulate [translateX(50px)\] to accumulate [translateX(250px)\] at (0.5) should be [translateX(250px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translateY(100px)\] from accumulate [translateY(50px)\] to accumulate [translateY(250px)\] at (1) should be [translateY(350px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translateZ(100px)\] from accumulate [translateZ(50px)\] to accumulate [translateZ(250px)\] at (1) should be [translateZ(350px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translate(10px, 20px)\] from add [translate(100px, 200px)\] to add [translate(200px, 400px)\] at (0.25) should be [translate(135px, 270px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translate(10px, 20px)\] from add [translate(100px, 200px)\] to replace [translate(210px, 420px)\] at (0.5) should be [translate(160px, 320px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translateZ(100px)\] from accumulate [translateZ(50px)\] to accumulate [translateZ(250px)\] at (0) should be [translateZ(150px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translateY(100px)\] from accumulate [translateY(50px)\] to accumulate [translateY(250px)\] at (0) should be [translateY(150px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translateY(100px)\] from accumulate [translateY(50px)\] to accumulate [translateY(250px)\] at (1.5) should be [translateY(450px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translateX(100px) rotate(90deg)\] from add [translateX(100px)\] to add [translateX(200px)\] at (1.5) should be [translateX(100px) rotate(90deg) translateX(250px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translate(10px, 20px)\] from add [translate(100px, 200px)\] to add [translate(200px, 400px)\] at (0.75) should be [translate(185px, 370px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translateY(100px)\] from accumulate [translateY(50px)\] to accumulate [translateY(250px)\] at (0.25) should be [translateY(200px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translate(100px, 50px)\] from accumulate [translateZ(50px)\] to accumulate [translateZ(250px)\] at (1) should be [translate3d(100px, 50px, 250px)\]]
+ expected: FAIL
+
+ [Compositing: property <transform> underlying [translate(10px, 20px)\] from add [translate(100px, 200px)\] to replace [translate(210px, 420px)\] at (0.75) should be [translate(185px, 370px)\]]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-transforms/animation/translate-composition.html.ini b/tests/wpt/metadata/css/css-transforms/animation/translate-composition.html.ini
new file mode 100644
index 00000000000..4730739598f
--- /dev/null
+++ b/tests/wpt/metadata/css/css-transforms/animation/translate-composition.html.ini
@@ -0,0 +1,154 @@
+[translate-composition.html]
+ [Compositing: property <translate> underlying [100px 200px 300px\] from replace [50% 100px\] to add [200px 50% 100px\] at (0.75) should be [calc(225px + 12.5%) calc(175px + 37.5%) 300px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [80px 20px\] from add [0px 40px 60px\] to replace [none\] at (1) should be [none\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [100px 200px 300px\] from add [-50px 50%\] to add [100%\] at (0) should be [calc(50px + 0%) calc(200px + 50%) 300px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [none\] from replace [0px 40px 60px\] to add [none\] at (0) should be [0px 40px 60px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [80px 20px\] from add [0px 40px 60px\] to replace [none\] at (0) should be [80px 60px 60px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [80px 20px\] from add [0px 40px 60px\] to replace [none\] at (0.75) should be [20px 15px 15px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [none\] from replace [0px 40px 60px\] to replace [none\] at (2) should be [0px -40px -60px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [80px 20px\] from add [0px 40px 60px\] to replace [none\] at (0.25) should be [60px 45px 45px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [80px 20px\] from add [none\] to replace [0px 40px 60px\] at (2) should be [-80px 60px 120px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [none\] from replace [0px 40px 60px\] to replace [none\] at (0.75) should be [0px 10px 15px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [none\] from replace [0px 40px 60px\] to add [none\] at (-1) should be [0px 80px 120px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [none\] from add [none\] to add [100px\] at (0.75) should be [75px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [80px 20px\] from add [0px 40px 60px\] to replace [none\] at (-1) should be [160px 120px 120px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [none\] from replace [none\] to add [100px\] at (1) should be [100px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [none\] from replace [none\] to add [100px\] at (0.75) should be [75px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [100px 200px 300px\] from replace [50% 100px\] to add [200px 50% 100px\] at (0) should be [50% calc(100px + 0%)\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [none\] from replace [0px 40px 60px\] to add [none\] at (2) should be [0px -40px -60px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [100px 200px 300px\] from add [-50px 50%\] to add [100%\] at (0.25) should be [calc(62.5px + 25%) calc(200px + 37.5%) 300px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [100px 200px 300px\] from replace [50% 100px\] to add [200px 50% 100px\] at (0.25) should be [calc(75px + 37.5%) calc(125px + 12.5%) 100px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [none\] from replace [0px 40px 60px\] to replace [none\] at (-1) should be [0px 80px 120px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [100px 200px 300px\] from add [50% 100px\] to replace [200px 50% 100px\] at (0.25) should be [calc(125px + 37.5%) calc(225px + 12.5%) 250px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [none\] from replace [0px 40px 60px\] to replace [none\] at (0) should be [0px 40px 60px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [80px 20px\] from add [0px 40px 60px\] to replace [none\] at (0.5) should be [40px 30px 30px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [none\] from replace [0px 40px 60px\] to add [none\] at (0.25) should be [0px 30px 45px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [100px 200px 300px\] from add [-50px 50%\] to add [100%\] at (2) should be [calc(150px + 200%) calc(200px - 50%) 300px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [100px 200px 300px\] from add [50% 100px\] to replace [200px 50% 100px\] at (1) should be [calc(200px + 0%) 50% 100px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [80px 20px\] from add [none\] to replace [0px 40px 60px\] at (-1) should be [160px 0px -60px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [none\] from add [none\] to add [100px\] at (0.25) should be [25px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [none\] from add [none\] to add [100px\] at (-1) should be [-100px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [none\] from replace [0px 40px 60px\] to add [none\] at (0.75) should be [0px 10px 15px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [none\] from replace [none\] to add [100px\] at (0.25) should be [25px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [80px 20px\] from add [none\] to replace [0px 40px 60px\] at (0.25) should be [60px 25px 15px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [80px 20px\] from add [none\] to replace [0px 40px 60px\] at (0.5) should be [40px 30px 30px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [100px 200px 300px\] from replace [50% 100px\] to add [200px 50% 100px\] at (2) should be [calc(600px - 50%) calc(300px + 100%) 800px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [100px 200px 300px\] from add [-50px 50%\] to add [100%\] at (0.75) should be [calc(87.5px + 75%) calc(200px + 12.5%) 300px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [80px 20px\] from add [0px 40px 60px\] to replace [none\] at (2) should be [-80px -60px -60px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [100px 200px 300px\] from add [50% 100px\] to replace [200px 50% 100px\] at (0.75) should be [calc(175px + 12.5%) calc(75px + 37.5%) 150px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [100px 200px 300px\] from add [50% 100px\] to replace [200px 50% 100px\] at (2) should be [calc(300px - 50%) calc(-300px + 100%) -100px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [80px 20px\] from add [none\] to replace [0px 40px 60px\] at (0.75) should be [20px 35px 45px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [100px 200px 300px\] from replace [50% 100px\] to add [200px 50% 100px\] at (1) should be [calc(300px + 0%) calc(200px + 50%) 400px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [none\] from add [none\] to add [100px\] at (1) should be [100px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [none\] from replace [0px 40px 60px\] to replace [none\] at (0.25) should be [0px 30px 45px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [100px 200px 300px\] from add [-50px 50%\] to add [100%\] at (-1) should be [-100% calc(200px + 100%) 300px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [80px 20px\] from add [none\] to replace [0px 40px 60px\] at (1) should be [0px 40px 60px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [100px 200px 300px\] from replace [50% 100px\] to add [200px 50% 100px\] at (-1) should be [calc(-300px + 100%) -50% -400px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [none\] from add [none\] to add [100px\] at (2) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [none\] from replace [none\] to add [100px\] at (-1) should be [-100px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [100px 200px 300px\] from add [-50px 50%\] to add [100%\] at (1) should be [calc(100px + 100%) calc(200px + 0%) 300px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [100px 200px 300px\] from add [50% 100px\] to replace [200px 50% 100px\] at (0) should be [calc(100px + 50%) calc(300px + 0%) 300px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [100px 200px 300px\] from add [50% 100px\] to replace [200px 50% 100px\] at (-1) should be [100% calc(600px - 50%) 500px\]]
+ expected: FAIL
+
+ [Compositing: property <translate> underlying [none\] from replace [none\] to add [100px\] at (2) should be [200px\]]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-transitions/animations/vertical-align-composition.html.ini b/tests/wpt/metadata/css/css-transitions/animations/vertical-align-composition.html.ini
new file mode 100644
index 00000000000..39eaed49789
--- /dev/null
+++ b/tests/wpt/metadata/css/css-transitions/animations/vertical-align-composition.html.ini
@@ -0,0 +1,61 @@
+[vertical-align-composition.html]
+ [Compositing: property <vertical-align> underlying [10%\] from add [100px\] to add [20%\] at (0) should be [calc(100px + 10%)\]]
+ expected: FAIL
+
+ [Compositing: property <vertical-align> underlying [50px\] from add [100px\] to add [200px\] at (-0.3) should be [120px\]]
+ expected: FAIL
+
+ [Compositing: property <vertical-align> underlying [100px\] from add [10px\] to add [2px\] at (0.5) should be [106px\]]
+ expected: FAIL
+
+ [Compositing: property <vertical-align> underlying [50px\] from add [100px\] to replace [200px\] at (1) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <vertical-align> underlying [50px\] from add [100px\] to replace [200px\] at (0) should be [150px\]]
+ expected: FAIL
+
+ [Compositing: property <vertical-align> underlying [100px\] from add [10px\] to add [2px\] at (1) should be [102px\]]
+ expected: FAIL
+
+ [Compositing: property <vertical-align> underlying [50px\] from add [100px\] to add [200px\] at (0.5) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <vertical-align> underlying [50px\] from add [100px\] to replace [200px\] at (0.5) should be [175px\]]
+ expected: FAIL
+
+ [Compositing: property <vertical-align> underlying [10%\] from add [100px\] to add [20%\] at (-0.3) should be [calc(130px + 4%)\]]
+ expected: FAIL
+
+ [Compositing: property <vertical-align> underlying [50px\] from add [100px\] to replace [200px\] at (1.5) should be [225px\]]
+ expected: FAIL
+
+ [Compositing: property <vertical-align> underlying [50px\] from add [100px\] to replace [200px\] at (-0.3) should be [135px\]]
+ expected: FAIL
+
+ [Compositing: property <vertical-align> underlying [50px\] from add [100px\] to add [200px\] at (1) should be [250px\]]
+ expected: FAIL
+
+ [Compositing: property <vertical-align> underlying [50px\] from add [100px\] to add [200px\] at (1.5) should be [300px\]]
+ expected: FAIL
+
+ [Compositing: property <vertical-align> underlying [100px\] from add [10px\] to add [2px\] at (1.5) should be [98px\]]
+ expected: FAIL
+
+ [Compositing: property <vertical-align> underlying [100px\] from add [10px\] to add [2px\] at (-0.5) should be [114px\]]
+ expected: FAIL
+
+ [Compositing: property <vertical-align> underlying [100px\] from add [10px\] to add [2px\] at (0) should be [110px\]]
+ expected: FAIL
+
+ [Compositing: property <vertical-align> underlying [10%\] from add [100px\] to add [20%\] at (0.5) should be [calc(50px + 20%)\]]
+ expected: FAIL
+
+ [Compositing: property <vertical-align> underlying [10%\] from add [100px\] to add [20%\] at (1) should be [30%\]]
+ expected: FAIL
+
+ [Compositing: property <vertical-align> underlying [50px\] from add [100px\] to add [200px\] at (0) should be [150px\]]
+ expected: FAIL
+
+ [Compositing: property <vertical-align> underlying [10%\] from add [100px\] to add [20%\] at (1.5) should be [calc(-50px + 40%)\]]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/content-type/response.window.js.ini b/tests/wpt/metadata/fetch/content-type/response.window.js.ini
index f548ee23521..8c8f83c357c 100644
--- a/tests/wpt/metadata/fetch/content-type/response.window.js.ini
+++ b/tests/wpt/metadata/fetch/content-type/response.window.js.ini
@@ -309,30 +309,18 @@
[<iframe>: separate response Content-Type: */* text/html]
expected: FAIL
- [<iframe>: separate response Content-Type: text/html */*;charset=gbk]
- expected: FAIL
-
- [<iframe>: combined response Content-Type: text/html;charset=gbk text/plain text/html]
- expected: FAIL
-
[fetch(): separate response Content-Type: text/plain ]
expected: NOTRUN
- [<iframe>: separate response Content-Type: text/html */*]
- expected: FAIL
-
- [<iframe>: separate response Content-Type: text/html;" \\" text/plain]
- expected: FAIL
-
[<iframe>: separate response Content-Type: text/html;" text/plain]
expected: FAIL
- [<iframe>: separate response Content-Type: text/plain */*]
+ [<iframe>: combined response Content-Type: text/html;" \\" text/plain]
expected: FAIL
- [<iframe>: separate response Content-Type: text/html;x=" text/plain]
+ [<iframe>: combined response Content-Type: text/html */*;charset=gbk]
expected: FAIL
- [<iframe>: combined response Content-Type: text/html;" \\" text/plain]
+ [<iframe>: combined response Content-Type: text/html;x=" text/plain]
expected: FAIL
diff --git a/tests/wpt/metadata/fetch/metadata/appcache.tentative.https.sub.html.ini b/tests/wpt/metadata/fetch/metadata/appcache.tentative.https.sub.html.ini
deleted file mode 100644
index 6fb669844e1..00000000000
--- a/tests/wpt/metadata/fetch/metadata/appcache.tentative.https.sub.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[appcache.tentative.https.sub.html]
- [Appcache!]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/fetch/security/embedded-credentials.tentative.sub.html.ini b/tests/wpt/metadata/fetch/security/embedded-credentials.tentative.sub.html.ini
index d3de645928d..26e02f24468 100644
--- a/tests/wpt/metadata/fetch/security/embedded-credentials.tentative.sub.html.ini
+++ b/tests/wpt/metadata/fetch/security/embedded-credentials.tentative.sub.html.ini
@@ -5,7 +5,7 @@
expected: FAIL
[Embedded credentials are treated as network errors in frames.]
- expected: FAIL
+ expected: TIMEOUT
[Embedded credentials are treated as network errors in new windows.]
expected: FAIL
diff --git a/tests/wpt/metadata/html/cross-origin-opener-policy/popup-none.https.html.ini b/tests/wpt/metadata/html/cross-origin-opener-policy/popup-none.https.html.ini
deleted file mode 100644
index 1df11b41340..00000000000
--- a/tests/wpt/metadata/html/cross-origin-opener-policy/popup-none.https.html.ini
+++ /dev/null
@@ -1,55 +0,0 @@
-[popup-none.https.html]
- [none document opening popup to https://web-platform.test:8443 with COOP: ""]
- expected: FAIL
-
- [none document opening popup to https://web-platform.test:8443 with COOP: "jibberish"]
- expected: FAIL
-
- [none document opening popup to https://www1.web-platform.test:8443 with COOP: ""]
- expected: FAIL
-
- [none document opening popup to https://www1.web-platform.test:8443 with COOP: "same-origin unsafe-allow-outgoing"]
- expected: FAIL
-
- [none document opening popup to https://www1.web-platform.test:8443 with COOP: "jibberish"]
- expected: FAIL
-
- [none document opening popup to https://web-platform.test:8443 with COOP: "same-origin unsafe-allow-outgoing"]
- expected: FAIL
-
- [none document opening popup to https://web-platform.test:8443 with COOP: "same-site unsafe-allow-outgoing"]
- expected: FAIL
-
- [none document opening popup to https://www1.web-platform.test:8443 with COOP: "same-origin"]
- expected: FAIL
-
- [none document opening popup to https://not-web-platform.test:8443 with COOP: "same-origin"]
- expected: FAIL
-
- [none document opening popup to https://web-platform.test:8443 with COOP: "same-site"]
- expected: FAIL
-
- [none document opening popup to https://web-platform.test:8443 with COOP: "same-origin"]
- expected: FAIL
-
- [none document opening popup to https://www1.web-platform.test:8443 with COOP: "same-site unsafe-allow-outgoing"]
- expected: FAIL
-
- [none document opening popup to https://not-web-platform.test:8443 with COOP: ""]
- expected: FAIL
-
- [none document opening popup to https://www1.web-platform.test:8443 with COOP: "same-site"]
- expected: FAIL
-
- [none document opening popup to https://not-web-platform.test:8443 with COOP: "same-origin unsafe-allow-outgoing"]
- expected: FAIL
-
- [none document opening popup to https://not-web-platform.test:8443 with COOP: "same-site"]
- expected: FAIL
-
- [none document opening popup to https://not-web-platform.test:8443 with COOP: "same-site unsafe-allow-outgoing"]
- expected: FAIL
-
- [none document opening popup to https://not-web-platform.test:8443 with COOP: "jibberish"]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/cross-origin-opener-policy/popup-same-origin-unsafe-allow-outgoing.https.html.ini b/tests/wpt/metadata/html/cross-origin-opener-policy/popup-same-origin-unsafe-allow-outgoing.https.html.ini
deleted file mode 100644
index 5282e919e11..00000000000
--- a/tests/wpt/metadata/html/cross-origin-opener-policy/popup-same-origin-unsafe-allow-outgoing.https.html.ini
+++ /dev/null
@@ -1,55 +0,0 @@
-[popup-same-origin-unsafe-allow-outgoing.https.html]
- [same-origin_unsafe-allow-outgoing document opening popup to https://not-web-platform.test:8443 with COOP: "same-origin unsafe-allow-outgoing"]
- expected: FAIL
-
- [same-origin_unsafe-allow-outgoing document opening popup to https://www1.web-platform.test:8443 with COOP: "same-site unsafe-allow-outgoing"]
- expected: FAIL
-
- [same-origin_unsafe-allow-outgoing document opening popup to https://web-platform.test:8443 with COOP: ""]
- expected: FAIL
-
- [same-origin_unsafe-allow-outgoing document opening popup to https://not-web-platform.test:8443 with COOP: ""]
- expected: FAIL
-
- [same-origin_unsafe-allow-outgoing document opening popup to https://www1.web-platform.test:8443 with COOP: "same-origin"]
- expected: FAIL
-
- [same-origin_unsafe-allow-outgoing document opening popup to https://www1.web-platform.test:8443 with COOP: "same-origin unsafe-allow-outgoing"]
- expected: FAIL
-
- [same-origin_unsafe-allow-outgoing document opening popup to https://web-platform.test:8443 with COOP: "same-site"]
- expected: FAIL
-
- [same-origin_unsafe-allow-outgoing document opening popup to https://www1.web-platform.test:8443 with COOP: "same-site"]
- expected: FAIL
-
- [same-origin_unsafe-allow-outgoing document opening popup to https://web-platform.test:8443 with COOP: "same-origin unsafe-allow-outgoing"]
- expected: FAIL
-
- [same-origin_unsafe-allow-outgoing document opening popup to https://web-platform.test:8443 with COOP: "same-site unsafe-allow-outgoing"]
- expected: FAIL
-
- [same-origin_unsafe-allow-outgoing document opening popup to https://web-platform.test:8443 with COOP: "jibberish"]
- expected: FAIL
-
- [same-origin_unsafe-allow-outgoing document opening popup to https://not-web-platform.test:8443 with COOP: "same-origin"]
- expected: FAIL
-
- [same-origin_unsafe-allow-outgoing document opening popup to https://not-web-platform.test:8443 with COOP: "same-site"]
- expected: FAIL
-
- [same-origin_unsafe-allow-outgoing document opening popup to https://www1.web-platform.test:8443 with COOP: ""]
- expected: FAIL
-
- [same-origin_unsafe-allow-outgoing document opening popup to https://not-web-platform.test:8443 with COOP: "same-site unsafe-allow-outgoing"]
- expected: FAIL
-
- [same-origin_unsafe-allow-outgoing document opening popup to https://web-platform.test:8443 with COOP: "same-origin"]
- expected: FAIL
-
- [same-origin_unsafe-allow-outgoing document opening popup to https://www1.web-platform.test:8443 with COOP: "jibberish"]
- expected: FAIL
-
- [same-origin_unsafe-allow-outgoing document opening popup to https://not-web-platform.test:8443 with COOP: "jibberish"]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/cross-origin-opener-policy/popup-same-origin.https.html.ini b/tests/wpt/metadata/html/cross-origin-opener-policy/popup-same-origin.https.html.ini
deleted file mode 100644
index 22920edfe2c..00000000000
--- a/tests/wpt/metadata/html/cross-origin-opener-policy/popup-same-origin.https.html.ini
+++ /dev/null
@@ -1,55 +0,0 @@
-[popup-same-origin.https.html]
- [same-origin document opening popup to https://not-web-platform.test:8443 with COOP: ""]
- expected: FAIL
-
- [same-origin document opening popup to https://web-platform.test:8443 with COOP: "same-site"]
- expected: FAIL
-
- [same-origin document opening popup to https://www1.web-platform.test:8443 with COOP: "same-site unsafe-allow-outgoing"]
- expected: FAIL
-
- [same-origin document opening popup to https://web-platform.test:8443 with COOP: ""]
- expected: FAIL
-
- [same-origin document opening popup to https://www1.web-platform.test:8443 with COOP: "same-site"]
- expected: FAIL
-
- [same-origin document opening popup to https://not-web-platform.test:8443 with COOP: "same-site unsafe-allow-outgoing"]
- expected: FAIL
-
- [same-origin document opening popup to https://not-web-platform.test:8443 with COOP: "jibberish"]
- expected: FAIL
-
- [same-origin document opening popup to https://www1.web-platform.test:8443 with COOP: "same-origin"]
- expected: FAIL
-
- [same-origin document opening popup to https://www1.web-platform.test:8443 with COOP: "jibberish"]
- expected: FAIL
-
- [same-origin document opening popup to https://web-platform.test:8443 with COOP: "same-origin unsafe-allow-outgoing"]
- expected: FAIL
-
- [same-origin document opening popup to https://not-web-platform.test:8443 with COOP: "same-origin"]
- expected: FAIL
-
- [same-origin document opening popup to https://web-platform.test:8443 with COOP: "jibberish"]
- expected: FAIL
-
- [same-origin document opening popup to https://not-web-platform.test:8443 with COOP: "same-site"]
- expected: FAIL
-
- [same-origin document opening popup to https://www1.web-platform.test:8443 with COOP: ""]
- expected: FAIL
-
- [same-origin document opening popup to https://web-platform.test:8443 with COOP: "same-site unsafe-allow-outgoing"]
- expected: FAIL
-
- [same-origin document opening popup to https://web-platform.test:8443 with COOP: "same-origin"]
- expected: FAIL
-
- [same-origin document opening popup to https://not-web-platform.test:8443 with COOP: "same-origin unsafe-allow-outgoing"]
- expected: FAIL
-
- [same-origin document opening popup to https://www1.web-platform.test:8443 with COOP: "same-origin unsafe-allow-outgoing"]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/cross-origin-opener-policy/popup-same-site-unsafe-allow-outgoing.https.html.ini b/tests/wpt/metadata/html/cross-origin-opener-policy/popup-same-site-unsafe-allow-outgoing.https.html.ini
deleted file mode 100644
index 09d242037a2..00000000000
--- a/tests/wpt/metadata/html/cross-origin-opener-policy/popup-same-site-unsafe-allow-outgoing.https.html.ini
+++ /dev/null
@@ -1,55 +0,0 @@
-[popup-same-site-unsafe-allow-outgoing.https.html]
- [same-site_unsafe-allow-outgoing document opening popup to https://web-platform.test:8443 with COOP: "jibberish"]
- expected: FAIL
-
- [same-site_unsafe-allow-outgoing document opening popup to https://www1.web-platform.test:8443 with COOP: "same-site"]
- expected: FAIL
-
- [same-site_unsafe-allow-outgoing document opening popup to https://www1.web-platform.test:8443 with COOP: "same-origin unsafe-allow-outgoing"]
- expected: FAIL
-
- [same-site_unsafe-allow-outgoing document opening popup to https://www1.web-platform.test:8443 with COOP: "same-site unsafe-allow-outgoing"]
- expected: FAIL
-
- [same-site_unsafe-allow-outgoing document opening popup to https://not-web-platform.test:8443 with COOP: "same-origin unsafe-allow-outgoing"]
- expected: FAIL
-
- [same-site_unsafe-allow-outgoing document opening popup to https://not-web-platform.test:8443 with COOP: "same-site unsafe-allow-outgoing"]
- expected: FAIL
-
- [same-site_unsafe-allow-outgoing document opening popup to https://web-platform.test:8443 with COOP: "same-origin"]
- expected: FAIL
-
- [same-site_unsafe-allow-outgoing document opening popup to https://not-web-platform.test:8443 with COOP: "same-site"]
- expected: FAIL
-
- [same-site_unsafe-allow-outgoing document opening popup to https://web-platform.test:8443 with COOP: "same-site unsafe-allow-outgoing"]
- expected: FAIL
-
- [same-site_unsafe-allow-outgoing document opening popup to https://not-web-platform.test:8443 with COOP: "same-origin"]
- expected: FAIL
-
- [same-site_unsafe-allow-outgoing document opening popup to https://web-platform.test:8443 with COOP: "same-site"]
- expected: FAIL
-
- [same-site_unsafe-allow-outgoing document opening popup to https://www1.web-platform.test:8443 with COOP: "same-origin"]
- expected: FAIL
-
- [same-site_unsafe-allow-outgoing document opening popup to https://web-platform.test:8443 with COOP: ""]
- expected: FAIL
-
- [same-site_unsafe-allow-outgoing document opening popup to https://www1.web-platform.test:8443 with COOP: ""]
- expected: FAIL
-
- [same-site_unsafe-allow-outgoing document opening popup to https://not-web-platform.test:8443 with COOP: ""]
- expected: FAIL
-
- [same-site_unsafe-allow-outgoing document opening popup to https://web-platform.test:8443 with COOP: "same-origin unsafe-allow-outgoing"]
- expected: FAIL
-
- [same-site_unsafe-allow-outgoing document opening popup to https://not-web-platform.test:8443 with COOP: "jibberish"]
- expected: FAIL
-
- [same-site_unsafe-allow-outgoing document opening popup to https://www1.web-platform.test:8443 with COOP: "jibberish"]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/cross-origin-opener-policy/popup-same-site.https.html.ini b/tests/wpt/metadata/html/cross-origin-opener-policy/popup-same-site.https.html.ini
deleted file mode 100644
index 6d2a5b3bed9..00000000000
--- a/tests/wpt/metadata/html/cross-origin-opener-policy/popup-same-site.https.html.ini
+++ /dev/null
@@ -1,55 +0,0 @@
-[popup-same-site.https.html]
- [same-site document opening popup to https://not-web-platform.test:8443 with COOP: "same-origin unsafe-allow-outgoing"]
- expected: FAIL
-
- [same-site document opening popup to https://www1.web-platform.test:8443 with COOP: "same-site unsafe-allow-outgoing"]
- expected: FAIL
-
- [same-site document opening popup to https://www1.web-platform.test:8443 with COOP: "same-site"]
- expected: FAIL
-
- [same-site document opening popup to https://web-platform.test:8443 with COOP: "same-origin unsafe-allow-outgoing"]
- expected: FAIL
-
- [same-site document opening popup to https://web-platform.test:8443 with COOP: "same-origin"]
- expected: FAIL
-
- [same-site document opening popup to https://not-web-platform.test:8443 with COOP: "jibberish"]
- expected: FAIL
-
- [same-site document opening popup to https://web-platform.test:8443 with COOP: ""]
- expected: FAIL
-
- [same-site document opening popup to https://not-web-platform.test:8443 with COOP: "same-origin"]
- expected: FAIL
-
- [same-site document opening popup to https://www1.web-platform.test:8443 with COOP: ""]
- expected: FAIL
-
- [same-site document opening popup to https://www1.web-platform.test:8443 with COOP: "same-origin unsafe-allow-outgoing"]
- expected: FAIL
-
- [same-site document opening popup to https://not-web-platform.test:8443 with COOP: ""]
- expected: FAIL
-
- [same-site document opening popup to https://web-platform.test:8443 with COOP: "jibberish"]
- expected: FAIL
-
- [same-site document opening popup to https://not-web-platform.test:8443 with COOP: "same-site unsafe-allow-outgoing"]
- expected: FAIL
-
- [same-site document opening popup to https://www1.web-platform.test:8443 with COOP: "jibberish"]
- expected: FAIL
-
- [same-site document opening popup to https://www1.web-platform.test:8443 with COOP: "same-origin"]
- expected: FAIL
-
- [same-site document opening popup to https://not-web-platform.test:8443 with COOP: "same-site"]
- expected: FAIL
-
- [same-site document opening popup to https://web-platform.test:8443 with COOP: "same-site"]
- expected: FAIL
-
- [same-site document opening popup to https://web-platform.test:8443 with COOP: "same-site unsafe-allow-outgoing"]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/dom/idlharness.worker.js.ini b/tests/wpt/metadata/html/dom/idlharness.worker.js.ini
index 1721599b0d3..b3939fc4efd 100644
--- a/tests/wpt/metadata/html/dom/idlharness.worker.js.ini
+++ b/tests/wpt/metadata/html/dom/idlharness.worker.js.ini
@@ -554,6 +554,3 @@
[OffscreenCanvasRenderingContext2D interface: operation clip(CanvasFillRule)]
expected: FAIL
- [MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "source" with the proper type]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/skip-document-with-fragment.html.ini b/tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/skip-document-with-fragment.html.ini
index c12c0f8ae48..6852d7663de 100644
--- a/tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/skip-document-with-fragment.html.ini
+++ b/tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/skip-document-with-fragment.html.ini
@@ -1,4 +1,8 @@
[skip-document-with-fragment.html]
+ expected: TIMEOUT
[Autofocus elements in iframed documents with URL fragments should be skipped.]
expected: FAIL
+ [Autofocus elements in top-level browsing context's documents with URI fragments should be skipped.]
+ expected: TIMEOUT
+
diff --git a/tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini b/tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini
index 6b68e9094e4..8b743f36e1d 100644
--- a/tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini
+++ b/tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini
@@ -1,16 +1,20 @@
[supported-elements.html]
+ expected: TIMEOUT
[Contenteditable element should support autofocus]
expected: FAIL
[Element with tabindex should support autofocus]
- expected: FAIL
+ expected: TIMEOUT
[Host element with delegatesFocus including no focusable descendants should be skipped]
- expected: FAIL
+ expected: NOTRUN
[Area element should support autofocus]
- expected: FAIL
+ expected: NOTRUN
[Host element with delegatesFocus should support autofocus]
- expected: FAIL
+ expected: NOTRUN
+
+ [Non-HTMLElement should not support autofocus]
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-rangeOverflow.html.ini b/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-rangeOverflow.html.ini
index 788fc522460..1acfde0bd68 100644
--- a/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-rangeOverflow.html.ini
+++ b/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-rangeOverflow.html.ini
@@ -228,3 +228,15 @@
[[INPUT in NUMBER status\] The value is greater than max(special floating number)]
expected: FAIL
+ [[INPUT in TIME status\] The time is inside the accepted range for reversed range]
+ expected: FAIL
+
+ [[INPUT in TIME status\] The time is outside the accepted range for reversed range]
+ expected: FAIL
+
+ [[INPUT in TIME status\] The time is min for reversed range]
+ expected: FAIL
+
+ [[INPUT in TIME status\] The time is max for reversed range]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-rangeUnderflow.html.ini b/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-rangeUnderflow.html.ini
index 351a2044700..4ae41ccf81a 100644
--- a/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-rangeUnderflow.html.ini
+++ b/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-rangeUnderflow.html.ini
@@ -222,3 +222,15 @@
[[INPUT in NUMBER status\] The value is less than min(special floating number)]
expected: FAIL
+ [[INPUT in TIME status\] The time is max for reversed range]
+ expected: FAIL
+
+ [[INPUT in TIME status\] The time is outside the accepted range for reversed range]
+ expected: FAIL
+
+ [[INPUT in TIME status\] The time is min for reversed range]
+ expected: FAIL
+
+ [[INPUT in TIME status\] The time is inside the accepted range for reversed range]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-valueMissing.html.ini b/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-valueMissing.html.ini
index f6390136918..d8b1ff6206d 100644
--- a/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-valueMissing.html.ini
+++ b/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-valueMissing.html.ini
@@ -315,3 +315,6 @@
[[select\] Selected the option with value equals to empty]
expected: FAIL
+ [[INPUT in RADIO status\] The checked attribute is false and the name attribute is empty]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/the-input-element/input-valueasdate.html.ini b/tests/wpt/metadata/html/semantics/forms/the-input-element/input-valueasdate.html.ini
new file mode 100644
index 00000000000..fa9a448996c
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/forms/the-input-element/input-valueasdate.html.ini
@@ -0,0 +1,79 @@
+[input-valueasdate.html]
+ [valueAsDate getter on type date (actual value: 2019-00-12, expected valueAsDate: null)]
+ expected: FAIL
+
+ [valueAsDate getter on type date (actual value: 2016-02-29, expected valueAsDate: Mon Feb 29 2016 00:00:00 GMT+0000 (Coordinated Universal Time))]
+ expected: FAIL
+
+ [valueAsDate getter on type date (actual value: , expected valueAsDate: null)]
+ expected: FAIL
+
+ [valueAsDate getter on type week (actual value: 2019-W00, expected valueAsDate: null)]
+ expected: FAIL
+
+ [valueAsDate setter on type date (actual valueAsDate: Tue Dec 10 2019 00:00:00 GMT+0000 (Coordinated Universal Time), expected value: 2019-12-10)]
+ expected: FAIL
+
+ [valueAsDate getter on type month (actual value: 2019-12, expected valueAsDate: Sun Dec 01 2019 00:00:00 GMT+0000 (Coordinated Universal Time))]
+ expected: FAIL
+
+ [valueAsDate getter on type week (actual value: 2019-W50, expected valueAsDate: Mon Dec 09 2019 00:00:00 GMT+0000 (Coordinated Universal Time))]
+ expected: FAIL
+
+ [valueAsDate getter on type week (actual value: 2019-W60, expected valueAsDate: null)]
+ expected: FAIL
+
+ [valueAsDate getter on type date (actual value: 2019-12-10, expected valueAsDate: Tue Dec 10 2019 00:00:00 GMT+0000 (Coordinated Universal Time))]
+ expected: FAIL
+
+ [valueAsDate getter on type date (actual value: 2019-13-10, expected valueAsDate: null)]
+ expected: FAIL
+
+ [valueAsDate getter on type time (actual value: 00:60, expected valueAsDate: null)]
+ expected: FAIL
+
+ [valueAsDate setter on type time (actual valueAsDate: Thu Jan 01 1970 00:00:00 GMT+0000 (Coordinated Universal Time), expected value: 00:00)]
+ expected: FAIL
+
+ [valueAsDate getter on type date (actual value: 2019-12-00, expected valueAsDate: null)]
+ expected: FAIL
+
+ [valueAsDate getter on type month (actual value: 2019-00, expected valueAsDate: null)]
+ expected: FAIL
+
+ [valueAsDate getter on type week (actual value: , expected valueAsDate: null)]
+ expected: FAIL
+
+ [valueAsDate getter on type time (actual value: , expected valueAsDate: null)]
+ expected: FAIL
+
+ [valueAsDate getter on type month (actual value: , expected valueAsDate: null)]
+ expected: FAIL
+
+ [valueAsDate getter on type time (actual value: 12:00, expected valueAsDate: Thu Jan 01 1970 12:00:00 GMT+0000 (Coordinated Universal Time))]
+ expected: FAIL
+
+ [valueAsDate getter on type time (actual value: 23:59, expected valueAsDate: Thu Jan 01 1970 23:59:00 GMT+0000 (Coordinated Universal Time))]
+ expected: FAIL
+
+ [valueAsDate getter on type date (actual value: 2019-02-29, expected valueAsDate: null)]
+ expected: FAIL
+
+ [valueAsDate getter on type month (actual value: 0000-12, expected valueAsDate: null)]
+ expected: FAIL
+
+ [valueAsDate getter on type week (actual value: 0000-W50, expected valueAsDate: null)]
+ expected: FAIL
+
+ [valueAsDate getter on type date (actual value: 0000-12-10, expected valueAsDate: null)]
+ expected: FAIL
+
+ [valueAsDate setter on type time (actual valueAsDate: Thu Jan 01 1970 12:00:00 GMT+0000 (Coordinated Universal Time), expected value: 12:00)]
+ expected: FAIL
+
+ [valueAsDate getter on type time (actual value: 00:00, expected valueAsDate: Thu Jan 01 1970 00:00:00 GMT+0000 (Coordinated Universal Time))]
+ expected: FAIL
+
+ [valueAsDate getter on type time (actual value: 24:00, expected valueAsDate: null)]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/the-input-element/input-valueasnumber.html.ini b/tests/wpt/metadata/html/semantics/forms/the-input-element/input-valueasnumber.html.ini
new file mode 100644
index 00000000000..ea262c41574
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/forms/the-input-element/input-valueasnumber.html.ini
@@ -0,0 +1,136 @@
+[input-valueasnumber.html]
+ [valueAsNumber getter on type month (actual value: 0000-12, expected valueAsNumber: NaN)]
+ expected: FAIL
+
+ [valueAsNumber getter on type datetime-local (actual value: 2019-12-10T12:00, expected valueAsNumber: 1575979200000)]
+ expected: FAIL
+
+ [valueAsNumber getter on type month (actual value: 2019-00, expected valueAsNumber: NaN)]
+ expected: FAIL
+
+ [valueAsNumber getter on type date (actual value: 2016-02-29, expected valueAsNumber: 1456704000000)]
+ expected: FAIL
+
+ [valueAsNumber getter on type time (actual value: , expected valueAsNumber: NaN)]
+ expected: FAIL
+
+ [valueAsNumber setter on type range (actual valueAsNumber: 0, expected value: 0)]
+ expected: FAIL
+
+ [valueAsNumber getter on type range (actual value: 110, expected valueAsNumber: 100)]
+ expected: FAIL
+
+ [valueAsNumber getter on type range (actual value: -10, expected valueAsNumber: 0)]
+ expected: FAIL
+
+ [valueAsNumber setter on type date (actual valueAsNumber: 0, expected value: 1970-01-01)]
+ expected: FAIL
+
+ [valueAsNumber getter on type date (actual value: 2019-00-12, expected valueAsNumber: NaN)]
+ expected: FAIL
+
+ [valueAsNumber getter on type date (actual value: 2019-12-00, expected valueAsNumber: NaN)]
+ expected: FAIL
+
+ [valueAsNumber setter on type date (actual valueAsNumber: 1575936000000, expected value: 2019-12-10)]
+ expected: FAIL
+
+ [valueAsNumber setter on type time (actual valueAsNumber: 43200000, expected value: 12:00)]
+ expected: FAIL
+
+ [valueAsNumber setter on type time (actual valueAsNumber: 0, expected value: 00:00)]
+ expected: FAIL
+
+ [valueAsNumber getter on type time (actual value: 24:00, expected valueAsNumber: NaN)]
+ expected: FAIL
+
+ [valueAsNumber setter on type number (actual valueAsNumber: 123, expected value: 123)]
+ expected: FAIL
+
+ [valueAsNumber getter on type time (actual value: 00:60, expected valueAsNumber: NaN)]
+ expected: FAIL
+
+ [valueAsNumber getter on type week (actual value: 2019-W60, expected valueAsNumber: NaN)]
+ expected: FAIL
+
+ [valueAsNumber getter on type date (actual value: , expected valueAsNumber: NaN)]
+ expected: FAIL
+
+ [valueAsNumber getter on type number (actual value: 123, expected valueAsNumber: 123)]
+ expected: FAIL
+
+ [valueAsNumber setter on type range (actual valueAsNumber: 50, expected value: 50)]
+ expected: FAIL
+
+ [valueAsNumber setter on type week (actual valueAsNumber: 0, expected value: 1970-W01)]
+ expected: FAIL
+
+ [valueAsNumber getter on type week (actual value: , expected valueAsNumber: NaN)]
+ expected: FAIL
+
+ [valueAsNumber getter on type range (actual value: 100, expected valueAsNumber: 100)]
+ expected: FAIL
+
+ [valueAsNumber getter on type datetime-local (actual value: 2019-12-10T00:00, expected valueAsNumber: 1575936000000)]
+ expected: FAIL
+
+ [valueAsNumber getter on type time (actual value: 12:00, expected valueAsNumber: 43200000)]
+ expected: FAIL
+
+ [valueAsNumber getter on type datetime-local (actual value: , expected valueAsNumber: NaN)]
+ expected: FAIL
+
+ [valueAsNumber getter on type number (actual value: , expected valueAsNumber: NaN)]
+ expected: FAIL
+
+ [valueAsNumber getter on type number (actual value: 123.456, expected valueAsNumber: 123.456)]
+ expected: FAIL
+
+ [valueAsNumber getter on type time (actual value: 23:59, expected valueAsNumber: 86340000)]
+ expected: FAIL
+
+ [valueAsNumber getter on type week (actual value: 0000-W50, expected valueAsNumber: NaN)]
+ expected: FAIL
+
+ [valueAsNumber getter on type month (actual value: 2019-12, expected valueAsNumber: 599)]
+ expected: FAIL
+
+ [valueAsNumber getter on type range (actual value: 0, expected valueAsNumber: 0)]
+ expected: FAIL
+
+ [valueAsNumber getter on type range (actual value: 50, expected valueAsNumber: 50)]
+ expected: FAIL
+
+ [valueAsNumber getter on type week (actual value: 2019-W50, expected valueAsNumber: 1575849600000)]
+ expected: FAIL
+
+ [valueAsNumber setter on type datetime-local (actual valueAsNumber: 1575936000000, expected value: 2019-12-10T00:00)]
+ expected: FAIL
+
+ [valueAsNumber getter on type date (actual value: 0000-12-10, expected valueAsNumber: NaN)]
+ expected: FAIL
+
+ [valueAsNumber getter on type date (actual value: 2019-13-10, expected valueAsNumber: NaN)]
+ expected: FAIL
+
+ [valueAsNumber getter on type time (actual value: 00:00, expected valueAsNumber: 0)]
+ expected: FAIL
+
+ [valueAsNumber getter on type range (actual value: , expected valueAsNumber: 50)]
+ expected: FAIL
+
+ [valueAsNumber setter on type range (actual valueAsNumber: 100, expected value: 100)]
+ expected: FAIL
+
+ [valueAsNumber getter on type date (actual value: 2019-02-29, expected valueAsNumber: NaN)]
+ expected: FAIL
+
+ [valueAsNumber getter on type date (actual value: 2019-12-10, expected valueAsNumber: 1575936000000)]
+ expected: FAIL
+
+ [valueAsNumber getter on type week (actual value: 2019-W00, expected valueAsNumber: NaN)]
+ expected: FAIL
+
+ [valueAsNumber getter on type month (actual value: , expected valueAsNumber: NaN)]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/the-input-element/radio.html.ini b/tests/wpt/metadata/html/semantics/forms/the-input-element/radio.html.ini
new file mode 100644
index 00000000000..b681bbeb56c
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/forms/the-input-element/radio.html.ini
@@ -0,0 +1,4 @@
+[radio.html]
+ [Radio buttons in an orphan tree should make a group]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webmessaging/with-ports/018.html.ini b/tests/wpt/metadata/webmessaging/with-ports/018.html.ini
new file mode 100644
index 00000000000..663a1f8fa30
--- /dev/null
+++ b/tests/wpt/metadata/webmessaging/with-ports/018.html.ini
@@ -0,0 +1,5 @@
+[018.html]
+ expected: TIMEOUT
+ [origin of the script that invoked the method, javascript:]
+ expected: TIMEOUT
+
diff --git a/tests/wpt/metadata/webxr/xrSession_input_events_end.https.html.ini b/tests/wpt/metadata/webxr/xrSession_input_events_end.https.html.ini
index 739e7b4c112..1d6cd17924d 100644
--- a/tests/wpt/metadata/webxr/xrSession_input_events_end.https.html.ini
+++ b/tests/wpt/metadata/webxr/xrSession_input_events_end.https.html.ini
@@ -1,4 +1,5 @@
[xrSession_input_events_end.https.html]
+ expected: TIMEOUT
[Calling end during an input callback stops processing at the right time]
- expected: FAIL
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/workers/semantics/multiple-workers/005.html.ini b/tests/wpt/metadata/workers/semantics/multiple-workers/005.html.ini
index f584fce5df1..268949ced5c 100644
--- a/tests/wpt/metadata/workers/semantics/multiple-workers/005.html.ini
+++ b/tests/wpt/metadata/workers/semantics/multiple-workers/005.html.ini
@@ -1,5 +1,4 @@
[005.html]
- expected: ERROR
[dedicated worker in shared worker in dedicated worker]
expected: FAIL
diff --git a/tests/wpt/web-platform-tests/clipboard-apis/async-interfaces.https.html b/tests/wpt/web-platform-tests/clipboard-apis/async-interfaces.https.html
index e19c958f975..1c423e95b66 100644
--- a/tests/wpt/web-platform-tests/clipboard-apis/async-interfaces.https.html
+++ b/tests/wpt/web-platform-tests/clipboard-apis/async-interfaces.https.html
@@ -9,12 +9,13 @@
<script>
'use strict';
-function doTest(idl, dom) {
+function doTest(idl, dom, html) {
const idl_array = new IdlArray();
idl_array.add_untested_idls('interface Navigator {};');
idl_array.add_untested_idls('interface EventTarget {};');
idl_array.add_untested_idls('dictionary PermissionDescriptor {};');
idl_array.add_untested_idls(dom, { only: ['Event', 'EventInit'] });
+ idl_array.add_untested_idls(html, { only: ['DataTransfer', 'DataTransferItemList'] });
idl_array.add_idls(idl);
idl_array.add_objects({
Navigator: ['navigator'],
@@ -33,7 +34,8 @@ promise_test(() => {
[
'/interfaces/clipboard-apis.idl',
'/interfaces/dom.idl',
+ '/interfaces/html.idl',
].map(fetchText))
- .then(([idl, dom]) => doTest(idl, dom));
+ .then(([idl, dom, html]) => doTest(idl, dom, html));
}, 'Test driver');
</script>
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-rdfa/0234-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-rdfa/0234-isvalid.html
index 3dfbdaa03d9..3dfbdaa03d9 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-rdfa/0234-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-rdfa/0234-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-rdfa/0303-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-rdfa/0303-isvalid.html
index 64442095904..64442095904 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-rdfa/0303-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-rdfa/0303-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-rdfalite/0015-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-rdfalite/0015-isvalid.html
index 94742da735d..94742da735d 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-rdfalite/0015-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-rdfalite/0015-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-rdfalite/0030-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-rdfalite/0030-isvalid.html
index 7fd1a85ec7a..7fd1a85ec7a 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-rdfalite/0030-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-rdfalite/0030-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-rdfalite/0071-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-rdfalite/0071-isvalid.html
index 511e0b7107b..511e0b7107b 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-rdfalite/0071-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-rdfalite/0071-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-rdfalite/0074-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-rdfalite/0074-isvalid.html
index d25af2d5323..d25af2d5323 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-rdfalite/0074-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-rdfalite/0074-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/messages.json b/tests/wpt/web-platform-tests/conformance-checkers/messages.json
index 4439888f175..6c0e2c035e9 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/messages.json
+++ b/tests/wpt/web-platform-tests/conformance-checkers/messages.json
@@ -28,22 +28,16 @@
"html-rdfa/0226-novalid.html": "Element \u201cp\u201d not allowed as child of element \u201cspan\u201d in this context. (Suppressing further errors from this subtree.)",
"html-rdfa/0227-novalid.html": "Element \u201cp\u201d not allowed as child of element \u201cspan\u201d in this context. (Suppressing further errors from this subtree.)",
"html-rdfa/0230-novalid.html": "Attribute \u201chref\u201d not allowed on element \u201cimg\u201d at this point.",
- "html-rdfa/0234-novalid.html": "Bad value \u201cdescribedby\u201d for attribute \u201crel\u201d on element \u201ca\u201d: Bad list of link-type keywords: The string \u201cdescribedby\u201d is not a registered keyword.",
"html-rdfa/0237-novalid.html": "Bad value \u201c$malformed http://example.com\u201d for attribute \u201cprefix\u201d on element \u201cbody\u201d.",
"html-rdfa/0258-novalid.html": "Attribute \u201cxmlns:_\u201d not allowed here.",
"html-rdfa/0280-novalid.html": "Bad value \u201cP2011Y06M28DT00H00M00S\u201d for attribute \u201cdatetime\u201d on element \u201ctime\u201d: Bad time-datetime: The literal did not satisfy the time-datetime format.",
"html-rdfa/0285-novalid.html": "Bad value \u201cD-Day\u201d for attribute \u201cdatetime\u201d on element \u201ctime\u201d: Bad time-datetime: The literal did not satisfy the time-datetime format.",
- "html-rdfa/0303-novalid.html": "Bad value \u201chomepage foaf:homepage\u201d for attribute \u201crel\u201d on element \u201ca\u201d: Bad list of link-type keywords: The string \u201chomepage\u201d is not a registered keyword.",
"html-rdfa/0308-novalid.html": "Bad value \u201chttp://www.example.com/roles/somerole\u201d for attribute \u201crole\u201d on element \u201cdiv\u201d.",
"html-rdfa/0309-novalid.html": "Bad value \u201cex:somerole\u201d for attribute \u201crole\u201d on element \u201cdiv\u201d.",
"html-rdfa/0310-novalid.html": "Bad value \u201cex:somerole someOtherRole http://www.example.com/alternate/role\u201d for attribute \u201crole\u201d on element \u201cdiv\u201d.",
"html-rdfa/0314-novalid.html": "Bad value \u201csection\u201d for attribute \u201crole\u201d on element \u201cdiv\u201d.",
"html-rdfa/0319-novalid.html": "Attribute \u201cxmlns:xpr\u201d not allowed here.",
"html-rdfa/0320-novalid.html": "Attribute \u201csrc\u201d not allowed on element \u201ca\u201d at this point.",
- "html-rdfalite/0015-novalid.html": "Bad value \u201cdc:source\u201d for attribute \u201crel\u201d on element \u201clink\u201d: Bad list of link-type keywords: The string \u201cdc:source\u201d is not a registered keyword.",
- "html-rdfalite/0030-novalid.html": "Bad value \u201ccc:license\u201d for attribute \u201crel\u201d on element \u201ca\u201d: Bad list of link-type keywords: The string \u201ccc:license\u201d is not a registered keyword.",
- "html-rdfalite/0071-novalid.html": "Bad value \u201ccc:license\u201d for attribute \u201crel\u201d on element \u201ca\u201d: Bad list of link-type keywords: The string \u201ccc:license\u201d is not a registered keyword.",
- "html-rdfalite/0074-novalid.html": "Bad value \u201cdc:creator\u201d for attribute \u201crel\u201d on element \u201ca\u201d: Bad list of link-type keywords: The string \u201cdc:creator\u201d is not a registered keyword.",
"html-rdfalite/0147.novalid.html": "Attribute \u201cxmlns:xmlzzz\u201d not allowed here.",
"html-rdfalite/0319-novalid.html": "Attribute \u201cxmlns:xpr\u201d not allowed here.",
"html-svg/animate-elem-24-t-novalid.html": "Duplicate ID \u201cMyFont\u201d.",
diff --git a/tests/wpt/web-platform-tests/cookies/http-state/general-tests.html b/tests/wpt/web-platform-tests/cookies/http-state/general-tests.html
index c8b7ea4ecb1..d80527f9b0a 100644
--- a/tests/wpt/web-platform-tests/cookies/http-state/general-tests.html
+++ b/tests/wpt/web-platform-tests/cookies/http-state/general-tests.html
@@ -49,8 +49,7 @@
{file: "0025", name: "Ignore cookies with ';' in all 'Set-Cookie'."},
{file: "0026", name: "Ignore malformed cookies in all 'Set-Cookie' v2."},
{file: "0027", name: "Ignore malformed cookies in all 'Set-Cookie' v3."},
- // TODO(fhorschig): Ask about 0028's expectations ... should be empty?
- {file: "0028", name: "[INVALID EXPECTATION] Ignore malformed cookies in all 'Set-Cookie' v4."},
+ {file: "0028", name: "Ignore malformed cookies in all 'Set-Cookie' v4."},
];
for (const i in TEST_CASES) {
diff --git a/tests/wpt/web-platform-tests/cookies/http-state/resources/cookie-http-state-template.js b/tests/wpt/web-platform-tests/cookies/http-state/resources/cookie-http-state-template.js
index 62459f059fd..b2af226e22e 100644
--- a/tests/wpt/web-platform-tests/cookies/http-state/resources/cookie-http-state-template.js
+++ b/tests/wpt/web-platform-tests/cookies/http-state/resources/cookie-http-state-template.js
@@ -39,7 +39,7 @@ function expireCookie(name, expiry_date, path) {
name = name || "";
expiry_date = expiry_date || "Thu, 01 Jan 1970 00:00:00 UTC";
path = path || getLocalResourcesPath();
- document.cookie = name + "=; expires=" + expiry_date + "; path=" + path + ";";
+ document.cookie = name + "=value; expires=" + expiry_date + "; path=" + path + ";";
}
/* Captures a snapshot of cookies with |parse| and allows to diff it with a
diff --git a/tests/wpt/web-platform-tests/cookies/http-state/resources/test-files/0026-test b/tests/wpt/web-platform-tests/cookies/http-state/resources/test-files/0026-test
index 609c6680b82..5ac72745f97 100644
--- a/tests/wpt/web-platform-tests/cookies/http-state/resources/test-files/0026-test
+++ b/tests/wpt/web-platform-tests/cookies/http-state/resources/test-files/0026-test
@@ -1,2 +1,2 @@
Set-Cookie: foo
-Set-Cookie:
+Set-Cookie:
diff --git a/tests/wpt/web-platform-tests/cookies/http-state/resources/test-files/0028-expected b/tests/wpt/web-platform-tests/cookies/http-state/resources/test-files/0028-expected
index 609c6680b82..e69de29bb2d 100644
--- a/tests/wpt/web-platform-tests/cookies/http-state/resources/test-files/0028-expected
+++ b/tests/wpt/web-platform-tests/cookies/http-state/resources/test-files/0028-expected
@@ -1,2 +0,0 @@
-Set-Cookie: foo
-Set-Cookie:
diff --git a/tests/wpt/web-platform-tests/cookies/http-state/resources/test-files/0028-test b/tests/wpt/web-platform-tests/cookies/http-state/resources/test-files/0028-test
index 609c6680b82..fea1e1a643b 100644
--- a/tests/wpt/web-platform-tests/cookies/http-state/resources/test-files/0028-test
+++ b/tests/wpt/web-platform-tests/cookies/http-state/resources/test-files/0028-test
@@ -1,2 +1,2 @@
Set-Cookie: foo
-Set-Cookie:
+Set-Cookie:
diff --git a/tests/wpt/web-platform-tests/css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background-ref.html b/tests/wpt/web-platform-tests/css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background-ref.html
new file mode 100644
index 00000000000..8cc4618ede4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background-ref.html
@@ -0,0 +1,3 @@
+<!doctype html>
+<title>CSS Test Reference</title>
+<iframe width="600" height="400" src="support/dark-frame-ref.html"></iframe>
diff --git a/tests/wpt/web-platform-tests/css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background.html b/tests/wpt/web-platform-tests/css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background.html
new file mode 100644
index 00000000000..ee0f006b5b2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background.html
@@ -0,0 +1,6 @@
+<!doctype html>
+<title>CSS Color Adjustment Test: Frames with a dark color-scheme should still be transparent</title>
+<link rel="help" href="https://drafts.csswg.org/css-color-adjust/#color-scheme-processing">
+<link rel="match" href="color-scheme-iframe-background-ref.html">
+<link rel="stylesheet" href="support/assert-preferred-dark.css">
+<iframe width="600" height="400" src="support/dark-frame.html"></iframe>
diff --git a/tests/wpt/web-platform-tests/css/css-color-adjust/rendering/dark-color-scheme/color-scheme-root-background.html b/tests/wpt/web-platform-tests/css/css-color-adjust/rendering/dark-color-scheme/color-scheme-root-background.html
new file mode 100644
index 00000000000..a6363971819
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-color-adjust/rendering/dark-color-scheme/color-scheme-root-background.html
@@ -0,0 +1,15 @@
+<!doctype html>
+<title>CSS Color Adjustment Test: color-scheme does not affect :root background</title>
+<link rel="help" href="https://drafts.csswg.org/css-color-adjust/#color-scheme-processing">
+<link rel="stylesheet" href="support/assert-preferred-dark.css">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ :root { color-scheme: dark }
+</style>
+<body></body>
+<script>
+ test(() => {
+ assert_equals(getComputedStyle(document.documentElement).backgroundColor, "rgba(0, 0, 0, 0)");
+ }, "Root element background should be transparent for dark color-scheme.");
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-color-adjust/rendering/dark-color-scheme/support/assert-preferred-dark.css b/tests/wpt/web-platform-tests/css/css-color-adjust/rendering/dark-color-scheme/support/assert-preferred-dark.css
new file mode 100644
index 00000000000..73671b8a819
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-color-adjust/rendering/dark-color-scheme/support/assert-preferred-dark.css
@@ -0,0 +1,9 @@
+@media not all and (prefers-color-scheme: dark) {
+ :root {
+ background-color: red !important;
+ }
+ body::before {
+ font-size: 64px;
+ content: "Test must be run with preferred dark color scheme.";
+ }
+}
diff --git a/tests/wpt/web-platform-tests/css/css-color-adjust/rendering/dark-color-scheme/support/dark-frame-ref.html b/tests/wpt/web-platform-tests/css/css-color-adjust/rendering/dark-color-scheme/support/dark-frame-ref.html
new file mode 100644
index 00000000000..0975119f56e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-color-adjust/rendering/dark-color-scheme/support/dark-frame-ref.html
@@ -0,0 +1,5 @@
+<!doctype html>
+<style>
+ p { color: green }
+</style>
+<p>This text should be green and the background should be the same as the top document.</p>
diff --git a/tests/wpt/web-platform-tests/css/css-color-adjust/rendering/dark-color-scheme/support/dark-frame.html b/tests/wpt/web-platform-tests/css/css-color-adjust/rendering/dark-color-scheme/support/dark-frame.html
new file mode 100644
index 00000000000..11f88db4a0b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-color-adjust/rendering/dark-color-scheme/support/dark-frame.html
@@ -0,0 +1,6 @@
+<!doctype html>
+<style>
+ :root { color-scheme: dark }
+ p { color: green }
+</style>
+<p>This text should be green and the background should be the same as the top document.</p>
diff --git a/tests/wpt/web-platform-tests/css/css-color/animation/color-composition.html b/tests/wpt/web-platform-tests/css/css-color/animation/color-composition.html
new file mode 100644
index 00000000000..c3e481830b6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-color/animation/color-composition.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>color composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-color/#the-color-property">
+<meta name="assert" content="color supports animation by computed value type">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<style>
+.target {
+ width: 40px;
+ height: 40px;
+ background-color: black;
+}
+.expected {
+ background-color: green;
+}
+</style>
+
+<body>
+<script>
+test_composition({
+ property: 'color',
+ underlying: 'rgb(50, 50, 50)',
+ addFrom: 'rgb(10, 10, 10)',
+ replaceTo: 'rgb(30, 30, 30)',
+}, [
+ {at: 0, expect: 'rgb(60, 60, 60)'},
+ {at: 0.2, expect: 'rgb(54, 54, 54)'},
+ {at: 1, expect: 'rgb(30, 30, 30)'},
+ {at: 1.2, expect: 'rgb(24, 24, 24)'},
+ {at: 1.5, expect: 'rgb(15, 15, 15)'},
+]);
+
+test_composition({
+ property: 'color',
+ underlying: 'rgb(60, 60, 60)',
+ addFrom: 'rgb(0, 0, 0)',
+ replaceTo: 'rgb(50, 50, 50)',
+}, [
+ {at: 0, expect: 'rgb(60, 60, 60)'},
+ {at: 0.5, expect: 'rgb(55, 55, 55)'},
+ {at: 1, expect: 'rgb(50, 50, 50)'},
+ {at: 1.2, expect: 'rgb(48, 48, 48)'},
+ {at: 1.5, expect: 'rgb(45, 45, 45)'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/animation/flex-basis-composition.html b/tests/wpt/web-platform-tests/css/css-flexbox/animation/flex-basis-composition.html
new file mode 100644
index 00000000000..122761e4767
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-flexbox/animation/flex-basis-composition.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>flex-basis composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-flexbox-1/#flex-basis-property">
+<meta name="assert" content="flex-basis supports animation by computed value type">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'flex-basis',
+ underlying: '50px',
+ addFrom: '100px',
+ addTo: '200px',
+}, [
+ {at: -0.3, expect: '120px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '200px'},
+ {at: 1, expect: '250px'},
+ {at: 1.5, expect: '300px'},
+]);
+
+test_composition({
+ property: 'flex-basis',
+ underlying: '100px',
+ addFrom: '10px',
+ addTo: '2px',
+}, [
+ {at: -0.5, expect: '114px'},
+ {at: 0, expect: '110px'},
+ {at: 0.5, expect: '106px'},
+ {at: 1, expect: '102px'},
+ {at: 1.5, expect: '98px'}, // Value clamping should happen after composition.
+]);
+
+test_composition({
+ property: 'flex-basis',
+ underlying: '10%',
+ addFrom: '100px',
+ addTo: '20%',
+}, [
+ {at: -0.3, expect: 'calc(130px + 4%)'},
+ {at: 0, expect: 'calc(100px + 10%)'},
+ {at: 0.5, expect: 'calc(50px + 20%)'},
+ {at: 1, expect: '30%'},
+ {at: 1.5, expect: 'calc(-50px + 40%)'},
+]);
+
+test_composition({
+ property: 'flex-basis',
+ underlying: '50px',
+ addFrom: '100px',
+ replaceTo: '200px',
+}, [
+ {at: -0.3, expect: '135px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.5, expect: '225px'},
+]);
+
+test_composition({
+ property: 'flex-basis',
+ underlying: '100px',
+ addFrom: '100px',
+ addTo: 'auto',
+}, [
+ {at: -0.3, expect: '200px'},
+ {at: 0, expect: '200px'},
+ {at: 0.5, expect: 'auto'},
+ {at: 1, expect: 'auto'},
+ {at: 1.5, expect: 'auto'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-align-content-distribution-vertical-lr.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-align-content-distribution-vertical-lr.html
deleted file mode 100644
index 8217f4dd2c3..00000000000
--- a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-align-content-distribution-vertical-lr.html
+++ /dev/null
@@ -1,358 +0,0 @@
-<meta charset="utf-8">
-<title>CSS Grid Layout Test: aligned content distribution for vertical lr</title>
-<link rel="author" title="Rossana Monteriso" href="mailto:rmonteriso@igalia.com">
-<link rel="help" href="https://drafts.csswg.org/css-align-3/#distribution-values">
-<meta name="assert" content="This test checks that the align-content property is applied correctly when using content-distribution values for the vertical-lr writing mode.">
-<meta name="flags" content="ahem">
-<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
-<link rel="stylesheet" href="/css/support/grid.css">
-
-<style>
-
-.grid {
- grid-auto-columns: 20px;
- grid-auto-rows: 40px;
- position: relative;
- width: 400px;
- height: 300px;
-}
-
-.stretchedGrid {
- grid-auto-rows: auto;
-}
-
-.thirdRowFirstColumn {
- background-color: green;
- grid-column: 1;
- grid-row: 3;
-}
-
-.fourthRowFirstColumn {
- background-color: deepskyblue;
- grid-column: 1;
- grid-row: 4;
-}
-
-.fourthRowSecondColumn {
- background-color: maroon;
- grid-column: 2;
- grid-row: 4;
-}
-
-.thirdRowFirstColumn {
- background-color: green;
- grid-column: 1;
- grid-row: 3;
-}
-
-.fourthRowFirstColumn {
- background-color: deepskyblue;
- grid-column: 1;
- grid-row: 4;
-}
-
-.fourthRowSecondColumn {
- background-color: maroon;
- grid-column: 2;
- grid-row: 4;
-}
-
-</style>
-
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/check-layout-th.js"></script>
-
-<body onload="checkLayout('.grid')">
-
-<p>This test checks that the align-content property is applied correctly when using content-distribution values in vertical-lr writing mode.</p>
-
-<div style="position: relative">
- <p>direction: LTR | align-content: 'space-between'</p>
- <div class="grid alignContentSpaceBetween verticalLR" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="0" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="360" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="360" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: LTR | align-content: 'space-around'</p>
- <div class="grid alignContentSpaceAround verticalLR" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="80" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="80" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="280" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="280" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: LTR | align-content: 'space-evenly'</p>
- <div class="grid alignContentSpaceEvenly verticalLR" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="107" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="107" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="253" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="253" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: LTR | align-content: 'stretch'</p>
- <div class="grid stretchedGrid alignContentStretch verticalLR" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="200" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="0" data-offset-y="20" data-expected-width="200" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="200" data-offset-y="0" data-expected-width="200" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="200" data-offset-y="20" data-expected-width="200" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: LTR | align-content: 'space-between'</p>
- <div class="grid alignContentSpaceBetween verticalLR" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="0" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="180" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowFirstColumn" data-offset-x="360" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowSecondColumn" data-offset-x="360" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: LTR | align-content: 'space-around'</p>
- <div class="grid alignContentSpaceAround verticalLR" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="47" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="47" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="180" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowFirstColumn" data-offset-x="313" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowSecondColumn" data-offset-x="313" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: LTR | align-content: 'space-evenly'</p>
- <div class="grid alignContentSpaceEvenly verticalLR" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="70" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="70" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="180" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowFirstColumn" data-offset-x="290" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowSecondColumn" data-offset-x="290" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: LTR | align-content: 'stretch'</p>
- <div class="grid stretchedGrid alignContentStretch verticalLR" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="133" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="0" data-offset-y="20" data-expected-width="133" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="133" data-offset-y="0" data-expected-width="133" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="133" data-offset-y="20" data-expected-width="133" data-expected-height="20"></div>
- <div class="thirdRowFirstColumn" data-offset-x="267" data-offset-y="0" data-expected-width="133" data-expected-height="20"></div>
- <div class="thirdRowSecondColumn" data-offset-x="267" data-offset-y="20" data-expected-width="133" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: LTR | align-content: 'space-between'</p>
- <div class="grid alignContentSpaceBetween verticalLR" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="0" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="120" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="120" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowFirstColumn" data-offset-x="240" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowSecondColumn" data-offset-x="240" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- <div class="fourthRowFirstColumn" data-offset-x="360" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="fourthRowSecondColumn" data-offset-x="360" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: LTR | align-content: 'space-around'</p>
- <div class="grid alignContentSpaceAround verticalLR" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="30" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="30" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="130" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="130" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowFirstColumn" data-offset-x="230" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowSecondColumn" data-offset-x="230" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- <div class="fourthRowFirstColumn" data-offset-x="330" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="fourthRowSecondColumn" data-offset-x="330" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: LTR | align-content: 'space-evenly'</p>
- <div class="grid alignContentSpaceEvenly verticalLR" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="48" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="48" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="136" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="136" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowFirstColumn" data-offset-x="224" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowSecondColumn" data-offset-x="224" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- <div class="fourthRowFirstColumn" data-offset-x="312" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="fourthRowSecondColumn" data-offset-x="312" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: LTR | align-content: 'stretch'</p>
- <div class="grid stretchedGrid alignContentStretch verticalLR" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="0" data-offset-y="20" data-expected-width="100" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="100" data-offset-y="0" data-expected-width="100" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="100" data-offset-y="20" data-expected-width="100" data-expected-height="20"></div>
- <div class="thirdRowFirstColumn" data-offset-x="200" data-offset-y="0" data-expected-width="100" data-expected-height="20"></div>
- <div class="thirdRowSecondColumn" data-offset-x="200" data-offset-y="20" data-expected-width="100" data-expected-height="20"></div>
- <div class="fourthRowFirstColumn" data-offset-x="300" data-offset-y="0" data-expected-width="100" data-expected-height="20"></div>
- <div class="fourthRowSecondColumn" data-offset-x="300" data-offset-y="20" data-expected-width="100" data-expected-height="20"></div>
- </div>
-</div>
-
-<!-- RTL direction. -->
-<div style="position: relative">
- <p>direction: RTL | align-content: 'space-between'</p>
- <div class="grid alignContentSpaceBetween verticalLR directionRTL" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="0" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="360" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="360" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: RTL | align-content: 'space-around'</p>
- <div class="grid alignContentSpaceAround verticalLR directionRTL" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="80" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="80" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="280" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="280" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: RTL | align-content: 'space-evenly'</p>
- <div class="grid alignContentSpaceEvenly verticalLR directionRTL" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="107" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="107" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="253" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="253" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: RTL | align-content: 'stretch'</p>
- <div class="grid stretchedGrid alignContentStretch verticalLR directionRTL" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="280" data-expected-width="200" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="0" data-offset-y="260" data-expected-width="200" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="200" data-offset-y="280" data-expected-width="200" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="200" data-offset-y="260" data-expected-width="200" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: RTL | align-content: 'space-between'</p>
- <div class="grid alignContentSpaceBetween verticalLR directionRTL" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="0" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="180" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowFirstColumn" data-offset-x="360" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowSecondColumn" data-offset-x="360" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: RTL | align-content: 'space-around'</p>
- <div class="grid alignContentSpaceAround verticalLR directionRTL" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="47" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="47" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="180" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowFirstColumn" data-offset-x="313" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowSecondColumn" data-offset-x="313" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: RTL | align-content: 'space-evenly'</p>
- <div class="grid alignContentSpaceEvenly verticalLR directionRTL" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="70" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="70" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="180" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowFirstColumn" data-offset-x="290" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowSecondColumn" data-offset-x="290" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: RTL | align-content: 'stretch'</p>
- <div class="grid stretchedGrid alignContentStretch verticalLR directionRTL" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="280" data-expected-width="133" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="0" data-offset-y="260" data-expected-width="133" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="133" data-offset-y="280" data-expected-width="133" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="133" data-offset-y="260" data-expected-width="133" data-expected-height="20"></div>
- <div class="thirdRowFirstColumn" data-offset-x="267" data-offset-y="280" data-expected-width="133" data-expected-height="20"></div>
- <div class="thirdRowSecondColumn" data-offset-x="267" data-offset-y="260" data-expected-width="133" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: RTL | align-content: 'space-between'</p>
- <div class="grid alignContentSpaceBetween verticalLR directionRTL" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="0" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="120" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="120" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowFirstColumn" data-offset-x="240" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowSecondColumn" data-offset-x="240" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- <div class="fourthRowFirstColumn" data-offset-x="360" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="fourthRowSecondColumn" data-offset-x="360" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: RTL | align-content: 'space-around'</p>
- <div class="grid alignContentSpaceAround verticalLR directionRTL" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="30" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="30" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="130" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="130" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowFirstColumn" data-offset-x="230" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowSecondColumn" data-offset-x="230" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- <div class="fourthRowFirstColumn" data-offset-x="330" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="fourthRowSecondColumn" data-offset-x="330" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: RTL | align-content: 'space-evenly'</p>
- <div class="grid alignContentSpaceEvenly verticalLR directionRTL" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="48" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="48" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="136" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="136" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowFirstColumn" data-offset-x="224" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowSecondColumn" data-offset-x="224" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- <div class="fourthRowFirstColumn" data-offset-x="312" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="fourthRowSecondColumn" data-offset-x="312" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: RTL | align-content: 'stretch'</p>
- <div class="grid stretchedGrid alignContentStretch verticalLR directionRTL" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="280" data-expected-width="100" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="0" data-offset-y="260" data-expected-width="100" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="100" data-offset-y="280" data-expected-width="100" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="100" data-offset-y="260" data-expected-width="100" data-expected-height="20"></div>
- <div class="thirdRowFirstColumn" data-offset-x="200" data-offset-y="280" data-expected-width="100" data-expected-height="20"></div>
- <div class="thirdRowSecondColumn" data-offset-x="200" data-offset-y="260" data-expected-width="100" data-expected-height="20"></div>
- <div class="fourthRowFirstColumn" data-offset-x="300" data-offset-y="280" data-expected-width="100" data-expected-height="20"></div>
- <div class="fourthRowSecondColumn" data-offset-x="300" data-offset-y="260" data-expected-width="100" data-expected-height="20"></div>
- </div>
-</div>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-align-content-distribution-vertical-rl.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-align-content-distribution-vertical-rl.html
deleted file mode 100644
index 096e3fd6910..00000000000
--- a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-align-content-distribution-vertical-rl.html
+++ /dev/null
@@ -1,358 +0,0 @@
-<meta charset="utf-8">
-<title>CSS Grid Layout Test: aligned content distribution for vertical rl</title>
-<link rel="author" title="Rossana Monteriso" href="mailto:rmonteriso@igalia.com">
-<link rel="help" href="https://drafts.csswg.org/css-align-3/#distribution-values">
-<meta name="assert" content="This test checks that the align-content property is applied correctly when using content-distribution values for the vertical-rl writing mode.">
-<meta name="flags" content="ahem">
-<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
-<link rel="stylesheet" href="/css/support/grid.css">
-
-<style>
-
-.grid {
- grid-auto-columns: 20px;
- grid-auto-rows: 40px;
- position: relative;
- width: 400px;
- height: 300px;
-}
-
-.stretchedGrid {
- grid-auto-rows: auto;
-}
-
-.thirdRowFirstColumn {
- background-color: green;
- grid-column: 1;
- grid-row: 3;
-}
-
-.fourthRowFirstColumn {
- background-color: deepskyblue;
- grid-column: 1;
- grid-row: 4;
-}
-
-.fourthRowSecondColumn {
- background-color: maroon;
- grid-column: 2;
- grid-row: 4;
-}
-
-.thirdRowFirstColumn {
- background-color: green;
- grid-column: 1;
- grid-row: 3;
-}
-
-.fourthRowFirstColumn {
- background-color: deepskyblue;
- grid-column: 1;
- grid-row: 4;
-}
-
-.fourthRowSecondColumn {
- background-color: maroon;
- grid-column: 2;
- grid-row: 4;
-}
-
-</style>
-
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/check-layout-th.js"></script>
-
-<body onload="checkLayout('.grid')">
-
-<p>This test checks that the align-content property is applied correctly when using content-distribution values for vertical-rl mode.</p>
-
-<div style="position: relative">
- <p>direction: LTR | align-content: 'space-between'</p>
- <div class="grid alignContentSpaceBetween verticalRL" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="360" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="360" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="0" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: LTR | align-content: 'space-around'</p>
- <div class="grid alignContentSpaceAround verticalRL" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="280" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="280" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="80" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="80" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: LTR | align-content: 'space-evenly'</p>
- <div class="grid alignContentSpaceEvenly verticalRL" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="253" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="253" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="107" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="107" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: LTR | align-content: 'stretch'</p>
- <div class="grid stretchedGrid alignContentStretch verticalRL" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="200" data-offset-y="0" data-expected-width="200" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="200" data-offset-y="20" data-expected-width="200" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="200" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="0" data-offset-y="20" data-expected-width="200" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: LTR | align-content: 'space-between'</p>
- <div class="grid alignContentSpaceBetween verticalRL" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="360" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="360" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="180" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowSecondColumn" data-offset-x="0" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: LTR | align-content: 'space-around'</p>
- <div class="grid alignContentSpaceAround verticalRL" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="313" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="313" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="180" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowFirstColumn" data-offset-x="47" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowSecondColumn" data-offset-x="47" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: LTR | align-content: 'space-evenly'</p>
- <div class="grid alignContentSpaceEvenly verticalRL" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="290" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="290" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="180" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowFirstColumn" data-offset-x="70" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowSecondColumn" data-offset-x="70" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: LTR | align-content: 'stretch'</p>
- <div class="grid stretchedGrid alignContentStretch verticalRL" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="267" data-offset-y="0" data-expected-width="133" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="267" data-offset-y="20" data-expected-width="133" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="133" data-offset-y="0" data-expected-width="133" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="133" data-offset-y="20" data-expected-width="133" data-expected-height="20"></div>
- <div class="thirdRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="133" data-expected-height="20"></div>
- <div class="thirdRowSecondColumn" data-offset-x="0" data-offset-y="20" data-expected-width="133" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: LTR | align-content: 'space-between'</p>
- <div class="grid alignContentSpaceBetween verticalRL" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="360" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="360" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="240" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="240" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowFirstColumn" data-offset-x="120" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowSecondColumn" data-offset-x="120" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- <div class="fourthRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="fourthRowSecondColumn" data-offset-x="0" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: LTR | align-content: 'space-around'</p>
- <div class="grid alignContentSpaceAround verticalRL" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="330" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="330" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="230" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="230" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowFirstColumn" data-offset-x="130" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowSecondColumn" data-offset-x="130" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- <div class="fourthRowFirstColumn" data-offset-x="30" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="fourthRowSecondColumn" data-offset-x="30" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: LTR | align-content: 'space-evenly'</p>
- <div class="grid alignContentSpaceEvenly verticalRL" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="312" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="312" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="224" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="224" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowFirstColumn" data-offset-x="136" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowSecondColumn" data-offset-x="136" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- <div class="fourthRowFirstColumn" data-offset-x="48" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
- <div class="fourthRowSecondColumn" data-offset-x="48" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: LTR | align-content: 'stretch'</p>
- <div class="grid stretchedGrid alignContentStretch verticalRL" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="300" data-offset-y="0" data-expected-width="100" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="300" data-offset-y="20" data-expected-width="100" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="200" data-offset-y="0" data-expected-width="100" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="200" data-offset-y="20" data-expected-width="100" data-expected-height="20"></div>
- <div class="thirdRowFirstColumn" data-offset-x="100" data-offset-y="0" data-expected-width="100" data-expected-height="20"></div>
- <div class="thirdRowSecondColumn" data-offset-x="100" data-offset-y="20" data-expected-width="100" data-expected-height="20"></div>
- <div class="fourthRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="20"></div>
- <div class="fourthRowSecondColumn" data-offset-x="0" data-offset-y="20" data-expected-width="100" data-expected-height="20"></div>
- </div>
-</div>
-
-<!-- RTL direction. -->
-<div style="position: relative">
- <p>direction: RTL | align-content: 'space-between'</p>
- <div class="grid alignContentSpaceBetween verticalRL directionRTL" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="360" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="360" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="0" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: RTL | align-content: 'space-around'</p>
- <div class="grid alignContentSpaceAround verticalRL directionRTL" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="280" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="280" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="80" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="80" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: RTL | align-content: 'space-evenly'</p>
- <div class="grid alignContentSpaceEvenly verticalRL directionRTL" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="253" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="253" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="107" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="107" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: RTL | align-content: 'stretch'</p>
- <div class="grid stretchedGrid alignContentStretch verticalRL directionRTL" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="200" data-offset-y="280" data-expected-width="200" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="200" data-offset-y="260" data-expected-width="200" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="280" data-expected-width="200" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="0" data-offset-y="260" data-expected-width="200" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: RTL | align-content: 'space-between'</p>
- <div class="grid alignContentSpaceBetween verticalRL directionRTL" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="360" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="360" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="180" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowFirstColumn" data-offset-x="0" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowSecondColumn" data-offset-x="0" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: RTL | align-content: 'space-around'</p>
- <div class="grid alignContentSpaceAround verticalRL directionRTL" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="313" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="313" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="180" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowFirstColumn" data-offset-x="47" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowSecondColumn" data-offset-x="47" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: RTL | align-content: 'space-evenly'</p>
- <div class="grid alignContentSpaceEvenly verticalRL directionRTL" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="290" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="290" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="180" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowFirstColumn" data-offset-x="70" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowSecondColumn" data-offset-x="70" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: RTL | align-content: 'stretch'</p>
- <div class="grid stretchedGrid alignContentStretch verticalRL directionRTL" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="267" data-offset-y="280" data-expected-width="133" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="267" data-offset-y="260" data-expected-width="133" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="133" data-offset-y="280" data-expected-width="133" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="133" data-offset-y="260" data-expected-width="133" data-expected-height="20"></div>
- <div class="thirdRowFirstColumn" data-offset-x="0" data-offset-y="280" data-expected-width="133" data-expected-height="20"></div>
- <div class="thirdRowSecondColumn" data-offset-x="0" data-offset-y="260" data-expected-width="133" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: RTL | align-content: 'space-between'</p>
- <div class="grid alignContentSpaceBetween verticalRL directionRTL" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="360" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="360" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="240" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="240" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowFirstColumn" data-offset-x="120" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowSecondColumn" data-offset-x="120" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- <div class="fourthRowFirstColumn" data-offset-x="0" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="fourthRowSecondColumn" data-offset-x="0" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: RTL | align-content: 'space-around'</p>
- <div class="grid alignContentSpaceAround verticalRL directionRTL" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="330" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="330" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="230" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="230" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowFirstColumn" data-offset-x="130" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowSecondColumn" data-offset-x="130" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- <div class="fourthRowFirstColumn" data-offset-x="30" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="fourthRowSecondColumn" data-offset-x="30" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: RTL | align-content: 'space-evenly'</p>
- <div class="grid alignContentSpaceEvenly verticalRL directionRTL" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="312" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="312" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="224" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="224" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowFirstColumn" data-offset-x="136" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="thirdRowSecondColumn" data-offset-x="136" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- <div class="fourthRowFirstColumn" data-offset-x="48" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
- <div class="fourthRowSecondColumn" data-offset-x="48" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: RTL | align-content: 'stretch'</p>
- <div class="grid stretchedGrid alignContentStretch verticalRL directionRTL" data-expected-width="400" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="300" data-offset-y="280" data-expected-width="100" data-expected-height="20"></div>
- <div class="firstRowSecondColumn" data-offset-x="300" data-offset-y="260" data-expected-width="100" data-expected-height="20"></div>
- <div class="secondRowFirstColumn" data-offset-x="200" data-offset-y="280" data-expected-width="100" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="200" data-offset-y="260" data-expected-width="100" data-expected-height="20"></div>
- <div class="thirdRowFirstColumn" data-offset-x="100" data-offset-y="280" data-expected-width="100" data-expected-height="20"></div>
- <div class="thirdRowSecondColumn" data-offset-x="100" data-offset-y="260" data-expected-width="100" data-expected-height="20"></div>
- <div class="fourthRowFirstColumn" data-offset-x="0" data-offset-y="280" data-expected-width="100" data-expected-height="20"></div>
- <div class="fourthRowSecondColumn" data-offset-x="0" data-offset-y="260" data-expected-width="100" data-expected-height="20"></div>
- </div>
-</div>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-align-content-distribution.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-align-content-distribution.html
deleted file mode 100644
index 7b66ddb9951..00000000000
--- a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-align-content-distribution.html
+++ /dev/null
@@ -1,358 +0,0 @@
-<meta charset="utf-8">
-<title>CSS Grid Layout Test: aligned content distribution</title>
-<link rel="author" title="Rossana Monteriso" href="mailto:rmonteriso@igalia.com">
-<link rel="help" href="https://drafts.csswg.org/css-align-3/#distribution-values">
-<meta name="assert" content="This test checks that the align-content property is applied correctly when using content-distribution values.">
-<meta name="flags" content="ahem">
-<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
-<link rel="stylesheet" href="/css/support/grid.css">
-
-<style>
-
-.grid {
- grid-auto-columns: 20px;
- grid-auto-rows: 40px;
- position: relative;
- width: 200px;
- height: 300px;
-}
-
-.stretchedGrid {
- grid-auto-rows: auto;
-}
-
-.thirdRowFirstColumn {
- background-color: green;
- grid-column: 1;
- grid-row: 3;
-}
-
-.fourthRowFirstColumn {
- background-color: deepskyblue;
- grid-column: 1;
- grid-row: 4;
-}
-
-.fourthRowSecondColumn {
- background-color: maroon;
- grid-column: 2;
- grid-row: 4;
-}
-
-.thirdRowFirstColumn {
- background-color: green;
- grid-column: 1;
- grid-row: 3;
-}
-
-.fourthRowFirstColumn {
- background-color: deepskyblue;
- grid-column: 1;
- grid-row: 4;
-}
-
-.fourthRowSecondColumn {
- background-color: maroon;
- grid-column: 2;
- grid-row: 4;
-}
-
-</style>
-
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/check-layout-th.js"></script>
-
-<body onload="checkLayout('.grid')">
-
-<p>This test checks that the align-content property is applied correctly when using content-distribution values.</p>
-
-<div style="position: relative">
- <p>direction: LTR | align-content: 'space-between'</p>
- <div class="grid alignContentSpaceBetween" data-expected-width="200" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
- <div class="firstRowSecondColumn" data-offset-x="20" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
- <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="260" data-expected-width="20" data-expected-height="40"></div>
- <div class="secondRowSecondColumn" data-offset-x="20" data-offset-y="260" data-expected-width="20" data-expected-height="40"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: LTR | align-content: 'space-around'</p>
- <div class="grid alignContentSpaceAround" data-expected-width="200" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="55" data-expected-width="20" data-expected-height="40"></div>
- <div class="firstRowSecondColumn" data-offset-x="20" data-offset-y="55" data-expected-width="20" data-expected-height="40"></div>
- <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="205" data-expected-width="20" data-expected-height="40"></div>
- <div class="secondRowSecondColumn" data-offset-x="20" data-offset-y="205" data-expected-width="20" data-expected-height="40"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: LTR | align-content: 'space-evenly'</p>
- <div class="grid alignContentSpaceEvenly" data-expected-width="200" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="73" data-expected-width="20" data-expected-height="40"></div>
- <div class="firstRowSecondColumn" data-offset-x="20" data-offset-y="73" data-expected-width="20" data-expected-height="40"></div>
- <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="187" data-expected-width="20" data-expected-height="40"></div>
- <div class="secondRowSecondColumn" data-offset-x="20" data-offset-y="187" data-expected-width="20" data-expected-height="40"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: LTR | align-content: 'stretch'</p>
- <div class="grid stretchedGrid alignContentStretch" data-expected-width="200" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="20" data-expected-height="150"></div>
- <div class="firstRowSecondColumn" data-offset-x="20" data-offset-y="0" data-expected-width="20" data-expected-height="150"></div>
- <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="150" data-expected-width="20" data-expected-height="150"></div>
- <div class="secondRowSecondColumn" data-offset-x="20" data-offset-y="150" data-expected-width="20" data-expected-height="150"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: LTR | align-content: 'space-between'</p>
- <div class="grid alignContentSpaceBetween" data-expected-width="200" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
- <div class="firstRowSecondColumn" data-offset-x="20" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
- <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div>
- <div class="secondRowSecondColumn" data-offset-x="20" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div>
- <div class="thirdRowFirstColumn" data-offset-x="0" data-offset-y="260" data-expected-width="20" data-expected-height="40"></div>
- <div class="thirdRowSecondColumn" data-offset-x="20" data-offset-y="260" data-expected-width="20" data-expected-height="40"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: LTR | align-content: 'space-around'</p>
- <div class="grid alignContentSpaceAround" data-expected-width="200" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="30" data-expected-width="20" data-expected-height="40"></div>
- <div class="firstRowSecondColumn" data-offset-x="20" data-offset-y="30" data-expected-width="20" data-expected-height="40"></div>
- <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div>
- <div class="secondRowSecondColumn" data-offset-x="20" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div>
- <div class="thirdRowFirstColumn" data-offset-x="0" data-offset-y="230" data-expected-width="20" data-expected-height="40"></div>
- <div class="thirdRowSecondColumn" data-offset-x="20" data-offset-y="230" data-expected-width="20" data-expected-height="40"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: LTR | align-content: 'space-evenly'</p>
- <div class="grid alignContentSpaceEvenly" data-expected-width="200" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="45" data-expected-width="20" data-expected-height="40"></div>
- <div class="firstRowSecondColumn" data-offset-x="20" data-offset-y="45" data-expected-width="20" data-expected-height="40"></div>
- <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div>
- <div class="secondRowSecondColumn" data-offset-x="20" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div>
- <div class="thirdRowFirstColumn" data-offset-x="0" data-offset-y="215" data-expected-width="20" data-expected-height="40"></div>
- <div class="thirdRowSecondColumn" data-offset-x="20" data-offset-y="215" data-expected-width="20" data-expected-height="40"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: LTR | align-content: 'stretch'</p>
- <div class="grid stretchedGrid alignContentStretch" data-expected-width="200" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="20" data-expected-height="100"></div>
- <div class="firstRowSecondColumn" data-offset-x="20" data-offset-y="0" data-expected-width="20" data-expected-height="100"></div>
- <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="100" data-expected-width="20" data-expected-height="100"></div>
- <div class="secondRowSecondColumn" data-offset-x="20" data-offset-y="100" data-expected-width="20" data-expected-height="100"></div>
- <div class="thirdRowFirstColumn" data-offset-x="0" data-offset-y="200" data-expected-width="20" data-expected-height="100"></div>
- <div class="thirdRowSecondColumn" data-offset-x="20" data-offset-y="200" data-expected-width="20" data-expected-height="100"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: LTR | align-content: 'space-between'</p>
- <div class="grid alignContentSpaceBetween" data-expected-width="200" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
- <div class="firstRowSecondColumn" data-offset-x="20" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
- <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="87" data-expected-width="20" data-expected-height="40"></div>
- <div class="secondRowSecondColumn" data-offset-x="20" data-offset-y="87" data-expected-width="20" data-expected-height="40"></div>
- <div class="thirdRowFirstColumn" data-offset-x="0" data-offset-y="173" data-expected-width="20" data-expected-height="40"></div>
- <div class="thirdRowSecondColumn" data-offset-x="20" data-offset-y="173" data-expected-width="20" data-expected-height="40"></div>
- <div class="fourthRowFirstColumn" data-offset-x="0" data-offset-y="260" data-expected-width="20" data-expected-height="40"></div>
- <div class="fourthRowSecondColumn" data-offset-x="20" data-offset-y="260" data-expected-width="20" data-expected-height="40"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: LTR | align-content: 'space-around'</p>
- <div class="grid alignContentSpaceAround" data-expected-width="200" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="18" data-expected-width="20" data-expected-height="40"></div>
- <div class="firstRowSecondColumn" data-offset-x="20" data-offset-y="18" data-expected-width="20" data-expected-height="40"></div>
- <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="93" data-expected-width="20" data-expected-height="40"></div>
- <div class="secondRowSecondColumn" data-offset-x="20" data-offset-y="93" data-expected-width="20" data-expected-height="40"></div>
- <div class="thirdRowFirstColumn" data-offset-x="0" data-offset-y="168" data-expected-width="20" data-expected-height="40"></div>
- <div class="thirdRowSecondColumn" data-offset-x="20" data-offset-y="168" data-expected-width="20" data-expected-height="40"></div>
- <div class="fourthRowFirstColumn" data-offset-x="0" data-offset-y="243" data-expected-width="20" data-expected-height="40"></div>
- <div class="fourthRowSecondColumn" data-offset-x="20" data-offset-y="243" data-expected-width="20" data-expected-height="40"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: LTR | align-content: 'space-evenly'</p>
- <div class="grid alignContentSpaceEvenly" data-expected-width="200" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="28" data-expected-width="20" data-expected-height="40"></div>
- <div class="firstRowSecondColumn" data-offset-x="20" data-offset-y="28" data-expected-width="20" data-expected-height="40"></div>
- <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="96" data-expected-width="20" data-expected-height="40"></div>
- <div class="secondRowSecondColumn" data-offset-x="20" data-offset-y="96" data-expected-width="20" data-expected-height="40"></div>
- <div class="thirdRowFirstColumn" data-offset-x="0" data-offset-y="164" data-expected-width="20" data-expected-height="40"></div>
- <div class="thirdRowSecondColumn" data-offset-x="20" data-offset-y="164" data-expected-width="20" data-expected-height="40"></div>
- <div class="fourthRowFirstColumn" data-offset-x="0" data-offset-y="232" data-expected-width="20" data-expected-height="40"></div>
- <div class="fourthRowSecondColumn" data-offset-x="20" data-offset-y="232" data-expected-width="20" data-expected-height="40"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: LTR | align-content: 'stretch'</p>
- <div class="grid stretchedGrid alignContentStretch" data-expected-width="200" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="20" data-expected-height="75"></div>
- <div class="firstRowSecondColumn" data-offset-x="20" data-offset-y="0" data-expected-width="20" data-expected-height="75"></div>
- <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="75" data-expected-width="20" data-expected-height="75"></div>
- <div class="secondRowSecondColumn" data-offset-x="20" data-offset-y="75" data-expected-width="20" data-expected-height="75"></div>
- <div class="thirdRowFirstColumn" data-offset-x="0" data-offset-y="150" data-expected-width="20" data-expected-height="75"></div>
- <div class="thirdRowSecondColumn" data-offset-x="20" data-offset-y="150" data-expected-width="20" data-expected-height="75"></div>
- <div class="fourthRowFirstColumn" data-offset-x="0" data-offset-y="225" data-expected-width="20" data-expected-height="75"></div>
- <div class="fourthRowSecondColumn" data-offset-x="20" data-offset-y="225" data-expected-width="20" data-expected-height="75"></div>
- </div>
-</div>
-
-<!-- RTL direction. -->
-<div style="position: relative">
- <p>direction: RTL | align-content: 'space-between'</p>
- <div class="grid alignContentSpaceBetween directionRTL" data-expected-width="200" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="180" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
- <div class="firstRowSecondColumn" data-offset-x="160" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
- <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="260" data-expected-width="20" data-expected-height="40"></div>
- <div class="secondRowSecondColumn" data-offset-x="160" data-offset-y="260" data-expected-width="20" data-expected-height="40"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: RTL | align-content: 'space-around'</p>
- <div class="grid alignContentSpaceAround directionRTL" data-expected-width="200" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="180" data-offset-y="55" data-expected-width="20" data-expected-height="40"></div>
- <div class="firstRowSecondColumn" data-offset-x="160" data-offset-y="55" data-expected-width="20" data-expected-height="40"></div>
- <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="205" data-expected-width="20" data-expected-height="40"></div>
- <div class="secondRowSecondColumn" data-offset-x="160" data-offset-y="205" data-expected-width="20" data-expected-height="40"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: RTL | align-content: 'space-evenly'</p>
- <div class="grid alignContentSpaceEvenly directionRTL" data-expected-width="200" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="180" data-offset-y="73" data-expected-width="20" data-expected-height="40"></div>
- <div class="firstRowSecondColumn" data-offset-x="160" data-offset-y="73" data-expected-width="20" data-expected-height="40"></div>
- <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="187" data-expected-width="20" data-expected-height="40"></div>
- <div class="secondRowSecondColumn" data-offset-x="160" data-offset-y="187" data-expected-width="20" data-expected-height="40"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: RTL | align-content: 'stretch'</p>
- <div class="grid stretchedGrid alignContentStretch directionRTL" data-expected-width="200" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="180" data-offset-y="0" data-expected-width="20" data-expected-height="150"></div>
- <div class="firstRowSecondColumn" data-offset-x="160" data-offset-y="0" data-expected-width="20" data-expected-height="150"></div>
- <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="150" data-expected-width="20" data-expected-height="150"></div>
- <div class="secondRowSecondColumn" data-offset-x="160" data-offset-y="150" data-expected-width="20" data-expected-height="150"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: RTL | align-content: 'space-between'</p>
- <div class="grid alignContentSpaceBetween directionRTL" data-expected-width="200" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="180" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
- <div class="firstRowSecondColumn" data-offset-x="160" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
- <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div>
- <div class="secondRowSecondColumn" data-offset-x="160" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div>
- <div class="thirdRowFirstColumn" data-offset-x="180" data-offset-y="260" data-expected-width="20" data-expected-height="40"></div>
- <div class="thirdRowSecondColumn" data-offset-x="160" data-offset-y="260" data-expected-width="20" data-expected-height="40"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: RTL | align-content: 'space-around'</p>
- <div class="grid alignContentSpaceAround directionRTL" data-expected-width="200" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="180" data-offset-y="30" data-expected-width="20" data-expected-height="40"></div>
- <div class="firstRowSecondColumn" data-offset-x="160" data-offset-y="30" data-expected-width="20" data-expected-height="40"></div>
- <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div>
- <div class="secondRowSecondColumn" data-offset-x="160" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div>
- <div class="thirdRowFirstColumn" data-offset-x="180" data-offset-y="230" data-expected-width="20" data-expected-height="40"></div>
- <div class="thirdRowSecondColumn" data-offset-x="160" data-offset-y="230" data-expected-width="20" data-expected-height="40"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: RTL | align-content: 'space-evenly'</p>
- <div class="grid alignContentSpaceEvenly directionRTL" data-expected-width="200" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="180" data-offset-y="45" data-expected-width="20" data-expected-height="40"></div>
- <div class="firstRowSecondColumn" data-offset-x="160" data-offset-y="45" data-expected-width="20" data-expected-height="40"></div>
- <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div>
- <div class="secondRowSecondColumn" data-offset-x="160" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div>
- <div class="thirdRowFirstColumn" data-offset-x="180" data-offset-y="215" data-expected-width="20" data-expected-height="40"></div>
- <div class="thirdRowSecondColumn" data-offset-x="160" data-offset-y="215" data-expected-width="20" data-expected-height="40"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: RTL | align-content: 'stretch'</p>
- <div class="grid stretchedGrid alignContentStretch directionRTL" data-expected-width="200" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="180" data-offset-y="0" data-expected-width="20" data-expected-height="100"></div>
- <div class="firstRowSecondColumn" data-offset-x="160" data-offset-y="0" data-expected-width="20" data-expected-height="100"></div>
- <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="100" data-expected-width="20" data-expected-height="100"></div>
- <div class="secondRowSecondColumn" data-offset-x="160" data-offset-y="100" data-expected-width="20" data-expected-height="100"></div>
- <div class="thirdRowFirstColumn" data-offset-x="180" data-offset-y="200" data-expected-width="20" data-expected-height="100"></div>
- <div class="thirdRowSecondColumn" data-offset-x="160" data-offset-y="200" data-expected-width="20" data-expected-height="100"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: RTL | align-content: 'space-between'</p>
- <div class="grid alignContentSpaceBetween directionRTL" data-expected-width="200" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="180" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
- <div class="firstRowSecondColumn" data-offset-x="160" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
- <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="87" data-expected-width="20" data-expected-height="40"></div>
- <div class="secondRowSecondColumn" data-offset-x="160" data-offset-y="87" data-expected-width="20" data-expected-height="40"></div>
- <div class="thirdRowFirstColumn" data-offset-x="180" data-offset-y="173" data-expected-width="20" data-expected-height="40"></div>
- <div class="thirdRowSecondColumn" data-offset-x="160" data-offset-y="173" data-expected-width="20" data-expected-height="40"></div>
- <div class="fourthRowFirstColumn" data-offset-x="180" data-offset-y="260" data-expected-width="20" data-expected-height="40"></div>
- <div class="fourthRowSecondColumn" data-offset-x="160" data-offset-y="260" data-expected-width="20" data-expected-height="40"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: RTL | align-content: 'space-around'</p>
- <div class="grid alignContentSpaceAround directionRTL" data-expected-width="200" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="180" data-offset-y="18" data-expected-width="20" data-expected-height="40"></div>
- <div class="firstRowSecondColumn" data-offset-x="160" data-offset-y="18" data-expected-width="20" data-expected-height="40"></div>
- <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="93" data-expected-width="20" data-expected-height="40"></div>
- <div class="secondRowSecondColumn" data-offset-x="160" data-offset-y="93" data-expected-width="20" data-expected-height="40"></div>
- <div class="thirdRowFirstColumn" data-offset-x="180" data-offset-y="168" data-expected-width="20" data-expected-height="40"></div>
- <div class="thirdRowSecondColumn" data-offset-x="160" data-offset-y="168" data-expected-width="20" data-expected-height="40"></div>
- <div class="fourthRowFirstColumn" data-offset-x="180" data-offset-y="243" data-expected-width="20" data-expected-height="40"></div>
- <div class="fourthRowSecondColumn" data-offset-x="160" data-offset-y="243" data-expected-width="20" data-expected-height="40"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: RTL | align-content: 'space-evenly'</p>
- <div class="grid alignContentSpaceEvenly directionRTL" data-expected-width="200" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="180" data-offset-y="28" data-expected-width="20" data-expected-height="40"></div>
- <div class="firstRowSecondColumn" data-offset-x="160" data-offset-y="28" data-expected-width="20" data-expected-height="40"></div>
- <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="96" data-expected-width="20" data-expected-height="40"></div>
- <div class="secondRowSecondColumn" data-offset-x="160" data-offset-y="96" data-expected-width="20" data-expected-height="40"></div>
- <div class="thirdRowFirstColumn" data-offset-x="180" data-offset-y="164" data-expected-width="20" data-expected-height="40"></div>
- <div class="thirdRowSecondColumn" data-offset-x="160" data-offset-y="164" data-expected-width="20" data-expected-height="40"></div>
- <div class="fourthRowFirstColumn" data-offset-x="180" data-offset-y="232" data-expected-width="20" data-expected-height="40"></div>
- <div class="fourthRowSecondColumn" data-offset-x="160" data-offset-y="232" data-expected-width="20" data-expected-height="40"></div>
- </div>
-</div>
-
-<div style="position: relative">
- <p>direction: RTL | align-content: 'stretch'</p>
- <div class="grid stretchedGrid alignContentStretch directionRTL" data-expected-width="200" data-expected-height="300">
- <div class="firstRowFirstColumn" data-offset-x="180" data-offset-y="0" data-expected-width="20" data-expected-height="75"></div>
- <div class="firstRowSecondColumn" data-offset-x="160" data-offset-y="0" data-expected-width="20" data-expected-height="75"></div>
- <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="75" data-expected-width="20" data-expected-height="75"></div>
- <div class="secondRowSecondColumn" data-offset-x="160" data-offset-y="75" data-expected-width="20" data-expected-height="75"></div>
- <div class="thirdRowFirstColumn" data-offset-x="180" data-offset-y="150" data-expected-width="20" data-expected-height="75"></div>
- <div class="thirdRowSecondColumn" data-offset-x="160" data-offset-y="150" data-expected-width="20" data-expected-height="75"></div>
- <div class="fourthRowFirstColumn" data-offset-x="180" data-offset-y="225" data-expected-width="20" data-expected-height="75"></div>
- <div class="fourthRowSecondColumn" data-offset-x="160" data-offset-y="225" data-expected-width="20" data-expected-height="75"></div>
- </div>
-</div>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-images/animations/object-position-interpolation.html b/tests/wpt/web-platform-tests/css/css-images/animations/object-position-interpolation.html
deleted file mode 100644
index 055cbc8421b..00000000000
--- a/tests/wpt/web-platform-tests/css/css-images/animations/object-position-interpolation.html
+++ /dev/null
@@ -1,158 +0,0 @@
-<!DOCTYPE html>
-<meta charset="UTF-8">
-<title>object-position-interpolation</title>
-<link rel="help" href="https://drafts.csswg.org/css-images-3/#the-object-position">
-<meta name="assert" content="object-position supports animation by computation">
-
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/css/support/interpolation-testcommon.js"></script>
-
-<style>
-.parent {
- object-position: 30px 10px;
-}
-
-.target {
- position: relative;
- width: 100px;
- height: 100px;
- background-color: black;
- display: inline-block;
- margin: 20px 0px 20px 0px;
- object-fit: fill;
- object-position: 10px 30px;
-}
-
-.expected {
- background-color: green;
-}
-</style>
-<body>
-</body>
-<script>
-test_interpolation({
- property: 'object-position',
- from: neutralKeyframe,
- to: '20px 20px',
-}, [
- {at: -0.3, expect: '7px 33px'},
- {at: 0, expect: '10px 30px'},
- {at: 0.5, expect: '15px 25px'},
- {at: 1, expect: '20px 20px'},
- {at: 1.5, expect: '25px 15px'},
-]);
-
-test_interpolation({
- property: 'object-position',
- from: 'initial',
- to: '20px 20px',
-}, [
- {at: -0.3, expect: 'calc(-6px + 65%) calc(-6px + 65%)'},
- {at: 0, expect: '50% 50%'},
- {at: 0.5, expect: 'calc(10px + 25%) calc(10px + 25%)'},
- {at: 1, expect: 'calc(20px + 0%) calc(20px + 0%)'},
- {at: 1.5, expect: 'calc(30px + -25%) calc(30px + -25%)'},
-]);
-
-test_interpolation({
- property: 'object-position',
- from: 'inherit',
- to: '20px 20px',
-}, [
- {at: -0.3, expect: '33px 7px'},
- {at: 0, expect: '30px 10px'},
- {at: 0.5, expect: '25px 15px'},
- {at: 1, expect: '20px 20px'},
- {at: 1.5, expect: '15px 25px'},
-]);
-
-test_interpolation({
- property: 'object-position',
- from: 'unset',
- to: '20px 20px',
-}, [
- {at: -0.3, expect: 'calc(-6px + 65%) calc(-6px + 65%)'},
- {at: 0, expect: '50% 50%'},
- {at: 0.5, expect: 'calc(10px + 25%) calc(10px + 25%)'},
- {at: 1, expect: 'calc(20px + 0%) calc(20px + 0%)'},
- {at: 1.5, expect: 'calc(30px + -25%) calc(30px + -25%)'},
-]);
-
-test_interpolation({
- property: 'object-position',
- from: '50% 50%',
- to: '100% 100%'
-}, [
- {at: -0.3, expect: '35% 35%'},
- {at: 0, expect: '50% 50%'},
- {at: 0.5, expect: '75% 75%'},
- {at: 1, expect: '100% 100%'},
- {at: 1.5, expect: '125% 125%'}
-]);
-
-test_interpolation({
- property: 'object-position',
- from: '100px 200px',
- to: '0px 0px'
-}, [
- {at: -0.3, expect: '130px 260px'},
- {at: 0, expect: '100px 200px'},
- {at: 0.5, expect: '50px 100px'},
- {at: 1, expect: '0px 0px'},
- {at: 1.5, expect: '-50px -100px'}
-]);
-
-// Zero seem to be a special case in the old implementation
-test_interpolation({
- property: 'object-position',
- from: '50% 100%',
- to: '0px 0px'
-}, [
- {at: -0.3, expect: '65% 130%'},
- {at: 0, expect: '50% 100%'},
- {at: 0.5, expect: '25% 50%'},
- {at: 1, expect: '0px 0px'},
- {at: 1.5, expect: '-25% -50%'}
-]);
-
-test_interpolation({
- property: 'object-position',
- from: '50% 100%',
- to: '50px 100px'
-}, [
- {at: -0.3, expect: 'calc(65% + -15px) calc(130% + -30px)'},
- {at: 0, expect: '50% 100%'},
- {at: 0.5, expect: 'calc(25% + 25px) calc(50% + 50px)'},
- {at: 1, expect: 'calc(0% + 50px) calc(0% + 100px)'},
- {at: 1.5, expect: 'calc(-25% + 75px) calc(-50% + 150px)'}
-]);
-
-test_interpolation({
- property: 'object-position',
- from: 'center',
- to: 'top right'
-}, [
- {at: -0.3, expect: '35% 65%'},
- {at: 0, expect: '50% 50%'},
- {at: 0.5, expect: '75% 25%'},
- {at: 1, expect: '100% 0%'},
- {at: 1.5, expect: '125% -25%'}
-]);
-
-test_interpolation({
- property: 'object-position',
- from: 'center',
- to: 'right 0% bottom 50%',
-}, [
- {at: -0.5, expect: '25% 50%'},
- {at: 0, expect: 'center'},
- {at: 0.3, expect: '65% 50%'},
- {at: 0.5, expect: '75% 50%'},
- {at: 0.9, expect: '95% 50%'},
- {at: 1, expect: '100% 50%'},
- {at: 1.5, expect: '125% 50%'},
- {at: 2, expect: '150% 50%'},
-]);
-</script>
-
diff --git a/tests/wpt/web-platform-tests/css/css-masking/animations/clip-path-composition.html b/tests/wpt/web-platform-tests/css/css-masking/animations/clip-path-composition.html
new file mode 100644
index 00000000000..2275ae70a33
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-masking/animations/clip-path-composition.html
@@ -0,0 +1,189 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>clip-path composition</title>
+<link rel="help" href="https://drafts.fxtf.org/css-masking-1/#the-clip-path">
+<meta name="assert" content="clip-path supports animation">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'clip-path',
+ underlying: 'circle(100px at 25px 25%)',
+ addFrom: 'circle(10px at 25px 75%)',
+ addTo: 'circle(50px at 50px center)',
+}, [
+ {at: -0.3, expect: 'circle(98px at 42.5px 107.5%)'},
+ {at: 0, expect: 'circle(110px at 50px 100%)'},
+ {at: 0.3, expect: 'circle(122px at 57.5px 92.5%)'},
+ {at: 0.6, expect: 'circle(134px at 65px 85%)'},
+ {at: 1, expect: 'circle(150px at 75px 75%)'},
+ {at: 1.5, expect: 'circle(170px at 87.5px 62.5%)'},
+]);
+
+test_composition({
+ property: 'clip-path',
+ underlying: 'circle(100px at 20px 20%)',
+ addFrom: 'circle(50px at 50px 50%)',
+ replaceTo: 'circle(50% at 150px 150%)',
+}, [
+ {at: -0.3, expect: 'circle(calc(195px + -15%) at 46px 46%)'},
+ {at: 0, expect: 'circle(calc(150px + 0%) at 70px 70%)'},
+ {at: 0.3, expect: 'circle(calc(105px + 15%) at 94px 94%)'},
+ {at: 0.6, expect: 'circle(calc(60px + 30%) at 118px 118%)'},
+ {at: 1, expect: 'circle(50% at 150px 150%)'},
+ {at: 1.5, expect: 'circle(calc(-75px + 75%) at 190px 190%)'},
+]);
+
+test_composition({
+ property: 'clip-path',
+ underlying: 'circle(farthest-side at 25px 75%)',
+ addFrom: 'circle(farthest-side at 25px 75%)',
+ addTo: 'circle(farthest-side at 50px center)',
+}, [
+ {at: 0.25, expect: 'circle(farthest-side at 25px 75%)'},
+ {at: 0.75, expect: 'circle(farthest-side at 50px 50%)'},
+]);
+
+test_composition({
+ property: 'clip-path',
+ underlying: 'circle(50px at 10px 20px)',
+ addFrom: 'circle(50px at 10px 20px)',
+ addTo: 'circle(farthest-side at 30px 40px)',
+}, [
+ {at: 0.25, expect: 'circle(100px at 20px 40px)'},
+ {at: 0.75, expect: 'circle(farthest-side at 30px 40px)'},
+]);
+
+test_composition({
+ property: 'clip-path',
+ underlying: 'ellipse(10px 20px at 30px 40px)',
+ addFrom: 'ellipse(40px 30px at 20px 10px)',
+ addTo: 'ellipse(140px 130px at 120px 110px)',
+}, [
+ {at: -0.3, expect: 'ellipse(20px 20px at 20px 20px)'},
+ {at: 0, expect: 'ellipse(50px 50px at 50px 50px)'},
+ {at: 0.3, expect: 'ellipse(80px 80px at 80px 80px)'},
+ {at: 0.6, expect: 'ellipse(110px 110px at 110px 110px)'},
+ {at: 1, expect: 'ellipse(150px 150px at 150px 150px)'},
+ {at: 1.5, expect: 'ellipse(200px 200px at 200px 200px)'},
+]);
+
+test_composition({
+ property: 'clip-path',
+ underlying: 'ellipse(10px 20px at 30px 40px)',
+ replaceFrom: 'ellipse(40px 30px at 20px 10px)',
+ addTo: 'ellipse(40px 30px at 20px 10px)',
+}, [
+ {at: -0.3, expect: 'ellipse(37px 24px at 11px -2px)'},
+ {at: 0, expect: 'ellipse(40px 30px at 20px 10px)'},
+ {at: 0.3, expect: 'ellipse(43px 36px at 29px 22px)'},
+ {at: 0.6, expect: 'ellipse(46px 42px at 38px 34px)'},
+ {at: 1, expect: 'ellipse(50px 50px at 50px 50px)'},
+ {at: 1.5, expect: 'ellipse(55px 60px at 65px 70px)'},
+]);
+
+test_composition({
+ property: 'clip-path',
+ underlying: 'ellipse(25px 75%)',
+ addFrom: 'ellipse()',
+ addTo: 'ellipse(closest-side farthest-side)',
+}, [
+ {at: 0.25, expect: 'ellipse(at 50% 50%)'},
+ {at: 0.75, expect: 'ellipse(closest-side farthest-side at 50% 50%)'},
+]);
+
+test_composition({
+ property: 'clip-path',
+ underlying: 'inset(20px)',
+ addFrom: 'inset(20px)',
+ addTo: 'inset(40%)',
+}, [
+ {at: -0.3, expect: 'inset(calc(46px + -12%))'},
+ {at: 0, expect: 'inset(calc(40px + 0%))'},
+ {at: 0.3, expect: 'inset(calc(34px + 12%))'},
+ {at: 0.6, expect: 'inset(calc(28px + 24%))'},
+ {at: 1, expect: 'inset(calc(20px + 40%))'},
+ {at: 1.5, expect: 'inset(calc(10px + 60%))'},
+]);
+
+test_composition({
+ property: 'clip-path',
+ underlying: 'inset(1px 2px 3px 4px round 10px 20px 30px 40px / 50px 60px 70px 80px)',
+ addFrom: 'inset(1px 2px 3px 4px round 10px 20px 30px 40px / 50px 60px 70px 80px)',
+ replaceTo: 'inset(102px 104px 106px 108px round 120px 140px 160px 180px / 200px 220px 240px 260px)',
+}, [
+ {at: -0.3, expect: 'inset(-28px -26px -24px -22px round 0px 10px 30px 50px / 70px 90px 110px 130px)'},
+ {at: 0, expect: 'inset(2px 4px 6px 8px round 20px 40px 60px 80px / 100px 120px 140px 160px)'},
+ {at: 0.25, expect: 'inset(27px 29px 31px 33px round 45px 65px 85px 105px / 125px 145px 165px 185px)'},
+ {at: 0.75, expect: 'inset(77px 79px 81px 83px round 95px 115px 135px 155px / 175px 195px 215px 235px)'},
+ {at: 1, expect: 'inset(102px 104px 106px 108px round 120px 140px 160px 180px / 200px 220px 240px 260px)'},
+ {at: 1.5, expect: 'inset(152px 154px 156px 158px round 170px 190px 210px 230px / 250px 270px 290px 310px)'},
+]);
+
+test_composition({
+ property: 'clip-path',
+ underlying: 'inset(1px 2px round 100px 200px)',
+ addFrom: 'inset(1px 2px round 100px 200px)',
+ addTo: 'inset(101px 102px 101px 102px)',
+}, [
+ {at: -0.3, expect: 'inset(-28px -26px round 230px 460px)'},
+ {at: 0, expect: 'inset(2px 4px round 200px 400px)'},
+ {at: 0.3, expect: 'inset(32px 34px round 170px 340px)'},
+ {at: 0.6, expect: 'inset(62px 64px round 140px 280px)'},
+ {at: 1, expect: 'inset(102px 104px round 100px 200px)'},
+ {at: 1.5, expect: 'inset(152px 154px round 50px 100px)'},
+]);
+
+test_composition({
+ property: 'clip-path',
+ underlying: 'polygon(10px 20%, 30px 40%)',
+ addFrom: 'polygon(10px 20%, 30px 40%)',
+ addTo: 'polygon(110px 120%, 130px 140%)',
+}, [
+ {at: -0.3, expect: 'polygon(-10px 10%, 30px 50%)'},
+ {at: 0, expect: 'polygon(20px 40%, 60px 80%)'},
+ {at: 0.3, expect: 'polygon(50px 70%, 90px 110%)'},
+ {at: 0.6, expect: 'polygon(80px 100%, 120px 140%)'},
+ {at: 1, expect: 'polygon(120px 140%, 160px 180%)'},
+ {at: 1.5, expect: 'polygon(170px 190%, 210px 230%)'},
+]);
+
+test_composition({
+ property: 'clip-path',
+ underlying: 'polygon(evenodd, 10px 20px)',
+ addFrom: 'polygon(evenodd, 10px 20px)',
+ addTo: 'polygon(evenodd, 110px 120px)',
+}, [
+ {at: -0.3, expect: 'polygon(evenodd, -10px 10px)'},
+ {at: 0, expect: 'polygon(evenodd, 20px 40px)'},
+ {at: 0.3, expect: 'polygon(evenodd, 50px 70px)'},
+ {at: 0.6, expect: 'polygon(evenodd, 80px 100px)'},
+ {at: 1, expect: 'polygon(evenodd, 120px 140px)'},
+ {at: 1.5, expect: 'polygon(evenodd, 170px 190px)'},
+]);
+
+test_composition({
+ property: 'clip-path',
+ underlying: 'polygon(evenodd, 10px 20px)',
+ addFrom: 'polygon(evenodd, 10px 20px)',
+ addTo: 'polygon(nonzero, 30px 40px)',
+}, [
+ {at: 0.25, expect: 'polygon(evenodd, 20px 40px)'},
+ {at: 0.75, expect: 'polygon(30px 40px)'},
+]);
+
+test_composition({
+ property: 'clip-path',
+ underlying: 'polygon(10px 20px, 30px 40px)',
+ addFrom: 'polygon(10px 20px, 30px 40px)',
+ addTo: 'polygon(30px 40px)',
+}, [
+ {at: 0.25, expect: 'polygon(20px 40px, 60px 80px)'},
+ {at: 0.75, expect: 'polygon(30px 40px)'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-position/animations/bottom-composition.html b/tests/wpt/web-platform-tests/css/css-position/animations/bottom-composition.html
new file mode 100644
index 00000000000..68a830dfbda
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position/animations/bottom-composition.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>bottom composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-position-3/#propdef-bottom">
+<meta name="assert" content="bottom support animation">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'bottom',
+ underlying: '50px',
+ addFrom: '100px',
+ addTo: '200px',
+}, [
+ {at: -0.3, expect: '120px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '200px'},
+ {at: 1, expect: '250px'},
+ {at: 1.5, expect: '300px'},
+]);
+
+test_composition({
+ property: 'bottom',
+ underlying: '100px',
+ addFrom: '10px',
+ addTo: '2px',
+}, [
+ {at: -0.5, expect: '114px'},
+ {at: 0, expect: '110px'},
+ {at: 0.5, expect: '106px'},
+ {at: 1, expect: '102px'},
+ {at: 1.5, expect: '98px'},
+]);
+
+test_composition({
+ property: 'bottom',
+ underlying: '10%',
+ addFrom: '100px',
+ addTo: '20%',
+}, [
+ {at: -0.3, expect: 'calc(130px + 4%)'},
+ {at: 0, expect: 'calc(100px + 10%)'},
+ {at: 0.5, expect: 'calc(50px + 20%)'},
+ {at: 1, expect: '30%'},
+ {at: 1.5, expect: 'calc(-50px + 40%)'},
+]);
+
+test_composition({
+ property: 'bottom',
+ underlying: '50px',
+ addFrom: '100px',
+ replaceTo: '200px',
+}, [
+ {at: -0.3, expect: '135px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.5, expect: '225px'},
+]);
+
+test_composition({
+ property: 'bottom',
+ underlying: '100px',
+ addFrom: '100px',
+ addTo: 'auto',
+}, [
+ {at: -0.3, expect: '200px'},
+ {at: 0, expect: '200px'},
+ {at: 0.5, expect: 'auto'},
+ {at: 1, expect: 'auto'},
+ {at: 1.5, expect: 'auto'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-position/animations/left-composition.html b/tests/wpt/web-platform-tests/css/css-position/animations/left-composition.html
new file mode 100644
index 00000000000..14b3dfda76d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position/animations/left-composition.html
@@ -0,0 +1,91 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>left composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-position-3/#propdef-left">
+<meta name="assert" content="left support animation">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'left',
+ underlying: '50px',
+ addFrom: '100px',
+ addTo: '200px',
+}, [
+ {at: -0.3, expect: '120px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '200px'},
+ {at: 1, expect: '250px'},
+ {at: 1.5, expect: '300px'},
+]);
+
+test_composition({
+ property: 'left',
+ underlying: '100px',
+ addFrom: '10px',
+ addTo: '2px',
+}, [
+ {at: -0.5, expect: '114px'},
+ {at: 0, expect: '110px'},
+ {at: 0.5, expect: '106px'},
+ {at: 1, expect: '102px'},
+ {at: 1.5, expect: '98px'},
+]);
+
+test_composition({
+ property: 'left',
+ underlying: '10%',
+ addFrom: '100px',
+ addTo: '20%',
+}, [
+ {at: -0.3, expect: 'calc(130px + 4%)'},
+ {at: 0, expect: 'calc(100px + 10%)'},
+ {at: 0.5, expect: 'calc(50px + 20%)'},
+ {at: 1, expect: '30%'},
+ {at: 1.5, expect: 'calc(-50px + 40%)'},
+]);
+
+test_composition({
+ property: 'left',
+ underlying: '10%',
+ addFrom: '100px',
+ addTo: '-10%',
+}, [
+ {at: -0.3, expect: 'calc(130px + 13%)'},
+ {at: 0, expect: 'calc(100px + 10%)'},
+ {at: 0.5, expect: 'calc(50px + 5%)'},
+ {at: 1, expect: '0%'},
+ {at: 1.5, expect: 'calc(-50px - 5%)'},
+]);
+
+test_composition({
+ property: 'left',
+ underlying: '50px',
+ addFrom: '100px',
+ replaceTo: '200px',
+}, [
+ {at: -0.3, expect: '135px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.5, expect: '225px'},
+]);
+
+test_composition({
+ property: 'left',
+ underlying: '100px',
+ addFrom: '100px',
+ addTo: 'auto',
+}, [
+ {at: -0.3, expect: '200px'},
+ {at: 0, expect: '200px'},
+ {at: 0.5, expect: 'auto'},
+ {at: 1, expect: 'auto'},
+ {at: 1.5, expect: 'auto'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-position/animation/position-interpolation.html b/tests/wpt/web-platform-tests/css/css-position/animations/position-interpolation.html
index a4ad50240a4..a4ad50240a4 100644
--- a/tests/wpt/web-platform-tests/css/css-position/animation/position-interpolation.html
+++ b/tests/wpt/web-platform-tests/css/css-position/animations/position-interpolation.html
diff --git a/tests/wpt/web-platform-tests/css/css-position/animations/right-composition.html b/tests/wpt/web-platform-tests/css/css-position/animations/right-composition.html
new file mode 100644
index 00000000000..995bb8d6bec
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position/animations/right-composition.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>right composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-position-3/#propdef-right">
+<meta name="assert" content="right support animation">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'right',
+ underlying: '50px',
+ addFrom: '100px',
+ addTo: '200px',
+}, [
+ {at: -0.3, expect: '120px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '200px'},
+ {at: 1, expect: '250px'},
+ {at: 1.5, expect: '300px'},
+]);
+
+test_composition({
+ property: 'right',
+ underlying: '100px',
+ addFrom: '10px',
+ addTo: '2px',
+}, [
+ {at: -0.5, expect: '114px'},
+ {at: 0, expect: '110px'},
+ {at: 0.5, expect: '106px'},
+ {at: 1, expect: '102px'},
+ {at: 1.5, expect: '98px'},
+]);
+
+test_composition({
+ property: 'right',
+ underlying: '10%',
+ addFrom: '100px',
+ addTo: '20%',
+}, [
+ {at: -0.3, expect: 'calc(130px + 4%)'},
+ {at: 0, expect: 'calc(100px + 10%)'},
+ {at: 0.5, expect: 'calc(50px + 20%)'},
+ {at: 1, expect: '30%'},
+ {at: 1.5, expect: 'calc(-50px + 40%)'},
+]);
+
+test_composition({
+ property: 'right',
+ underlying: '50px',
+ addFrom: '100px',
+ replaceTo: '200px',
+}, [
+ {at: -0.3, expect: '135px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.5, expect: '225px'},
+]);
+
+test_composition({
+ property: 'right',
+ underlying: '100px',
+ addFrom: '100px',
+ addTo: 'auto',
+}, [
+ {at: -0.3, expect: '200px'},
+ {at: 0, expect: '200px'},
+ {at: 0.5, expect: 'auto'},
+ {at: 1, expect: 'auto'},
+ {at: 1.5, expect: 'auto'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-position/animations/top-composition.html b/tests/wpt/web-platform-tests/css/css-position/animations/top-composition.html
new file mode 100644
index 00000000000..47782e8536f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position/animations/top-composition.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>top composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-position-3/#propdef-top">
+<meta name="assert" content="top support animation">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'top',
+ underlying: '50px',
+ addFrom: '100px',
+ addTo: '200px',
+}, [
+ {at: -0.3, expect: '120px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '200px'},
+ {at: 1, expect: '250px'},
+ {at: 1.5, expect: '300px'},
+]);
+
+test_composition({
+ property: 'top',
+ underlying: '100px',
+ addFrom: '10px',
+ addTo: '2px',
+}, [
+ {at: -0.5, expect: '114px'},
+ {at: 0, expect: '110px'},
+ {at: 0.5, expect: '106px'},
+ {at: 1, expect: '102px'},
+ {at: 1.5, expect: '98px'},
+]);
+
+test_composition({
+ property: 'top',
+ underlying: '10%',
+ addFrom: '100px',
+ addTo: '20%',
+}, [
+ {at: -0.3, expect: 'calc(130px + 4%)'},
+ {at: 0, expect: 'calc(100px + 10%)'},
+ {at: 0.5, expect: 'calc(50px + 20%)'},
+ {at: 1, expect: '30%'},
+ {at: 1.5, expect: 'calc(-50px + 40%)'},
+]);
+
+test_composition({
+ property: 'top',
+ underlying: '50px',
+ addFrom: '100px',
+ replaceTo: '200px',
+}, [
+ {at: -0.3, expect: '135px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.5, expect: '225px'},
+]);
+
+test_composition({
+ property: 'top',
+ underlying: '100px',
+ addFrom: '100px',
+ addTo: 'auto',
+}, [
+ {at: -0.3, expect: '200px'},
+ {at: 0, expect: '200px'},
+ {at: 0.5, expect: 'auto'},
+ {at: 1, expect: 'auto'},
+ {at: 1.5, expect: 'auto'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-relayout/changing-scroll-snap-align.html b/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-relayout/changing-scroll-snap-align.html
new file mode 100644
index 00000000000..3be68fe841a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-relayout/changing-scroll-snap-align.html
@@ -0,0 +1,121 @@
+<!DOCTYPE html>
+<title>
+ Updating the snap alignment of a snap container's content should make the snap
+ container resnap accordingly.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-scroll-snap/#re-snap" />
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+div {
+ position: absolute;
+ margin: 0;
+}
+
+#scroller {
+ height: 200px;
+ width: 200px;
+ overflow: hidden;
+ scroll-snap-type: both mandatory;
+}
+
+#initial-target {
+ width: 300px;
+ height: 300px;
+ top: 100px;
+ left: 100px;
+ background-color: green;
+ scroll-snap-align: start;
+}
+
+#other-target {
+ width: 300px;
+ height: 300px;
+ top: 300px;
+ left: 300px;
+ background-color: red;
+ scroll-snap-align: start;
+}
+
+.area {
+ width: 2000px;
+ height: 2000px;
+}
+
+.snap-area {
+ scroll-snap-align: start !important;
+}
+</style>
+
+<div id="scroller">
+ <div class="area"></div>
+ <div id="initial-target"></div>
+ <div id="other-target"></div>
+</div>
+
+<script>
+const initial_target = document.getElementById("initial-target");
+const other_target = document.getElementById("other-target");
+const scroller = document.getElementById("scroller");
+
+function cleanup() {
+ initial_target.style.setProperty("scroll-snap-align", "start");
+ other_target.style.setProperty("scroll-snap-align", "start");
+ initial_target.removeAttribute("class");
+}
+
+test(t => {
+ t.add_cleanup(cleanup);
+ scroller.scrollTo(0,0);
+ assert_equals(scroller.scrollTop, 100);
+ assert_equals(scroller.scrollLeft, 100);
+
+ initial_target.style.setProperty("scroll-snap-align", "end");
+ // target.top + target.height - scroller.height
+ assert_equals(scroller.scrollTop, 200);
+ assert_equals(scroller.scrollLeft, 200);
+}, "Changing the current target's snap alignment should make the scroller"
++ " resnap to it even if another snap position is closer to the current offset");
+
+test(t => {
+ t.add_cleanup(cleanup);
+ scroller.scrollTo(0,0);
+ assert_equals(scroller.scrollTop, 100);
+ assert_equals(scroller.scrollLeft, 100);
+
+ initial_target.style.setProperty("scroll-snap-align", "none");
+ assert_equals(scroller.scrollTop, 300);
+ assert_equals(scroller.scrollLeft, 300);
+}, "Removing the current target's snap alignment should make the scroller"
++ " resnap to a new snap area.");
+
+test(t => {
+ t.add_cleanup(cleanup);
+ initial_target.style.setProperty("scroll-snap-align", "none");
+ other_target.style.setProperty("scroll-snap-align", "none");
+
+ scroller.scrollTo(0,0);
+ assert_equals(scroller.scrollTop, 0);
+ assert_equals(scroller.scrollLeft, 0);
+
+ initial_target.style.setProperty("scroll-snap-align", "start");
+ assert_equals(scroller.scrollTop, 100);
+ assert_equals(scroller.scrollLeft, 100);
+}, "Changing an element snap alignment from none to start should make the"
++ "scroller resnap.");
+
+test(t => {
+ t.add_cleanup(cleanup);
+ initial_target.style.setProperty("scroll-snap-align", "none");
+ other_target.style.setProperty("scroll-snap-align", "none");
+
+ scroller.scrollTo(0,0);
+ assert_equals(scroller.scrollTop, 0);
+ assert_equals(scroller.scrollLeft, 0);
+
+ initial_target.classList.add("snap-area");
+ assert_equals(scroller.scrollTop, 100);
+ assert_equals(scroller.scrollLeft, 100);
+}, "Changing an element snap alignment from none to start by adding a class"
++ " should make the scroller resnap.");
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-relayout/changing-scroll-snap-type.html b/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-relayout/changing-scroll-snap-type.html
new file mode 100644
index 00000000000..70774b3d40f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-relayout/changing-scroll-snap-type.html
@@ -0,0 +1,96 @@
+<!DOCTYPE html>
+<title>
+ Updating the scroll-snap-type of a snap container should make it resnap accordingly.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-scroll-snap/#re-snap" />
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+div {
+ position: absolute;
+ margin: 0;
+}
+
+#scroller {
+ height: 500px;
+ width: 500px;
+ overflow: hidden;
+ scroll-snap-type: none;
+}
+
+#y-target {
+ width: 300px;
+ height: 300px;
+ top: 100px;
+ left: 0;
+ background-color: green;
+ scroll-snap-align: start none;
+}
+
+#x-target {
+ width: 300px;
+ height: 300px;
+ top: 0;
+ left: 100px;
+ background-color: red;
+ scroll-snap-align: none start;
+}
+
+.area {
+ width: 2000px;
+ height: 2000px;
+}
+</style>
+
+<div id="scroller">
+ <div class="area"></div>
+ <div id="x-target"></div>
+ <div id="y-target"></div>
+</div>
+
+<script>
+const x_target = document.getElementById("x_target");
+const y_target = document.getElementById("y_target");
+const scroller = document.getElementById("scroller");
+
+function cleanup() {
+ scroller.style.setProperty("scroll-snap-type", "none");
+}
+
+test(t => {
+ t.add_cleanup(cleanup);
+ scroller.scrollTo(0,0);
+ assert_equals(scroller.scrollTop, 0);
+ assert_equals(scroller.scrollLeft, 0);
+
+ scroller.style.setProperty("scroll-snap-type", "y mandatory");
+ assert_equals(scroller.scrollTop, 100);
+ assert_equals(scroller.scrollLeft, 0);
+}, "Changing the scroller's snap type to y should make it resnap on the y-axis.");
+
+test(t => {
+ t.add_cleanup(cleanup);
+ scroller.scrollTo(0,0);
+ assert_equals(scroller.scrollTop, 0);
+ assert_equals(scroller.scrollLeft, 0);
+
+ scroller.style.setProperty("scroll-snap-type", "x mandatory");
+ assert_equals(scroller.scrollLeft, 100);
+ assert_equals(scroller.scrollTop, 0);
+}, "Changing the scroller's snap type to x should make it resnap on the x-axis.");
+
+
+test(t => {
+ t.add_cleanup(cleanup);
+ scroller.scrollTo(0,0);
+ assert_equals(scroller.scrollTop, 0);
+ assert_equals(scroller.scrollLeft, 0);
+
+ scroller.style.setProperty("scroll-snap-type", "x mandatory");
+ assert_equals(scroller.scrollLeft, 100);
+ assert_equals(scroller.scrollTop, 0);
+
+ scroller.style.setProperty("scroll-snap-type", "y mandatory");
+ assert_equals(scroller.scrollTop, 100);
+}, "Changing the scroller's snap type axis should make it resnap.");
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-transforms/animation/perspective-composition.html b/tests/wpt/web-platform-tests/css/css-transforms/animation/perspective-composition.html
new file mode 100644
index 00000000000..6fa745d6ed2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-transforms/animation/perspective-composition.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title> perspective composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-transforms-2/#propdef-perspective">
+<meta name="assert" content="perspective supports animation">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'perspective',
+ underlying: '50px',
+ addFrom: '100px',
+ addTo: '200px',
+}, [
+ {at: -0.3, expect: '120px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '200px'},
+ {at: 1, expect: '250px'},
+ {at: 1.5, expect: '300px'},
+]);
+
+test_composition({
+ property: 'perspective',
+ underlying: '100px',
+ addFrom: '10px',
+ addTo: '2px',
+}, [
+ {at: -0.5, expect: '114px'},
+ {at: 0, expect: '110px'},
+ {at: 0.5, expect: '106px'},
+ {at: 1, expect: '102px'},
+ {at: 1.5, expect: '98px'}, // Value clamping should happen after composition.
+]);
+
+test_composition({
+ property: 'perspective',
+ underlying: '50px',
+ addFrom: '100px',
+ replaceTo: '200px',
+}, [
+ {at: -0.3, expect: '135px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.5, expect: '225px'},
+]);
+
+test_composition({
+ property: 'perspective',
+ underlying: '100px',
+ addFrom: '100px',
+ addTo: 'none',
+}, [
+ {at: -0.3, expect: '200px'},
+ {at: 0, expect: '200px'},
+ {at: 0.5, expect: 'none'},
+ {at: 1, expect: 'none'},
+ {at: 1.5, expect: 'none'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-transforms/animation/rotate-composition.html b/tests/wpt/web-platform-tests/css/css-transforms/animation/rotate-composition.html
new file mode 100644
index 00000000000..fa0118d50f4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-transforms/animation/rotate-composition.html
@@ -0,0 +1,167 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title> rotate composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-transforms-2/#propdef-rotate">
+<meta name="assert" content="rotate supports animation">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'rotate',
+ underlying: '100deg',
+ addFrom: '10deg',
+ addTo: '30deg',
+}, [
+ {at: -1, expect: '90deg'},
+ {at: 0, expect: '110deg'},
+ {at: 0.25, expect: '115deg'},
+ {at: 0.75, expect: '125deg'},
+ {at: 1, expect: '130deg'},
+ {at: 2, expect: '150deg'},
+]);
+
+test_composition({
+ property: 'rotate',
+ underlying: '1 0 0 200deg',
+ addFrom: '1 0 0 -100deg',
+ replaceTo: '1 0 0 40deg',
+}, [
+ {at: -1, expect: '1 0 0 160deg'},
+ {at: 0, expect: '1 0 0 100deg'},
+ {at: 0.25, expect: '1 0 0 85deg'},
+ {at: 0.75, expect: '1 0 0 55deg'},
+ {at: 1, expect: '1 0 0 40deg'},
+ {at: 2, expect: '1 0 0 -20deg'},
+]);
+
+test_composition({
+ property: 'rotate',
+ underlying: '0 1 0 -40deg',
+ replaceFrom: '0 1 0 50deg',
+ addTo: '0 1 0 10deg',
+}, [
+ {at: -1, expect: '0 1 0 130deg'},
+ {at: 0, expect: '0 1 0 50deg'},
+ {at: 0.25, expect: '0 1 0 30deg'},
+ {at: 0.75, expect: '0 1 0 -10deg'},
+ {at: 1, expect: '0 1 0 -30deg'},
+ {at: 2, expect: '0 1 0 -110deg'},
+]);
+
+test_composition({
+ property: 'rotate',
+ underlying: '1 2 3 40deg',
+ addFrom: '2 4 6 10deg',
+ addTo: '3 6 9 50deg',
+}, [
+ {at: -1, expect: '1 2 3 10deg'},
+ {at: 0, expect: '1 2 3 50deg'},
+ {at: 0.25, expect: '1 2 3 60deg'},
+ {at: 0.75, expect: '1 2 3 80deg'},
+ {at: 1, expect: '1 2 3 90deg'},
+ {at: 2, expect: '1 2 3 130deg'},
+]);
+
+test_composition({
+ property: 'rotate',
+ underlying: '1 2 3 270deg',
+ addFrom: '1 2 3 90deg',
+ replaceTo: '0 1 0 100deg',
+}, [
+ {at: -1, expect: '-5.49276e-17 -1 -1.64783e-16 100deg'},
+ {at: 0, expect: '1 2 3 360deg'},
+ {at: 0.25, expect: '-1.20172e-16 1 -3.60516e-16 25deg'},
+ {at: 0.75, expect: '-1.51909e-17 1 -4.55726e-17 75deg'},
+ {at: 1, expect: '0 1 0 100deg'},
+ {at: 2, expect: '-3.3235e-17 -1 -9.97049e-17 160deg'},
+]);
+
+test_composition({
+ property: 'rotate',
+ underlying: '1 2 3 90deg',
+ addFrom: '2 4 6 270deg',
+ replaceTo: '0 1 0 100deg',
+}, [
+ {at: -1, expect: '-5.49276e-17 -1 -1.64783e-16 100deg'},
+ {at: 0, expect: '1 2 3 360deg'},
+ {at: 0.25, expect: '-1.20172e-16 1 -3.60516e-16 25deg'},
+ {at: 0.75, expect: '-1.51909e-17 1 -4.55726e-17 75deg'},
+ {at: 1, expect: '0 1 0 100deg'},
+ {at: 2, expect: '-3.3235e-17 -1 -9.97049e-17 160deg'},
+]);
+
+test_composition({
+ property: 'rotate',
+ underlying: '1 0 0 90deg',
+ addFrom: '0 1 0 180deg',
+ replaceTo: '0 0 1 90deg',
+}, [
+ {at: -1, expect: '-6.12323e-17 -1 1.57009e-16 90deg'},
+ {at: 0, expect: '-4.32978e-17 -0.707107 -0.707107 180deg'},
+ {at: 0.25, expect: '-1.48952e-16 -0.894427 -0.447214 131.81deg'},
+ {at: 0.75, expect: '-2.94392e-17 -0.707107 0.707107 70.5288deg'},
+ {at: 1, expect: '90deg'},
+ {at: 2, expect: '-6.12323e-17 -1 -4.71028e-16 90deg'},
+]);
+
+test_composition({
+ property: 'rotate',
+ underlying: 'none',
+ addFrom: 'none',
+ replaceTo: '0 1 0 100deg',
+}, [
+ {at: -1, expect: '0 1 0 -100deg'},
+ {at: 0, expect: 'none'},
+ {at: 0.25, expect: '0 1 0 25deg'},
+ {at: 0.75, expect: '0 1 0 75deg'},
+ {at: 1, expect: '0 1 0 100deg'},
+ {at: 2, expect: '0 1 0 200deg'},
+]);
+
+test_composition({
+ property: 'rotate',
+ underlying: 'none',
+ addFrom: '2 4 6 270deg',
+ replaceTo: 'none',
+}, [
+ {at: -1, expect: '2 4 6 540deg'},
+ {at: 0, expect: '2 4 6 270deg'},
+ {at: 0.25, expect: '2 4 6 202.5deg'},
+ {at: 0.75, expect: '2 4 6 67.5deg'},
+ {at: 1, expect: 'none'},
+ {at: 2, expect: '2 4 6 -270deg'},
+]);
+
+test_composition({
+ property: 'rotate',
+ underlying: '1 2 3 90deg',
+ addFrom: 'none',
+ replaceTo: '0 1 0 100deg',
+}, [
+ {at: -1, expect: '0.31 -0.22 0.92 131.66deg'},
+ {at: 0, expect: '1 2 3 90deg'},
+ {at: 0.25, expect: '0.21 0.73 0.64 86.72deg'},
+ {at: 0.75, expect: '0.07 0.97 0.21 92.05deg'},
+ {at: 1, expect: '0 1 0 100deg'},
+ {at: 2, expect: '-0.2 0.79 -0.59 151.11deg'},
+]);
+
+test_composition({
+ property: 'rotate',
+ underlying: '1 2 3 90deg',
+ addFrom: '2 4 6 270deg',
+ replaceTo: 'none',
+}, [
+ {at: -1, expect: '1 2 3 720deg'},
+ {at: 0, expect: '1 2 3 360deg'},
+ {at: 0.25, expect: '1 2 3 270deg'},
+ {at: 0.75, expect: '1 2 3 90deg'},
+ {at: 1, expect: 'none'},
+ {at: 2, expect: '1 2 3 -360deg'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-transforms/animation/scale-composition.html b/tests/wpt/web-platform-tests/css/css-transforms/animation/scale-composition.html
new file mode 100644
index 00000000000..6fc4de61132
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-transforms/animation/scale-composition.html
@@ -0,0 +1,101 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>scale composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-transforms-2/#propdef-scale">
+<meta name="assert" content="scale supports animation.">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'scale',
+ underlying: '2 1',
+ addFrom: '3 1',
+ addTo: '4 1',
+}, [
+ {at: -0.5, expect: '5 1'},
+ {at: 0, expect: '6 1'},
+ {at: 0.25, expect: '6.5 1'},
+ {at: 0.5, expect: '7 1'},
+ {at: 0.75, expect: '7.5 1'},
+ {at: 1, expect: '8 1'},
+ {at: 1.5, expect: '9 1'},
+]);
+
+test_composition({
+ property: 'scale',
+ underlying: '1 2 3',
+ addFrom: '4 5 6',
+ replaceTo: '7 8 9',
+}, [
+ {at: -0.5, expect: '2.5 11 22.5'},
+ {at: 0, expect: '4 10 18'},
+ {at: 0.25, expect: '4.75 9.5 15.75'},
+ {at: 0.5, expect: '5.5 9 13.5'},
+ {at: 0.75, expect: '6.25 8.5 11.25'},
+ {at: 1, expect: '7 8 9'},
+ {at: 1.5, expect: '8.5 7 4.5'},
+]);
+
+test_composition({
+ property: 'scale',
+ underlying: 'none',
+ addFrom: 'none',
+ replaceTo: '1.5 1',
+}, [
+ {at: -1, expect: '0.5 1'},
+ {at: 0, expect: '1'},
+ {at: 0.25, expect: '1.125 1'},
+ {at: 0.75, expect: '1.375 1'},
+ {at: 1, expect: '1.5 1'},
+ {at: 2, expect: '2 1'},
+]);
+
+test_composition({
+ property: 'scale',
+ underlying: 'none',
+ addFrom: '4 5 6',
+ replaceTo: 'none',
+}, [
+ {at: -1, expect: '7 9 11'},
+ {at: 0, expect: '4 5 6'},
+ {at: 0.25, expect: '3.25 4 4.75'},
+ {at: 0.75, expect: '1.75 2 2.25'},
+ {at: 1, expect: 'none'},
+ {at: 2, expect: '-2 -3 -4'},
+]);
+
+test_composition({
+ property: 'scale',
+ underlying: '1 2 3',
+ addFrom: 'none',
+ replaceTo: '7 8 9',
+}, [
+ {at: -0.5, expect: '-2 -1 0'},
+ {at: 0, expect: '1 2 3'},
+ {at: 0.25, expect: '2.5 3.5 4.5'},
+ {at: 0.5, expect: '4 5 6'},
+ {at: 0.75, expect: '5.5 6.5 7.5'},
+ {at: 1, expect: '7 8 9'},
+ {at: 1.5, expect: '10 11 12'},
+]);
+
+test_composition({
+ property: 'scale',
+ underlying: '1 2 3',
+ addFrom: '4 5 6',
+ replaceTo: 'none',
+}, [
+ {at: -0.5, expect: '5.5 14.5 26.5'},
+ {at: 0, expect: '4 10 18'},
+ {at: 0.25, expect: '3.25 7.75 13.75'},
+ {at: 0.5, expect: '2.5 5.5 9.5'},
+ {at: 0.75, expect: '1.75 3.25 5.25'},
+ {at: 1, expect: 'none'},
+ {at: 1.5, expect: '-0.5 -3.5 -7.5'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-transforms/animation/transform-composition.html b/tests/wpt/web-platform-tests/css/css-transforms/animation/transform-composition.html
new file mode 100644
index 00000000000..928da71a9b9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-transforms/animation/transform-composition.html
@@ -0,0 +1,86 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>transform composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-transforms/#transform-property">
+<meta name="assert" content="transform supports animation as a transform list">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+// This file contains tests for the composition behavior of transforms that is
+// unrelated to the individual transform functions. For the transform functions
+// themselves, see the transform-*-composition.html subtests.
+
+// ------------------ Addition -----------------
+test_composition({
+ property: 'transform',
+ underlying: 'rotateX(100deg) rotateY(100deg)',
+ addFrom: 'translate(10px, 20px)',
+ replaceTo: 'rotateX(200deg) rotateY(200deg) translate(110px, 220px)',
+}, [
+ {at: -0.5, expect: 'rotateX(50deg) rotateY(50deg) translate(-40px, -80px)'},
+ {at: 0, expect: 'rotateX(100deg) rotateY(100deg) translate(10px, 20px)'},
+ {at: 0.25, expect: 'rotateX(125deg) rotateY(125deg) translate(35px, 70px)'},
+ {at: 0.5, expect: 'rotateX(150deg) rotateY(150deg) translate(60px, 120px)'},
+ {at: 0.75, expect: 'rotateX(175deg) rotateY(175deg) translate(85px, 170px)'},
+ {at: 1, expect: 'rotateX(200deg) rotateY(200deg) translate(110px, 220px)'},
+ {at: 1.5, expect: 'rotateX(250deg) rotateY(250deg) translate(160px, 320px)'},
+]);
+
+// Shorter list is extended with corresponding identity transforms for pairwise
+// interpolation.
+test_composition({
+ property: 'transform',
+ underlying: 'rotateX(45deg)',
+ addFrom: 'none',
+ addTo: 'rotateY(360deg)',
+}, [
+ {at: -0.5, expect: 'rotateX(45deg) rotateY(-180deg)'},
+ {at: 0, expect: 'rotateX(45deg) rotateY(0deg)'},
+ {at: 0.25, expect: 'rotateX(45deg) rotateY(90deg)'},
+ {at: 0.5, expect: 'rotateX(45deg) rotateY(180deg)'},
+ {at: 0.75, expect: 'rotateX(45deg) rotateY(270deg)'},
+ {at: 1, expect: 'rotateX(45deg) rotateY(360deg)'},
+ {at: 1.5, expect: 'rotateX(45deg) rotateY(540deg)'},
+]);
+
+// Matrix decomposition cases
+test_composition({
+ property: 'transform',
+ underlying: 'rotateX(90deg)',
+ addFrom: 'translate(100px, 100px)',
+ addTo: 'scale(2)',
+}, [
+ {at: -0.5, expect: 'matrix3d(0.5, 0, 0, 0, 0, 1.11022e-16, 0.5, 0, 0, -1, 2.22045e-16, 0, 150, 9.18485e-15, 150, 1)'},
+ {at: 0, expect: 'matrix3d(1, 0, 0, 0, 0, 6.12323e-17, 1, 0, 0, -1, 6.12323e-17, 0, 100, 6.12323e-15, 100, 1)'},
+ {at: 0.25, expect: 'matrix3d(1.25, 0, 0, 0, 0, 2.77556e-16, 1.25, 0, 0, -1, 2.22045e-16, 0, 75, 4.59243e-15, 75, 1)'},
+ {at: 0.5, expect: 'matrix3d(1.5, 0, 0, 0, 0, 3.33067e-16, 1.5, 0, 0, -1, 2.22045e-16, 0, 50, 3.06162e-15, 50, 1)'},
+ {at: 0.75, expect: 'matrix3d(1.75, 0, 0, 0, 0, 3.88578e-16, 1.75, 0, 0, -1, 2.22045e-16, 0, 25, 1.53081e-15, 25, 1)'},
+ {at: 1, expect: 'matrix3d(2, 0, 0, 0, 0, 1.22465e-16, 2, 0, 0, -1, 6.12323e-17, 0, 0, 0, 0, 1)'},
+ {at: 1.5, expect: 'matrix3d(2.5, 0, 0, 0, 0, 5.55112e-16, 2.5, 0, 0, -1, 2.22045e-16, 0, -50, -3.06162e-15, -50, 1)'},
+]);
+
+// Force a fallback to matrix interpolation.
+test_composition({
+ property: 'transform',
+ underlying: 'rotateX(45deg)',
+ addFrom: 'scaleX(1)',
+ addTo: 'rotateY(360deg)',
+}, [
+ {at: -0.5, expect: 'rotateX(45deg)'},
+ {at: 0, expect: 'rotateX(45deg)'},
+ {at: 0.25, expect: 'rotateX(45deg)'},
+ {at: 0.5, expect: 'rotateX(45deg)'},
+ {at: 0.75, expect: 'rotateX(45deg)'},
+ {at: 1, expect: 'rotateX(45deg)'},
+ {at: 1.5, expect: 'rotateX(45deg)'},
+]);
+
+// ------------------ Accumulation -----------------
+
+// TODO(smcgruer): Add tests for accumulation behaviors.
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-transforms/animation/transform-matrix-composition.html b/tests/wpt/web-platform-tests/css/css-transforms/animation/transform-matrix-composition.html
new file mode 100644
index 00000000000..2586ff3d4a5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-transforms/animation/transform-matrix-composition.html
@@ -0,0 +1,208 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>transform-matrix composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-transforms-2/#ctm">
+<meta name="assert" content="transform-matrix supports animation as a transform list">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+// For matrix and matrix3d, addition is defined as concatenation whilst
+// accumulation works by decomposing the matrix and then accumulating the
+// decomposed functions. We can therefore test the difference between the
+// two by mixing functions such that a naive multiplication would look
+// different than the accumulation behavior.
+//
+// Note that due to the complexities of decomposition the test space here is
+// huge; we cover some basic cases and hope that the tests for the individual
+// functions provide a lot of the remaining coverage.
+
+// Creates a matrix3d function, encoding the passed rotation and translation.
+// Note that the translate will not be affected by the rotation.
+function create3dMatrix(x, y, z, radians, translateX) {
+ // Normalize the rotation axes.
+ const length = Math.sqrt(x*x + y*y + z*z);
+ x /= length;
+ y /= length;
+ z /= length;
+
+ const sc = Math.sin(radians / 2) * Math.cos(radians / 2);
+ const sq = Math.sin(radians / 2) * Math.sin(radians / 2);
+
+ // https://drafts.csswg.org/css-transforms-2/#Rotate3dDefined
+ // https://drafts.csswg.org/css-transforms-2/#Translate3dDefined
+ return 'matrix3d(' + [
+ 1 - 2 * (y*y + z*z) * sq,
+ 2 * (x * y * sq + z * sc),
+ 2 * (x * z * sq - y * sc),
+ 0,
+ 2 * (x * y * sq - z * sc),
+ 1 - 2 * (x*x + z*z) * sq,
+ 2 * (y * z * sq + x * sc),
+ 0,
+ 2 * (x * z * sq + y * sc),
+ 2 * (y * z * sq - x * sc),
+ 1 - 2 * (x*x + y*y) * sq,
+ 0,
+ translateX, 0, 0, 1].join() + ')';
+}
+
+// ------------ Addition tests --------------
+
+test_composition({
+ property: 'transform',
+ // translateX(100px) rotate(90deg)
+ underlying: 'matrix(0, 1, -1, 0, 100, 0)',
+ // translateX(100px)
+ addFrom: 'matrix(1, 0, 0, 1, 100, 0)',
+ // translateX(200px)
+ addTo: 'matrix(1, 0, 0, 1, 200, 0)',
+}, [
+ {at: -0.5, expect: 'matrix(0, 1, -1, 0, 100, 50)'},
+ {at: 0, expect: 'matrix(0, 1, -1, 0, 100, 100)'},
+ {at: 0.25, expect: 'matrix(0, 1, -1, 0, 100, 125)'},
+ {at: 0.5, expect: 'matrix(0, 1, -1, 0, 100, 150)'},
+ {at: 0.75, expect: 'matrix(0, 1, -1, 0, 100, 175)'},
+ {at: 1, expect: 'matrix(0, 1, -1, 0, 100, 200)'},
+ {at: 1.5, expect: 'matrix(0, 1, -1, 0, 100, 250)'},
+]);
+
+test_composition({
+ property: 'transform',
+ // translateX(100px) rotate3d(1, 1, 0, 45deg)
+ underlying: create3dMatrix(1, 1, 0, Math.PI / 4, 100),
+ // translateX(100px)
+ addFrom: 'matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 100, 0, 0, 1)',
+ // translateX(200px)
+ addTo: 'matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 200, 0, 0, 1)',
+}, [
+ // matrix3ds are hard to read; these are the decomposed forms for clarity
+ {at: -0.5, expect: 'translateX(100px) rotate3d(1, 1, 0, 45deg) translateX(50px)'},
+ {at: 0, expect: 'translateX(100px) rotate3d(1, 1, 0, 45deg) translateX(100px)'},
+ {at: 0.25, expect: 'translateX(100px) rotate3d(1, 1, 0, 45deg) translateX(125px)'},
+ {at: 0.5, expect: 'translateX(100px) rotate3d(1, 1, 0, 45deg) translateX(150px)'},
+ {at: 0.75, expect: 'translateX(100px) rotate3d(1, 1, 0, 45deg) translateX(175px)'},
+ {at: 1, expect: 'translateX(100px) rotate3d(1, 1, 0, 45deg) translateX(200px)'},
+ {at: 1.5, expect: 'translateX(100px) rotate3d(1, 1, 0, 45deg) translateX(250px)'},
+]);
+
+// Addition of non-invertible matrices is still defined as concatenation so
+// includes the underlying value.
+
+test_composition({
+ property: 'transform',
+ // Non-invertible.
+ underlying: 'matrix(1, 1, 0, 0, 0, 100)',
+ // translateX(100px)
+ addFrom: 'matrix(1, 0, 0, 1, 100, 0)',
+ // translateX(200px)
+ addTo: 'matrix(1, 0, 0, 1, 200, 0)',
+}, [
+ {at: -0.5, expect: 'matrix(1, 1, 0, 0, 100, 200)'},
+ {at: 0, expect: 'matrix(1, 1, 0, 0, 100, 200)'},
+ {at: 0.25, expect: 'matrix(1, 1, 0, 0, 100, 200)'},
+ {at: 0.5, expect: 'matrix(1, 1, 0, 0, 200, 300)'},
+ {at: 0.75, expect: 'matrix(1, 1, 0, 0, 200, 300)'},
+ {at: 1, expect: 'matrix(1, 1, 0, 0, 200, 300)'},
+ {at: 1.5, expect: 'matrix(1, 1, 0, 0, 200, 300)'},
+]);
+
+test_composition({
+ property: 'transform',
+ // translateX(100px)
+ underlying: 'matrix(1, 0, 0, 1, 100, 0)',
+ // Non-invertible
+ addFrom: 'matrix(1, 1, 0, 0, 0, 100)',
+ // translateX(200px)
+ addTo: 'matrix(1, 0, 0, 1, 200, 0)',
+}, [
+ {at: -0.5, expect: 'matrix(1, 1, 0, 0, 100, 100)'},
+ {at: 0, expect: 'matrix(1, 1, 0, 0, 100, 100)'},
+ {at: 0.25, expect: 'matrix(1, 1, 0, 0, 100, 100)'},
+ {at: 0.5, expect: 'matrix(1, 0, 0, 1, 300, 0)'},
+ {at: 0.75, expect: 'matrix(1, 0, 0, 1, 300, 0)'},
+ {at: 1, expect: 'matrix(1, 0, 0, 1, 300, 0)'},
+ {at: 1.5, expect: 'matrix(1, 0, 0, 1, 300, 0)'},
+]);
+
+// ------------ Accumulation tests --------------
+
+test_composition({
+ property: 'transform',
+ // translateX(100px) rotate(90deg)
+ underlying: 'matrix(0, 1, -1, 0, 100, 0)',
+ // translateX(100px)
+ accumulateFrom: 'matrix(1, 0, 0, 1, 100, 0)',
+ // translateX(200px)
+ accumulateTo: 'matrix(1, 0, 0, 1, 200, 0)',
+}, [
+ {at: -0.5, expect: 'matrix(0, 1, -1, 0, 150, 0)'},
+ {at: 0, expect: 'matrix(0, 1, -1, 0, 200, 0)'},
+ {at: 0.25, expect: 'matrix(0, 1, -1, 0, 225, 0)'},
+ {at: 0.5, expect: 'matrix(0, 1, -1, 0, 250, 0)'},
+ {at: 0.75, expect: 'matrix(0, 1, -1, 0, 275, 0)'},
+ {at: 1, expect: 'matrix(0, 1, -1, 0, 300, 0)'},
+ {at: 1.5, expect: 'matrix(0, 1, -1, 0, 350, 0)'},
+]);
+
+test_composition({
+ property: 'transform',
+ // translateX(100px) rotate3d(1, 1, 0, 45deg)
+ underlying: create3dMatrix(1, 1, 0, Math.PI / 4, 100),
+ // translateX(100px)
+ accumulateFrom: 'matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 100, 0, 0, 1)',
+ // translateX(200px)
+ accumulateTo: 'matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 200, 0, 0, 1)',
+}, [
+ // matrix3ds are hard to read; these are the decomposed forms for clarity
+ {at: -0.5, expect: 'translateX(150px) rotate3d(1, 1, 0, 45deg)'},
+ {at: 0, expect: 'translateX(200px) rotate3d(1, 1, 0, 45deg)'},
+ {at: 0.25, expect: 'translateX(225px) rotate3d(1, 1, 0, 45deg)'},
+ {at: 0.5, expect: 'translateX(250px) rotate3d(1, 1, 0, 45deg)'},
+ {at: 0.75, expect: 'translateX(275px) rotate3d(1, 1, 0, 45deg)'},
+ {at: 1, expect: 'translateX(300px) rotate3d(1, 1, 0, 45deg)'},
+ {at: 1.5, expect: 'translateX(350px) rotate3d(1, 1, 0, 45deg)'},
+]);
+
+// Accumulation of non-invertible matrices falls back to replace behavior.
+
+test_composition({
+ property: 'transform',
+ // Non-invertible.
+ underlying: 'matrix(1, 1, 0, 0, 0, 100)',
+ // translateX(100px)
+ accumulateFrom: 'matrix(1, 0, 0, 1, 100, 0)',
+ // translateX(200px)
+ accumulateTo: 'matrix(1, 0, 0, 1, 200, 0)',
+}, [
+ {at: -0.5, expect: 'matrix(1, 0, 0, 1, 50, 0)'},
+ {at: 0, expect: 'matrix(1, 0, 0, 1, 100, 0)'},
+ {at: 0.25, expect: 'matrix(1, 0, 0, 1, 125, 0)'},
+ {at: 0.5, expect: 'matrix(1, 0, 0, 1, 150, 0)'},
+ {at: 0.75, expect: 'matrix(1, 0, 0, 1, 175, 0)'},
+ {at: 1, expect: 'matrix(1, 0, 0, 1, 200, 0)'},
+ {at: 1.5, expect: 'matrix(1, 0, 0, 1, 250, 0)'},
+]);
+
+test_composition({
+ property: 'transform',
+ // translateX(100px)
+ underlying: 'matrix(1, 0, 0, 1, 100, 0)',
+ // Non-invertible
+ accumulateFrom: 'matrix(1, 1, 0, 0, 0, 100)',
+ // translateX(200px)
+ accumulateTo: 'matrix(1, 0, 0, 1, 200, 0)',
+}, [
+ {at: -0.5, expect: 'matrix(1, 1, 0, 0, 0, 100)'},
+ {at: 0, expect: 'matrix(1, 1, 0, 0, 0, 100)'},
+ {at: 0.25, expect: 'matrix(1, 1, 0, 0, 0, 100)'},
+ {at: 0.5, expect: 'matrix(1, 0, 0, 1, 300, 0)'},
+ {at: 0.75, expect: 'matrix(1, 0, 0, 1, 300, 0)'},
+ {at: 1, expect: 'matrix(1, 0, 0, 1, 300, 0)'},
+ {at: 1.5, expect: 'matrix(1, 0, 0, 1, 300, 0)'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-transforms/animation/transform-perspective-composition.html b/tests/wpt/web-platform-tests/css/css-transforms/animation/transform-perspective-composition.html
new file mode 100644
index 00000000000..82f8dad59b6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-transforms/animation/transform-perspective-composition.html
@@ -0,0 +1,67 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>transform-perspective composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-transforms-2/#three-d-transform-functions">
+<meta name="assert" content="transform-perspective supports animation as a transform list">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+// Addition and accumulation of perspective values are very similar, but not
+// identical. We can test the difference by constructing a scenario where a
+// perspective parameter would go negative in one case (and thus be clamped
+// to 0), and would not go negative in the other case.
+//
+// In the test below, the values differ at 1.5 progress. The reason for this
+// is that at 1.5 progress, the addition case (which uses concatenation)
+// computes to:
+//
+// perspective(10px) perspective(-50px)
+//
+// Since perspective cannot go negative, this is clamped to:
+//
+// perspective(10px) identity
+//
+// The accumulation case, on the other hand, combines the components
+// and so ends up blending from perspective(5px) to perspective(8.33...px) at
+// 1.5 progress, which results in perspective(12.5px) - this is what you would
+// get with addition too, if not for the clamping behavior.
+
+// ------------ Addition tests --------------
+
+test_composition({
+ property: 'transform',
+ underlying: 'perspective(10px)',
+ addFrom: 'perspective(10px)',
+ addTo: 'perspective(50px)',
+}, [
+ {at: -0.5, expect: 'perspective(4.12px)'},
+ {at: 0, expect: 'perspective(5px)'},
+ {at: 0.25, expect: 'perspective(5.45px)'},
+ {at: 0.5, expect: 'perspective(6.15px)'},
+ {at: 0.75, expect: 'perspective(7.06px)'},
+ {at: 1, expect: 'perspective(8.33px)'},
+ {at: 1.5, expect: 'perspective(10px)'},
+]);
+
+// ------------ Accumulation tests --------------
+
+test_composition({
+ property: 'transform',
+ underlying: 'perspective(10px)',
+ accumulateFrom: 'perspective(10px)',
+ accumulateTo: 'perspective(50px)',
+}, [
+ {at: -0.5, expect: 'perspective(4.12px)'},
+ {at: 0, expect: 'perspective(5px)'},
+ {at: 0.25, expect: 'perspective(5.45px)'},
+ {at: 0.5, expect: 'perspective(6.15px)'},
+ {at: 0.75, expect: 'perspective(7.06px)'},
+ {at: 1, expect: 'perspective(8.33px)'},
+ {at: 1.5, expect: 'perspective(12.5px)'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-transforms/animation/transform-rotate-composition.html b/tests/wpt/web-platform-tests/css/css-transforms/animation/transform-rotate-composition.html
new file mode 100644
index 00000000000..e062860e729
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-transforms/animation/transform-rotate-composition.html
@@ -0,0 +1,164 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>transform-rotate composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-transforms/#funcdef-transform-rotate">
+<meta name="assert" content="transform-rotate supports animation as a transform list">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+// ------------ Addition tests --------------
+
+test_composition({
+ property: 'transform',
+ underlying: 'rotateX(20deg)',
+ addFrom: 'rotateX(40deg)',
+ addTo: 'rotateX(60deg)',
+}, [
+ {at: -0.5, expect: 'rotateX(50deg)'},
+ {at: 0, expect: 'rotateX(60deg)'},
+ {at: 0.25, expect: 'rotateX(65deg)'},
+ {at: 0.5, expect: 'rotateX(70deg)'},
+ {at: 0.75, expect: 'rotateX(75deg)'},
+ {at: 1, expect: 'rotateX(80deg)'},
+ {at: 1.5, expect: 'rotateX(90deg)'},
+]);
+
+test_composition({
+ property: 'transform',
+ underlying: 'rotateY(20deg)',
+ addFrom: 'rotateY(40deg)',
+ addTo: 'rotateY(60deg)',
+}, [
+ {at: -0.5, expect: 'rotateY(50deg)'},
+ {at: 0, expect: 'rotateY(60deg)'},
+ {at: 0.25, expect: 'rotateY(65deg)'},
+ {at: 0.5, expect: 'rotateY(70deg)'},
+ {at: 0.75, expect: 'rotateY(75deg)'},
+ {at: 1, expect: 'rotateY(80deg)'},
+ {at: 1.5, expect: 'rotateY(90deg)'},
+]);
+
+test_composition({
+ property: 'transform',
+ underlying: 'rotateZ(20deg)',
+ addFrom: 'rotateZ(40deg)',
+ addTo: 'rotateZ(60deg)',
+}, [
+ {at: -0.5, expect: 'rotateZ(50deg)'},
+ {at: 0, expect: 'rotateZ(60deg)'},
+ {at: 0.25, expect: 'rotateZ(65deg)'},
+ {at: 0.5, expect: 'rotateZ(70deg)'},
+ {at: 0.75, expect: 'rotateZ(75deg)'},
+ {at: 1, expect: 'rotateZ(80deg)'},
+ {at: 1.5, expect: 'rotateZ(90deg)'},
+]);
+
+// When testing rotate functions in isolation, the additive and accumulation
+// behaviors are functionally identical. This test includes a skew to ensure
+// both methods are implemented; add should append the from/to after the skew.
+test_composition({
+ property: 'transform',
+ underlying: 'rotate(45deg) skew(10deg, 20deg)',
+ addFrom: 'rotate(45deg)',
+ addTo: 'rotate(225deg)',
+}, [
+ {at: -0.5, expect: 'rotate(45deg) skew(10deg, 20deg) rotate(-45deg)'},
+ {at: 0, expect: 'rotate(45deg) skew(10deg, 20deg) rotate(45deg)'},
+ {at: 0.25, expect: 'rotate(45deg) skew(10deg, 20deg) rotate(90deg)'},
+ {at: 0.5, expect: 'rotate(45deg) skew(10deg, 20deg) rotate(135deg)'},
+ {at: 0.75, expect: 'rotate(45deg) skew(10deg, 20deg) rotate(180deg)'},
+ {at: 1, expect: 'rotate(45deg) skew(10deg, 20deg) rotate(225deg)'},
+ {at: 1.5, expect: 'rotate(45deg) skew(10deg, 20deg) rotate(315deg)'},
+]);
+// ------------ Accumulation tests --------------
+
+test_composition({
+ property: 'transform',
+ underlying: 'rotateX(20deg)',
+ accumulateFrom: 'rotateX(40deg)',
+ accumulateTo: 'rotateX(60deg)',
+}, [
+ {at: -0.5, expect: 'rotateX(50deg)'},
+ {at: 0, expect: 'rotateX(60deg)'},
+ {at: 0.25, expect: 'rotateX(65deg)'},
+ {at: 0.5, expect: 'rotateX(70deg)'},
+ {at: 0.75, expect: 'rotateX(75deg)'},
+ {at: 1, expect: 'rotateX(80deg)'},
+ {at: 1.5, expect: 'rotateX(90deg)'},
+]);
+
+test_composition({
+ property: 'transform',
+ underlying: 'rotateY(20deg)',
+ accumulateFrom: 'rotateY(40deg)',
+ accumulateTo: 'rotateY(60deg)',
+}, [
+ {at: -0.5, expect: 'rotateY(50deg)'},
+ {at: 0, expect: 'rotateY(60deg)'},
+ {at: 0.25, expect: 'rotateY(65deg)'},
+ {at: 0.5, expect: 'rotateY(70deg)'},
+ {at: 0.75, expect: 'rotateY(75deg)'},
+ {at: 1, expect: 'rotateY(80deg)'},
+ {at: 1.5, expect: 'rotateY(90deg)'},
+]);
+
+test_composition({
+ property: 'transform',
+ underlying: 'rotateZ(20deg)',
+ accumulateFrom: 'rotateZ(40deg)',
+ accumulateTo: 'rotateZ(60deg)',
+}, [
+ {at: -0.5, expect: 'rotateZ(50deg)'},
+ {at: 0, expect: 'rotateZ(60deg)'},
+ {at: 0.25, expect: 'rotateZ(65deg)'},
+ {at: 0.5, expect: 'rotateZ(70deg)'},
+ {at: 0.75, expect: 'rotateZ(75deg)'},
+ {at: 1, expect: 'rotateZ(80deg)'},
+ {at: 1.5, expect: 'rotateZ(90deg)'},
+]);
+
+// The rotate functions all share the same primitive type (rotate3d), so can be
+// accumulated between. If primitive type matching is not properly being
+// performed, this test would likely fail with a fallback to replace behavior.
+test_composition({
+ property: 'transform',
+ underlying: 'rotateX(45deg)',
+ accumulateFrom: 'rotateY(30deg)',
+ accumulateTo: 'rotateY(70deg)',
+}, [
+ // Due to how rotation is accumulated (addition of underlying angles), the
+ // behavior is identical to concatenating the components. The expectations
+ // are expressed as concatenations for readability.
+ {at: -0.5, expect: 'rotateX(45deg) rotateY(10deg)'},
+ {at: 0, expect: 'rotateX(45deg) rotateY(30deg)'},
+ {at: 0.25, expect: 'rotateX(45deg) rotateY(40deg)'},
+ {at: 0.5, expect: 'rotateX(45deg) rotateY(50deg)'},
+ {at: 0.75, expect: 'rotateX(45deg) rotateY(60deg)'},
+ {at: 1, expect: 'rotateX(45deg) rotateY(70deg)'},
+ {at: 1.5, expect: 'rotateX(45deg) rotateY(90deg)'},
+]);
+
+// When testing rotate functions in isolation, the additive and accumulation
+// behaviors are functionally identical. This test includes a skew to ensure
+// both methods are implemented; accumulate should combine the rotate before
+// the skew.
+test_composition({
+ property: 'transform',
+ underlying: 'rotate(45deg) skew(10deg, 20deg)',
+ accumulateFrom: 'rotate(45deg)',
+ accumulateTo: 'rotate(225deg)',
+}, [
+ {at: -0.5, expect: 'rotate(0deg) skew(10deg, 20deg)'},
+ {at: 0, expect: 'rotate(90deg) skew(10deg, 20deg)'},
+ {at: 0.25, expect: 'rotate(135deg) skew(10deg, 20deg)'},
+ {at: 0.5, expect: 'rotate(180deg) skew(10deg, 20deg)'},
+ {at: 0.75, expect: 'rotate(225deg) skew(10deg, 20deg)'},
+ {at: 1, expect: 'rotate(270deg) skew(10deg, 20deg)'},
+ {at: 1.5, expect: 'rotate(360deg) skew(10deg, 20deg)'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-transforms/animation/transform-scale-composition.html b/tests/wpt/web-platform-tests/css/css-transforms/animation/transform-scale-composition.html
new file mode 100644
index 00000000000..87c33a85ed6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-transforms/animation/transform-scale-composition.html
@@ -0,0 +1,129 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>transform-scale composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-transforms/#two-d-transform-functions">
+<meta name="assert" content="transform-scale supports animation as a transform list">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+// Addition (aka concatenation) of scale functions results in multiplying their
+// values (scale(2) scale(3) == scale(6)), whereas accumulation does a 1-based
+// sum of the components (accumulate(scale(2), scale(3)) == scale(2 + 3 - 1) ==
+// scale(4)).
+
+// ------------ Addition tests --------------
+
+test_composition({
+ property: 'transform',
+ underlying: 'scaleX(2)',
+ addFrom: 'scaleX(3)',
+ addTo: 'scaleX(4)',
+}, [
+ {at: -0.5, expect: 'scaleX(5)'},
+ {at: 0, expect: 'scaleX(6)'},
+ {at: 0.25, expect: 'scaleX(6.5)'},
+ {at: 0.5, expect: 'scaleX(7)'},
+ {at: 0.75, expect: 'scaleX(7.5)'},
+ {at: 1, expect: 'scaleX(8)'},
+ {at: 1.5, expect: 'scaleX(9)'},
+]);
+
+test_composition({
+ property: 'transform',
+ underlying: 'scaleY(2)',
+ addFrom: 'scaleY(3)',
+ addTo: 'scaleY(4)',
+}, [
+ {at: -0.5, expect: 'scaleY(5)'},
+ {at: 0, expect: 'scaleY(6)'},
+ {at: 0.25, expect: 'scaleY(6.5)'},
+ {at: 0.5, expect: 'scaleY(7)'},
+ {at: 0.75, expect: 'scaleY(7.5)'},
+ {at: 1, expect: 'scaleY(8)'},
+ {at: 1.5, expect: 'scaleY(9)'},
+]);
+
+test_composition({
+ property: 'transform',
+ underlying: 'scaleZ(2)',
+ addFrom: 'scaleZ(3)',
+ addTo: 'scaleZ(4)',
+}, [
+ {at: -0.5, expect: 'scaleZ(5)'},
+ {at: 0, expect: 'scaleZ(6)'},
+ {at: 0.25, expect: 'scaleZ(6.5)'},
+ {at: 0.5, expect: 'scaleZ(7)'},
+ {at: 0.75, expect: 'scaleZ(7.5)'},
+ {at: 1, expect: 'scaleZ(8)'},
+ {at: 1.5, expect: 'scaleZ(9)'},
+]);
+
+// ------------ Accumulation tests --------------
+
+test_composition({
+ property: 'transform',
+ underlying: 'scaleX(2)',
+ accumulateFrom: 'scaleX(3)',
+ accumulateTo: 'scaleX(4)',
+}, [
+ {at: -0.5, expect: 'scaleX(3.5)'},
+ {at: 0, expect: 'scaleX(4)'},
+ {at: 0.25, expect: 'scaleX(4.25)'},
+ {at: 0.5, expect: 'scaleX(4.5)'},
+ {at: 0.75, expect: 'scaleX(4.75)'},
+ {at: 1, expect: 'scaleX(5)'},
+ {at: 1.5, expect: 'scaleX(5.5)'},
+]);
+
+test_composition({
+ property: 'transform',
+ underlying: 'scaleY(2)',
+ accumulateFrom: 'scaleY(3)',
+ accumulateTo: 'scaleY(4)',
+}, [
+ {at: -0.5, expect: 'scaleY(3.5)'},
+ {at: 0, expect: 'scaleY(4)'},
+ {at: 0.25, expect: 'scaleY(4.25)'},
+ {at: 0.5, expect: 'scaleY(4.5)'},
+ {at: 0.75, expect: 'scaleY(4.75)'},
+ {at: 1, expect: 'scaleY(5)'},
+ {at: 1.5, expect: 'scaleY(5.5)'},
+]);
+
+test_composition({
+ property: 'transform',
+ underlying: 'scaleZ(2)',
+ accumulateFrom: 'scaleZ(3)',
+ accumulateTo: 'scaleZ(4)',
+}, [
+ {at: -0.5, expect: 'scaleZ(3.5)'},
+ {at: 0, expect: 'scaleZ(4)'},
+ {at: 0.25, expect: 'scaleZ(4.25)'},
+ {at: 0.5, expect: 'scaleZ(4.5)'},
+ {at: 0.75, expect: 'scaleZ(4.75)'},
+ {at: 1, expect: 'scaleZ(5)'},
+ {at: 1.5, expect: 'scaleZ(5.5)'},
+]);
+
+// The scale functions all share the same primitive type (scale3d), so can be
+// accumulated between.
+test_composition({
+ property: 'transform',
+ underlying: 'scale(2, 4)',
+ accumulateFrom: 'scaleZ(3)',
+ accumulateTo: 'scaleZ(4)',
+}, [
+ {at: -0.5, expect: 'scale3d(2, 4, 2.5)'},
+ {at: 0, expect: 'scale3d(2, 4, 3)'},
+ {at: 0.25, expect: 'scale3d(2, 4, 3.25)'},
+ {at: 0.5, expect: 'scale3d(2, 4, 3.5)'},
+ {at: 0.75, expect: 'scale3d(2, 4, 3.75)'},
+ {at: 1, expect: 'scale3d(2, 4, 4)'},
+ {at: 1.5, expect: 'scale3d(2, 4, 4.5)'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-transforms/animation/transform-skew-composition.html b/tests/wpt/web-platform-tests/css/css-transforms/animation/transform-skew-composition.html
new file mode 100644
index 00000000000..cda44b60c0e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-transforms/animation/transform-skew-composition.html
@@ -0,0 +1,124 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>transform-skew composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-transforms/#two-d-transform-functions">
+<meta name="assert" content="transform-skew supports animation as a transform list">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+// Addition (aka concatenation) of two skew functions skew(a) and skew(b)
+// results in computing tan(a) + tan(b), whereas accumulation results in summing
+// the components to get tan(a + b).
+
+// ------------ Addition tests --------------
+
+test_composition({
+ property: 'transform',
+ underlying: 'skewX(10deg)',
+ addFrom: 'skewX(30deg)',
+ addTo: 'skewX(50deg)',
+}, [
+ {at: -0.5, expect: 'skewX(10deg) skewX(20deg)'},
+ {at: 0, expect: 'skewX(10deg) skewX(30deg)'},
+ {at: 0.25, expect: 'skewX(10deg) skewX(35deg)'},
+ {at: 0.5, expect: 'skewX(10deg) skewX(40deg)'},
+ {at: 0.75, expect: 'skewX(10deg) skewX(45deg)'},
+ {at: 1, expect: 'skewX(10deg) skewX(50deg)'},
+ {at: 1.5, expect: 'skewX(10deg) skewX(60deg)'},
+]);
+
+test_composition({
+ property: 'transform',
+ underlying: 'skewY(10deg)',
+ addFrom: 'skewY(30deg)',
+ addTo: 'skewY(50deg)',
+}, [
+ {at: -0.5, expect: 'skewY(10deg) skewY(20deg)'},
+ {at: 0, expect: 'skewY(10deg) skewY(30deg)'},
+ {at: 0.25, expect: 'skewY(10deg) skewY(35deg)'},
+ {at: 0.5, expect: 'skewY(10deg) skewY(40deg)'},
+ {at: 0.75, expect: 'skewY(10deg) skewY(45deg)'},
+ {at: 1, expect: 'skewY(10deg) skewY(50deg)'},
+ {at: 1.5, expect: 'skewY(10deg) skewY(60deg)'},
+]);
+
+test_composition({
+ property: 'transform',
+ underlying: 'skew(10deg, 20deg)',
+ addFrom: 'skew(30deg, 10deg)',
+ addTo: 'skew(50deg, 50deg)',
+}, [
+ {at: -0.5, expect: 'skew(10deg, 20deg) skew(20deg, -10deg)'},
+ {at: 0, expect: 'skew(10deg, 20deg) skew(30deg, 10deg)'},
+ {at: 0.25, expect: 'skew(10deg, 20deg) skew(35deg, 20deg)'},
+ {at: 0.5, expect: 'skew(10deg, 20deg) skew(40deg, 30deg)'},
+ {at: 0.75, expect: 'skew(10deg, 20deg) skew(45deg, 40deg)'},
+ {at: 1, expect: 'skew(10deg, 20deg) skew(50deg, 50deg)'},
+ {at: 1.5, expect: 'skew(10deg, 20deg) skew(60deg, 70deg)'},
+]);
+
+// ------------ Accumulation tests --------------
+
+test_composition({
+ property: 'transform',
+ underlying: 'skewX(45deg)',
+ accumulateFrom: 'skewX(30deg)',
+ accumulateTo: 'skewX(70deg)',
+}, [
+ {at: -0.5, expect: 'skewX(55deg)'},
+ {at: 0, expect: 'skewX(75deg)'},
+ {at: 0.25, expect: 'skewX(85deg)'},
+ {at: 0.5, expect: 'skewX(95deg)'},
+ {at: 0.75, expect: 'skewX(105deg)'},
+ {at: 1, expect: 'skewX(115deg)'},
+ {at: 1.5, expect: 'skewX(135deg)'},
+]);
+
+test_composition({
+ property: 'transform',
+ underlying: 'skewY(45deg)',
+ accumulateFrom: 'skewY(30deg)',
+ accumulateTo: 'skewY(70deg)',
+}, [
+ {at: -0.5, expect: 'skewY(55deg)'},
+ {at: 0, expect: 'skewY(75deg)'},
+ {at: 0.25, expect: 'skewY(85deg)'},
+ {at: 0.5, expect: 'skewY(95deg)'},
+ {at: 0.75, expect: 'skewY(105deg)'},
+ {at: 1, expect: 'skewY(115deg)'},
+ {at: 1.5, expect: 'skewY(135deg)'},
+]);
+
+test_composition({
+ property: 'transform',
+ underlying: 'skew(10deg, 45deg)',
+ accumulateFrom: 'skew(20deg, 30deg)',
+ accumulateTo: 'skew(40deg, 70deg)',
+}, [
+ {at: -0.5, expect: 'skew(20deg, 55deg)'},
+ {at: 0, expect: 'skew(30deg, 75deg)'},
+ {at: 0.25, expect: 'skew(35deg, 85deg)'},
+ {at: 0.5, expect: 'skew(40deg, 95deg)'},
+ {at: 0.75, expect: 'skew(45deg, 105deg)'},
+ {at: 1, expect: 'skew(50deg, 115deg)'},
+ {at: 1.5, expect: 'skew(60deg, 135deg)'},
+]);
+
+// The skew{X,Y} functions DO NOT share the same primitive type, so cannot be
+// accumlated between directly. Instead, they fall back to matrix accumulation,
+// which this tests for.
+test_composition({
+ property: 'transform',
+ underlying: 'skewX(45deg)',
+ accumulateFrom: 'skewY(45deg)',
+ accumulateTo: 'skewY(45deg)',
+}, [
+ // Note that this is not equivalent to any form of combined skews.
+ {at: 0.5, expect: 'matrix(1, 1, 0.5, 1.5, 0, 0)'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-transforms/animation/transform-translate-composition.html b/tests/wpt/web-platform-tests/css/css-transforms/animation/transform-translate-composition.html
new file mode 100644
index 00000000000..49214c4a93c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-transforms/animation/transform-translate-composition.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>transform-translate composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-transforms/#two-d-transform-functions">
+<meta name="assert" content="transform-translate supports animation as a transform list">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script src="../interpolation/resources/interpolation-test.js"></script>
+<script>
+// ------------ Addition tests --------------
+
+test_composition({
+ property: 'transform',
+ underlying: 'translate(10px, 20px)',
+ addFrom: 'translate(100px, 200px)',
+ addTo: 'translate(200px, 400px)',
+}, [
+ {at: -0.5, expect: 'translate(60px, 120px)'},
+ {at: 0, expect: 'translate(110px, 220px)'},
+ {at: 0.25, expect: 'translate(135px, 270px)'},
+ {at: 0.5, expect: 'translate(160px, 320px)'},
+ {at: 0.75, expect: 'translate(185px, 370px)'},
+ {at: 1, expect: 'translate(210px, 420px)'},
+ {at: 1.5, expect: 'translate(260px, 520px)'},
+]);
+
+test_composition({
+ property: 'transform',
+ underlying: 'translate(10px, 20px)',
+ addFrom: 'translate(100px, 200px)',
+ replaceTo: 'translate(210px, 420px)',
+}, [
+ {at: -0.5, expect: 'translate(60px, 120px)'},
+ {at: 0, expect: 'translate(110px, 220px)'},
+ {at: 0.25, expect: 'translate(135px, 270px)'},
+ {at: 0.5, expect: 'translate(160px, 320px)'},
+ {at: 0.75, expect: 'translate(185px, 370px)'},
+ {at: 1, expect: 'translate(210px, 420px)'},
+ {at: 1.5, expect: 'translate(260px, 520px)'},
+]);
+
+// When testing translate functions in isolation, the additive and accumulation
+// behaviors are functionally identical. This test includes a rotate to ensure
+// both methods are implemented; add should append the from/to after the rotate.
+test_composition({
+ property: 'transform',
+ underlying: 'translateX(100px) rotate(90deg)',
+ addFrom: 'translateX(100px)',
+ addTo: 'translateX(200px)',
+}, [
+ {at: -0.5, expect: 'translateX(100px) rotate(90deg) translateX(50px)'},
+ {at: 0, expect: 'translateX(100px) rotate(90deg) translateX(100px)'},
+ {at: 0.25, expect: 'translateX(100px) rotate(90deg) translateX(125px)'},
+ {at: 0.5, expect: 'translateX(100px) rotate(90deg) translateX(150px)'},
+ {at: 0.75, expect: 'translateX(100px) rotate(90deg) translateX(175px)'},
+ {at: 1, expect: 'translateX(100px) rotate(90deg) translateX(200px)'},
+ {at: 1.5, expect: 'translateX(100px) rotate(90deg) translateX(250px)'},
+]);
+
+// ------------ Accumulation tests --------------
+
+test_composition({
+ property: 'transform',
+ underlying: 'translateX(100px)',
+ accumulateFrom: 'translateX(50px)',
+ accumulateTo: 'translateX(250px)',
+}, [
+ {at: -0.5, expect: 'translateX(50px)'},
+ {at: 0, expect: 'translateX(150px)'},
+ {at: 0.25, expect: 'translateX(200px)'},
+ {at: 0.5, expect: 'translateX(250px)'},
+ {at: 0.75, expect: 'translateX(300px)'},
+ {at: 1, expect: 'translateX(350px)'},
+ {at: 1.5, expect: 'translateX(450px)'},
+]);
+
+test_composition({
+ property: 'transform',
+ underlying: 'translateY(100px)',
+ accumulateFrom: 'translateY(50px)',
+ accumulateTo: 'translateY(250px)',
+}, [
+ {at: -0.5, expect: 'translateY(50px)'},
+ {at: 0, expect: 'translateY(150px)'},
+ {at: 0.25, expect: 'translateY(200px)'},
+ {at: 0.5, expect: 'translateY(250px)'},
+ {at: 0.75, expect: 'translateY(300px)'},
+ {at: 1, expect: 'translateY(350px)'},
+ {at: 1.5, expect: 'translateY(450px)'},
+]);
+
+test_composition({
+ property: 'transform',
+ underlying: 'translateZ(100px)',
+ accumulateFrom: 'translateZ(50px)',
+ accumulateTo: 'translateZ(250px)',
+}, [
+ {at: -0.5, expect: 'translateZ(50px)'},
+ {at: 0, expect: 'translateZ(150px)'},
+ {at: 0.25, expect: 'translateZ(200px)'},
+ {at: 0.5, expect: 'translateZ(250px)'},
+ {at: 0.75, expect: 'translateZ(300px)'},
+ {at: 1, expect: 'translateZ(350px)'},
+ {at: 1.5, expect: 'translateZ(450px)'},
+]);
+
+// The translate functions all share the same primitive type (translate3d), so
+// can be accumulated between.
+test_composition({
+ property: 'transform',
+ underlying: 'translate(100px, 50px)',
+ accumulateFrom: 'translateZ(50px)',
+ accumulateTo: 'translateZ(250px)',
+}, [
+ {at: -0.5, expect: 'translate3d(100px, 50px, -50px)'},
+ {at: 0, expect: 'translate3d(100px, 50px, 50px)'},
+ {at: 0.25, expect: 'translate3d(100px, 50px, 100px)'},
+ {at: 0.5, expect: 'translate3d(100px, 50px, 150px)'},
+ {at: 0.75, expect: 'translate3d(100px, 50px, 200px)'},
+ {at: 1, expect: 'translate3d(100px, 50px, 250px)'},
+ {at: 1.5, expect: 'translate3d(100px, 50px, 350px)'},
+]);
+
+// When testing translate functions in isolation, the additive and accumulation
+// behaviors are functionally identical. This test includes a rotate to ensure
+// both methods are implemented; accumulate should combine the transform before
+// the rotate.
+test_composition({
+ property: 'transform',
+ underlying: 'translateX(100px) rotate(90deg)',
+ accumulateFrom: 'translateX(100px)',
+ accumulateTo: 'translateX(200px)',
+}, [
+ {at: -0.5, expect: 'translateX(150px) rotate(90deg)'},
+ {at: 0, expect: 'translateX(200px) rotate(90deg)'},
+ {at: 0.25, expect: 'translateX(225px) rotate(90deg)'},
+ {at: 0.5, expect: 'translateX(250px) rotate(90deg)'},
+ {at: 0.75, expect: 'translateX(275px) rotate(90deg)'},
+ {at: 1, expect: 'translateX(300px) rotate(90deg)'},
+ {at: 1.5, expect: 'translateX(350px) rotate(90deg)'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-transforms/animation/translate-composition.html b/tests/wpt/web-platform-tests/css/css-transforms/animation/translate-composition.html
new file mode 100644
index 00000000000..3abdb4522b0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-transforms/animation/translate-composition.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>translate composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-transforms-2/#propdef-translate">
+<meta name="assert" content="translate supports <length> and <percentage> animation.">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<style>
+.target {
+ width: 100px;
+ height: 100px;
+}
+</style>
+<script>
+test_composition({
+ property: 'translate',
+ underlying: '100px 200px 300px',
+ addFrom: '-50px 50%',
+ addTo: '100%',
+}, [
+ {at: -1, expect: '-100% calc(200px + 100%) 300px'},
+ {at: 0, expect: 'calc(50px + 0%) calc(200px + 50%) 300px'},
+ {at: 0.25, expect: 'calc(62.5px + 25%) calc(200px + 37.5%) 300px'},
+ {at: 0.75, expect: 'calc(87.5px + 75%) calc(200px + 12.5%) 300px'},
+ {at: 1, expect: 'calc(100px + 100%) calc(200px + 0%) 300px'},
+ {at: 2, expect: 'calc(150px + 200%) calc(200px - 50%) 300px'},
+]);
+
+test_composition({
+ property: 'translate',
+ underlying: '100px 200px 300px',
+ addFrom: '50% 100px',
+ replaceTo: '200px 50% 100px',
+}, [
+ {at: -1, expect: '100% calc(600px - 50%) 500px'},
+ {at: 0, expect: 'calc(100px + 50%) calc(300px + 0%) 300px'},
+ {at: 0.25, expect: 'calc(125px + 37.5%) calc(225px + 12.5%) 250px'},
+ {at: 0.75, expect: 'calc(175px + 12.5%) calc(75px + 37.5%) 150px'},
+ {at: 1, expect: 'calc(200px + 0%) 50% 100px'},
+ {at: 2, expect: 'calc(300px - 50%) calc(-300px + 100%) -100px'},
+]);
+
+test_composition({
+ property: 'translate',
+ underlying: '100px 200px 300px',
+ replaceFrom: '50% 100px',
+ addTo: '200px 50% 100px',
+}, [
+ {at: -1, expect: 'calc(-300px + 100%) -50% -400px'},
+ {at: 0, expect: '50% calc(100px + 0%)'},
+ {at: 0.25, expect: 'calc(75px + 37.5%) calc(125px + 12.5%) 100px'},
+ {at: 0.75, expect: 'calc(225px + 12.5%) calc(175px + 37.5%) 300px'},
+ {at: 1, expect: 'calc(300px + 0%) calc(200px + 50%) 400px'},
+ {at: 2, expect: 'calc(600px - 50%) calc(300px + 100%) 800px'},
+]);
+
+test_composition({
+ property: 'translate',
+ underlying: 'none',
+ replaceFrom: 'none',
+ addTo: '100px',
+}, [
+ {at: -1, expect: '-100px'},
+ {at: 0, expect: 'none'},
+ {at: 0.25, expect: '25px'},
+ {at: 0.75, expect: '75px'},
+ {at: 1, expect: '100px'},
+ {at: 2, expect: '200px'},
+]);
+
+test_composition({
+ property: 'translate',
+ underlying: 'none',
+ addFrom: 'none',
+ addTo: '100px',
+}, [
+ {at: -1, expect: '-100px'},
+ {at: 0, expect: 'none'},
+ {at: 0.25, expect: '25px'},
+ {at: 0.75, expect: '75px'},
+ {at: 1, expect: '100px'},
+ {at: 2, expect: '200px'},
+]);
+
+test_composition({
+ property: 'translate',
+ underlying: 'none',
+ replaceFrom: '0px 40px 60px',
+ replaceTo: 'none',
+}, [
+ {at: -1, expect: '0px 80px 120px'},
+ {at: 0, expect: '0px 40px 60px'},
+ {at: 0.25, expect: '0px 30px 45px'},
+ {at: 0.75, expect: '0px 10px 15px'},
+ {at: 1, expect: 'none'},
+ {at: 2, expect: '0px -40px -60px'},
+]);
+
+test_composition({
+ property: 'translate',
+ underlying: 'none',
+ replaceFrom: '0px 40px 60px',
+ addTo: 'none',
+}, [
+ {at: -1, expect: '0px 80px 120px'},
+ {at: 0, expect: '0px 40px 60px'},
+ {at: 0.25, expect: '0px 30px 45px'},
+ {at: 0.75, expect: '0px 10px 15px'},
+ {at: 1, expect: 'none'},
+ {at: 2, expect: '0px -40px -60px'},
+]);
+
+test_composition({
+ property: 'translate',
+ underlying: '80px 20px',
+ addFrom: 'none',
+ replaceTo: '0px 40px 60px',
+}, [
+ {at: -1, expect: '160px 0px -60px'},
+ {at: 0, expect: '80px 20px'},
+ {at: 0.25, expect: '60px 25px 15px'},
+ {at: 0.5, expect: '40px 30px 30px'},
+ {at: 0.75, expect: '20px 35px 45px'},
+ {at: 1, expect: '0px 40px 60px'},
+ {at: 2, expect: '-80px 60px 120px'},
+]);
+
+test_composition({
+ property: 'translate',
+ underlying: '80px 20px',
+ addFrom: '0px 40px 60px',
+ replaceTo: 'none',
+}, [
+ {at: -1, expect: '160px 120px 120px'},
+ {at: 0, expect: '80px 60px 60px'},
+ {at: 0.25, expect: '60px 45px 45px'},
+ {at: 0.5, expect: '40px 30px 30px'},
+ {at: 0.75, expect: '20px 15px 15px'},
+ {at: 1, expect: 'none'},
+ {at: 2, expect: '-80px -60px -60px'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-transitions/animations/vertical-align-composition.html b/tests/wpt/web-platform-tests/css/css-transitions/animations/vertical-align-composition.html
new file mode 100644
index 00000000000..222a511679b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-transitions/animations/vertical-align-composition.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>vertical-align composition</title>
+<link rel="help" href="https://www.w3.org/TR/CSS2/visudet.html#propdef-vertical-align">
+<meta name="assert" content="vertical-align supports animation">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'vertical-align',
+ underlying: '50px',
+ addFrom: '100px',
+ addTo: '200px',
+}, [
+ {at: -0.3, expect: '120px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '200px'},
+ {at: 1, expect: '250px'},
+ {at: 1.5, expect: '300px'},
+]);
+
+test_composition({
+ property: 'vertical-align',
+ underlying: '100px',
+ addFrom: '10px',
+ addTo: '2px',
+}, [
+ {at: -0.5, expect: '114px'},
+ {at: 0, expect: '110px'},
+ {at: 0.5, expect: '106px'},
+ {at: 1, expect: '102px'},
+ {at: 1.5, expect: '98px'},
+]);
+
+test_composition({
+ property: 'vertical-align',
+ underlying: '10%',
+ addFrom: '100px',
+ addTo: '20%',
+}, [
+ {at: -0.3, expect: 'calc(130px + 4%)'},
+ {at: 0, expect: 'calc(100px + 10%)'},
+ {at: 0.5, expect: 'calc(50px + 20%)'},
+ {at: 1, expect: '30%'},
+ {at: 1.5, expect: 'calc(-50px + 40%)'},
+]);
+
+test_composition({
+ property: 'vertical-align',
+ underlying: '50px',
+ addFrom: '100px',
+ replaceTo: '200px',
+}, [
+ {at: -0.3, expect: '135px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.5, expect: '225px'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/fetch/metadata/appcache.tentative.https.sub.html b/tests/wpt/web-platform-tests/fetch/metadata/appcache.tentative.https.sub.html
deleted file mode 100644
index 3dc47c696fb..00000000000
--- a/tests/wpt/web-platform-tests/fetch/metadata/appcache.tentative.https.sub.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE html>
-<html manifest="/fetch/metadata/resources/record-header.py?file=appcache-manifest{{$id:uuid()}}">
-<meta name="timeout" content="long">
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src=/fetch/metadata/resources/helper.js></script>
-<script src=/common/utils.js></script>
-<body></body>
-<script>
- async_test(t => {
- const expected = {"site": "same-origin", "user": "", "mode": "no-cors", "dest": "empty"};
- window.applicationCache.oncached = window.applicationCache.onnoupdate = window.applicationCache.onerror = t.step_func(async e => {
- try {
- let response = await fetch(
- "/fetch/metadata/resources/record-header.py?retrieve=true&file=appcache-manifest{{$id}}");
- let text = await response.text();
- assert_header_equals(text, expected, "Appcache manifest");
-
- response = await fetch(
- "/fetch/metadata/resources/record-header.py?retrieve=true&file=appcache-resource{{$id}}");
- text = await response.text();
- assert_header_equals(text, expected, "Appcache resource");
- } catch (e) {
- t.step(e => {
- if (e instanceof AssertionError) {
- throw e;
- }
- assert_unreached(`Unhandled rejection with value: ${e}`);
- });
- }
- t.done();
- });
- }, "Appcache!");
-</script>
diff --git a/tests/wpt/web-platform-tests/fetch/metadata/portal.tentative.https.sub.html b/tests/wpt/web-platform-tests/fetch/metadata/portal.tentative.https.sub.html
index 4e50b6b24b3..96067ae82ab 100644
--- a/tests/wpt/web-platform-tests/fetch/metadata/portal.tentative.https.sub.html
+++ b/tests/wpt/web-platform-tests/fetch/metadata/portal.tentative.https.sub.html
@@ -30,20 +30,20 @@
"site": "same-origin",
"user": "",
"mode": "navigate",
- "dest": "document"
+ "dest": "iframe"
});
create_test("{{hosts[][www]}}:{{ports[https][0]}}", {
"site": "same-site",
"user": "",
"mode": "navigate",
- "dest": "document"
+ "dest": "iframe"
});
create_test("{{hosts[alt][www]}}:{{ports[https][0]}}", {
"site": "cross-site",
"user": "",
"mode": "navigate",
- "dest": "document"
+ "dest": "iframe"
});
</script>
diff --git a/tests/wpt/web-platform-tests/fetch/metadata/resources/record-header.py b/tests/wpt/web-platform-tests/fetch/metadata/resources/record-header.py
index 3bfb1fcdfaa..364c800a19c 100644
--- a/tests/wpt/web-platform-tests/fetch/metadata/resources/record-header.py
+++ b/tests/wpt/web-platform-tests/fetch/metadata/resources/record-header.py
@@ -99,8 +99,13 @@ def main(request, response):
file.close()
return video
- ## Return a valid style content and Content-Type ##
- if key.startswith("style") or key.startswith("embed") or key.startswith("object"):
+ ## Return valid style content and Content-Type ##
+ if key.startswith("style"):
+ response.headers.set("Content-Type", "text/css")
+ return "div { }"
+
+ ## Return a valid embed/object content and Content-Type ##
+ if key.startswith("embed") or key.startswith("object"):
response.headers.set("Content-Type", "text/html")
return "<html>EMBED!</html>"
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/coep-navigate-popup.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/coep-navigate-popup.https.html
index 21320a61b2e..faa2793e5fa 100644
--- a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/coep-navigate-popup.https.html
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/coep-navigate-popup.https.html
@@ -32,14 +32,14 @@
"opener": false
},
{
- "title": "coop unsafe-inherit/coep",
- "coop": "unsafe-inherit",
+ "title": "coop unsafe-none/coep",
+ "coop": "unsafe-none",
"coep": "require-corp",
"opener": true
},
{
- "title": "coop unsafe-inherit/no coep",
- "coop": "unsafe-inherit",
+ "title": "coop unsafe-none/no coep",
+ "coop": "unsafe-none",
"coep": "",
"opener": false
}
@@ -53,9 +53,9 @@
async_test(t => {
// For each test we open a COOP: same-origin/COEP: require-corp document in a popup and then
- // navigate that to either a same-origin or same-site document whose COOP and COEP are set as
- // per the top-most array. We then verify that this document has the correct opener for its
- // specific setup.
+ // navigate that to either a same-origin (site=="same-origin") or same-site (site=="same-site")
+ // document whose COOP and COEP are set as per the top-most array. We then verify that this
+ // document has the correct opener for its specific setup.
url_test(t, `${SAME_ORIGIN.origin}/html/cross-origin-opener-policy/resources/coop-coep.py?coop=same-origin&coep=require-corp&navigate=${encodeURIComponent(navigateURL)}`, channel, opener);
}, title);
});
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/coep-redirect.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/coep-redirect.https.html
index 73f07ddef88..2727013783f 100644
--- a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/coep-redirect.https.html
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/coep-redirect.https.html
@@ -1,5 +1,6 @@
<!doctype html>
<title>Cross-Origin-Opener-Policy and Cross-Origin-Embedder-Policy: redirects</title>
+<meta content=timeout value=long>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src="/common/get-host-info.sub.js"></script>
@@ -41,18 +42,18 @@ const coopCOEPPath = new URL("resources/coop-coep.py", window.location).pathname
"opener": false
},
{
- "title": "coop unsafe-inherit/coep to coop/coep",
- "redirectCOOP": "unsafe-inherit",
+ "title": "coop unsafe-none/coep to coop/coep",
+ "redirectCOOP": "unsafe-none",
"redirectCOEP": "require-corp",
"coop": "same-origin",
"coep": "require-corp",
"opener": true
},
{
- "title": "coop unsafe-inherit/coep to coop unsafe-inherit/coep",
- "redirectCOOP": "unsafe-inherit",
+ "title": "coop unsafe-none/coep to coop unsafe-inherit/coep",
+ "redirectCOOP": "unsafe-none",
"redirectCOEP": "require-corp",
- "coop": "unsafe-inherit",
+ "coop": "unsafe-none",
"coep": "require-corp",
"opener": true
}
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/coep.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/coep.https.html
index 64994cdfb76..de1dd56d9d5 100644
--- a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/coep.https.html
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/coep.https.html
@@ -1,5 +1,6 @@
<!doctype html>
<title>Cross-Origin-Opener-Policy and Cross-Origin-Embedder-Policy</title>
+<meta content=timeout value=long>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src="/common/get-host-info.sub.js"></script>
@@ -13,14 +14,14 @@
"opener": true
},
{
- "title": "popup with coop unsafe-inherit/coep",
- "coop": "unsafe-inherit",
+ "title": "popup with coop unsafe-none/coep",
+ "coop": "unsafe-none",
"coep": "require-corp",
"opener": true
},
{
- "title": "popup with coop unsafe-inherit without coep",
- "coop": "unsafe-inherit",
+ "title": "popup with coop unsafe-none without coep",
+ "coop": "unsafe-none",
"coep": "",
"opener": false
},
@@ -35,10 +36,10 @@
coop_coep_test(t, SAME_ORIGIN, variant.coop, variant.coep, variant.title.replace(/ /g,"-"), variant.opener);
}, `Same-origin ${variant.title}`);
- // This seems useful to test, CROSS_SITE is probably too redundant though.
+ // "same-site" is a historical value, equivalent to "unsafe-none"
async_test(t => {
coop_coep_test(t, SAME_SITE, variant.coop, variant.coep, `same-site-${variant.title.replace(/ /g,"-")}`, false);
- }, `Same-site ${variant.title}`);
+ }, `historical: "same-site" ${variant.title}`);
});
test(() => {
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/coop-navigated-popup.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/coop-navigated-popup.https.html
index 9a92dd9bde8..3c6019ace0b 100644
--- a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/coop-navigated-popup.https.html
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/coop-navigated-popup.https.html
@@ -1,7 +1,7 @@
<!doctype html>
<title>Cross-Origin-Opener-Policy: a navigated popup</title>
<!-- In particular this is different from coep-navigate-popup.https.html as this document initiates
- the navigation (and uses unsafe-allow-outgoing and no COEP as without that it cannot be
+ the navigation (and uses same-origin-allow-popups and no COEP as without that it cannot be
observed). COOP should work identically, but implementations might have used the wrong
authority. -->
<script src=/resources/testharness.js></script>
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/coop-navigated-popup.https.html.headers b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/coop-navigated-popup.https.html.headers
index a19f4400cea..d83ed86fb9b 100644
--- a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/coop-navigated-popup.https.html.headers
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/coop-navigated-popup.https.html.headers
@@ -1 +1 @@
-Cross-Origin-Opener-Policy: same-origin unsafe-allow-outgoing
+Cross-Origin-Opener-Policy: same-origin-allow-popups
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/coop-sandbox.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/coop-sandbox.https.html
index e471b1eda2e..fc16c186cad 100644
--- a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/coop-sandbox.https.html
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/coop-sandbox.https.html
@@ -15,8 +15,10 @@ async_test(t => {
const popup = window.open("resources/coop-coep.py?coop=same-origin&coep=&channel=${channel.name}");
<\/script>`;
document.body.append(frame);
- t.step_timeout(() => {
- t.done()
- }, 500);
+ window.onload = t.step_func(() => {
+ t.step_timeout(() => {
+ t.done()
+ }, 1500);
+ });
});
</script>
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/coep-navigate-popup-unsafe-inherit.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/coep-navigate-popup-unsafe-inherit.https.html
new file mode 100644
index 00000000000..73ef1ea29a2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/coep-navigate-popup-unsafe-inherit.https.html
@@ -0,0 +1,39 @@
+<!doctype html>
+<title>Historical: Cross-Origin-Opener-Policy and Cross-Origin-Embedder-Policy: a navigating popup</title>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="../resources/common.js"></script>
+<script>
+[
+ {
+ "title": "coop unsafe-inherit/coep",
+ "coop": "unsafe-inherit", // historical value, equivalent to "unsafe-none"
+ "coep": "require-corp",
+ "opener": true
+ },
+ {
+ "title": "coop unsafe-inherit/no coep",
+ "coop": "unsafe-inherit", // historical value, equivalent to "unsafe-none"
+ "coep": "",
+ "opener": false
+ }
+].forEach(variant => {
+ ["same-origin", "same-site"].forEach(site => {
+ const title = `Popup navigating to ${site} with ${variant.title}`;
+ const channel = title.replace(/ /g,"-");
+ const navigateHost = site === "same-origin" ? SAME_ORIGIN : SAME_SITE;
+ const navigateURL = `${navigateHost.origin}/html/cross-origin-opener-policy/resources/coop-coep.py?coop=${variant.coop}&coep=${variant.coep}&channel=${channel}`;
+ const opener = site === "same-origin" ? variant.opener : false;
+
+ async_test(t => {
+ // For each test we open a COOP: same-origin/COEP: require-corp document in a popup and then
+ // navigate that to either a document with same origin (site=="same-origin") or
+ // not-same-origin (site=="same-site") whose COOP and COEP are set as per the top-most array.
+ // We then verify that this document has the correct opener for its specific setup.
+ url_test(t, `${SAME_ORIGIN.origin}/html/cross-origin-opener-policy/resources/coop-coep.py?coop=same-origin&coep=require-corp&navigate=${encodeURIComponent(navigateURL)}`, channel, opener);
+ }, title);
+ });
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-cross-origin.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-cross-origin.https.html
new file mode 100644
index 00000000000..a8b6d543cd0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-cross-origin.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="../resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+ // popup Origin, popup COOP, expect opener
+ [CROSS_ORIGIN, "", true],
+ [CROSS_ORIGIN, "unsafe-none", true],
+ [CROSS_ORIGIN, "jibberish", true],
+ [CROSS_ORIGIN, "same-site", true], // historical value, equivalent to "unsafe-none"
+ [CROSS_ORIGIN, "same-site unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+ [CROSS_ORIGIN, "same-origin unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+ [CROSS_ORIGIN, "same-origin", false],
+ [CROSS_ORIGIN, "same-origin-allow-popups", false],
+];
+
+run_coop_tests("same-origin unsafe-allow-outgoing", tests); // historical value, equivalent to "unsafe-none"
+
+</script>
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-unsafe-allow-outgoing.https.html.headers b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-cross-origin.https.html.headers
index a19f4400cea..a19f4400cea 100644
--- a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-unsafe-allow-outgoing.https.html.headers
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-cross-origin.https.html.headers
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-origin.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-origin.https.html
new file mode 100644
index 00000000000..aaaae2dc317
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-origin.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="../resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+ // popup Origin, popup COOP, expect opener
+ [SAME_ORIGIN, "", true],
+ [SAME_ORIGIN, "unsafe-none", true],
+ [SAME_ORIGIN, "jibberish", true],
+ [SAME_ORIGIN, "same-site", true], // historical value, equivalent to "unsafe-none"
+ [SAME_ORIGIN, "same-site unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+ [SAME_ORIGIN, "same-origin unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+ [SAME_ORIGIN, "same-origin", false],
+ [SAME_ORIGIN, "same-origin-allow-popups", false],
+];
+
+run_coop_tests("same-origin unsafe-allow-outgoing", tests); // historical value, equivalent to "unsafe-none"
+
+</script>
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-origin.https.html.headers b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-origin.https.html.headers
new file mode 100644
index 00000000000..a19f4400cea
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-origin.https.html.headers
@@ -0,0 +1 @@
+Cross-Origin-Opener-Policy: same-origin unsafe-allow-outgoing
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-site.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-site.https.html
new file mode 100644
index 00000000000..fd58b06f783
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-site.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="../resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+ // popup Origin, popup COOP, expect opener
+ [SAME_SITE, "", true],
+ [SAME_SITE, "unsafe-none", true],
+ [SAME_SITE, "jibberish", true],
+ [SAME_SITE, "same-site", true], // historical value, equivalent to "unsafe-none"
+ [SAME_SITE, "same-site unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+ [SAME_SITE, "same-origin unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+ [SAME_SITE, "same-origin", false],
+ [SAME_SITE, "same-origin-allow-popups", false],
+];
+
+run_coop_tests("same-origin unsafe-allow-outgoing", tests); // historical value, equivalent to "unsafe-none"
+
+</script>
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-site.https.html.headers b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-site.https.html.headers
new file mode 100644
index 00000000000..a19f4400cea
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-site.https.html.headers
@@ -0,0 +1 @@
+Cross-Origin-Opener-Policy: same-origin unsafe-allow-outgoing
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-cross-origin.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-cross-origin.https.html
new file mode 100644
index 00000000000..7330ff75bcf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-cross-origin.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="../resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+ // popup Origin, popup COOP, expect opener
+ [CROSS_ORIGIN, "", true],
+ [CROSS_ORIGIN, "unsafe-none", true],
+ [CROSS_ORIGIN, "jibberish", true],
+ [CROSS_ORIGIN, "same-site", true], // historical value, equivalent to "unsafe-none"
+ [CROSS_ORIGIN, "same-site unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+ [CROSS_ORIGIN, "same-origin unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+ [CROSS_ORIGIN, "same-origin", false],
+ [CROSS_ORIGIN, "same-origin-allow-popups", false],
+];
+
+run_coop_tests("same-site unsafe-allow-outgoing", tests); // historical value, equivalent to "unsafe-none"
+
+</script>
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-site-unsafe-allow-outgoing.https.html.headers b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-cross-origin.https.html.headers
index ab7b2894815..ab7b2894815 100644
--- a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-site-unsafe-allow-outgoing.https.html.headers
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-cross-origin.https.html.headers
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-origin.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-origin.https.html
new file mode 100644
index 00000000000..01cc6719fd3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-origin.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="../resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+ // popup Origin, popup COOP, expect opener
+ [SAME_ORIGIN, "", true],
+ [SAME_ORIGIN, "unsafe-none", true],
+ [SAME_ORIGIN, "jibberish", true],
+ [SAME_ORIGIN, "same-site", true], // historical value, equivalent to "unsafe-none"
+ [SAME_ORIGIN, "same-site unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+ [SAME_ORIGIN, "same-origin unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+ [SAME_ORIGIN, "same-origin", false],
+ [SAME_ORIGIN, "same-origin-allow-popups", false],
+];
+
+run_coop_tests("same-site unsafe-allow-outgoing", tests); // historical value, equivalent to "unsafe-none"
+
+</script>
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-origin.https.html.headers b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-origin.https.html.headers
new file mode 100644
index 00000000000..ab7b2894815
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-origin.https.html.headers
@@ -0,0 +1 @@
+Cross-Origin-Opener-Policy: same-site unsafe-allow-outgoing
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-site.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-site.https.html
new file mode 100644
index 00000000000..b1a664dd9a5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-site.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="../resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+ // popup Origin, popup COOP, expect opener
+ [SAME_SITE, "", true],
+ [SAME_SITE, "unsafe-none", true],
+ [SAME_SITE, "jibberish", true],
+ [SAME_SITE, "same-site", true], // historical value, equivalent to "unsafe-none"
+ [SAME_SITE, "same-site unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+ [SAME_SITE, "same-origin unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+ [SAME_SITE, "same-origin", false],
+ [SAME_SITE, "same-origin-allow-popups", false],
+];
+
+run_coop_tests("same-site unsafe-allow-outgoing", tests); // historical value, equivalent to "unsafe-none"
+
+</script>
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-site.https.html.headers b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-site.https.html.headers
new file mode 100644
index 00000000000..ab7b2894815
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-site.https.html.headers
@@ -0,0 +1 @@
+Cross-Origin-Opener-Policy: same-site unsafe-allow-outgoing
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-with-cross-origin.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-with-cross-origin.https.html
new file mode 100644
index 00000000000..d0fc7c79841
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-with-cross-origin.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="../resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+ // popup Origin, popup COOP, expect opener
+ [CROSS_ORIGIN, "", true],
+ [CROSS_ORIGIN, "unsafe-none", true],
+ [CROSS_ORIGIN, "jibberish", true],
+ [CROSS_ORIGIN, "same-site", true], // historical value, equivalent to "unsafe-none"
+ [CROSS_ORIGIN, "same-site unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+ [CROSS_ORIGIN, "same-origin unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+ [CROSS_ORIGIN, "same-origin", false],
+ [CROSS_ORIGIN, "same-origin-allow-popups", false],
+];
+
+run_coop_tests("same-site", tests); // historical value, equivalent to "unsafe-none"
+
+</script>
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-site.https.html.headers b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-with-cross-origin.https.html.headers
index 34bd099a302..34bd099a302 100644
--- a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-site.https.html.headers
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-with-cross-origin.https.html.headers
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-with-same-origin.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-with-same-origin.https.html
new file mode 100644
index 00000000000..67d2523e28d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-with-same-origin.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="../resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+ // popup Origin, popup COOP, expect opener
+ [SAME_ORIGIN, "", true],
+ [SAME_ORIGIN, "unsafe-none", true],
+ [SAME_ORIGIN, "jibberish", true],
+ [SAME_ORIGIN, "same-site", true], // historical value, equivalent to "unsafe-none"
+ [SAME_ORIGIN, "same-site unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+ [SAME_ORIGIN, "same-origin unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+ [SAME_ORIGIN, "same-origin", false],
+ [SAME_ORIGIN, "same-origin-allow-popups", false],
+];
+
+run_coop_tests("same-site", tests); // historical value, equivalent to "unsafe-none"
+
+</script>
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-with-same-origin.https.html.headers b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-with-same-origin.https.html.headers
new file mode 100644
index 00000000000..34bd099a302
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-with-same-origin.https.html.headers
@@ -0,0 +1 @@
+Cross-Origin-Opener-Policy: same-site
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-with-same-site.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-with-same-site.https.html
new file mode 100644
index 00000000000..78b7ca8fcad
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-with-same-site.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="../resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+ // popup Origin, popup COOP, expect opener
+ [SAME_SITE, "", true],
+ [SAME_SITE, "unsafe-none", true],
+ [SAME_SITE, "jibberish", true],
+ [SAME_SITE, "same-site", true], // historical value, equivalent to "unsafe-none"
+ [SAME_SITE, "same-site unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+ [SAME_SITE, "same-origin unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+ [SAME_SITE, "same-origin", false],
+ [SAME_SITE, "same-origin-allow-popups", false],
+];
+
+run_coop_tests("same-site", tests); // historical value, equivalent to "unsafe-none"
+
+</script>
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-with-same-site.https.html.headers b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-with-same-site.https.html.headers
new file mode 100644
index 00000000000..34bd099a302
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/historical/popup-same-site-with-same-site.https.html.headers
@@ -0,0 +1 @@
+Cross-Origin-Opener-Policy: same-site
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/no-https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/no-https.html
index 014ba1f333b..f4e926b2eb2 100644
--- a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/no-https.html
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/no-https.html
@@ -5,15 +5,14 @@
<script src=/resources/testharnessreport.js></script>
<script>
async_test(t => {
- const popup = window.open("/common/blank.html");
- assert_equals(window, popup.opener);
-
- t.step_timeout(() => {
- assert_false(popup.closed);
- assert_equals(popup.location.pathname, "/common/blank.html");
+ const popup = window.open("resources/call-functionCalledByOpenee.html");
+ t.add_cleanup(() => {
popup.close();
- t.done();
- }, 500);
+ });
+ window.functionCalledByOpenee = t.step_func_done(() => {
+ assert_false(popup.closed);
+ });
+ assert_equals(window, popup.opener);
}, "Cross-Origin-Opener-Policy only works over secure contexts");
test(() => {
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin.https.html.headers b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-meta-http-equiv.https.html.headers
index 46ad58d83bf..46ad58d83bf 100644
--- a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin.https.html.headers
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-meta-http-equiv.https.html.headers
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-none.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-none.https.html
deleted file mode 100644
index 62633457d3f..00000000000
--- a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-none.https.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src="/common/get-host-info.sub.js"></script>
-<script src="resources/common.js"></script>
-
-<div id=log></div>
-<script>
-
-let tests = [
- // popup Origin, popup COOP, expect opener
- [SAME_ORIGIN, "", true],
- [SAME_ORIGIN, "jibberish", true],
- [SAME_ORIGIN, "same-site", false],
- [SAME_ORIGIN, "same-site unsafe-allow-outgoing", false],
- [SAME_ORIGIN, "same-origin", false],
- [SAME_ORIGIN, "same-origin unsafe-allow-outgoing", false],
-
- [SAME_SITE, "", true],
- [SAME_SITE, "jibberish", true],
- [SAME_SITE, "same-site", false],
- [SAME_SITE, "same-site unsafe-allow-outgoing", false],
- [SAME_SITE, "same-origin", false],
- [SAME_SITE, "same-origin unsafe-allow-outgoing", false],
-
- [CROSS_ORIGIN, "", true],
- [CROSS_ORIGIN, "jibberish", true],
- [CROSS_ORIGIN, "same-site", false],
- [CROSS_ORIGIN, "same-site unsafe-allow-outgoing", false],
- [CROSS_ORIGIN, "same-origin", false],
- [CROSS_ORIGIN, "same-origin unsafe-allow-outgoing", false],
-];
-
-run_coop_tests("none", tests);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-cross-origin.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-cross-origin.https.html
new file mode 100644
index 00000000000..cea3788ba83
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-cross-origin.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+ // popup Origin, popup COOP, expect opener
+ [CROSS_ORIGIN, "", true],
+ [CROSS_ORIGIN, "unsafe-none", true],
+ [CROSS_ORIGIN, "jibberish", true],
+ [CROSS_ORIGIN, "same-site", true], // historical value, equivalent to "unsafe-none"
+ [CROSS_ORIGIN, "same-site unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+ [CROSS_ORIGIN, "same-origin unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+ [CROSS_ORIGIN, "same-origin", false],
+ [CROSS_ORIGIN, "same-origin-allow-popups", false],
+];
+
+run_coop_tests("same-origin-allow-popups", tests);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-cross-origin.https.html.headers b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-cross-origin.https.html.headers
new file mode 100644
index 00000000000..d83ed86fb9b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-cross-origin.https.html.headers
@@ -0,0 +1 @@
+Cross-Origin-Opener-Policy: same-origin-allow-popups
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-origin.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-origin.https.html
new file mode 100644
index 00000000000..a50231f8228
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-origin.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+ // popup Origin, popup COOP, expect opener
+ [SAME_ORIGIN, "", true],
+ [SAME_ORIGIN, "unsafe-none", true],
+ [SAME_ORIGIN, "jibberish", true],
+ [SAME_ORIGIN, "same-site", true], // historical value, equivalent to "unsafe-none"
+ [SAME_ORIGIN, "same-site unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+ [SAME_ORIGIN, "same-origin unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+ [SAME_ORIGIN, "same-origin", false],
+ [SAME_ORIGIN, "same-origin-allow-popups", true],
+];
+
+run_coop_tests("same-origin-allow-popups", tests);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-origin.https.html.headers b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-origin.https.html.headers
new file mode 100644
index 00000000000..d83ed86fb9b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-origin.https.html.headers
@@ -0,0 +1 @@
+Cross-Origin-Opener-Policy: same-origin-allow-popups
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-site.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-site.https.html
new file mode 100644
index 00000000000..53b4263a70f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-site.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+ // popup Origin, popup COOP, expect opener
+ [SAME_SITE, "", true],
+ [SAME_SITE, "unsafe-none", true],
+ [SAME_SITE, "jibberish", true],
+ [SAME_SITE, "same-site", true], // historical value, equivalent to "unsafe-none"
+ [SAME_SITE, "same-site unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+ [SAME_SITE, "same-origin unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+ [SAME_SITE, "same-origin", false],
+ [SAME_SITE, "same-origin-allow-popups", false],
+];
+
+run_coop_tests("same-origin-allow-popups", tests);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-site.https.html.headers b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-site.https.html.headers
new file mode 100644
index 00000000000..d83ed86fb9b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-site.https.html.headers
@@ -0,0 +1 @@
+Cross-Origin-Opener-Policy: same-origin-allow-popups
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-non-initial-about-blank.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-non-initial-about-blank.https.html
index 65ec3b26aa0..d4005ac20d8 100644
--- a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-non-initial-about-blank.https.html
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-non-initial-about-blank.https.html
@@ -6,10 +6,12 @@
async_test(t => {
const popup = window.open("resources/coop-coep.py?coop=same-origin&coep=&navigate=about:blank");
assert_equals(window, popup.opener);
- t.step_timeout(() => {
- assert_equals(popup.location.href, "about:blank");
- popup.close();
- t.done();
- }, 500);
+ window.onload = t.step_func(() => {
+ t.step_timeout(() => {
+ assert_equals(popup.location.href, "about:blank");
+ popup.close();
+ t.done();
+ }, 1500);
+ });
}, "Navigating a popup to about:blank");
</script>
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-unsafe-allow-outgoing.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-unsafe-allow-outgoing.https.html
deleted file mode 100644
index 2f8ebc3be3f..00000000000
--- a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-unsafe-allow-outgoing.https.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src="/common/get-host-info.sub.js"></script>
-<script src="resources/common.js"></script>
-
-<div id=log></div>
-<script>
-
-let tests = [
- // popup Origin, popup COOP, expect opener
- [SAME_ORIGIN, "", true],
- [SAME_ORIGIN, "jibberish", true],
- [SAME_ORIGIN, "same-site", false],
- [SAME_ORIGIN, "same-site unsafe-allow-outgoing", false],
- [SAME_ORIGIN, "same-origin", false],
- [SAME_ORIGIN, "same-origin unsafe-allow-outgoing", true],
-
- [SAME_SITE, "", true],
- [SAME_SITE, "jibberish", true],
- [SAME_SITE, "same-site", false],
- [SAME_SITE, "same-site unsafe-allow-outgoing", false],
- [SAME_SITE, "same-origin", false],
- [SAME_SITE, "same-origin unsafe-allow-outgoing", false],
-
- [CROSS_ORIGIN, "", true],
- [CROSS_ORIGIN, "jibberish", true],
- [CROSS_ORIGIN, "same-site", false],
- [CROSS_ORIGIN, "same-site unsafe-allow-outgoing", false],
- [CROSS_ORIGIN, "same-origin", false],
- [CROSS_ORIGIN, "same-origin unsafe-allow-outgoing", false],
-];
-
-run_coop_tests("same-origin_unsafe-allow-outgoing", tests);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-with-cross-origin.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-with-cross-origin.https.html
new file mode 100644
index 00000000000..9f7d27b3c8d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-with-cross-origin.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+ // popup Origin, popup COOP, expect opener
+ [CROSS_ORIGIN, "", false],
+ [CROSS_ORIGIN, "unsafe-none", false],
+ [CROSS_ORIGIN, "jibberish", false],
+ [CROSS_ORIGIN, "same-site", false], // historical value, equivalent to "unsafe-none"
+ [CROSS_ORIGIN, "same-site unsafe-allow-outgoing", false], // historical value, equivalent to "unsafe-none"
+ [CROSS_ORIGIN, "same-origin unsafe-allow-outgoing", false], // historical value, equivalent to "unsafe-none"
+ [CROSS_ORIGIN, "same-origin", false],
+ [CROSS_ORIGIN, "same-origin-allow-popups", false],
+];
+
+run_coop_tests("same-origin", tests);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-with-cross-origin.https.html.headers b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-with-cross-origin.https.html.headers
new file mode 100644
index 00000000000..46ad58d83bf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-with-cross-origin.https.html.headers
@@ -0,0 +1 @@
+Cross-Origin-Opener-Policy: same-origin
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-with-same-origin.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-with-same-origin.https.html
new file mode 100644
index 00000000000..c84219a80f5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-with-same-origin.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+ // popup Origin, popup COOP, expect opener
+ [SAME_ORIGIN, "", false],
+ [SAME_ORIGIN, "unsafe-none", false],
+ [SAME_ORIGIN, "jibberish", false],
+ [SAME_ORIGIN, "same-site", false], // historical value, equivalent to "unsafe-none"
+ [SAME_ORIGIN, "same-site unsafe-allow-outgoing", false], // historical value, equivalent to "unsafe-none"
+ [SAME_ORIGIN, "same-origin unsafe-allow-outgoing", false], // historical value, equivalent to "unsafe-none"
+ [SAME_ORIGIN, "same-origin", true],
+ [SAME_ORIGIN, "same-origin-allow-popups", false],
+];
+
+run_coop_tests("same-origin", tests);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-with-same-origin.https.html.headers b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-with-same-origin.https.html.headers
new file mode 100644
index 00000000000..46ad58d83bf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-with-same-origin.https.html.headers
@@ -0,0 +1 @@
+Cross-Origin-Opener-Policy: same-origin
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-with-same-site.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-with-same-site.https.html
new file mode 100644
index 00000000000..b875cc2e0e4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-with-same-site.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+ // popup Origin, popup COOP, expect opener
+ [SAME_SITE, "", false],
+ [SAME_SITE, "unsafe-none", false],
+ [SAME_SITE, "jibberish", false],
+ [SAME_SITE, "same-site", false], // historical value, equivalent to "unsafe-none"
+ [SAME_SITE, "same-site unsafe-allow-outgoing", false], // historical value, equivalent to "unsafe-none"
+ [SAME_SITE, "same-origin unsafe-allow-outgoing", false], // historical value, equivalent to "unsafe-none"
+ [SAME_SITE, "same-origin", false],
+ [SAME_SITE, "same-origin-allow-popups", false],
+];
+
+run_coop_tests("same-origin", tests);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-with-same-site.https.html.headers b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-with-same-site.https.html.headers
new file mode 100644
index 00000000000..46ad58d83bf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin-with-same-site.https.html.headers
@@ -0,0 +1 @@
+Cross-Origin-Opener-Policy: same-origin
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin.https.html
deleted file mode 100644
index 964011ff762..00000000000
--- a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-origin.https.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src="/common/get-host-info.sub.js"></script>
-<script src="resources/common.js"></script>
-
-<div id=log></div>
-<script>
-
-let tests = [
- // popup Origin, popup COOP, expect opener
- [SAME_ORIGIN, "", false],
- [SAME_ORIGIN, "jibberish", false],
- [SAME_ORIGIN, "same-site", false],
- [SAME_ORIGIN, "same-site unsafe-allow-outgoing", false],
- [SAME_ORIGIN, "same-origin", true],
- [SAME_ORIGIN, "same-origin unsafe-allow-outgoing", false],
-
- [SAME_SITE, "", false],
- [SAME_SITE, "jibberish", false],
- [SAME_SITE, "same-site", false],
- [SAME_SITE, "same-site unsafe-allow-outgoing", false],
- [SAME_SITE, "same-origin", false],
- [SAME_SITE, "same-origin unsafe-allow-outgoing", false],
-
- [CROSS_ORIGIN, "", false],
- [CROSS_ORIGIN, "jibberish", false],
- [CROSS_ORIGIN, "same-site", false],
- [CROSS_ORIGIN, "same-site unsafe-allow-outgoing", false],
- [CROSS_ORIGIN, "same-origin", false],
- [CROSS_ORIGIN, "same-origin unsafe-allow-outgoing", false],
-];
-
-run_coop_tests("same-origin", tests);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-site-unsafe-allow-outgoing.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-site-unsafe-allow-outgoing.https.html
deleted file mode 100644
index 18ee909d186..00000000000
--- a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-site-unsafe-allow-outgoing.https.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src="/common/get-host-info.sub.js"></script>
-<script src="resources/common.js"></script>
-
-<div id=log></div>
-<script>
-
-let tests = [
- // popup Origin, popup COOP, expect opener
- [SAME_ORIGIN, "", true],
- [SAME_ORIGIN, "jibberish", true],
- [SAME_ORIGIN, "same-site", false],
- [SAME_ORIGIN, "same-site unsafe-allow-outgoing", true],
- [SAME_ORIGIN, "same-origin", false],
- [SAME_ORIGIN, "same-origin unsafe-allow-outgoing", false],
-
- [SAME_SITE, "", true],
- [SAME_SITE, "jibberish", true],
- [SAME_SITE, "same-site", false],
- [SAME_SITE, "same-site unsafe-allow-outgoing", true],
- [SAME_SITE, "same-origin", false],
- [SAME_SITE, "same-origin unsafe-allow-outgoing", false],
-
- [CROSS_ORIGIN, "", true],
- [CROSS_ORIGIN, "jibberish", true],
- [CROSS_ORIGIN, "same-site", false],
- [CROSS_ORIGIN, "same-site unsafe-allow-outgoing", false],
- [CROSS_ORIGIN, "same-origin", false],
- [CROSS_ORIGIN, "same-origin unsafe-allow-outgoing", false],
-];
-
-run_coop_tests("same-site_unsafe-allow-outgoing", tests);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-site.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-site.https.html
deleted file mode 100644
index 9a0db2765da..00000000000
--- a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-same-site.https.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src="/common/get-host-info.sub.js"></script>
-<script src="resources/common.js"></script>
-
-<div id=log></div>
-<script>
-
-let tests = [
- // popup Origin, popup COOP, expect opener
- [SAME_ORIGIN, "", false],
- [SAME_ORIGIN, "jibberish", false],
- [SAME_ORIGIN, "same-site", true],
- [SAME_ORIGIN, "same-site unsafe-allow-outgoing", false],
- [SAME_ORIGIN, "same-origin", false],
- [SAME_ORIGIN, "same-origin unsafe-allow-outgoing", false],
-
- [SAME_SITE, "", false],
- [SAME_SITE, "jibberish", false],
- [SAME_SITE, "same-site", true],
- [SAME_SITE, "same-site unsafe-allow-outgoing", false],
- [SAME_SITE, "same-origin", false],
- [SAME_SITE, "same-origin unsafe-allow-outgoing", false],
-
- [CROSS_ORIGIN, "", false],
- [CROSS_ORIGIN, "jibberish", false],
- [CROSS_ORIGIN, "same-site", false],
- [CROSS_ORIGIN, "same-site unsafe-allow-outgoing", false],
- [CROSS_ORIGIN, "same-origin", false],
- [CROSS_ORIGIN, "same-origin unsafe-allow-outgoing", false],
-];
-
-run_coop_tests("same-site", tests);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-unsafe-none-with-cross-origin.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-unsafe-none-with-cross-origin.https.html
new file mode 100644
index 00000000000..5cbf5b4c20c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-unsafe-none-with-cross-origin.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+ // popup Origin, popup COOP, expect opener
+ [CROSS_ORIGIN, "", true],
+ [CROSS_ORIGIN, "unsafe-none", true],
+ [CROSS_ORIGIN, "jibberish", true],
+ [CROSS_ORIGIN, "same-site", true], // historical value, equivalent to "unsafe-none"
+ [CROSS_ORIGIN, "same-site unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+ [CROSS_ORIGIN, "same-origin unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+ [CROSS_ORIGIN, "same-origin", false],
+ [CROSS_ORIGIN, "same-origin-allow-popups", false],
+];
+
+run_coop_tests("unsafe-none", tests);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-unsafe-none-with-same-origin.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-unsafe-none-with-same-origin.https.html
new file mode 100644
index 00000000000..f8a4ebe7128
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-unsafe-none-with-same-origin.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+ // popup Origin, popup COOP, expect opener
+ [SAME_ORIGIN, "", true],
+ [SAME_ORIGIN, "unsafe-none", true],
+ [SAME_ORIGIN, "jibberish", true],
+ [SAME_ORIGIN, "same-site", true], // historical value, equivalent to "unsafe-none"
+ [SAME_ORIGIN, "same-site unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+ [SAME_ORIGIN, "same-origin unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+ [SAME_ORIGIN, "same-origin", false],
+ [SAME_ORIGIN, "same-origin-allow-popups", false],
+];
+
+run_coop_tests("unsafe-none", tests);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-unsafe-none-with-same-origin.https.html.headers b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-unsafe-none-with-same-origin.https.html.headers
new file mode 100644
index 00000000000..073ce7adfbd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-unsafe-none-with-same-origin.https.html.headers
@@ -0,0 +1 @@
+Cross-Origin-Opener-Policy: unsafe-none
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-unsafe-none-with-same-site.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-unsafe-none-with-same-site.https.html
new file mode 100644
index 00000000000..e38acf4fcb1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-unsafe-none-with-same-site.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+ // popup Origin, popup COOP, expect opener
+ [SAME_SITE, "", true],
+ [SAME_SITE, "unsafe-none", true],
+ [SAME_SITE, "jibberish", true],
+ [SAME_SITE, "same-site", true], // historical value, equivalent to "unsafe-none"
+ [SAME_SITE, "same-site unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+ [SAME_SITE, "same-origin unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+ [SAME_SITE, "same-origin", false],
+ [SAME_SITE, "same-origin-allow-popups", false],
+];
+
+run_coop_tests("unsafe-none", tests);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-unspecified-with-cross-origin.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-unspecified-with-cross-origin.https.html
new file mode 100644
index 00000000000..d89398cd653
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-unspecified-with-cross-origin.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+ // popup Origin, popup COOP, expect opener
+ [CROSS_ORIGIN, "", true],
+ [CROSS_ORIGIN, "unsafe-none", true],
+ [CROSS_ORIGIN, "jibberish", true],
+ [CROSS_ORIGIN, "same-site", true], // historical value, equivalent to "unsafe-none"
+ [CROSS_ORIGIN, "same-site unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+ [CROSS_ORIGIN, "same-origin unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+ [CROSS_ORIGIN, "same-origin", false],
+ [CROSS_ORIGIN, "same-origin-allow-popups", false],
+];
+
+run_coop_tests("unspecified", tests);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-unspecified-with-same-origin.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-unspecified-with-same-origin.https.html
new file mode 100644
index 00000000000..cb6fc02ac17
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-unspecified-with-same-origin.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+ // popup Origin, popup COOP, expect opener
+ [SAME_ORIGIN, "", true],
+ [SAME_ORIGIN, "unsafe-none", true],
+ [SAME_ORIGIN, "jibberish", true],
+ [SAME_ORIGIN, "same-site", true], // historical value, equivalent to "unsafe-none"
+ [SAME_ORIGIN, "same-site unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+ [SAME_ORIGIN, "same-origin unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+ [SAME_ORIGIN, "same-origin", false],
+ [SAME_ORIGIN, "same-origin-allow-popups", false],
+];
+
+run_coop_tests("unspecified", tests);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-unspecified-with-same-site.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-unspecified-with-same-site.https.html
new file mode 100644
index 00000000000..6e0edfa0423
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/popup-unspecified-with-same-site.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+ // popup Origin, popup COOP, expect opener
+ [SAME_SITE, "", true],
+ [SAME_SITE, "unsafe-none", true],
+ [SAME_SITE, "jibberish", true],
+ [SAME_SITE, "same-site", true], // historical value, equivalent to "unsafe-none"
+ [SAME_SITE, "same-site unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+ [SAME_SITE, "same-origin unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+ [SAME_SITE, "same-origin", false],
+ [SAME_SITE, "same-origin-allow-popups", false],
+];
+
+run_coop_tests("unspecified", tests);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/resources/call-functionCalledByOpenee.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/resources/call-functionCalledByOpenee.html
new file mode 100644
index 00000000000..d0ff0b723e0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/resources/call-functionCalledByOpenee.html
@@ -0,0 +1,5 @@
+<!doctype html>
+<meta charset=utf-8>
+<script>
+window.opener.functionCalledByOpenee();
+</script>
diff --git a/tests/wpt/web-platform-tests/html/dom/idlharness.worker.js b/tests/wpt/web-platform-tests/html/dom/idlharness.worker.js
index b720d54f3d9..feddaf54c92 100644
--- a/tests/wpt/web-platform-tests/html/dom/idlharness.worker.js
+++ b/tests/wpt/web-platform-tests/html/dom/idlharness.worker.js
@@ -7,6 +7,7 @@ idl_test(
["html"],
["dom", "cssom", "touch-events", "uievents"],
idlArray => {
+ idlArray.add_untested_idls('typedef Window WindowProxy;');
idlArray.add_objects({
WorkerLocation: ['self.location'],
WorkerNavigator: ['self.navigator'],
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-rangeOverflow.html b/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-rangeOverflow.html
index fedf2ea4e4f..2f69407592e 100644
--- a/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-rangeOverflow.html
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-rangeOverflow.html
@@ -91,7 +91,11 @@
{conditions: {max: "12:00:00.1", value: "12:00:00.2"}, expected: true, name: "[target] The value is greater than max(with millisecond in 1 digit)"},
{conditions: {max: "12:00:00.01", value: "12:00:00.02"}, expected: true, name: "[target] The value is greater than max(with millisecond in 2 digit)"},
{conditions: {max: "12:00:00.001", value: "12:00:00.002"}, expected: true, name: "[target] The value is greater than max(with millisecond in 3 digit)"},
- {conditions: {max: "12:00:00", value: "12:01"}, expected: true, name: "[target] The time missing second part is valid"}
+ {conditions: {max: "12:00:00", value: "12:01"}, expected: true, name: "[target] The time missing second part is valid"},
+ {conditions: {max: "12:00:00", min: "14:00:00", value: "12:00:00"}, expected: false, name: "[target] The time is max for reversed range"},
+ {conditions: {max: "12:00:00", min: "14:00:00", value: "13:00:00"}, expected: true, name: "[target] The time is outside the accepted range for reversed range"},
+ {conditions: {max: "12:00:00", min: "14:00:00", value: "14:00:00"}, expected: false, name: "[target] The time is min for reversed range"},
+ {conditions: {max: "12:00:00", min: "14:00:00", value: "15:00:00"}, expected: false, name: "[target] The time is inside the accepted range for reversed range"},
]
},
{
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-rangeUnderflow.html b/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-rangeUnderflow.html
index 8ac3aae1279..c939a94c37e 100644
--- a/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-rangeUnderflow.html
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-rangeUnderflow.html
@@ -89,7 +89,11 @@
{conditions: {min: "12:00:00.2", value: "12:00:00.1"}, expected: true, name: "[target] The value is less than min(with millisecond in 1 digit)"},
{conditions: {min: "12:00:00.02", value: "12:00:00.01"}, expected: true, name: "[target] The value is less than min(with millisecond in 2 digit)"},
{conditions: {min: "12:00:00.002", value: "12:00:00.001"}, expected: true, name: "[target] The value is less than min(with millisecond in 3 digit)"},
- {conditions: {min: "12:00:00", value: "11:59"}, expected: true, name: "[target] The time missing second part is valid"}
+ {conditions: {min: "12:00:00", value: "11:59"}, expected: true, name: "[target] The time missing second part is valid"},
+ {conditions: {min: "14:00:00", max: "12:00:00", value: "12:00:00"}, expected: false, name: "[target] The time is max for reversed range"},
+ {conditions: {min: "14:00:00", max: "12:00:00", value: "13:00:00"}, expected: true, name: "[target] The time is outside the accepted range for reversed range"},
+ {conditions: {min: "14:00:00", max: "12:00:00", value: "14:00:00"}, expected: false, name: "[target] The time is min for reversed range"},
+ {conditions: {min: "14:00:00", max: "12:00:00", value: "15:00:00"}, expected: false, name: "[target] The time is inside the accepted range for reversed range"},
]
},
{
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-valueMissing.html b/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-valueMissing.html
index 2e1c666436a..3229527fabc 100644
--- a/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-valueMissing.html
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-valueMissing.html
@@ -132,7 +132,8 @@
testData: [
{conditions: {required: false, checked: false, name: "test4"}, expected: false, name: "[target] The required attribute is not set"},
{conditions: {required: true, checked: true, name: "test5"}, expected: false, name: "[target] The checked attribute is true"},
- {conditions: {required: true, checked: false, name: "test6"}, expected: true, name: "[target] The checked attribute is false"}
+ {conditions: {required: true, checked: false, name: "test6"}, expected: true, name: "[target] The checked attribute is false"},
+ {conditions: {required: true, checked: false, name: ""}, expected: false, name: "[target] The checked attribute is false and the name attribute is empty"}
]
},
{
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-valueasdate.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-valueasdate.html
new file mode 100644
index 00000000000..a958e991ec5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-valueasdate.html
@@ -0,0 +1,109 @@
+<!DOCTYPE HTML>
+<meta charset="utf-8">
+<html>
+ <head>
+ <title>HTMLInputElement valueAsDate</title>
+ <link rel="author" title="pmdartus" href="mailto:dartus.pierremarie@gmail.com">
+ <link rel=help href="https://html.spec.whatwg.org/#dom-input-valueasdate">
+
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <h3>input_valueAsDate</h3>
+ <hr>
+ <div id="log"></div>
+
+ <input id="input_date" type="date" />
+ <input id="input_month" type="month" />
+ <input id="input_week" type="week" />
+ <input id="input_time" type="time" />
+
+ <script>
+ "use strict";
+
+ function testValueAsDateGetter(type, element, cases) {
+ for (const [actualValue, expectedValueAsDate] of cases) {
+ test(
+ () => {
+ element.value = actualValue;
+
+ const actualValueAsDate = element.valueAsDate;
+ if (actualValueAsDate instanceof Date) {
+ assert_equals(
+ actualValueAsDate.getTime(),
+ expectedValueAsDate.getTime(),
+ `valueAsDate returns an invalid date (actual: ${actualValueAsDate.toISOString()}, ` +
+ `expected: ${expectedValueAsDate.toISOString()})`
+ );
+ } else {
+ assert_equals(actualValueAsDate, expectedValueAsDate);
+ }
+ },
+ `valueAsDate getter on type ${type} (actual value: ${actualValue}, ` +
+ `expected valueAsDate: ${expectedValueAsDate})`
+ );
+ }
+ }
+
+ function testValueAsDateSetter(type, element, cases) {
+ for (const [valueAsDate, expectedValue] of cases) {
+ test(() => {
+ element.valueAsDate = valueAsDate;
+ assert_equals(element.value, expectedValue);
+ }, `valueAsDate setter on type ${type} (actual valueAsDate: ${valueAsDate}, expected value: ${expectedValue})`);
+ }
+ }
+
+ const dateInput = document.getElementById("input_date");
+ testValueAsDateGetter("date", dateInput, [
+ ["", null],
+ ["0000-12-10", null],
+ ["2019-00-12", null],
+ ["2019-12-00", null],
+ ["2019-13-10", null],
+ ["2019-02-29", null],
+ ["2019-12-10", new Date("2019-12-10T00:00:00.000Z")],
+ ["2016-02-29", new Date("2016-02-29T00:00:00.000Z")] // Leap year
+ ]);
+ testValueAsDateSetter("date", dateInput, [
+ [new Date("2019-12-10T00:00:00.000Z"), "2019-12-10"],
+ [new Date("2016-02-29T00:00:00.000Z"), "2016-02-29"] // Leap year
+ ]);
+
+ const monthInput = document.getElementById("input_month");
+ testValueAsDateGetter("month", monthInput, [
+ ["", null],
+ ["0000-12", null],
+ ["2019-00", null],
+ ["2019-12", new Date("2019-12-01T00:00:00.000Z")]
+ ]);
+ testValueAsDateSetter("month", monthInput, [[new Date("2019-12-01T00:00:00.000Z"), "2019-12"]]);
+
+ const weekInput = document.getElementById("input_week");
+ testValueAsDateGetter("week", weekInput, [
+ ["", null],
+ ["0000-W50", null],
+ ["2019-W00", null],
+ ["2019-W60", null],
+ ["2019-W50", new Date("2019-12-09T00:00:00.000Z")]
+ ]);
+ testValueAsDateSetter("week", weekInput, [[new Date("2019-12-09T00:00:00.000Z"), "2019-W50"]]);
+
+ const timeInput = document.getElementById("input_time");
+ testValueAsDateGetter("time", timeInput, [
+ ["", null],
+ ["24:00", null],
+ ["00:60", null],
+ ["00:00", new Date("1970-01-01T00:00:00.000Z")],
+ ["12:00", new Date("1970-01-01T12:00:00.000Z")],
+ ["23:59", new Date("1970-01-01T23:59:00.000Z")]
+ ]);
+ testValueAsDateSetter("time", timeInput, [
+ [new Date("1970-01-01T00:00:00.000Z"), "00:00"],
+ [new Date("1970-01-01T12:00:00.000Z"), "12:00"],
+ [new Date("1970-01-01T23:59:00.000Z"), "23:59"]
+ ]);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-valueasnumber.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-valueasnumber.html
new file mode 100644
index 00000000000..321c981c74d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-valueasnumber.html
@@ -0,0 +1,146 @@
+<!DOCTYPE HTML>
+<meta charset="utf-8">
+<html>
+ <head>
+ <title>HTMLInputElement valueAsNumber</title>
+ <link rel="author" title="pmdartus" href="mailto:dartus.pierremarie@gmail.com">
+ <link rel=help href="https://html.spec.whatwg.org/#dom-input-valueasnumber">
+
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <h3>input_valueAsNumber</h3>
+ <hr>
+ <div id="log"></div>
+
+ <input id="input_date" type="date" />
+ <input id="input_month" type="month" />
+ <input id="input_week" type="week" />
+ <input id="input_time" type="time" />
+ <input id="input_datetime-local" type="datetime-local" />
+ <input id="input_number" type="number" />
+ <input id="input_range" type="range" min="0" max="100" />
+
+ <script>
+ "use strict";
+
+ function testValueAsNumberGetter(type, element, cases) {
+ for (const [value, expectedValueAsNumber] of cases) {
+ test(
+ () => {
+ element.value = value;
+ assert_equals(element.valueAsNumber, expectedValueAsNumber);
+ },
+ `valueAsNumber getter on type ${type} (actual value: ${value}, ` +
+ `expected valueAsNumber: ${expectedValueAsNumber})`
+ );
+ }
+ }
+
+ function testValueAsNumberSetter(type, element, cases) {
+ for (const [valueAsNumber, expectedValue] of cases) {
+ test(
+ () => {
+ element.valueAsNumber = valueAsNumber;
+ assert_equals(element.value, expectedValue);
+ },
+ `valueAsNumber setter on type ${type} (actual valueAsNumber: ${valueAsNumber}, ` +
+ `expected value: ${expectedValue})`
+ );
+ }
+ }
+
+ const dateInput = document.getElementById("input_date");
+ testValueAsNumberGetter("date", dateInput, [
+ ["", NaN],
+ ["0000-12-10", NaN],
+ ["2019-00-12", NaN],
+ ["2019-12-00", NaN],
+ ["2019-13-10", NaN],
+ ["2019-02-29", NaN],
+ ["2019-12-10", 1575936000000],
+ ["2016-02-29", 1456704000000] // Leap year
+ ]);
+ testValueAsNumberSetter("date", dateInput, [
+ [0, "1970-01-01"],
+ [1575936000000, "2019-12-10"],
+ [1456704000000, "2016-02-29"] // Leap year
+ ]);
+
+ const monthInput = document.getElementById("input_month");
+ testValueAsNumberGetter("month", monthInput, [
+ ["", NaN],
+ ["0000-12", NaN],
+ ["2019-00", NaN],
+ ["2019-12", 599]
+ ]);
+ testValueAsNumberSetter("month", monthInput, [[599, "2019-12"]]);
+
+ const weekInput = document.getElementById("input_week");
+ testValueAsNumberGetter("week", weekInput, [
+ ["", NaN],
+ ["0000-W50", NaN],
+ ["2019-W00", NaN],
+ ["2019-W60", NaN],
+ ["2019-W50", 1575849600000]
+ ]);
+ testValueAsNumberSetter("week", weekInput, [
+ [0, "1970-W01"],
+ [1575849600000, "2019-W50"]
+ ]);
+
+ const timeInput = document.getElementById("input_time");
+ testValueAsNumberGetter("time", timeInput, [
+ ["", NaN],
+ ["24:00", NaN],
+ ["00:60", NaN],
+ ["00:00", 0],
+ ["12:00", 12 * 3600 * 1000],
+ ["23:59", ((23 * 3600) + (59 * 60)) * 1000]
+ ]);
+ testValueAsNumberSetter("time", timeInput, [
+ [0, "00:00"],
+ [12 * 3600 * 1000, "12:00"],
+ [((23 * 3600) + (59 * 60)) * 1000, "23:59"]
+ ]);
+
+ const dateTimeLocalInput = document.getElementById("input_datetime-local");
+ testValueAsNumberGetter("datetime-local", dateTimeLocalInput, [
+ ["", NaN],
+ ["2019-12-10T00:00", 1575936000000],
+ ["2019-12-10T12:00", 1575979200000]
+ ]);
+ testValueAsNumberSetter("datetime-local", dateTimeLocalInput, [
+ [1575936000000, "2019-12-10T00:00"],
+ [1575979200000, "2019-12-10T12:00"]
+ ]);
+
+ const numberInput = document.getElementById("input_number");
+ testValueAsNumberGetter("number", numberInput, [
+ ["", NaN],
+ ["123", 123],
+ ["123.456", 123.456]
+ ]);
+ testValueAsNumberSetter("number", numberInput, [
+ [123, "123"],
+ [123.456, "123.456"]
+ ]);
+
+ const rangeInput = document.getElementById("input_range");
+ testValueAsNumberGetter("range", rangeInput, [
+ ["", 50],
+ ["0", 0],
+ ["50", 50],
+ ["100", 100],
+ ["-10", 0], // Realign to the min
+ ["110", 100] // Realign to the max
+ ]);
+ testValueAsNumberSetter("range", rangeInput, [
+ [0, "0"],
+ [50, "50"],
+ [100, "100"]
+ ]);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/radio.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/radio.html
index c37fa7acd0c..7dcc9a14a89 100644
--- a/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/radio.html
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/radio.html
@@ -174,4 +174,34 @@
assert_true(radio71.checked, "canceled click event on radio should leave the previously-checked radio checked");
assert_false(radio72.checked, "canceled click event on previously-unchecked radio should leave that radio unchecked");
});
+
+ test(() => {
+ const container = document.createElement('div');
+ container.innerHTML =
+ '<input type=radio name=n1><span><input type=radio name=n1 checked></span>' +
+ '<form><input type=radio name=n1 checked></form>';
+ const radios = container.querySelectorAll('input');
+ assert_false(radios[0].checked, 'Sanity check: The first radio should be unchecked');
+ assert_true(radios[1].checked, 'Sanity check: The second radio should be checked');
+ assert_true(radios[2].checked, 'Sanity check: The third radio should be checked');
+
+ radios[0].checked = true;
+ assert_true(radios[0].checked, 'The first radio should be checked after setting checked');
+ assert_false(radios[1].checked, 'The second radio should be unchecked after setting checked');
+ assert_true(radios[2].checked, 'The third radio should be checked after setting checked');
+
+ radios[1].required = true;
+ assert_false(radios[0].validity.valueMissing, 'The first radio should be valid');
+ assert_false(radios[1].validity.valueMissing, 'The second radio should be valid');
+ assert_false(radios[2].validity.valueMissing, 'The third radio should be valid');
+
+ radios[0].remove();
+ assert_false(radios[0].validity.valueMissing, 'The first radio should be valid because of no required');
+ assert_true(radios[1].validity.valueMissing, 'The second radio should be invalid***');
+ assert_false(radios[2].validity.valueMissing, 'The third radio should be valid');
+
+ radios[0].required = true;
+ radios[0].checked = false;
+ assert_true(radios[0].validity.valueMissing, 'The first radio should be invalid because of required');
+ }, 'Radio buttons in an orphan tree should make a group');
</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/valueMode.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/valueMode.html
index 9525d3ca1fe..5502011794f 100644
--- a/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/valueMode.html
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/valueMode.html
@@ -302,4 +302,31 @@ test(function() {
input.value = "foo\r\r\n\n\0";
assert_equals(input.value, "#000000");
}, "value IDL attribute of input type color with value attribute");
+
+// MODE FILENAME
+test(function () {
+ var input = document.createElement("input");
+ input.type = "file";
+
+ for (const emptyValue of ["", null]) {
+ input.value = emptyValue;
+ assert_equals(input.value, "", `input.value is empty after assigning ${emptyValue}`);
+ }
+
+ for (const invalidValue of ["foo", 10, undefined]) {
+ assert_throws("InvalidStateError", () => {
+ input.value = invalidValue;
+ });
+ assert_equals(input.value, "", `input.value is empty after assigning ${invalidValue}`);
+ }
+}, "value IDL attribute of input type file without value attribute");
+test(function() {
+ var input = document.createElement("input");
+ input.type = "file";
+ input.setAttribute("value", "bar");
+ assert_equals(input.value, "", "input.value is empty even with a value attribute");
+
+ input.value = "";
+ assert_equals(input.getAttribute("value"), "bar", "Setting input.value does not change the value attribute");
+}, "value IDL attribute of input type file with value attribute");
</script>
diff --git a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/assumptions/allowed-to-play.html.ini b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/assumptions/allowed-to-play.html.ini
index c6f136d9715..87726f49239 100644
--- a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/assumptions/allowed-to-play.html.ini
+++ b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/assumptions/allowed-to-play.html.ini
@@ -1,4 +1,6 @@
[allowed-to-play.html]
+ disabled:
+ if product == "firefox": https://bugzilla.mozilla.org/show_bug.cgi?id=1607802
expected:
if product == "safari": ERROR # https://bugs.webkit.org/show_bug.cgi?id=190775
diff --git a/tests/wpt/web-platform-tests/lint.whitelist b/tests/wpt/web-platform-tests/lint.whitelist
index 62644762ce2..353922a456c 100644
--- a/tests/wpt/web-platform-tests/lint.whitelist
+++ b/tests/wpt/web-platform-tests/lint.whitelist
@@ -94,6 +94,7 @@ TRAILING WHITESPACE: server-timing/resources/parsing/*
TRAILING WHITESPACE: webvtt/parsing/file-parsing/support/*.vtt
TRAILING WHITESPACE: webvtt/parsing/file-parsing/tests/support/*.vtt
TRAILING WHITESPACE: xhr/resources/headers-some-are-empty.asis
+TRAILING WHITESPACE: cookies/http-state/resources/test-files/*
# Intentional use of print statements
PRINT STATEMENT: dom/nodes/Document-createElement-namespace-tests/generate.py
diff --git a/tests/wpt/web-platform-tests/resources/chromium/nfc-mock.js b/tests/wpt/web-platform-tests/resources/chromium/nfc-mock.js
index 2c1724b7592..be86dedd4d8 100644
--- a/tests/wpt/web-platform-tests/resources/chromium/nfc-mock.js
+++ b/tests/wpt/web-platform-tests/resources/chromium/nfc-mock.js
@@ -133,7 +133,7 @@ function matchesWatchOptions(message, options) {
options.recordType !== record.recordType) {
continue;
}
- if (options.mediaType !== '' && options.mediaType !== record.mediaType) {
+ if (options.mediaType != null && options.mediaType !== record.mediaType) {
continue;
}
@@ -145,8 +145,11 @@ function matchesWatchOptions(message, options) {
}
function createNDEFError(type) {
- return { error: type ?
- new device.mojom.NDEFError({ errorType: type }) : null };
+ return {
+ error: type ?
+ new device.mojom.NDEFError({errorType: type, errorMessage: ''}) :
+ null
+ };
}
var WebNFCTest = (() => {
@@ -357,7 +360,10 @@ var WebNFCTest = (() => {
simulateNonNDEFTagDiscovered() {
// Notify NotSupportedError to all active readers.
if (this.watchers_.length != 0) {
- this.client_.onError(device.mojom.NDEFErrorType.NOT_SUPPORTED);
+ this.client_.onError(new device.mojom.NDEFError({
+ errorType: device.mojom.NDEFErrorType.NOT_SUPPORTED,
+ errorMessage: ''
+ }));
}
// Reject the pending push with NotSupportedError.
if (this.pending_promise_func_) {
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/opaque-script.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/opaque-script.https.html
new file mode 100644
index 00000000000..7d2121855df
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/opaque-script.https.html
@@ -0,0 +1,71 @@
+<!doctype html>
+<title>Cache Storage: verify scripts loaded from cache_storage are marked opaque</title>
+<link rel="help" href="https://w3c.github.io/ServiceWorker/#cache-interface">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/testharness-helpers.js"></script>
+<script src="resources/test-helpers.sub.js"></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script>
+'use strict';
+
+const SW_URL = 'resources/opaque-script-sw.js';
+const BASE_SCOPE = './resources/opaque-script-frame.html';
+const SAME_ORIGIN_BASE = new URL('./resources/', self.location.href).href;
+const CROSS_ORIGIN_BASE = new URL('./resources/',
+ get_host_info().HTTPS_REMOTE_ORIGIN + base_path()).href;
+
+function wait_for_error() {
+ return new Promise(resolve => {
+ self.addEventListener('message', function messageHandler(evt) {
+ if (evt.data.type !== 'ErrorEvent')
+ return;
+ self.removeEventListener('message', messageHandler);
+ resolve(evt.data.msg);
+ });
+ });
+}
+
+// Load an iframe that dynamically adds a script tag that is
+// same/cross origin and large/small. It then calls a function
+// defined in that loaded script that throws an unhandled error.
+// The resulting message exposed in the global onerror handler
+// is reported back from this function. Opaque cross origin
+// scripts should not expose the details of the uncaught exception.
+async function get_error_message(t, mode, size) {
+ const script_base = mode === 'same-origin' ? SAME_ORIGIN_BASE
+ : CROSS_ORIGIN_BASE;
+ const script = script_base + `opaque-script-${size}.js`;
+ const scope = BASE_SCOPE + `?script=${script}`;
+ const reg = await service_worker_unregister_and_register(t, SW_URL, scope);
+ t.add_cleanup(_ => reg.unregister());
+ assert_true(!!reg.installing);
+ await wait_for_state(t, reg.installing, 'activated');
+ const error_promise = wait_for_error();
+ const f = await with_iframe(scope);
+ t.add_cleanup(_ => f.remove());
+ const error = await error_promise;
+ return error;
+}
+
+promise_test(async t => {
+ const error = await get_error_message(t, 'same-origin', 'small');
+ assert_true(error.includes('Intentional error'));
+}, 'Verify small same-origin cache_storage scripts are not opaque.');
+
+promise_test(async t => {
+ const error = await get_error_message(t, 'same-origin', 'large');
+ assert_true(error.includes('Intentional error'));
+}, 'Verify large same-origin cache_storage scripts are not opaque.');
+
+promise_test(async t => {
+ const error = await get_error_message(t, 'cross-origin', 'small');
+ assert_false(error.includes('Intentional error'));
+}, 'Verify small cross-origin cache_storage scripts are opaque.');
+
+promise_test(async t => {
+ const error = await get_error_message(t, 'cross-origin', 'large');
+ assert_false(error.includes('Intentional error'));
+}, 'Verify large cross-origin cache_storage scripts are opaque.');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/opaque-script-frame.html b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/opaque-script-frame.html
new file mode 100644
index 00000000000..a57aacec7c6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/opaque-script-frame.html
@@ -0,0 +1,21 @@
+<!doctype html>
+<html>
+<head>
+<meta charset="utf-8">
+</head>
+<body>
+<script>
+self.addEventListener('error', evt => {
+ self.parent.postMessage({ type: 'ErrorEvent', msg: evt.message }, '*');
+});
+
+const el = document.createElement('script');
+const params = new URLSearchParams(self.location.search);
+el.src = params.get('script');
+el.addEventListener('load', evt => {
+ runScript();
+});
+document.body.appendChild(el);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/opaque-script-large.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/opaque-script-large.js
new file mode 100644
index 00000000000..7e1c598efc5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/opaque-script-large.js
@@ -0,0 +1,41 @@
+function runScript() {
+ throw new Error("Intentional error.");
+}
+
+function unused() {
+ // The following string is intended to be relatively large since some
+ // browsers trigger different code paths based on script size.
+ return "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a " +
+ "tortor ut orci bibendum blandit non quis diam. Aenean sit amet " +
+ "urna sit amet neque malesuada ultricies at vel nisi. Nunc et lacus " +
+ "est. Nam posuere erat enim, ac fringilla purus pellentesque " +
+ "cursus. Proin sodales eleifend lorem, eu semper massa scelerisque " +
+ "ac. Maecenas pharetra leo malesuada vulputate vulputate. Sed at " +
+ "efficitur odio. In rhoncus neque varius nibh efficitur gravida. " +
+ "Curabitur vitae dolor enim. Mauris semper lobortis libero sed " +
+ "congue. Donec felis ante, fringilla eget urna ut, finibus " +
+ "hendrerit lacus. Donec at interdum diam. Proin a neque vitae diam " +
+ "egestas euismod. Mauris posuere elementum lorem, eget convallis " +
+ "nisl elementum et. In ut leo ac neque dapibus pharetra quis ac " +
+ "velit. Integer pretium lectus non urna vulputate, in interdum mi " +
+ "lobortis. Sed laoreet ex et metus pharetra blandit. Curabitur " +
+ "sollicitudin non neque eu varius. Phasellus posuere congue arcu, " +
+ "in aliquam nunc fringilla a. Morbi id facilisis libero. Phasellus " +
+ "metus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. " +
+ "tortor ut orci bibendum blandit non quis diam. Aenean sit amet " +
+ "urna sit amet neque malesuada ultricies at vel nisi. Nunc et lacus " +
+ "est. Nam posuere erat enim, ac fringilla purus pellentesque " +
+ "cursus. Proin sodales eleifend lorem, eu semper massa scelerisque " +
+ "ac. Maecenas pharetra leo malesuada vulputate vulputate. Sed at " +
+ "efficitur odio. In rhoncus neque varius nibh efficitur gravida. " +
+ "Curabitur vitae dolor enim. Mauris semper lobortis libero sed " +
+ "congue. Donec felis ante, fringilla eget urna ut, finibus " +
+ "hendrerit lacus. Donec at interdum diam. Proin a neque vitae diam " +
+ "egestas euismod. Mauris posuere elementum lorem, eget convallis " +
+ "nisl elementum et. In ut leo ac neque dapibus pharetra quis ac " +
+ "velit. Integer pretium lectus non urna vulputate, in interdum mi " +
+ "lobortis. Sed laoreet ex et metus pharetra blandit. Curabitur " +
+ "sollicitudin non neque eu varius. Phasellus posuere congue arcu, " +
+ "in aliquam nunc fringilla a. Morbi id facilisis libero. Phasellus " +
+ "metus.";
+}
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/opaque-script-small.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/opaque-script-small.js
new file mode 100644
index 00000000000..8b890985752
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/opaque-script-small.js
@@ -0,0 +1,3 @@
+function runScript() {
+ throw new Error("Intentional error.");
+}
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/opaque-script-sw.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/opaque-script-sw.js
new file mode 100644
index 00000000000..4d882c617d8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/opaque-script-sw.js
@@ -0,0 +1,37 @@
+importScripts('test-helpers.sub.js');
+importScripts('/common/get-host-info.sub.js');
+
+const NAME = 'foo';
+const SAME_ORIGIN_BASE = new URL('./', self.location.href).href;
+const CROSS_ORIGIN_BASE = new URL('./',
+ get_host_info().HTTPS_REMOTE_ORIGIN + base_path()).href;
+
+const urls = [
+ `${SAME_ORIGIN_BASE}opaque-script-small.js`,
+ `${SAME_ORIGIN_BASE}opaque-script-large.js`,
+ `${CROSS_ORIGIN_BASE}opaque-script-small.js`,
+ `${CROSS_ORIGIN_BASE}opaque-script-large.js`,
+];
+
+self.addEventListener('install', evt => {
+ evt.waitUntil(async function() {
+ const c = await caches.open(NAME);
+ const promises = urls.map(async function(u) {
+ const r = await fetch(u, { mode: 'no-cors' });
+ await c.put(u, r);
+ });
+ await Promise.all(promises);
+ }());
+});
+
+self.addEventListener('fetch', evt => {
+ const url = new URL(evt.request.url);
+ if (!url.pathname.includes('opaque-script-small.js') &&
+ !url.pathname.includes('opaque-script-large.js')) {
+ return;
+ }
+ evt.respondWith(async function() {
+ const c = await caches.open(NAME);
+ return c.match(evt.request);
+ }());
+});
diff --git a/tests/wpt/web-platform-tests/trusted-types/DOMParser-parseFromString-regression.tentative.https.html b/tests/wpt/web-platform-tests/trusted-types/DOMParser-parseFromString-regression.tentative.https.html
new file mode 100644
index 00000000000..30986e45d26
--- /dev/null
+++ b/tests/wpt/web-platform-tests/trusted-types/DOMParser-parseFromString-regression.tentative.https.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta http-equiv="Content-Security-Policy" content="blabla">
+<body>
+<div id="target"></div>
+<div id="probe"></div>
+<script>
+test(t => {
+ // Regression test for crbug.com/1030830. (Should work in any browser, though.)
+ //
+ // The top-level doc has a CSP that doesn't do anything interesting. We'll
+ // parse a doc and create an iframe with an embedded CSP, and will ensure that
+ // the CSP applies to the frame, but not the top-level doc.
+ const target = document.getElementById("target");
+ const probe = document.getElementById("probe");
+ probe.innerHTML = "probe";
+
+ const doc = new DOMParser().parseFromString(`
+ <meta http-equiv="Content-Security-Policy" content="trusted-types *">
+ <body><div id="probe"></div></body>"`, "text/html");
+ probe.innerHTML = "probe";
+
+ const frame = document.createElement("iframe");
+ frame.src = `data:text/html;${encodeURI(doc.documentElement.outerHTML)}`;
+ frame.id = "frame";
+ target.appendChild(frame);
+ const frame_probe = document.getElementById("frame").contentDocument.getElementById("probe");
+ probe.innerHTML = "probe";
+ assert_throws(new TypeError(), _ => { frame_probe.innnerHTML = "probe" });
+}, "Regression test for TT changes to parseFromString.");
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/trusted-types/TrustedTypePolicyFactory-createPolicy-createXYZTests.tentative.html b/tests/wpt/web-platform-tests/trusted-types/TrustedTypePolicyFactory-createPolicy-createXYZTests.tentative.html
index 8608bcc24fe..a78b3dbf0fd 100644
--- a/tests/wpt/web-platform-tests/trusted-types/TrustedTypePolicyFactory-createPolicy-createXYZTests.tentative.html
+++ b/tests/wpt/web-platform-tests/trusted-types/TrustedTypePolicyFactory-createPolicy-createXYZTests.tentative.html
@@ -224,4 +224,18 @@
p.createURL(INPUTS.URL);
});
}, "createScriptURL defined - calling undefined callbacks throws");
+
+ test(t => {
+ let p = window.trustedTypes.createPolicy('TestPolicyScriptURL10', {
+ createHTML: createHTMLJSWithThreeArguments,
+ createScript: createScriptJSWithThreeArguments,
+ createScriptURL: createScriptURLJSWithThreeArguments
+ });
+ assert_equals("abc", p.createHTML("a", "b", "c").toString());
+ assert_equals("abc", p.createScript("a", "b", "c").toString());
+ assert_equals("abc", p.createScriptURL("a", "b", "c").toString());
+ assert_equals("abundefined", p.createHTML("a", "b").toString());
+ assert_equals("a123null", p.createScript("a", 123, null).toString());
+ assert_equals("a[object Object]3.14", p.createScriptURL("a", {}, 3.14).toString());
+ }, "Arbitrary number of arguments");
</script>
diff --git a/tests/wpt/web-platform-tests/trusted-types/support/helper.sub.js b/tests/wpt/web-platform-tests/trusted-types/support/helper.sub.js
index d13ad567a72..20f56c3cbc7 100644
--- a/tests/wpt/web-platform-tests/trusted-types/support/helper.sub.js
+++ b/tests/wpt/web-platform-tests/trusted-types/support/helper.sub.js
@@ -24,6 +24,18 @@ function createScriptURLJS(scripturl) {
return scripturl.replace("scripturl", "successful");
}
+function createHTMLJSWithThreeArguments(html0, html1, html2) {
+ return html0 + html1 + html2;
+}
+
+function createScriptJSWithThreeArguments(script0, script1, script2) {
+ return script0 + script1 + script2;
+}
+
+function createScriptURLJSWithThreeArguments(scripturl0, scripturl1, scripturl2) {
+ return scripturl0 + scripturl1 + scripturl2;
+}
+
function createHTML_policy(win, c) {
return win.trustedTypes.createPolicy('SomeHTMLPolicyName' + c, { createHTML: createHTMLJS });
}
diff --git a/tests/wpt/web-platform-tests/web-nfc/NDEFRecord_constructor.https.html b/tests/wpt/web-platform-tests/web-nfc/NDEFRecord_constructor.https.html
index 2da7ca91078..0e0f1a77139 100644
--- a/tests/wpt/web-platform-tests/web-nfc/NDEFRecord_constructor.https.html
+++ b/tests/wpt/web-platform-tests/web-nfc/NDEFRecord_constructor.https.html
@@ -265,8 +265,8 @@
test(() => {
assert_throws(new TypeError, () => new NDEFRecord(
- createRecord('foo.eXamPle.com:bAr*-', "A string is not a BufferSource or NDEFMessage")),
- 'Only BufferSource and NDEFMessage are allowed to be the record data.');
+ createRecord('foo.eXamPle.com:bAr*-', "A string is not a BufferSource or NDEFMessageInit")),
+ 'Only BufferSource and NDEFMessageInit are allowed to be the record data.');
let buffer = new ArrayBuffer(4);
new Uint8Array(buffer).set([1, 2, 3, 4]);
@@ -294,6 +294,24 @@
assert_equals(record.toRecords(), null,
'toRecords() returns null if the payload is not an NDEF message.');
}
+ // Feed NDEFMessageInit.
+ {
+ const payload_message = createMessage([createTextRecord(test_text_data)]);
+ const record = new NDEFRecord(createRecord(
+ 'foo.eXamPle.com:bAr*-', payload_message, "dummy_record_id"));
+ assert_equals(record.recordType, 'foo.eXamPle.com:bAr*-', 'recordType');
+ assert_equals(record.mediaType, null, 'mediaType');
+ assert_equals(record.id, "dummy_record_id", 'id');
+ const embedded_records = record.toRecords();
+ assert_equals(embedded_records.length, 1, 'Only one embedded record.');
+ // The only one embedded record has correct content.
+ assert_equals(embedded_records[0].recordType, 'text', 'recordType');
+ assert_equals(embedded_records[0].mediaType, null, 'mediaType');
+ assert_equals(embedded_records[0].id, test_record_id, 'id');
+ const decoder = new TextDecoder();
+ assert_equals(decoder.decode(embedded_records[0].data), test_text_data,
+ 'data has the same content with the original dictionary');
+ }
}, 'NDEFRecord constructor with external record type');
test(() => {
diff --git a/tests/wpt/web-platform-tests/web-nfc/NDEFWriter_push.https.html b/tests/wpt/web-platform-tests/web-nfc/NDEFWriter_push.https.html
index cb6b3941410..bf7c1f86ad0 100644
--- a/tests/wpt/web-platform-tests/web-nfc/NDEFWriter_push.https.html
+++ b/tests/wpt/web-platform-tests/web-nfc/NDEFWriter_push.https.html
@@ -290,6 +290,25 @@ nfc_test(async (t, mockNFC) => {
and external records with default NDEFPushOptions.");
nfc_test(async (t, mockNFC) => {
+ const payloadMessage = createMessage([createTextRecord(test_text_data)]);
+ // Prepare a message containing an external record that uses |payloadMessage| as its payload.
+ const message = createMessage([createRecord('example.com:payloadIsMessage',
+ payloadMessage)]);
+
+ const writer = new NDEFWriter();
+ await writer.push(message);
+ const pushed_message = mockNFC.pushedMessage();
+
+ // The mojom message received by mock nfc contains only the external type record.
+ assert_equals(pushed_message.data.length, 1);
+ assert_equals(pushed_message.data[0].recordType, 'example.com:payloadIsMessage', 'recordType');
+ // The external type record's payload is from the original |payloadMessage|.
+ assert_array_equals(pushed_message.data[0].data, new Uint8Array(0),
+ 'payloadMessage is used instead');
+ assertNDEFMessagesEqual(payloadMessage, pushed_message.data[0].payloadMessage);
+}, "NDEFWriter.push NDEFMessage containing embedded records.");
+
+nfc_test(async (t, mockNFC) => {
const writer = new NDEFWriter();
await writer.push(test_text_data);
assertNDEFMessagesEqual(test_text_data, mockNFC.pushedMessage());