aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorServo WPT Sync <32481905+servo-wpt-sync@users.noreply.github.com>2025-03-30 03:40:11 +0200
committerGitHub <noreply@github.com>2025-03-30 01:40:11 +0000
commitc593e15fa85ed9f447d890422f51878eac17c034 (patch)
tree86a7a5dbbb28bf1e72351981f9a34c59a12aa6ca
parent44faff047425988241993fffc2783a7388d88f2e (diff)
downloadservo-c593e15fa85ed9f447d890422f51878eac17c034.tar.gz
servo-c593e15fa85ed9f447d890422f51878eac17c034.zip
Update web-platform-tests to revision b'efce5c7cd31b0e1add4f41758504c767b56abeed' (#36222)
Signed-off-by: WPT Sync Bot <ghbot+wpt-sync@servo.org>
-rw-r--r--tests/wpt/meta/MANIFEST.json933
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-001.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-002.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-003.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-004.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-005.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-006.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-007.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-008.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-009.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-010.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-011.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-013.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-014.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-015.html.ini2
-rw-r--r--tests/wpt/meta/css/css-grid/alignment/grid-content-alignment-with-abspos-001.html.ini3
-rw-r--r--tests/wpt/meta/css/css-images/gradient/gradient-infinity-001.html.ini2
-rw-r--r--tests/wpt/meta/css/css-images/gradient/gradient-infinity-002.html.ini2
-rw-r--r--tests/wpt/meta/fetch/fetch-later/quota/same-origin-iframe/oversized-payload.tentative.https.window.js.ini1
-rw-r--r--tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/009.html.ini3
-rw-r--r--tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-same-origin-fragment.html.ini3
-rw-r--r--tests/wpt/meta/html/browsers/history/the-history-interface/history_pushstate_too_many_calls.optional.html.ini3
-rw-r--r--tests/wpt/meta/html/browsers/history/the-history-interface/history_replacestate_too_many_calls.optional.html.ini3
-rw-r--r--tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-transfer.html.ini2
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.size.large.html.ini2
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.size.large.worker.js.ini2
-rw-r--r--tests/wpt/meta/html/document-isolation-policy/credentialless-cache-storage-from-credentialless.https.tentative.window.js.ini54
-rw-r--r--tests/wpt/meta/html/document-isolation-policy/credentialless-cache-storage-from-none.https.tentative.window.js.ini90
-rw-r--r--tests/wpt/meta/html/document-isolation-policy/credentialless-cache-storage-from-require-corp.https.tentative.window.js.ini42
-rw-r--r--tests/wpt/meta/html/document-isolation-policy/credentialless-cache-storage.https.tentative.window.js.ini137
-rw-r--r--tests/wpt/meta/html/document-isolation-policy/reporting-subresource-corp.tentative.https.html.ini13
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini2
-rw-r--r--tests/wpt/tests/ai/language_detection/detector.https.tentative.any.js8
-rw-r--r--tests/wpt/tests/css/compositing/root-element-background-contain-hidden-crash.html11
-rw-r--r--tests/wpt/tests/css/css-align/blocks/WEB_FEATURES.yml4
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-css-zoom.html97
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-size-css-zoom.html49
-rw-r--r--tests/wpt/tests/css/css-anchor-position/reference/anchor-css-zoom-ref.html67
-rw-r--r--tests/wpt/tests/css/css-anchor-position/reference/anchor-size-css-zoom-ref.html36
-rw-r--r--tests/wpt/tests/css/css-anchor-position/viewport-overflow-hidden-invisible-anchor-crash.html28
-rw-r--r--tests/wpt/tests/css/css-flexbox/flex-shorthand-calc.html2
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/agnostic/gap-decorations-001-ref.html (renamed from tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-002-ref.html)0
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-001.html37
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-002.html39
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-003-ref.html79
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-003.html49
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-004-ref.html80
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-004.html49
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-005-ref.html80
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-005.html49
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-006-ref.html65
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-006.html49
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-007-ref.html50
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-007.html43
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-008-ref.html63
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-008.html43
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-009-ref.html95
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-009.html53
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-010-ref.html82
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-010.html51
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-011-ref.html79
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-011.html51
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-013-ref.html79
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-013.html51
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-014-ref.html79
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-014.html51
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-015.html46
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-002.html2
-rw-r--r--tests/wpt/tests/css/css-images/gradient/gradient-infinity-001-ref.html25
-rw-r--r--tests/wpt/tests/css/css-images/gradient/gradient-infinity-001.html40
-rw-r--r--tests/wpt/tests/css/css-images/gradient/gradient-infinity-002-ref.html25
-rw-r--r--tests/wpt/tests/css/css-images/gradient/gradient-infinity-002.html41
-rw-r--r--tests/wpt/tests/css/css-overflow/scrollbar-gutter-with-background-gradient-ref.html13
-rw-r--r--tests/wpt/tests/css/css-overflow/scrollbar-gutter-with-background-gradient.html13
-rw-r--r--tests/wpt/tests/css/css-ruby/ruby-inlinize-fieldset-crash.html8
-rw-r--r--tests/wpt/tests/css/css-typed-om/WEB_FEATURES.yml6
-rw-r--r--tests/wpt/tests/css/css-ui/cursor-calc-hotspot.html24
-rw-r--r--tests/wpt/tests/css/css-view-transitions/WEB_FEATURES.yml4
-rw-r--r--tests/wpt/tests/css/css-view-transitions/active-view-transition-on-non-root.html5
-rw-r--r--tests/wpt/tests/css/css-view-transitions/active-view-transition-type-on-non-root.html5
-rw-r--r--tests/wpt/tests/css/css-view-transitions/navigation/WEB_FEATURES.yml3
-rw-r--r--tests/wpt/tests/css/css-view-transitions/nested/nested-root-capture-with-clip-ref.html1
-rw-r--r--tests/wpt/tests/css/css-view-transitions/nested/nested-root-capture-with-clip.html7
-rw-r--r--tests/wpt/tests/css/css-view-transitions/parsing/WEB_FEATURES.yml4
-rw-r--r--tests/wpt/tests/css/css-view-transitions/pseudo-rendering-invalidation.html7
-rw-r--r--tests/wpt/tests/css/css-view-transitions/view-transition-types-matches-case-sensitive-ref.html22
-rw-r--r--tests/wpt/tests/css/css-view-transitions/view-transition-types-matches-case-sensitive.html76
-rw-r--r--tests/wpt/tests/encrypted-media/scripts/playback-temporary-events.js2
-rw-r--r--tests/wpt/tests/fledge/tentative/resources/additional-bids.py2
-rw-r--r--tests/wpt/tests/fledge/tentative/resources/bidding-logic.sub.py2
-rw-r--r--tests/wpt/tests/fledge/tentative/resources/fledge_http_server_util.py64
-rw-r--r--tests/wpt/tests/fledge/tentative/resources/permissions.py2
-rw-r--r--tests/wpt/tests/fledge/tentative/resources/trusted-bidding-signals.py25
-rw-r--r--tests/wpt/tests/fledge/tentative/resources/trusted-scoring-signals.py15
-rw-r--r--tests/wpt/tests/html/browsers/history/the-history-interface/history_pushstate_too_many_calls.optional.html20
-rw-r--r--tests/wpt/tests/html/browsers/history/the-history-interface/history_replacestate_too_many_calls.optional.html20
-rw-r--r--tests/wpt/tests/html/document-isolation-policy/credentialless-cache-storage-from-credentialless.https.tentative.window.js90
-rw-r--r--tests/wpt/tests/html/document-isolation-policy/credentialless-cache-storage-from-none.https.tentative.window.js108
-rw-r--r--tests/wpt/tests/html/document-isolation-policy/credentialless-cache-storage-from-require-corp.https.tentative.window.js84
-rw-r--r--tests/wpt/tests/html/document-isolation-policy/credentialless-cache-storage.https.tentative.window.js150
-rw-r--r--tests/wpt/tests/html/document-isolation-policy/credentialless-dedicated-worker.https.tentative.window.js116
-rw-r--r--tests/wpt/tests/html/document-isolation-policy/reporting-cache-storage-corp.tentative.https.html64
-rw-r--r--tests/wpt/tests/html/document-isolation-policy/reporting-subresource-corp.tentative.https.html250
-rw-r--r--tests/wpt/tests/html/document-isolation-policy/reporting-subresource-corp.tentative.https.html.headers1
-rw-r--r--tests/wpt/tests/html/document-isolation-policy/resources/common.js76
-rw-r--r--tests/wpt/tests/html/document-isolation-policy/resources/report.py42
-rw-r--r--tests/wpt/tests/html/semantics/popovers/popover-focus-tabindex.html41
-rw-r--r--tests/wpt/tests/resources/testdriver.js8
-rw-r--r--tests/wpt/tests/screen-capture/tentative/getdisplaymedia-captured-surface-resolution.https.html12
-rw-r--r--tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-getanimations.tentative.html68
-rw-r--r--tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger.html16
-rw-r--r--tests/wpt/tests/svg/painting/reftests/WEB_FEATURES.yml4
-rw-r--r--tests/wpt/tests/tools/lint/tests/test_file_lints.py28
-rw-r--r--tests/wpt/tests/tools/metadata/yaml/load.py17
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/executors/actions.py4
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/executors/executormarionette.py2
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py4
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/executors/protocol.py2
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/testdriver-extra.js4
-rw-r--r--tests/wpt/tests/web-animations/animation-model/animation-types/property-list.js30
-rw-r--r--tests/wpt/tests/webrtc/rtp-stats-lifetime.https.html102
121 files changed, 4208 insertions, 717 deletions
diff --git a/tests/wpt/meta/MANIFEST.json b/tests/wpt/meta/MANIFEST.json
index a84fe9adcc4..c6ce4dfd85b 100644
--- a/tests/wpt/meta/MANIFEST.json
+++ b/tests/wpt/meta/MANIFEST.json
@@ -596,6 +596,13 @@
{}
]
],
+ "root-element-background-contain-hidden-crash.html": [
+ "da07de5bf5126d4d951f2522315991807eb09fcc",
+ [
+ null,
+ {}
+ ]
+ ],
"root-element-filter-background-clip-text-crash.html": [
"e12e4bb80f40e09e189f7f239486be246ea67ade",
[
@@ -744,6 +751,13 @@
null,
{}
]
+ ],
+ "viewport-overflow-hidden-invisible-anchor-crash.html": [
+ "b2fa5255b5e891b983944c76e741e9cc291ca30c",
+ [
+ null,
+ {}
+ ]
]
},
"css-animations": {
@@ -4701,6 +4715,13 @@
null,
{}
]
+ ],
+ "ruby-inlinize-fieldset-crash.html": [
+ "5454362077c4e01c6edd6f19f7fe7801b86a4b1b",
+ [
+ null,
+ {}
+ ]
]
},
"css-scoping": {
@@ -124659,6 +124680,19 @@
{}
]
],
+ "anchor-css-zoom.html": [
+ "2fab3f2e56241f3e303e101ac68060c09c93cf77",
+ [
+ null,
+ [
+ [
+ "/css/css-anchor-position/reference/anchor-css-zoom-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"anchor-in-css-min-max-function.html": [
"c7e56ecc159bb9ea507fe9b8dd1cb0a8b05092b7",
[
@@ -125195,6 +125229,19 @@
{}
]
],
+ "anchor-size-css-zoom.html": [
+ "7bd9b799dfebcb632915b711575322fef4285284",
+ [
+ null,
+ [
+ [
+ "/css/css-anchor-position/reference/anchor-size-css-zoom-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"position-anchor-001.html": [
"b0a964485c65ed1c8eeff89a1406bda9f4ea9b48",
[
@@ -185499,6 +185546,190 @@
},
"css-gaps": {
"tentative": {
+ "flex": {
+ "flex-gap-decorations-001.html": [
+ "0667693f38c77e814a09930461f91956af9e3c85",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "flex-gap-decorations-002.html": [
+ "632b690434c5f27af9b06721b4203d773097fba4",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/agnostic/gap-decorations-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "flex-gap-decorations-003.html": [
+ "effab7fee24a20936dd0cc487947693c8e87a72d",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/flex/flex-gap-decorations-003-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "flex-gap-decorations-004.html": [
+ "a5c0698e7fa3829cd515323dbb851cc55c30db7d",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/flex/flex-gap-decorations-004-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "flex-gap-decorations-005.html": [
+ "1688d447d50dbab028f0a8a82815f5661f921d53",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/flex/flex-gap-decorations-005-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "flex-gap-decorations-006.html": [
+ "3d7dbfd9fedb7513c77b7c5dce132935c8e52617",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/flex/flex-gap-decorations-006-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "flex-gap-decorations-007.html": [
+ "34853bb32062009381d7d868fcef8c99fdc9ffa8",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/flex/flex-gap-decorations-007-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "flex-gap-decorations-008.html": [
+ "bd4e73c158c1d329d7c747d69477d19c8ed6c3fd",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/flex/flex-gap-decorations-008-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "flex-gap-decorations-009.html": [
+ "6bb406c5b0155c7eb65d0117e388bad2272a6ac9",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/flex/flex-gap-decorations-009-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "flex-gap-decorations-010.html": [
+ "49f6ec962ada962ac2253b148f316df237bbf5e5",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/flex/flex-gap-decorations-010-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "flex-gap-decorations-011.html": [
+ "7b142e54ec7d0dade4d8e7b5b46a85c70ca6aa8e",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/flex/flex-gap-decorations-011-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "flex-gap-decorations-013.html": [
+ "1cdf1c2749660c9147dffc07f171f698d6a9fd2b",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/flex/flex-gap-decorations-013-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "flex-gap-decorations-014.html": [
+ "b7d19549e038ee8efad8d17065071cab00f6b7af",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/flex/flex-gap-decorations-014-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "flex-gap-decorations-015.html": [
+ "6cba13ba2163f3c55fd67ea9e90f41b1d8eff90a",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/flex/flex-gap-decorations-014-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ]
+ },
"grid": {
"grid-gap-decorations-001.html": [
"5fe13a11bbfdb6086dfac68ef20412d6f8a87dc5",
@@ -185514,12 +185745,12 @@
]
],
"grid-gap-decorations-002.html": [
- "429798d0fe762589b451d4b05aa1be6cac4aed2e",
+ "dfc4198b078e6fde0a40c51fac907bd1ab249b58",
[
null,
[
[
- "/css/css-gaps/tentative/grid/grid-gap-decorations-002-ref.html",
+ "/css/css-gaps/tentative/agnostic/gap-decorations-001-ref.html",
"=="
]
],
@@ -197882,6 +198113,32 @@
}
]
],
+ "gradient-infinity-001.html": [
+ "73b9ac1bd1bc466fa49a822df3d0ac157e19e4e7",
+ [
+ null,
+ [
+ [
+ "/css/css-images/gradient/gradient-infinity-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "gradient-infinity-002.html": [
+ "0f48249259022b475354680f211c32577f7daf45",
+ [
+ null,
+ [
+ [
+ "/css/css-images/gradient/gradient-infinity-002-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"gradient-longer-hue-hsl-001.html": [
"ca5eb76c0f1be8971df228d75d34f2a8bc5f36d5",
[
@@ -227254,6 +227511,35 @@
}
]
],
+ "scrollbar-gutter-with-background-gradient.html": [
+ "0b392446c20145cda9b15922bdffc970b1321218",
+ [
+ null,
+ [
+ [
+ "/css/css-overflow/scrollbar-gutter-with-background-gradient-ref.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 70000
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
"scrollbar-large-scale-in-iframe.html": [
"1808d1dc8a97496453dfe00dc3a0b96b8b2dc184",
[
@@ -302933,7 +303219,7 @@
]
],
"active-view-transition-on-non-root.html": [
- "9870b15cca958d0e7c5080cebe24c463ad7a33ca",
+ "d8699d3a2c7c1410cb86bcc9e4fb2a2a0e561865",
[
null,
[
@@ -302959,7 +303245,7 @@
]
],
"active-view-transition-type-on-non-root.html": [
- "f4225485b860b09fc0fca560fbc7f33c270dbf05",
+ "4569af04fff5462e57ed5f6e30de535b263a7b00",
[
null,
[
@@ -305708,7 +305994,7 @@
]
],
"nested-root-capture-with-clip.html": [
- "eb728182865eb5388053b0039e22d9f75f5da8f6",
+ "a55997a3f638a3fb6a8b701fae1ff9683da494cd",
[
null,
[
@@ -305728,7 +306014,7 @@
],
[
0,
- 400
+ 500
]
]
]
@@ -307098,7 +307384,7 @@
]
],
"pseudo-rendering-invalidation.html": [
- "4d492c40d8761ddda3551448ce725cfbb5a82f4a",
+ "9624137e754eed3a46336fc8edb0d7edfc7182c4",
[
null,
[
@@ -308039,6 +308325,19 @@
{}
]
],
+ "view-transition-types-matches-case-sensitive.html": [
+ "411c73c607a05734051921c858222373fe191b96",
+ [
+ null,
+ [
+ [
+ "/css/css-view-transitions/view-transition-types-matches-case-sensitive-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"view-transition-types-matches.html": [
"c84819e8c724da84ffeb949d63f6725569022435",
[
@@ -411302,6 +411601,10 @@
]
},
"blocks": {
+ "WEB_FEATURES.yml": [
+ "c5493f759563dff533cd974fd211ec49e3635046",
+ []
+ ],
"align-content-block-001-ref.html": [
"6a454d60d7689bcd3e7f028d8357032f545a19c4",
[]
@@ -411526,6 +411829,10 @@
[]
],
"reference": {
+ "anchor-css-zoom-ref.html": [
+ "9ec7e06aa85a0cad828cfb483bb48bbef7748bb0",
+ []
+ ],
"anchor-in-css-min-max-function-ref.html": [
"781a8ae6a2ccc838a9728005cde92111c9fe0039",
[]
@@ -411602,6 +411909,10 @@
"2366a7dc097e619bc6bcd4eb06e347a877c7e166",
[]
],
+ "anchor-size-css-zoom-ref.html": [
+ "a4feab487c5c9262e6c71d2f16f4bb83384cdcbe",
+ []
+ ],
"sticky-anchor-position-invalid-ref.html": [
"c4a5dd37354f61c66b0e2e53847b8fcc16112fc3",
[]
@@ -428018,11 +428329,59 @@
},
"css-gaps": {
"tentative": {
- "grid": {
- "grid-gap-decorations-002-ref.html": [
+ "agnostic": {
+ "gap-decorations-001-ref.html": [
"f21be425243208a8fd5baa7ead43313ea88fb19a",
[]
+ ]
+ },
+ "flex": {
+ "flex-gap-decorations-003-ref.html": [
+ "03a815909f25638dfb8ad8aa1bebf6b95d95d000",
+ []
+ ],
+ "flex-gap-decorations-004-ref.html": [
+ "a1f4e9d666ed9114092b277576d1057710a15db0",
+ []
+ ],
+ "flex-gap-decorations-005-ref.html": [
+ "020fdb1c8dbe0e5c8d5ca951a6b9cd204f65bd1d",
+ []
],
+ "flex-gap-decorations-006-ref.html": [
+ "701d36f93bb45a41138496e0a1e7c02ba3174788",
+ []
+ ],
+ "flex-gap-decorations-007-ref.html": [
+ "8511c66acf4511670a0268f8bf170a883e2d3924",
+ []
+ ],
+ "flex-gap-decorations-008-ref.html": [
+ "8ca5749417f4eac98bbd9145f8a7cdd6bddc8cc0",
+ []
+ ],
+ "flex-gap-decorations-009-ref.html": [
+ "2071e3fce6029acd1f4d69099eb3642f04cad70a",
+ []
+ ],
+ "flex-gap-decorations-010-ref.html": [
+ "c20df7fcda147bacf350b661451b7a1dd108bcc1",
+ []
+ ],
+ "flex-gap-decorations-011-ref.html": [
+ "61d3e83dc2f64fea83fea38389413ee66ba4e5df",
+ []
+ ],
+ "flex-gap-decorations-013-ref.html": [
+ "3d999788023d13c8414796f6839ceafcd94803d5",
+ []
+ ],
+ "flex-gap-decorations-014-ref.html": [
+ "ab28707785e56b3ab9cdeb61dcf2e4d219dded41",
+ []
+ ]
+ },
+ "grid": {
"grid-gap-decorations-003-ref.html": [
"15fc305633d377c286ed9d8fefc6f86aef78c467",
[]
@@ -430176,6 +430535,14 @@
"8b050646754406a6a03c510730574c9e24b93732",
[]
],
+ "gradient-infinity-001-ref.html": [
+ "b15e7fcae69e5d57109f08f6ba0f56e4ea0e69b2",
+ []
+ ],
+ "gradient-infinity-002-ref.html": [
+ "30857abd9a1532e4b9ff0e6f20ce54145e29b8a8",
+ []
+ ],
"gradient-longer-hue-hsl-001-ref.html": [
"c75fe98ec14697db74db28f7010a0599d1bc07d3",
[]
@@ -435495,6 +435862,10 @@
"7dbadf995ed89bc3032c4ca1b53e1cebecd6237e",
[]
],
+ "scrollbar-gutter-with-background-gradient-ref.html": [
+ "1af00bae87d0ade4e13e5ce696679da90e0b203f",
+ []
+ ],
"scrollbar-large-scale-in-iframe-ref.html": [
"38c8d0c513bf6e3763e05ea205bcbe8d6253b0ed",
[]
@@ -447345,6 +447716,10 @@
"a448fc800d26f26f7976bb9358251a5c392262e1",
[]
],
+ "WEB_FEATURES.yml": [
+ "13ff52f509289cb229e9559f36f464c526b2945b",
+ []
+ ],
"resources": {
"testhelper.js": [
"4c9ed78c78cb905c95fc98a6d07b53beb0bccca1",
@@ -449410,7 +449785,7 @@
[]
],
"WEB_FEATURES.yml": [
- "e1df1b8c670205931df252d4956287277f97700d",
+ "cbdc654b1d6280d3eeb3d49e440b69c71eb00463",
[]
],
"animating-new-content-ref.html": [
@@ -449718,6 +450093,10 @@
[]
],
"navigation": {
+ "WEB_FEATURES.yml": [
+ "1b95bc2b45bbeb5535d60c0786f7f4794ab16620",
+ []
+ ],
"at-rule-opt-in-auto-ref.html": [
"be8cc501cf09a01105a8f0c89d8e47b91dd66c01",
[]
@@ -449901,7 +450280,7 @@
[]
],
"nested-root-capture-with-clip-ref.html": [
- "0e2c7d025431898870762711a18e38150448985a",
+ "40275ab555c378a367a52ec81d6788923a01002a",
[]
],
"resources": {
@@ -450119,6 +450498,12 @@
"23852cf6a7cae7868ee19a52315be1f20c47ac84",
[]
],
+ "parsing": {
+ "WEB_FEATURES.yml": [
+ "e011b34e2a06d5edbbdde0cf541fb86f00803644",
+ []
+ ]
+ },
"pseudo-element-overflow-hidden-ref.html": [
"02bcb5bb49c09ba151b10751ad31b9ebba91bdef",
[]
@@ -450273,6 +450658,10 @@
"e86fa3f3e21e9a8df3a28ba9ca60332a4d1b6ab7",
[]
],
+ "view-transition-types-matches-case-sensitive-ref.html": [
+ "6a9af3f82862d0908ba9443c4adbf3b80c16f7f9",
+ []
+ ],
"view-transition-types-matches-ref.html": [
"7f697364c29f30dc18f0a94310a58fc43a409ea1",
[]
@@ -458592,7 +458981,7 @@
[]
],
"playback-temporary-events.js": [
- "d8dac4463df42bde9cc57745f822b95b5ef7d583",
+ "1d81cf2607156c5c239b264f6bec420da70f4d39",
[]
],
"playback-temporary-expired.js": [
@@ -462023,7 +462412,7 @@
],
"resources": {
"additional-bids.py": [
- "8a947533307ac553a5a16ee05fbc5de2f99dfe30",
+ "89a47c0e0d0d3702a33bbc3e10f811d140e2fa61",
[]
],
"authorize-server-response.py": [
@@ -462039,7 +462428,7 @@
[]
],
"bidding-logic.sub.py": [
- "8c0539d43c83a72b57498b0ec5c4f16d2fb26599",
+ "97d2d80343cdd0d94925143dece2b506ef3983ca",
[]
],
"decision-logic.sub.py": [
@@ -462063,7 +462452,7 @@
[]
],
"fledge_http_server_util.py": [
- "179262d33926896588393971f61f1cc6dfc8546d",
+ "30889d92d4f7ba5793ac72ed7b0dd19d2a939511",
[]
],
"incrementer.wasm": [
@@ -462071,7 +462460,7 @@
[]
],
"permissions.py": [
- "eed93c42756b75045dd38ccc4c085059d040bf66",
+ "f66e28bb27ba099b0fc171fec1af9edfd884caa2",
[]
],
"real-time-report.py": [
@@ -462111,11 +462500,11 @@
[]
],
"trusted-bidding-signals.py": [
- "5a89e3b602565170c5e5eb3427eea71c36579dbe",
+ "e6e7d6605258ace5564986dfa1d550316e207e1b",
[]
],
"trusted-scoring-signals.py": [
- "934d2e9129d04a511b44540a6d326eff4d2b75f3",
+ "bfd23b124cbab6cf8f3e49ed690004c085248e70",
[]
],
"update-url.py": [
@@ -469549,13 +469938,9 @@
"bcc6f0734d580474a8bd25f25d4662f175cdc39b",
[]
],
- "reporting-subresource-corp.tentative.https.html.headers": [
- "bcc6f0734d580474a8bd25f25d4662f175cdc39b",
- []
- ],
"resources": {
"common.js": [
- "df4bfcfc7d52ac006f84f4ca046cc64b4dd7a171",
+ "64c1f8df416eb09115d04b9f480a65353ab0a164",
[]
],
"fetch-and-create-url.html": [
@@ -469578,6 +469963,10 @@
"34b4e9f8ea41fd1aed28b86715df31c1692b88aa",
[]
],
+ "report.py": [
+ "3b677a91fdda472e41fd6f1cb2ce9b8d22594b2d",
+ []
+ ],
"reporting-empty-frame-multiple-headers.html.asis": [
"5020ad39fee282b2755f020133f09a6c5058ec1f",
[]
@@ -491663,7 +492052,7 @@
[]
],
"testdriver.js": [
- "15f3a4b7cc7412ea32c9ff8d337975039c3be2be",
+ "460f879878f8322ec2842803636c8585c81c4382",
[]
],
"testdriver.js.headers": [
@@ -497362,6 +497751,10 @@
[]
],
"reftests": {
+ "WEB_FEATURES.yml": [
+ "123f8c0419ae837dc8122c8c91198305a6852acf",
+ []
+ ],
"display-none-mask-ref.html": [
"3739265b23d22e39f2e2acdc90d94c583b36f4f9",
[]
@@ -498779,7 +499172,7 @@
}
},
"test_file_lints.py": [
- "92270e38a69d70e6e8748aee57372ed1b2d250f4",
+ "f63110432939d01265482611261f463e5b49e45f",
[]
],
"test_lint.py": [
@@ -498963,7 +499356,7 @@
[]
],
"load.py": [
- "831f7e8fff18bd37201a2ca21f4a1f8caea38258",
+ "c6813f23392b1ab96cebba875e6e3d9ce06c7527",
[]
],
"requirements.txt": [
@@ -509762,7 +510155,7 @@
[]
],
"actions.py": [
- "06d58e7e87b6dc9bad8c8eddadcdb2597779b24e",
+ "10b5eeb6b94efcb5671ac26ddbe58584fbed248e",
[]
],
"asyncactions.py": [
@@ -509782,7 +510175,7 @@
[]
],
"executormarionette.py": [
- "67f11aefa006996ed7a445bf87bfaf30ae4a3a0a",
+ "110466e47abddc8ab75b99161cba30d11988d703",
[]
],
"executorselenium.py": [
@@ -509798,7 +510191,7 @@
[]
],
"executorwebdriver.py": [
- "d0c1f9e64a416a166b0b5e09377e6a576bc607b8",
+ "45ddb57c9ae25eab0bcd38a54646bcc7da7ec178",
[]
],
"executorwktr.py": [
@@ -509814,7 +510207,7 @@
[]
],
"protocol.py": [
- "53a7b4378483e183d10532c50d26be1586a95dbe",
+ "5190b2664015ea2835a82129658e70c806f1dd04",
[]
],
"pytestrunner": {
@@ -509929,7 +510322,7 @@
[]
],
"testdriver-extra.js": [
- "71c1be2732f3e62f156c2d1017eee8e8111ac254",
+ "5d37cf5e15f47998da3294989bd4b7c87795648c",
[]
],
"testdriver-vendor.js": [
@@ -512903,7 +513296,7 @@
"animation-model": {
"animation-types": {
"property-list.js": [
- "9cfd90d17f2e95986cd3db5999447faef9a64df6",
+ "21f39b1fc185345f3794cb9f0f28865e10c7ceb6",
[]
],
"property-types.js": [
@@ -546834,7 +547227,7 @@
"ai": {
"language_detection": {
"detector.https.tentative.any.js": [
- "d54d0110be05b65c4f97270e53f797bdcff3f50a",
+ "8c02df18cbe5b154aafe9b077f2355affffdfae4",
[
"ai/language_detection/detector.https.tentative.any.html",
{
@@ -581567,7 +581960,7 @@
]
],
"flex-shorthand-calc.html": [
- "6498988dd53b3e6f7e48f643094551121fdc28f4",
+ "2cbd1c20c282a194d06fe9511b2b1ab4409da62d",
[
null,
{}
@@ -606876,7 +607269,7 @@
]
],
"cursor-calc-hotspot.html": [
- "84f9ca35b79878972d61e132857640a9f5e86fa7",
+ "825d9571271c06d96302faa46edcf0f2e5a4cda9",
[
null,
{}
@@ -684270,6 +684663,13 @@
{}
]
],
+ "history_pushstate_too_many_calls.optional.html": [
+ "4242ab488ca2cbe4b4433b1fa251bd8eb303cecf",
+ [
+ null,
+ {}
+ ]
+ ],
"history_pushstate_url.html": [
"cfbca35bfdfb6e29682f52d09577e6b081801f14",
[
@@ -684305,6 +684705,13 @@
{}
]
],
+ "history_replacestate_too_many_calls.optional.html": [
+ "d412983270c42fd37cf832119567013982456121",
+ [
+ null,
+ {}
+ ]
+ ],
"history_state.html": [
"2ee2356b1acdde48ee03bd18d644857bb9fc1062",
[
@@ -713532,10 +713939,10 @@
}
},
"document-isolation-policy": {
- "credentialless-cache-storage.https.tentative.window.js": [
- "cb4b174e945efaf14cff897d46661971bff964f8",
+ "credentialless-cache-storage-from-credentialless.https.tentative.window.js": [
+ "cae480526b8c2e38801e05edfbabc83dc1d62570",
[
- "html/document-isolation-policy/credentialless-cache-storage.https.tentative.window.html?dedicated_worker",
+ "html/document-isolation-policy/credentialless-cache-storage-from-credentialless.https.tentative.window.html?dedicated_worker",
{
"script_metadata": [
[
@@ -713572,6 +713979,10 @@
],
[
"script",
+ "/service-workers/service-worker/resources/test-helpers.sub.js"
+ ],
+ [
+ "script",
"./resources/common.js"
]
],
@@ -713579,7 +713990,7 @@
}
],
[
- "html/document-isolation-policy/credentialless-cache-storage.https.tentative.window.html?document",
+ "html/document-isolation-policy/credentialless-cache-storage-from-credentialless.https.tentative.window.html?document",
{
"script_metadata": [
[
@@ -713616,6 +714027,10 @@
],
[
"script",
+ "/service-workers/service-worker/resources/test-helpers.sub.js"
+ ],
+ [
+ "script",
"./resources/common.js"
]
],
@@ -713623,7 +714038,7 @@
}
],
[
- "html/document-isolation-policy/credentialless-cache-storage.https.tentative.window.html?service_worker",
+ "html/document-isolation-policy/credentialless-cache-storage-from-credentialless.https.tentative.window.html?service_worker",
{
"script_metadata": [
[
@@ -713660,6 +714075,10 @@
],
[
"script",
+ "/service-workers/service-worker/resources/test-helpers.sub.js"
+ ],
+ [
+ "script",
"./resources/common.js"
]
],
@@ -713667,7 +714086,7 @@
}
],
[
- "html/document-isolation-policy/credentialless-cache-storage.https.tentative.window.html?shared_worker",
+ "html/document-isolation-policy/credentialless-cache-storage-from-credentialless.https.tentative.window.html?shared_worker",
{
"script_metadata": [
[
@@ -713704,6 +714123,400 @@
],
[
"script",
+ "/service-workers/service-worker/resources/test-helpers.sub.js"
+ ],
+ [
+ "script",
+ "./resources/common.js"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ]
+ ],
+ "credentialless-cache-storage-from-none.https.tentative.window.js": [
+ "e2478abeed21ec9db89273c5c9e9665cdb71d1ba",
+ [
+ "html/document-isolation-policy/credentialless-cache-storage-from-none.https.tentative.window.html?dedicated_worker",
+ {
+ "script_metadata": [
+ [
+ "timeout",
+ "long"
+ ],
+ [
+ "variant",
+ "?document"
+ ],
+ [
+ "variant",
+ "?dedicated_worker"
+ ],
+ [
+ "variant",
+ "?shared_worker"
+ ],
+ [
+ "variant",
+ "?service_worker"
+ ],
+ [
+ "script",
+ "/common/get-host-info.sub.js"
+ ],
+ [
+ "script",
+ "/common/utils.js"
+ ],
+ [
+ "script",
+ "/common/dispatcher/dispatcher.js"
+ ],
+ [
+ "script",
+ "/service-workers/service-worker/resources/test-helpers.sub.js"
+ ],
+ [
+ "script",
+ "./resources/common.js"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ],
+ [
+ "html/document-isolation-policy/credentialless-cache-storage-from-none.https.tentative.window.html?document",
+ {
+ "script_metadata": [
+ [
+ "timeout",
+ "long"
+ ],
+ [
+ "variant",
+ "?document"
+ ],
+ [
+ "variant",
+ "?dedicated_worker"
+ ],
+ [
+ "variant",
+ "?shared_worker"
+ ],
+ [
+ "variant",
+ "?service_worker"
+ ],
+ [
+ "script",
+ "/common/get-host-info.sub.js"
+ ],
+ [
+ "script",
+ "/common/utils.js"
+ ],
+ [
+ "script",
+ "/common/dispatcher/dispatcher.js"
+ ],
+ [
+ "script",
+ "/service-workers/service-worker/resources/test-helpers.sub.js"
+ ],
+ [
+ "script",
+ "./resources/common.js"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ],
+ [
+ "html/document-isolation-policy/credentialless-cache-storage-from-none.https.tentative.window.html?service_worker",
+ {
+ "script_metadata": [
+ [
+ "timeout",
+ "long"
+ ],
+ [
+ "variant",
+ "?document"
+ ],
+ [
+ "variant",
+ "?dedicated_worker"
+ ],
+ [
+ "variant",
+ "?shared_worker"
+ ],
+ [
+ "variant",
+ "?service_worker"
+ ],
+ [
+ "script",
+ "/common/get-host-info.sub.js"
+ ],
+ [
+ "script",
+ "/common/utils.js"
+ ],
+ [
+ "script",
+ "/common/dispatcher/dispatcher.js"
+ ],
+ [
+ "script",
+ "/service-workers/service-worker/resources/test-helpers.sub.js"
+ ],
+ [
+ "script",
+ "./resources/common.js"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ],
+ [
+ "html/document-isolation-policy/credentialless-cache-storage-from-none.https.tentative.window.html?shared_worker",
+ {
+ "script_metadata": [
+ [
+ "timeout",
+ "long"
+ ],
+ [
+ "variant",
+ "?document"
+ ],
+ [
+ "variant",
+ "?dedicated_worker"
+ ],
+ [
+ "variant",
+ "?shared_worker"
+ ],
+ [
+ "variant",
+ "?service_worker"
+ ],
+ [
+ "script",
+ "/common/get-host-info.sub.js"
+ ],
+ [
+ "script",
+ "/common/utils.js"
+ ],
+ [
+ "script",
+ "/common/dispatcher/dispatcher.js"
+ ],
+ [
+ "script",
+ "/service-workers/service-worker/resources/test-helpers.sub.js"
+ ],
+ [
+ "script",
+ "./resources/common.js"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ]
+ ],
+ "credentialless-cache-storage-from-require-corp.https.tentative.window.js": [
+ "720fa6a987a164f95fd91200b574ca6569215c10",
+ [
+ "html/document-isolation-policy/credentialless-cache-storage-from-require-corp.https.tentative.window.html?dedicated_worker",
+ {
+ "script_metadata": [
+ [
+ "timeout",
+ "long"
+ ],
+ [
+ "variant",
+ "?document"
+ ],
+ [
+ "variant",
+ "?dedicated_worker"
+ ],
+ [
+ "variant",
+ "?shared_worker"
+ ],
+ [
+ "variant",
+ "?service_worker"
+ ],
+ [
+ "script",
+ "/common/get-host-info.sub.js"
+ ],
+ [
+ "script",
+ "/common/utils.js"
+ ],
+ [
+ "script",
+ "/common/dispatcher/dispatcher.js"
+ ],
+ [
+ "script",
+ "/service-workers/service-worker/resources/test-helpers.sub.js"
+ ],
+ [
+ "script",
+ "./resources/common.js"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ],
+ [
+ "html/document-isolation-policy/credentialless-cache-storage-from-require-corp.https.tentative.window.html?document",
+ {
+ "script_metadata": [
+ [
+ "timeout",
+ "long"
+ ],
+ [
+ "variant",
+ "?document"
+ ],
+ [
+ "variant",
+ "?dedicated_worker"
+ ],
+ [
+ "variant",
+ "?shared_worker"
+ ],
+ [
+ "variant",
+ "?service_worker"
+ ],
+ [
+ "script",
+ "/common/get-host-info.sub.js"
+ ],
+ [
+ "script",
+ "/common/utils.js"
+ ],
+ [
+ "script",
+ "/common/dispatcher/dispatcher.js"
+ ],
+ [
+ "script",
+ "/service-workers/service-worker/resources/test-helpers.sub.js"
+ ],
+ [
+ "script",
+ "./resources/common.js"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ],
+ [
+ "html/document-isolation-policy/credentialless-cache-storage-from-require-corp.https.tentative.window.html?service_worker",
+ {
+ "script_metadata": [
+ [
+ "timeout",
+ "long"
+ ],
+ [
+ "variant",
+ "?document"
+ ],
+ [
+ "variant",
+ "?dedicated_worker"
+ ],
+ [
+ "variant",
+ "?shared_worker"
+ ],
+ [
+ "variant",
+ "?service_worker"
+ ],
+ [
+ "script",
+ "/common/get-host-info.sub.js"
+ ],
+ [
+ "script",
+ "/common/utils.js"
+ ],
+ [
+ "script",
+ "/common/dispatcher/dispatcher.js"
+ ],
+ [
+ "script",
+ "/service-workers/service-worker/resources/test-helpers.sub.js"
+ ],
+ [
+ "script",
+ "./resources/common.js"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ],
+ [
+ "html/document-isolation-policy/credentialless-cache-storage-from-require-corp.https.tentative.window.html?shared_worker",
+ {
+ "script_metadata": [
+ [
+ "timeout",
+ "long"
+ ],
+ [
+ "variant",
+ "?document"
+ ],
+ [
+ "variant",
+ "?dedicated_worker"
+ ],
+ [
+ "variant",
+ "?shared_worker"
+ ],
+ [
+ "variant",
+ "?service_worker"
+ ],
+ [
+ "script",
+ "/common/get-host-info.sub.js"
+ ],
+ [
+ "script",
+ "/common/utils.js"
+ ],
+ [
+ "script",
+ "/common/dispatcher/dispatcher.js"
+ ],
+ [
+ "script",
+ "/service-workers/service-worker/resources/test-helpers.sub.js"
+ ],
+ [
+ "script",
"./resources/common.js"
]
],
@@ -713764,7 +714577,7 @@
]
],
"credentialless-dedicated-worker.https.tentative.window.js": [
- "748130dfdc209bf9cfac158297e772a52851b48a",
+ "539ed0a6955ad06ed0571e7fcf130624e8ec86f4",
[
"html/document-isolation-policy/credentialless-dedicated-worker.https.tentative.window.html",
{
@@ -713787,6 +714600,10 @@
],
[
"script",
+ "/service-workers/service-worker/resources/test-helpers.sub.js"
+ ],
+ [
+ "script",
"./resources/common.js"
]
],
@@ -714502,7 +715319,7 @@
]
],
"reporting-cache-storage-corp.tentative.https.html": [
- "934c87b2abc674dbb4e2f179b793497686dccca7",
+ "0b7c12ac514c518c04aeee214939cdfffbf8aa5b",
[
null,
{
@@ -714511,7 +715328,7 @@
]
],
"reporting-subresource-corp.tentative.https.html": [
- "6be3c35ad7ab749f52c4cd20d348bea21dfad448",
+ "013eb34d1065ee7bbe274af2b5409d47a37be0bf",
[
null,
{
@@ -730024,6 +730841,16 @@
}
]
],
+ "popover-focus-tabindex.html": [
+ "f9c2342ba5e0956730c904476544ebab814fedb3",
+ [
+ null,
+ {
+ "testdriver": true,
+ "timeout": "long"
+ }
+ ]
+ ],
"popover-focus.html": [
"25a6c2da536355fb1ddffc4587b18acff3421c0a",
[
@@ -781637,7 +782464,7 @@
],
"tentative": {
"getdisplaymedia-captured-surface-resolution.https.html": [
- "a1e7997ca69707d2e3c76924aa421c041d6d2926",
+ "6064bced90b870b6edc04435f6ee00aedd9c7177",
[
null,
{
@@ -782065,6 +782892,13 @@
{}
]
],
+ "animation-trigger-getanimations.tentative.html": [
+ "08d509d8cb2fdfff7bef3ce76f010d8dc4535356",
+ [
+ null,
+ {}
+ ]
+ ],
"animation-trigger-once-play-state.tentative.html": [
"23c6aa8ce9f697cab4121e713556b544cb4202cf",
[
@@ -782094,7 +782928,7 @@
]
],
"animation-trigger.html": [
- "dd4820dfe5fe0a964044b0d27eea153b9fbbfb3e",
+ "7506fb05829d8d2c84dbaf3915a9e08314302af1",
[
null,
{}
@@ -874371,6 +875205,13 @@
{}
]
],
+ "rtp-stats-lifetime.https.html": [
+ "4ddd6ad4f16c5432694723f4da6b68acd24e06cb",
+ [
+ null,
+ {}
+ ]
+ ],
"simplecall-no-ssrcs.https.html": [
"b47cd30eaf4e5db337a1fb91e34e9ede16ee5421",
[
diff --git a/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-001.html.ini b/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-001.html.ini
new file mode 100644
index 00000000000..7c470f39fc1
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-001.html.ini
@@ -0,0 +1,2 @@
+[flex-gap-decorations-001.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-002.html.ini b/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-002.html.ini
new file mode 100644
index 00000000000..35e281db355
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-002.html.ini
@@ -0,0 +1,2 @@
+[flex-gap-decorations-002.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-003.html.ini b/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-003.html.ini
new file mode 100644
index 00000000000..065750a2637
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-003.html.ini
@@ -0,0 +1,2 @@
+[flex-gap-decorations-003.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-004.html.ini b/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-004.html.ini
new file mode 100644
index 00000000000..33a8389bbd0
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-004.html.ini
@@ -0,0 +1,2 @@
+[flex-gap-decorations-004.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-005.html.ini b/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-005.html.ini
new file mode 100644
index 00000000000..44a99785f78
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-005.html.ini
@@ -0,0 +1,2 @@
+[flex-gap-decorations-005.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-006.html.ini b/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-006.html.ini
new file mode 100644
index 00000000000..eb292ead119
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-006.html.ini
@@ -0,0 +1,2 @@
+[flex-gap-decorations-006.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-007.html.ini b/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-007.html.ini
new file mode 100644
index 00000000000..3886670391a
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-007.html.ini
@@ -0,0 +1,2 @@
+[flex-gap-decorations-007.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-008.html.ini b/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-008.html.ini
new file mode 100644
index 00000000000..e93e69af6ff
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-008.html.ini
@@ -0,0 +1,2 @@
+[flex-gap-decorations-008.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-009.html.ini b/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-009.html.ini
new file mode 100644
index 00000000000..dad33643f33
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-009.html.ini
@@ -0,0 +1,2 @@
+[flex-gap-decorations-009.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-010.html.ini b/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-010.html.ini
new file mode 100644
index 00000000000..f3e2ddf5b5f
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-010.html.ini
@@ -0,0 +1,2 @@
+[flex-gap-decorations-010.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-011.html.ini b/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-011.html.ini
new file mode 100644
index 00000000000..bb03468b7da
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-011.html.ini
@@ -0,0 +1,2 @@
+[flex-gap-decorations-011.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-013.html.ini b/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-013.html.ini
new file mode 100644
index 00000000000..e30d5b33be0
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-013.html.ini
@@ -0,0 +1,2 @@
+[flex-gap-decorations-013.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-014.html.ini b/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-014.html.ini
new file mode 100644
index 00000000000..324e614ac6e
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-014.html.ini
@@ -0,0 +1,2 @@
+[flex-gap-decorations-014.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-015.html.ini b/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-015.html.ini
new file mode 100644
index 00000000000..7abe6f62b5a
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/flex/flex-gap-decorations-015.html.ini
@@ -0,0 +1,2 @@
+[flex-gap-decorations-015.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-grid/alignment/grid-content-alignment-with-abspos-001.html.ini b/tests/wpt/meta/css/css-grid/alignment/grid-content-alignment-with-abspos-001.html.ini
deleted file mode 100644
index efff2a2620a..00000000000
--- a/tests/wpt/meta/css/css-grid/alignment/grid-content-alignment-with-abspos-001.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[grid-content-alignment-with-abspos-001.html]
- [.grid 1]
- expected: FAIL
diff --git a/tests/wpt/meta/css/css-images/gradient/gradient-infinity-001.html.ini b/tests/wpt/meta/css/css-images/gradient/gradient-infinity-001.html.ini
new file mode 100644
index 00000000000..4b3a2c8ee9d
--- /dev/null
+++ b/tests/wpt/meta/css/css-images/gradient/gradient-infinity-001.html.ini
@@ -0,0 +1,2 @@
+[gradient-infinity-001.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-images/gradient/gradient-infinity-002.html.ini b/tests/wpt/meta/css/css-images/gradient/gradient-infinity-002.html.ini
new file mode 100644
index 00000000000..2b9dad9b029
--- /dev/null
+++ b/tests/wpt/meta/css/css-images/gradient/gradient-infinity-002.html.ini
@@ -0,0 +1,2 @@
+[gradient-infinity-002.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/fetch/fetch-later/quota/same-origin-iframe/oversized-payload.tentative.https.window.js.ini b/tests/wpt/meta/fetch/fetch-later/quota/same-origin-iframe/oversized-payload.tentative.https.window.js.ini
index 967a5e13445..381cbb7092d 100644
--- a/tests/wpt/meta/fetch/fetch-later/quota/same-origin-iframe/oversized-payload.tentative.https.window.js.ini
+++ b/tests/wpt/meta/fetch/fetch-later/quota/same-origin-iframe/oversized-payload.tentative.https.window.js.ini
@@ -1,5 +1,4 @@
[oversized-payload.tentative.https.window.html]
- expected: ERROR
[fetchLater() does not accept payload[size=65537\] exceeding per-origin quota in a POST request body of String in same-origin iframe.]
expected: FAIL
diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/009.html.ini b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/009.html.ini
new file mode 100644
index 00000000000..3fb21c9b2c6
--- /dev/null
+++ b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/009.html.ini
@@ -0,0 +1,3 @@
+[009.html]
+ [Link with onclick form submit to javascript url with document.write and href navigation ]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-same-origin-fragment.html.ini b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-same-origin-fragment.html.ini
deleted file mode 100644
index 49cc2e16746..00000000000
--- a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-same-origin-fragment.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[navigation-unload-same-origin-fragment.html]
- [Tests that a fragment navigation in the unload handler will not block the initial navigation]
- expected: FAIL
diff --git a/tests/wpt/meta/html/browsers/history/the-history-interface/history_pushstate_too_many_calls.optional.html.ini b/tests/wpt/meta/html/browsers/history/the-history-interface/history_pushstate_too_many_calls.optional.html.ini
new file mode 100644
index 00000000000..3a447593ff4
--- /dev/null
+++ b/tests/wpt/meta/html/browsers/history/the-history-interface/history_pushstate_too_many_calls.optional.html.ini
@@ -0,0 +1,3 @@
+[history_pushstate_too_many_calls.optional.html]
+ [history pushState too many calls]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/browsers/history/the-history-interface/history_replacestate_too_many_calls.optional.html.ini b/tests/wpt/meta/html/browsers/history/the-history-interface/history_replacestate_too_many_calls.optional.html.ini
new file mode 100644
index 00000000000..afecb4e38a7
--- /dev/null
+++ b/tests/wpt/meta/html/browsers/history/the-history-interface/history_replacestate_too_many_calls.optional.html.ini
@@ -0,0 +1,3 @@
+[history_replacestate_too_many_calls.optional.html]
+ [history replaceState too many calls]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-transfer.html.ini b/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-transfer.html.ini
index 5d2657041d1..7e036a1c4e4 100644
--- a/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-transfer.html.ini
+++ b/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-transfer.html.ini
@@ -1,5 +1,5 @@
[createImageBitmap-transfer.html]
- expected: ERROR
+ expected: TIMEOUT
[Transfer ImageBitmap created from a vector HTMLImageElement]
expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.size.large.html.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.size.large.html.ini
new file mode 100644
index 00000000000..f6455f9bd76
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.size.large.html.ini
@@ -0,0 +1,2 @@
+[2d.canvas.host.size.large.html]
+ expected: CRASH
diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.size.large.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.size.large.worker.js.ini
new file mode 100644
index 00000000000..d571dfa4cf9
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.size.large.worker.js.ini
@@ -0,0 +1,2 @@
+[2d.canvas.host.size.large.worker.html]
+ expected: CRASH
diff --git a/tests/wpt/meta/html/document-isolation-policy/credentialless-cache-storage-from-credentialless.https.tentative.window.js.ini b/tests/wpt/meta/html/document-isolation-policy/credentialless-cache-storage-from-credentialless.https.tentative.window.js.ini
new file mode 100644
index 00000000000..2814e7ce699
--- /dev/null
+++ b/tests/wpt/meta/html/document-isolation-policy/credentialless-cache-storage-from-credentialless.https.tentative.window.js.ini
@@ -0,0 +1,54 @@
+[credentialless-cache-storage-from-credentialless.https.tentative.window.html?document]
+ [[document\] isolate-and-credentialless => none]
+ expected: FAIL
+
+ [[document\] isolate-and-credentialless => isolate-and-credentialless]
+ expected: FAIL
+
+ [[document\] isolate-and-credentialless => isolate-and-require-corp]
+ expected: FAIL
+
+ [[document\] isolate-and-credentialless => isolate-and-require-corp + CORP]
+ expected: FAIL
+
+
+[credentialless-cache-storage-from-credentialless.https.tentative.window.html?service_worker]
+ [[service_worker\] isolate-and-credentialless => none]
+ expected: FAIL
+
+ [[service_worker\] isolate-and-credentialless => isolate-and-credentialless]
+ expected: FAIL
+
+ [[service_worker\] isolate-and-credentialless => isolate-and-require-corp]
+ expected: FAIL
+
+ [[service_worker\] isolate-and-credentialless => isolate-and-require-corp + CORP]
+ expected: FAIL
+
+
+[credentialless-cache-storage-from-credentialless.https.tentative.window.html?dedicated_worker]
+ [[dedicated_worker\] isolate-and-credentialless => none]
+ expected: FAIL
+
+ [[dedicated_worker\] isolate-and-credentialless => isolate-and-credentialless]
+ expected: FAIL
+
+ [[dedicated_worker\] isolate-and-credentialless => isolate-and-require-corp]
+ expected: FAIL
+
+ [[dedicated_worker\] isolate-and-credentialless => isolate-and-require-corp + CORP]
+ expected: FAIL
+
+
+[credentialless-cache-storage-from-credentialless.https.tentative.window.html?shared_worker]
+ [[shared_worker\] isolate-and-credentialless => none]
+ expected: FAIL
+
+ [[shared_worker\] isolate-and-credentialless => isolate-and-credentialless]
+ expected: FAIL
+
+ [[shared_worker\] isolate-and-credentialless => isolate-and-require-corp]
+ expected: FAIL
+
+ [[shared_worker\] isolate-and-credentialless => isolate-and-require-corp + CORP]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/document-isolation-policy/credentialless-cache-storage-from-none.https.tentative.window.js.ini b/tests/wpt/meta/html/document-isolation-policy/credentialless-cache-storage-from-none.https.tentative.window.js.ini
new file mode 100644
index 00000000000..85857046975
--- /dev/null
+++ b/tests/wpt/meta/html/document-isolation-policy/credentialless-cache-storage-from-none.https.tentative.window.js.ini
@@ -0,0 +1,90 @@
+[credentialless-cache-storage-from-none.https.tentative.window.html?shared_worker]
+ [[shared_worker\] none => none]
+ expected: FAIL
+
+ [[shared_worker\] none => isolate-and-credentialless]
+ expected: FAIL
+
+ [[shared_worker\] none => isolate-and-credentialless (omit)]
+ expected: FAIL
+
+ [[shared_worker\] none => isolate-and-credentialless + CORP]
+ expected: FAIL
+
+ [[shared_worker\] none => isolate-and-require-corp]
+ expected: FAIL
+
+ [[shared_worker\] none => isolate-and-require-corp (omit)]
+ expected: FAIL
+
+ [[shared_worker\] none => isolate-and-require-corp + CORP]
+ expected: FAIL
+
+
+[credentialless-cache-storage-from-none.https.tentative.window.html?document]
+ [[document\] none => none]
+ expected: FAIL
+
+ [[document\] none => isolate-and-credentialless]
+ expected: FAIL
+
+ [[document\] none => isolate-and-credentialless (omit)]
+ expected: FAIL
+
+ [[document\] none => isolate-and-credentialless + CORP]
+ expected: FAIL
+
+ [[document\] none => isolate-and-require-corp]
+ expected: FAIL
+
+ [[document\] none => isolate-and-require-corp (omit)]
+ expected: FAIL
+
+ [[document\] none => isolate-and-require-corp + CORP]
+ expected: FAIL
+
+
+[credentialless-cache-storage-from-none.https.tentative.window.html?dedicated_worker]
+ [[dedicated_worker\] none => none]
+ expected: FAIL
+
+ [[dedicated_worker\] none => isolate-and-credentialless]
+ expected: FAIL
+
+ [[dedicated_worker\] none => isolate-and-credentialless (omit)]
+ expected: FAIL
+
+ [[dedicated_worker\] none => isolate-and-credentialless + CORP]
+ expected: FAIL
+
+ [[dedicated_worker\] none => isolate-and-require-corp]
+ expected: FAIL
+
+ [[dedicated_worker\] none => isolate-and-require-corp (omit)]
+ expected: FAIL
+
+ [[dedicated_worker\] none => isolate-and-require-corp + CORP]
+ expected: FAIL
+
+
+[credentialless-cache-storage-from-none.https.tentative.window.html?service_worker]
+ [[service_worker\] none => none]
+ expected: FAIL
+
+ [[service_worker\] none => isolate-and-credentialless]
+ expected: FAIL
+
+ [[service_worker\] none => isolate-and-credentialless (omit)]
+ expected: FAIL
+
+ [[service_worker\] none => isolate-and-credentialless + CORP]
+ expected: FAIL
+
+ [[service_worker\] none => isolate-and-require-corp]
+ expected: FAIL
+
+ [[service_worker\] none => isolate-and-require-corp (omit)]
+ expected: FAIL
+
+ [[service_worker\] none => isolate-and-require-corp + CORP]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/document-isolation-policy/credentialless-cache-storage-from-require-corp.https.tentative.window.js.ini b/tests/wpt/meta/html/document-isolation-policy/credentialless-cache-storage-from-require-corp.https.tentative.window.js.ini
new file mode 100644
index 00000000000..b116234c403
--- /dev/null
+++ b/tests/wpt/meta/html/document-isolation-policy/credentialless-cache-storage-from-require-corp.https.tentative.window.js.ini
@@ -0,0 +1,42 @@
+[credentialless-cache-storage-from-require-corp.https.tentative.window.html?dedicated_worker]
+ [[dedicated_worker\] isolate-and-require-corp => none]
+ expected: FAIL
+
+ [[dedicated_worker\] isolate-and-require-corp => isolate-and-credentialless]
+ expected: FAIL
+
+ [[dedicated_worker\] isolate-and-require-corp => isolate-and-require-corp]
+ expected: FAIL
+
+
+[credentialless-cache-storage-from-require-corp.https.tentative.window.html?document]
+ [[document\] isolate-and-require-corp => none]
+ expected: FAIL
+
+ [[document\] isolate-and-require-corp => isolate-and-credentialless]
+ expected: FAIL
+
+ [[document\] isolate-and-require-corp => isolate-and-require-corp]
+ expected: FAIL
+
+
+[credentialless-cache-storage-from-require-corp.https.tentative.window.html?shared_worker]
+ [[shared_worker\] isolate-and-require-corp => none]
+ expected: FAIL
+
+ [[shared_worker\] isolate-and-require-corp => isolate-and-credentialless]
+ expected: FAIL
+
+ [[shared_worker\] isolate-and-require-corp => isolate-and-require-corp]
+ expected: FAIL
+
+
+[credentialless-cache-storage-from-require-corp.https.tentative.window.html?service_worker]
+ [[service_worker\] isolate-and-require-corp => none]
+ expected: FAIL
+
+ [[service_worker\] isolate-and-require-corp => isolate-and-credentialless]
+ expected: FAIL
+
+ [[service_worker\] isolate-and-require-corp => isolate-and-require-corp]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/document-isolation-policy/credentialless-cache-storage.https.tentative.window.js.ini b/tests/wpt/meta/html/document-isolation-policy/credentialless-cache-storage.https.tentative.window.js.ini
deleted file mode 100644
index 17902443a95..00000000000
--- a/tests/wpt/meta/html/document-isolation-policy/credentialless-cache-storage.https.tentative.window.js.ini
+++ /dev/null
@@ -1,137 +0,0 @@
-[credentialless-cache-storage.https.tentative.window.html?document]
- expected: TIMEOUT
- [[document\] none => none]
- expected: TIMEOUT
-
- [[document\] none => isolate-and-credentialless]
- expected: TIMEOUT
-
- [[document\] none => isolate-and-credentialless (omit)]
- expected: TIMEOUT
-
- [[document\] none => isolate-and-credentialless + CORP]
- expected: TIMEOUT
-
- [[document\] none => isolate-and-require-corp]
- expected: TIMEOUT
-
- [[document\] none => isolate-and-require-corp (omit)]
- expected: TIMEOUT
-
- [[document\] none => isolate-and-require-corp + CORP]
- expected: TIMEOUT
-
- [[document\] isolate-and-credentialless => none]
- expected: TIMEOUT
-
- [[document\] isolate-and-credentialless => isolate-and-credentialless]
- expected: TIMEOUT
-
- [[document\] isolate-and-credentialless => isolate-and-require-corp]
- expected: TIMEOUT
-
- [[document\] isolate-and-credentialless => isolate-and-require-corp + CORP]
- expected: TIMEOUT
-
- [[document\] isolate-and-require-corp => none]
- expected: TIMEOUT
-
- [[document\] isolate-and-require-corp => isolate-and-credentialless]
- expected: TIMEOUT
-
- [[document\] isolate-and-require-corp => isolate-and-require-corp]
- expected: TIMEOUT
-
-
-[credentialless-cache-storage.https.tentative.window.html?dedicated_worker]
- expected: TIMEOUT
- [[dedicated_worker\] none => none]
- expected: TIMEOUT
-
- [[dedicated_worker\] none => isolate-and-credentialless]
- expected: TIMEOUT
-
- [[dedicated_worker\] none => isolate-and-credentialless (omit)]
- expected: TIMEOUT
-
- [[dedicated_worker\] none => isolate-and-credentialless + CORP]
- expected: TIMEOUT
-
- [[dedicated_worker\] none => isolate-and-require-corp]
- expected: TIMEOUT
-
- [[dedicated_worker\] none => isolate-and-require-corp (omit)]
- expected: TIMEOUT
-
- [[dedicated_worker\] none => isolate-and-require-corp + CORP]
- expected: TIMEOUT
-
- [[dedicated_worker\] isolate-and-credentialless => none]
- expected: TIMEOUT
-
- [[dedicated_worker\] isolate-and-credentialless => isolate-and-credentialless]
- expected: TIMEOUT
-
- [[dedicated_worker\] isolate-and-credentialless => isolate-and-require-corp]
- expected: TIMEOUT
-
- [[dedicated_worker\] isolate-and-credentialless => isolate-and-require-corp + CORP]
- expected: TIMEOUT
-
- [[dedicated_worker\] isolate-and-require-corp => none]
- expected: TIMEOUT
-
- [[dedicated_worker\] isolate-and-require-corp => isolate-and-credentialless]
- expected: TIMEOUT
-
- [[dedicated_worker\] isolate-and-require-corp => isolate-and-require-corp]
- expected: TIMEOUT
-
-
-[credentialless-cache-storage.https.tentative.window.html?service_worker]
- expected: ERROR
- [[service_worker\] none => none]
- expected: TIMEOUT
-
- [[service_worker\] none => isolate-and-credentialless]
- expected: TIMEOUT
-
- [[service_worker\] none => isolate-and-credentialless (omit)]
- expected: TIMEOUT
-
- [[service_worker\] none => isolate-and-credentialless + CORP]
- expected: TIMEOUT
-
- [[service_worker\] none => isolate-and-require-corp]
- expected: TIMEOUT
-
- [[service_worker\] none => isolate-and-require-corp (omit)]
- expected: TIMEOUT
-
- [[service_worker\] none => isolate-and-require-corp + CORP]
- expected: TIMEOUT
-
- [[service_worker\] isolate-and-credentialless => none]
- expected: TIMEOUT
-
- [[service_worker\] isolate-and-credentialless => isolate-and-credentialless]
- expected: TIMEOUT
-
- [[service_worker\] isolate-and-credentialless => isolate-and-require-corp]
- expected: TIMEOUT
-
- [[service_worker\] isolate-and-credentialless => isolate-and-require-corp + CORP]
- expected: TIMEOUT
-
- [[service_worker\] isolate-and-require-corp => none]
- expected: TIMEOUT
-
- [[service_worker\] isolate-and-require-corp => isolate-and-credentialless]
- expected: TIMEOUT
-
- [[service_worker\] isolate-and-require-corp => isolate-and-require-corp]
- expected: TIMEOUT
-
-
-[credentialless-cache-storage.https.tentative.window.html?shared_worker]
- expected: ERROR
diff --git a/tests/wpt/meta/html/document-isolation-policy/reporting-subresource-corp.tentative.https.html.ini b/tests/wpt/meta/html/document-isolation-policy/reporting-subresource-corp.tentative.https.html.ini
index e6e755c4126..7ee7b7caaaf 100644
--- a/tests/wpt/meta/html/document-isolation-policy/reporting-subresource-corp.tentative.https.html.ini
+++ b/tests/wpt/meta/html/document-isolation-policy/reporting-subresource-corp.tentative.https.html.ini
@@ -1,5 +1,4 @@
[reporting-subresource-corp.tentative.https.html]
- expected: ERROR
[[document\] blocked due to DIP]
expected: FAIL
@@ -9,9 +8,6 @@
[destination: script]
expected: FAIL
- [[dedicated worker\] same-origin]
- expected: FAIL
-
[[dedicated worker\] blocked by CORP: same-origin]
expected: FAIL
@@ -44,3 +40,12 @@
[[between service worker and page\] blocked during redirect]
expected: FAIL
+
+ [[document with service worker\] same-origin]
+ expected: FAIL
+
+ [[document with service worker\] blocked due to DIP]
+ expected: FAIL
+
+ [[document with service worker\] blocked during redirect]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini
index c6f1e5d7d84..a6591b318dc 100644
--- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini
+++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini
@@ -1,4 +1,4 @@
[iframe_sandbox_popups_nonescaping-2.html]
expected: TIMEOUT
[Check that popups from a sandboxed iframe do not escape the sandbox]
- expected: NOTRUN
+ expected: FAIL
diff --git a/tests/wpt/tests/ai/language_detection/detector.https.tentative.any.js b/tests/wpt/tests/ai/language_detection/detector.https.tentative.any.js
index d54d0110be0..8c02df18cbe 100644
--- a/tests/wpt/tests/ai/language_detection/detector.https.tentative.any.js
+++ b/tests/wpt/tests/ai/language_detection/detector.https.tentative.any.js
@@ -90,3 +90,11 @@ promise_test(async t => {
return detector.measureInputUsage('hello', {signal});
});
}, 'Aborting Translator.measureInputUsage().');
+
+promise_test(async () => {
+ const expected_languages = ['en', 'es'];
+ const detector = await languageDetector.create({
+ expectedInputLanguages: expected_languages
+ });
+ assert_array_equals(detector.expectedInputLanguages(), expected_languages);
+}, 'Creating LanguageDetector with expectedInputLanguages');
diff --git a/tests/wpt/tests/css/compositing/root-element-background-contain-hidden-crash.html b/tests/wpt/tests/css/compositing/root-element-background-contain-hidden-crash.html
new file mode 100644
index 00000000000..da07de5bf51
--- /dev/null
+++ b/tests/wpt/tests/css/compositing/root-element-background-contain-hidden-crash.html
@@ -0,0 +1,11 @@
+<style>
+* {
+ background-color: red;
+ contain: layout;
+}
+*:first-child {
+ visibility: hidden;
+ background-image: url(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAIAAABt+uBvAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wDGhYvCNVA1EIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAjklEQVR42u3QIQEAMAgAsHNNVspTgARY1BZh0ZWP3VcgSJAgQYIECRKEIEGCBAkSJEgQggQJEiRIkCBBCBIkSJAgQYIECUKQIEGCBAkSJAhBggQJEiRIkCAECRIkSJAgQYIEIUiQIEGCBAkShCBBggQJEiRIEIIECRIkSJAgQYIQJEiQIEGCBAlCkCBBdwaeugIthHvZ+AAAAABJRU5ErkJggg==)
+}
+</style>
+<object data="x">
diff --git a/tests/wpt/tests/css/css-align/blocks/WEB_FEATURES.yml b/tests/wpt/tests/css/css-align/blocks/WEB_FEATURES.yml
new file mode 100644
index 00000000000..c5493f75956
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/blocks/WEB_FEATURES.yml
@@ -0,0 +1,4 @@
+features:
+- name: align-content-block
+ files:
+ - align-content-block-*
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-css-zoom.html b/tests/wpt/tests/css/css-anchor-position/anchor-css-zoom.html
new file mode 100644
index 00000000000..2fab3f2e562
--- /dev/null
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-css-zoom.html
@@ -0,0 +1,97 @@
+<!DOCTYPE html>
+
+<title>CSS Anchor Positioning: tests that anchor() works with CSS zoom property</title>
+<link rel="help" href="https://drafts.csswg.org/css-anchor-position-1/#anchor-pos">
+<link rel="help" href="https://drafts.csswg.org/css-viewport/#zoom-property">
+<link rel="author" href="mailto:kiet.ho@apple.com">
+<link rel="match" href="reference/anchor-css-zoom-ref.html">
+
+<style>
+ .containing-block {
+ position: relative;
+ width: 150px;
+ height: 150px;
+
+ zoom: 2;
+ }
+
+ .cell {
+ width: 50px;
+ height: 50px;
+ }
+
+ #anchor-cell {
+ position: absolute;
+ top: 50px;
+ left: 50px;
+
+ anchor-name: --anchor;
+
+ background: green;
+ }
+
+ .anchor-positioned-cell {
+ position: absolute;
+ position-anchor: --anchor;
+ }
+
+ #top-left {
+ top: 0;
+ right: anchor(left);
+
+ background: cyan;
+ }
+
+ #top-right {
+ top: 0;
+ left: anchor(right);
+
+ background: magenta;
+ }
+
+ #bottom-left {
+ bottom: 0;
+ right: anchor(left);
+
+ background: yellow;
+ }
+
+ #bottom-right {
+ bottom: 0;
+ left: anchor(right);
+
+ background: black;
+ }
+</style>
+
+<body>
+ <!--
+ The boxes below are arranged like this:
+ (the outside box is .containing-block)
+
+ -------------
+ | 1 | | 2 |
+ |---|---|---|
+ | | A | |
+ |---|---|---|
+ | 3 | | 4 |
+ -------------
+ -->
+
+ <div class="containing-block">
+ <!-- Box A -->
+ <div class="cell" id="anchor-cell"></div>
+
+ <!-- Box 1 -->
+ <div class="cell anchor-positioned-cell" id="top-left"></div>
+
+ <!-- Box 2 -->
+ <div class="cell anchor-positioned-cell" id="top-right"></div>
+
+ <!-- Box 3 -->
+ <div class="cell anchor-positioned-cell" id="bottom-left"></div>
+
+ <!-- Box 4 -->
+ <div class="cell anchor-positioned-cell" id="bottom-right"></div>
+ </div>
+</body> \ No newline at end of file
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-size-css-zoom.html b/tests/wpt/tests/css/css-anchor-position/anchor-size-css-zoom.html
new file mode 100644
index 00000000000..7bd9b799dfe
--- /dev/null
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-size-css-zoom.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+
+<title>CSS Anchor Positioning: tests that anchor-size() works with CSS zoom property</title>
+<link rel="help" href="https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn">
+<link rel="help" href="https://drafts.csswg.org/css-viewport/#zoom-property">
+<link rel="author" href="mailto:kiet.ho@apple.com">
+<link rel="match" href="reference/anchor-size-css-zoom-ref.html">
+
+<style>
+ #containing-block {
+ position: relative;
+
+ zoom: 2;
+ }
+
+ #anchor {
+ position: absolute;
+
+ width: 200px;
+ height: 100px;
+
+ anchor-name: --anchor;
+
+ background: red;
+ }
+
+ #anchor-positioned {
+ position: absolute;
+
+ width: anchor-size(--anchor width);
+ height: anchor-size(--anchor height);
+
+ background: green;
+
+ z-index: 1;
+ }
+</style>
+
+Test passes if no red is visible.
+
+<div id="containing-block">
+ <!--
+ Both rectangles below overlaps.
+ #anchor is red, #anchor-positioned is green and above #anchor in Z order.
+ If no red is visible then #anchor-positioned has fully covered #anchor.
+ -->
+ <div id="anchor"></div>
+ <div id="anchor-positioned"></div>
+</div> \ No newline at end of file
diff --git a/tests/wpt/tests/css/css-anchor-position/reference/anchor-css-zoom-ref.html b/tests/wpt/tests/css/css-anchor-position/reference/anchor-css-zoom-ref.html
new file mode 100644
index 00000000000..9ec7e06aa85
--- /dev/null
+++ b/tests/wpt/tests/css/css-anchor-position/reference/anchor-css-zoom-ref.html
@@ -0,0 +1,67 @@
+<!DOCTYPE html>
+
+<style>
+ .containing-block {
+ position: relative;
+ width: 150px;
+ height: 150px;
+
+ zoom: 2;
+ }
+
+ .cell {
+ width: 50px;
+ height: 50px;
+ }
+
+ #anchor-cell {
+ position: absolute;
+ top: 50px;
+ left: 50px;
+
+ background: green;
+ }
+
+ .anchor-positioned-cell {
+ position: absolute;
+ }
+
+ #top-left {
+ top: 0;
+ left: 0;
+
+ background: cyan;
+ }
+
+ #top-right {
+ top: 0;
+ right: 0;
+
+ background: magenta;
+ }
+
+ #bottom-left {
+ bottom: 0;
+ left: 0;
+
+ background: yellow;
+ }
+
+ #bottom-right {
+ bottom: 0;
+ right: 0;
+
+ background: black;
+ }
+</style>
+
+<body>
+ <div class="containing-block">
+ <div class="cell" id="anchor-cell"></div>
+
+ <div class="cell anchor-positioned-cell" id="top-left"></div>
+ <div class="cell anchor-positioned-cell" id="top-right"></div>
+ <div class="cell anchor-positioned-cell" id="bottom-left"></div>
+ <div class="cell anchor-positioned-cell" id="bottom-right"></div>
+ </div>
+</body> \ No newline at end of file
diff --git a/tests/wpt/tests/css/css-anchor-position/reference/anchor-size-css-zoom-ref.html b/tests/wpt/tests/css/css-anchor-position/reference/anchor-size-css-zoom-ref.html
new file mode 100644
index 00000000000..a4feab487c5
--- /dev/null
+++ b/tests/wpt/tests/css/css-anchor-position/reference/anchor-size-css-zoom-ref.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+
+<style>
+ #containing-block {
+ position: relative;
+
+ zoom: 2;
+ }
+
+ #anchor {
+ position: absolute;
+
+ width: 200px;
+ height: 100px;
+
+ background: red;
+ }
+
+ #anchor-positioned {
+ position: absolute;
+
+ width: 200px;
+ height: 100px;
+
+ background: green;
+
+ z-index: 1;
+ }
+</style>
+
+Test passes if no red is visible.
+
+<div id="containing-block">
+ <div id="anchor"></div>
+ <div id="anchor-positioned"></div>
+</div> \ No newline at end of file
diff --git a/tests/wpt/tests/css/css-anchor-position/viewport-overflow-hidden-invisible-anchor-crash.html b/tests/wpt/tests/css/css-anchor-position/viewport-overflow-hidden-invisible-anchor-crash.html
new file mode 100644
index 00000000000..b2fa5255b5e
--- /dev/null
+++ b/tests/wpt/tests/css/css-anchor-position/viewport-overflow-hidden-invisible-anchor-crash.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-anchor-position-1/">
+<link rel="help" href="https://crbug.com/391903229">
+<style>
+html {
+ overflow: hidden;
+}
+.anchor, .element {
+ background: green;
+ width: 100px;
+ height: 100px;
+}
+.anchor {
+ background: red;
+ anchor-name: --anchor;
+}
+.element {
+ position: absolute;
+ position-anchor: --anchor;
+ bottom: anchor(top);
+ left: 50px;
+}
+</style>
+<div style="height: 1000px"></div>
+<div class="element"></div>
+<div style="overflow: auto; width: 50px">
+ <div class="anchor"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-flexbox/flex-shorthand-calc.html b/tests/wpt/tests/css/css-flexbox/flex-shorthand-calc.html
index 6498988dd53..2cbd1c20c28 100644
--- a/tests/wpt/tests/css/css-flexbox/flex-shorthand-calc.html
+++ b/tests/wpt/tests/css/css-flexbox/flex-shorthand-calc.html
@@ -11,6 +11,6 @@
test_shorthand_value('flex', 'sign(1em - 1px) sibling-index()', {
'flex-grow': 'sign(1em - 1px)',
'flex-shrink': 'sibling-index()',
- 'flex-basis': 'auto'
+ 'flex-basis': '0%'
});
</script>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-002-ref.html b/tests/wpt/tests/css/css-gaps/tentative/agnostic/gap-decorations-001-ref.html
index f21be425243..f21be425243 100644
--- a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-002-ref.html
+++ b/tests/wpt/tests/css/css-gaps/tentative/agnostic/gap-decorations-001-ref.html
diff --git a/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-001.html b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-001.html
new file mode 100644
index 00000000000..0667693f38c
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-001.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: column and row gaps are painted.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="../../../reference/ref-filled-green-100px-square.xht">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ .flex-container {
+ display: flex;
+ column-gap: 10px;
+ row-gap: 10px;
+ height: 100px;
+ width: 100px;
+ background: red;
+ column-rule-color: green;
+ column-rule-style: solid;
+ column-rule-width: 10px;
+ row-rule-color: green;
+ row-rule-style: solid;
+ row-rule-width: 10px;
+
+ flex-wrap: wrap;
+ }
+
+ .flex-item {
+ background: green;
+ width: 45px;
+ }
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class="flex-container">
+ <div class="flex-item"></div>
+ <div class="flex-item"></div>
+ <div class="flex-item"></div>
+ <div class="flex-item"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-002.html b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-002.html
new file mode 100644
index 00000000000..632b690434c
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-002.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: flex column gaps are painted with solid styling.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="../agnostic/gap-decorations-001-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ .flex-container {
+ height: 110px;
+ width: 110px;
+
+ display: flex;
+
+ column-gap: 10px;
+ row-gap: 10px;
+
+ column-rule-color: pink;
+ column-rule-style: solid;
+ column-rule-width: 10px;
+
+ row-rule-color: green;
+ row-rule-style: solid;
+ row-rule-width: 10px;
+
+ flex-wrap: wrap;
+ }
+
+ .flex-item {
+ background: skyblue;
+ width: 50px;
+ }
+</style>
+<div class="flex-container">
+ <div class="flex-item"></div>
+ <div class="flex-item"></div>
+ <div class="flex-item"></div>
+ <div class="flex-item"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-003-ref.html b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-003-ref.html
new file mode 100644
index 00000000000..03a815909f2
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-003-ref.html
@@ -0,0 +1,79 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ #flexbox {
+ border: 2px solid rgb(96 139 168);
+ display: flex;
+ column-gap: 10px;
+ row-gap: 10px;
+ width: 170px;
+ flex-wrap: wrap;
+ }
+
+ .items {
+ background-color: rgb(96 139 168 / 0.2);
+ flex-shrink: 1;
+ width: 50px;
+ height: 50px;
+ }
+
+ #four {
+ width: 100px;
+ }
+
+ .row-gap {
+ margin: 0px;
+ padding: 0px;
+ height: 10px;
+ background: blue;
+ width: 170px;
+ position: absolute;
+ }
+
+ .column-gap {
+ display: flex;
+ flex-direction: column;
+ row-gap: 60px;
+ height: 170px;
+ top: 2px;
+ width: 10px;
+ position: absolute;
+ }
+
+ .column {
+ background: red;
+ width: 10px;
+ height: 55px;
+ }
+</style>
+
+<div id="flexbox">
+ <div class="items">One</div>
+ <div class="items">Two</div>
+ <div class="items">Three</div>
+ <div class="items" id="four">Four</div>
+ <div class="items">Five</div>
+ <div class="items">Six</div>
+ <div class="items">Seven</div>
+ <div class="items">Eight</div>
+</div>
+
+<div id="row1" class="row-gap" style="top: 52px; left: 2px;"></div>
+<div id="row2" class="row-gap" style="top: 112px; left: 2px;"></div>
+
+<div id="columns1" style="left: 52px;" class="column-gap">
+ <div id="c1" class="column"></div>
+ <div id="c2" class="column"></div>
+</div>
+
+<div id="columns2" style="left: 112px;" class="column-gap">
+ <div id="c1" class="column"></div>
+ <div id="c2" class="column"></div>
+</div>
+
+<div id="vertical3" style="left: 102px; position:absolute; top: 57px; height:60px;" class="column"></div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-003.html b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-003.html
new file mode 100644
index 00000000000..effab7fee24
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-003.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: flex column and row gaps are painted with solid styling.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="flex-gap-decorations-003-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ #flexbox {
+ border: 2px solid rgb(96 139 168);
+ display: flex;
+ column-gap: 10px;
+ row-gap: 10px;
+ row-rule-style: solid;
+ row-rule-color: blue;
+ row-rule-width: 10px;
+ column-rule-style: solid;
+ column-rule-color: red;
+ column-rule-width: 10px;
+ width: 170px;
+ flex-wrap: wrap;
+ }
+
+ .items {
+ background-color: rgb(96 139 168 / 0.2);
+ flex-shrink: 1;
+ width: 50px;
+ height: 50px;
+ }
+
+ #four {
+ width: 100px;
+ }
+</style>
+
+<div id="flexbox">
+ <div class="items">One</div>
+ <div class="items">Two</div>
+ <div class="items">Three</div>
+ <div class="items" id="four">Four</div>
+ <div class="items">Five</div>
+ <div class="items">Six</div>
+ <div class="items">Seven</div>
+ <div class="items">Eight</div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-004-ref.html b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-004-ref.html
new file mode 100644
index 00000000000..a1f4e9d666e
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-004-ref.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ #flexbox {
+ border: 2px solid rgb(96 139 168);
+ display: flex;
+ column-gap: 10px;
+ row-gap: 10px;
+ width: 170px;
+ flex-wrap: wrap;
+ }
+
+ .items {
+ background-color: rgb(96 139 168 / 0.2);
+ flex-shrink: 1;
+ width: 50px;
+ height: 50px;
+ }
+
+ #four {
+ width: 100px;
+ }
+
+ .row-gap {
+ margin: 0px;
+ padding: 0px;
+ height: 0px;
+ width: 170px;
+ border-bottom: 10px double;
+ border-color:blue;
+ position: absolute;
+ }
+
+ .column-gap {
+ display: flex;
+ flex-direction: column;
+ row-gap: 60px;
+ height: 170px;
+ top: 2px;
+ width: 10px;
+ position: absolute;
+ }
+
+ .column {
+ width: 0px;
+ border-left: 10px double red;
+ height: 55px;
+ }
+</style>
+
+<div id="flexbox">
+ <div class="items">One</div>
+ <div class="items">Two</div>
+ <div class="items">Three</div>
+ <div class="items" id="four">Four</div>
+ <div class="items">Five</div>
+ <div class="items">Six</div>
+ <div class="items">Seven</div>
+ <div class="items">Eight</div>
+</div>
+
+<div id="row1" class="row-gap" style="top: 52px; left: 2px;"></div>
+<div id="row2" class="row-gap" style="top: 112px; left: 2px;"></div>
+
+<div id="columns1" style="left: 52px;" class="column-gap">
+ <div id="c1" class="column"></div>
+ <div id="c2" class="column"></div>
+</div>
+
+<div id="columns2" style="left: 112px;" class="column-gap">
+ <div id="c1" class="column"></div>
+ <div id="c2" class="column"></div>
+</div>
+
+<div id="column3" style="left: 102px; position:absolute; top: 57px; height:60px;" class="column"></div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-004.html b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-004.html
new file mode 100644
index 00000000000..a5c0698e7fa
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-004.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: flex column and row gaps are painted with double styling.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="flex-gap-decorations-004-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ #flexbox {
+ border: 2px solid rgb(96 139 168);
+ display: flex;
+ column-gap: 10px;
+ row-gap: 10px;
+ row-rule-style: double;
+ row-rule-color: blue;
+ row-rule-width: 10px;
+ column-rule-style: double;
+ column-rule-color: red;
+ column-rule-width: 10px;
+ width: 170px;
+ flex-wrap: wrap;
+ }
+
+ .items {
+ background-color: rgb(96 139 168 / 0.2);
+ flex-shrink: 1;
+ width: 50px;
+ height: 50px;
+ }
+
+ #four {
+ width: 100px;
+ }
+</style>
+
+<div id="flexbox">
+ <div class="items">One</div>
+ <div class="items">Two</div>
+ <div class="items">Three</div>
+ <div class="items" id="four">Four</div>
+ <div class="items">Five</div>
+ <div class="items">Six</div>
+ <div class="items">Seven</div>
+ <div class="items">Eight</div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-005-ref.html b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-005-ref.html
new file mode 100644
index 00000000000..020fdb1c8db
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-005-ref.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ #flexbox {
+ border: 2px solid rgb(96 139 168);
+ display: flex;
+ column-gap: 10px;
+ row-gap: 10px;
+ width: 170px;
+ flex-wrap: wrap;
+ }
+
+ .items {
+ background-color: rgb(96 139 168 / 0.2);
+ flex-shrink: 1;
+ width: 50px;
+ height: 50px;
+ }
+
+ #four {
+ width: 100px;
+ }
+
+ .row-gap {
+ margin: 0px;
+ padding: 0px;
+ height: 0px;
+ width: 170px;
+ left: 2px;
+ position: absolute;
+ border-bottom: 10px dotted blue;
+ }
+
+ .column-gap {
+ display: flex;
+ flex-direction: column;
+ row-gap: 60px;
+ height: 170px;
+ top: 2px;
+ width: 10px;
+ position: absolute;
+ }
+
+ .column {
+ width: 0px;
+ border-left: 10px dotted red;
+ height: 55px;
+ }
+</style>
+
+<div id="flexbox">
+ <div class="items">One</div>
+ <div class="items">Two</div>
+ <div class="items">Three</div>
+ <div class="items" id="four">Four</div>
+ <div class="items">Five</div>
+ <div class="items">Six</div>
+ <div class="items">Seven</div>
+ <div class="items">Eight</div>
+</div>
+
+<div class="row-gap" style="top: 52px"></div>
+<div class="row-gap" style="top: 112px"></div>
+
+<div id="columns1" style="left: 52px;" class="column-gap">
+ <div id="c1" class="column"></div>
+ <div id="c2" class="column"></div>
+</div>
+
+<div id="columns2" style="left: 112px;" class="column-gap">
+ <div id="c1" class="column"></div>
+ <div id="c2" class="column"></div>
+</div>
+
+<div id="column3" style="left: 102px; position:absolute; top: 57px; height:60px;" class="column"></div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-005.html b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-005.html
new file mode 100644
index 00000000000..1688d447d50
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-005.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: flex column and row gaps are painted with dotted styling.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="flex-gap-decorations-005-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ #flexbox {
+ border: 2px solid rgb(96 139 168);
+ display: flex;
+ column-gap: 10px;
+ row-gap: 10px;
+ row-rule-style: dotted;
+ row-rule-color: blue;
+ row-rule-width: 10px;
+ column-rule-style: dotted;
+ column-rule-color: red;
+ column-rule-width: 10px;
+ width: 170px;
+ flex-wrap: wrap;
+ }
+
+ .items {
+ background-color: rgb(96 139 168 / 0.2);
+ flex-shrink: 1;
+ width: 50px;
+ height: 50px;
+ }
+
+ #four {
+ width: 100px;
+ }
+</style>
+
+<div id="flexbox">
+ <div class="items">One</div>
+ <div class="items">Two</div>
+ <div class="items">Three</div>
+ <div class="items" id="four">Four</div>
+ <div class="items">Five</div>
+ <div class="items">Six</div>
+ <div class="items">Seven</div>
+ <div class="items">Eight</div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-006-ref.html b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-006-ref.html
new file mode 100644
index 00000000000..701d36f93bb
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-006-ref.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ #flexbox>* {
+ background-color: rgb(96 139 168 / 0.2);
+ }
+
+ #flexbox {
+ border: 2px solid rgb(96 139 168);
+ border-width: 2px;
+ display: flex;
+ column-gap: 10px;
+ row-gap: 30px;
+ height: 300px;
+ width: 300px;
+ flex-wrap: wrap;
+ align-content: center;
+ writing-mode: vertical-lr;
+ }
+
+ .items {
+ width: 70px;
+ height: 70px;
+ }
+
+ .row-gap {
+ background-color: blue;
+ margin: 0px;
+ padding: 0px;
+ height: 300px;
+ width: 30px;
+ top: 2px;
+ left: 137px;
+ position: absolute;
+ }
+
+ .column-gap {
+ background-color: red;
+ margin: 0px;
+ padding: 0px;
+ height: 10px;
+ width: 170px;
+ left: 67px;
+ position: absolute;
+ }
+</style>
+
+<div id="flexbox">
+ <div class="items">One</div>
+ <div class="items">Two</div>
+ <div class="items">Three</div>
+ <div class="items">Four</div>
+ <div class="items">Five</div>
+ <div class="items">Six</div>
+</div>
+
+<div id="horizontal1" class="row-gap"></div>
+
+<div id="column1" class="column-gap" style="top:72px;"></div>
+<div id="column2" class="column-gap" style="top: 152px;"></div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-006.html b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-006.html
new file mode 100644
index 00000000000..3d7dbfd9fed
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-006.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: flex column and row gaps are painted in vertical-lr and center aligned.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="flex-gap-decorations-006-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ #flexbox>* {
+ background-color: rgb(96 139 168 / 0.2);
+ }
+
+ #flexbox {
+ border: 2px solid rgb(96 139 168);
+ border-width: 2px;
+ display: flex;
+ column-gap: 10px;
+ column-rule-style: solid;
+ column-rule-width: 10px;
+ column-rule-color: red;
+ row-gap: 30px;
+ row-rule-style: solid;
+ row-rule-width: 30px;
+ row-rule-color: blue;
+ height: 300px;
+ width: 300px;
+ flex-wrap: wrap;
+ align-content: center;
+ writing-mode: vertical-lr;
+ }
+
+ .items {
+ width: 70px;
+ height: 70px;
+ }
+</style>
+
+<div id="flexbox">
+ <div class="items">One</div>
+ <div class="items">Two</div>
+ <div class="items">Three</div>
+ <div class="items">Four</div>
+ <div class="items">Five</div>
+ <div class="items">Six</div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-007-ref.html b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-007-ref.html
new file mode 100644
index 00000000000..8511c66acf4
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-007-ref.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ #flexbox>* {
+ background-color: rgb(96 139 168 / 0.2);
+ }
+
+ #flexbox {
+ border: 2px solid rgb(96 139 168);
+ border-width: 2px;
+ display: flex;
+ column-gap: 10px;
+ width: 170px;
+ flex-wrap: wrap;
+ align-items: flex-end;
+ }
+
+ .items {
+ width: 50px;
+ }
+
+ .column-gap {
+ background-color: red;
+ margin: 0px;
+ padding: 0px;
+ height: 10px;
+ width: 10px;
+ position: absolute;
+ top:2px;
+ height: 40px;
+ }
+
+ #three {
+ height: 40px;
+ }
+</style>
+
+<div id="flexbox">
+ <div class="items">One</div>
+ <div class="items">Two</div>
+ <div class="items" id="three">Three</div>
+</div>
+
+<div id="column1" class="column-gap" style="left: 52px;"></div>
+<div id="column2" class="column-gap" style="left: 112px;"></div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-007.html b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-007.html
new file mode 100644
index 00000000000..34853bb3206
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-007.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: flex column and row gaps are painted align-items.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="flex-gap-decorations-007-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ #flexbox>* {
+ background-color: rgb(96 139 168 / 0.2);
+ }
+
+ #flexbox {
+ border: 2px solid rgb(96 139 168);
+ border-width: 2px;
+ display: flex;
+ column-gap: 10px;
+ column-rule-style: solid;
+ column-rule-width: 10px;
+ column-rule-color: red;
+ width: 170px;
+ flex-wrap: wrap;
+ align-items: flex-end;
+ }
+
+ .items {
+ width: 50px;
+ }
+
+ #three {
+ height: 40px;
+ }
+</style>
+
+<div id="flexbox">
+ <div class="items">One</div>
+ <div class="items">Two</div>
+ <div class="items" id="three">Three</div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-008-ref.html b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-008-ref.html
new file mode 100644
index 00000000000..8ca5749417f
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-008-ref.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ #flexbox>* {
+ background-color: rgb(96 139 168 / 0.2);
+ }
+
+ #flexbox {
+ border: 2px solid rgb(96 139 168);
+ border-width: 2px;
+ display: flex;
+ column-gap: 10px;
+ width: 200px;
+ flex-wrap: nowrap;
+ }
+
+ .items {
+ width: 50px;
+ height: 50px;
+ flex-shrink: 0;
+ }
+
+ .column-gap {
+ display: flex;
+ margin: 0px;
+ padding: 0px;
+ height: 10px;
+ width: 300px;
+ position: absolute;
+ top:2px;
+ height: 50px;
+ left: 52px;
+ column-gap: 50px;
+ }
+
+ .columns {
+ background-color: red;
+ width: 10px;
+ height: 50px;
+ }
+</style>
+
+<div id="flexbox">
+ <div class="items">One</div>
+ <div class="items">Two</div>
+ <div class="items">Three</div>
+ <div class="items">Four</div>
+ <div class="items">Five</div>
+ <div class="items">Six</div>
+</div>
+
+<div class="column-gap">
+ <div class="columns"></div>
+ <div class="columns"></div>
+ <div class="columns"></div>
+ <div class="columns"></div>
+ <div class="columns"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-008.html b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-008.html
new file mode 100644
index 00000000000..bd4e73c158c
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-008.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: flex column gaps are painted on overflowing items.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="flex-gap-decorations-008-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ #flexbox>* {
+ background-color: rgb(96 139 168 / 0.2);
+ }
+
+ #flexbox {
+ border: 2px solid rgb(96 139 168);
+ border-width: 2px;
+ display: flex;
+ column-gap: 10px;
+ column-rule-style: solid;
+ column-rule-width: 10px;
+ column-rule-color: red;
+ width: 200px;
+ flex-wrap: nowrap;
+ }
+
+ .items {
+ width: 50px;
+ height: 50px;
+ flex-shrink: 0;
+ }
+</style>
+
+<div id="flexbox">
+ <div class="items">One</div>
+ <div class="items">Two</div>
+ <div class="items">Three</div>
+ <div class="items">Four</div>
+ <div class="items">Five</div>
+ <div class="items">Six</div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-009-ref.html b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-009-ref.html
new file mode 100644
index 00000000000..2071e3fce60
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-009-ref.html
@@ -0,0 +1,95 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ #flexbox {
+ border: 2px solid rgb(96 139 168);
+ display: flex;
+ column-gap: 10px;
+ row-gap: 10px;
+ width: 170px;
+ flex-wrap: wrap;
+ }
+
+ .items {
+ background-color: rgb(96 139 168 / 0.2);
+ flex-shrink: 1;
+ width: 50px;
+ height: 50px;
+ }
+
+ #four {
+ width: 100px;
+ }
+
+ .row-gap {
+ display: flex;
+ margin: 0px;
+ padding: 0px;
+ height: 10px;
+ width: 170px;
+ position: absolute;
+ column-gap: 10px
+ }
+
+ .row {
+ background: blue;
+ width: 50px;
+ height: 10px;
+ }
+
+ .column-gap {
+ display: flex;
+ flex-direction: column;
+ row-gap: 70px;
+ height: 170px;
+ top: 2px;
+ width: 10px;
+ position: absolute;
+ }
+
+ .column {
+ background: red;
+ width: 10px;
+ height: 50px;
+ }
+</style>
+
+<div id="flexbox">
+ <div class="items">One</div>
+ <div class="items">Two</div>
+ <div class="items">Three</div>
+ <div class="items" id="four">Four</div>
+ <div class="items">Five</div>
+ <div class="items">Six</div>
+ <div class="items">Seven</div>
+ <div class="items">Eight</div>
+</div>
+
+<div id="row1" class="row-gap" style="top: 52px; left: 2px;">
+ <div id="r1" class="row"></div>
+ <div id="r2" style="width: 40px" class="row"></div>
+ <div id="r2" style="margin-left: auto" class="row"></div>
+</div>
+
+<div id="row2" class="row-gap" style="top: 112px; left: 2px;">
+ <div id="r3" class="row"></div>
+ <div id="r4" style="width: 40px" class="row"></div>
+ <div id="r5" style="margin-left: auto" class="row"></div>
+</div>
+
+<div id="columns1" style="left: 52px;" class="column-gap">
+ <div id="c1" class="column"></div>
+ <div id="c2" class="column"></div>
+</div>
+
+<div id="columns2" style="left: 112px;" class="column-gap">
+ <div id="c1" class="column"></div>
+ <div id="c2" class="column"></div>
+</div>
+
+<div id="columns3" style="left: 102px; position:absolute; top: 62px; height:50px;" class="column"></div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-009.html b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-009.html
new file mode 100644
index 00000000000..6bb406c5b01
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-009.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: flex column and row gaps are painted with intersection rule break.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="flex-gap-decorations-009-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ #flexbox {
+ border: 2px solid rgb(96 139 168);
+ display: flex;
+ column-gap: 10px;
+ row-gap: 10px;
+ row-rule-style: solid;
+ row-rule-color: blue;
+ row-rule-width: 10px;
+ row-rule-break: intersection;
+ row-rule-outset: 0;
+ column-rule-break: intersection;
+ column-rule-style: solid;
+ column-rule-color: red;
+ column-rule-width: 10px;
+ column-rule-outset: 0;
+ width: 170px;
+ flex-wrap: wrap;
+ }
+
+ .items {
+ background-color: rgb(96 139 168 / 0.2);
+ flex-shrink: 1;
+ width: 50px;
+ height: 50px;
+ }
+
+ #four {
+ width: 100px;
+ }
+</style>
+
+<div id="flexbox">
+ <div class="items">One</div>
+ <div class="items">Two</div>
+ <div class="items">Three</div>
+ <div class="items" id="four">Four</div>
+ <div class="items">Five</div>
+ <div class="items">Six</div>
+ <div class="items">Seven</div>
+ <div class="items">Eight</div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-010-ref.html b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-010-ref.html
new file mode 100644
index 00000000000..c20df7fcda1
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-010-ref.html
@@ -0,0 +1,82 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ #flexbox {
+ border: 2px solid rgb(96 139 168);
+ display: flex;
+ column-gap: 10px;
+ row-gap: 10px;
+ width: 170px;
+ flex-wrap: wrap;
+ }
+
+ .items {
+ background-color: rgb(96 139 168 / 0.2);
+ flex-shrink: 1;
+ width: 50px;
+ height: 50px;
+ }
+
+ #four {
+ width: 100px;
+ }
+
+ .row-gap {
+ margin: 0px;
+ padding: 0px;
+ height: 10px;
+ width: 170px;
+ position: absolute;
+ background: blue;
+ }
+
+ .column-gap {
+ display: flex;
+ flex-direction: column;
+ row-gap: 70px;
+ height: 170px;
+ top: 2px;
+ width: 10px;
+ position: absolute;
+ }
+
+ .column {
+ background: red;
+ width: 10px;
+ height: 50px;
+ }
+</style>
+
+<div id="flexbox">
+ <div class="items">One</div>
+ <div class="items">Two</div>
+ <div class="items">Three</div>
+ <div class="items" id="four">Four</div>
+ <div class="items">Five</div>
+ <div class="items">Six</div>
+ <div class="items">Seven</div>
+ <div class="items">Eight</div>
+</div>
+
+<div id="row1" class="row-gap" style="top: 52px; left: 2px;">
+</div>
+
+<div id="row2" class="row-gap" style="top: 112px; left: 2px;">
+</div>
+
+<div id="columns1" style="left: 52px;" class="column-gap">
+ <div id="c1" class="column"></div>
+ <div id="c2" class="column"></div>
+</div>
+
+<div id="columns2" style="left: 112px;" class="column-gap">
+ <div id="c1" class="column"></div>
+ <div id="c2" class="column"></div>
+</div>
+
+<div id="columns3" style="left: 102px; position:absolute; top: 62px; height:50px;" class="column"></div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-010.html b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-010.html
new file mode 100644
index 00000000000..49f6ec962ad
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-010.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: flex column and row gaps are painted with intersection column rule break.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="flex-gap-decorations-010-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ #flexbox {
+ border: 2px solid rgb(96 139 168);
+ display: flex;
+ column-gap: 10px;
+ row-gap: 10px;
+ row-rule-style: solid;
+ row-rule-color: blue;
+ row-rule-width: 10px;
+ column-rule-break: intersection;
+ column-rule-style: solid;
+ column-rule-color: red;
+ column-rule-width: 10px;
+ column-rule-outset: 0;
+ width: 170px;
+ flex-wrap: wrap;
+ }
+
+ .items {
+ background-color: rgb(96 139 168 / 0.2);
+ flex-shrink: 1;
+ width: 50px;
+ height: 50px;
+ }
+
+ #four {
+ width: 100px;
+ }
+</style>
+
+<div id="flexbox">
+ <div class="items">One</div>
+ <div class="items">Two</div>
+ <div class="items">Three</div>
+ <div class="items" id="four">Four</div>
+ <div class="items">Five</div>
+ <div class="items">Six</div>
+ <div class="items">Seven</div>
+ <div class="items">Eight</div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-011-ref.html b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-011-ref.html
new file mode 100644
index 00000000000..61d3e83dc2f
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-011-ref.html
@@ -0,0 +1,79 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ #flexbox {
+ border: 2px solid rgb(96 139 168);
+ display: flex;
+ column-gap: 10px;
+ row-gap: 10px;
+ width: 170px;
+ flex-wrap: wrap;
+ }
+
+ .items {
+ background-color: rgb(96 139 168 / 0.2);
+ flex-shrink: 1;
+ width: 50px;
+ height: 50px;
+ }
+
+ #four {
+ width: 100px;
+ }
+
+ .row-gap {
+ margin: 0px;
+ padding: 0px;
+ height: 2px;
+ background: blue;
+ width: 170px;
+ position: absolute;
+ }
+
+ .column-gap {
+ display: flex;
+ flex-direction: column;
+ row-gap: 66px;
+ height: 174px;
+ top: 0px;
+ width: 10px;
+ position: absolute;
+ }
+
+ .column {
+ background: red;
+ width: 2px;
+ height: 54px;
+ }
+</style>
+
+<div id="flexbox">
+ <div class="items">One</div>
+ <div class="items">Two</div>
+ <div class="items">Three</div>
+ <div class="items" id="four">Four</div>
+ <div class="items">Five</div>
+ <div class="items">Six</div>
+ <div class="items">Seven</div>
+ <div class="items">Eight</div>
+</div>
+
+<div id="row1" class="row-gap" style="top: 56px; left: 2px;"></div>
+<div id="row2" class="row-gap" style="top: 116px; left: 2px;"></div>
+
+<div id="columns1" style="left: 56px;" class="column-gap">
+ <div id="c1" class="column"></div>
+ <div id="c2" class="column"></div>
+</div>
+
+<div id="columns2" style="left: 116px;" class="column-gap">
+ <div id="c1" class="column"></div>
+ <div id="c2" class="column"></div>
+</div>
+
+<div id="columns3" style="left: 106px; position:absolute; top: 60px; height:54px;" class="column"></div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-011.html b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-011.html
new file mode 100644
index 00000000000..7b142e54ec7
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-011.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: flex column and row gaps are painted column break intersection and 2px outset.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="flex-gap-decorations-011-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ #flexbox {
+ border: 2px solid rgb(96 139 168);
+ display: flex;
+ column-gap: 10px;
+ row-gap: 10px;
+ row-rule-style: solid;
+ row-rule-color: blue;
+ row-rule-width: 2px;
+ column-rule-style: solid;
+ column-rule-color: red;
+ column-rule-width: 2px;
+ column-rule-break: intersection;
+ column-rule-outset: 2px;
+ width: 170px;
+ flex-wrap: wrap;
+ }
+
+ .items {
+ background-color: rgb(96 139 168 / 0.2);
+ flex-shrink: 1;
+ width: 50px;
+ height: 50px;
+ }
+
+ #four {
+ width: 100px;
+ }
+</style>
+
+<div id="flexbox">
+ <div class="items">One</div>
+ <div class="items">Two</div>
+ <div class="items">Three</div>
+ <div class="items" id="four">Four</div>
+ <div class="items">Five</div>
+ <div class="items">Six</div>
+ <div class="items">Seven</div>
+ <div class="items">Eight</div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-013-ref.html b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-013-ref.html
new file mode 100644
index 00000000000..3d999788023
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-013-ref.html
@@ -0,0 +1,79 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ #flexbox {
+ border: 2px solid rgb(96 139 168);
+ display: flex;
+ column-gap: 10px;
+ row-gap: 10px;
+ width: 170px;
+ flex-wrap: wrap;
+ }
+
+ .items {
+ background-color: rgb(96 139 168 / 0.2);
+ flex-shrink: 1;
+ width: 50px;
+ height: 50px;
+ }
+
+ #four {
+ width: 100px;
+ }
+
+ .row-gap {
+ margin: 0px;
+ padding: 0px;
+ height: 2px;
+ background: blue;
+ width: 170px;
+ position: absolute;
+ }
+
+ .column-gap {
+ display: flex;
+ flex-direction: column;
+ row-gap: 74px;
+ height: 174px;
+ top: 4px;
+ width: 10px;
+ position: absolute;
+ }
+
+ .column {
+ background: red;
+ width: 2px;
+ height: 46px;
+ }
+</style>
+
+<div id="flexbox">
+ <div class="items">One</div>
+ <div class="items">Two</div>
+ <div class="items">Three</div>
+ <div class="items" id="four">Four</div>
+ <div class="items">Five</div>
+ <div class="items">Six</div>
+ <div class="items">Seven</div>
+ <div class="items">Eight</div>
+</div>
+
+<div id="row1" class="row-gap" style="top: 56px; left: 2px;"></div>
+<div id="row2" class="row-gap" style="top: 116px; left: 2px;"></div>
+
+<div id="columns1" style="left: 56px;" class="column-gap">
+ <div id="c1" class="column"></div>
+ <div id="c2" class="column"></div>
+</div>
+
+<div id="columns2" style="left: 116px;" class="column-gap">
+ <div id="c1" class="column"></div>
+ <div id="c2" class="column"></div>
+</div>
+
+<div id="columns3" style="left: 106px; position:absolute; top: 64px; height:46px;" class="column"></div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-013.html b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-013.html
new file mode 100644
index 00000000000..1cdf1c27496
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-013.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: flex column and row gaps are painted column break intersection and -2px outset.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="flex-gap-decorations-013-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ #flexbox {
+ border: 2px solid rgb(96 139 168);
+ display: flex;
+ column-gap: 10px;
+ row-gap: 10px;
+ row-rule-style: solid;
+ row-rule-color: blue;
+ row-rule-width: 2px;
+ column-rule-style: solid;
+ column-rule-color: red;
+ column-rule-width: 2px;
+ column-rule-break: intersection;
+ column-rule-outset: -2px;
+ width: 170px;
+ flex-wrap: wrap;
+ }
+
+ .items {
+ background-color: rgb(96 139 168 / 0.2);
+ flex-shrink: 1;
+ width: 50px;
+ height: 50px;
+ }
+
+ #four {
+ width: 100px;
+ }
+</style>
+
+<div id="flexbox">
+ <div class="items">One</div>
+ <div class="items">Two</div>
+ <div class="items">Three</div>
+ <div class="items" id="four">Four</div>
+ <div class="items">Five</div>
+ <div class="items">Six</div>
+ <div class="items">Seven</div>
+ <div class="items">Eight</div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-014-ref.html b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-014-ref.html
new file mode 100644
index 00000000000..ab28707785e
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-014-ref.html
@@ -0,0 +1,79 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ #flexbox {
+ border: 2px solid rgb(96 139 168);
+ display: flex;
+ column-gap: 10px;
+ row-gap: 10px;
+ width: 170px;
+ flex-wrap: wrap;
+ }
+
+ .items {
+ background-color: rgb(96 139 168 / 0.2);
+ flex-shrink: 1;
+ width: 50px;
+ height: 50px;
+ }
+
+ #four {
+ width: 100px;
+ }
+
+ .row-gap {
+ margin: 0px;
+ padding: 0px;
+ height: 2px;
+ background: blue;
+ width: 170px;
+ position: absolute;
+ }
+
+ .column-gap {
+ display: flex;
+ flex-direction: column;
+ row-gap: 50px;
+ height: 174px;
+ top: 2px;
+ width: 10px;
+ position: absolute;
+ }
+
+ .column {
+ background: red;
+ width: 2px;
+ height: 60px;
+ }
+</style>
+
+<div id="flexbox">
+ <div class="items">One</div>
+ <div class="items">Two</div>
+ <div class="items">Three</div>
+ <div class="items" id="four">Four</div>
+ <div class="items">Five</div>
+ <div class="items">Six</div>
+ <div class="items">Seven</div>
+ <div class="items">Eight</div>
+</div>
+
+<div id="row1" class="row-gap" style="top: 56px; left: 2px;"></div>
+<div id="row2" class="row-gap" style="top: 116px; left: 2px;"></div>
+
+<div id="columns1" style="left: 56px;" class="column-gap">
+ <div id="c1" class="column"></div>
+ <div id="c2" class="column"></div>
+</div>
+
+<div id="columns2" style="left: 116px;" class="column-gap">
+ <div id="c1" class="column"></div>
+ <div id="c2" class="column"></div>
+</div>
+
+<div id="columns3" style="left: 106px; position:absolute; top: 52px; height:70px;" class="column"></div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-014.html b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-014.html
new file mode 100644
index 00000000000..b7d19549e03
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-014.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: flex column and row gaps are painted column break intersection and 100% outset.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="flex-gap-decorations-014-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ #flexbox {
+ border: 2px solid rgb(96 139 168);
+ display: flex;
+ column-gap: 10px;
+ row-gap: 10px;
+ row-rule-style: solid;
+ row-rule-color: blue;
+ row-rule-width: 2px;
+ column-rule-style: solid;
+ column-rule-color: red;
+ column-rule-width: 2px;
+ column-rule-break: intersection;
+ column-rule-outset: 100%;
+ width: 170px;
+ flex-wrap: wrap;
+ }
+
+ .items {
+ background-color: rgb(96 139 168 / 0.2);
+ flex-shrink: 1;
+ width: 50px;
+ height: 50px;
+ }
+
+ #four {
+ width: 100px;
+ }
+</style>
+
+<div id="flexbox">
+ <div class="items">One</div>
+ <div class="items">Two</div>
+ <div class="items">Three</div>
+ <div class="items" id="four">Four</div>
+ <div class="items">Five</div>
+ <div class="items">Six</div>
+ <div class="items">Seven</div>
+ <div class="items">Eight</div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-015.html b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-015.html
new file mode 100644
index 00000000000..6cba13ba216
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/flex/flex-gap-decorations-015.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: flex column and row gaps are painted column flex direction
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="flex-gap-decorations-014-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ #flexbox {
+ border: 2px solid rgb(96 139 168);
+ display: flex;
+ column-gap: 20px;
+ row-gap: 10px;
+ width: 120px;
+ height: 170px;
+ flex-wrap: wrap;
+ flex-direction: column;
+ column-rule-style: solid;
+ column-rule-color: red;
+ column-rule-width: 20px;
+ row-rule-style: solid;
+ row-rule-color: blue;
+ row-rule-width: 10px;
+ }
+
+ .items {
+ background-color: rgb(96 139 168 / 0.2);
+ flex-shrink: 1;
+ width: 50px;
+ height: 50px;
+ }
+
+</style>
+
+<div id="flexbox">
+ <div class="items">One</div>
+ <div class="items">Two</div>
+ <div class="items">Three</div>
+ <div class="items">Four</div>
+ <div class="items">Five</div>
+ <div class="items">Six</div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-002.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-002.html
index 429798d0fe7..dfc4198b078 100644
--- a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-002.html
+++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-002.html
@@ -3,7 +3,7 @@
CSS Gap Decorations: grid column gaps are painted with solid styling.
</title>
<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
-<link rel="match" href="grid-gap-decorations-002-ref.html">
+<link rel="match" href="../agnostic/gap-decorations-001-ref.html">
<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
<style>
.grid-container {
diff --git a/tests/wpt/tests/css/css-images/gradient/gradient-infinity-001-ref.html b/tests/wpt/tests/css/css-images/gradient/gradient-infinity-001-ref.html
new file mode 100644
index 00000000000..b15e7fcae69
--- /dev/null
+++ b/tests/wpt/tests/css/css-images/gradient/gradient-infinity-001-ref.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com">
+<link rel="author" title="一丝" href="mailto:yiorsi@gmail.com">
+<title>All the boxes below should have the lime background.</title>
+<style>
+.box {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 10px;
+}
+.box > div {
+ width: 100px;
+ height: 100px;
+ border: solid 1px black;
+ background-color: lime;
+}
+
+</style>
+<div class="box">
+ <div></div>
+ <div></div>
+ <div></div>
+ <div></div>
+ <div></div>
+</div> \ No newline at end of file
diff --git a/tests/wpt/tests/css/css-images/gradient/gradient-infinity-001.html b/tests/wpt/tests/css/css-images/gradient/gradient-infinity-001.html
new file mode 100644
index 00000000000..73b9ac1bd1b
--- /dev/null
+++ b/tests/wpt/tests/css/css-images/gradient/gradient-infinity-001.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<link rel="match" href="gradient-infinity-001-ref.html">
+<link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com">
+<link rel="author" title="一丝" href="mailto:yiorsi@gmail.com">
+<link rel="help" href="https://www.w3.org/TR/css-color-4/#interpolation">
+<title>All the boxes below should have the lime background.</title>
+<style>
+.box {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 10px;
+}
+.box > div {
+ width: 100px;
+ height: 100px;
+ border: solid 1px black;
+}
+.test1 {
+ background: linear-gradient(to right in srgb, lime 100px, red calc(1px / 0));
+}
+.test2 {
+ background: linear-gradient(to right in srgb, lime 100px, red calc(Infinity * 1px));
+}
+.test3 {
+ background: linear-gradient(to left in srgb, lime 100px, red calc(Infinity * 1px));
+}
+.test4 {
+ background: linear-gradient(to top in srgb, lime 100px, red calc(1px / 0));
+}
+.test5 {
+ background: linear-gradient(to bottom in srgb, lime 100px, red calc(Infinity * 1px));
+}
+</style>
+<div class="box">
+ <div class="test1"></div>
+ <div class="test2"></div>
+ <div class="test3"></div>
+ <div class="test4"></div>
+ <div class="test5"></div>
+</div> \ No newline at end of file
diff --git a/tests/wpt/tests/css/css-images/gradient/gradient-infinity-002-ref.html b/tests/wpt/tests/css/css-images/gradient/gradient-infinity-002-ref.html
new file mode 100644
index 00000000000..30857abd9a1
--- /dev/null
+++ b/tests/wpt/tests/css/css-images/gradient/gradient-infinity-002-ref.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com">
+<link rel="author" title="一丝" href="mailto:yiorsi@gmail.com">
+<title>All boxes should have a lime background.</title>
+<style>
+.box {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 10px;
+}
+.box > div {
+ width: 100px;
+ height: 100px;
+ border: solid 1px black;
+ padding: 1px;
+ background-color: lime;
+}
+</style>
+<div class="box">
+ <div></div>
+ <div></div>
+ <div></div>
+ <div></div>
+ <div></div>
+</div> \ No newline at end of file
diff --git a/tests/wpt/tests/css/css-images/gradient/gradient-infinity-002.html b/tests/wpt/tests/css/css-images/gradient/gradient-infinity-002.html
new file mode 100644
index 00000000000..0f482492590
--- /dev/null
+++ b/tests/wpt/tests/css/css-images/gradient/gradient-infinity-002.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<link rel="match" href="gradient-infinity-002-ref.html">
+<link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com">
+<link rel="author" title="一丝" href="mailto:yiorsi@gmail.com">
+<link rel="help" href="https://www.w3.org/TR/css-color-4/#interpolation">
+<title>All boxes should have a lime background.</title>
+<style>
+.box {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 10px;
+}
+.box > div {
+ width: 100px;
+ height: 100px;
+ border: solid 1px black;
+ padding: 1px;
+}
+.test1 {
+ background: linear-gradient(to right in srgb, lime 100px, red calc(1px / 0));
+}
+.test2 {
+ background: linear-gradient(to right in srgb, lime 100px, red calc(Infinity * 1px));
+}
+.test3 {
+ background: linear-gradient(to left in srgb, lime 100px, red calc(Infinity * 1px));
+}
+.test4 {
+ background: linear-gradient(to top in srgb, lime 100px, red calc(1px / 0));
+}
+.test5 {
+ background: linear-gradient(to bottom in srgb, lime 100px, red calc(Infinity * 1px));
+}
+</style>
+<div class="box">
+ <div class="test1"></div>
+ <div class="test2"></div>
+ <div class="test3"></div>
+ <div class="test4"></div>
+ <div class="test5"></div>
+</div> \ No newline at end of file
diff --git a/tests/wpt/tests/css/css-overflow/scrollbar-gutter-with-background-gradient-ref.html b/tests/wpt/tests/css/css-overflow/scrollbar-gutter-with-background-gradient-ref.html
new file mode 100644
index 00000000000..1af00bae87d
--- /dev/null
+++ b/tests/wpt/tests/css/css-overflow/scrollbar-gutter-with-background-gradient-ref.html
@@ -0,0 +1,13 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>CSS Overflow: test scrollbar-gutter with background gradient</title>
+<link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com">
+<link rel="help" href="https://drafts.csswg.org/css-overflow-4/#scrollbar-gutter-property">
+<style>
+ html {
+ scrollbar-gutter: stable both-edges;
+ background-image: linear-gradient(to right, green, blue);
+ position: fixed;
+ inset: 0;
+ }
+</style>
diff --git a/tests/wpt/tests/css/css-overflow/scrollbar-gutter-with-background-gradient.html b/tests/wpt/tests/css/css-overflow/scrollbar-gutter-with-background-gradient.html
new file mode 100644
index 00000000000..0b392446c20
--- /dev/null
+++ b/tests/wpt/tests/css/css-overflow/scrollbar-gutter-with-background-gradient.html
@@ -0,0 +1,13 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>CSS Overflow: test scrollbar-gutter with background gradient</title>
+<link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com">
+<link rel="help" href="https://drafts.csswg.org/css-overflow-4/#scrollbar-gutter-property">
+<link rel="match" href="scrollbar-gutter-with-background-gradient-ref.html">
+<meta name=fuzzy content="maxDifference=0-1;totalPixels=0-70000">
+<style>
+ html {
+ scrollbar-gutter: stable both-edges;
+ background-image: linear-gradient(to right, green, blue);
+ }
+</style>
diff --git a/tests/wpt/tests/css/css-ruby/ruby-inlinize-fieldset-crash.html b/tests/wpt/tests/css/css-ruby/ruby-inlinize-fieldset-crash.html
new file mode 100644
index 00000000000..5454362077c
--- /dev/null
+++ b/tests/wpt/tests/css/css-ruby/ruby-inlinize-fieldset-crash.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>crbug.com/402200344</title>
+<ruby><i>
+<object classid="5Ygt" name="NEefr" type="text/javascript"><fieldset style="display:contents;"><header></header>
+</object>
+</i>
+<rt>ô6Ì9ºÍ¶æ</ruby>
diff --git a/tests/wpt/tests/css/css-typed-om/WEB_FEATURES.yml b/tests/wpt/tests/css/css-typed-om/WEB_FEATURES.yml
new file mode 100644
index 00000000000..13ff52f5092
--- /dev/null
+++ b/tests/wpt/tests/css/css-typed-om/WEB_FEATURES.yml
@@ -0,0 +1,6 @@
+features:
+- name: css-typed-om
+ files: "**"
+- name: numeric-factory-functions
+ files:
+ - factory-*
diff --git a/tests/wpt/tests/css/css-ui/cursor-calc-hotspot.html b/tests/wpt/tests/css/css-ui/cursor-calc-hotspot.html
index 84f9ca35b79..825d9571271 100644
--- a/tests/wpt/tests/css/css-ui/cursor-calc-hotspot.html
+++ b/tests/wpt/tests/css/css-ui/cursor-calc-hotspot.html
@@ -6,22 +6,38 @@
<style>
#t1 {
font-size: 20px;
- cursor: url(cur.ico) calc(7 * sign(1em - 18px)) 0, auto;
+ cursor: url(data:image/x-icon,) calc(7 * sign(1em - 18px)) 0, auto;
}
#t2 {
- cursor: url(cur.ico) calc(4 * sibling-index()) 0, auto;
+ cursor: url(data:image/x-icon,) calc(4 * sibling-index()) 0, auto;
+ }
+ #t3 {
+ cursor: url(data:image/x-icon,) calc(9) 0, auto;
+ }
+ #t4 {
+ cursor: url(data:image/x-icon,) calc(10 * sign(2px)) 0, auto;
}
</style>
<div>
<div id="t1"></div>
<div id="t2"></div>
+ <div id="t3"></div>
+ <div id="t4"></div>
</div>
<script>
test(() => {
- assert_equals(getComputedStyle(t1).cursor, "url(cur.ico) 7 0, auto");
+ assert_equals(getComputedStyle(t1).cursor, 'url("data:image/x-icon,") 7 0, auto');
}, "cursor hotspot with sign() depending on font relative units");
test(() => {
- assert_equals(getComputedStyle(t2).cursor, "url(cur.ico) 8 0, auto");
+ assert_equals(getComputedStyle(t2).cursor, 'url("data:image/x-icon,") 8 0, auto');
}, "cursor hotspot depending on sibling-index()");
+
+ test(() => {
+ assert_equals(getComputedStyle(t3).cursor, 'url("data:image/x-icon,") 9 0, auto');
+ }, "cursor hotspot depending on simplified numeric calc()");
+
+ test(() => {
+ assert_equals(getComputedStyle(t4).cursor, 'url("data:image/x-icon,") 10 0, auto');
+ }, "cursor hotspot depending on simplified numeric calc() with sign()");
</script>
diff --git a/tests/wpt/tests/css/css-view-transitions/WEB_FEATURES.yml b/tests/wpt/tests/css/css-view-transitions/WEB_FEATURES.yml
index e1df1b8c670..cbdc654b1d6 100644
--- a/tests/wpt/tests/css/css-view-transitions/WEB_FEATURES.yml
+++ b/tests/wpt/tests/css/css-view-transitions/WEB_FEATURES.yml
@@ -1,3 +1,7 @@
features:
- name: view-transitions
files: "**"
+- name: view-transition-class
+ files:
+ - class-specificity.html
+ - pseudo-with-classes-*
diff --git a/tests/wpt/tests/css/css-view-transitions/active-view-transition-on-non-root.html b/tests/wpt/tests/css/css-view-transitions/active-view-transition-on-non-root.html
index 9870b15cca9..d8699d3a2c7 100644
--- a/tests/wpt/tests/css/css-view-transitions/active-view-transition-on-non-root.html
+++ b/tests/wpt/tests/css/css-view-transitions/active-view-transition-on-non-root.html
@@ -21,7 +21,10 @@ main:active-view-transition #target {
background: red;
}
-::view-transition-group(*) {
+::view-transition-group(*),
+::view-transition-image-pair(*),
+::view-transition-old(*),
+::view-transition-new(*) {
animation-play-state: paused;
}
</style>
diff --git a/tests/wpt/tests/css/css-view-transitions/active-view-transition-type-on-non-root.html b/tests/wpt/tests/css/css-view-transitions/active-view-transition-type-on-non-root.html
index f4225485b86..4569af04fff 100644
--- a/tests/wpt/tests/css/css-view-transitions/active-view-transition-type-on-non-root.html
+++ b/tests/wpt/tests/css/css-view-transitions/active-view-transition-type-on-non-root.html
@@ -21,7 +21,10 @@ main:active-view-transition-type(type-name) #target {
background: red;
}
-::view-transition-group(*) {
+::view-transition-group(*),
+::view-transition-image-pair(*),
+::view-transition-old(*),
+::view-transition-new(*) {
animation-play-state: paused;
}
</style>
diff --git a/tests/wpt/tests/css/css-view-transitions/navigation/WEB_FEATURES.yml b/tests/wpt/tests/css/css-view-transitions/navigation/WEB_FEATURES.yml
new file mode 100644
index 00000000000..1b95bc2b45b
--- /dev/null
+++ b/tests/wpt/tests/css/css-view-transitions/navigation/WEB_FEATURES.yml
@@ -0,0 +1,3 @@
+features:
+- name: cross-document-view-transitions
+ files: "**"
diff --git a/tests/wpt/tests/css/css-view-transitions/nested/nested-root-capture-with-clip-ref.html b/tests/wpt/tests/css/css-view-transitions/nested/nested-root-capture-with-clip-ref.html
index 0e2c7d02543..40275ab555c 100644
--- a/tests/wpt/tests/css/css-view-transitions/nested/nested-root-capture-with-clip-ref.html
+++ b/tests/wpt/tests/css/css-view-transitions/nested/nested-root-capture-with-clip-ref.html
@@ -5,6 +5,7 @@
<link rel="author" href="mailto:vmpstr@chromium.org">
<style>
+body { background: lightgreen; }
#clipper {
overflow: clip;
height: 200px;
diff --git a/tests/wpt/tests/css/css-view-transitions/nested/nested-root-capture-with-clip.html b/tests/wpt/tests/css/css-view-transitions/nested/nested-root-capture-with-clip.html
index eb728182865..a55997a3f63 100644
--- a/tests/wpt/tests/css/css-view-transitions/nested/nested-root-capture-with-clip.html
+++ b/tests/wpt/tests/css/css-view-transitions/nested/nested-root-capture-with-clip.html
@@ -4,7 +4,7 @@
<link rel="help" href="https://drafts.csswg.org/css-view-transitions-2/">
<link rel="author" href="mailto:vmpstr@chromium.org">
<link rel="match" href="nested-root-capture-with-clip-ref.html">
-<meta name=fuzzy content="maxDifference=0-40; totalPixels=0-400">
+<meta name=fuzzy content="maxDifference=0-40; totalPixels=0-500">
<script src="/common/reftest-wait.js"></script>
<script src="/dom/events/scrolling/scroll_support.js"></script>
@@ -32,7 +32,7 @@
will-change: transform;
}
::view-transition-group(clipper) {
- animation-play-state: pause;
+ animation-play-state: paused;
}
::view-transition-new(clipper) {
animation: unset;
@@ -45,6 +45,9 @@
::view-transition-group(*.item) {
display: none;
}
+::view-transition {
+ background: lightgreen;
+}
</style>
<div id=clipper>
diff --git a/tests/wpt/tests/css/css-view-transitions/parsing/WEB_FEATURES.yml b/tests/wpt/tests/css/css-view-transitions/parsing/WEB_FEATURES.yml
new file mode 100644
index 00000000000..e011b34e2a0
--- /dev/null
+++ b/tests/wpt/tests/css/css-view-transitions/parsing/WEB_FEATURES.yml
@@ -0,0 +1,4 @@
+features:
+- name: view-transition-class
+ files:
+ - view-transition-class-*
diff --git a/tests/wpt/tests/css/css-view-transitions/pseudo-rendering-invalidation.html b/tests/wpt/tests/css/css-view-transitions/pseudo-rendering-invalidation.html
index 4d492c40d87..9624137e754 100644
--- a/tests/wpt/tests/css/css-view-transitions/pseudo-rendering-invalidation.html
+++ b/tests/wpt/tests/css/css-view-transitions/pseudo-rendering-invalidation.html
@@ -28,8 +28,11 @@ div {
background: darkseagreen;
}
-::view-transition-group(*) {
- animation-duration: 50s;
+::view-transition-group(*),
+::view-transition-image-pair(*),
+::view-transition-old(*),
+::view-transition-new(*) {
+ animation-play-state: paused;
}
::view-transition {
diff --git a/tests/wpt/tests/css/css-view-transitions/view-transition-types-matches-case-sensitive-ref.html b/tests/wpt/tests/css/css-view-transitions/view-transition-types-matches-case-sensitive-ref.html
new file mode 100644
index 00000000000..6a9af3f8286
--- /dev/null
+++ b/tests/wpt/tests/css/css-view-transitions/view-transition-types-matches-case-sensitive-ref.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+
+<style>
+.test {
+ width: 100px;
+ height: 100px;
+ background: green;
+}
+
+#container {
+ display: flex;
+ flex-direction: row;
+ gap: 10px;
+}
+
+body { background: lightpink; }
+</style>
+
+<div id="container">
+ <div class="test"></div>
+ <div class="test"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-view-transitions/view-transition-types-matches-case-sensitive.html b/tests/wpt/tests/css/css-view-transitions/view-transition-types-matches-case-sensitive.html
new file mode 100644
index 00000000000..411c73c607a
--- /dev/null
+++ b/tests/wpt/tests/css/css-view-transitions/view-transition-types-matches-case-sensitive.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+
+<html class="reftest-wait">
+
+<title>View transitions: active-view-transition-type should treat types as case-sensitive</title>
+
+<link rel="help" href="https://drafts.csswg.org/css-view-transitions-2/#the-active-view-transition-type-pseudo">
+<link rel="author" href="mailto:kiet.ho@apple.com">
+<link rel="match" href="view-transition-types-matches-case-sensitive-ref.html">
+
+<script src="/common/reftest-wait.js"></script>
+
+<style>
+html:active-view-transition-type(foo) #positive1 { background: green; }
+html:active-view-transition-type(Foo) #positive1 { background: red; }
+html:active-view-transition-type(FoO) #positive1 { background: magenta; }
+html:active-view-transition-type(FOo) #positive1 { background: black; }
+
+html:active-view-transition-type(Bar) #positive2 { background: green; }
+html:active-view-transition-type(bar) #positive2 { background: red; }
+html:active-view-transition-type(bAr) #positive2 { background: magenta; }
+html:active-view-transition-type(baR) #positive2 { background: black; }
+
+#positive1 { view-transition-name: positive1; background: yellow; }
+#positive2 { view-transition-name: positive2; background: yellow; }
+
+.test {
+ width: 100px;
+ height: 100px;
+}
+
+#container {
+ display: flex;
+ flex-direction: row;
+ gap: 10px;
+}
+
+html::view-transition-group(*) {
+ animation-play-state: paused;
+}
+
+html::view-transition-new(*) {
+ animation: unset;
+ opacity: 0;
+}
+
+html::view-transition-old(*) {
+ animation: unset;
+ opacity: 1;
+}
+
+html::view-transition-group(root) {
+ display: none;
+}
+
+html::view-transition { background: lightpink; }
+</style>
+
+<div id="container">
+ <div class="test" id="positive1"></div>
+ <div class="test" id="positive2"></div>
+</div>
+
+<script>
+failIfNot(document.startViewTransition, "Missing document.startViewTransition");
+
+function runTest() {
+ let transition = document.startViewTransition({
+ types: ["foo", "Bar"]
+ });
+ transition.ready.then(takeScreenshot);
+}
+onload = () => requestAnimationFrame(() => requestAnimationFrame(runTest));
+</script>
+
+</html>
diff --git a/tests/wpt/tests/encrypted-media/scripts/playback-temporary-events.js b/tests/wpt/tests/encrypted-media/scripts/playback-temporary-events.js
index d8dac4463df..1d81cf26071 100644
--- a/tests/wpt/tests/encrypted-media/scripts/playback-temporary-events.js
+++ b/tests/wpt/tests/encrypted-media/scripts/playback-temporary-events.js
@@ -111,7 +111,7 @@ function runTest(config,qualifier) {
closeMethodPromise.then(onClosed);
Promise.all([ closedAttributePromise, closeMethodPromise ]).then(function() {
- test.step_func(onAllClosed);
+ test.step_func(onAllClosed)();
}).catch(onFailure);
}
}
diff --git a/tests/wpt/tests/fledge/tentative/resources/additional-bids.py b/tests/wpt/tests/fledge/tentative/resources/additional-bids.py
index 8a947533307..89a47c0e0d0 100644
--- a/tests/wpt/tests/fledge/tentative/resources/additional-bids.py
+++ b/tests/wpt/tests/fledge/tentative/resources/additional-bids.py
@@ -23,7 +23,7 @@ class BadRequestError(Exception):
def main(request, response):
try:
- if fledge_http_server_util.handle_cors_headers_and_preflight(request, response):
+ if fledge_http_server_util.handle_cors_headers_fail_if_preflight(request, response):
return
# Verify that Sec-Ad-Auction-Fetch is present
diff --git a/tests/wpt/tests/fledge/tentative/resources/bidding-logic.sub.py b/tests/wpt/tests/fledge/tentative/resources/bidding-logic.sub.py
index 8c0539d43c8..97d2d80343c 100644
--- a/tests/wpt/tests/fledge/tentative/resources/bidding-logic.sub.py
+++ b/tests/wpt/tests/fledge/tentative/resources/bidding-logic.sub.py
@@ -8,7 +8,7 @@ from fledge.tentative.resources import fledge_http_server_util
# injected in them. generateBid() will by default return a bid of 9 for the
# first ad.
def main(request, response):
- if fledge_http_server_util.handle_cors_headers_and_preflight(request, response):
+ if fledge_http_server_util.handle_cors_headers_fail_if_preflight(request, response):
return
error = request.GET.first(b"error", None)
diff --git a/tests/wpt/tests/fledge/tentative/resources/fledge_http_server_util.py b/tests/wpt/tests/fledge/tentative/resources/fledge_http_server_util.py
index 179262d3392..30889d92d4f 100644
--- a/tests/wpt/tests/fledge/tentative/resources/fledge_http_server_util.py
+++ b/tests/wpt/tests/fledge/tentative/resources/fledge_http_server_util.py
@@ -2,6 +2,17 @@
from collections import namedtuple
from urllib.parse import unquote_plus, urlparse
+def fail(response, body):
+ """Sets up response to fail with the provided response body.
+
+ Args:
+ response: the wptserve Response that was passed to main
+ body: the HTTP response body to use
+ """
+ response.status = (400, "Bad Request")
+ response.headers.set(b"Content-Type", b"text/plain")
+ response.content = body
+
def headers_to_ascii(headers):
"""Converts a header map with binary values to one with ASCII values.
@@ -22,18 +33,15 @@ def headers_to_ascii(headers):
header_map[pair[0].decode("ASCII")] = values
return header_map
-
-def handle_cors_headers_and_preflight(request, response):
- """Applies CORS logic common to many entrypoints.
+def attach_origin_and_credentials_headers(request, response):
+ """Attaches Access-Control-Allow-Origin and Access-Control-Allow-Credentials
+ response headers to a response, if the request indicates they're needed.
+ Only intended for internal use.
Args:
request: the wptserve Request that was passed to main
response: the wptserve Response that was passed to main
-
- Returns True if the request is a CORS preflight, which is entirely handled by
- this function, so that the calling function should immediately return.
"""
- # Append CORS headers if needed
if b"origin" in request.headers:
response.headers.set(b"Access-Control-Allow-Origin",
request.headers.get(b"origin"))
@@ -42,20 +50,50 @@ def handle_cors_headers_and_preflight(request, response):
response.headers.set(b"Access-Control-Allow-Credentials",
request.headers.get(b"credentials"))
+def handle_cors_headers_fail_if_preflight(request, response):
+ """Adds CORS headers if necessary. In the case of CORS preflights, generates
+ a failure response. To be used when CORS preflights are not expected.
+
+ Args:
+ request: the wptserve Request that was passed to main
+ response: the wptserve Response that was passed to main
+
+ Returns True if the request is a CORS preflight, in which case the calling
+ function should immediately return.
+ """
+ # Handle CORS preflight requests.
+ if request.method == u"OPTIONS":
+ fail(response, "CORS preflight unexpectedly received.")
+ return True
+
+ # Append CORS headers if needed
+ attach_origin_and_credentials_headers(request, response)
+ return False
+
+def handle_cors_headers_and_preflight(request, response):
+ """Applies CORS logic, either adding CORS headers to response or generating
+ an entire response to preflights.
+
+ Args:
+ request: the wptserve Request that was passed to main
+ response: the wptserve Response that was passed to main
+
+ Returns True if the request is a CORS preflight, in which case the calling
+ function should immediately return.
+ """
+ # Append CORS headers if needed
+ attach_origin_and_credentials_headers(request, response)
+
# Handle CORS preflight requests.
if not request.method == u"OPTIONS":
return False
if not b"Access-Control-Request-Method" in request.headers:
- response.status = (400, b"Bad Request")
- response.headers.set(b"Content-Type", b"text/plain")
- response.content = "Failed to get access-control-request-method in preflight!"
+ fail(response, "Failed to get access-control-request-method in preflight!")
return True
if not b"Access-Control-Request-Headers" in request.headers:
- response.status = (400, b"Bad Request")
- response.headers.set(b"Content-Type", b"text/plain")
- response.content = "Failed to get access-control-request-headers in preflight!"
+ fail(response, "Failed to get access-control-request-headers in preflight!")
return True
response.headers.set(b"Access-Control-Allow-Methods",
diff --git a/tests/wpt/tests/fledge/tentative/resources/permissions.py b/tests/wpt/tests/fledge/tentative/resources/permissions.py
index eed93c42756..f66e28bb27b 100644
--- a/tests/wpt/tests/fledge/tentative/resources/permissions.py
+++ b/tests/wpt/tests/fledge/tentative/resources/permissions.py
@@ -35,7 +35,7 @@ def get_permissions(request, response):
- 天気の良い日 / élève: allow both join and leave
- anything else (including no subdomain): returns a 404
"""
- if fledge_http_server_util.handle_cors_headers_and_preflight(request, response):
+ if fledge_http_server_util.handle_cors_headers_fail_if_preflight(request, response):
return
first_domain_label = re.search(r"[^.]*", request.url_parts.netloc).group(0)
diff --git a/tests/wpt/tests/fledge/tentative/resources/trusted-bidding-signals.py b/tests/wpt/tests/fledge/tentative/resources/trusted-bidding-signals.py
index 5a89e3b6025..e6e7d660525 100644
--- a/tests/wpt/tests/fledge/tentative/resources/trusted-bidding-signals.py
+++ b/tests/wpt/tests/fledge/tentative/resources/trusted-bidding-signals.py
@@ -20,10 +20,12 @@ def main(request, response):
for param in request.url_parts.query.split("&"):
pair = param.split("=", 1)
if len(pair) != 2:
- return fail(response, "Bad query parameter: " + param)
+ fail(response, "Bad query parameter: " + param)
+ return
# Browsers should escape query params consistently.
if "%20" in pair[1]:
- return fail(response, "Query parameter should escape using '+': " + param)
+ fail(response, "Query parameter should escape using '+': " + param)
+ return
# Hostname can't be empty. The empty string can be a key or interest group name, though.
if pair[0] == "hostname" and hostname == None and len(pair[1]) > 0:
@@ -37,20 +39,22 @@ def main(request, response):
continue
if pair[0] == "slotSize" or pair[0] == "allSlotsRequestedSizes":
continue
- return fail(response, "Unexpected query parameter: " + param)
+ fail(response, "Unexpected query parameter: " + param)
+ return
# If trusted signal keys are passed in, and one of them is "cors",
- # add appropriate Access-Control-* headers to normal requests, and handle
- # CORS preflights.
- if keys and "cors" in keys and fledge_http_server_util.handle_cors_headers_and_preflight(
+ # add appropriate Access-Control-* headers to normal requests.
+ if keys and "cors" in keys and fledge_http_server_util.handle_cors_headers_fail_if_preflight(
request, response):
return
# "interestGroupNames" and "hostname" are mandatory.
if not hostname:
- return fail(response, "hostname missing")
+ fail(response, "hostname missing")
+ return
if not interestGroupNames:
- return fail(response, "interestGroupNames missing")
+ fail(response, "interestGroupNames missing")
+ return
response.status = (200, b"OK")
@@ -153,8 +157,3 @@ def main(request, response):
if body != None:
return body
return json.dumps(responseBody)
-
-def fail(response, body):
- response.status = (400, "Bad Request")
- response.headers.set(b"Content-Type", b"text/plain")
- return body
diff --git a/tests/wpt/tests/fledge/tentative/resources/trusted-scoring-signals.py b/tests/wpt/tests/fledge/tentative/resources/trusted-scoring-signals.py
index 934d2e9129d..bfd23b124cb 100644
--- a/tests/wpt/tests/fledge/tentative/resources/trusted-scoring-signals.py
+++ b/tests/wpt/tests/fledge/tentative/resources/trusted-scoring-signals.py
@@ -13,7 +13,8 @@ def main(request, response):
try:
params = fledge_http_server_util.decode_trusted_scoring_signals_params(request)
except ValueError as ve:
- return fail(response, str(ve))
+ fail(response, str(ve))
+ return
response.status = (200, b"OK")
@@ -36,7 +37,8 @@ def main(request, response):
try:
signalsParams = fledge_http_server_util.decode_render_url_signals_params(renderUrl)
except ValueError as ve:
- return fail(response, str(ve))
+ fail(response, str(ve))
+ return
for signalsParam in signalsParams:
if signalsParam == "close-connection":
@@ -92,8 +94,8 @@ def main(request, response):
responseBody[urlList["type"]][renderUrl] = value
# If the signalsParam embedded inside a render URL calls for CORS, add
- # appropriate response headers, and fully handle preflights.
- if cors and fledge_http_server_util.handle_cors_headers_and_preflight(
+ # appropriate response headers.
+ if cors and fledge_http_server_util.handle_cors_headers_fail_if_preflight(
request, response):
return
@@ -107,8 +109,3 @@ def main(request, response):
if body != None:
return body
return json.dumps(responseBody)
-
-def fail(response, body):
- response.status = (400, "Bad Request")
- response.headers.set(b"Content-Type", b"text/plain")
- return body
diff --git a/tests/wpt/tests/html/browsers/history/the-history-interface/history_pushstate_too_many_calls.optional.html b/tests/wpt/tests/html/browsers/history/the-history-interface/history_pushstate_too_many_calls.optional.html
new file mode 100644
index 00000000000..4242ab488ca
--- /dev/null
+++ b/tests/wpt/tests/html/browsers/history/the-history-interface/history_pushstate_too_many_calls.optional.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>history pushState too many calls</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ test(function () {
+ assert_throws_dom("SecurityError", function () {
+ for (let i = 0; i < 500; i++) {
+ window.history.pushState(null, null, i);
+ }
+ });
+ });
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/tests/html/browsers/history/the-history-interface/history_replacestate_too_many_calls.optional.html b/tests/wpt/tests/html/browsers/history/the-history-interface/history_replacestate_too_many_calls.optional.html
new file mode 100644
index 00000000000..d412983270c
--- /dev/null
+++ b/tests/wpt/tests/html/browsers/history/the-history-interface/history_replacestate_too_many_calls.optional.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>history replaceState too many calls</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ test(function () {
+ assert_throws_dom("SecurityError", function () {
+ for (let i = 0; i < 500; i++) {
+ window.history.replaceState(null, null, i);
+ }
+ });
+ });
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/tests/html/document-isolation-policy/credentialless-cache-storage-from-credentialless.https.tentative.window.js b/tests/wpt/tests/html/document-isolation-policy/credentialless-cache-storage-from-credentialless.https.tentative.window.js
new file mode 100644
index 00000000000..cae480526b8
--- /dev/null
+++ b/tests/wpt/tests/html/document-isolation-policy/credentialless-cache-storage-from-credentialless.https.tentative.window.js
@@ -0,0 +1,90 @@
+// META: timeout=long
+// META: variant=?document
+// META: variant=?dedicated_worker
+// META: variant=?shared_worker
+// META: variant=?service_worker
+// META: script=/common/get-host-info.sub.js
+// META: script=/common/utils.js
+// META: script=/common/dispatcher/dispatcher.js
+// META: script=/service-workers/service-worker/resources/test-helpers.sub.js
+// META: script=./resources/common.js
+
+// Fetch a resource and store it into CacheStorage from |storer| context. Then
+// check if it can be retrieved via CacheStorage.match from |retriever| context.
+const cacheStorageTest = (
+ description,
+ dip_storer,
+ dip_retriever,
+ resource_headers,
+ request_credential_mode,
+ expectation
+) => {
+ promise_test(async test => {
+ const cross_origin = get_host_info().HTTPS_REMOTE_ORIGIN;
+ const resource_url = cross_origin + "/common/square.png?pipe=" + resource_headers;
+
+ // Create the storer and retriever contexts.
+ const storage_token = await getTokenFromEnvironment(test, environment, dip_storer);
+ const storage_context = new RemoteContext(storage_token);
+ const retriever_token = await getTokenFromEnvironment(test, environment, dip_retriever);
+ const retriever_context = new RemoteContext(retriever_token);
+
+ // Fetch a request from the storer. Store the opaque response into
+ // CacheStorage.
+ const stored = await storage_context.execute_script(
+ async (url, credential_mode) => {
+ const cache = await caches.open('v1');
+ const fetch_request = new Request(url, {
+ mode: 'no-cors',
+ credentials: credential_mode
+ });
+ const fetch_response = await fetch(fetch_request);
+ await cache.put(fetch_request, fetch_response);
+ return true;
+ }, [resource_url, request_credential_mode]);
+ assert_equals(stored, true);
+
+ // Retrieved it from |retriever|.
+ const was_retrieved = await retriever_context.execute_script(
+ async (url) => {
+ const cache = await caches.open('v1');
+ try {
+ const response = await cache.match(url);
+ return "retrieved";
+ } catch (error) {
+ return "error";
+ }
+ }, [resource_url]);
+ assert_equals(was_retrieved, expectation);
+ }, description);
+};
+
+// Execute the same set of tests for every type of execution contexts:
+// Documents, DedicatedWorkers, SharedWorkers, and ServiceWorkers. The results
+// should be independent of the context.
+const environment = location.search.substr(1);
+
+cacheStorageTest(`[${environment}] isolate-and-credentialless => none`,
+ dip_credentialless,
+ dip_none,
+ "",
+ "include",
+ "retrieved");
+cacheStorageTest(`[${environment}] isolate-and-credentialless => isolate-and-credentialless`,
+ dip_credentialless,
+ dip_credentialless,
+ "",
+ "include",
+ "retrieved");
+cacheStorageTest(`[${environment}] isolate-and-credentialless => isolate-and-require-corp`,
+ dip_credentialless,
+ dip_require_corp,
+ "",
+ "include",
+ "error");
+cacheStorageTest(`[${environment}] isolate-and-credentialless => isolate-and-require-corp + CORP`,
+ dip_credentialless,
+ dip_require_corp,
+ corp_cross_origin,
+ "include",
+ "retrieved");
diff --git a/tests/wpt/tests/html/document-isolation-policy/credentialless-cache-storage-from-none.https.tentative.window.js b/tests/wpt/tests/html/document-isolation-policy/credentialless-cache-storage-from-none.https.tentative.window.js
new file mode 100644
index 00000000000..e2478abeed2
--- /dev/null
+++ b/tests/wpt/tests/html/document-isolation-policy/credentialless-cache-storage-from-none.https.tentative.window.js
@@ -0,0 +1,108 @@
+// META: timeout=long
+// META: variant=?document
+// META: variant=?dedicated_worker
+// META: variant=?shared_worker
+// META: variant=?service_worker
+// META: script=/common/get-host-info.sub.js
+// META: script=/common/utils.js
+// META: script=/common/dispatcher/dispatcher.js
+// META: script=/service-workers/service-worker/resources/test-helpers.sub.js
+// META: script=./resources/common.js
+
+// Fetch a resource and store it into CacheStorage from |storer| context. Then
+// check if it can be retrieved via CacheStorage.match from |retriever| context.
+const cacheStorageTest = (
+ description,
+ dip_storer,
+ dip_retriever,
+ resource_headers,
+ request_credential_mode,
+ expectation
+) => {
+ promise_test(async test => {
+ const cross_origin = get_host_info().HTTPS_REMOTE_ORIGIN;
+ const resource_url = cross_origin + "/common/square.png?pipe=" + resource_headers;
+
+ // Create the storer and retriever contexts.
+ const storage_token = await getTokenFromEnvironment(test, environment, dip_storer);
+ const storage_context = new RemoteContext(storage_token);
+ const retriever_token = await getTokenFromEnvironment(test, environment, dip_retriever);
+ const retriever_context = new RemoteContext(retriever_token);
+
+ // Fetch a request from the storer. Store the opaque response into
+ // CacheStorage.
+ const stored = await storage_context.execute_script(
+ async (url, credential_mode) => {
+ const cache = await caches.open('v1');
+ const fetch_request = new Request(url, {
+ mode: 'no-cors',
+ credentials: credential_mode
+ });
+ const fetch_response = await fetch(fetch_request);
+ await cache.put(fetch_request, fetch_response);
+ return true;
+ }, [resource_url, request_credential_mode]);
+ assert_equals(stored, true);
+
+ // Retrieved it from |retriever|.
+ const was_retrieved = await retriever_context.execute_script(
+ async (url) => {
+ const cache = await caches.open('v1');
+ try {
+ const response = await cache.match(url);
+ return "retrieved";
+ } catch (error) {
+ return "error";
+ }
+ }, [resource_url]);
+ assert_equals(was_retrieved, expectation);
+ }, description);
+};
+
+// Execute the same set of tests for every type of execution contexts:
+// Documents, DedicatedWorkers, SharedWorkers, and ServiceWorkers. The results
+// should be independent of the context.
+const environment = location.search.substr(1);
+
+cacheStorageTest(`[${environment}] none => none`,
+ dip_none,
+ dip_none,
+ "",
+ "include",
+ "retrieved");
+cacheStorageTest(`[${environment}] none => isolate-and-credentialless`,
+ dip_none,
+ dip_credentialless,
+ "",
+ "include",
+ "error");
+cacheStorageTest(`[${environment}] none => isolate-and-credentialless (omit)`,
+ dip_none,
+ dip_credentialless,
+ "",
+ "omit",
+ "retrieved");
+cacheStorageTest(`[${environment}] none => isolate-and-credentialless + CORP`,
+ dip_none,
+ dip_credentialless,
+ corp_cross_origin,
+ "include",
+ "retrieved");
+cacheStorageTest(`[${environment}] none => isolate-and-require-corp`,
+ dip_none,
+ dip_require_corp,
+ "",
+ "include",
+ "error");
+cacheStorageTest(`[${environment}] none => isolate-and-require-corp (omit)`,
+ dip_none,
+ dip_require_corp,
+ "",
+ "include",
+ "error");
+cacheStorageTest(`[${environment}] none => isolate-and-require-corp + CORP`,
+ dip_none,
+ dip_require_corp,
+ corp_cross_origin,
+ "include",
+ "retrieved");
diff --git a/tests/wpt/tests/html/document-isolation-policy/credentialless-cache-storage-from-require-corp.https.tentative.window.js b/tests/wpt/tests/html/document-isolation-policy/credentialless-cache-storage-from-require-corp.https.tentative.window.js
new file mode 100644
index 00000000000..720fa6a987a
--- /dev/null
+++ b/tests/wpt/tests/html/document-isolation-policy/credentialless-cache-storage-from-require-corp.https.tentative.window.js
@@ -0,0 +1,84 @@
+// META: timeout=long
+// META: variant=?document
+// META: variant=?dedicated_worker
+// META: variant=?shared_worker
+// META: variant=?service_worker
+// META: script=/common/get-host-info.sub.js
+// META: script=/common/utils.js
+// META: script=/common/dispatcher/dispatcher.js
+// META: script=/service-workers/service-worker/resources/test-helpers.sub.js
+// META: script=./resources/common.js
+
+// Fetch a resource and store it into CacheStorage from |storer| context. Then
+// check if it can be retrieved via CacheStorage.match from |retriever| context.
+const cacheStorageTest = (
+ description,
+ dip_storer,
+ dip_retriever,
+ resource_headers,
+ request_credential_mode,
+ expectation
+) => {
+ promise_test(async test => {
+ const cross_origin = get_host_info().HTTPS_REMOTE_ORIGIN;
+ const resource_url = cross_origin + "/common/square.png?pipe=" + resource_headers;
+
+ // Create the storer and retriever contexts.
+ const storage_token = await getTokenFromEnvironment(test, environment, dip_storer);
+ const storage_context = new RemoteContext(storage_token);
+ const retriever_token = await getTokenFromEnvironment(test, environment, dip_retriever);
+ const retriever_context = new RemoteContext(retriever_token);
+
+ // Fetch a request from the storer. Store the opaque response into
+ // CacheStorage.
+ const stored = await storage_context.execute_script(
+ async (url, credential_mode) => {
+ const cache = await caches.open('v1');
+ const fetch_request = new Request(url, {
+ mode: 'no-cors',
+ credentials: credential_mode
+ });
+ const fetch_response = await fetch(fetch_request);
+ await cache.put(fetch_request, fetch_response);
+ return true;
+ }, [resource_url, request_credential_mode]);
+ assert_equals(stored, true);
+
+ // Retrieved it from |retriever|.
+ const was_retrieved = await retriever_context.execute_script(
+ async (url) => {
+ const cache = await caches.open('v1');
+ try {
+ const response = await cache.match(url);
+ return "retrieved";
+ } catch (error) {
+ return "error";
+ }
+ }, [resource_url]);
+ assert_equals(was_retrieved, expectation);
+ }, description);
+};
+
+// Execute the same set of tests for every type of execution contexts:
+// Documents, DedicatedWorkers, SharedWorkers, and ServiceWorkers. The results
+// should be independent of the context.
+const environment = location.search.substr(1);
+
+cacheStorageTest(`[${environment}] isolate-and-require-corp => none`,
+ dip_require_corp,
+ dip_none,
+ corp_cross_origin,
+ "include",
+ "retrieved");
+cacheStorageTest(`[${environment}] isolate-and-require-corp => isolate-and-credentialless`,
+ dip_require_corp,
+ dip_credentialless,
+ corp_cross_origin,
+ "include",
+ "retrieved");
+cacheStorageTest(`[${environment}] isolate-and-require-corp => isolate-and-require-corp`,
+ dip_require_corp,
+ dip_require_corp,
+ corp_cross_origin,
+ "include",
+ "retrieved");
diff --git a/tests/wpt/tests/html/document-isolation-policy/credentialless-cache-storage.https.tentative.window.js b/tests/wpt/tests/html/document-isolation-policy/credentialless-cache-storage.https.tentative.window.js
deleted file mode 100644
index cb4b174e945..00000000000
--- a/tests/wpt/tests/html/document-isolation-policy/credentialless-cache-storage.https.tentative.window.js
+++ /dev/null
@@ -1,150 +0,0 @@
-// META: timeout=long
-// META: variant=?document
-// META: variant=?dedicated_worker
-// META: variant=?shared_worker
-// META: variant=?service_worker
-// META: script=/common/get-host-info.sub.js
-// META: script=/common/utils.js
-// META: script=/common/dispatcher/dispatcher.js
-// META: script=./resources/common.js
-
-// Fetch a resource and store it into CacheStorage from |storer| context. Then
-// check if it can be retrieved via CacheStorage.match from |retriever| context.
-const cacheStorageTest = (
- description,
- storer,
- retriever,
- resource_headers,
- request_credential_mode,
- expectation
-) => {
- promise_test_parallel(async test => {
- const cross_origin = get_host_info().HTTPS_REMOTE_ORIGIN;
- const url = cross_origin + "/common/square.png?pipe=" + resource_headers +
- `&${token()}`;
- const this_token = token();
-
- // Fetch a request from |stored|. Store the opaque response into
- // CacheStorage.
- send(storer, `
- const cache = await caches.open("v1");
- const fetch_request = new Request("${url}", {
- mode: 'no-cors',
- credentials: '${request_credential_mode}'
- });
- const fetch_response = await fetch(fetch_request);
- await cache.put(fetch_request, fetch_response);
- send("${this_token}", "stored");
- `);
- assert_equals(await receive(this_token), "stored");
-
- // Retrieved it from |retriever|.
- send(retriever, `
- const cache = await caches.open("v1");
- try {
- const response = await cache.match("${url}");
- send("${this_token}", "retrieved");
- } catch (error) {
- send("${this_token}", "error");
- }
- `);
- assert_equals(await receive(this_token), expectation);
- }, description);
-};
-
-// Execute the same set of tests for every type of execution contexts:
-// Documents, DedicatedWorkers, SharedWorkers, and ServiceWorkers. The results
-// should be independent of the context.
-const environment = location.search.substr(1);
-const constructor = environments[environment];
-
-const context_none = constructor(coep_none)[0];
-const context_credentialless = constructor(dip_credentialless)[0];
-const context_require_corp = constructor(dip_require_corp)[0];
-
-cacheStorageTest(`[${environment}] none => none`,
- context_none,
- context_none,
- "",
- "include",
- "retrieved");
-cacheStorageTest(`[${environment}] none => isolate-and-credentialless`,
- context_none,
- context_credentialless,
- "",
- "include",
- "error");
-cacheStorageTest(`[${environment}] none => isolate-and-credentialless (omit)`,
- context_none,
- context_credentialless,
- "",
- "omit",
- "retrieved");
-cacheStorageTest(`[${environment}] none => isolate-and-credentialless + CORP`,
- context_none,
- context_credentialless,
- corp_cross_origin,
- "include",
- "retrieved");
-cacheStorageTest(`[${environment}] none => isolate-and-require-corp`,
- context_none,
- context_require_corp,
- "",
- "include",
- "error");
-cacheStorageTest(`[${environment}] none => isolate-and-require-corp (omit)`,
- context_none,
- context_require_corp,
- "",
- "include",
- "error");
-cacheStorageTest(`[${environment}] none => isolate-and-require-corp + CORP`,
- context_none,
- context_require_corp,
- corp_cross_origin,
- "include",
- "retrieved");
-
-cacheStorageTest(`[${environment}] isolate-and-credentialless => none`,
- context_credentialless,
- context_none,
- "",
- "include",
- "retrieved");
-cacheStorageTest(`[${environment}] isolate-and-credentialless => isolate-and-credentialless`,
- context_credentialless,
- context_credentialless,
- "",
- "include",
- "retrieved");
-cacheStorageTest(`[${environment}] isolate-and-credentialless => isolate-and-require-corp`,
- context_credentialless,
- context_require_corp,
- "",
- "include",
- "error");
-cacheStorageTest(`[${environment}] isolate-and-credentialless => isolate-and-require-corp + CORP`,
- context_credentialless,
- context_require_corp,
- corp_cross_origin,
- "include",
- "retrieved");
-
-cacheStorageTest(`[${environment}] isolate-and-require-corp => none`,
- context_require_corp,
- context_none,
- corp_cross_origin,
- "include",
- "retrieved");
-cacheStorageTest(`[${environment}] isolate-and-require-corp => isolate-and-credentialless`,
- context_require_corp,
- context_credentialless,
- corp_cross_origin,
- "include",
- "retrieved");
-cacheStorageTest(`[${environment}] isolate-and-require-corp => isolate-and-require-corp`,
- context_require_corp,
- context_require_corp,
- corp_cross_origin,
- "include",
- "retrieved");
diff --git a/tests/wpt/tests/html/document-isolation-policy/credentialless-dedicated-worker.https.tentative.window.js b/tests/wpt/tests/html/document-isolation-policy/credentialless-dedicated-worker.https.tentative.window.js
index 748130dfdc2..539ed0a6955 100644
--- a/tests/wpt/tests/html/document-isolation-policy/credentialless-dedicated-worker.https.tentative.window.js
+++ b/tests/wpt/tests/html/document-isolation-policy/credentialless-dedicated-worker.https.tentative.window.js
@@ -2,6 +2,7 @@
// META: script=/common/get-host-info.sub.js
// META: script=/common/utils.js
// META: script=/common/dispatcher/dispatcher.js
+// META: script=/service-workers/service-worker/resources/test-helpers.sub.js
// META: script=./resources/common.js
const same_origin = get_host_info().HTTPS_ORIGIN;
@@ -19,112 +20,63 @@ promise_test(async test => {
cookie_same_site_none),
]);
- // One window with DIP:none. (control)
- const w_control_token = token();
- const w_control_url = same_origin + executor_path +
- coep_none + `&uuid=${w_control_token}`
- const w_control = window.open(w_control_url);
- add_completion_callback(() => w_control.close());
-
- // One window with DIP:isolate-and-credentialless. (experiment)
- const w_credentialless_token = token();
- const w_credentialless_url = same_origin + executor_path +
- dip_credentialless + `&uuid=${w_credentialless_token}`;
- const w_credentialless = window.open(w_credentialless_url);
- add_completion_callback(() => w_credentialless.close());
-
let GetCookie = (response) => {
const headers_credentialless = JSON.parse(response);
return parseCookies(headers_credentialless)[cookie_key];
}
+ async function fetchInRemoteContext(ctx, request_url) {
+ // The fail might fail in when a DedicatedWorker with DIP
+ // isolate-and-require-corp tries to fetch a cross-origin resource. Silently
+ // catch the error as we're only interested in whether the cookies were sent
+ // with the fetch in the first place.
+ try {
+ await ctx.execute_script(
+ async (url) => {
+ await fetch(url, {mode: 'no-cors', credentials: 'include'});
+ }, [request_url]);
+ } catch(error) {}
+ }
+
const dedicatedWorkerTest = function(
- description, origin, coep_for_worker,
- expected_cookies_control,
- expected_cookies_credentialless) {
+ description, origin, dip_for_worker,
+ expected_cookies) {
promise_test_parallel(async t => {
- // Create workers for both window.
- const worker_token_1 = token();
- const worker_token_2 = token();
-
- // Used to check for errors creating the DedicatedWorker.
- const worker_error = token();
-
- const w_worker_src_1 = same_origin + executor_worker_path +
- coep_for_worker + `&uuid=${worker_token_1}`;
- send(w_control_token, `
- const worker = new Worker("${w_worker_src_1}", {});
- `);
-
- const w_worker_src_2 = same_origin + executor_worker_path +
- coep_for_worker + `&uuid=${worker_token_2}`;
- send(w_credentialless_token, `
- const worker = new Worker("${w_worker_src_2}", {});
- worker.onerror = () => {
- send("${worker_error}", "Worker blocked");
- }
- `);
-
- // Fetch resources with the workers.
- const request_token_1 = token();
- const request_token_2 = token();
- const request_url_1 = showRequestHeaders(origin, request_token_1);
- const request_url_2 = showRequestHeaders(origin, request_token_2);
-
- send(worker_token_1, `
- fetch("${request_url_1}", {mode: 'no-cors', credentials: 'include'})
- `);
- send(worker_token_2, `
- fetch("${request_url_2}", {mode: 'no-cors', credentials: 'include'});
- `);
-
- const response_control = await receive(request_token_1).then(GetCookie);
- assert_equals(response_control,
- expected_cookies_control,
- "coep:none => ");
-
- const response_credentialless = await Promise.race([
- receive(worker_error),
- receive(request_token_2).then(GetCookie)
- ]);
- assert_equals(response_credentialless,
- expected_cookies_credentialless,
- "coep:credentialless => ");
+ // Create one iframe with the specified DIP isolate-and-credentialless.
+ // Then start a DedicatedWorker. The DedicatedWorker will inherit the DIP
+ // of its creator.
+ const worker = await createDedicatedWorkerContext(test, same_origin, dip_for_worker);
+ const worker_context = new RemoteContext(worker[0]);
+
+ // Fetch resources with the worker.
+ const request_token = token();
+ const request_url = showRequestHeaders(origin, request_token);
+
+ await fetchInRemoteContext(worker_context, request_url);
+ const response_worker = await receive(request_token).then(GetCookie);
+ assert_equals(response_worker,
+ expected_cookies,
+ "dip => ");
}, `fetch ${description}`)
};
dedicatedWorkerTest("same-origin + credentialless worker",
same_origin, dip_credentialless,
- cookie_same_origin,
cookie_same_origin);
dedicatedWorkerTest("same-origin + require_corp worker",
same_origin, dip_require_corp,
- cookie_same_origin,
cookie_same_origin);
- dedicatedWorkerTest("same-origin",
- same_origin, dip_none,
- cookie_same_origin,
- "Worker blocked");
-
- dedicatedWorkerTest("cross-origin",
- cross_origin, dip_none,
- cookie_cross_origin,
- "Worker blocked" // Owner's policy is credentialless, so we can't
- // create a worker with coep_none.
- );
-
dedicatedWorkerTest("cross-origin + credentialless worker",
cross_origin, dip_credentialless,
- undefined, // Worker created successfully with credentialless, and fetch doesn't get credentials
undefined // Worker created successfully with credentialless, and fetch doesn't get credentials
);
dedicatedWorkerTest("cross-origin + require_corp worker",
cross_origin, dip_require_corp,
- cookie_cross_origin,
- cookie_cross_origin // The worker's policy is require_corp and doing a
- // fetch within it has nothing to do with the Owner's policy.
+ cookie_cross_origin // The worker's policy is require_corp, so the resource will be requested with cookies
+ // but the load will fail because the response does not
+ // have CORP cross-origin.
);
})
diff --git a/tests/wpt/tests/html/document-isolation-policy/reporting-cache-storage-corp.tentative.https.html b/tests/wpt/tests/html/document-isolation-policy/reporting-cache-storage-corp.tentative.https.html
index 934c87b2abc..0b7c12ac514 100644
--- a/tests/wpt/tests/html/document-isolation-policy/reporting-cache-storage-corp.tentative.https.html
+++ b/tests/wpt/tests/html/document-isolation-policy/reporting-cache-storage-corp.tentative.https.html
@@ -8,22 +8,12 @@
<script src="/common/utils.js"></script>
<script src="/common/get-host-info.sub.js"></script>
<script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script>
+<script src="./resources/common.js"></script>
<script>
const {ORIGIN, REMOTE_ORIGIN} = get_host_info();
-const REMOTE_EXECUTOR =
- `${ORIGIN}/common/dispatcher/remote-executor.html?pipe=`;
-const REMOTE_EXECUTOR_WORKER =
- `${ORIGIN}/common/dispatcher/remote-executor-worker.js?pipe=`;
-
const header = (name, value) => `|header(${name},${value})`;
-
-const FRAME_URL = REMOTE_EXECUTOR +
- header("document-isolation-policy", "isolate-and-require-corp") +
- header("document-isolation-policy-report-only", "isolate-and-require-corp");
-
-const WORKER_URL = REMOTE_EXECUTOR_WORKER +
- header("document-isolation-policy", "isolate-and-require-corp") +
+const dip_reporting_header = header("document-isolation-policy", "isolate-and-require-corp") +
header("document-isolation-policy-report-only", "isolate-and-require-corp");
async function putInCache(resourceUrl) {
@@ -89,56 +79,26 @@ async function runRemoteContextTest(uuid, expected_count, check, context_url, re
async function runIFrameTest(t, check, resource_url, expected_count) {
// Load an iframe with DocumentIsolationPolicy reporting.
- const uuid = token();
- const frame_url = FRAME_URL + '&uuid=' + uuid;
- const frame = await with_iframe(frame_url);
- t.add_cleanup(() => frame.remove());
-
- await runRemoteContextTest(uuid, expected_count, check, frame_url, resource_url);
+ const context = await createIframeContext(t, `${ORIGIN}`, dip_reporting_header);
+ await runRemoteContextTest(context[0], expected_count, check, context[1], resource_url);
}
async function runDedicatedWorkerTest(t, check, resource_url, expected_count) {
- // Create a worker with DocumentIsolationPolicy reporting.
- const uuid = token();
- const worker_url = WORKER_URL + '&uuid=' + uuid;
- const worker = new Worker(worker_url);
- worker.addEventListener('error', t.unreached_func('Worker.onerror'));
- t.add_cleanup(() => worker.terminate());
-
- await runRemoteContextTest(uuid, expected_count, check, worker_url, resource_url);
+ // Create a worker which will inherit DocumentIsolationPolicy reporting from its creator.
+ const context = await createDedicatedWorkerContext(t, `${ORIGIN}`, dip_reporting_header);
+ await runRemoteContextTest(context[0], expected_count, check, context[1], resource_url);
}
async function runSharedWorkerTest(t, check, resource_url, expected_count) {
// Create a shared worker with DocumentIsolationPolicy reporting.
- const uuid = token();
- const worker_url = WORKER_URL +
- '&uuid=' + uuid;
- const worker = new SharedWorker(worker_url);
- worker.addEventListener('error', t.unreached_func('Worker.onerror'));
-
- await runRemoteContextTest(uuid, expected_count, check, worker_url, resource_url);
+ const context = await createSharedWorkerContext(t, `${ORIGIN}`, dip_reporting_header);
+ await runRemoteContextTest(context[0], expected_count, check, context[1], resource_url);
}
async function runIFrameWithServiceWorkerTest(t, check, resource_url, expected_count) {
- // Here we use a Service Worker without DIP.
- const SERVICE_WORKER_URL = `${ORIGIN}/common/dispatcher/executor-service-worker.js`;
- const reg = await service_worker_unregister_and_register(
- t, SERVICE_WORKER_URL, FRAME_URL);
- const worker = reg.installing || reg.waiting || reg.active;
- worker.addEventListener('error', t.unreached_func('Worker.onerror'));
-
- // Load an iframe with DocumentIsolationPolicy reporting.
- const uuid = token();
- const frame_url = FRAME_URL +
- '&uuid=' + uuid;
- const frame = await with_iframe(frame_url);
-
- t.add_cleanup(() => {
- reg.unregister();
- frame.remove();
- });
-
- await runRemoteContextTest(uuid, expected_count, check, frame_url, resource_url);
+ // Create an iframe with DocumentIsolationPolicy reporting and a ServiceWorker.
+ const context = await createIframeWithSWContext(t, `${ORIGIN}`, dip_reporting_header);
+ await runRemoteContextTest(context[0], expected_count, check, context[1], resource_url);
}
// We want to test several URLs in various environments (document,
diff --git a/tests/wpt/tests/html/document-isolation-policy/reporting-subresource-corp.tentative.https.html b/tests/wpt/tests/html/document-isolation-policy/reporting-subresource-corp.tentative.https.html
index 6be3c35ad7a..013eb34d106 100644
--- a/tests/wpt/tests/html/document-isolation-policy/reporting-subresource-corp.tentative.https.html
+++ b/tests/wpt/tests/html/document-isolation-policy/reporting-subresource-corp.tentative.https.html
@@ -4,44 +4,17 @@
<body>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+<script src="/common/dispatcher/dispatcher.js"></script>
<script src="/common/utils.js"></script>
<script src="/common/get-host-info.sub.js"></script>
<script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script>
+<script src="./resources/common.js"></script>
<script>
const {ORIGIN, REMOTE_ORIGIN} = get_host_info();
-const BASE = new URL("resources", location).pathname
-const FRAME_URL = `${ORIGIN}/common/blank.html` +
- '?pipe=header(document-isolation-policy,isolate-and-require-corp)' +
- `|header(document-isolation-policy-report-only,isolate-and-require-corp)`;
-const WORKER_URL = `${ORIGIN}${BASE}/reporting-worker.js` +
- '?pipe=header(document-isolation-policy,isolate-and-require-corp)' +
- `|header(document-isolation-policy-report-only,isolate-and-require-corp)`;
-const REPORTING_FRAME_URL = `${ORIGIN}${BASE}/reporting-empty-frame.html` +
- '?pipe=header(document-isolation-policy,isolate-and-require-corp)' +
- `|header(document-isolation-policy-report-only,isolate-and-require-corp)`;
-
-async function observeReports(global, expected_count) {
- const reports = [];
- const receivedEveryReports = new Promise(resolve => {
- if (expected_count == 0)
- resolve();
-
- const observer = new global.ReportingObserver((rs) => {
- for (const r of rs) {
- reports.push(r.toJSON());
- }
- if (expected_count <= reports.length)
- resolve();
- });
- observer.observe();
-
- });
-
- await receivedEveryReports;
- // Wait 500ms more to catch additionnal unexpected reports.
- await new Promise(r => step_timeout(r, 500));
- return reports;
-}
+
+const header = (name, value) => `|header(${name},${value})`;
+const dip_reporting_header = header("document-isolation-policy", "isolate-and-require-corp") +
+ header("document-isolation-policy-report-only", "isolate-and-require-corp");
function checkReport(report, contextUrl, blockedUrl, disposition, destination) {
assert_equals(report.type, 'dip');
@@ -52,42 +25,68 @@ function checkReport(report, contextUrl, blockedUrl, disposition, destination) {
assert_equals(report.body.destination, destination);
}
-async function fetchInFrame(t, frameUrl, url, expected_count) {
- const frame = await with_iframe(frameUrl);
- t.add_cleanup(() => frame.remove());
-
- const init = { mode: 'no-cors', cache: 'no-store' };
- let future_reports = observeReports(frame.contentWindow, expected_count);
- await frame.contentWindow.fetch(url, init).catch(() => {});
-
- return await future_reports;
+function validateReports(reports, expected_count, check, context_url, resource_url) {
+ assert_equals(reports.length, expected_count);
+ check(reports, context_url, resource_url);
}
-async function fetchInWorker(workerOrPort, url, expected_count) {
- const reports = [];
- const script =
- `fetch('${url}', {mode: 'no-cors', cache: 'no-store'}).catch(() => {});`;
- const mc = new MessageChannel();
-
- const receivedEveryReports = new Promise(resolve => {
- if (expected_count == 0)
- resolve();
+async function runRemoteContextTest(uuid, expected_count, check, context_url, resource_url) {
+ // Have the remote context load the resource and wait for the expected number
+ // of reports.
+ const ctx = new RemoteContext(uuid);
+ const reports = await ctx.execute_script(
+ async (url, count) => {
+ const reports_received = [];
+
+ // Register an observer that will wait for reports.
+ const receivedEveryReports = new Promise(resolve => {
+ if (count == 0)
+ resolve();
+
+ const observer = new ReportingObserver((rs) => {
+ for (const r of rs) {
+ reports_received.push(r.toJSON());
+ }
+ if (count <= reports_received.length)
+ resolve();
+ });
+ observer.observe();
+
+ });
+
+ // Try to fetch the resource. This might be blocked by DocumentIsolationPolicy.
+ try {
+ const response = await fetch(url, {mode: 'no-cors', cache: 'no-store'});
+ } catch(error) {}
+
+ await receivedEveryReports;
+ return reports_received;
+ }, [resource_url, expected_count]);
+ validateReports(reports, expected_count, check, context_url, resource_url);
+}
- mc.port1.onmessage = (event) => {
- reports.push(event.data);
- if (expected_count <= reports.length)
- resolve();
- };
- });
+async function runIFrameTest(t, check, resource_url, expected_count) {
+ // Load an iframe with DocumentIsolationPolicy reporting.
+ const context = await createIframeContext(t, `${ORIGIN}`, dip_reporting_header);
+ await runRemoteContextTest(context[0], expected_count, check, context[1], resource_url);
+}
- // Have the worker execute the script.
- workerOrPort.postMessage({script, port: mc.port2}, [mc.port2]);
+async function runDedicatedWorkerTest(t, check, resource_url, expected_count) {
+ // Create a worker which will inherit DocumentIsolationPolicy reporting from its creator.
+ const context = await createDedicatedWorkerContext(t, `${ORIGIN}`, dip_reporting_header);
+ await runRemoteContextTest(context[0], expected_count, check, context[1], resource_url);
+}
- await receivedEveryReports;
- // Wait 500ms more to catch additionnal unexpected reports.
- await new Promise(r => step_timeout(r, 500));
+async function runSharedWorkerTest(t, check, resource_url, expected_count) {
+ // Create a shared worker with DocumentIsolationPolicy reporting.
+ const context = await createSharedWorkerContext(t, `${ORIGIN}`, dip_reporting_header);
+ await runRemoteContextTest(context[0], expected_count, check, context[1], resource_url);
+}
- return reports;
+async function runIFrameWithServiceWorkerTest(t, check, resource_url, expected_count) {
+ // Create an iframe with DocumentIsolationPolicy reporting and a ServiceWorker.
+ const context = await createIframeWithSWContext(t, `${ORIGIN}`, dip_reporting_header);
+ await runRemoteContextTest(context[0], expected_count, check, context[1], resource_url);
}
// We want to test several URLs in various environments (document,
@@ -97,7 +96,6 @@ async function fetchInWorker(workerOrPort, url, expected_count) {
//
// ENVIRONMENTS is a list of dictionaries. Each dictionary consists of:
// - tag: the name of the environment
-// - contextUrl: the URL of the environment settings object
// - run: an async function which generates reports
// - test: a testharness Test object
// - url: the URL for a test case (see below)
@@ -111,102 +109,48 @@ async function fetchInWorker(workerOrPort, url, expected_count) {
// - contextUrl: the URL of the environment settings object (see
// ENVORONMENTS)
-const ENVIRONMENTS = [{
- tag: 'document',
- contextUrl: FRAME_URL,
- run: async (test, url, expected_count) => {
- return await fetchInFrame(test, FRAME_URL, url, expected_count);
- },
-}, {
- tag: 'dedicated worker',
- contextUrl: WORKER_URL,
- run: async (test, url, expected_count) => {
- const worker = new Worker(WORKER_URL);
- worker.addEventListener('error', test.unreached_func('Worker.onerror'));
- test.add_cleanup(() => worker.terminate());
- return await fetchInWorker(worker, url, expected_count);
- },
-}, {
- tag: 'shared worker',
- contextUrl: WORKER_URL,
- run: async (test, url, expected_count) => {
- const worker = new SharedWorker(WORKER_URL);
- worker.addEventListener('error', test.unreached_func('Worker.onerror'));
- return await fetchInWorker(worker.port, url, expected_count);
+const ENVIRONMENTS = {
+ "document": runIFrameTest,
+ "dedicated worker": runDedicatedWorkerTest,
+ "shared worker": runSharedWorkerTest,
+ "document with service worker": runIFrameWithServiceWorkerTest,
+};
+
+const CASES = [
+ {
+ name: 'same-origin',
+ url: '/common/square.png',
+ expected_count: 0,
+ check: (reports, url, contextUrl) => {}
},
-}, {
- tag: 'between service worker and page',
- contextUrl: REPORTING_FRAME_URL,
- run: async (test, url, expected_count) => {
- // Here we use a Service Worker without COEP.
- const WORKER_URL = `${ORIGIN}${BASE}/sw.js`;
- const reg = await service_worker_unregister_and_register(
- test, WORKER_URL, REPORTING_FRAME_URL);
- test.add_cleanup(() => reg.unregister());
- const worker = reg.installing || reg.waiting || reg.active;
- worker.addEventListener('error', test.unreached_func('Worker.onerror'));
- return await fetchInFrame(
- test, REPORTING_FRAME_URL, url, expected_count);
+ {
+ name: 'blocked due to DIP',
+ url: `${REMOTE_ORIGIN}/common/square.png`,
+ expected_count: 2,
+ check: (reports, contextUrl, url) => {
+ checkReport(reports[0], contextUrl, url, 'reporting', '');
+ checkReport(reports[1], contextUrl, url, 'enforce', '');
+ }
},
-}];
-
-const CASES = [{
- name: 'same-origin',
- url: '/common/text-plain.txt',
- expected_count: 0,
- check: (reports, url, contextUrl) => {}
-}, {
- name: 'blocked by CORP: same-origin',
- url: `${REMOTE_ORIGIN}/common/blank.html?pipe=` +
-`header(cross-origin-resource-policy, same-origin)`,
- expected_count: 0,
- check: (reports, url, contextUrl) => {}
-}, {
- name: 'blocked due to DIP',
- url: `${REMOTE_ORIGIN}/common/text-plain.txt`,
- expected_count: 2,
- check: (reports, contextUrl, url) => {
- checkReport(reports[0], contextUrl, url, 'reporting', '');
- checkReport(reports[1], contextUrl, url, 'enforce', '');
+ {
+ name: 'blocked during redirect',
+ url: `${ORIGIN}/common/redirect.py?location=` +
+ encodeURIComponent(`${REMOTE_ORIGIN}/common/square.png`),
+ expected_count: 2,
+ check: (reports, contextUrl, url) => {
+ checkReport(reports[0], contextUrl, url, 'reporting', '');
+ checkReport(reports[1], contextUrl, url, 'enforce', '');
+ },
}
-}, {
- name: 'blocked during redirect',
- url: `${ORIGIN}/common/redirect.py?location=` +
- encodeURIComponent(`${REMOTE_ORIGIN}/common/text-plain.txt`),
- expected_count: 2,
- check: (reports, contextUrl, url) => {
- checkReport(reports[0], contextUrl, url, 'reporting', '');
- checkReport(reports[1], contextUrl, url, 'enforce', '');
- },
-}];
+];
-for (const env of ENVIRONMENTS) {
+for (const [tag, run] of Object.entries(ENVIRONMENTS)) {
for (const testcase of CASES) {
promise_test(async (t) => {
- const reports = await env.run(
- t, testcase.url, testcase.expected_count);
-
- assert_equals(reports.length, testcase.expected_count);
- testcase.check(reports, env.contextUrl, testcase.url);
- }, `[${env.tag}] ${testcase.name}`);
+ const reports =
+ await run(t, testcase.check, testcase.url, testcase.expected_count);
+ }, `[${tag}] ${testcase.name}`);
}
}
-// A test for a non-empty destination.
-promise_test(async (t) => {
- const frame = await with_iframe(FRAME_URL);
- t.add_cleanup(() => frame.remove());
-
- const url = `${REMOTE_ORIGIN}/common/utils.js`;
- const script = frame.contentDocument.createElement('script');
- script.src = url;
- const future_reports = observeReports(frame.contentWindow, 2);
- frame.contentDocument.body.appendChild(script);
-
- const reports = await future_reports;
- assert_equals(reports.length, 2);
- checkReport(reports[0], FRAME_URL, url, 'reporting', 'script');
- checkReport(reports[1], FRAME_URL, url, 'enforce', 'script');
-}, 'destination: script');
-
</script>
diff --git a/tests/wpt/tests/html/document-isolation-policy/reporting-subresource-corp.tentative.https.html.headers b/tests/wpt/tests/html/document-isolation-policy/reporting-subresource-corp.tentative.https.html.headers
deleted file mode 100644
index bcc6f0734d5..00000000000
--- a/tests/wpt/tests/html/document-isolation-policy/reporting-subresource-corp.tentative.https.html.headers
+++ /dev/null
@@ -1 +0,0 @@
-Document-Isolation-Policy: isolate-and-require-corp
diff --git a/tests/wpt/tests/html/document-isolation-policy/resources/common.js b/tests/wpt/tests/html/document-isolation-policy/resources/common.js
index df4bfcfc7d5..64c1f8df416 100644
--- a/tests/wpt/tests/html/document-isolation-policy/resources/common.js
+++ b/tests/wpt/tests/html/document-isolation-policy/resources/common.js
@@ -1,5 +1,8 @@
+
const executor_path = '/common/dispatcher/executor.html?pipe=';
+const remote_executor_path = '/common/dispatcher/remote-executor.html?pipe=';
const executor_worker_path = '/common/dispatcher/executor-worker.js?pipe=';
+const remote_executor_worker_path = '/common/dispatcher/remote-executor-worker.js?pipe=';
const executor_service_worker_path = '/common/dispatcher/executor-service-worker.js?pipe=';
// COEP
@@ -93,6 +96,79 @@ const newCredentiallessIframe = (parent_token, child_origin) => {
return sub_document_token;
};
+// The following functions create remote execution contexts with the matching
+// origins and headers. The first return value is the uuid that can be used
+// to instantiate a RemoteContext object. The second return value is the URL of
+// the context that was created.
+async function createIframeContext(t, origin, header) {
+ const uuid = token();
+ const frame_url = origin + remote_executor_path + header + '&uuid=' + uuid;
+ const frame = await with_iframe(frame_url);
+ t.add_cleanup(() => frame.remove());
+ return [uuid, frame_url];
+}
+
+async function createDedicatedWorkerContext(t, origin, header) {
+ const iframe_uuid = token();
+ const frame_url = origin + remote_executor_path + header + '&uuid=' + iframe_uuid;
+ const frame = await with_iframe(frame_url);
+ t.add_cleanup(() => frame.remove());
+
+ const uuid = token();
+ const worker_url = origin + remote_executor_worker_path + '&uuid=' + uuid;
+ const ctx = new RemoteContext(iframe_uuid);
+ await ctx.execute_script(
+ (url) => {
+ const worker = new Worker(url);
+ }, [worker_url]);
+ return [uuid, worker_url];
+}
+
+async function createSharedWorkerContext(t, origin, header) {
+ const uuid = token();
+ const worker_url = origin + remote_executor_worker_path + header + '&uuid=' + uuid;
+ const worker = new SharedWorker(worker_url);
+ worker.addEventListener('error', t.unreached_func('Worker.onerror'));
+ return [uuid, worker_url];
+}
+
+async function createIframeWithSWContext(t, origin, header) {
+ // Register a service worker with no headers.
+ const uuid = token();
+ const frame_url = origin + remote_executor_path + header + '&uuid=' + uuid;
+ const service_worker_url = origin + executor_service_worker_path;
+ const reg = await service_worker_unregister_and_register(
+ t, service_worker_url, frame_url);
+ const worker = reg.installing || reg.waiting || reg.active;
+ worker.addEventListener('error', t.unreached_func('Worker.onerror'));
+
+ const frame = await with_iframe(frame_url);
+ t.add_cleanup(() => {
+ reg.unregister();
+ frame.remove();
+ });
+ return [uuid, frame_url];
+}
+
+// A common interface for building the 4 type of execution contexts. Outputs the
+// token needed to create the RemoteContext.
+async function getTokenFromEnvironment(t, environment, headers) {
+ switch(environment) {
+ case "document":
+ const iframe_context = await createIframeContext(t, window.origin, headers);
+ return iframe_context[0];
+ case "dedicated_worker":
+ const dedicated_worker_context = await createDedicatedWorkerContext(t, window.origin, headers);
+ return dedicated_worker_context[0];
+ case "shared_worker":
+ const shared_worker_context = await createSharedWorkerContext(t, window.origin, headers);
+ return shared_worker_context[0];
+ case "service_worker":
+ const sw_context = await createIframeWithSWContext(t, window.origin, headers);
+ return sw_context[0];
+ }
+}
+
// A common interface for building the 4 type of execution contexts:
// It outputs: [
// - The token to communicate with the environment.
diff --git a/tests/wpt/tests/html/document-isolation-policy/resources/report.py b/tests/wpt/tests/html/document-isolation-policy/resources/report.py
new file mode 100644
index 00000000000..3b677a91fdd
--- /dev/null
+++ b/tests/wpt/tests/html/document-isolation-policy/resources/report.py
@@ -0,0 +1,42 @@
+import json
+
+def main(request, response):
+ response.headers.set(b'Access-Control-Allow-Origin', b'*')
+ response.headers.set(b'Access-Control-Allow-Methods', b'OPTIONS, GET, POST')
+ response.headers.set(b'Access-Control-Allow-Headers', b'Content-Type')
+ response.headers.set(b'Cache-Control', b'no-cache, no-store, must-revalidate')
+ response.headers.set(b'Cross-Origin-Resource-Policy', b'cross-origin')
+
+ # CORS preflight
+ if request.method == u'OPTIONS':
+ return u''
+
+ uuidMap = {
+ b'endpoint': b'01234567-0123-0123-0123-0123456789AB',
+ b'report-only-endpoint': b'01234567-0123-0123-0123-0123456789CD'
+ }
+ key = 0
+ if b'endpoint' in request.GET:
+ key = uuidMap.get(request.GET[b'endpoint'], 0)
+
+ if b'key' in request.GET:
+ key = request.GET[b'key']
+
+ if key == 0:
+ response.status = 400
+ return u'invalid endpoint'
+
+ path = u'/'.join(request.url_parts.path.split(u'/')[:-1]) + u'/'
+ if request.method == u'POST':
+ reports = request.server.stash.take(key, path) or []
+ for report in json.loads(request.body):
+ reports.append(report)
+ request.server.stash.put(key, reports, path)
+ return u'done'
+
+ if request.method == u'GET':
+ response.headers.set(b'Content-Type', b'application/json')
+ return json.dumps(request.server.stash.take(key, path) or [])
+
+ response.status = 400
+ return u'invalid method'
diff --git a/tests/wpt/tests/html/semantics/popovers/popover-focus-tabindex.html b/tests/wpt/tests/html/semantics/popovers/popover-focus-tabindex.html
new file mode 100644
index 00000000000..f9c2342ba5e
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/popovers/popover-focus-tabindex.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8" />
+<title>Popover focus behaviors</title>
+<meta name="timeout" content="long">
+<link rel="author" title="Edgar Chen" href="mailto:echen@mozilla.com">
+<link rel=help href="https://html.spec.whatwg.org/#flattened-tabindex-ordered-focus-navigation-scope">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="resources/popover-utils.js"></script>
+
+<div id=focus-tabindex>
+ <span tabindex=0>First other focusable element</span>
+ <button popovertarget=focus-tabindex-p tabindex="1">Toggle popover</button>
+ <div popover id=focus-tabindex-p>
+ Popover with <button tabindex="0">focusable element</button>
+ </div>
+ <span tabindex=0>Second other focusable element</span>
+</div>
+<script>
+promise_test(async t => {
+ const popover = document.querySelector('#focus-tabindex>[popover]');
+ t.add_cleanup(() => {
+ popover.hidePopover();
+ });
+
+ const invoker = document.querySelector('#focus-tabindex>button');
+ const others = document.querySelectorAll('#focus-tabindex>span');
+ invoker.focus(); // Make sure button is focused.
+ assert_equals(document.activeElement, invoker);
+ invoker.click(); // Activate the invoker
+ assert_true(popover.matches(':popover-open'), 'Popover should be invoked by invoker');
+ assert_equals(document.activeElement, invoker, 'Invoker should still be focused');
+ others[1].focus();
+ assert_equals(document.activeElement, others[1], "Second focused element should be focused");
+ await sendShiftTab();
+ assert_equals(document.activeElement, others[0], 'Popover should be skipped since its invoker has different tabindex');
+}, "Cases where the popover invoker has different tabindex");
+</script>
diff --git a/tests/wpt/tests/resources/testdriver.js b/tests/wpt/tests/resources/testdriver.js
index 15f3a4b7cc7..460f879878f 100644
--- a/tests/wpt/tests/resources/testdriver.js
+++ b/tests/wpt/tests/resources/testdriver.js
@@ -1437,7 +1437,7 @@
* @param {String} sample - A `virtual pressure state
* <https://w3c.github.io/compute-pressure/#dom-pressurestate>`_
* such as "critical".
- * @param {number} estimate - Optional, A `virtual own contribution estimate`
+ * @param {number} own_contribution_estimate - Optional, A `virtual own contribution estimate`
* <https://w3c.github.io/compute-pressure/?experimental=1#the-owncontributionestimate-attribute>`_
* @param {WindowProxy} [context=null] - Browsing context in which to
* run the call, or null for the
@@ -1449,8 +1449,8 @@
* virtual pressure source of the given type does not
* exist).
*/
- update_virtual_pressure_source: function(source_type, sample, estimate, context=null) {
- return window.test_driver_internal.update_virtual_pressure_source(source_type, sample, estimate, context);
+ update_virtual_pressure_source: function(source_type, sample, own_contribution_estimate, context=null) {
+ return window.test_driver_internal.update_virtual_pressure_source(source_type, sample, own_contribution_estimate, context);
},
/**
@@ -1748,7 +1748,7 @@
throw new Error("create_virtual_pressure_source() is not implemented by testdriver-vendor.js");
},
- async update_virtual_pressure_source(source_type, sample, estimate, context=null) {
+ async update_virtual_pressure_source(source_type, sample, own_contribution_estimate, context=null) {
throw new Error("update_virtual_pressure_source() is not implemented by testdriver-vendor.js");
},
diff --git a/tests/wpt/tests/screen-capture/tentative/getdisplaymedia-captured-surface-resolution.https.html b/tests/wpt/tests/screen-capture/tentative/getdisplaymedia-captured-surface-resolution.https.html
index a1e7997ca69..6064bced90b 100644
--- a/tests/wpt/tests/screen-capture/tentative/getdisplaymedia-captured-surface-resolution.https.html
+++ b/tests/wpt/tests/screen-capture/tentative/getdisplaymedia-captured-surface-resolution.https.html
@@ -39,7 +39,7 @@
assert_greater_than(settings.physicalHeight, 0);
assert_equals(settings.physicalWidth / screenDetails.screens[0].devicePixelRatio, settings.logicalWidth);
assert_equals(settings.physicalHeight / screenDetails.screens[0].devicePixelRatio, settings.logicalHeight);
- assert_equals(screenDetails.screens[0].devicePixelRatio, settings.pixelRatio);
+ assert_equals(screenDetails.screens[0].devicePixelRatio, settings.screenPixelRatio);
assert_equals(capabilities.width.max, settings.physicalWidth);
assert_equals(capabilities.height.max, settings.physicalHeight);
};
@@ -64,7 +64,7 @@
assert_greater_than(settings.physicalHeight, 0);
assert_equals(settings.physicalWidth / screenDetails.screens[0].devicePixelRatio, settings.logicalWidth);
assert_equals(settings.physicalHeight / screenDetails.screens[0].devicePixelRatio, settings.logicalHeight);
- assert_equals(screenDetails.screens[0].devicePixelRatio, settings.pixelRatio);
+ assert_equals(screenDetails.screens[0].devicePixelRatio, settings.screenPixelRatio);
assert_equals(capabilities.width.max, settings.physicalWidth);
assert_equals(capabilities.height.max, settings.physicalHeight);
};
@@ -87,7 +87,7 @@
assert_greater_than(settings.physicalHeight, 0);
assert_equals(settings.physicalWidth / window.devicePixelRatio, settings.logicalWidth);
assert_equals(settings.physicalHeight / window.devicePixelRatio, settings.logicalHeight);
- assert_equals(window.devicePixelRatio, settings.pixelRatio);
+ assert_equals(window.devicePixelRatio, settings.screenPixelRatio);
assert_equals(capabilities.width.max, settings.physicalWidth);
assert_equals(capabilities.height.max, settings.physicalHeight);
};
@@ -123,7 +123,7 @@
assert_equals(oldPhysicalHeight, settings.physicalHeight);
assert_equals(oldPhysicalWidth / screenDetails.screens[0].devicePixelRatio, settings.logicalWidth);
assert_equals(oldPhysicalHeight / screenDetails.screens[0].devicePixelRatio, settings.logicalHeight);
- assert_equals(screenDetails.screens[0].devicePixelRatio, settings.pixelRatio);
+ assert_equals(screenDetails.screens[0].devicePixelRatio, settings.screenPixelRatio);
assert_equals(capabilities.width.max, settings.physicalWidth);
assert_equals(capabilities.height.max, settings.physicalHeight);
};
@@ -159,7 +159,7 @@
assert_equals(oldPhysicalHeight, settings.physicalHeight);
assert_equals(oldPhysicalWidth / screenDetails.screens[0].devicePixelRatio, settings.logicalWidth);
assert_equals(oldPhysicalHeight / screenDetails.screens[0].devicePixelRatio, settings.logicalHeight);
- assert_equals(screenDetails.screens[0].devicePixelRatio, settings.pixelRatio);
+ assert_equals(screenDetails.screens[0].devicePixelRatio, settings.screenPixelRatio);
assert_equals(capabilities.width.max, settings.physicalWidth);
assert_equals(capabilities.height.max, settings.physicalHeight);
};
@@ -193,7 +193,7 @@
assert_equals(oldPhysicalHeight, settings.physicalHeight);
assert_equals(oldPhysicalWidth / window.devicePixelRatio, settings.logicalWidth);
assert_equals(oldPhysicalHeight / window.devicePixelRatio, settings.logicalHeight);
- assert_equals(window.devicePixelRatio, settings.pixelRatio);
+ assert_equals(window.devicePixelRatio, settings.screenPixelRatio);
assert_equals(capabilities.width.max, settings.physicalWidth);
assert_equals(capabilities.height.max, settings.physicalHeight);
};
diff --git a/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-getanimations.tentative.html b/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-getanimations.tentative.html
new file mode 100644
index 00000000000..08d509d8cb2
--- /dev/null
+++ b/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-getanimations.tentative.html
@@ -0,0 +1,68 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <link rel="help" href="https://drafts.csswg.org/web-animations-2#animation-trigger">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <style>
+ .scroller {
+ overflow-y: scroll;
+ border: solid 1px;
+ place-self: center;
+ height: 300px;
+ width: 200px;
+ }
+ @keyframes slide-in {
+ from {
+ transform: translateX(-50px);
+ }
+ }
+ .target {
+ height: 100px;
+ width: 100%;
+ background-color: blue;
+ animation: slide-in 3s;
+ animation-trigger: view() alternate contain 0% contain 100%;
+ }
+ .target {
+ height: 100px;
+ width: 100%;
+ background-color: blue;
+ }
+ .space {
+ height: 250px;
+ width: 50%;
+ }
+
+ .active {
+ animation-fill-mode: both;
+ }
+ .idle {
+ animation-fill-mode: none;
+ }
+
+ </style>
+ <div id="scroller" class="scroller">
+ <div class="space"></div>
+ <div id="subject"></div>
+ <div class="space"></div>
+ <div id="active_target" class="active target"></div>
+ <div id="idle_target" class="idle target"></div>
+ </div>
+ <script>
+ promise_test(async () => {
+ assert_equals(idle_target.getAnimations().length, 1,
+ "idle target has an animation");
+ }, "getAnimations includes an untriggered " +
+ "'fill-mode: none' animation.");
+
+ promise_test(async () => {
+ assert_equals(active_target.getAnimations().length, 1,
+ "active target has an animation");
+ }, "getAnimations does include an untriggered " +
+ "'fill-mode: both' animation.");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger.html b/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger.html
index dd4820dfe5f..7506fb05829 100644
--- a/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger.html
+++ b/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger.html
@@ -24,13 +24,13 @@
.target {
animation: myAnim linear 0.5s forwards;
}
- .scroll_target {
+ #scroll_target {
animation-trigger: repeat scroll(inline) 150px 200px 100px 250px;
}
- .view_target {
+ #view_target {
animation-trigger: state view(x) contain 10% contain 90% cover 10% cover 90%;
}
- .deferred_target {
+ #deferred_target {
animation-trigger: alternate --viewtimeline contain 5% contain 80% cover 5% cover 80%;
}
.scroller {
@@ -108,15 +108,7 @@
promise_test(async() => {
await waitForNextFrame();
- // Grabbing a reference to the animation and *then* adding the class
- // which confers the trigger properties is a workaround to the fact that
- // if the scroll-based trigger were already in place, the animation
- // would be idle, getAnimations would not include it, and we would not
- // be able to get a reference to it.
- // TODO: if the definition for getAnimations changes such that it should
- // include un-triggered animations, we should remove this workaround.
const animation = scroll_target.getAnimations()[0];
- scroll_target.classList.add("scroll_target");
const trigger = animation.trigger;
await waitForNextFrame();
@@ -136,7 +128,6 @@
promise_test(async() => {
await waitForNextFrame();
const animation = view_target.getAnimations()[0];
- view_target.classList.add("view_target");
const trigger = animation.trigger;
await waitForNextFrame();
@@ -157,7 +148,6 @@
promise_test(async() => {
await waitForNextFrame();
const animation = deferred_target.getAnimations()[0];
- deferred_target.classList.add("deferred_target");
const trigger = animation.trigger;
await waitForNextFrame();
diff --git a/tests/wpt/tests/svg/painting/reftests/WEB_FEATURES.yml b/tests/wpt/tests/svg/painting/reftests/WEB_FEATURES.yml
new file mode 100644
index 00000000000..123f8c0419a
--- /dev/null
+++ b/tests/wpt/tests/svg/painting/reftests/WEB_FEATURES.yml
@@ -0,0 +1,4 @@
+features:
+- name: context-fill-stroke
+ files:
+ - paint-context-*
diff --git a/tests/wpt/tests/tools/lint/tests/test_file_lints.py b/tests/wpt/tests/tools/lint/tests/test_file_lints.py
index 92270e38a69..f6311043293 100644
--- a/tests/wpt/tests/tools/lint/tests/test_file_lints.py
+++ b/tests/wpt/tests/tools/lint/tests/test_file_lints.py
@@ -1236,6 +1236,34 @@ def test_invalid_web_features_file():
assert errors == []
+def test_duplicate_keys_invalid_web_features_file():
+ code = b"""\
+features:
+- name: feature1
+ files:
+ - feature1-*
+features:
+- name: feature2
+ files:
+ - "feature2-*"
+"""
+ # Check when the value is named correctly. It should find the error.
+ errors = check_file_contents("", "css/WEB_FEATURES.yml", io.BytesIO(code))
+ check_errors(errors)
+
+ assert errors == [
+ ('INVALID-WEB-FEATURES-FILE',
+ 'The WEB_FEATURES.yml file contains an invalid structure',
+ "css/WEB_FEATURES.yml",
+ None),
+ ]
+
+ # Check when the value is named incorrectly. It should not find the error.
+ errors = check_file_contents("", "css/OTHER_WEB_FEATURES.yml", io.BytesIO(code))
+ check_errors(errors)
+
+ assert errors == []
+
def test_css_missing_file_manual():
errors = check_file_contents("", "css/foo/bar-manual.html", io.BytesIO(b""))
check_errors(errors)
diff --git a/tests/wpt/tests/tools/metadata/yaml/load.py b/tests/wpt/tests/tools/metadata/yaml/load.py
index 831f7e8fff1..c6813f23392 100644
--- a/tests/wpt/tests/tools/metadata/yaml/load.py
+++ b/tests/wpt/tests/tools/metadata/yaml/load.py
@@ -3,9 +3,24 @@ from ..meta.schema import SchemaValue
import yaml
+# PyYaml does not currently handle unique keys.
+# https://github.com/yaml/pyyaml/issues/165#issuecomment-430074049
+# In that issue, there are workarounds to it.
+# https://gist.github.com/pypt/94d747fe5180851196eb?permalink_comment_id=4015118#gistcomment-4015118
+
+class UniqueKeyLoader(yaml.SafeLoader):
+ def construct_mapping(self, node: yaml.MappingNode, deep: bool = False) -> Dict[Any, Any]:
+ mapping = set()
+ for key_node, value_node in node.value:
+ key = self.construct_object(key_node, deep=deep) # type: ignore
+ if key in mapping:
+ raise ValueError(f"Duplicate {key!r} key found in YAML.")
+ mapping.add(key)
+ return super().construct_mapping(node, deep)
+
def load_data_to_dict(f: IO[bytes]) -> Dict[str, Any]:
try:
- raw_data = yaml.safe_load(f)
+ raw_data = yaml.load(f, Loader=UniqueKeyLoader)
return SchemaValue.from_dict(raw_data)
except Exception as e:
raise e
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/actions.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/actions.py
index 06d58e7e87b..10b5eeb6b94 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/actions.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/actions.py
@@ -498,8 +498,8 @@ class UpdateVirtualPressureSourceAction:
def __call__(self, payload):
source_type = payload["source_type"]
sample = payload["sample"]
- estimate = payload["estimate"]
- return self.protocol.pressure.update_virtual_pressure_source(source_type, sample, estimate)
+ own_contribution_estimate = payload["own_contribution_estimate"]
+ return self.protocol.pressure.update_virtual_pressure_source(source_type, sample, own_contribution_estimate)
class RemoveVirtualPressureSourceAction:
name = "remove_virtual_pressure_source"
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executormarionette.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executormarionette.py
index 67f11aefa00..110466e47ab 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executormarionette.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executormarionette.py
@@ -721,7 +721,7 @@ class MarionetteVirtualPressureSourceProtocolPart(VirtualPressureSourceProtocolP
def create_virtual_pressure_source(self, source_type, metadata):
raise NotImplementedError("create_virtual_pressure_source not yet implemented")
- def update_virtual_pressure_source(self, source_type, sample, estimate):
+ def update_virtual_pressure_source(self, source_type, sample, own_contribution_estimate):
raise NotImplementedError("update_virtual_pressure_source not yet implemented")
def remove_virtual_pressure_source(self, source_type):
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py
index d0c1f9e64a4..45ddb57c9ae 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py
@@ -685,8 +685,8 @@ class WebDriverVirtualPressureSourceProtocolPart(VirtualPressureSourceProtocolPa
body.update(metadata)
return self.webdriver.send_session_command("POST", "pressuresource", body)
- def update_virtual_pressure_source(self, source_type, sample, estimate):
- body = {"sample": sample, "estimate": estimate}
+ def update_virtual_pressure_source(self, source_type, sample, own_contribution_estimate):
+ body = {"sample": sample, "own_contribution_estimate": own_contribution_estimate}
return self.webdriver.send_session_command("POST", "pressuresource/%s" % source_type, body)
def remove_virtual_pressure_source(self, source_type):
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/protocol.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/protocol.py
index 53a7b437848..5190b266401 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/protocol.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/protocol.py
@@ -1009,7 +1009,7 @@ class VirtualPressureSourceProtocolPart(ProtocolPart):
pass
@abstractmethod
- def update_virtual_pressure_source(self, source_type, sample, estimate):
+ def update_virtual_pressure_source(self, source_type, sample, own_contribution_estimate):
pass
@abstractmethod
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/testdriver-extra.js b/tests/wpt/tests/tools/wptrunner/wptrunner/testdriver-extra.js
index 71c1be2732f..5d37cf5e15f 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/testdriver-extra.js
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/testdriver-extra.js
@@ -468,8 +468,8 @@
return create_context_action("create_virtual_pressure_source", context, {source_type, metadata});
};
- window.test_driver_internal.update_virtual_pressure_source = function(source_type, sample, estimate, context=null) {
- return create_context_action("update_virtual_pressure_source", context, {source_type, sample, estimate});
+ window.test_driver_internal.update_virtual_pressure_source = function(source_type, sample, own_contribution_estimate, context=null) {
+ return create_context_action("update_virtual_pressure_source", context, {source_type, sample, own_contribution_estimate});
};
window.test_driver_internal.remove_virtual_pressure_source = function(source_type, context=null) {
diff --git a/tests/wpt/tests/web-animations/animation-model/animation-types/property-list.js b/tests/wpt/tests/web-animations/animation-model/animation-types/property-list.js
index 9cfd90d17f2..21f39b1fc18 100644
--- a/tests/wpt/tests/web-animations/animation-model/animation-types/property-list.js
+++ b/tests/wpt/tests/web-animations/animation-model/animation-types/property-list.js
@@ -25,6 +25,12 @@ const gCSSProperties1 = {
{ type: 'discrete', options: [ [ 'flex-start', 'flex-end' ] ] }
]
},
+ 'anchor-name': {
+ // https://drafts.csswg.org/css-anchor-position-1/#name
+ types: [
+ { type: 'discrete', options: [ [ 'none', '--anchor' ] ] }
+ ]
+ },
'anchor-scope': {
// https://drafts.csswg.org/css-anchor-position-1/#anchor-scope
types: [
@@ -1279,6 +1285,30 @@ const gCSSProperties2 = {
{ type: 'discrete', options: [ [ 'absolute', 'fixed' ] ] }
]
},
+ 'position-anchor': {
+ // https://drafts.csswg.org/css-anchor-position-1/#position-anchor
+ types: [
+ { type: 'discrete', options: [ [ 'auto', '--anchor' ] ] }
+ ]
+ },
+ 'position-visibility': {
+ // https://drafts.csswg.org/css-anchor-position-1/#position-visibility
+ types: [
+ { type: 'discrete', options: [ [ 'always', 'anchors-valid' ] ] }
+ ]
+ },
+ 'position-try-fallbacks': {
+ // https://drafts.csswg.org/css-anchor-position-1/#position-try-fallbacks
+ types: [
+ { type: 'discrete', options: [ [ 'none', 'flip-block' ] ] }
+ ]
+ },
+ 'position-try-order': {
+ // https://drafts.csswg.org/css-anchor-position-1/#position-try-order-property
+ types: [
+ { type: 'discrete', options: [ [ 'normal', 'most-width' ] ] }
+ ]
+ },
'quotes': {
// https://drafts.csswg.org/css-content-3/#propdef-quotes
types: [
diff --git a/tests/wpt/tests/webrtc/rtp-stats-lifetime.https.html b/tests/wpt/tests/webrtc/rtp-stats-lifetime.https.html
new file mode 100644
index 00000000000..4ddd6ad4f16
--- /dev/null
+++ b/tests/wpt/tests/webrtc/rtp-stats-lifetime.https.html
@@ -0,0 +1,102 @@
+<!doctype html>
+<meta charset=utf-8>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="RTCPeerConnection-helper.js"></script>
+<script>
+'use strict';
+
+async function hasStats(pc, type) {
+ const report = await pc.getStats();
+ for (const stats of report.values()) {
+ if (stats.type == type) {
+ return true;
+ }
+ }
+ return false;
+}
+
+async function getInboundRtpPollUntilItExists(pc, kTimeoutMs = 10000) {
+ const t0 = performance.now();
+ while (performance.now() - t0 < kTimeoutMs) {
+ const report = await pc.getStats();
+ for (const stats of report.values()) {
+ if (stats.type == 'inbound-rtp') {
+ return stats;
+ }
+ }
+ }
+ return null;
+}
+
+promise_test(async t => {
+ const pc = new RTCPeerConnection();
+ t.add_cleanup(() => pc.close());
+
+ pc.addTransceiver('video');
+ assert_false(await hasStats(pc, 'outbound-rtp'),
+ 'outbound-rtp does not exist after addTransceiver');
+ await pc.setLocalDescription();
+ assert_false(await hasStats(pc, 'outbound-rtp'),
+ 'outbound-rtp does not exist in have-local-offer');
+}, `RTCOutboundRtpStreamStats does not exist as early as have-local-offer`);
+
+// This test does not exchange ICE candidates, meaning no packets are sent.
+// We should still see outbound-rtp stats because they are created by the O/A.
+promise_test(async t => {
+ const pc1 = new RTCPeerConnection();
+ t.add_cleanup(() => pc1.close());
+ const pc2 = new RTCPeerConnection();
+ t.add_cleanup(() => pc1.close());
+
+ // Offer to send. See previous test for assertions that the outbound-rtp is
+ // not created this early, which this test does not care about.
+ pc1.addTransceiver('video');
+ await pc1.setLocalDescription();
+
+ // Answer to send.
+ await pc2.setRemoteDescription(pc1.localDescription);
+ const [transceiver] = pc2.getTransceivers();
+ transceiver.direction = 'sendrecv';
+ assert_false(await hasStats(pc2, 'outbound-rtp'),
+ 'outbound-rtp does not exist in has-remote-offer');
+ await pc2.setLocalDescription();
+ assert_true(await hasStats(pc2, 'outbound-rtp'),
+ 'outbound-rtp exists after answerer returns to stable');
+
+ // Complete offerer negotiation.
+ await pc1.setRemoteDescription(pc2.localDescription);
+ assert_true(await hasStats(pc1, 'outbound-rtp'),
+ 'outbound-rtp exists after offerer returns to stable');
+}, `RTCOutboundRtpStreamStats exists after returning to stable`);
+
+promise_test(async t => {
+ const pc1 = new RTCPeerConnection();
+ t.add_cleanup(() => pc1.close());
+ const pc2 = new RTCPeerConnection();
+ t.add_cleanup(() => pc1.close());
+ pc1.onicecandidate = e => pc2.addIceCandidate(e.candidate);
+ pc2.onicecandidate = e => pc1.addIceCandidate(e.candidate);
+
+ // Negotaite to send, but don't send anything yet (track is null).
+ const {sender} = pc1.addTransceiver('video');
+ await pc1.setLocalDescription();
+ await pc2.setRemoteDescription(pc1.localDescription);
+ await pc2.setLocalDescription();
+ await pc1.setRemoteDescription(pc2.localDescription);
+ assert_false(await hasStats(pc2, 'inbound-rtp'),
+ 'inbound-rtp does not exist before packets are received');
+
+ // Start sending. This results in inbound-rtp being created.
+ const stream = await getNoiseStream({video:true});
+ const [track] = stream.getTracks();
+ await sender.replaceTrack(track);
+ const inboundRtp = await getInboundRtpPollUntilItExists(pc2);
+ assert_not_equals(
+ inboundRtp, null,
+ 'inbound-rtp should be created in response to the sender having a track');
+ assert_greater_than(
+ inboundRtp.packetsReceived, 0,
+ 'inbound-rtp must only exist after packets have been received');
+}, `RTCInboundRtpStreamStats are created by packet reception`);
+</script>