aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/wpt/metadata/MANIFEST.json216
-rw-r--r--tests/wpt/metadata/css/css-backgrounds/animations/border-bottom-left-radius-composition.html.ini64
-rw-r--r--tests/wpt/metadata/css/css-backgrounds/animations/border-bottom-right-radius-composition.html.ini64
-rw-r--r--tests/wpt/metadata/css/css-backgrounds/animations/border-image-outset-composition.html.ini169
-rw-r--r--tests/wpt/metadata/css/css-backgrounds/animations/border-image-slice-composition.html.ini169
-rw-r--r--tests/wpt/metadata/css/css-backgrounds/animations/border-image-width-composition.html.ini169
-rw-r--r--tests/wpt/metadata/css/css-backgrounds/animations/border-top-left-radius-composition.html.ini64
-rw-r--r--tests/wpt/metadata/css/css-backgrounds/animations/border-top-right-radius-composition.html.ini64
-rw-r--r--tests/wpt/metadata/css/css-text/animations/letter-spacing-composition.html.ini46
-rw-r--r--tests/wpt/metadata/css/css-text/animations/text-indent-composition.html.ini94
-rw-r--r--tests/wpt/metadata/css/css-text/animations/word-spacing-composition.html.ini46
-rw-r--r--tests/wpt/metadata/custom-elements/upgrading.html.ini6
-rw-r--r--tests/wpt/metadata/fetch/content-type/response.window.js.ini9
-rw-r--r--tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini6
-rw-r--r--tests/wpt/metadata/fetch/security/embedded-credentials.tentative.sub.html.ini2
-rw-r--r--tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini4
-rw-r--r--tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_2.html.ini4
-rw-r--r--tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/skip-document-with-fragment.html.ini4
-rw-r--r--tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini1
-rw-r--r--tests/wpt/metadata/webmessaging/with-ports/017.html.ini5
-rw-r--r--tests/wpt/metadata/workers/semantics/multiple-workers/005.html.ini1
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-bottom-left-radius-composition.html58
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-bottom-right-radius-composition.html58
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-bottom-width-composition.html65
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-image-outset-composition.html133
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-image-slice-composition.html133
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-image-width-composition.html133
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-left-width-composition.html65
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-right-width-composition.html65
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-top-left-radius-composition.html58
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-top-right-radius-composition.html58
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-top-width-composition.html65
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/animations/letter-spacing-composition.html53
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/animations/text-indent-composition.html84
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/animations/word-spacing-composition.html52
-rw-r--r--tests/wpt/web-platform-tests/css/motion/animation/offset-anchor-composition.html80
-rw-r--r--tests/wpt/web-platform-tests/css/motion/animation/offset-distance-composition.html66
-rw-r--r--tests/wpt/web-platform-tests/css/motion/animation/offset-path-composition.html120
-rw-r--r--tests/wpt/web-platform-tests/css/motion/animation/offset-position-composition.html80
-rw-r--r--tests/wpt/web-platform-tests/css/motion/animation/offset-rotate-composition.html103
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/pseudo-class-defined.html18
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/upgrading.html50
-rw-r--r--tests/wpt/web-platform-tests/domxpath/lexical-structure.html29
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/time.html5
-rw-r--r--tests/wpt/web-platform-tests/interfaces/webaudio.idl68
-rw-r--r--tests/wpt/web-platform-tests/interfaces/webrtc.idl2
-rw-r--r--tests/wpt/web-platform-tests/resources/chromium/nfc-mock.js8
-rw-r--r--tests/wpt/web-platform-tests/web-animations/timing-model/animations/setting-the-playback-rate-of-an-animation.html2
-rw-r--r--tests/wpt/web-platform-tests/web-nfc/NDEFRecord_constructor.https.html24
49 files changed, 2886 insertions, 56 deletions
diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json
index 8a7ba34a58a..ecadcd6f001 100644
--- a/tests/wpt/metadata/MANIFEST.json
+++ b/tests/wpt/metadata/MANIFEST.json
@@ -320758,18 +320758,48 @@
{}
]
],
+ "css/css-backgrounds/animations/border-bottom-left-radius-composition.html": [
+ [
+ "css/css-backgrounds/animations/border-bottom-left-radius-composition.html",
+ {}
+ ]
+ ],
+ "css/css-backgrounds/animations/border-bottom-right-radius-composition.html": [
+ [
+ "css/css-backgrounds/animations/border-bottom-right-radius-composition.html",
+ {}
+ ]
+ ],
+ "css/css-backgrounds/animations/border-bottom-width-composition.html": [
+ [
+ "css/css-backgrounds/animations/border-bottom-width-composition.html",
+ {}
+ ]
+ ],
"css/css-backgrounds/animations/border-color-interpolation.html": [
[
"css/css-backgrounds/animations/border-color-interpolation.html",
{}
]
],
+ "css/css-backgrounds/animations/border-image-outset-composition.html": [
+ [
+ "css/css-backgrounds/animations/border-image-outset-composition.html",
+ {}
+ ]
+ ],
"css/css-backgrounds/animations/border-image-outset-interpolation.html": [
[
"css/css-backgrounds/animations/border-image-outset-interpolation.html",
{}
]
],
+ "css/css-backgrounds/animations/border-image-slice-composition.html": [
+ [
+ "css/css-backgrounds/animations/border-image-slice-composition.html",
+ {}
+ ]
+ ],
"css/css-backgrounds/animations/border-image-slice-interpolation-stability.html": [
[
"css/css-backgrounds/animations/border-image-slice-interpolation-stability.html",
@@ -320788,18 +320818,54 @@
{}
]
],
+ "css/css-backgrounds/animations/border-image-width-composition.html": [
+ [
+ "css/css-backgrounds/animations/border-image-width-composition.html",
+ {}
+ ]
+ ],
"css/css-backgrounds/animations/border-image-width-interpolation.html": [
[
"css/css-backgrounds/animations/border-image-width-interpolation.html",
{}
]
],
+ "css/css-backgrounds/animations/border-left-width-composition.html": [
+ [
+ "css/css-backgrounds/animations/border-left-width-composition.html",
+ {}
+ ]
+ ],
"css/css-backgrounds/animations/border-radius-interpolation.html": [
[
"css/css-backgrounds/animations/border-radius-interpolation.html",
{}
]
],
+ "css/css-backgrounds/animations/border-right-width-composition.html": [
+ [
+ "css/css-backgrounds/animations/border-right-width-composition.html",
+ {}
+ ]
+ ],
+ "css/css-backgrounds/animations/border-top-left-radius-composition.html": [
+ [
+ "css/css-backgrounds/animations/border-top-left-radius-composition.html",
+ {}
+ ]
+ ],
+ "css/css-backgrounds/animations/border-top-right-radius-composition.html": [
+ [
+ "css/css-backgrounds/animations/border-top-right-radius-composition.html",
+ {}
+ ]
+ ],
+ "css/css-backgrounds/animations/border-top-width-composition.html": [
+ [
+ "css/css-backgrounds/animations/border-top-width-composition.html",
+ {}
+ ]
+ ],
"css/css-backgrounds/animations/border-width-interpolation.html": [
[
"css/css-backgrounds/animations/border-width-interpolation.html",
@@ -330786,18 +330852,36 @@
{}
]
],
+ "css/css-text/animations/letter-spacing-composition.html": [
+ [
+ "css/css-text/animations/letter-spacing-composition.html",
+ {}
+ ]
+ ],
"css/css-text/animations/letter-spacing-interpolation.html": [
[
"css/css-text/animations/letter-spacing-interpolation.html",
{}
]
],
+ "css/css-text/animations/text-indent-composition.html": [
+ [
+ "css/css-text/animations/text-indent-composition.html",
+ {}
+ ]
+ ],
"css/css-text/animations/text-indent-interpolation.html": [
[
"css/css-text/animations/text-indent-interpolation.html",
{}
]
],
+ "css/css-text/animations/word-spacing-composition.html": [
+ [
+ "css/css-text/animations/word-spacing-composition.html",
+ {}
+ ]
+ ],
"css/css-text/animations/word-spacing-interpolation.html": [
[
"css/css-text/animations/word-spacing-interpolation.html",
@@ -338400,12 +338484,24 @@
{}
]
],
+ "css/motion/animation/offset-anchor-composition.html": [
+ [
+ "css/motion/animation/offset-anchor-composition.html",
+ {}
+ ]
+ ],
"css/motion/animation/offset-anchor-interpolation.html": [
[
"css/motion/animation/offset-anchor-interpolation.html",
{}
]
],
+ "css/motion/animation/offset-distance-composition.html": [
+ [
+ "css/motion/animation/offset-distance-composition.html",
+ {}
+ ]
+ ],
"css/motion/animation/offset-distance-interpolation.html": [
[
"css/motion/animation/offset-distance-interpolation.html",
@@ -338418,6 +338514,12 @@
{}
]
],
+ "css/motion/animation/offset-path-composition.html": [
+ [
+ "css/motion/animation/offset-path-composition.html",
+ {}
+ ]
+ ],
"css/motion/animation/offset-path-interpolation-001.html": [
[
"css/motion/animation/offset-path-interpolation-001.html",
@@ -338448,12 +338550,24 @@
{}
]
],
+ "css/motion/animation/offset-position-composition.html": [
+ [
+ "css/motion/animation/offset-position-composition.html",
+ {}
+ ]
+ ],
"css/motion/animation/offset-position-interpolation.html": [
[
"css/motion/animation/offset-position-interpolation.html",
{}
]
],
+ "css/motion/animation/offset-rotate-composition.html": [
+ [
+ "css/motion/animation/offset-rotate-composition.html",
+ {}
+ ]
+ ],
"css/motion/animation/offset-rotate-interpolation.html": [
[
"css/motion/animation/offset-rotate-interpolation.html",
@@ -342134,6 +342248,12 @@
{}
]
],
+ "domxpath/lexical-structure.html": [
+ [
+ "domxpath/lexical-structure.html",
+ {}
+ ]
+ ],
"domxpath/node-sets.html": [
[
"domxpath/node-sets.html",
@@ -559551,14 +559671,34 @@
"f6a480c7bd2ccc4a6c46fa2eade5e7231fab4938",
"testharness"
],
+ "css/css-backgrounds/animations/border-bottom-left-radius-composition.html": [
+ "87042d1969d59b6865761c60beaeba5219c6148c",
+ "testharness"
+ ],
+ "css/css-backgrounds/animations/border-bottom-right-radius-composition.html": [
+ "2b5a72df6914f571ca00418484d9f782cd46aa63",
+ "testharness"
+ ],
+ "css/css-backgrounds/animations/border-bottom-width-composition.html": [
+ "5377c0ab42b44623c1d7e0aa81344345db795f68",
+ "testharness"
+ ],
"css/css-backgrounds/animations/border-color-interpolation.html": [
"3e7843b8a07577970279ef9a4e14bfb83c1816f0",
"testharness"
],
+ "css/css-backgrounds/animations/border-image-outset-composition.html": [
+ "e3311711753e34295eb3c7c83d5aee3d4cd684aa",
+ "testharness"
+ ],
"css/css-backgrounds/animations/border-image-outset-interpolation.html": [
"aebadbbafb236a090aa543ecf82e5661bee7de74",
"testharness"
],
+ "css/css-backgrounds/animations/border-image-slice-composition.html": [
+ "d0ccb1a3a64f2b3fe75b4957dc0a75036c3cd392",
+ "testharness"
+ ],
"css/css-backgrounds/animations/border-image-slice-interpolation-stability.html": [
"26431334e4acf13f6c095868a0e9cee6926a9ef1",
"testharness"
@@ -559571,14 +559711,38 @@
"60dcfceddc791737487fab07ea7035fac40856d6",
"testharness"
],
+ "css/css-backgrounds/animations/border-image-width-composition.html": [
+ "0d0a1dc4ed263c80b472e3ba241fffeaf771d6aa",
+ "testharness"
+ ],
"css/css-backgrounds/animations/border-image-width-interpolation.html": [
"ea138201b15805cd86d8a63ed37b401b103bfee2",
"testharness"
],
+ "css/css-backgrounds/animations/border-left-width-composition.html": [
+ "1b90effbc32cd56e9120fec92158f518a67d6ae8",
+ "testharness"
+ ],
"css/css-backgrounds/animations/border-radius-interpolation.html": [
"195469e83164c965ee33b6277983870100bda111",
"testharness"
],
+ "css/css-backgrounds/animations/border-right-width-composition.html": [
+ "aa9e1dcc66764c2ec8c072cbf9365529e3729d88",
+ "testharness"
+ ],
+ "css/css-backgrounds/animations/border-top-left-radius-composition.html": [
+ "1c2056bc010a82228416983897c63676ac3aeb0f",
+ "testharness"
+ ],
+ "css/css-backgrounds/animations/border-top-right-radius-composition.html": [
+ "9a26d51375e78bfe54ba7a3689f6b72fe6c36417",
+ "testharness"
+ ],
+ "css/css-backgrounds/animations/border-top-width-composition.html": [
+ "475c3930b9d1704267267ff30d747b266ea3d851",
+ "testharness"
+ ],
"css/css-backgrounds/animations/border-width-interpolation.html": [
"11f92f41652a9f1b167c5a399849d1e1e61c4df7",
"testharness"
@@ -598567,14 +598731,26 @@
"e7914c0fc7ff9e6999f8847dc1800968472483f2",
"support"
],
+ "css/css-text/animations/letter-spacing-composition.html": [
+ "c1b614b5ebaa5bc190a080bd8da5694096a2be20",
+ "testharness"
+ ],
"css/css-text/animations/letter-spacing-interpolation.html": [
"7d4958113915913bb8a3a5af13f5cee90b080825",
"testharness"
],
+ "css/css-text/animations/text-indent-composition.html": [
+ "57c528ca271646a284048bb49e11025ac25469da",
+ "testharness"
+ ],
"css/css-text/animations/text-indent-interpolation.html": [
"2269fdfa5b60f6f4a8d63a7f777e6abbf499c4b7",
"testharness"
],
+ "css/css-text/animations/word-spacing-composition.html": [
+ "17aacaef1506eddbc8ef40ade114a856310a508e",
+ "testharness"
+ ],
"css/css-text/animations/word-spacing-interpolation.html": [
"ffd6bb476ad87976a1183cde70a10892bab77982",
"testharness"
@@ -626311,10 +626487,18 @@
"20835b48397f136a30b82a62654d389cad326315",
"support"
],
+ "css/motion/animation/offset-anchor-composition.html": [
+ "53210fdf38a86ec9f4e852a33527fc88b1eb9fe3",
+ "testharness"
+ ],
"css/motion/animation/offset-anchor-interpolation.html": [
"9c69c0f0bed2b14c02091ccf63f50ace61f2eb2a",
"testharness"
],
+ "css/motion/animation/offset-distance-composition.html": [
+ "4ff6e95b05792505b2f98c511f5a80d64e86624d",
+ "testharness"
+ ],
"css/motion/animation/offset-distance-interpolation.html": [
"bc0c094a8e5305c970f0a4d44ee8a3726d2965a1",
"testharness"
@@ -626323,6 +626507,10 @@
"2ee011bd77a975e9b566d24658995693c574f620",
"testharness"
],
+ "css/motion/animation/offset-path-composition.html": [
+ "eedd363efafe05b870314ad797d9dc63f2c7409c",
+ "testharness"
+ ],
"css/motion/animation/offset-path-interpolation-001.html": [
"5b90813bb591d0aa7e17eeddcb1a9e3a908670f0",
"testharness"
@@ -626343,10 +626531,18 @@
"9924106f4b75ede89e5270a76fe217f85ef20050",
"testharness"
],
+ "css/motion/animation/offset-position-composition.html": [
+ "0ee517a73a8e9e673a83a0f81bbdea98d6a3d808",
+ "testharness"
+ ],
"css/motion/animation/offset-position-interpolation.html": [
"9faaf9487afb20059046e95a8cd5b3a796e8fd42",
"testharness"
],
+ "css/motion/animation/offset-rotate-composition.html": [
+ "bf60c19abeffafa36c50f1d1da0e9f9d64b1a151",
+ "testharness"
+ ],
"css/motion/animation/offset-rotate-interpolation.html": [
"55845108ebf5f3c42a8b0532121199136160d695",
"testharness"
@@ -638440,7 +638636,7 @@
"testharness"
],
"custom-elements/pseudo-class-defined.html": [
- "60d88cffb517c0062db338e5ba89e98f7748c280",
+ "24cb5fe4cd392246e292d255c0858aa7f2b5dd0e",
"testharness"
],
"custom-elements/range-and-constructors.html": [
@@ -638688,7 +638884,7 @@
"testharness"
],
"custom-elements/upgrading.html": [
- "d6b8ed387540ae9572774e5557b1168f844a017f",
+ "ac0fdff7a2111507632ac2c36fd5c60a6f832b20",
"testharness"
],
"custom-elements/upgrading/Document-importNode.html": [
@@ -640935,6 +641131,10 @@
"0805bd682b48461588250a22018a6bd90990d002",
"support"
],
+ "domxpath/lexical-structure.html": [
+ "f93820b0e4176d8c96518268b6453024dd43f1df",
+ "testharness"
+ ],
"domxpath/node-sets.html": [
"a47314fb0869885db01fd13bd8aa35687e283d0d",
"testharness"
@@ -663380,7 +663580,7 @@
"testharness"
],
"html/semantics/forms/the-input-element/time.html": [
- "ad4e38cbc74f50dc764fc958b8cf68f4dd790cbe",
+ "ec815d4cb302cfb68db7976ba79bec1de762b7b7",
"testharness"
],
"html/semantics/forms/the-input-element/type-change-file-to-text-crash.html": [
@@ -670716,7 +670916,7 @@
"support"
],
"interfaces/webaudio.idl": [
- "674673d90b1e8fd3e6d182f25289948fc0290cac",
+ "9491090337c342fc06a35a97ee6dc6887829c1bc",
"support"
],
"interfaces/webauthn.idl": [
@@ -670752,7 +670952,7 @@
"support"
],
"interfaces/webrtc.idl": [
- "e30fc38fd003a283ebb4184786d181c5b4293dc4",
+ "49ed6bb0333020a6eee8d5411ae88a4e3a7dbd9a",
"support"
],
"interfaces/webusb.idl": [
@@ -699584,7 +699784,7 @@
"support"
],
"resources/chromium/nfc-mock.js": [
- "7eee8ce04c4630ae82d2520def13cfa107b7ef13",
+ "4bafc9b0ad8f7f8ad4185914fffef16949695ab3",
"support"
],
"resources/chromium/sensor.mojom.js": [
@@ -722420,7 +722620,7 @@
"testharness"
],
"web-animations/timing-model/animations/setting-the-playback-rate-of-an-animation.html": [
- "0522c43b16a881a14b339294e5ed56b8ae064f92",
+ "a1f9e4f3acea04337dd0147fbfa373f950a67409",
"testharness"
],
"web-animations/timing-model/animations/setting-the-start-time-of-an-animation.html": [
@@ -722636,7 +722836,7 @@
"testharness"
],
"web-nfc/NDEFRecord_constructor.https.html": [
- "d46503ab172bf358bff005ce8c2c56941e333eea",
+ "c62ea7b0d620b6f38f589c751329b40be096e557",
"testharness"
],
"web-nfc/NDEFWriter-document-hidden-manual.https.html": [
diff --git a/tests/wpt/metadata/css/css-backgrounds/animations/border-bottom-left-radius-composition.html.ini b/tests/wpt/metadata/css/css-backgrounds/animations/border-bottom-left-radius-composition.html.ini
new file mode 100644
index 00000000000..737e7291c6f
--- /dev/null
+++ b/tests/wpt/metadata/css/css-backgrounds/animations/border-bottom-left-radius-composition.html.ini
@@ -0,0 +1,64 @@
+[border-bottom-left-radius-composition.html]
+ [Compositing: property <border-bottom-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0.5) should be [150px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0) should be [100px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (1) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0) should be [100px 120px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (1) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (1) should be [200px 120px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0.5) should be [150px 160px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (-0.25) should be [75px 220px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (1.25) should be [225px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (1.25) should be [225px 220px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0.25) should be [125px 140px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0.25) should be [125px 180px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0.75) should be [175px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0.75) should be [175px 140px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (-0.25) should be [75px 100px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0) should be [100px 200px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (1.25) should be [225px 100px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0.5) should be [150px 160px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0.75) should be [175px 180px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (-0.25) should be [75px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0.25) should be [125px\]]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-backgrounds/animations/border-bottom-right-radius-composition.html.ini b/tests/wpt/metadata/css/css-backgrounds/animations/border-bottom-right-radius-composition.html.ini
new file mode 100644
index 00000000000..1604dd021c5
--- /dev/null
+++ b/tests/wpt/metadata/css/css-backgrounds/animations/border-bottom-right-radius-composition.html.ini
@@ -0,0 +1,64 @@
+[border-bottom-right-radius-composition.html]
+ [Compositing: property <border-bottom-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0.75) should be [175px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0.75) should be [175px 180px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (1) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (1) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (1.25) should be [225px 100px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0.5) should be [150px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0) should be [100px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0.25) should be [125px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0.25) should be [125px 180px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (1.25) should be [225px 220px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (-0.25) should be [75px 220px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0.5) should be [150px 160px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0) should be [100px 120px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0.75) should be [175px 140px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0) should be [100px 200px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0.25) should be [125px 140px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (1) should be [200px 120px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (1.25) should be [225px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (-0.25) should be [75px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0.5) should be [150px 160px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (-0.25) should be [75px 100px\]]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-backgrounds/animations/border-image-outset-composition.html.ini b/tests/wpt/metadata/css/css-backgrounds/animations/border-image-outset-composition.html.ini
new file mode 100644
index 00000000000..da3928e72bf
--- /dev/null
+++ b/tests/wpt/metadata/css/css-backgrounds/animations/border-image-outset-composition.html.ini
@@ -0,0 +1,169 @@
+[border-image-outset-composition.html]
+ [Compositing: property <border-image-outset> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (1) should be [300 500 800 700\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (1.25) should be [127 129 131 133\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (1) should be [100px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (0.5) should be [50px 50\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (1.25) should be [325 550 900 750\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (0) should be [100px 150px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [1 2 3px 4px\] from add [1 2 3px 4px\] to add [101 102 103px 104px\] at (0.75) should be [77 79 81px 83px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20\] from add [100 150px\] to add [200px 250\] at (1.25) should be [200px 250\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [1 2 3px 4px\] from add [1 2 3px 4px\] to add [101 102 103px 104px\] at (1.25) should be [127 129 131px 133px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [1 2 3px 4px\] from add [1 2 3px 4px\] to add [101 102 103px 104px\] at (1) should be [102 104 106px 108px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (0.75) should be [275 450 700 650\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20\] from add [100 150px\] to add [200px 250\] at (-0.25) should be [100 150px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [1 2 3px 4px\] from add [1 2 3px 4px\] to add [101 102 103px 104px\] at (0.25) should be [27 29 31px 33px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (1.25) should be [225 225px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (1.25) should be [75px 75px 50px 50px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [1 2 3px 4px\] from add [1 2 3px 4px\] to add [101 102 103px 104px\] at (0.5) should be [52 54 56px 58px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (0.5) should be [52 54 56 58\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (-0.25) should be [125px 125\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20\] from add [100 150px\] to add [200px 250\] at (0.25) should be [100 150px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (0.25) should be [175px 175px 250px 250px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (1) should be [200 200px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20\] from add [100 150px\] to add [200px 250\] at (0.75) should be [200px 250\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (0.75) should be [175px 225px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (-0.25) should be [75px 125px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (0.25) should be [225 350 500 550\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (0.75) should be [175 175px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (0.5) should be [150px 150px 200px 200px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (0.25) should be [125 125px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (0) should be [100 100px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (0.25) should be [125px 175px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (1.25) should be [0px 0\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (0) should be [200 300 400 500\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (0.5) should be [150 150px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [1 2 3px 4px\] from add [1 2 3px 4px\] to add [101 102 103px 104px\] at (0) should be [2 4 6px 8px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (0.5) should be [250 400 600 600\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (1) should be [0px 0\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20\] from add [100 150px\] to add [200px 250\] at (0) should be [100 150px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (0.75) should be [77 79 81 83\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (0.75) should be [25px 25\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (0) should be [100px 100\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (-0.25) should be [75 75px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (0.75) should be [125px 125px 150px 150px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20\] from add [100 150px\] to add [200px 250\] at (0.5) should be [200px 250\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (-0.25) should be [0\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (-0.25) should be [175 250 300 450\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (1) should be [102 104 106 108\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (-0.25) should be [225px 225px 350px 350px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (1) should be [200px 250px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (1.25) should be [225px 275px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (0) should be [2 4 6 8\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20\] from add [100 150px\] to add [200px 250\] at (1) should be [200px 250\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (0) should be [200px 200px 300px 300px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [1 2 3px 4px\] from add [1 2 3px 4px\] to add [101 102 103px 104px\] at (-0.25) should be [0 0 0px 0px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (0.25) should be [27 29 31 33\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (0.25) should be [75px 75\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (0.5) should be [150px 200px\]]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-backgrounds/animations/border-image-slice-composition.html.ini b/tests/wpt/metadata/css/css-backgrounds/animations/border-image-slice-composition.html.ini
new file mode 100644
index 00000000000..3b247e9bf05
--- /dev/null
+++ b/tests/wpt/metadata/css/css-backgrounds/animations/border-image-slice-composition.html.ini
@@ -0,0 +1,169 @@
+[border-image-slice-composition.html]
+ [Compositing: property <border-image-slice> underlying [10% 20%\] from add [190% 180% 290% 280%\] to add [90% 80%\] at (0.75) should be [125% 125% 150% 150%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10% 20%\] from add [190% 180% 290% 280%\] to add [90% 80%\] at (0.5) should be [150% 150% 200% 200%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10% 20%\] from add [190% 180% 290% 280%\] to add [90% 80%\] at (-0.25) should be [225% 225% 350% 350%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (0.5) should be [52 54 56 58\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10% 20\] from add [90% 80\] to replace [0% 0 0% 0\] at (0.75) should be [25% 25\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [100 200 300 400 fill\] from add [100 fill\] to add [200 300 500 fill\] at (1.25) should be [325 550 900 750 fill\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10% 20\] from add [90% 80\] to replace [0% 0 0% 0\] at (1.25) should be [0% 0\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20%\] from replace [100 100%\] to add [190 180%\] at (-0.25) should be [75 75%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20\] from add [100 150%\] to add [200% 250\] at (0.25) should be [100 150%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20\] from add [100% 150%\] to add [200% 250% fill\] at (0.75) should be [200% 250% fill\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20%\] from replace [100 100%\] to add [190 180%\] at (1) should be [200 200%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (1.25) should be [127 129 131 133\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [100 200 300 400 fill\] from add [100 fill\] to add [200 300 500 fill\] at (0.25) should be [225 350 500 550 fill\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (0.25) should be [27 29 31 33\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20\] from add [100% 150%\] to add [200% 250% fill\] at (1.25) should be [200% 250% fill\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (1) should be [102 104 106 108\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [1 2 3% 4%\] from add [1 2 3% 4%\] to add [101 102 103% 104%\] at (0.5) should be [52 54 56% 58%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [100 200 300 400 fill\] from add [100 fill\] to add [200 300 500 fill\] at (0.5) should be [250 400 600 600 fill\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10% 20\] from add [90% 80\] to replace [0% 0 0% 0\] at (0.25) should be [75% 75\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20\] from add [100 150%\] to add [200% 250\] at (-0.25) should be [100 150%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10% 20\] from add [90% 80\] to replace [0% 0 0% 0\] at (1) should be [0% 0\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [100 200 300 400 fill\] from add [100 fill\] to add [200 300 500 fill\] at (1) should be [300 500 800 700 fill\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20\] from add [100% 150%\] to add [200% 250% fill\] at (0.5) should be [200% 250% fill\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [100 200 300 400 fill\] from add [100 fill\] to add [200 300 500 fill\] at (-0.25) should be [175 250 300 450 fill\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10% 20%\] from add [190% 180% 290% 280%\] to add [90% 80%\] at (0.25) should be [175% 175% 250% 250%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10% 20\] from add [90% 80\] to replace [0% 0 0% 0\] at (0.5) should be [50% 50\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [1 2 3% 4%\] from add [1 2 3% 4%\] to add [101 102 103% 104%\] at (0.75) should be [77 79 81% 83%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20%\] from replace [100 100%\] to add [190 180%\] at (0.75) should be [175 175%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20\] from add [100 150%\] to add [200% 250\] at (0.75) should be [200% 250\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10% 20%\] from add [190% 180% 290% 280%\] to add [90% 80%\] at (1.25) should be [75% 75% 50% 50%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [1 2 3% 4%\] from add [1 2 3% 4%\] to add [101 102 103% 104%\] at (0.25) should be [27 29 31% 33%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (0.75) should be [77 79 81 83\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [1 2 3% 4%\] from add [1 2 3% 4%\] to add [101 102 103% 104%\] at (-0.25) should be [0 0 0% 0%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (0) should be [2 4 6 8\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20\] from add [100% 150%\] to add [200% 250% fill\] at (0.25) should be [100% 150%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20\] from add [100 150%\] to add [200% 250\] at (1) should be [200% 250\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20\] from add [100 150%\] to add [200% 250\] at (1.25) should be [200% 250\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [1 2 3% 4%\] from add [1 2 3% 4%\] to add [101 102 103% 104%\] at (0) should be [2 4 6% 8%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [100 200 300 400 fill\] from add [100 fill\] to add [200 300 500 fill\] at (0) should be [200 300 400 500 fill\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20\] from add [100 150%\] to add [200% 250\] at (0.5) should be [200% 250\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20\] from add [100% 150%\] to add [200% 250% fill\] at (1) should be [200% 250% fill\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10% 20%\] from add [190% 180% 290% 280%\] to add [90% 80%\] at (0) should be [200% 200% 300% 300%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [1 2 3% 4%\] from add [1 2 3% 4%\] to add [101 102 103% 104%\] at (1.25) should be [127 129 131% 133%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20%\] from replace [100 100%\] to add [190 180%\] at (0.5) should be [150 150%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10% 20%\] from add [190% 180% 290% 280%\] to add [90% 80%\] at (1) should be [100%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10% 20\] from add [90% 80\] to replace [0% 0 0% 0\] at (-0.25) should be [125% 125\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20\] from add [100 150%\] to add [200% 250\] at (0) should be [100 150%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20%\] from replace [100 100%\] to add [190 180%\] at (1.25) should be [225 225%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (-0.25) should be [0\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20%\] from replace [100 100%\] to add [190 180%\] at (0.25) should be [125 125%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10% 20\] from add [90% 80\] to replace [0% 0 0% 0\] at (0) should be [100% 100\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20\] from add [100% 150%\] to add [200% 250% fill\] at (-0.25) should be [100% 150%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [1 2 3% 4%\] from add [1 2 3% 4%\] to add [101 102 103% 104%\] at (1) should be [102 104 106% 108%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [100 200 300 400 fill\] from add [100 fill\] to add [200 300 500 fill\] at (0.75) should be [275 450 700 650 fill\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20\] from add [100% 150%\] to add [200% 250% fill\] at (0) should be [100% 150%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20%\] from replace [100 100%\] to add [190 180%\] at (0) should be [100 100%\]]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-backgrounds/animations/border-image-width-composition.html.ini b/tests/wpt/metadata/css/css-backgrounds/animations/border-image-width-composition.html.ini
new file mode 100644
index 00000000000..82af1c481b6
--- /dev/null
+++ b/tests/wpt/metadata/css/css-backgrounds/animations/border-image-width-composition.html.ini
@@ -0,0 +1,169 @@
+[border-image-width-composition.html]
+ [Compositing: property <border-image-width> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (0.75) should be [77 79 81 83\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [1 2 3px 4%\] from add [1 2 3px 4%\] to add [101 102 103px 104%\] at (-0.25) should be [0 0 0px 0%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [1 2 3px 4%\] from add [1 2 3px 4%\] to add [101 102 103px 104%\] at (0.5) should be [52 54 56px 58%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20\] from add [100 150px\] to add [200% 250\] at (1.25) should be [200% 250\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [1 2 3px 4%\] from add [1 2 3px 4%\] to add [101 102 103px 104%\] at (0.25) should be [27 29 31px 33%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (0) should be [2 4 6 8\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (1.25) should be [225px 275px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20\] from add [100 150px\] to add [200% 250\] at (0.25) should be [100 150px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (1) should be [102 104 106 108\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (0.75) should be [175 175px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (0.75) should be [275 450 700 650\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (0.25) should be [175px 175px 250px 250px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (0.25) should be [225 350 500 550\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (1.25) should be [75px 75px 50px 50px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (-0.25) should be [125px 125\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (1.25) should be [225 225px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (0.5) should be [150px 200px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (1) should be [0px 0\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (1) should be [300 500 800 700\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (0.75) should be [125px 125px 150px 150px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (1) should be [200px 250px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (-0.25) should be [75px 125px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [1 2 3px 4%\] from add [1 2 3px 4%\] to add [101 102 103px 104%\] at (1) should be [102 104 106px 108%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (1) should be [200 200px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [1 2 3px 4%\] from add [1 2 3px 4%\] to add [101 102 103px 104%\] at (0) should be [2 4 6px 8%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (0.25) should be [75px 75\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (-0.25) should be [225px 225px 350px 350px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20\] from add [100 150px\] to add [200% 250\] at (0.5) should be [200% 250\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (1.25) should be [325 550 900 750\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20\] from add [100 150px\] to add [200% 250\] at (-0.25) should be [100 150px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (0) should be [200px 200px 300px 300px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (0.25) should be [125 125px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20\] from add [100 150px\] to add [200% 250\] at (1) should be [200% 250\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (0.75) should be [175px 225px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (0.25) should be [27 29 31 33\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20\] from add [100 150px\] to add [200% 250\] at (0.75) should be [200% 250\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (0.5) should be [250 400 600 600\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [1 2 3px 4%\] from add [1 2 3px 4%\] to add [101 102 103px 104%\] at (1.25) should be [127 129 131px 133%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (-0.25) should be [175 250 300 450\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (0.5) should be [150px 150px 200px 200px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (1.25) should be [0px 0\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (0) should be [100px 150px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (0.25) should be [125px 175px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [1 2 3px 4%\] from add [1 2 3px 4%\] to add [101 102 103px 104%\] at (0.75) should be [77 79 81px 83%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (0) should be [200 300 400 500\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20\] from add [100 150px\] to add [200% 250\] at (0) should be [100 150px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (-0.25) should be [75 75px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (0.5) should be [52 54 56 58\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (-0.25) should be [0\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (0.5) should be [150 150px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (0) should be [100 100px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (0.75) should be [25px 25\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (0) should be [100px 100\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (0.5) should be [50px 50\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (1.25) should be [127 129 131 133\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (1) should be [100px\]]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-backgrounds/animations/border-top-left-radius-composition.html.ini b/tests/wpt/metadata/css/css-backgrounds/animations/border-top-left-radius-composition.html.ini
new file mode 100644
index 00000000000..25995a6b87f
--- /dev/null
+++ b/tests/wpt/metadata/css/css-backgrounds/animations/border-top-left-radius-composition.html.ini
@@ -0,0 +1,64 @@
+[border-top-left-radius-composition.html]
+ [Compositing: property <border-top-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (1.25) should be [225px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0.25) should be [125px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (1) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0.25) should be [125px 140px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0) should be [100px 120px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (1.25) should be [225px 100px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0) should be [100px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (1) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0) should be [100px 200px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0.75) should be [175px 140px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0.75) should be [175px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (-0.25) should be [75px 220px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0.25) should be [125px 180px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (-0.25) should be [75px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (-0.25) should be [75px 100px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0.75) should be [175px 180px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0.5) should be [150px 160px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0.5) should be [150px 160px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (1) should be [200px 120px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0.5) should be [150px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (1.25) should be [225px 220px\]]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-backgrounds/animations/border-top-right-radius-composition.html.ini b/tests/wpt/metadata/css/css-backgrounds/animations/border-top-right-radius-composition.html.ini
new file mode 100644
index 00000000000..682ccbf3446
--- /dev/null
+++ b/tests/wpt/metadata/css/css-backgrounds/animations/border-top-right-radius-composition.html.ini
@@ -0,0 +1,64 @@
+[border-top-right-radius-composition.html]
+ [Compositing: property <border-top-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (1.25) should be [225px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0.25) should be [125px 180px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0) should be [100px 120px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (1) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0.5) should be [150px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0.5) should be [150px 160px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (-0.25) should be [75px 100px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (1.25) should be [225px 100px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (1.25) should be [225px 220px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0.75) should be [175px 140px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0.5) should be [150px 160px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (1) should be [200px 120px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0) should be [100px 200px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0.25) should be [125px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (1) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0.75) should be [175px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0) should be [100px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0.25) should be [125px 140px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (-0.25) should be [75px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0.75) should be [175px 180px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (-0.25) should be [75px 220px\]]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-text/animations/letter-spacing-composition.html.ini b/tests/wpt/metadata/css/css-text/animations/letter-spacing-composition.html.ini
new file mode 100644
index 00000000000..e27601fb798
--- /dev/null
+++ b/tests/wpt/metadata/css/css-text/animations/letter-spacing-composition.html.ini
@@ -0,0 +1,46 @@
+[letter-spacing-composition.html]
+ [Compositing: property <letter-spacing> underlying [50px\] from add [100px\] to add [200px\] at (-0.3) should be [120px\]]
+ expected: FAIL
+
+ [Compositing: property <letter-spacing> underlying [100px\] from add [10px\] to add [2px\] at (0.5) should be [106px\]]
+ expected: FAIL
+
+ [Compositing: property <letter-spacing> underlying [100px\] from add [10px\] to add [2px\] at (-0.5) should be [114px\]]
+ expected: FAIL
+
+ [Compositing: property <letter-spacing> underlying [50px\] from add [100px\] to add [200px\] at (0) should be [150px\]]
+ expected: FAIL
+
+ [Compositing: property <letter-spacing> underlying [50px\] from add [100px\] to replace [200px\] at (1) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <letter-spacing> underlying [50px\] from add [100px\] to add [200px\] at (0.5) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <letter-spacing> underlying [50px\] from add [100px\] to add [200px\] at (1) should be [250px\]]
+ expected: FAIL
+
+ [Compositing: property <letter-spacing> underlying [50px\] from add [100px\] to replace [200px\] at (1.5) should be [225px\]]
+ expected: FAIL
+
+ [Compositing: property <letter-spacing> underlying [100px\] from add [10px\] to add [2px\] at (1.5) should be [98px\]]
+ expected: FAIL
+
+ [Compositing: property <letter-spacing> underlying [50px\] from add [100px\] to replace [200px\] at (0.5) should be [175px\]]
+ expected: FAIL
+
+ [Compositing: property <letter-spacing> underlying [100px\] from add [10px\] to add [2px\] at (0) should be [110px\]]
+ expected: FAIL
+
+ [Compositing: property <letter-spacing> underlying [50px\] from add [100px\] to add [200px\] at (1.5) should be [300px\]]
+ expected: FAIL
+
+ [Compositing: property <letter-spacing> underlying [50px\] from add [100px\] to replace [200px\] at (0) should be [150px\]]
+ expected: FAIL
+
+ [Compositing: property <letter-spacing> underlying [100px\] from add [10px\] to add [2px\] at (1) should be [102px\]]
+ expected: FAIL
+
+ [Compositing: property <letter-spacing> underlying [50px\] from add [100px\] to replace [200px\] at (-0.3) should be [135px\]]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-text/animations/text-indent-composition.html.ini b/tests/wpt/metadata/css/css-text/animations/text-indent-composition.html.ini
new file mode 100644
index 00000000000..bf9cc8cda70
--- /dev/null
+++ b/tests/wpt/metadata/css/css-text/animations/text-indent-composition.html.ini
@@ -0,0 +1,94 @@
+[text-indent-composition.html]
+ [Compositing: property <text-indent> underlying [250px\] from add [50px each-line hanging\] to replace [150px hanging each-line\] at (0.6) should be [110px hanging each-line\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [250px each-line\] from add [50px each-line\] to replace [150px hanging\] at (1) should be [150px hanging\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [50%\] from replace [-100%\] to add [50%\] at (0) should be [-100%\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [250px\] from add [50px each-line hanging\] to replace [150px hanging each-line\] at (0.3) should be [80px hanging each-line\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [50%\] from replace [-100%\] to add [50%\] at (0.6) should be [20%\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [50%\] from replace [-100%\] to add [50%\] at (0.3) should be [-40%\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [250px\] from add [50px each-line hanging\] to replace [150px hanging each-line\] at (0) should be [50px hanging each-line\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [250px each-line\] from add [50px each-line\] to replace [150px hanging\] at (1.5) should be [150px hanging\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [100%\] from add [50px\] to add [150px\] at (0.6) should be [calc(100% + 110px)\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [250px\] from add [50px each-line hanging\] to replace [150px hanging each-line\] at (1) should be [150px hanging each-line\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [250px\] from add [50px\] to replace [100px\] at (0.6) should be [180px\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [100%\] from add [50px\] to add [150px\] at (-0.3) should be [calc(100% + 20px)\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [100%\] from add [50px\] to add [150px\] at (0.3) should be [calc(100% + 80px)\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [250px\] from add [50px each-line hanging\] to replace [150px hanging each-line\] at (1.5) should be [200px hanging each-line\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [50%\] from replace [-100%\] to add [50%\] at (1.5) should be [200%\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [250px\] from add [50px\] to replace [100px\] at (1) should be [100px\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [250px each-line\] from add [50px each-line\] to replace [150px hanging\] at (0.6) should be [150px hanging\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [100%\] from add [50px\] to add [150px\] at (0) should be [calc(100% + 50px)\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [250px\] from add [50px\] to replace [100px\] at (0.3) should be [240px\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [250px\] from add [50px\] to replace [100px\] at (1.5) should be [0px\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [250px\] from add [50px each-line hanging\] to replace [150px hanging each-line\] at (-0.3) should be [20px hanging each-line\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [100%\] from add [50px\] to add [150px\] at (1.5) should be [calc(100% + 200px)\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [250px each-line\] from add [50px each-line\] to replace [150px hanging\] at (-0.3) should be [300px each-line\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [250px\] from add [50px\] to replace [100px\] at (0) should be [300px\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [250px\] from add [50px\] to replace [100px\] at (-0.3) should be [360px\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [50%\] from replace [-100%\] to add [50%\] at (0.5) should be [0%\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [50%\] from replace [-100%\] to add [50%\] at (1) should be [100%\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [50%\] from replace [-100%\] to add [50%\] at (-0.3) should be [-160%\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [250px each-line\] from add [50px each-line\] to replace [150px hanging\] at (0) should be [300px each-line\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [100%\] from add [50px\] to add [150px\] at (1) should be [calc(100% + 150px)\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [250px each-line\] from add [50px each-line\] to replace [150px hanging\] at (0.3) should be [300px each-line\]]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-text/animations/word-spacing-composition.html.ini b/tests/wpt/metadata/css/css-text/animations/word-spacing-composition.html.ini
new file mode 100644
index 00000000000..def2fce15d0
--- /dev/null
+++ b/tests/wpt/metadata/css/css-text/animations/word-spacing-composition.html.ini
@@ -0,0 +1,46 @@
+[word-spacing-composition.html]
+ [Compositing: property <word-spacing> underlying [50px\] from add [100px\] to add [200px\] at (0) should be [150px\]]
+ expected: FAIL
+
+ [Compositing: property <word-spacing> underlying [100px\] from add [10px\] to add [2px\] at (1) should be [102px\]]
+ expected: FAIL
+
+ [Compositing: property <word-spacing> underlying [50px\] from add [100px\] to replace [200px\] at (0) should be [150px\]]
+ expected: FAIL
+
+ [Compositing: property <word-spacing> underlying [100px\] from add [10px\] to add [2px\] at (-0.5) should be [114px\]]
+ expected: FAIL
+
+ [Compositing: property <word-spacing> underlying [50px\] from add [100px\] to replace [200px\] at (-0.3) should be [135px\]]
+ expected: FAIL
+
+ [Compositing: property <word-spacing> underlying [50px\] from add [100px\] to add [200px\] at (-0.3) should be [120px\]]
+ expected: FAIL
+
+ [Compositing: property <word-spacing> underlying [50px\] from add [100px\] to replace [200px\] at (0.5) should be [175px\]]
+ expected: FAIL
+
+ [Compositing: property <word-spacing> underlying [50px\] from add [100px\] to add [200px\] at (0.5) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <word-spacing> underlying [100px\] from add [10px\] to add [2px\] at (1.5) should be [98px\]]
+ expected: FAIL
+
+ [Compositing: property <word-spacing> underlying [100px\] from add [10px\] to add [2px\] at (0.5) should be [106px\]]
+ expected: FAIL
+
+ [Compositing: property <word-spacing> underlying [50px\] from add [100px\] to replace [200px\] at (1) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <word-spacing> underlying [50px\] from add [100px\] to add [200px\] at (1) should be [250px\]]
+ expected: FAIL
+
+ [Compositing: property <word-spacing> underlying [50px\] from add [100px\] to replace [200px\] at (1.5) should be [225px\]]
+ expected: FAIL
+
+ [Compositing: property <word-spacing> underlying [100px\] from add [10px\] to add [2px\] at (0) should be [110px\]]
+ expected: FAIL
+
+ [Compositing: property <word-spacing> underlying [50px\] from add [100px\] to add [200px\] at (1.5) should be [300px\]]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/custom-elements/upgrading.html.ini b/tests/wpt/metadata/custom-elements/upgrading.html.ini
index 8f4577d5b77..e8aee585a04 100644
--- a/tests/wpt/metadata/custom-elements/upgrading.html.ini
+++ b/tests/wpt/metadata/custom-elements/upgrading.html.ini
@@ -5,3 +5,9 @@
[If definition's disable shadow is true and element's shadow root is non-null, then throw a "NotSupportedError" DOMException.]
expected: FAIL
+ [Infinite constructor recursion with upgrade(this) should not be possible]
+ expected: FAIL
+
+ [Infinite constructor recursion with appendChild should not be possible]
+ 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 35c569d8e34..bd2b1f9e21b 100644
--- a/tests/wpt/metadata/fetch/content-type/response.window.js.ini
+++ b/tests/wpt/metadata/fetch/content-type/response.window.js.ini
@@ -309,21 +309,18 @@
[<iframe>: separate response Content-Type: */* text/html]
expected: FAIL
- [<iframe>: combined response Content-Type: text/html;" text/plain]
- expected: FAIL
-
[<iframe>: combined 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 */*;charset=gbk]
+ [<iframe>: combined response Content-Type: text/html */*;charset=gbk]
expected: FAIL
- [<iframe>: separate response Content-Type: text/plain */*]
+ [<iframe>: separate response Content-Type: text/html;" \\" text/plain]
expected: FAIL
- [<iframe>: combined response Content-Type: text/html */*;charset=gbk]
+ [<iframe>: separate response Content-Type: text/plain */*;charset=gbk]
expected: FAIL
diff --git a/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini b/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini
index ecd755157c7..87c807a49ff 100644
--- a/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini
+++ b/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini
@@ -11,9 +11,3 @@
[X-Content-Type-Options%3A%20nosniff%0C]
expected: FAIL
- [X-Content-Type-Options%3A%20%40%23%24%23%25%25%26%5E%26%5E*()()11!%2Cnosniff]
- expected: FAIL
-
- [X-Content-Type-Options%3A%20%2Cnosniff]
- 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 80ebd73cb00..6bd06899fdd 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
@@ -8,7 +8,7 @@
expected: FAIL
[Embedded credentials are treated as network errors in new windows.]
- expected: TIMEOUT
+ expected: FAIL
[Embedded credentials matching the top-level are treated as network errors for cross-origin URLs.]
expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini
new file mode 100644
index 00000000000..87b07c3e670
--- /dev/null
+++ b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini
@@ -0,0 +1,4 @@
+[traverse_the_history_1.html]
+ [Multiple history traversals from the same task]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_2.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_2.html.ini
new file mode 100644
index 00000000000..75d75b4cda2
--- /dev/null
+++ b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_2.html.ini
@@ -0,0 +1,4 @@
+[traverse_the_history_2.html]
+ [Multiple history traversals, last would be aborted]
+ 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 6852d7663de..c12c0f8ae48 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,8 +1,4 @@
[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/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini
index a56bad443a2..66bd350083b 100644
--- a/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini
+++ b/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini
@@ -1,5 +1,4 @@
[realtimeanalyser-fft-scaling.html]
- expected: TIMEOUT
[X 2048-point FFT peak position is not equal to 64. Got 0.]
expected: FAIL
diff --git a/tests/wpt/metadata/webmessaging/with-ports/017.html.ini b/tests/wpt/metadata/webmessaging/with-ports/017.html.ini
new file mode 100644
index 00000000000..064cf47545b
--- /dev/null
+++ b/tests/wpt/metadata/webmessaging/with-ports/017.html.ini
@@ -0,0 +1,5 @@
+[017.html]
+ expected: TIMEOUT
+ [origin of the script that invoked the method, about:blank]
+ 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 268949ced5c..f584fce5df1 100644
--- a/tests/wpt/metadata/workers/semantics/multiple-workers/005.html.ini
+++ b/tests/wpt/metadata/workers/semantics/multiple-workers/005.html.ini
@@ -1,4 +1,5 @@
[005.html]
+ expected: ERROR
[dedicated worker in shared worker in dedicated worker]
expected: FAIL
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-bottom-left-radius-composition.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-bottom-left-radius-composition.html
new file mode 100644
index 00000000000..87042d1969d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-bottom-left-radius-composition.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>border-bottom-left-radius composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-backgrounds-3/#the-border-radius">
+<meta name="assert" content="border-bottom-left-radius supports animation by computed value">
+
+<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: 'border-bottom-left-radius',
+ underlying: '40px 40px',
+ addFrom: '60px 60px',
+ addTo: '160px 160px',
+}, [
+ {at: -0.25, expect: '75px'},
+ {at: 0, expect: '100px'},
+ {at: 0.25, expect: '125px'},
+ {at: 0.5, expect: '150px'},
+ {at: 0.75, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.25, expect: '225px'},
+]);
+
+test_composition({
+ property: 'border-bottom-left-radius',
+ underlying: '40px 140px',
+ replaceFrom: '100px 120px',
+ addTo: '160px 60px',
+}, [
+ {at: -0.25, expect: '75px 100px'},
+ {at: 0, expect: '100px 120px'},
+ {at: 0.25, expect: '125px 140px'},
+ {at: 0.5, expect: '150px 160px'},
+ {at: 0.75, expect: '175px 180px'},
+ {at: 1, expect: '200px'},
+ {at: 1.25, expect: '225px 220px'},
+]);
+
+test_composition({
+ property: 'border-bottom-left-radius',
+ underlying: '40px 60px',
+ addFrom: '60px 140px',
+ replaceTo: '200px 120px',
+}, [
+ {at: -0.25, expect: '75px 220px'},
+ {at: 0, expect: '100px 200px'},
+ {at: 0.25, expect: '125px 180px'},
+ {at: 0.5, expect: '150px 160px'},
+ {at: 0.75, expect: '175px 140px'},
+ {at: 1, expect: '200px 120px'},
+ {at: 1.25, expect: '225px 100px'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-bottom-right-radius-composition.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-bottom-right-radius-composition.html
new file mode 100644
index 00000000000..2b5a72df691
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-bottom-right-radius-composition.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>border-bottom-right-radius composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-backgrounds-3/#the-border-radius">
+<meta name="assert" content="border-bottom-right-radius supports animation by computed value">
+
+<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: 'border-bottom-right-radius',
+ underlying: '40px 40px',
+ addFrom: '60px 60px',
+ addTo: '160px 160px',
+}, [
+ {at: -0.25, expect: '75px'},
+ {at: 0, expect: '100px'},
+ {at: 0.25, expect: '125px'},
+ {at: 0.5, expect: '150px'},
+ {at: 0.75, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.25, expect: '225px'},
+]);
+
+test_composition({
+ property: 'border-bottom-right-radius',
+ underlying: '40px 140px',
+ replaceFrom: '100px 120px',
+ addTo: '160px 60px',
+}, [
+ {at: -0.25, expect: '75px 100px'},
+ {at: 0, expect: '100px 120px'},
+ {at: 0.25, expect: '125px 140px'},
+ {at: 0.5, expect: '150px 160px'},
+ {at: 0.75, expect: '175px 180px'},
+ {at: 1, expect: '200px'},
+ {at: 1.25, expect: '225px 220px'},
+]);
+
+test_composition({
+ property: 'border-bottom-right-radius',
+ underlying: '40px 60px',
+ addFrom: '60px 140px',
+ replaceTo: '200px 120px',
+}, [
+ {at: -0.25, expect: '75px 220px'},
+ {at: 0, expect: '100px 200px'},
+ {at: 0.25, expect: '125px 180px'},
+ {at: 0.5, expect: '150px 160px'},
+ {at: 0.75, expect: '175px 140px'},
+ {at: 1, expect: '200px 120px'},
+ {at: 1.25, expect: '225px 100px'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-bottom-width-composition.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-bottom-width-composition.html
new file mode 100644
index 00000000000..5377c0ab42b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-bottom-width-composition.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>border-bottom-width composition</title>
+<link rel="help" href="https://www.w3.org/TR/CSS2/box.html#border-width-properties">
+<meta name="assert" content="border-bottom-width supports animation by computed value">
+
+<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: 'border-bottom-width',
+ 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: 'border-bottom-width',
+ 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: 'border-bottom-width',
+ underlying: '10em',
+ addFrom: '100px',
+ addTo: '20em',
+}, [
+ {at: -0.3, expect: 'calc(130px + 4em)'},
+ {at: 0, expect: 'calc(100px + 10em)'},
+ {at: 0.5, expect: 'calc(50px + 20em)'},
+ {at: 1, expect: '30em'},
+ {at: 1.5, expect: 'calc(-50px + 40em)'},
+]);
+
+test_composition({
+ property: 'border-bottom-width',
+ 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/css/css-backgrounds/animations/border-image-outset-composition.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-image-outset-composition.html
new file mode 100644
index 00000000000..e3311711753
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-image-outset-composition.html
@@ -0,0 +1,133 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>border-image-outset composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-backgrounds-3/#border-image-outset">
+<meta name="assert" content="border-image-outset supports animation by computed value">
+
+<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: 'border-image-outset',
+ underlying: '1 2 3 4',
+ addFrom: '1 2 3 4',
+ addTo: '101 102 103 104',
+}, [
+ {at: -0.25, expect: '0'}, // Non-negative.
+ {at: 0, expect: '2 4 6 8'},
+ {at: 0.25, expect: '27 29 31 33'},
+ {at: 0.5, expect: '52 54 56 58'},
+ {at: 0.75, expect: '77 79 81 83'},
+ {at: 1, expect: '102 104 106 108'},
+ {at: 1.25, expect: '127 129 131 133'},
+]);
+
+test_composition({
+ property: 'border-image-outset',
+ underlying: '100 200 300 400',
+ addFrom: '100',
+ addTo: '200 300 500',
+}, [
+ {at: -0.25, expect: '175 250 300 450'},
+ {at: 0, expect: '200 300 400 500'},
+ {at: 0.25, expect: '225 350 500 550'},
+ {at: 0.5, expect: '250 400 600 600'},
+ {at: 0.75, expect: '275 450 700 650'},
+ {at: 1, expect: '300 500 800 700'},
+ {at: 1.25, expect: '325 550 900 750'},
+]);
+
+test_composition({
+ property: 'border-image-outset',
+ underlying: '1 2 3px 4px',
+ addFrom: '1 2 3px 4px',
+ addTo: '101 102 103px 104px',
+}, [
+ {at: -0.25, expect: '0 0 0px 0px'}, // Non-negative.
+ {at: 0, expect: '2 4 6px 8px'},
+ {at: 0.25, expect: '27 29 31px 33px'},
+ {at: 0.5, expect: '52 54 56px 58px'},
+ {at: 0.75, expect: '77 79 81px 83px'},
+ {at: 1, expect: '102 104 106px 108px'},
+ {at: 1.25, expect: '127 129 131px 133px'},
+]);
+
+test_composition({
+ property: 'border-image-outset',
+ underlying: '10px 20px',
+ addFrom: '190px 180px 290px 280px',
+ addTo: '90px 80px',
+}, [
+ {at: -0.25, expect: '225px 225px 350px 350px'},
+ {at: 0, expect: '200px 200px 300px 300px'},
+ {at: 0.25, expect: '175px 175px 250px 250px'},
+ {at: 0.5, expect: '150px 150px 200px 200px'},
+ {at: 0.75, expect: '125px 125px 150px 150px'},
+ {at: 1, expect: '100px'},
+ {at: 1.25, expect: '75px 75px 50px 50px'},
+]);
+
+test_composition({
+ property: 'border-image-outset',
+ underlying: '10 20px',
+ replaceFrom: '100 100px',
+ addTo: '190 180px',
+}, [
+ {at: -0.25, expect: '75 75px'},
+ {at: 0, expect: '100 100px'},
+ {at: 0.25, expect: '125 125px'},
+ {at: 0.5, expect: '150 150px'},
+ {at: 0.75, expect: '175 175px'},
+ {at: 1, expect: '200 200px'},
+ {at: 1.25, expect: '225 225px'},
+]);
+
+test_composition({
+ property: 'border-image-outset',
+ underlying: '10px 20',
+ addFrom: '90px 80',
+ replaceTo: '0px 0 0px 0',
+}, [
+ {at: -0.25, expect: '125px 125'},
+ {at: 0, expect: '100px 100'},
+ {at: 0.25, expect: '75px 75'},
+ {at: 0.5, expect: '50px 50'},
+ {at: 0.75, expect: '25px 25'},
+ {at: 1, expect: '0px 0'},
+ {at: 1.25, expect: '0px 0'}, // Non-negative.
+]);
+
+test_composition({
+ property: 'border-image-outset',
+ underlying: '10 20',
+ addFrom: '100px 150px',
+ addTo: '200px 250px',
+}, [
+ {at: -0.25, expect: '75px 125px'},
+ {at: 0, expect: '100px 150px'},
+ {at: 0.25, expect: '125px 175px'},
+ {at: 0.5, expect: '150px 200px'},
+ {at: 0.75, expect: '175px 225px'},
+ {at: 1, expect: '200px 250px'},
+ {at: 1.25, expect: '225px 275px'},
+]);
+
+test_composition({
+ property: 'border-image-outset',
+ underlying: '10 20',
+ addFrom: '100 150px',
+ addTo: '200px 250',
+}, [
+ {at: -0.25, expect: '100 150px'},
+ {at: 0, expect: '100 150px'},
+ {at: 0.25, expect: '100 150px'},
+ {at: 0.5, expect: '200px 250'},
+ {at: 0.75, expect: '200px 250'},
+ {at: 1, expect: '200px 250'},
+ {at: 1.25, expect: '200px 250'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-image-slice-composition.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-image-slice-composition.html
new file mode 100644
index 00000000000..d0ccb1a3a64
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-image-slice-composition.html
@@ -0,0 +1,133 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>border-image-slice composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-backgrounds-3/#border-image-slice">
+<meta name="assert" content="border-image-slice supports animation by computed value">
+
+<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: 'border-image-slice',
+ underlying: '1 2 3 4',
+ addFrom: '1 2 3 4',
+ addTo: '101 102 103 104',
+}, [
+ {at: -0.25, expect: '0'}, // Non-negative.
+ {at: 0, expect: '2 4 6 8'},
+ {at: 0.25, expect: '27 29 31 33'},
+ {at: 0.5, expect: '52 54 56 58'},
+ {at: 0.75, expect: '77 79 81 83'},
+ {at: 1, expect: '102 104 106 108'},
+ {at: 1.25, expect: '127 129 131 133'},
+]);
+
+test_composition({
+ property: 'border-image-slice',
+ underlying: '100 200 300 400 fill',
+ addFrom: '100 fill',
+ addTo: '200 300 500 fill',
+}, [
+ {at: -0.25, expect: '175 250 300 450 fill'},
+ {at: 0, expect: '200 300 400 500 fill'},
+ {at: 0.25, expect: '225 350 500 550 fill'},
+ {at: 0.5, expect: '250 400 600 600 fill'},
+ {at: 0.75, expect: '275 450 700 650 fill'},
+ {at: 1, expect: '300 500 800 700 fill'},
+ {at: 1.25, expect: '325 550 900 750 fill'},
+]);
+
+test_composition({
+ property: 'border-image-slice',
+ underlying: '1 2 3% 4%',
+ addFrom: '1 2 3% 4%',
+ addTo: '101 102 103% 104%',
+}, [
+ {at: -0.25, expect: '0 0 0% 0%'}, // Non-negative.
+ {at: 0, expect: '2 4 6% 8%'},
+ {at: 0.25, expect: '27 29 31% 33%'},
+ {at: 0.5, expect: '52 54 56% 58%'},
+ {at: 0.75, expect: '77 79 81% 83%'},
+ {at: 1, expect: '102 104 106% 108%'},
+ {at: 1.25, expect: '127 129 131% 133%'},
+]);
+
+test_composition({
+ property: 'border-image-slice',
+ underlying: '10% 20%',
+ addFrom: '190% 180% 290% 280%',
+ addTo: '90% 80%',
+}, [
+ {at: -0.25, expect: '225% 225% 350% 350%'},
+ {at: 0, expect: '200% 200% 300% 300%'},
+ {at: 0.25, expect: '175% 175% 250% 250%'},
+ {at: 0.5, expect: '150% 150% 200% 200%'},
+ {at: 0.75, expect: '125% 125% 150% 150%'},
+ {at: 1, expect: '100%'},
+ {at: 1.25, expect: '75% 75% 50% 50%'},
+]);
+
+test_composition({
+ property: 'border-image-slice',
+ underlying: '10 20%',
+ replaceFrom: '100 100%',
+ addTo: '190 180%',
+}, [
+ {at: -0.25, expect: '75 75%'},
+ {at: 0, expect: '100 100%'},
+ {at: 0.25, expect: '125 125%'},
+ {at: 0.5, expect: '150 150%'},
+ {at: 0.75, expect: '175 175%'},
+ {at: 1, expect: '200 200%'},
+ {at: 1.25, expect: '225 225%'},
+]);
+
+test_composition({
+ property: 'border-image-slice',
+ underlying: '10% 20',
+ addFrom: '90% 80',
+ replaceTo: '0% 0 0% 0',
+}, [
+ {at: -0.25, expect: '125% 125'},
+ {at: 0, expect: '100% 100'},
+ {at: 0.25, expect: '75% 75'},
+ {at: 0.5, expect: '50% 50'},
+ {at: 0.75, expect: '25% 25'},
+ {at: 1, expect: '0% 0'},
+ {at: 1.25, expect: '0% 0'}, // Non-negative.
+]);
+
+test_composition({
+ property: 'border-image-slice',
+ underlying: '10 20',
+ addFrom: '100% 150%',
+ addTo: '200% 250% fill',
+}, [
+ {at: -0.25, expect: '100% 150%'},
+ {at: 0, expect: '100% 150%'},
+ {at: 0.25, expect: '100% 150%'},
+ {at: 0.5, expect: '200% 250% fill'},
+ {at: 0.75, expect: '200% 250% fill'},
+ {at: 1, expect: '200% 250% fill'},
+ {at: 1.25, expect: '200% 250% fill'},
+]);
+
+test_composition({
+ property: 'border-image-slice',
+ underlying: '10 20',
+ addFrom: '100 150%',
+ addTo: '200% 250',
+}, [
+ {at: -0.25, expect: '100 150%'},
+ {at: 0, expect: '100 150%'},
+ {at: 0.25, expect: '100 150%'},
+ {at: 0.5, expect: '200% 250'},
+ {at: 0.75, expect: '200% 250'},
+ {at: 1, expect: '200% 250'},
+ {at: 1.25, expect: '200% 250'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-image-width-composition.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-image-width-composition.html
new file mode 100644
index 00000000000..0d0a1dc4ed2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-image-width-composition.html
@@ -0,0 +1,133 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>border-image-width composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-backgrounds-3/#border-image-width">
+<meta name="assert" content="border-image-width supports animation by computed value">
+
+<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: 'border-image-width',
+ underlying: '1 2 3 4',
+ addFrom: '1 2 3 4',
+ addTo: '101 102 103 104',
+}, [
+ {at: -0.25, expect: '0'}, // Non-negative.
+ {at: 0, expect: '2 4 6 8'},
+ {at: 0.25, expect: '27 29 31 33'},
+ {at: 0.5, expect: '52 54 56 58'},
+ {at: 0.75, expect: '77 79 81 83'},
+ {at: 1, expect: '102 104 106 108'},
+ {at: 1.25, expect: '127 129 131 133'},
+]);
+
+test_composition({
+ property: 'border-image-width',
+ underlying: '100 200 300 400',
+ addFrom: '100',
+ addTo: '200 300 500',
+}, [
+ {at: -0.25, expect: '175 250 300 450'},
+ {at: 0, expect: '200 300 400 500'},
+ {at: 0.25, expect: '225 350 500 550'},
+ {at: 0.5, expect: '250 400 600 600'},
+ {at: 0.75, expect: '275 450 700 650'},
+ {at: 1, expect: '300 500 800 700'},
+ {at: 1.25, expect: '325 550 900 750'},
+]);
+
+test_composition({
+ property: 'border-image-width',
+ underlying: '1 2 3px 4%',
+ addFrom: '1 2 3px 4%',
+ addTo: '101 102 103px 104%',
+}, [
+ {at: -0.25, expect: '0 0 0px 0%'}, // Non-negative.
+ {at: 0, expect: '2 4 6px 8%'},
+ {at: 0.25, expect: '27 29 31px 33%'},
+ {at: 0.5, expect: '52 54 56px 58%'},
+ {at: 0.75, expect: '77 79 81px 83%'},
+ {at: 1, expect: '102 104 106px 108%'},
+ {at: 1.25, expect: '127 129 131px 133%'},
+]);
+
+test_composition({
+ property: 'border-image-width',
+ underlying: '10px 20px',
+ addFrom: '190px 180px 290px 280px',
+ addTo: '90px 80px',
+}, [
+ {at: -0.25, expect: '225px 225px 350px 350px'},
+ {at: 0, expect: '200px 200px 300px 300px'},
+ {at: 0.25, expect: '175px 175px 250px 250px'},
+ {at: 0.5, expect: '150px 150px 200px 200px'},
+ {at: 0.75, expect: '125px 125px 150px 150px'},
+ {at: 1, expect: '100px'},
+ {at: 1.25, expect: '75px 75px 50px 50px'},
+]);
+
+test_composition({
+ property: 'border-image-width',
+ underlying: '10 20px',
+ replaceFrom: '100 100px',
+ addTo: '190 180px',
+}, [
+ {at: -0.25, expect: '75 75px'},
+ {at: 0, expect: '100 100px'},
+ {at: 0.25, expect: '125 125px'},
+ {at: 0.5, expect: '150 150px'},
+ {at: 0.75, expect: '175 175px'},
+ {at: 1, expect: '200 200px'},
+ {at: 1.25, expect: '225 225px'},
+]);
+
+test_composition({
+ property: 'border-image-width',
+ underlying: '10px 20',
+ addFrom: '90px 80',
+ replaceTo: '0px 0 0px 0',
+}, [
+ {at: -0.25, expect: '125px 125'},
+ {at: 0, expect: '100px 100'},
+ {at: 0.25, expect: '75px 75'},
+ {at: 0.5, expect: '50px 50'},
+ {at: 0.75, expect: '25px 25'},
+ {at: 1, expect: '0px 0'},
+ {at: 1.25, expect: '0px 0'}, // Non-negative.
+]);
+
+test_composition({
+ property: 'border-image-width',
+ underlying: '10 20',
+ addFrom: '100px 150px',
+ addTo: '200px 250px',
+}, [
+ {at: -0.25, expect: '75px 125px'},
+ {at: 0, expect: '100px 150px'},
+ {at: 0.25, expect: '125px 175px'},
+ {at: 0.5, expect: '150px 200px'},
+ {at: 0.75, expect: '175px 225px'},
+ {at: 1, expect: '200px 250px'},
+ {at: 1.25, expect: '225px 275px'},
+]);
+
+test_composition({
+ property: 'border-image-width',
+ underlying: '10 20',
+ addFrom: '100 150px',
+ addTo: '200% 250',
+}, [
+ {at: -0.25, expect: '100 150px'},
+ {at: 0, expect: '100 150px'},
+ {at: 0.25, expect: '100 150px'},
+ {at: 0.5, expect: '200% 250'},
+ {at: 0.75, expect: '200% 250'},
+ {at: 1, expect: '200% 250'},
+ {at: 1.25, expect: '200% 250'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-left-width-composition.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-left-width-composition.html
new file mode 100644
index 00000000000..1b90effbc32
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-left-width-composition.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>border-left-width composition</title>
+<link rel="help" href="https://www.w3.org/TR/CSS2/box.html#border-width-properties">
+<meta name="assert" content="border-left-width supports animation by computed value">
+
+<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: 'border-left-width',
+ 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: 'border-left-width',
+ 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: 'border-left-width',
+ underlying: '10em',
+ addFrom: '100px',
+ addTo: '20em',
+}, [
+ {at: -0.3, expect: 'calc(130px + 4em)'},
+ {at: 0, expect: 'calc(100px + 10em)'},
+ {at: 0.5, expect: 'calc(50px + 20em)'},
+ {at: 1, expect: '30em'},
+ {at: 1.5, expect: 'calc(-50px + 40em)'},
+]);
+
+test_composition({
+ property: 'border-left-width',
+ 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/css/css-backgrounds/animations/border-right-width-composition.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-right-width-composition.html
new file mode 100644
index 00000000000..aa9e1dcc667
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-right-width-composition.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>border-right-width composition</title>
+<link rel="help" href="https://www.w3.org/TR/CSS2/box.html#border-width-properties">
+<meta name="assert" content="border-right-width supports animation by computed value">
+
+<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: 'border-right-width',
+ 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: 'border-right-width',
+ 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: 'border-right-width',
+ underlying: '10em',
+ addFrom: '100px',
+ addTo: '20em',
+}, [
+ {at: -0.3, expect: 'calc(130px + 4em)'},
+ {at: 0, expect: 'calc(100px + 10em)'},
+ {at: 0.5, expect: 'calc(50px + 20em)'},
+ {at: 1, expect: '30em'},
+ {at: 1.5, expect: 'calc(-50px + 40em)'},
+]);
+
+test_composition({
+ property: 'border-right-width',
+ 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/css/css-backgrounds/animations/border-top-left-radius-composition.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-top-left-radius-composition.html
new file mode 100644
index 00000000000..1c2056bc010
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-top-left-radius-composition.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>border-top-left-radius composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-backgrounds-3/#the-border-radius">
+<meta name="assert" content="border-top-left-radius supports animation by computed value">
+
+<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: 'border-top-left-radius',
+ underlying: '40px 40px',
+ addFrom: '60px 60px',
+ addTo: '160px 160px',
+}, [
+ {at: -0.25, expect: '75px'},
+ {at: 0, expect: '100px'},
+ {at: 0.25, expect: '125px'},
+ {at: 0.5, expect: '150px'},
+ {at: 0.75, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.25, expect: '225px'},
+]);
+
+test_composition({
+ property: 'border-top-left-radius',
+ underlying: '40px 140px',
+ replaceFrom: '100px 120px',
+ addTo: '160px 60px',
+}, [
+ {at: -0.25, expect: '75px 100px'},
+ {at: 0, expect: '100px 120px'},
+ {at: 0.25, expect: '125px 140px'},
+ {at: 0.5, expect: '150px 160px'},
+ {at: 0.75, expect: '175px 180px'},
+ {at: 1, expect: '200px'},
+ {at: 1.25, expect: '225px 220px'},
+]);
+
+test_composition({
+ property: 'border-top-left-radius',
+ underlying: '40px 60px',
+ addFrom: '60px 140px',
+ replaceTo: '200px 120px',
+}, [
+ {at: -0.25, expect: '75px 220px'},
+ {at: 0, expect: '100px 200px'},
+ {at: 0.25, expect: '125px 180px'},
+ {at: 0.5, expect: '150px 160px'},
+ {at: 0.75, expect: '175px 140px'},
+ {at: 1, expect: '200px 120px'},
+ {at: 1.25, expect: '225px 100px'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-top-right-radius-composition.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-top-right-radius-composition.html
new file mode 100644
index 00000000000..9a26d51375e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-top-right-radius-composition.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>border-top-right-radius composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-backgrounds-3/#the-border-radius">
+<meta name="assert" content="border-top-right-radius supports animation by computed value">
+
+<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: 'border-top-right-radius',
+ underlying: '40px 40px',
+ addFrom: '60px 60px',
+ addTo: '160px 160px',
+}, [
+ {at: -0.25, expect: '75px'},
+ {at: 0, expect: '100px'},
+ {at: 0.25, expect: '125px'},
+ {at: 0.5, expect: '150px'},
+ {at: 0.75, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.25, expect: '225px'},
+]);
+
+test_composition({
+ property: 'border-top-right-radius',
+ underlying: '40px 140px',
+ replaceFrom: '100px 120px',
+ addTo: '160px 60px',
+}, [
+ {at: -0.25, expect: '75px 100px'},
+ {at: 0, expect: '100px 120px'},
+ {at: 0.25, expect: '125px 140px'},
+ {at: 0.5, expect: '150px 160px'},
+ {at: 0.75, expect: '175px 180px'},
+ {at: 1, expect: '200px'},
+ {at: 1.25, expect: '225px 220px'},
+]);
+
+test_composition({
+ property: 'border-top-right-radius',
+ underlying: '40px 60px',
+ addFrom: '60px 140px',
+ replaceTo: '200px 120px',
+}, [
+ {at: -0.25, expect: '75px 220px'},
+ {at: 0, expect: '100px 200px'},
+ {at: 0.25, expect: '125px 180px'},
+ {at: 0.5, expect: '150px 160px'},
+ {at: 0.75, expect: '175px 140px'},
+ {at: 1, expect: '200px 120px'},
+ {at: 1.25, expect: '225px 100px'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-top-width-composition.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-top-width-composition.html
new file mode 100644
index 00000000000..475c3930b9d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-top-width-composition.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>border-top-width composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-backgrounds-3/#border-width">
+<meta name="assert" content="border-top-width supports animation by computed value">
+
+<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: 'border-top-width',
+ 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: 'border-top-width',
+ 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: 'border-top-width',
+ underlying: '10em',
+ addFrom: '100px',
+ addTo: '20em',
+}, [
+ {at: -0.3, expect: 'calc(130px + 4em)'},
+ {at: 0, expect: 'calc(100px + 10em)'},
+ {at: 0.5, expect: 'calc(50px + 20em)'},
+ {at: 1, expect: '30em'},
+ {at: 1.5, expect: 'calc(-50px + 40em)'},
+]);
+
+test_composition({
+ property: 'border-top-width',
+ 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/css/css-text/animations/letter-spacing-composition.html b/tests/wpt/web-platform-tests/css/css-text/animations/letter-spacing-composition.html
new file mode 100644
index 00000000000..c1b614b5eba
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/animations/letter-spacing-composition.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>letter-spacing composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#letter-spacing-property">
+<meta name="test" content="letter-spacing 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 src="../interpolation/resources/interpolation-test.js"></script>
+<script>
+test_composition({
+ property: 'letter-spacing',
+ 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: 'letter-spacing',
+ 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: 'letter-spacing',
+ 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/css/css-text/animations/text-indent-composition.html b/tests/wpt/web-platform-tests/css/css-text/animations/text-indent-composition.html
new file mode 100644
index 00000000000..57c528ca271
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/animations/text-indent-composition.html
@@ -0,0 +1,84 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>letter-spacing composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#text-indent-property">
+<meta name="test" content="text-indent 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></body>
+<script>
+test_composition({
+ property: 'text-indent',
+ underlying: '100%',
+ addFrom: '50px',
+ addTo: '150px',
+}, [
+ {at: -0.3, expect: 'calc(100% + 20px)'},
+ {at: 0, expect: 'calc(100% + 50px)'},
+ {at: 0.3, expect: 'calc(100% + 80px)'},
+ {at: 0.6, expect: 'calc(100% + 110px)'},
+ {at: 1, expect: 'calc(100% + 150px)'},
+ {at: 1.5, expect: 'calc(100% + 200px)'},
+]);
+
+test_composition({
+ property: 'text-indent',
+ underlying: '250px',
+ addFrom: '50px',
+ replaceTo: '100px',
+}, [
+ {at: -0.3, expect: '360px'},
+ {at: 0, expect: '300px'},
+ {at: 0.3, expect: '240px'},
+ {at: 0.6, expect: '180px'},
+ {at: 1, expect: '100px'},
+ {at: 1.5, expect: '0px'},
+]);
+
+test_composition({
+ property: 'text-indent',
+ underlying: '50%',
+ replaceFrom: '-100%',
+ addTo: '50%',
+}, [
+ {at: -0.3, expect: '-160%'},
+ {at: 0, expect: '-100%'},
+ {at: 0.3, expect: '-40%'},
+ {at: 0.5, expect: '0%'},
+ {at: 0.6, expect: '20%'},
+ {at: 1, expect: '100%'},
+ {at: 1.5, expect: '200%'},
+]);
+
+test_composition({
+ property: 'text-indent',
+ underlying: '250px',
+ addFrom: '50px each-line hanging',
+ replaceTo: '150px hanging each-line',
+}, [
+ {at: -0.3, expect: '20px hanging each-line'},
+ {at: 0, expect: '50px hanging each-line'},
+ {at: 0.3, expect: '80px hanging each-line'},
+ {at: 0.6, expect: '110px hanging each-line'},
+ {at: 1, expect: '150px hanging each-line'},
+ {at: 1.5, expect: '200px hanging each-line'},
+]);
+
+test_composition({
+ property: 'text-indent',
+ underlying: '250px each-line',
+ addFrom: '50px each-line',
+ replaceTo: '150px hanging',
+}, [
+ {at: -0.3, expect: '300px each-line'},
+ {at: 0, expect: '300px each-line'},
+ {at: 0.3, expect: '300px each-line'},
+ {at: 0.6, expect: '150px hanging'},
+ {at: 1, expect: '150px hanging'},
+ {at: 1.5, expect: '150px hanging'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-text/animations/word-spacing-composition.html b/tests/wpt/web-platform-tests/css/css-text/animations/word-spacing-composition.html
new file mode 100644
index 00000000000..17aacaef150
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/animations/word-spacing-composition.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>word-spacing composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#word-spacing-property">
+<meta name="test" content="word-spacing 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: 'word-spacing',
+ 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: 'word-spacing',
+ 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: 'word-spacing',
+ 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/css/motion/animation/offset-anchor-composition.html b/tests/wpt/web-platform-tests/css/motion/animation/offset-anchor-composition.html
new file mode 100644
index 00000000000..53210fdf38a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/motion/animation/offset-anchor-composition.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>offset-anchor composition</title>
+<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
+<link rel="help" href="https://drafts.fxtf.org/motion-1/#offset-anchor-property">
+<meta name="assert" content="offset-anchor supports animation.">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<style>
+.target {
+ width: 200px;
+ height: 200px;
+}
+</style>
+<body>
+<script>
+test_composition({
+ property: 'offset-anchor',
+ underlying: '40px 60px',
+ addFrom: '60px 40px',
+ addTo: '160px 140px',
+}, [
+ {at: -0.25, expect: '75px 75px'},
+ {at: 0, expect: '100px 100px'},
+ {at: 0.25, expect: '125px 125px'},
+ {at: 0.5, expect: '150px 150px'},
+ {at: 0.75, expect: '175px 175px'},
+ {at: 1, expect: '200px 200px'},
+ {at: 1.25, expect: '225px 225px'},
+]);
+
+test_composition({
+ property: 'offset-anchor',
+ underlying: 'top 20% left 40%',
+ addFrom: 'left 60% top 80%',
+ addTo: 'right 80% bottom 40%',
+}, [
+ {at: -0.25, expect: '110% 105%'},
+ {at: 0, expect: '100% 100%'},
+ {at: 0.25, expect: '90% 95%'},
+ {at: 0.5, expect: '80% 90%'},
+ {at: 0.75, expect: '70% 85%'},
+ {at: 1, expect: '60% 80%'},
+ {at: 1.25, expect: '50% 75%'},
+]);
+
+test_composition({
+ property: 'offset-anchor',
+ underlying: '40px 60px',
+ replaceFrom: '100px 200px',
+ addTo: '160px 40px',
+}, [
+ {at: -0.25, expect: '75px 225px'},
+ {at: 0, expect: '100px 200px'},
+ {at: 0.25, expect: '125px 175px'},
+ {at: 0.5, expect: '150px 150px'},
+ {at: 0.75, expect: '175px 125px'},
+ {at: 1, expect: '200px 100px'},
+ {at: 1.25, expect: '225px 75px'},
+]);
+
+test_composition({
+ property: 'offset-anchor',
+ underlying: '40px 60px',
+ addFrom: '60px 140px',
+ replaceTo: '200px 100px',
+}, [
+ {at: -0.25, expect: '75px 225px'},
+ {at: 0, expect: '100px 200px'},
+ {at: 0.25, expect: '125px 175px'},
+ {at: 0.5, expect: '150px 150px'},
+ {at: 0.75, expect: '175px 125px'},
+ {at: 1, expect: '200px 100px'},
+ {at: 1.25, expect: '225px 75px'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/motion/animation/offset-distance-composition.html b/tests/wpt/web-platform-tests/css/motion/animation/offset-distance-composition.html
new file mode 100644
index 00000000000..4ff6e95b057
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/motion/animation/offset-distance-composition.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>offset-distance composition</title>
+<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
+<link rel="help" href="https://drafts.fxtf.org/motion-1/#offset-distance-property">
+<meta name="assert" content="offset-distance 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: 'offset-distance',
+ 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: 'offset-distance',
+ 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: 'offset-distance',
+ 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: 'offset-distance',
+ 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/css/motion/animation/offset-path-composition.html b/tests/wpt/web-platform-tests/css/motion/animation/offset-path-composition.html
new file mode 100644
index 00000000000..eedd363efaf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/motion/animation/offset-path-composition.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>offset-distance composition</title>
+<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
+<link rel="help" href="https://drafts.fxtf.org/motion-1/#offset-distance-property">
+<meta name="assert" content="offset-distance supports animation.">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+// TODO(ericwilligers) Support additive animation for path strings crbug.com/699308
+
+// Ray paths compose.
+test_composition({
+ property: 'offset-path',
+ underlying: 'ray(20deg sides)',
+ addFrom: 'ray(10deg sides)',
+ addTo: 'ray(20deg sides)',
+}, [
+ {at: -0.3, expect: 'ray(27deg sides)'},
+ {at: 0, expect: 'ray(30deg sides)'},
+ {at: 0.3, expect: 'ray(33deg sides)'},
+ {at: 0.6, expect: 'ray(36deg sides)'},
+ {at: 1, expect: 'ray(40deg sides)'},
+ {at: 1.5, expect: 'ray(45deg sides)'},
+]);
+
+// Ray paths without contain don't compose with underlying contain.
+test_composition({
+ property: 'offset-path',
+ underlying: 'ray(20deg closest-corner contain)',
+ addFrom: 'ray(10deg closest-corner)',
+ addTo: 'ray(20deg closest-corner)',
+}, [
+ {at: -0.3, expect: 'ray(7deg closest-corner)'},
+ {at: 0, expect: 'ray(10deg closest-corner)'},
+ {at: 0.3, expect: 'ray(13deg closest-corner)'},
+ {at: 0.6, expect: 'ray(16deg closest-corner)'},
+ {at: 1, expect: 'ray(20deg closest-corner)'},
+ {at: 1.5, expect: 'ray(25deg closest-corner)'},
+]);
+
+// Ray paths don't compose when underlying has different size.
+test_composition({
+ property: 'offset-path',
+ underlying: 'ray(20deg closest-side)',
+ addFrom: 'ray(10deg closest-corner)',
+ addTo: 'ray(20deg closest-corner)',
+}, [
+ {at: -0.3, expect: 'ray(7deg closest-corner)'},
+ {at: 0, expect: 'ray(10deg closest-corner)'},
+ {at: 0.3, expect: 'ray(13deg closest-corner)'},
+ {at: 0.6, expect: 'ray(16deg closest-corner)'},
+ {at: 1, expect: 'ray(20deg closest-corner)'},
+ {at: 1.5, expect: 'ray(25deg closest-corner)'},
+]);
+
+// Ray contain paths compose with underlying contain.
+test_composition({
+ property: 'offset-path',
+ underlying: 'ray(20deg farthest-side contain)',
+ addFrom: 'ray(190deg farthest-side contain)',
+ addTo: 'ray(20deg farthest-side contain)',
+}, [
+ {at: -0.3, expect: 'ray(261deg farthest-side contain)'},
+ {at: 0, expect: 'ray(210deg farthest-side contain)'},
+ {at: 0.3, expect: 'ray(159deg farthest-side contain)'},
+ {at: 0.6, expect: 'ray(108deg farthest-side contain)'},
+ {at: 1, expect: 'ray(40deg farthest-side contain)'},
+ {at: 1.5, expect: 'ray(-45deg farthest-side contain)'},
+]);
+
+// When we can't interpolate, we can't compose.
+test_composition({
+ property: 'offset-path',
+ underlying: 'ray(20deg farthest-corner)',
+ addFrom: 'ray(190deg farthest-corner contain)',
+ addTo: 'ray(20deg farthest-corner)',
+}, [
+ {at: -0.3, expect: 'ray(190deg farthest-corner contain)'},
+ {at: 0, expect: 'ray(190deg farthest-corner contain)'},
+ {at: 0.3, expect: 'ray(190deg farthest-corner contain)'},
+ {at: 0.6, expect: 'ray(40deg farthest-corner)'},
+ {at: 1, expect: 'ray(40deg farthest-corner)'},
+ {at: 1.5, expect: 'ray(40deg farthest-corner)'},
+]);
+
+test_composition({
+ property: 'offset-path',
+ underlying: 'ray(20deg sides)',
+ replaceFrom: 'ray(190deg sides contain)',
+ addTo: 'ray(20deg sides)',
+}, [
+ {at: -0.3, expect: 'ray(190deg sides contain)'},
+ {at: 0, expect: 'ray(190deg sides contain)'},
+ {at: 0.3, expect: 'ray(190deg sides contain)'},
+ {at: 0.6, expect: 'ray(40deg sides)'},
+ {at: 1, expect: 'ray(40deg sides)'},
+ {at: 1.5, expect: 'ray(40deg sides)'},
+]);
+
+// Ray paths compose with underlying.
+test_composition({
+ property: 'offset-path',
+ underlying: 'ray(20deg closest-side)',
+ addFrom: 'ray(10deg closest-side)',
+ replaceTo: 'ray(10deg closest-side)',
+}, [
+ {at: -0.3, expect: 'ray(36deg closest-side)'},
+ {at: 0, expect: 'ray(30deg closest-side)'},
+ {at: 0.3, expect: 'ray(24deg closest-side)'},
+ {at: 0.6, expect: 'ray(18deg closest-side)'},
+ {at: 1, expect: 'ray(10deg closest-side)'},
+ {at: 1.5, expect: 'ray(0deg closest-side)'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/motion/animation/offset-position-composition.html b/tests/wpt/web-platform-tests/css/motion/animation/offset-position-composition.html
new file mode 100644
index 00000000000..0ee517a73a8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/motion/animation/offset-position-composition.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>offset-position composition</title>
+<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
+<link rel="help" href="https://drafts.fxtf.org/motion-1/#offset-position-property">
+<meta name="assert" content="offset-position supports <position> animation.">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<style>
+.target {
+ width: 200px;
+ height: 200px;
+}
+</style>
+<body>
+<script>
+test_composition({
+ property: 'offset-position',
+ underlying: '40px 60px',
+ addFrom: '60px 40px',
+ addTo: '160px 140px',
+}, [
+ {at: -0.25, expect: '75px 75px'},
+ {at: 0, expect: '100px 100px'},
+ {at: 0.25, expect: '125px 125px'},
+ {at: 0.5, expect: '150px 150px'},
+ {at: 0.75, expect: '175px 175px'},
+ {at: 1, expect: '200px 200px'},
+ {at: 1.25, expect: '225px 225px'},
+]);
+
+test_composition({
+ property: 'offset-position',
+ underlying: 'top 20% left 40%',
+ addFrom: 'left 60% top 80%',
+ addTo: 'right 80% bottom 40%',
+}, [
+ {at: -0.25, expect: '110% 105%'},
+ {at: 0, expect: '100% 100%'},
+ {at: 0.25, expect: '90% 95%'},
+ {at: 0.5, expect: '80% 90%'},
+ {at: 0.75, expect: '70% 85%'},
+ {at: 1, expect: '60% 80%'},
+ {at: 1.25, expect: '50% 75%'},
+]);
+
+test_composition({
+ property: 'offset-position',
+ underlying: '40px 60px',
+ replaceFrom: '100px 200px',
+ addTo: '160px 40px',
+}, [
+ {at: -0.25, expect: '75px 225px'},
+ {at: 0, expect: '100px 200px'},
+ {at: 0.25, expect: '125px 175px'},
+ {at: 0.5, expect: '150px 150px'},
+ {at: 0.75, expect: '175px 125px'},
+ {at: 1, expect: '200px 100px'},
+ {at: 1.25, expect: '225px 75px'},
+]);
+
+test_composition({
+ property: 'offset-position',
+ underlying: '40px 60px',
+ addFrom: '60px 140px',
+ replaceTo: '200px 100px',
+}, [
+ {at: -0.25, expect: '75px 225px'},
+ {at: 0, expect: '100px 200px'},
+ {at: 0.25, expect: '125px 175px'},
+ {at: 0.5, expect: '150px 150px'},
+ {at: 0.75, expect: '175px 125px'},
+ {at: 1, expect: '200px 100px'},
+ {at: 1.25, expect: '225px 75px'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/motion/animation/offset-rotate-composition.html b/tests/wpt/web-platform-tests/css/motion/animation/offset-rotate-composition.html
new file mode 100644
index 00000000000..bf60c19abef
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/motion/animation/offset-rotate-composition.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>offset-rotate composition</title>
+<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
+<link rel="help" href="https://drafts.fxtf.org/motion-1/#offset-rotate-property">
+<meta name="assert" content="offset-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>
+// Angle rotations compose.
+test_composition({
+ property: 'offset-rotate',
+ underlying: '20deg',
+ addFrom: '10deg',
+ addTo: '20deg',
+}, [
+ {at: -0.3, expect: '27deg'},
+ {at: 0, expect: '30deg'},
+ {at: 0.3, expect: '33deg'},
+ {at: 0.6, expect: '36deg'},
+ {at: 1, expect: '40deg'},
+ {at: 1.5, expect: '45deg'},
+]);
+
+// Angle rotations don't compose with underlying 'auto'.
+test_composition({
+ property: 'offset-rotate',
+ underlying: 'auto 20deg',
+ addFrom: '10deg',
+ addTo: '20deg',
+}, [
+ {at: -0.3, expect: '7deg'},
+ {at: 0, expect: '10deg'},
+ {at: 0.3, expect: '13deg'},
+ {at: 0.6, expect: '16deg'},
+ {at: 1, expect: '20deg'},
+ {at: 1.5, expect: '25deg'},
+]);
+
+// Auto rotations compose with underlying 'auto'.
+test_composition({
+ property: 'offset-rotate',
+ underlying: 'auto 20deg',
+ addFrom: 'reverse 10deg',
+ addTo: 'auto 20deg',
+}, [
+ {at: -0.3, expect: 'auto 261deg'},
+ {at: 0, expect: 'auto 210deg'},
+ {at: 0.3, expect: 'auto 159deg'},
+ {at: 0.6, expect: 'auto 108deg'},
+ {at: 1, expect: 'auto 40deg'},
+ {at: 1.5, expect: 'auto -45deg'},
+]);
+
+// When we can't interpolate, we can't compose.
+test_composition({
+ property: 'offset-rotate',
+ underlying: '20deg',
+ addFrom: 'reverse 10deg',
+ addTo: '20deg',
+}, [
+ {at: -0.3, expect: 'auto 190deg'},
+ {at: 0, expect: 'auto 190deg'},
+ {at: 0.3, expect: 'auto 190deg'},
+ {at: 0.6, expect: '40deg'},
+ {at: 1, expect: '40deg'},
+ {at: 1.5, expect: '40deg'},
+]);
+
+test_composition({
+ property: 'offset-rotate',
+ underlying: '20deg',
+ replaceFrom: 'reverse 10deg',
+ addTo: '20deg',
+}, [
+ {at: -0.3, expect: 'auto 190deg'},
+ {at: 0, expect: 'auto 190deg'},
+ {at: 0.3, expect: 'auto 190deg'},
+ {at: 0.6, expect: '40deg'},
+ {at: 1, expect: '40deg'},
+ {at: 1.5, expect: '40deg'},
+]);
+
+// Angle rotations compose with underlying angle.
+test_composition({
+ property: 'offset-rotate',
+ underlying: '20deg',
+ addFrom: '10deg',
+ replaceTo: '10deg',
+}, [
+ {at: -0.3, expect: '36deg'},
+ {at: 0, expect: '30deg'},
+ {at: 0.3, expect: '24deg'},
+ {at: 0.6, expect: '18deg'},
+ {at: 1, expect: '10deg'},
+ {at: 1.5, expect: '0deg'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/custom-elements/pseudo-class-defined.html b/tests/wpt/web-platform-tests/custom-elements/pseudo-class-defined.html
index 60d88cffb51..24cb5fe4cd3 100644
--- a/tests/wpt/web-platform-tests/custom-elements/pseudo-class-defined.html
+++ b/tests/wpt/web-platform-tests/custom-elements/pseudo-class-defined.html
@@ -90,4 +90,22 @@ function test_defined(expected, element, description) {
assert_equals(style.color, expected ? defined : not_defined, 'getComputedStyle');
}, `${description} should ${expected ? 'be' : 'not be'} :defined`);
}
+
+test(function () {
+ var log = [];
+ var instance = document.createElement('my-custom-element-2');
+ document.body.appendChild(instance);
+ customElements.define('my-custom-element-2',class extends HTMLElement {
+ constructor() {
+ super();
+ log.push([this, 'begin']);
+ assert_false(this.matches(":defined"), "During construction, this should not match :defined");
+ log.push([this, 'end']);
+ }
+ });
+ assert_equals(log.length, 2);
+ assert_array_equals(log[0], [instance, 'begin']);
+ assert_array_equals(log[1], [instance, 'end']);
+}, 'this.matches(:defined) should not match during an upgrade');
+
</script>
diff --git a/tests/wpt/web-platform-tests/custom-elements/upgrading.html b/tests/wpt/web-platform-tests/custom-elements/upgrading.html
index d6b8ed38754..ac0fdff7a21 100644
--- a/tests/wpt/web-platform-tests/custom-elements/upgrading.html
+++ b/tests/wpt/web-platform-tests/custom-elements/upgrading.html
@@ -12,6 +12,9 @@
<script src="resources/custom-elements-helpers.js"></script>
</head>
<body>
+<infinite-cloning-element-1></infinite-cloning-element-1>
+<infinite-cloning-element-2 id="a"></infinite-cloning-element-2>
+<infinite-cloning-element-2 id="b"></infinite-cloning-element-2>
<div id="log"></div>
<script>
setup({allow_uncaught_exception:true});
@@ -203,6 +206,53 @@ test(() => {
}, 'If definition\'s disable shadow is true and element\'s shadow root is ' +
'non-null, then throw a "NotSupportedError" DOMException.');
+test(() => {
+ var log = [];
+
+ customElements.define('infinite-cloning-element-1',class extends HTMLElement {
+ constructor() {
+ super();
+ log.push([this, 'begin']);
+ // Potential infinite recursion:
+ customElements.upgrade(this);
+ log.push([this, 'end']);
+ }
+ });
+
+ assert_equals(log.length, 2);
+ const instance = document.querySelector("infinite-cloning-element-1");
+ assert_array_equals(log[0], [instance, 'begin']);
+ assert_array_equals(log[1], [instance, 'end']);
+}, 'Infinite constructor recursion with upgrade(this) should not be possible');
+
+test(() => {
+ var log = [];
+
+ customElements.define('infinite-cloning-element-2',class extends HTMLElement {
+ constructor() {
+ super();
+ log.push([this, 'begin']);
+ const b = document.querySelector("#b");
+ b.remove();
+ // While this constructor is running for "a", "b" is still
+ // undefined, and so inserting it into the document will enqueue a
+ // second upgrade reaction for "b" in addition to the one enqueued
+ // by defining x-foo.
+ document.body.appendChild(b);
+ log.push([this, 'end']);
+ }
+ });
+
+ assert_equals(log.length, 4);
+ const instanceA = document.querySelector("#a");
+ const instanceB = document.querySelector("#b");
+ assert_array_equals(log[0], [instanceA, 'begin']);
+ assert_array_equals(log[1], [instanceB, 'begin']);
+ assert_array_equals(log[2], [instanceB, 'end']);
+ assert_array_equals(log[3], [instanceA, 'end']);
+}, 'Infinite constructor recursion with appendChild should not be possible');
+
+
</script>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/domxpath/lexical-structure.html b/tests/wpt/web-platform-tests/domxpath/lexical-structure.html
new file mode 100644
index 00000000000..f93820b0e41
--- /dev/null
+++ b/tests/wpt/web-platform-tests/domxpath/lexical-structure.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<link rel="help" href="https://www.w3.org/TR/1999/REC-xpath-19991116/#exprlex">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<script>
+function parse(expression) {
+ document.evaluate(expression, document, null, XPathResult.ANY_TYPE, null);
+}
+
+// https://www.w3.org/TR/1999/REC-xpath-19991116/#NT-Literal
+test(() => {
+ parse(' \'a"bc\' ');
+ parse(' "a\'bc" ');
+
+ assert_throws(new SyntaxError(), () => { parse(' \u2019xyz\u2019 '); });
+}, 'Literal: Only \' and " should be handled as literal quotes.');
+
+// https://www.w3.org/TR/1999/REC-xpath-19991116/#NT-ExprWhitespace
+test(() => {
+ parse(' \t\r\n.\r\n\t ');
+
+ assert_throws(new SyntaxError(), () => { parse('\x0B\x0C .'); });
+ assert_throws(new SyntaxError(), () => { parse('\x0E\x0F .'); });
+ assert_throws(new SyntaxError(), () => { parse('\u3000 .'); });
+ assert_throws(new SyntaxError(), () => { parse('\u2029 .'); });
+}, 'ExprWhitespace: Only #x20 #x9 #xD or #xA must be handled as a whitespace.');
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/time.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/time.html
index ad4e38cbc74..ec815d4cb30 100644
--- a/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/time.html
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/time.html
@@ -291,8 +291,11 @@ test(function(){
} , "stepDown stop so lower than the minimum value");
test(function(){
+ // Set min value to ensure that 15:01 - base is a multiple of 2 min (i.e., a
+ // valid value).
+ _StepTest.min = "14:01";
_StepTest.max = "15:01";
- this.add_cleanup(function() { _StepTest.max = ""; });
+ this.add_cleanup(function() { _StepTest.min = _StepTest.max = ""; });
_StepTest.value = "15:00";
_StepTest.step = "120";
_StepTest.stepUp();
diff --git a/tests/wpt/web-platform-tests/interfaces/webaudio.idl b/tests/wpt/web-platform-tests/interfaces/webaudio.idl
index 674673d90b1..9491090337c 100644
--- a/tests/wpt/web-platform-tests/interfaces/webaudio.idl
+++ b/tests/wpt/web-platform-tests/interfaces/webaudio.idl
@@ -26,28 +26,36 @@ interface BaseAudioContext : EventTarget {
AnalyserNode createAnalyser ();
BiquadFilterNode createBiquadFilter ();
- AudioBuffer createBuffer (unsigned long numberOfChannels, unsigned long length, float sampleRate);
+ AudioBuffer createBuffer (unsigned long numberOfChannels,
+ unsigned long length,
+ float sampleRate);
AudioBufferSourceNode createBufferSource ();
ChannelMergerNode createChannelMerger (optional unsigned long numberOfInputs = 6);
- ChannelSplitterNode createChannelSplitter (optional unsigned long numberOfOutputs = 6);
+ ChannelSplitterNode createChannelSplitter (
+ optional unsigned long numberOfOutputs = 6);
ConstantSourceNode createConstantSource ();
ConvolverNode createConvolver ();
DelayNode createDelay (optional double maxDelayTime = 1.0);
DynamicsCompressorNode createDynamicsCompressor ();
GainNode createGain ();
- IIRFilterNode createIIRFilter (sequence<double> feedforward, sequence<double> feedback);
+ IIRFilterNode createIIRFilter (sequence<double> feedforward,
+ sequence<double> feedback);
OscillatorNode createOscillator ();
PannerNode createPanner ();
- PeriodicWave createPeriodicWave (sequence<float> real, sequence<float> imag, optional PeriodicWaveConstraints constraints = {});
- ScriptProcessorNode createScriptProcessor(optional unsigned long bufferSize = 0,
- optional unsigned long numberOfInputChannels = 2,
- optional unsigned long numberOfOutputChannels = 2);
+ PeriodicWave createPeriodicWave (sequence<float> real,
+ sequence<float> imag,
+ optional PeriodicWaveConstraints constraints = {});
+ ScriptProcessorNode createScriptProcessor(
+ optional unsigned long bufferSize = 0,
+ optional unsigned long numberOfInputChannels = 2,
+ optional unsigned long numberOfOutputChannels = 2);
StereoPannerNode createStereoPanner ();
WaveShaperNode createWaveShaper ();
- Promise<AudioBuffer> decodeAudioData (ArrayBuffer audioData,
- optional DecodeSuccessCallback? successCallback,
- optional DecodeErrorCallback? errorCallback);
+ Promise<AudioBuffer> decodeAudioData (
+ ArrayBuffer audioData,
+ optional DecodeSuccessCallback? successCallback,
+ optional DecodeErrorCallback? errorCallback);
};
enum AudioContextLatencyCategory {
@@ -67,7 +75,8 @@ interface AudioContext : BaseAudioContext {
Promise<void> close ();
MediaElementAudioSourceNode createMediaElementSource (HTMLMediaElement mediaElement);
MediaStreamAudioSourceNode createMediaStreamSource (MediaStream mediaStream);
- MediaStreamTrackAudioSourceNode createMediaStreamTrackSource (MediaStreamTrack mediaStreamTrack);
+ MediaStreamTrackAudioSourceNode createMediaStreamTrackSource (
+ MediaStreamTrack mediaStreamTrack);
MediaStreamAudioDestinationNode createMediaStreamDestination ();
};
@@ -116,8 +125,14 @@ interface AudioBuffer {
readonly attribute double duration;
readonly attribute unsigned long numberOfChannels;
Float32Array getChannelData (unsigned long channel);
- void copyFromChannel (Float32Array destination, unsigned long channelNumber, optional unsigned long bufferOffset = 0);
- void copyToChannel (Float32Array source, unsigned long channelNumber, optional unsigned long bufferOffset = 0);
+ void copyFromChannel (Float32Array destination,
+ unsigned long channelNumber,
+ optional unsigned long bufferOffset = 0);
+ void copyToChannel (Float32Array source,
+
+ unsigned long channelNumber,
+
+ optional unsigned long bufferOffset = 0);
};
dictionary AudioBufferOptions {
@@ -136,7 +151,9 @@ interface AudioNode : EventTarget {
void disconnect (unsigned long output);
void disconnect (AudioNode destinationNode);
void disconnect (AudioNode destinationNode, unsigned long output);
- void disconnect (AudioNode destinationNode, unsigned long output, unsigned long input);
+ void disconnect (AudioNode destinationNode,
+ unsigned long output,
+ unsigned long input);
void disconnect (AudioParam destinationParam);
void disconnect (AudioParam destinationParam, unsigned long output);
readonly attribute BaseAudioContext context;
@@ -180,7 +197,11 @@ interface AudioParam {
AudioParam linearRampToValueAtTime (float value, double endTime);
AudioParam exponentialRampToValueAtTime (float value, double endTime);
AudioParam setTargetAtTime (float target, double startTime, float timeConstant);
- AudioParam setValueCurveAtTime (sequence<float> values, double startTime, double duration);
+ AudioParam setValueCurveAtTime (sequence<float> values,
+
+ double startTime,
+
+ double duration);
AudioParam cancelScheduledValues (double cancelTime);
AudioParam cancelAndHoldAtTime (double cancelTime);
};
@@ -215,7 +236,8 @@ dictionary AnalyserOptions : AudioNodeOptions {
[Exposed=Window]
interface AudioBufferSourceNode : AudioScheduledSourceNode {
- constructor (BaseAudioContext context, optional AudioBufferSourceOptions options = {});
+ constructor (BaseAudioContext context,
+ optional AudioBufferSourceOptions options = {});
attribute AudioBuffer? buffer;
readonly attribute AudioParam playbackRate;
readonly attribute AudioParam detune;
@@ -289,7 +311,9 @@ interface BiquadFilterNode : AudioNode {
readonly attribute AudioParam detune;
readonly attribute AudioParam Q;
readonly attribute AudioParam gain;
- void getFrequencyResponse (Float32Array frequencyHz, Float32Array magResponse, Float32Array phaseResponse);
+ void getFrequencyResponse (Float32Array frequencyHz,
+ Float32Array magResponse,
+ Float32Array phaseResponse);
};
dictionary BiquadFilterOptions : AudioNodeOptions {
@@ -353,7 +377,8 @@ dictionary DelayOptions : AudioNodeOptions {
[Exposed=Window]
interface DynamicsCompressorNode : AudioNode {
- constructor (BaseAudioContext context, optional DynamicsCompressorOptions options = {});
+ constructor (BaseAudioContext context,
+ optional DynamicsCompressorOptions options = {});
readonly attribute AudioParam threshold;
readonly attribute AudioParam knee;
readonly attribute AudioParam ratio;
@@ -383,7 +408,9 @@ dictionary GainOptions : AudioNodeOptions {
[Exposed=Window]
interface IIRFilterNode : AudioNode {
constructor (BaseAudioContext context, IIRFilterOptions options);
- void getFrequencyResponse (Float32Array frequencyHz, Float32Array magResponse, Float32Array phaseResponse);
+ void getFrequencyResponse (Float32Array frequencyHz,
+ Float32Array magResponse,
+ Float32Array phaseResponse);
};
dictionary IIRFilterOptions : AudioNodeOptions {
@@ -555,7 +582,8 @@ callback AudioWorkletProcessorConstructor = AudioWorkletProcessor (object option
[Global=(Worklet, AudioWorklet), Exposed=AudioWorklet]
interface AudioWorkletGlobalScope : WorkletGlobalScope {
- void registerProcessor (DOMString name, AudioWorkletProcessorConstructor processorCtor);
+ void registerProcessor (DOMString name,
+ AudioWorkletProcessorConstructor processorCtor);
readonly attribute unsigned long long currentFrame;
readonly attribute double currentTime;
readonly attribute float sampleRate;
diff --git a/tests/wpt/web-platform-tests/interfaces/webrtc.idl b/tests/wpt/web-platform-tests/interfaces/webrtc.idl
index e30fc38fd00..49ed6bb0333 100644
--- a/tests/wpt/web-platform-tests/interfaces/webrtc.idl
+++ b/tests/wpt/web-platform-tests/interfaces/webrtc.idl
@@ -13,7 +13,7 @@ dictionary RTCConfiguration {
};
enum RTCIceCredentialType {
- "password",
+ "password"
};
dictionary RTCIceServer {
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 7eee8ce04c4..4bafc9b0ad8 100644
--- a/tests/wpt/web-platform-tests/resources/chromium/nfc-mock.js
+++ b/tests/wpt/web-platform-tests/resources/chromium/nfc-mock.js
@@ -24,6 +24,14 @@ function toMojoNDEFMessage(message) {
function toMojoNDEFRecord(record) {
let nfcRecord = new device.mojom.NDEFRecord();
+ if (record.recordType.search(':') != -1) {
+ // Simply checks the existence of ':' to decide whether it's an external
+ // type. As a mock, no need to really implement the validation algo at
+ // https://w3c.github.io/web-nfc/#dfn-validate-external-type.
+ nfcRecord.category = device.mojom.NDEFRecordTypeCategory.kExternal;
+ } else {
+ nfcRecord.category = device.mojom.NDEFRecordTypeCategory.kStandardized;
+ }
nfcRecord.recordType = record.recordType;
nfcRecord.mediaType = record.mediaType;
nfcRecord.id = record.id;
diff --git a/tests/wpt/web-platform-tests/web-animations/timing-model/animations/setting-the-playback-rate-of-an-animation.html b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/setting-the-playback-rate-of-an-animation.html
index 0522c43b16a..a1f9e4f3ace 100644
--- a/tests/wpt/web-platform-tests/web-animations/timing-model/animations/setting-the-playback-rate-of-an-animation.html
+++ b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/setting-the-playback-rate-of-an-animation.html
@@ -97,8 +97,8 @@ promise_test(async t => {
promise_test(async t => {
const animation = createDiv(t).animate(null, 100 * MS_PER_SEC);
- animation.currentTime = 50 * MS_PER_SEC;
await animation.ready;
+ animation.currentTime = 50 * MS_PER_SEC;
animation.playbackRate = 0;
// Ensure that current time does not drift.
assert_equals(animation.playState, 'running');
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 d46503ab172..c62ea7b0d62 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
@@ -260,15 +260,15 @@
test(() => {
assert_throws(new TypeError, () => new NDEFRecord(
- createRecord('foo.eXamPle.coM:bAr*-', "A string is not a BufferSource or NDEFMessage")),
+ createRecord('foo.eXamPle.com:bAr*-', "A string is not a BufferSource or NDEFMessage")),
'Only BufferSource and NDEFMessage are allowed to be the record data.');
let buffer = new ArrayBuffer(4);
new Uint8Array(buffer).set([1, 2, 3, 4]);
// Feed ArrayBuffer.
{
- const record = new NDEFRecord(createRecord('foo.eXamPle.coM:bAr*-', buffer, test_record_id));
- assert_equals(record.recordType, 'foo.example.com:bAr*-', 'recordType');
+ const record = new NDEFRecord(createRecord('foo.eXamPle.com:bAr*-', buffer, test_record_id));
+ assert_equals(record.recordType, 'foo.eXamPle.com:bAr*-', 'recordType');
assert_equals(record.mediaType, null, 'mediaType');
assert_equals(record.id, test_record_id, 'id');
assert_array_equals(new Uint8Array(record.data.buffer), [1, 2, 3, 4],
@@ -280,8 +280,8 @@
{
let buffer_view = new Uint8Array(buffer, 1);
const record = new NDEFRecord(createRecord(
- 'foo.eXamPle.coM:bAr*-', buffer_view, test_record_id));
- assert_equals(record.recordType, 'foo.example.com:bAr*-', 'recordType');
+ 'foo.eXamPle.com:bAr*-', buffer_view, test_record_id));
+ assert_equals(record.recordType, 'foo.eXamPle.com:bAr*-', 'recordType');
assert_equals(record.mediaType, null, 'mediaType');
assert_equals(record.id, test_record_id, 'id');
assert_array_equals(new Uint8Array(record.data.buffer), [2, 3, 4],
@@ -305,13 +305,23 @@
}, 'NDEFRecord constructor with record type string being treated as case sensitive');
test(() => {
+ // Length of the external type is 255, OK.
+ const record = new NDEFRecord(createRecord(
+ [...Array(251)].map(_ => 'a').join('') + ':xyz', test_buffer_data));
+ // Exceeding 255, Throws.
assert_throws(new TypeError, () => new NDEFRecord(createRecord(
- ':xyz', test_buffer_data)), 'The domain should not be empty.');
+ [...Array(252)].map(_ => 'a').join('') + ':xyz', test_buffer_data)),
+ 'The external type should not be longer than 255.');
+
assert_throws(new TypeError, () => new NDEFRecord(createRecord(
- '[:xyz', test_buffer_data)), '"[" is not a valid FQDN.');
+ 'xyz', test_buffer_data)), 'The external type must have a \':\'.');
+ assert_throws(new TypeError, () => new NDEFRecord(createRecord(
+ ':xyz', test_buffer_data)), 'The domain should not be empty.');
assert_throws(new TypeError, () => new NDEFRecord(createRecord(
'example.com:', test_buffer_data)), 'The type should not be empty.');
assert_throws(new TypeError, () => new NDEFRecord(createRecord(
+ 'example.com:xyz[', test_buffer_data)), 'The type should not contain \'[\'.');
+ assert_throws(new TypeError, () => new NDEFRecord(createRecord(
'example.com:xyz~', test_buffer_data)), 'The type should not contain \'~\'.');
assert_throws(new TypeError, () => new NDEFRecord(createRecord(
'example.com:xyz/', test_buffer_data)), 'The type should not contain \'/\'.');