diff options
author | Servo WPT Sync <32481905+servo-wpt-sync@users.noreply.github.com> | 2025-03-30 03:40:11 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-03-30 01:40:11 +0000 |
commit | c593e15fa85ed9f447d890422f51878eac17c034 (patch) | |
tree | 86a7a5dbbb28bf1e72351981f9a34c59a12aa6ca | |
parent | 44faff047425988241993fffc2783a7388d88f2e (diff) | |
download | servo-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>
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> |