diff options
Diffstat (limited to 'tests/wpt')
262 files changed, 8107 insertions, 2357 deletions
diff --git a/tests/wpt/meta/MANIFEST.json b/tests/wpt/meta/MANIFEST.json index 72c930afccf..b5e319c83c3 100644 --- a/tests/wpt/meta/MANIFEST.json +++ b/tests/wpt/meta/MANIFEST.json @@ -411,10 +411,12 @@ "ai": { "language_detection": { "availability-detached-crash.https.html": [ - "5f76d59eb3540048bc0586f2a1ac5b3b313a147e", + "ee5e27e35b60e89f17f8008d809f4d6040e4eb5b", [ null, - {} + { + "testdriver": true + } ] ] } @@ -790,6 +792,13 @@ {} ] ], + "chrome-bug-405795970.html": [ + "5b45527fd9ccb2038fdd3f459bcf10a9514f199c", + [ + null, + {} + ] + ], "pseudo-element-animation-with-marker.html": [ "ba7fc2371abfdc463f8ed36e6f1bb39fb9ef6ef5", [ @@ -9893,6 +9902,13 @@ ] }, "styling": { + "cx-sibling-index-crash.html": [ + "9fe97b12d774a547a2cb3bf65f9a9ad8f1af8a58", + [ + null, + {} + ] + ], "font-size-number-calc-crash.svg": [ "6b56d9df2b426e2376f87668a98f5e21ee56e37b", [ @@ -10055,6 +10071,13 @@ null, {} ] + ], + "sibling-index-offset-crash.html": [ + "812a7952738231f4c1bc2bf22c0d87f9a39c86cd", + [ + null, + {} + ] ] }, "interfaces": { @@ -124262,6 +124285,32 @@ }, "css-align": { "abspos": { + "align-items-static-position-001.tentative.html": [ + "06c11e6cdb61a519fdbc77d377fb0ace0e92f6b1", + [ + null, + [ + [ + "/css/css-align/abspos/align-items-static-position-001-ref.tentative.html", + "==" + ] + ], + {} + ] + ], + "align-items-static-position-002.tentative.html": [ + "f90004b5672a1fef9f42cf32ae13b06fc085e0ec", + [ + null, + [ + [ + "/css/css-align/abspos/align-items-static-position-002-ref.tentative.html", + "==" + ] + ], + {} + ] + ], "align-items-static-position.html": [ "0b653ca5d6c2bbaf29b3834aec7d806169c8de55", [ @@ -124301,6 +124350,110 @@ {} ] ], + "align-self-static-position-003.html": [ + "39f871f4c2b837dc67b30d615e9c8ad0e4392d24", + [ + null, + [ + [ + "/css/css-align/abspos/align-self-static-position-003-ref.html", + "==" + ] + ], + {} + ] + ], + "align-self-static-position-004.html": [ + "afba7215b116506138434da5fa3c13ec832fb393", + [ + null, + [ + [ + "/css/css-align/abspos/align-self-static-position-004-ref.html", + "==" + ] + ], + {} + ] + ], + "align-self-static-position-005.html": [ + "e148f0ebda37797d5573f4c3a2d4b7c52e5a2f2e", + [ + null, + [ + [ + "/css/css-align/abspos/align-self-static-position-005-ref.html", + "==" + ] + ], + {} + ] + ], + "align-self-static-position-006.html": [ + "253b2a52f618a82fcf13b82bd61075bc2dcee8be", + [ + null, + [ + [ + "/css/css-align/abspos/align-self-static-position-006-ref.html", + "==" + ] + ], + {} + ] + ], + "align-self-static-position-007.html": [ + "ebe872aaab909e29abf3eed33840a577a616b34b", + [ + null, + [ + [ + "/css/css-align/abspos/align-self-static-position-007-ref.html", + "==" + ] + ], + {} + ] + ], + "align-self-static-position-008.html": [ + "187974884b4aded9a031c0c2fdc9d2caafd9ef5b", + [ + null, + [ + [ + "/css/css-align/abspos/align-self-static-position-008-ref.html", + "==" + ] + ], + {} + ] + ], + "align-self-stretch-auto-margins-aspect-ratio.html": [ + "4eaa9d2f3a6dbab63d3d931d4c58a427bc11976f", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "align-self-stretch-auto-margins.html": [ + "9d1b6454c848c02b7fef360fb447d4d6b46ee8c0", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "align-self-stretch-auto-size.tentative.html": [ "74091feacfe63813aa4a6bbc3ef1b4d3e4e8a59c", [ @@ -124326,6 +124479,32 @@ ], {} ] + ], + "justify-self-stretch-auto-margins-aspect-ratio.html": [ + "c50b32f089b1b0043ac5d9dbd0f79906d82827f3", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "justify-self-stretch-auto-margins.html": [ + "7d7b4bfc8570d3dde59fc903de7cb173b0b5baf8", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] ] }, "baseline-of-scrollable-1a.html": [ @@ -186631,6 +186810,192 @@ {} ] ] + }, + "tentative": { + "multicol": { + "multicol-gap-decorations-001.html": [ + "c3752156c7d54f6620ade9715b4562582c6135f6", + [ + null, + [ + [ + "/css/css-gaps/tentative/multicol/multicol-gap-decorations-001-ref.html", + "==" + ] + ], + {} + ] + ], + "multicol-gap-decorations-002.html": [ + "0b632fa94ace20a253f5f56079d29adbb7997135", + [ + null, + [ + [ + "/css/css-gaps/tentative/multicol/multicol-gap-decorations-002-ref.html", + "==" + ] + ], + {} + ] + ], + "multicol-gap-decorations-003.html": [ + "2f2473fd04686283e120abd29b5f273da40c3ef3", + [ + null, + [ + [ + "/css/css-gaps/tentative/multicol/multicol-gap-decorations-003-ref.html", + "==" + ] + ], + {} + ] + ], + "multicol-gap-decorations-004.html": [ + "0dcbeef4df82f4d9dc6e2ed2215ee2fa39773052", + [ + null, + [ + [ + "/css/css-gaps/tentative/multicol/multicol-gap-decorations-004-ref.html", + "==" + ] + ], + {} + ] + ], + "multicol-gap-decorations-005.html": [ + "daa65e904e71ee62c83ba2a16933d13311328539", + [ + null, + [ + [ + "/css/css-gaps/tentative/multicol/multicol-gap-decorations-005-ref.html", + "==" + ] + ], + {} + ] + ], + "multicol-gap-decorations-006.html": [ + "64b3b007ab5f6282c95bb79a39a3bcf89d10de88", + [ + null, + [ + [ + "/css/css-gaps/tentative/multicol/multicol-gap-decorations-006-ref.html", + "==" + ] + ], + {} + ] + ], + "multicol-gap-decorations-007.html": [ + "1f23ed7f7ca34602f4310627edb5ae96885028b8", + [ + null, + [ + [ + "/css/css-gaps/tentative/multicol/multicol-gap-decorations-007-ref.html", + "==" + ] + ], + {} + ] + ], + "multicol-gap-decorations-008.html": [ + "ed299b5d9f68e8560d99cdd58fcc9b3830929117", + [ + null, + [ + [ + "/css/css-gaps/tentative/multicol/multicol-gap-decorations-008-ref.html", + "==" + ] + ], + {} + ] + ], + "multicol-gap-decorations-009.html": [ + "b00c6a70f8abf9894e548d9e40882e396ed5b1f0", + [ + null, + [ + [ + "/css/css-gaps/tentative/multicol/multicol-gap-decorations-009-ref.html", + "==" + ] + ], + {} + ] + ], + "multicol-gap-decorations-010.html": [ + "61bb4a9b93314bb7d96a90b98f67b175a4cf86c6", + [ + null, + [ + [ + "/css/css-gaps/tentative/multicol/multicol-gap-decorations-010-ref.html", + "==" + ] + ], + {} + ] + ], + "multicol-gap-decorations-011.html": [ + "cf588ded41ea3e811c241984ec8909e5fbcf14be", + [ + null, + [ + [ + "/css/css-gaps/tentative/multicol/multicol-gap-decorations-011-ref.html", + "==" + ] + ], + {} + ] + ], + "multicol-gap-decorations-012.html": [ + "078b810cf8e608b16dd2a898136f4ce757325ed9", + [ + null, + [ + [ + "/css/css-gaps/tentative/multicol/multicol-gap-decorations-012-ref.html", + "==" + ] + ], + {} + ] + ], + "multicol-gap-decorations-013.html": [ + "d4170084f066688fd136b2abeb40da03b1243816", + [ + null, + [ + [ + "/css/css-gaps/tentative/multicol/multicol-gap-decorations-013-ref.html", + "==" + ] + ], + {} + ] + ], + "multicol-gap-decorations-014.html": [ + "1dcd393d99aa19021684e42e9f835e17281fc6a4", + [ + null, + [ + [ + "/css/css-gaps/tentative/multicol/multicol-gap-decorations-014-ref.html", + "==" + ] + ], + {} + ] + ] + } } }, "css-grid": { @@ -192732,6 +193097,32 @@ {} ] ], + "replaced-element-016.tentative.html": [ + "2d5b401b8d20ac682675b3eeb23f264239b83d49", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square-only.html", + "==" + ] + ], + {} + ] + ], + "replaced-element-017.tentative.html": [ + "575fa8c78179d3741948e0d987fc446534bb6a86", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square-only.html", + "==" + ] + ], + {} + ] + ], "table-with-infinite-max-intrinsic-width.html": [ "877e982cd4c5987f131587da33a23f3b7a49d538", [ @@ -249641,6 +250032,32 @@ {} ] ], + "intrinsic-percent-replaced-029.tentative.html": [ + "feff03bbe2e1a1e18a22429a58a9d20cc0f9987b", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square-only.html", + "==" + ] + ], + {} + ] + ], + "intrinsic-percent-replaced-030.tentative.html": [ + "5a6b103c22e20d23aa842e72ac6ffe6c9948156f", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square-only.html", + "==" + ] + ], + {} + ] + ], "intrinsic-percent-replaced-dynamic-001.html": [ "1128ffa1759f26011c0639d8b5f498322c6396ac", [ @@ -324194,6 +324611,19 @@ {} ] ], + "table-cell-align-006.html": [ + "a8d33f281fda76603ea312601933fdf170ddf64b", + [ + null, + [ + [ + "/css/css-writing-modes/reference/table-cell-align-006-ref.html", + "==" + ] + ], + {} + ] + ], "table-cell-valign-001.html": [ "f3026810dd58cd04f87df5f3ae2ad474d5c289db", [ @@ -347931,7 +348361,7 @@ ] ], "marquee-with-trusted-types.html": [ - "57f4985032165e989ba261c32c11c9acf0491908", + "f16c58bb85d71b011e4ee524dfb63184a5fca81a", [ null, [ @@ -353323,19 +353753,6 @@ } ] ], - "select-multiple-base-appearance.html": [ - "48673b446bc8e6e6cce72e6c4d29671bed313779", - [ - null, - [ - [ - "/html/semantics/forms/the-select-element/customizable-select/select-multiple-base-appearance-ref.html", - "==" - ] - ], - {} - ] - ], "select-only-button-opt-in.tentative.html": [ "b010d15e8adab1ebfe448842e195e29b24d332fb", [ @@ -353568,6 +353985,21 @@ ] ] }, + "customizable-select-in-page": { + "customizable-select-in-page-appearance.tentative.html": [ + "b3bf75eb0ff25df6d4737326940a498a11d264d2", + [ + null, + [ + [ + "/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance-ref.html", + "==" + ] + ], + {} + ] + ] + }, "reset-algorithm-rendering.html": [ "67da173ff2eb0d90c063294db486eaa34ea8878a", [ @@ -361587,7 +362019,7 @@ ] ], "animation-with-transform.html": [ - "f741cc634d732624186d8d0a034822bef831c872", + "323d984c98938fbb5bd224560d7adf0711149430", [ null, [ @@ -361652,7 +362084,7 @@ ] ], "two-animations-attach-to-same-scroll-timeline-cancel-one.html": [ - "ed8e8337a65af3033e3df4e158333d225d88a56d", + "28973d2d1858421ff53bae1d667c160152d6ecda", [ null, [ @@ -361665,7 +362097,7 @@ ] ], "two-animations-attach-to-same-scroll-timeline.html": [ - "de50599fbafb634e44ccd9546e18bea8ba7f7f7e", + "45ba3f99ccdbf9ef64f915c1c124d7f946a1f74f", [ null, [ @@ -370762,7 +371194,7 @@ [] ], "docker.yml": [ - "66794b69aba0f2ee5984c269434cdab2ee9a6cfc", + "5de0cc4bcb1faf6c919d41998bd9ec035e8594cf", [] ], "documentation.yml": [ @@ -371505,6 +371937,10 @@ "iframe-helper.html": [ "fe07de3f8abac59ddbd6ccfd706a5e69c5b8b4c4", [] + ], + "util.js": [ + "7cb3e7c2e13cb0415be019580ccfcc339cd7bd8f", + [] ] } }, @@ -374135,6 +374571,14 @@ "eb50cb54ef867844ea741fe1fdb01df970e4deea", [] ], + "clear-site-data-prefetchCache.py": [ + "3a332dd58b2012154b6a193410be34dc3f92a172", + [] + ], + "clear-site-data-prerenderCache.py": [ + "bf845cfb699c311c145357ad12a5b4b056d2c986", + [] + ], "controlled-endpoint.py": [ "bb4f464088e46438f993d66ae0da134bb4410c7b", [] @@ -413754,6 +414198,14 @@ [] ], "abspos": { + "align-items-static-position-001-ref.tentative.html": [ + "22c1fd03e38792a3d697659c1e087178c453f1ed", + [] + ], + "align-items-static-position-002-ref.tentative.html": [ + "6f53b04178707a83eb2822e5807cf42d3c547ca6", + [] + ], "align-items-static-position-ref.html": [ "fd7093f98748709d0f6d03c9dc9993a7a1447446", [] @@ -413766,6 +414218,30 @@ "d8bef63aa292aecd1ce6628e27abbc2c196f8a29", [] ], + "align-self-static-position-003-ref.html": [ + "132bbb7360fb5a40130e0a7af9ffb3a9d2baf753", + [] + ], + "align-self-static-position-004-ref.html": [ + "68130ee1d7e723a6b5c4c8a7e3b78d7bdb2f35da", + [] + ], + "align-self-static-position-005-ref.html": [ + "947bd2704481f757f3d1f4bf51105483978cc7ff", + [] + ], + "align-self-static-position-006-ref.html": [ + "5bbafc6484585ad25223cf1b5825214e90705836", + [] + ], + "align-self-static-position-007-ref.html": [ + "bc9b5f4f6502f647e97332401308a87a64c339f0", + [] + ], + "align-self-static-position-008-ref.html": [ + "79cf612b8f846920af1d2d7b188376693c789b3f", + [] + ], "align-self-with-flex-grid-parent-ref.html": [ "c87289d450e9ec95677c17a6d72d3e34dec4d05d", [] @@ -430722,6 +431198,66 @@ "7e0d9cbcd6ff64b17bc8fe57616a37ba29a9fd8e", [] ] + }, + "tentative": { + "multicol": { + "multicol-gap-decorations-001-ref.html": [ + "834c96ccd397fbc41abcfb80dbd298094cb929b1", + [] + ], + "multicol-gap-decorations-002-ref.html": [ + "d132f0ca6770be13d87ee66fb033f2f498d0e37b", + [] + ], + "multicol-gap-decorations-003-ref.html": [ + "cd26da243891f05c83c5d1eea17c747dcf390f05", + [] + ], + "multicol-gap-decorations-004-ref.html": [ + "002b1f2b594cf791b6d66613f48128e915517e01", + [] + ], + "multicol-gap-decorations-005-ref.html": [ + "6543021c97934a217568e567ac005166f7a9c0a0", + [] + ], + "multicol-gap-decorations-006-ref.html": [ + "4cb56d207fef4f801ec2063828103712267c030e", + [] + ], + "multicol-gap-decorations-007-ref.html": [ + "09973ddc690a899be9fb321e603b7831bfeb22a7", + [] + ], + "multicol-gap-decorations-008-ref.html": [ + "d49c2f50f1909d5b04be07798e62448d9b82ab72", + [] + ], + "multicol-gap-decorations-009-ref.html": [ + "124bf7eaeb1779d067d84f1c30560f45763add7c", + [] + ], + "multicol-gap-decorations-010-ref.html": [ + "9582ab4103d197d25823ed75dc8cafa83e0b1a7c", + [] + ], + "multicol-gap-decorations-011-ref.html": [ + "3387918d399cdbd3b39364ebe954a2a204a5145c", + [] + ], + "multicol-gap-decorations-012-ref.html": [ + "9fb5e85e920812d259e057c7538d35db56659b05", + [] + ], + "multicol-gap-decorations-013-ref.html": [ + "8e426d8ed32b25248e602e063e69678ca94b5e09", + [] + ], + "multicol-gap-decorations-014-ref.html": [ + "9d9674bd476896f0f1b03ec6835b069c97d9c8e5", + [] + ] + } } }, "css-gcpm": { @@ -454356,6 +454892,10 @@ "c5cd6fe28a97343b94989193c4583ddd2393538a", [] ], + "table-cell-align-006-ref.html": [ + "c5b52346fc0ad931aedb40339150146e067bc268", + [] + ], "table-cell-valign-001-ref.html": [ "03cb9ec9e4c6b1d7b6e0973b57f3c93ce293b1e4", [] @@ -460256,7 +460796,7 @@ }, "include": { "editor-test-utils.js": [ - "9c5600af77bf22c936cbe383a9667790d2cd8c10", + "f0c4f58399263a453b11a37e54d7152d935adec5", [] ], "implementation.js": [ @@ -464917,7 +465457,7 @@ [] ], "fledge-util.sub.js": [ - "0a18ea40d3d25e22acef6a7c32f0e644989294cf", + "49ebfd1c596c102970f0062592284b14da3841f9", [] ], "fledge_http_server_util.py": [ @@ -464936,6 +465476,14 @@ "54873674eb58783731237dde5ef299ce15947638", [] ], + "record-click.py": [ + "b4e76873d9b12227e350e2d4d01321cab05a44ce", + [] + ], + "record-view.py": [ + "d423b2d9c72930a1302738418eef197f28dfb661", + [] + ], "redirect-to-trusted-signals.py": [ "7da27cd6872f9119c8647be939aecc4452526e50", [] @@ -469620,6 +470168,10 @@ "2d.gradient.object.current.png": [ "d638d033868afd3aab0a7b26d5b2a0a2b95da010", [] + ], + "WEB_FEATURES.yml": [ + "319b5b8e04cb32161be0d8eb36cc4ba99eb6459c", + [] ] }, "filters": { @@ -470040,6 +470592,10 @@ ] }, "fill-and-stroke-styles": { + "WEB_FEATURES.yml": [ + "5d9106c1cd63b77005e44a30177d9e623f4e98df", + [] + ], "conic-gradient-expected.html": [ "f347abc9d3939fb52c4fe08d949f8d96c4de3386", [] @@ -470950,6 +471506,10 @@ "2d.gradient.hueInterpolationMethod-expected.html": [ "13ae67ad970eb6bc6a94d837d3f2c01c2ad9c3ba", [] + ], + "WEB_FEATURES.yml": [ + "319b5b8e04cb32161be0d8eb36cc4ba99eb6459c", + [] ] }, "filters": { @@ -472316,82 +472876,6 @@ "244167937219cfd784f13d8ed37eedead64665e9", [] ] - }, - "tentative": { - "restrict-properties": { - "README.md": [ - "b3c24c3f82d2dbf07eefa9fa2e88fcf3817473d2", - [] - ], - "coop-rp-in-navigation-chain.https.html.headers": [ - "073ce7adfbd81cb7c0b2f91f96c8349b6677f26c", - [] - ], - "iframe-popup-about-blank.https.window.js.headers": [ - "19d0dbe4e18df8ba52c2a564853f5614a0469b95", - [] - ], - "iframe-popup-to-so.https.html.headers": [ - "d5c99062d2bb8f9660b68c172754867b598ed43f", - [] - ], - "iframe-popup-to-soap.https.html.headers": [ - "d5c99062d2bb8f9660b68c172754867b598ed43f", - [] - ], - "iframe-popup-to-un.https.html.headers": [ - "d5c99062d2bb8f9660b68c172754867b598ed43f", - [] - ], - "iframe-popup.https.html.headers": [ - "d5c99062d2bb8f9660b68c172754867b598ed43f", - [] - ], - "popup-so.https.html.headers": [ - "46ad58d83bf6e98913ca4c564b7acb8f19fa0093", - [] - ], - "popup-soap.https.html.headers": [ - "d83ed86fb9b5d159b9f380424887402edc96cb75", - [] - ], - "popup-un.https.html.headers": [ - "073ce7adfbd81cb7c0b2f91f96c8349b6677f26c", - [] - ], - "popup-with-cross-origin.https.html.headers": [ - "d5c99062d2bb8f9660b68c172754867b598ed43f", - [] - ], - "popup-with-same-origin.https.html.headers": [ - "d5c99062d2bb8f9660b68c172754867b598ed43f", - [] - ], - "popup-with-same-site.https.html.headers": [ - "d5c99062d2bb8f9660b68c172754867b598ed43f", - [] - ], - "reporting-bcg-reuse.https.html.sub.headers": [ - "33abadd83dd9187bfa5ecf811f9fef7058412780", - [] - ], - "reporting-from-rp-ro.https.html.sub.headers": [ - "07ecad96f2493c7ddc70cc5f37d242c07f0cabb1", - [] - ], - "reporting-from-rp.https.html.sub.headers": [ - "a61e2919c8acb6be886ef16e764f1ba5dcabe9bc", - [] - ], - "reporting-to-rp-ro.https.html.headers": [ - "16903320bb50789e0a64f9620540f1cc8c0902fd", - [] - ], - "reporting-to-rp.https.html.headers": [ - "16903320bb50789e0a64f9620540f1cc8c0902fd", - [] - ] - } } }, "document-isolation-policy": { @@ -476387,6 +476871,12 @@ [] ] } + }, + "writing-suggestions": { + "WEB_FEATURES.yml": [ + "4700eca4a12b8b607c16d85ff987a8ef42ac81a3", + [] + ] } }, "the-hidden-attribute": { @@ -476998,7 +477488,7 @@ [] ], "marquee-with-trusted-types-ref.html": [ - "b177f47b757cc278abe79f5b59d9063f6911dbd3", + "5042557212e58741859ad6750543540cff563493", [] ] } @@ -479774,10 +480264,6 @@ "b351c80c273940c8422db8f66da959fb36e962cb", [] ], - "select-multiple-base-appearance-ref.html": [ - "45a74da7559c72ee5840c00842aef4fc23915e0e", - [] - ], "select-only-picker-opt-in-ref.html": [ "67a0abe43f2d1aad0b1d82da8b8cdfc77a25b549", [] @@ -479815,6 +480301,22 @@ [] ] }, + "customizable-select-in-page": { + "customizable-select-in-page-appearance-ref.html": [ + "57ea51e367cfad284ed80e71870698dfed0b26e4", + [] + ], + "resources": { + "customizable-select-in-page.css": [ + "deb080b4756cf51d2ece9d2b132e9fff6ccd6f7c", + [] + ], + "customizable-select-in-page.js": [ + "1323094332135c46297a1df5c9fed1922efe8f4a", + [] + ] + } + }, "reset-algorithm-rendering-ref.html": [ "acf192d1d55b7da110d04651093e3ebe0cd48214", [] @@ -483763,6 +484265,10 @@ }, "system-state-and-capabilities": { "the-navigator-object": { + "WEB_FEATURES.yml": [ + "a1af3e21a48f5941a078209963d1ae7bc379dd59", + [] + ], "resources": { "handler-sw.js": [ "5fd915d17f98d8fa9c3c81451f46d71bc6cd024e", @@ -484806,6 +485312,12 @@ [] ] }, + "emulation": { + "set_geolocation_override.https.html.ini": [ + "7de34991442711cd389fe324dabd6005605268af", + [] + ] + }, "permissions": { "set_permission.https.html.ini": [ "2101196fa2fe436c3f94c5f84451f1746501c84d", @@ -485268,10 +485780,6 @@ "035e1d233d6f5646768b78e878c9db43b84a0068", [] ], - "WebCryptoAPI.idl": [ - "ff7a89cd0d51be01760b9bfdb709393f4db5fd31", - [] - ], "accelerometer.idl": [ "a082224dc88e10e043d86d09cbf981616f6bb9a7", [] @@ -485597,7 +486105,7 @@ [] ], "fedcm.idl": [ - "215f375432e930afb63c26fb9bdc42365ca8c61d", + "5ce2d260f114ddcc25210905ee010a9b96b47410", [] ], "fenced-frame.idl": [ @@ -485689,7 +486197,7 @@ [] ], "image-capture.idl": [ - "21e03d4db8248d469671d8286be877e3ad7dc7b5", + "26cc7fab5cdf1f3209057cf159171961b779dcd5", [] ], "image-resource.idl": [ @@ -485829,7 +486337,7 @@ [] ], "mediastream-recording.idl": [ - "496bfcf2e27da7a7da6c653b8e7f27b702f7386f", + "68c891cdc918e7468de8add96acce35d6d63102f", [] ], "model-element.idl": [ @@ -486121,7 +486629,7 @@ [] ], "turtledove.idl": [ - "b9f50d47885cf9186c9a2dd3c2d08e1dc4054431", + "7f11cdc37908f411280ea6f79eeb759c85acbe62", [] ], "ua-client-hints.idl": [ @@ -486245,13 +486753,17 @@ [] ], "webcodecs.idl": [ - "274ef96578a3d16b9fcda6e817c25e12373ec824", + "3d4db1ed49d316c31005a5be857ad7d48eca378d", [] ], "webcrypto-secure-curves.idl": [ "01bb290b747827bb4e45ea6d0c8f6146e59b01ee", [] ], + "webcrypto.idl": [ + "ff7a89cd0d51be01760b9bfdb709393f4db5fd31", + [] + ], "webdriver.idl": [ "194e2d806adb2131f7cdc56a70a46d7784cb7d75", [] @@ -486265,7 +486777,7 @@ [] ], "webgpu.idl": [ - "de1f7c1e52bc401fed112469595f281736213027", + "4fec46a2557033a941b5da7a7481aa8125696ed2", [] ], "webhid.idl": [ @@ -486281,7 +486793,7 @@ [] ], "webnn.idl": [ - "57f2a4a9890147e24f10e91537a626732db1f617", + "37fcc32501efbeb38c9686a8fc96e1ce062eb30a", [] ], "webrtc-encoded-transform.idl": [ @@ -486337,7 +486849,7 @@ [] ], "webxr-depth-sensing.idl": [ - "9befd640646a132bff680de5f5b0d2edbe199e91", + "7ddbec7cc975dfd1c5be6f05f1a854fffe653e79", [] ], "webxr-dom-overlays.idl": [ @@ -486365,7 +486877,7 @@ [] ], "webxr.idl": [ - "1098000d6c2edae1a36f8e6a035f0c53432207c8", + "874994086a250df0f3c0a0eed03375d9429aeaa9", [] ], "webxrlayers.idl": [ @@ -486380,6 +486892,10 @@ "527c41deb6cda2de79780899d15bc43f02b281db", [] ], + "writing-assistance-apis.idl": [ + "916daee754e3ef992ad8fa282882c88dd9aa0734", + [] + ], "xhr.idl": [ "6ff75fd27741369f9671509998a21aeb9de3761a", [] @@ -494086,7 +494602,7 @@ [] ], "webxr-test.js": [ - "0885b559e6335d7bcd8a539b7d7e03f5843c74a5", + "ce2503b1bbcfbd5c4318c08b49020e9453c4b3a6", [] ], "webxr-test.js.headers": [ @@ -494575,7 +495091,7 @@ [] ], "testdriver.js": [ - "f127e2b2c8d9091a767b1ead849af1d18167070f", + "6e8410b7ea46064438c8d276274b6fbb689f81d2", [] ], "testdriver.js.headers": [ @@ -501392,7 +501908,7 @@ [] ], "requirements_tc.txt": [ - "cb4ba1947784f9b9ba39b3e43237640c7d1e802d", + "ada75c2f761904412048f3525f3010b658d174f9", [] ], "run_tc.py": [ @@ -502011,7 +502527,7 @@ [] ], "requirements_tests.txt": [ - "833fdb3b8761b3d790fcd9bf70ba536bd8dd3251", + "ca00b8f1f9835eea866a0462962b705a63366de6", [] ], "runner": { @@ -512782,7 +513298,7 @@ [] ], "asyncactions.py": [ - "71187ee76d7a1aff4803903a8506cb4dac4a8a04", + "9925a4b511def24fda82522acb5c5f0f9f3e80a1", [] ], "base.py": [ @@ -512814,7 +513330,7 @@ [] ], "executorwebdriver.py": [ - "123c89c98b21e9ec2616c6bfad3d91c5069ee89c", + "87403c2944d57e31c2612871262af9b77ce73235", [] ], "executorwktr.py": [ @@ -512830,7 +513346,7 @@ [] ], "protocol.py": [ - "7630fe1f3580f6cbb3554e89e05ab34c2fa3ee8e", + "833dff45636c7e22697e47cfe692ebecfcf2d76f", [] ], "pytestrunner": { @@ -512945,7 +513461,7 @@ [] ], "testdriver-extra.js": [ - "d83ba4192eb52487bf9265a5c2eea22f21e49c64", + "ab8b04ba3cdfc3d7c351ce99c6289de6e99b8f3e", [] ], "testdriver-vendor.js": [ @@ -515988,7 +516504,7 @@ [] ], "keyframe-tests.js": [ - "2bcce1ecf47f180d7f91a8160ad548e2ad06f5b9", + "34a84f45b20dea524016a6f479e9e0d0f5b7b2e7", [] ], "keyframe-utils.js": [ @@ -518920,7 +519436,7 @@ }, "resources": { "utils.js": [ - "d19cb7cf760f63d60b26f008af7329fad0a568a1", + "50d7911a9181a5139d9e16f7c866112dc54d6d01", [] ], "utils_validation.js": [ @@ -521793,6 +522309,10 @@ "0cc425955374e214cd5dd9bdb75a654c7c69faa9", [] ], + "matchDepthViewValues.js": [ + "597f9734d3fe66c2600c291a643a6d70ec908a25", + [] + ], "pauseResumeTests.js": [ "e7513ef61c13b856ea9e49ff93ad9088e57163b3", [] @@ -550205,14 +550725,14 @@ "ai": { "language_detection": { "detector-iframe.https.html": [ - "3e90d36b5aa63a556b82337cdf7a26410b80ac36", + "ddcf82bec684024f855217c649bb2da6cbd1f577", [ null, {} ] ], "detector-locale.https.window.js": [ - "a1c67db912961d8850bb4a430f92f7be4b450c87", + "80cbfa485e3944ba13de2aec3ba317e2cc84026f", [ "ai/language_detection/detector-locale.https.window.html", { @@ -550226,6 +550746,18 @@ "window" ], [ + "timeout", + "long" + ], + [ + "script", + "resources/util.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ "script", "../resources/util.js" ], @@ -550233,12 +550765,13 @@ "script", "../resources/locale-util.js" ] - ] + ], + "timeout": "long" } ] ], "detector.https.window.js": [ - "e85ea6d249b17d3ed1505f206f5ac6659b6dfd94", + "b0255bc552b0d2f7c71f8567bab9e0102702cd4c", [ "ai/language_detection/detector.https.window.html", { @@ -550252,6 +550785,18 @@ "window" ], [ + "timeout", + "long" + ], + [ + "script", + "resources/util.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ "script", "../resources/util.js" ], @@ -550259,12 +550804,13 @@ "script", "../resources/locale-util.js" ] - ] + ], + "timeout": "long" } ] ], "detector.optional.https.window.js": [ - "7ffa1362dd5f97b68e7c678463dd5afa186d10dc", + "1dd248a9ecab667355702d00e865341122a2ebe2", [ "ai/language_detection/detector.optional.https.window.html", { @@ -550278,10 +550824,23 @@ "window" ], [ + "timeout", + "long" + ], + [ + "script", + "resources/util.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ "script", "../resources/util.js" ] - ] + ], + "timeout": "long" } ] ] @@ -551304,7 +551863,7 @@ ] ], "setSinkId.https.html": [ - "be65f0ac81bc41a89e5085a43124f7ee991fea7b", + "662596910ee9adf94f83d536fe9c67a49db67f4b", [ null, { @@ -571991,7 +572550,7 @@ }, "cookie-store": { "change_eventhandler_for_already_expired.https.window.js": [ - "89d84b13d1b53ec4d424b363ace9b26ed9685685", + "f3bbe0ea560974e9486941384e75a58d2d6a4637", [ "cookie-store/change_eventhandler_for_already_expired.https.window.html", { @@ -572009,7 +572568,7 @@ ] ], "change_eventhandler_for_document_cookie.https.window.js": [ - "82b0f2baa2bb72f51d944e2138ad56f7a170ba7a", + "1937ebdae35942840dc3b641b5907f334048f3fb", [ "cookie-store/change_eventhandler_for_document_cookie.https.window.html", { @@ -572027,7 +572586,7 @@ ] ], "change_eventhandler_for_http_cookie_and_set_cookie_headers.https.window.js": [ - "8f5ef1cabbe7a742115ba81328e40ee789496edd", + "8517995acfe746bbff09243597d6d319e3af1bc2", [ "cookie-store/change_eventhandler_for_http_cookie_and_set_cookie_headers.https.window.html", { @@ -572044,6 +572603,24 @@ } ] ], + "change_eventhandler_for_no_change.https.window.js": [ + "5f9c2927433fc408c70c005789dc0bcc34d46caa", + [ + "cookie-store/change_eventhandler_for_no_change.https.window.html", + { + "script_metadata": [ + [ + "title", + "Cookie Store API: Test that setting a duplicate cookie does not fire a second event." + ], + [ + "script", + "resources/cookie-test-helpers.js" + ] + ] + } + ] + ], "change_eventhandler_for_no_name_and_no_value.https.window.js": [ "4498caf59689cc3da875d1c56937f6d2a235cb5d", [ @@ -580275,14 +580852,14 @@ ] ], "margin-trim-computed.html": [ - "ad2d17f2ef01d2f870a4f07cd3eccb226e4de0f2", + "c38adea9a68e1eeee53e8a42ba9d745546624f88", [ null, {} ] ], "margin-trim.html": [ - "0d92f80b9b96ee409b141487f26cb664ce67f8df", + "e8679f9cbf3fb606c542ae8ccc653e0b90b96bbc", [ null, {} @@ -584169,7 +584746,7 @@ ] ], "linear-timing-functions-syntax.html": [ - "0c949e9ea7dc50c86cd6877da1a10f7b2ba01625", + "408264b58dfe41dd7744d20419bae3a5fc7fd3eb", [ null, {} @@ -584183,7 +584760,7 @@ ] ], "step-timing-functions-syntax.html": [ - "4e8b21e4413f8000ae584396355ed7df1c44a447", + "e8465ff7a3304184046f7eb81f93d51a61c19dad", [ null, {} @@ -587335,7 +587912,7 @@ ] ], "font-palette-values-invalid.html": [ - "a3a0a88ba68c8fcc1f8b00054d7b12bc08d4b7af", + "32c9c4c5efeec345c24261b7bb0aa237f11d25e0", [ null, {} @@ -587756,7 +588333,7 @@ ] ], "test_font_feature_values_parsing.html": [ - "7a5844d56008eae798652b59a335d08d24b34032", + "08c20142449646123ebdecde6f023511b45feed4", [ null, {} @@ -595361,6 +595938,15 @@ } ] ], + "scroll-button-display-none.html": [ + "8b3068be6dad6d1ccbe1134b9833ecc1c8b0f594", + [ + null, + { + "testdriver": true + } + ] + ], "scroll-button-hover-remove.html": [ "af000012b4ec605fb0e30a34e50bc02119a9b925", [ @@ -595959,7 +596545,7 @@ ] ], "overscroll-behavior-root.html": [ - "a116ead01b71db7b72bfd483b10b35b2e83ea1b8", + "71c5f6573d6f31f1ef872c09302063919597d8da", [ null, { @@ -600437,6 +601023,13 @@ {} ] ], + "host-part-nesting.html": [ + "c0dc8e20eee9ab3fda124ef99cb7623146b8a321", + [ + null, + {} + ] + ], "host-stylesheet.html": [ "2e65c4b1b57bd9959c68e85e11b442c67f2c5a42", [ @@ -613595,6 +614188,13 @@ {} ] ], + "run_in_parallel.html": [ + "1afdae2be9d8092953746d360d2a77ea1a538ba1", + [ + null, + {} + ] + ], "start-view-transition.html": [ "a1bc95891956e6678c8ee2ecd51be7d6e94b70ca", [ @@ -622664,6 +623264,13 @@ ] ], "non-cancelable-when-passive": { + "generic-events-stay-cancelable.html": [ + "961794728d3799a2096bad18dd60e79f619533a4", + [ + null, + {} + ] + ], "non-passive-mousewheel-event-listener-on-body.html": [ "5574fe0acbcccb64ff05213fa518c49d4149e7e4", [ @@ -626771,7 +627378,7 @@ ] ], "XMLSerializer-serializeToString.html": [ - "c3b704bf18825c27e74c5db8177fa178925c9b26", + "6c294e464a5dc787abd4d10281ab2fe0555a0a3c", [ null, {} @@ -626875,6 +627482,13 @@ {} ] ], + "xml-parse-serialize-roundtrip.html": [ + "5195b9f04b5dd9f47937a5d11d2e82f09fdb9204", + [ + null, + {} + ] + ], "xml-serialization.xhtml": [ "852bbcc9fd1b1c91fd544dfc2fc462efc1195a4a", [ @@ -630433,7 +631047,7 @@ ] ], "selection-change-not-fired-if-selection-set-to-root.html": [ - "39e8b46e69b2c469b4b5d4ed40314bd67a2b3524", + "cac621ad3cdd3b1b8c9fcbbdf09cac739f9756ff", [ null, { @@ -669027,7 +669641,7 @@ ] ], "generate-bid-browser-signals.https.window.js": [ - "e472fccdc4da37c1a2cebb80921809cab5788b54", + "ee0cdd84efa4a3307bb674015c3eb5a8211fe962", [ "fledge/tentative/generate-bid-browser-signals.https.window.html?1-4", { @@ -669086,7 +669700,15 @@ ], [ "variant", - "?29-last" + "?29-32" + ], + [ + "variant", + "?33-36" + ], + [ + "variant", + "?37-last" ] ], "timeout": "long" @@ -669150,7 +669772,15 @@ ], [ "variant", - "?29-last" + "?29-32" + ], + [ + "variant", + "?33-36" + ], + [ + "variant", + "?37-last" ] ], "timeout": "long" @@ -669214,7 +669844,15 @@ ], [ "variant", - "?29-last" + "?29-32" + ], + [ + "variant", + "?33-36" + ], + [ + "variant", + "?37-last" ] ], "timeout": "long" @@ -669278,7 +669916,15 @@ ], [ "variant", - "?29-last" + "?29-32" + ], + [ + "variant", + "?33-36" + ], + [ + "variant", + "?37-last" ] ], "timeout": "long" @@ -669342,14 +669988,94 @@ ], [ "variant", - "?29-last" + "?29-32" + ], + [ + "variant", + "?33-36" + ], + [ + "variant", + "?37-last" + ] + ], + "timeout": "long" + } + ], + [ + "fledge/tentative/generate-bid-browser-signals.https.window.html?29-32", + { + "script_metadata": [ + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/common/utils.js" + ], + [ + "script", + "resources/fledge-util.sub.js" + ], + [ + "script", + "/common/subset-tests.js" + ], + [ + "timeout", + "long" + ], + [ + "variant", + "?1-4" + ], + [ + "variant", + "?5-8" + ], + [ + "variant", + "?9-12" + ], + [ + "variant", + "?13-16" + ], + [ + "variant", + "?17-20" + ], + [ + "variant", + "?21-24" + ], + [ + "variant", + "?25-28" + ], + [ + "variant", + "?29-32" + ], + [ + "variant", + "?33-36" + ], + [ + "variant", + "?37-last" ] ], "timeout": "long" } ], [ - "fledge/tentative/generate-bid-browser-signals.https.window.html?29-last", + "fledge/tentative/generate-bid-browser-signals.https.window.html?33-36", { "script_metadata": [ [ @@ -669406,7 +670132,87 @@ ], [ "variant", - "?29-last" + "?29-32" + ], + [ + "variant", + "?33-36" + ], + [ + "variant", + "?37-last" + ] + ], + "timeout": "long" + } + ], + [ + "fledge/tentative/generate-bid-browser-signals.https.window.html?37-last", + { + "script_metadata": [ + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/common/utils.js" + ], + [ + "script", + "resources/fledge-util.sub.js" + ], + [ + "script", + "/common/subset-tests.js" + ], + [ + "timeout", + "long" + ], + [ + "variant", + "?1-4" + ], + [ + "variant", + "?5-8" + ], + [ + "variant", + "?9-12" + ], + [ + "variant", + "?13-16" + ], + [ + "variant", + "?17-20" + ], + [ + "variant", + "?21-24" + ], + [ + "variant", + "?25-28" + ], + [ + "variant", + "?29-32" + ], + [ + "variant", + "?33-36" + ], + [ + "variant", + "?37-last" ] ], "timeout": "long" @@ -669470,7 +670276,15 @@ ], [ "variant", - "?29-last" + "?29-32" + ], + [ + "variant", + "?33-36" + ], + [ + "variant", + "?37-last" ] ], "timeout": "long" @@ -669534,7 +670348,15 @@ ], [ "variant", - "?29-last" + "?29-32" + ], + [ + "variant", + "?33-36" + ], + [ + "variant", + "?37-last" ] ], "timeout": "long" @@ -717289,342 +718111,6 @@ } ] ] - }, - "restrict-properties": { - "access-reporting-closed.https.html": [ - "1c315b35d7fa81188aabf59c1c3196a5d5d2a2ea", - [ - null, - {} - ] - ], - "access-reporting-openee-rp-ro.https.html": [ - "7a96f4f5762721378036b47d248c3ae1ef21dd2f", - [ - null, - { - "timeout": "long" - } - ] - ], - "access-reporting-opener-rp-ro.https.html": [ - "9e1e85b16a5876c3e78656b8300c2fcc9e3e3ab1", - [ - null, - { - "timeout": "long" - } - ] - ], - "access-reporting-post-message.https.html": [ - "5bc718e2a89a28a6867e83c0d85bc0cedefe39f6", - [ - null, - {} - ] - ], - "coop-rp-in-navigation-chain.https.html": [ - "e5c877517488f755e08f69233439a817dd444164", - [ - null, - { - "timeout": "long" - } - ] - ], - "iframe-popup-about-blank.https.window.js": [ - "1247400a4e37d2f6bd52b2731c2a3eb7f84a7185", - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-about-blank.https.window.html", - { - "script_metadata": [ - [ - "script", - "/common/get-host-info.sub.js" - ], - [ - "script", - "/common/utils.js" - ], - [ - "script", - "/common/dispatcher/dispatcher.js" - ] - ] - } - ] - ], - "iframe-popup-to-so.https.html": [ - "8cf2679e190129e91de8e2af4ceef5b064fedba4", - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html?1-1", - { - "timeout": "long" - } - ], - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html?2-2", - { - "timeout": "long" - } - ], - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html?3-3", - { - "timeout": "long" - } - ], - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html?4-4", - { - "timeout": "long" - } - ], - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html?5-5", - { - "timeout": "long" - } - ], - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html?6-6", - { - "timeout": "long" - } - ], - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html?7-7", - { - "timeout": "long" - } - ], - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html?8-8", - { - "timeout": "long" - } - ], - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html?9-last", - { - "timeout": "long" - } - ] - ], - "iframe-popup-to-soap.https.html": [ - "f3af3ca7db1bad6506fef6b519c8f244d2080d0e", - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html?1-2", - { - "timeout": "long" - } - ], - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html?3-4", - { - "timeout": "long" - } - ], - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html?5-6", - { - "timeout": "long" - } - ], - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html?7-8", - { - "timeout": "long" - } - ], - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html?9-last", - { - "timeout": "long" - } - ] - ], - "iframe-popup-to-un.https.html": [ - "560dfd90511dca11a8b5f4fb30d88beb093c538a", - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html?1-2", - { - "timeout": "long" - } - ], - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html?3-4", - { - "timeout": "long" - } - ], - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html?5-6", - { - "timeout": "long" - } - ], - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html?7-8", - { - "timeout": "long" - } - ], - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html?9-last", - { - "timeout": "long" - } - ] - ], - "iframe-popup.https.html": [ - "17840724d9e342aa52cdcc474356b25d554dfd63", - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html?1-2", - { - "timeout": "long" - } - ], - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html?3-4", - { - "timeout": "long" - } - ], - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html?5-6", - { - "timeout": "long" - } - ], - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html?7-8", - { - "timeout": "long" - } - ], - [ - "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html?9-last", - { - "timeout": "long" - } - ] - ], - "named_targeting.https.html": [ - "10929847ee64d1f47e78b1c34af55c963871c055", - [ - null, - {} - ] - ], - "popup-so.https.html": [ - "e5313a6e222d5b7671747516b8d056fda7e9db8b", - [ - null, - { - "timeout": "long" - } - ] - ], - "popup-soap.https.html": [ - "595a10a84bbc9c23ba609411e84f5e0bf107e6ac", - [ - null, - { - "timeout": "long" - } - ] - ], - "popup-u.https.html": [ - "595a10a84bbc9c23ba609411e84f5e0bf107e6ac", - [ - null, - { - "timeout": "long" - } - ] - ], - "popup-un.https.html": [ - "595a10a84bbc9c23ba609411e84f5e0bf107e6ac", - [ - null, - { - "timeout": "long" - } - ] - ], - "popup-with-cross-origin.https.html": [ - "a84d52584e9b4fbd6a9a35e5472c5a990fdf2351", - [ - null, - { - "timeout": "long" - } - ] - ], - "popup-with-same-origin.https.html": [ - "c0020fa23a478fd75aa27b69edb95c84f3e3789a", - [ - null, - { - "timeout": "long" - } - ] - ], - "popup-with-same-site.https.html": [ - "7d115ac7e639a53c76f6bc1b7b7c9210d8d6bf89", - [ - null, - { - "timeout": "long" - } - ] - ], - "reporting-bcg-reuse.https.html": [ - "9bc171a269c5284de80cad871baafd58fb297da0", - [ - null, - { - "timeout": "long" - } - ] - ], - "reporting-from-rp-ro.https.html": [ - "b89030f218ffeb79da7269f70a3432f79700e95a", - [ - null, - { - "timeout": "long" - } - ] - ], - "reporting-from-rp.https.html": [ - "6b31f7e0098da78db34e91ba179ac1ef86e3035d", - [ - null, - { - "timeout": "long" - } - ] - ], - "reporting-to-rp-ro.https.html": [ - "c47e59cd8f1aeac7ee6b1dbe2177595730148a38", - [ - null, - { - "timeout": "long" - } - ] - ], - "reporting-to-rp.https.html": [ - "ff60e8c5afda67ff3ca1573dab5405769b2b2cc3", - [ - null, - { - "timeout": "long" - } - ] - ] } } }, @@ -732964,6 +733450,26 @@ ] ] }, + "customizable-select-in-page": { + "customizable-select-in-page-keyboard-behavior.tentative.html": [ + "24e6e39ea48236fc7b72604860913247b5f5f05c", + [ + null, + { + "testdriver": true + } + ] + ], + "customizable-select-in-page-mouse-behavior.tentative.html": [ + "d5b93693cf7d65b1202f459223a8cf6b8cff581a", + [ + null, + { + "testdriver": true + } + ] + ] + }, "inserted-or-removed.html": [ "0db2bf0e77a4a8a76ebcef1b0879cac9bb8c3fea", [ @@ -733685,7 +734191,7 @@ ] ], "dialog-focusability.html": [ - "1e000866099c7044ce07fc812229293f645c2f27", + "5afb407640b7d2ee1487454464df9adb41419a8a", [ null, { @@ -733795,7 +734301,7 @@ ] ], "dialog-requestclose.html": [ - "9a9c87167d5eaf93bd31c1f979450415dd9fba0d", + "6555f1b43bd399cc4e885f80a3a9cbee1dd752dc", [ null, { @@ -741574,6 +742080,13 @@ {} ] ], + "serializing-cdata-in-html-document.html": [ + "b2366285a41d946324981e771bfbfe2b157606f5", + [ + null, + {} + ] + ], "serializing-lt-gt.tentative.html": [ "6c74b443a838267be7f0d2ad8a8a80964c57209f", [ @@ -747382,6 +747895,20 @@ ] ] }, + "emulation": { + "set_geolocation_override.https.html": [ + "5cbcf546423c772a98fd3725531754c366ab7b91", + [ + null, + { + "testdriver": true, + "testdriver_features": [ + "bidi" + ] + } + ] + ] + }, "permissions": { "set_permission.https.html": [ "5b05e2374e2b4b451a0f98eabd36a6e72a03f933", @@ -756027,7 +756554,7 @@ ] ], "MediaDevices-enumerateDevices-per-origin-ids.sub.https.html": [ - "714355f5c1c0b2fe37cff162c7be6240540cc0e2", + "467cf5d50c71c28675e87445ec311df53815a100", [ null, { @@ -768929,7 +769456,7 @@ ] ], "pointerevent_pointerout_no_pointer_movement.html": [ - "856f2ce37cec59f70dc1a9ad4d3fe0436da3e4cd", + "1af166593266f671b1b4705e1911e46eb4c4b990", [ null, { @@ -787717,7 +788244,7 @@ ] ], "fieldset-source.html": [ - "d75f30e664e325f4e43277b4036da0cbb157a990", + "cdd2e0be40c87d0cb932a341c9f2f9bf842f96b8", [ null, {} @@ -793943,7 +794470,7 @@ ] ], "form.html": [ - "a4a5f37283848efcdb99b50b3aebb23df3235fe5", + "5ab144b05ed130409a09c116fcceecfc57cfaab5", [ null, { @@ -796397,8 +796924,8 @@ {} ] ], - "clear-prefetch-cache-after-clear-site-data-cache.https.html": [ - "c5796e48b768868f084ae5ad97a63fca5abf6992", + "clear-prefetch-cache-after-clear-site-data-cache.tentative.https.html": [ + "48f6264e852b0e32e6be06367e16b27f7cc6d14b", [ null, {} @@ -797364,8 +797891,8 @@ } ] ], - "cancel-prerendering-after-clear-site-data-cache-different-origins.https.html": [ - "34b77f8bc47346ecaac9e6f42856d2c5dcd66daf", + "cancel-prerendering-after-clear-site-data-cache-different-origins.tentative.https.html": [ + "db52e758750f2757f722c025e3accf6fce13a9cc", [ null, { @@ -797373,8 +797900,8 @@ } ] ], - "cancel-prerendering-after-clear-site-data-cache-same-origin.https.html": [ - "cb253d45eaa8f70da33b3bfb13f222280058e9b7", + "cancel-prerendering-after-clear-site-data-cache-same-origin.tentative.https.html": [ + "23d862c5130139bc5e20242e73cb8d2e4a93e332", [ null, { @@ -806073,7 +806600,7 @@ ], "crashtests": { "garbage-collection.any.js": [ - "b2ba5cd4c27e9120a9e69c358e6ff5be31b107fd", + "cf10f7f2e8317ed16dd5fe3a967c6f26efd0a335", [ "streams/readable-streams/crashtests/garbage-collection.any.html", { @@ -814625,6 +815152,13 @@ ] }, "embedded": { + "attr-image-fetchpriority.html": [ + "b083538a8b8ba723347860dda97afecadd1283ee", + [ + null, + {} + ] + ], "image-crossorigin.sub.html": [ "531512ec168003a55bd687b1b8db010e161f1b0e", [ @@ -814928,6 +815462,33 @@ ] ], "interact": { + "focus-inside-hidden-svg-containers-01.html": [ + "25765c5b93e66b597c3e66a3083e40e298491cb2", + [ + null, + { + "testdriver": true + } + ] + ], + "focus-inside-hidden-svg-containers-02.html": [ + "fd9fd34275d0784d82ec0ef847b295c3ad93bcca", + [ + null, + { + "testdriver": true + } + ] + ], + "focus-inside-hidden-svg-containers-03.html": [ + "097cff57b5ac8296f2e528f96e5333a7370e9722", + [ + null, + { + "testdriver": true + } + ] + ], "inheritance.svg": [ "e67f19ed43529af5e34683b6853ae870435be014", [ @@ -815805,6 +816366,13 @@ ] }, "scripted": { + "attr-script-fetchpriority.html": [ + "2f73e1e59a8a450d0a1ad74e45cbb6d25c70bf4a", + [ + null, + {} + ] + ], "script-invalid-script-type.html": [ "9602dd525bd4d2b77b8d4ffadebef9e568a98c77", [ @@ -822779,7 +823347,7 @@ }, "viewport": { "viewport-segments.html": [ - "64f0eb9caefb0b862faabcfe0ab23df52c00735d", + "cd24f2bd230b6ce60da9fd230554856ae43d6b64", [ null, {} @@ -822806,7 +823374,7 @@ ] ], "viewport-segments-segments-property.https.html": [ - "852e49fa7fecea5badf92dfafb6befa49800dd39", + "e6c9d8b4e169ad061ae7aef5ca270894dbb1db2c", [ null, { @@ -849414,7 +849982,7 @@ "webnn": { "conformance_tests": { "abs.https.any.js": [ - "fcf144200f665b7f9370c2c3f0867f6cfc80a059", + "de6a5761df443ab6977ee3a61afc764eedd31c2c", [ "webnn/conformance_tests/abs.https.any.html?cpu", { @@ -850674,7 +851242,7 @@ ] ], "concat.https.any.js": [ - "0208e2ec605387a8d4dac040b64a1465b61d6848", + "d41921720463d388eeb0e152b30e04d8246b40b0", [ "webnn/conformance_tests/concat.https.any.html?cpu", { @@ -856317,7 +856885,7 @@ ] ], "neg.https.any.js": [ - "c03afc52516e3e59bd84c500afbbefe6ef7ce7cf", + "8bc10475453e24ce6e7d4049d5470b21d8e7b147", [ "webnn/conformance_tests/neg.https.any.html?cpu", { @@ -857418,7 +857986,7 @@ ] ], "qdq_subgraph.https.any.js": [ - "8f6f2246b04f8a6fc9570eced30b31b841da5a06", + "3b59c3bb49d6441a77e83309f48a97dd982aea74", [ "webnn/conformance_tests/qdq_subgraph.https.any.html?cpu", { @@ -859185,7 +859753,7 @@ ] ], "relu.https.any.js": [ - "16cc2a3fa67b4ffa77f2555b94e91d8d398e87ff", + "63ef9fa9ff09d41d60a228b79b20fd29ff911a21", [ "webnn/conformance_tests/relu.https.any.html?cpu", { @@ -861648,7 +862216,7 @@ ] ], "sub.https.any.js": [ - "2f2fadf7282185eb92cbd7961ab3f1e9d35fd5a3", + "85b15f5a00051c0ece94f6202150c0b93b23260f", [ "webnn/conformance_tests/sub.https.any.html?cpu", { @@ -878590,7 +879158,7 @@ ] ], "RTCConfiguration-iceServers.html": [ - "aa66bfbb2bfff0febc9404e4b73e0637a3226a70", + "bc7831361ab5f417b46a507b0e5977bef9bedd49", [ null, {} @@ -878841,7 +879409,7 @@ ] ], "RTCPeerConnection-addTransceiver.https.html": [ - "3fd83a76fe2f687114de006bc877bc915a1809be", + "62df4293067e554dee9328f3f4f03556dedcdb10", [ null, {} @@ -880814,7 +881382,7 @@ ] ], "supported-stats.https.html": [ - "677736f3cd8f33963c53d4fa9bee0c52f4826a5f", + "81aef5f94b90da1ee83de617ecabf0d3e11ad21d", [ null, { @@ -897009,6 +897577,13 @@ {} ] ], + "depth_sensing_cpu_matchDepthViewIdentity.https.html": [ + "f3256106e904b2b66291834197a80a4537c3c682", + [ + null, + {} + ] + ], "depth_sensing_cpu_pauseResume.https.html": [ "47469f4a0ea186e981843db8c00a1d72bc938907", [ @@ -897074,6 +897649,13 @@ {} ] ], + "depth_sensing_gpu_matchDepthViewIdentity.https.html": [ + "1813ddd449ec40a9722d38795b23c3397e02dc16", + [ + null, + {} + ] + ], "depth_sensing_gpu_pauseResume.https.html": [ "d51edb8cd3b85192fc5904df9f488e7c32356080", [ @@ -926325,7 +926907,7 @@ ] ], "user_prompt_closed.py": [ - "fdb9e8b3ca7d5cc642ec69517f065887b16cdc24", + "8322829ebaf078152fd1874773ce0d110a0aac8e", [ null, {} @@ -926348,7 +926930,7 @@ ] ], "user_prompt_opened.py": [ - "c24128004f73a8b09a61991837b1dad103f91789", + "a9051f662c8124b6ee4a8c1fc657a5a1aaf2a2b9", [ null, {} @@ -926373,7 +926955,7 @@ ] ], "invalid.py": [ - "79241287fbc2b9a0dbd3c48e455d938e6bce7ad0", + "e804848e0be6c483340dcd8b3b4def10dddedce9", [ null, {} @@ -926825,7 +927407,7 @@ ] ], "before_request_sent_cached.py": [ - "9483a707eab1d4caa561a193d641611cf92ffa2e", + "e8119d29d9e259208a11bed7c330a9ecbca49886", [ null, {} diff --git a/tests/wpt/meta/WebCryptoAPI/idlharness.https.any.js.ini b/tests/wpt/meta/WebCryptoAPI/idlharness.https.any.js.ini new file mode 100644 index 00000000000..88bb87548ec --- /dev/null +++ b/tests/wpt/meta/WebCryptoAPI/idlharness.https.any.js.ini @@ -0,0 +1,8 @@ +[idlharness.https.any.html] + [idl_test setup] + expected: FAIL + + +[idlharness.https.any.worker.html] + [idl_test setup] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-static-position-003.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-static-position-003.html.ini new file mode 100644 index 00000000000..2f9fddf138a --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/align-self-static-position-003.html.ini @@ -0,0 +1,2 @@ +[align-self-static-position-003.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-static-position-004.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-static-position-004.html.ini new file mode 100644 index 00000000000..f268ef7e7a6 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/align-self-static-position-004.html.ini @@ -0,0 +1,2 @@ +[align-self-static-position-004.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-static-position-006.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-static-position-006.html.ini new file mode 100644 index 00000000000..07f1806f326 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/align-self-static-position-006.html.ini @@ -0,0 +1,2 @@ +[align-self-static-position-006.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-static-position-007.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-static-position-007.html.ini new file mode 100644 index 00000000000..d5abf6545c2 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/align-self-static-position-007.html.ini @@ -0,0 +1,2 @@ +[align-self-static-position-007.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-static-position-008.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-static-position-008.html.ini new file mode 100644 index 00000000000..bfeba12b70e --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/align-self-static-position-008.html.ini @@ -0,0 +1,2 @@ +[align-self-static-position-008.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-stretch-auto-margins-aspect-ratio.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-stretch-auto-margins-aspect-ratio.html.ini new file mode 100644 index 00000000000..6094b40bf56 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/align-self-stretch-auto-margins-aspect-ratio.html.ini @@ -0,0 +1,2 @@ +[align-self-stretch-auto-margins-aspect-ratio.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-stretch-auto-margins.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-stretch-auto-margins.html.ini new file mode 100644 index 00000000000..cfef366e7b3 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/align-self-stretch-auto-margins.html.ini @@ -0,0 +1,2 @@ +[align-self-stretch-auto-margins.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/justify-self-stretch-auto-margins-aspect-ratio.html.ini b/tests/wpt/meta/css/css-align/abspos/justify-self-stretch-auto-margins-aspect-ratio.html.ini new file mode 100644 index 00000000000..bfba165e645 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/justify-self-stretch-auto-margins-aspect-ratio.html.ini @@ -0,0 +1,2 @@ +[justify-self-stretch-auto-margins-aspect-ratio.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-align/abspos/justify-self-stretch-auto-margins.html.ini b/tests/wpt/meta/css/css-align/abspos/justify-self-stretch-auto-margins.html.ini new file mode 100644 index 00000000000..75934b08795 --- /dev/null +++ b/tests/wpt/meta/css/css-align/abspos/justify-self-stretch-auto-margins.html.ini @@ -0,0 +1,2 @@ +[justify-self-stretch-auto-margins.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-box/parsing/margin-trim-computed.html.ini b/tests/wpt/meta/css/css-box/parsing/margin-trim-computed.html.ini index 790872b29d0..ee2b86f6368 100644 --- a/tests/wpt/meta/css/css-box/parsing/margin-trim-computed.html.ini +++ b/tests/wpt/meta/css/css-box/parsing/margin-trim-computed.html.ini @@ -46,3 +46,21 @@ [Property margin-trim value 'inline-start inline-end block-start'] expected: FAIL + + [Property margin-trim value 'block-start inline-start block-end inline-end'] + expected: FAIL + + [Property margin-trim value 'block-start block-end inline-end inline-start'] + expected: FAIL + + [Property margin-trim value 'block-start block-end inline-start inline-end'] + expected: FAIL + + [Property margin-trim value 'inline-start block-end block-start inline-end'] + expected: FAIL + + [Property margin-trim value 'inline-start inline-end block-start block-end'] + expected: FAIL + + [Property margin-trim value 'inline-end block-end inline-start block-start'] + expected: FAIL diff --git a/tests/wpt/meta/css/css-box/parsing/margin-trim.html.ini b/tests/wpt/meta/css/css-box/parsing/margin-trim.html.ini index cd977b53207..b75bfe7845a 100644 --- a/tests/wpt/meta/css/css-box/parsing/margin-trim.html.ini +++ b/tests/wpt/meta/css/css-box/parsing/margin-trim.html.ini @@ -43,3 +43,21 @@ [e.style['margin-trim'\] = "inline-end block-end inline-start block-start" should set the property value] expected: FAIL + + [e.style['margin-trim'\] = "block inline" should set the property value] + expected: FAIL + + [e.style['margin-trim'\] = "inline block" should set the property value] + expected: FAIL + + [e.style['margin-trim'\] = "block-start block-end inline-end inline-start" should set the property value] + expected: FAIL + + [e.style['margin-trim'\] = "block-start block-end inline-start inline-end" should set the property value] + expected: FAIL + + [e.style['margin-trim'\] = "inline-start block-end block-start inline-end" should set the property value] + expected: FAIL + + [e.style['margin-trim'\] = "inline-start inline-end block-start block-end" should set the property value] + expected: FAIL diff --git a/tests/wpt/meta/css/css-fonts/parsing/font-palette-values-invalid.html.ini b/tests/wpt/meta/css/css-fonts/parsing/font-palette-values-invalid.html.ini index 86c285fb78a..0d491bce6a4 100644 --- a/tests/wpt/meta/css/css-fonts/parsing/font-palette-values-invalid.html.ini +++ b/tests/wpt/meta/css/css-fonts/parsing/font-palette-values-invalid.html.ini @@ -73,3 +73,6 @@ [CSS Fonts Module Level 4: parsing @font-palette-values 25] expected: FAIL + + [sibling-index() is invalid in base-palette descriptor] + expected: FAIL diff --git a/tests/wpt/meta/css/css-fonts/test_font_feature_values_parsing.html.ini b/tests/wpt/meta/css/css-fonts/test_font_feature_values_parsing.html.ini index 6b1969e3049..b0922321d1f 100644 --- a/tests/wpt/meta/css/css-fonts/test_font_feature_values_parsing.html.ini +++ b/tests/wpt/meta/css/css-fonts/test_font_feature_values_parsing.html.ini @@ -316,3 +316,6 @@ [basic parse tests - @font-feature-values bongo { @styleset { complex\\ blah: 1; } }] expected: FAIL + + [basic parse tests - @font-feature-values bongo { @stylistic { blah: sibling-index(); } }] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-001.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-001.html.ini new file mode 100644 index 00000000000..09b5c2407df --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-001.html.ini @@ -0,0 +1,2 @@ +[multicol-gap-decorations-001.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-002.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-002.html.ini new file mode 100644 index 00000000000..d3d6008a74d --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-002.html.ini @@ -0,0 +1,2 @@ +[multicol-gap-decorations-002.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-003.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-003.html.ini new file mode 100644 index 00000000000..be28f9f62c3 --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-003.html.ini @@ -0,0 +1,2 @@ +[multicol-gap-decorations-003.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-004.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-004.html.ini new file mode 100644 index 00000000000..f2c19d9824a --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-004.html.ini @@ -0,0 +1,2 @@ +[multicol-gap-decorations-004.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-005.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-005.html.ini new file mode 100644 index 00000000000..e63a9af4a63 --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-005.html.ini @@ -0,0 +1,2 @@ +[multicol-gap-decorations-005.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-006.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-006.html.ini new file mode 100644 index 00000000000..e9fd7c8f430 --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-006.html.ini @@ -0,0 +1,2 @@ +[multicol-gap-decorations-006.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-007.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-007.html.ini new file mode 100644 index 00000000000..f0da110b11d --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-007.html.ini @@ -0,0 +1,2 @@ +[multicol-gap-decorations-007.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-008.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-008.html.ini new file mode 100644 index 00000000000..fecb739fed1 --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-008.html.ini @@ -0,0 +1,2 @@ +[multicol-gap-decorations-008.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-009.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-009.html.ini new file mode 100644 index 00000000000..15809ab6be8 --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-009.html.ini @@ -0,0 +1,2 @@ +[multicol-gap-decorations-009.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-010.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-010.html.ini new file mode 100644 index 00000000000..087a090d25e --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-010.html.ini @@ -0,0 +1,2 @@ +[multicol-gap-decorations-010.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-011.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-011.html.ini new file mode 100644 index 00000000000..39cd43f8d3f --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-011.html.ini @@ -0,0 +1,2 @@ +[multicol-gap-decorations-011.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-012.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-012.html.ini new file mode 100644 index 00000000000..c60637403c8 --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-012.html.ini @@ -0,0 +1,2 @@ +[multicol-gap-decorations-012.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-013.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-013.html.ini new file mode 100644 index 00000000000..319ec1ea8c7 --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-013.html.ini @@ -0,0 +1,2 @@ +[multicol-gap-decorations-013.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-014.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-014.html.ini new file mode 100644 index 00000000000..7baae0182e4 --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-014.html.ini @@ -0,0 +1,2 @@ +[multicol-gap-decorations-014.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 new file mode 100644 index 00000000000..efff2a2620a --- /dev/null +++ b/tests/wpt/meta/css/css-grid/alignment/grid-content-alignment-with-abspos-001.html.ini @@ -0,0 +1,3 @@ +[grid-content-alignment-with-abspos-001.html] + [.grid 1] + expected: FAIL diff --git a/tests/wpt/meta/css/css-grid/grid-items/replaced-element-016.tentative.html.ini b/tests/wpt/meta/css/css-grid/grid-items/replaced-element-016.tentative.html.ini new file mode 100644 index 00000000000..39f8cc21286 --- /dev/null +++ b/tests/wpt/meta/css/css-grid/grid-items/replaced-element-016.tentative.html.ini @@ -0,0 +1,2 @@ +[replaced-element-016.tentative.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-grid/grid-items/replaced-element-017.tentative.html.ini b/tests/wpt/meta/css/css-grid/grid-items/replaced-element-017.tentative.html.ini new file mode 100644 index 00000000000..77a110a0e75 --- /dev/null +++ b/tests/wpt/meta/css/css-grid/grid-items/replaced-element-017.tentative.html.ini @@ -0,0 +1,2 @@ +[replaced-element-017.tentative.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-sizing/intrinsic-percent-replaced-030.tentative.html.ini b/tests/wpt/meta/css/css-sizing/intrinsic-percent-replaced-030.tentative.html.ini new file mode 100644 index 00000000000..1a4d7b6af62 --- /dev/null +++ b/tests/wpt/meta/css/css-sizing/intrinsic-percent-replaced-030.tentative.html.ini @@ -0,0 +1,2 @@ +[intrinsic-percent-replaced-030.tentative.html] + expected: FAIL diff --git a/tests/wpt/meta/domparsing/XMLSerializer-serializeToString.html.ini b/tests/wpt/meta/domparsing/XMLSerializer-serializeToString.html.ini index dda18d32621..ad2c6663e6c 100644 --- a/tests/wpt/meta/domparsing/XMLSerializer-serializeToString.html.ini +++ b/tests/wpt/meta/domparsing/XMLSerializer-serializeToString.html.ini @@ -67,3 +67,6 @@ [Check if a prefix bound to an empty namespace URI ("no namespace") serialize] expected: FAIL + + [Drop inconsistent xmlns="..." by matching on local name] + expected: FAIL diff --git a/tests/wpt/meta/domparsing/xml-parse-serialize-roundtrip.html.ini b/tests/wpt/meta/domparsing/xml-parse-serialize-roundtrip.html.ini new file mode 100644 index 00000000000..5424089439f --- /dev/null +++ b/tests/wpt/meta/domparsing/xml-parse-serialize-roundtrip.html.ini @@ -0,0 +1,6 @@ +[xml-parse-serialize-roundtrip.html] + [DOMParser and XMLSerializer should round trip with CDATA sections: large CDATA] + expected: FAIL + + [DOMParser and XMLSerializer should round trip with CDATA sections: multiple CDATAs] + expected: FAIL diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/cross-document-nav-cross-document-nav.html.ini b/tests/wpt/meta/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/cross-document-nav-cross-document-nav.html.ini new file mode 100644 index 00000000000..407f9d191c7 --- /dev/null +++ b/tests/wpt/meta/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/cross-document-nav-cross-document-nav.html.ini @@ -0,0 +1,3 @@ +[cross-document-nav-cross-document-nav.html] + [cross-document navigation then cross-document navigation] + expected: FAIL diff --git a/tests/wpt/meta/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types.html.ini b/tests/wpt/meta/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types.html.ini new file mode 100644 index 00000000000..ad3b45255f4 --- /dev/null +++ b/tests/wpt/meta/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types.html.ini @@ -0,0 +1,2 @@ +[marquee-with-trusted-types.html] + expected: FAIL diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini index 841bafc6eca..26704422bbe 100644 --- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini +++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini @@ -1,3 +1,4 @@ [iframe_sandbox_popups_escaping-2.html] + expected: TIMEOUT [Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used] - expected: FAIL + expected: TIMEOUT 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/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini index d89a1691435..d5fd800f09d 100644 --- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini +++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini @@ -1,4 +1,4 @@ [iframe_sandbox_popups_nonescaping-3.html] expected: TIMEOUT [Check that popups from a sandboxed iframe do not escape the sandbox] - expected: FAIL + expected: NOTRUN diff --git a/tests/wpt/meta/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance.tentative.html.ini b/tests/wpt/meta/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance.tentative.html.ini new file mode 100644 index 00000000000..8458e10e93e --- /dev/null +++ b/tests/wpt/meta/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance.tentative.html.ini @@ -0,0 +1,2 @@ +[customizable-select-in-page-appearance.tentative.html] + expected: FAIL diff --git a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/blob-url.any.js.ini b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/blob-url.any.js.ini index 8dba4e9c469..bdba8dadafa 100644 --- a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/blob-url.any.js.ini +++ b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/blob-url.any.js.ini @@ -15,3 +15,6 @@ [blob-url.any.html] [Different blob URLs pointing to the same blob resolve to different modules] expected: FAIL + + [Revoking a blob URL immediately after calling import will not fail] + expected: FAIL diff --git a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/code-cache-nonce.html.ini b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/code-cache-nonce.html.ini deleted file mode 100644 index ccad3276c85..00000000000 --- a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/code-cache-nonce.html.ini +++ /dev/null @@ -1,9 +0,0 @@ -[code-cache-nonce.html] - [First dynamic import should use nonce=abc] - expected: FAIL - - [Second dynamic import should use nonce=def] - expected: FAIL - - [Third dynamic import should use nonce=ghi] - expected: FAIL diff --git a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-classic.html.ini b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-classic.html.ini deleted file mode 100644 index 0080e7908e9..00000000000 --- a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-classic.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[propagate-nonce-external-classic.html] - [Dynamically imported module should eval when imported from script w/ a valid nonce.] - expected: FAIL diff --git a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-module.html.ini b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-module.html.ini deleted file mode 100644 index 849c9b3e60d..00000000000 --- a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-module.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[propagate-nonce-external-module.html] - expected: TIMEOUT diff --git a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-classic.html.ini b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-classic.html.ini deleted file mode 100644 index 74b32cc06dd..00000000000 --- a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-classic.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[propagate-nonce-inline-classic.html] - [Dynamically imported module should eval when imported from script w/ a valid nonce.] - expected: FAIL diff --git a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-module.html.ini b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-module.html.ini deleted file mode 100644 index eb08f590857..00000000000 --- a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-module.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[propagate-nonce-inline-module.html] - [Dynamically imported module should eval when imported from script w/ a valid nonce.] - expected: FAIL diff --git a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic.html.ini b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic.html.ini index 9b3e3358ad3..8a3281def9e 100644 --- a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic.html.ini +++ b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic.html.ini @@ -1,18 +1,3 @@ [string-compilation-nonce-classic.html] - [reflected inline event handlers must not inherit the nonce from the triggering script, thus fail] - expected: PASS - - [inline event handlers triggered via UA code must not inherit the nonce from the triggering script, thus fail] - expected: PASS - [setTimeout must inherit the nonce from the triggering script, thus execute] expected: FAIL - - [direct eval must inherit the nonce from the triggering script, thus execute] - expected: FAIL - - [indirect eval must inherit the nonce from the triggering script, thus execute] - expected: FAIL - - [the Function constructor must inherit the nonce from the triggering script, thus execute] - expected: FAIL
\ No newline at end of file diff --git a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-module.html.ini b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-module.html.ini index 1d3b047b68b..98d0b640164 100644 --- a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-module.html.ini +++ b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-module.html.ini @@ -1,18 +1,3 @@ [string-compilation-nonce-module.html] - [reflected inline event handlers must not inherit the nonce from the triggering script, thus fail] - expected: PASS - - [inline event handlers triggered via UA code must not inherit the nonce from the triggering script, thus fail] - expected: PASS - - [direct eval must inherit the nonce from the triggering script, thus execute] - expected: FAIL - - [indirect eval must inherit the nonce from the triggering script, thus execute] - expected: FAIL - - [the Function constructor must inherit the nonce from the triggering script, thus execute] - expected: FAIL - [setTimeout must inherit the nonce from the triggering script, thus execute] - expected: FAIL
\ No newline at end of file + expected: FAIL diff --git a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/v8-code-cache.html.ini b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/v8-code-cache.html.ini deleted file mode 100644 index 64413107401..00000000000 --- a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/v8-code-cache.html.ini +++ /dev/null @@ -1,30 +0,0 @@ -[v8-code-cache.html] - [text/javascript: Run #1] - expected: FAIL - - [text/javascript: Run #2] - expected: FAIL - - [text/javascript: Run #3] - expected: FAIL - - [text/javascript: Run #4] - expected: FAIL - - [text/javascript: Run #5] - expected: FAIL - - [module: Run #1] - expected: FAIL - - [module: Run #2] - expected: FAIL - - [module: Run #3] - expected: FAIL - - [module: Run #4] - expected: FAIL - - [module: Run #5] - expected: FAIL diff --git a/tests/wpt/meta/html/syntax/serializing-html-fragments/serializing-cdata-in-html-document.html.ini b/tests/wpt/meta/html/syntax/serializing-html-fragments/serializing-cdata-in-html-document.html.ini new file mode 100644 index 00000000000..d8b897fb81f --- /dev/null +++ b/tests/wpt/meta/html/syntax/serializing-html-fragments/serializing-cdata-in-html-document.html.ini @@ -0,0 +1,3 @@ +[serializing-cdata-in-html-document.html] + [Serializing CDATA in an HTML document] + expected: FAIL diff --git a/tests/wpt/meta/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini b/tests/wpt/meta/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini index a8e069b27e7..3bfb92e671a 100644 --- a/tests/wpt/meta/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini +++ b/tests/wpt/meta/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini @@ -760,3 +760,15 @@ [X Stitched sine-wave buffers at sample rate 43800 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.0038986,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[14680\]\t1.7249685451109781e-36\t2.0512369275093079e-1\t2.0512369275093079e-1\t1.0000000000000000e+0\t3.8985999999999999e-3\n\t[14681\]\t1.1480505578219891e-2\t1.4340442419052124e-1\t1.3192391861230135e-1\t9.1994315626575540e-1\t3.8985999999999999e-3\n\tMax AbsError of 2.0512369275093079e-1 at index of 14680.\n\tMax RelError of 1.0000000000000000e+0 at index of 14680.\n] expected: FAIL + + [X Stitched sine-wave buffers at sample rate 43800 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.0038986,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[14680\]\t-2.7021871583080320e+24\t2.0512369275093079e-1\t2.7021871583080320e+24\t1.3173452184234677e+25\t3.8985999999999999e-3\n\t[14681\]\t1.1480505578219891e-2\t1.4340442419052124e-1\t1.3192391861230135e-1\t9.1994315626575540e-1\t3.8985999999999999e-3\n\tMax AbsError of 2.7021871583080320e+24 at index of 14680.\n\tMax RelError of 1.3173452184234677e+25 at index of 14680.\n] + expected: FAIL + + [X SNR (-445.2002225707384 dB) is not greater than or equal to 65.737. Got -445.2002225707384.] + expected: FAIL + + [X Stitched sine-wave buffers at sample rate 43800 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.0038986,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[14680\]\t-4.2315589002308092e+19\t2.0512369275093079e-1\t4.2315589002308092e+19\t2.0629303438725304e+20\t3.8985999999999999e-3\n\t[14681\]\t1.1480505578219891e-2\t1.4340442419052124e-1\t1.3192391861230135e-1\t9.1994315626575540e-1\t3.8985999999999999e-3\n\tMax AbsError of 4.2315589002308092e+19 at index of 14680.\n\tMax RelError of 2.0629303438725304e+20 at index of 14680.\n] + expected: FAIL + + [X SNR (-349.0959218623025 dB) is not greater than or equal to 65.737. Got -349.0959218623025.] + expected: FAIL diff --git a/tests/wpt/meta/webxr/depth-sensing/cpu/depth_sensing_cpu_matchDepthViewIdentity.https.html.ini b/tests/wpt/meta/webxr/depth-sensing/cpu/depth_sensing_cpu_matchDepthViewIdentity.https.html.ini new file mode 100644 index 00000000000..ce3fb065178 --- /dev/null +++ b/tests/wpt/meta/webxr/depth-sensing/cpu/depth_sensing_cpu_matchDepthViewIdentity.https.html.ini @@ -0,0 +1,19 @@ +[depth_sensing_cpu_matchDepthViewIdentity.https.html] + expected: ERROR + [Ensures XRViewGeometry values are identity when matchDepthView is unset, `cpu-optimized` - webgl] + expected: TIMEOUT + + [Ensures XRViewGeometry values are identity when matchDepthView is unset, `cpu-optimized` - webgl2] + expected: NOTRUN + + [Ensures XRViewGeometry values are identity when matchDepthView=true, `cpu-optimized` - webgl] + expected: NOTRUN + + [Ensures XRViewGeometry values are identity when matchDepthView=true, `cpu-optimized` - webgl2] + expected: NOTRUN + + [Ensures session can be created when matchDepthView=false, `cpu-optimized` - webgl] + expected: NOTRUN + + [Ensures session can be created when matchDepthView=false, `cpu-optimized` - webgl2] + expected: NOTRUN diff --git a/tests/wpt/meta/webxr/depth-sensing/gpu/depth_sensing_gpu_matchDepthViewIdentity.https.html.ini b/tests/wpt/meta/webxr/depth-sensing/gpu/depth_sensing_gpu_matchDepthViewIdentity.https.html.ini new file mode 100644 index 00000000000..54901a8468a --- /dev/null +++ b/tests/wpt/meta/webxr/depth-sensing/gpu/depth_sensing_gpu_matchDepthViewIdentity.https.html.ini @@ -0,0 +1,19 @@ +[depth_sensing_gpu_matchDepthViewIdentity.https.html] + expected: ERROR + [Ensures XRViewGeometry values are identity when matchDepthView is unset, `gpu-optimized` - webgl] + expected: TIMEOUT + + [Ensures XRViewGeometry values are identity when matchDepthView is unset, `gpu-optimized` - webgl2] + expected: NOTRUN + + [Ensures XRViewGeometry values are identity when matchDepthView=true, `gpu-optimized` - webgl] + expected: NOTRUN + + [Ensures XRViewGeometry values are identity when matchDepthView=true, `gpu-optimized` - webgl2] + expected: NOTRUN + + [Ensures session can be created when matchDepthView=false, `gpu-optimized` - webgl] + expected: NOTRUN + + [Ensures session can be created when matchDepthView=false, `gpu-optimized` - webgl2] + expected: NOTRUN diff --git a/tests/wpt/tests/.github/workflows/docker.yml b/tests/wpt/tests/.github/workflows/docker.yml index 66794b69aba..5de0cc4bcb1 100644 --- a/tests/wpt/tests/.github/workflows/docker.yml +++ b/tests/wpt/tests/.github/workflows/docker.yml @@ -40,7 +40,7 @@ jobs: latest type=raw,value=${{ inputs.tag }} - name: Build and push the Docker image - uses: docker/build-push-action@471d1dc4e07e5cdedd4c2171150001c434f0b7a4 # v6.15.0 + uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1 # v6.16.0 with: context: ./tools/docker push: true diff --git a/tests/wpt/tests/ai/language_detection/availability-detached-crash.https.html b/tests/wpt/tests/ai/language_detection/availability-detached-crash.https.html index 5f76d59eb35..ee5e27e35b6 100644 --- a/tests/wpt/tests/ai/language_detection/availability-detached-crash.https.html +++ b/tests/wpt/tests/ai/language_detection/availability-detached-crash.https.html @@ -2,12 +2,19 @@ <title>Assures no crash upon call of LanguageDetector.availability() on a detached document</title> <link rel="author" href="mailto:christinesm@chromium.org"> <link rel="help" href="https://issues.chromium.org/issues/384233287"> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> <body> <iframe src="about:blank"></iframe> <script> -const factory = frames[0].LanguageDetector; -const detector = factory.create(); +const iframe = frames[0]; +await test_driver.bless('Create LanguageDetector', null, iframe); + +const factory = iframe.LanguageDetector; +const detectorPromise = await factory.create(); document.getElementsByTagName("iframe")[0].remove(); -detector.availability(); + +factory.availability(); +detectorPromise.then(detector => detector.detect()); </script> </body> diff --git a/tests/wpt/tests/ai/language_detection/detector-iframe.https.html b/tests/wpt/tests/ai/language_detection/detector-iframe.https.html index 3e90d36b5aa..ddcf82bec68 100644 --- a/tests/wpt/tests/ai/language_detection/detector-iframe.https.html +++ b/tests/wpt/tests/ai/language_detection/detector-iframe.https.html @@ -37,6 +37,9 @@ function load_iframe(src, permission_policy) { }); } +// TODO(crbug.com/414428433): Tests in this file intermittently crash. +// Re-enable once potential causes in Permissions Policy implementation +// and test setup are addressed. promise_test(async t => { const src = HTTPS_NOTSAMESITE_ORIGIN + IFRAME_PATH; const iframe = await load_iframe(src, /*permission_policy=*/""); diff --git a/tests/wpt/tests/ai/language_detection/detector-locale.https.window.js b/tests/wpt/tests/ai/language_detection/detector-locale.https.window.js index a1c67db9129..80cbfa485e3 100644 --- a/tests/wpt/tests/ai/language_detection/detector-locale.https.window.js +++ b/tests/wpt/tests/ai/language_detection/detector-locale.https.window.js @@ -1,5 +1,8 @@ // META: title=Detect english // META: global=window +// META: timeout=long +// META: script=resources/util.js +// META: script=/resources/testdriver.js // META: script=../resources/util.js // META: script=../resources/locale-util.js @@ -45,7 +48,7 @@ promise_test(async t => { async function getExpectedInputLanguages(expectedInputLanguages) { - return (await LanguageDetector.create({expectedInputLanguages})) + return (await createLanguageDetector({expectedInputLanguages})) .expectedInputLanguages; } @@ -63,14 +66,14 @@ function uniqueCount(array) { promise_test(async t => { for (const [languageSubtag, variations] of Object.entries( valid_language_tags)) { - if (await getAvailability(languageSubtag) === 'unavailable') { + if (await getAvailability([languageSubtag]) === 'unavailable') { continue; } - await assert_valid_expected_input_languages(languageSubtag) + await assert_valid_expected_input_languages(languageSubtag); for (const variation of variations) { - await assert_valid_expected_input_languages(variation) + await assert_valid_expected_input_languages(variation); } const expectedInputLanguages = await getExpectedInputLanguages(variations); @@ -94,10 +97,10 @@ function assert_rejects_invalid_expected_input_languages( promise_test(async t => { for (const languageTag of invalid_language_tags) { assert_rejects_invalid_expected_input_languages( - t, LanguageDetector.create, [languageTag]); + t, createLanguageDetector, [languageTag]); } assert_rejects_invalid_expected_input_languages( - t, LanguageDetector.create, invalid_language_tags); + t, createLanguageDetector, invalid_language_tags); }, 'LanguageDetector.create() throws RangeError for invalid language tags'); promise_test(async t => { diff --git a/tests/wpt/tests/ai/language_detection/detector.https.window.js b/tests/wpt/tests/ai/language_detection/detector.https.window.js index e85ea6d249b..b0255bc552b 100644 --- a/tests/wpt/tests/ai/language_detection/detector.https.window.js +++ b/tests/wpt/tests/ai/language_detection/detector.https.window.js @@ -1,19 +1,32 @@ // META: title=Detect english // META: global=window +// META: timeout=long +// META: script=resources/util.js +// META: script=/resources/testdriver.js // META: script=../resources/util.js // META: script=../resources/locale-util.js 'use strict'; promise_test(async t => { - // Language detection is available after call to `create()`. - await LanguageDetector.create(); + // Creating the language detector without user activation rejects with + // NotAllowedError. + const createPromise = LanguageDetector.create(); + await promise_rejects_dom(t, 'NotAllowedError', createPromise); + + // Creating the translator with user activation succeeds. + await createLanguageDetector(); + + // Creating it should have switched it to available. const availability = await LanguageDetector.availability(); assert_equals(availability, 'available'); -}, 'Simple LanguageDetector.availability() call'); + + // Now that it is available, we should no longer need user activation. + await LanguageDetector.create(); +}, 'LanguageDetector.create() requires user activation when availability is "downloadable.'); promise_test(async t => { - const detector = await LanguageDetector.create(); + const detector = await createLanguageDetector(); const results = await detector.detect('Hello world!'); // must at least have the 'und' result. @@ -62,30 +75,30 @@ promise_test(async t => { throw error; } - await promise_rejects_exactly(t, error, LanguageDetector.create({monitor})); + await promise_rejects_exactly(t, error, createLanguageDetector({monitor})); }, 'If monitor throws an error, LanguageDetector.create() rejects with that error'); promise_test(async t => { - testMonitor(LanguageDetector.create); + testMonitor(createLanguageDetector); }, 'LanguageDetector.create() notifies its monitor on downloadprogress'); promise_test(async t => { const controller = new AbortController(); controller.abort(); - const createPromise = LanguageDetector.create({signal: controller.signal}); + const createPromise = createLanguageDetector({signal: controller.signal}); await promise_rejects_dom(t, 'AbortError', createPromise); }, 'LanguageDetector.create() call with an aborted signal.'); promise_test(async t => { await testAbortPromise(t, signal => { - return LanguageDetector.create({signal}); + return createLanguageDetector({signal}); }); -}, 'Aborting LanguageDetector.create().'); +}, 'Aborting createLanguageDetector().'); promise_test(async t => { - const detector = await LanguageDetector.create(); + const detector = await createLanguageDetector(); const text = 'Hello world!'; const promises = [detector.detect(text), detector.measureInputUsage(text)]; @@ -101,7 +114,7 @@ promise_test(async t => { promise_test(async t => { const controller = new AbortController(); - const detector = await LanguageDetector.create({signal: controller.signal}); + const detector = await createLanguageDetector({signal: controller.signal}); const text = 'Hello world!'; const promises = [detector.detect(text), detector.measureInputUsage(text)]; @@ -120,7 +133,7 @@ promise_test(async t => { const controller = new AbortController(); controller.abort(); - const detector = await LanguageDetector.create(); + const detector = await createLanguageDetector(); const detectPromise = detector.detect('Hello world!', {signal: controller.signal}); @@ -128,14 +141,14 @@ promise_test(async t => { }, 'LanguageDetector.detect() call with an aborted signal.'); promise_test(async t => { - const detector = await LanguageDetector.create(); + const detector = await createLanguageDetector(); await testAbortPromise(t, signal => { return detector.detect('Hello world!', {signal}); }); }, 'Aborting LanguageDetector.detect().'); promise_test(async t => { - const detector = await LanguageDetector.create(); + const detector = await createLanguageDetector(); const text = 'Hello world!'; const largeText = text.repeat(10000); @@ -157,7 +170,7 @@ promise_test(async t => { const controller = new AbortController(); controller.abort(); - const detector = await LanguageDetector.create(); + const detector = await createLanguageDetector(); const measureInputUsagePromise = detector.measureInputUsage('hello', {signal: controller.signal}); @@ -165,17 +178,17 @@ promise_test(async t => { }, 'LanguageDetector.measureInputUsage() call with an aborted signal.'); promise_test(async t => { - const detector = await LanguageDetector.create(); + const detector = await createLanguageDetector(); await testAbortPromise(t, signal => { return detector.measureInputUsage('hello', {signal}); }); }, 'Aborting LanguageDetector.measureInputUsage().'); promise_test(async () => { - const detector = await LanguageDetector.create(); + const detector = await createLanguageDetector(); assert_equals(detector.expectedInputLanguages, null); }, 'Creating LanguageDetector without expectedInputLanguages'); promise_test(async t => { - await testCreateMonitorWithAbort(t, LanguageDetector.create); + await testCreateMonitorWithAbort(t, createLanguageDetector); }, 'Progress events are not emitted after aborted.'); diff --git a/tests/wpt/tests/ai/language_detection/detector.optional.https.window.js b/tests/wpt/tests/ai/language_detection/detector.optional.https.window.js index 7ffa1362dd5..1dd248a9eca 100644 --- a/tests/wpt/tests/ai/language_detection/detector.optional.https.window.js +++ b/tests/wpt/tests/ai/language_detection/detector.optional.https.window.js @@ -1,5 +1,8 @@ // META: title=Detect english // META: global=window +// META: timeout=long +// META: script=resources/util.js +// META: script=/resources/testdriver.js // META: script=../resources/util.js 'use strict'; @@ -36,7 +39,7 @@ promise_test(async t => { const expectedInputLanguages = Object.keys(testInput); - const detector = await LanguageDetector.create({expectedInputLanguages}); + const detector = await createLanguageDetector({expectedInputLanguages}); for (const [language, input] of Object.entries(testInput)) { await assert_detects_correct_language(detector, input, language); @@ -45,7 +48,7 @@ promise_test(async t => { promise_test(async () => { const expectedInputLanguages = ['en', 'es']; - const detector = await LanguageDetector.create({expectedInputLanguages}); + const detector = await createLanguageDetector({expectedInputLanguages}); assert_array_equals(detector.expectedInputLanguages, expectedInputLanguages); assert_true(Object.isFrozen(detector.expectedInputLanguages)); }, 'Creating LanguageDetector with expectedInputLanguages'); diff --git a/tests/wpt/tests/ai/language_detection/resources/util.js b/tests/wpt/tests/ai/language_detection/resources/util.js new file mode 100644 index 00000000000..7cb3e7c2e13 --- /dev/null +++ b/tests/wpt/tests/ai/language_detection/resources/util.js @@ -0,0 +1,4 @@ +async function createLanguageDetector(options = {}) { + await test_driver.bless(); + return await LanguageDetector.create(options); +} diff --git a/tests/wpt/tests/audio-output/setSinkId.https.html b/tests/wpt/tests/audio-output/setSinkId.https.html index be65f0ac81b..662596910ee 100644 --- a/tests/wpt/tests/audio-output/setSinkId.https.html +++ b/tests/wpt/tests/audio-output/setSinkId.https.html @@ -26,14 +26,8 @@ promise_test(async t => { const list = await navigator.mediaDevices.enumerateDevices(); assert_greater_than(list.length, 0, "media device list includes at least one device"); - const audioInputList = list.filter(({kind}) => kind == "audioinput"); const outputDevicesList = list.filter(({kind}) => kind == "audiooutput"); - // List of exposed microphone groupIds - const exposedGroupIds = new Set(audioInputList.map(device => device.groupId)); - for (const { deviceId, groupId } of outputDevicesList) { - assert_true(exposedGroupIds.has(groupId), - "audiooutput device groupId must match an exposed microphone"); assert_greater_than(deviceId.length, 0, "deviceId.length"); const p1 = audio.setSinkId(deviceId); diff --git a/tests/wpt/tests/clear-site-data/support/clear-site-data-prefetchCache.py b/tests/wpt/tests/clear-site-data/support/clear-site-data-prefetchCache.py new file mode 100644 index 00000000000..3a332dd58b2 --- /dev/null +++ b/tests/wpt/tests/clear-site-data/support/clear-site-data-prefetchCache.py @@ -0,0 +1,18 @@ +def main(request, response): + headers = [(b"Content-Type", b"text/html")] + headers += [(b"Clear-Site-Data", b'"prefetchCache"')] + content = f''' + <script> + setTimeout(() => {{ + if(window.opener) {{ + window.opener.postMessage("message", "*"); + }} else {{ + window.parent.postMessage("message", "*"); + }} + window.close(); + }}, 1000); + </script> + <body> + {request.url} + </body>''' + return 200, headers, content diff --git a/tests/wpt/tests/clear-site-data/support/clear-site-data-prerenderCache.py b/tests/wpt/tests/clear-site-data/support/clear-site-data-prerenderCache.py new file mode 100644 index 00000000000..bf845cfb699 --- /dev/null +++ b/tests/wpt/tests/clear-site-data/support/clear-site-data-prerenderCache.py @@ -0,0 +1,18 @@ +def main(request, response): + headers = [(b"Content-Type", b"text/html")] + headers += [(b"Clear-Site-Data", b'"prerenderCache"')] + content = f''' + <script> + setTimeout(() => {{ + if(window.opener) {{ + window.opener.postMessage("message", "*"); + }} else {{ + window.parent.postMessage("message", "*"); + }} + window.close(); + }}, 1000); + </script> + <body> + {request.url} + </body>''' + return 200, headers, content diff --git a/tests/wpt/tests/cookie-store/change_eventhandler_for_already_expired.https.window.js b/tests/wpt/tests/cookie-store/change_eventhandler_for_already_expired.https.window.js index 89d84b13d1b..f3bbe0ea560 100644 --- a/tests/wpt/tests/cookie-store/change_eventhandler_for_already_expired.https.window.js +++ b/tests/wpt/tests/cookie-store/change_eventhandler_for_already_expired.https.window.js @@ -20,3 +20,22 @@ cookie_test(async t => { {deleted: [], changed: [{name: 'alt-cookie', value: 'IGNORE'}]}, 'Deletion not observed after document.cookie sets already-expired cookie'); }, 'CookieStore setting already-expired cookie should not be observed'); + +cookie_test(async t => { + const eventPromise = observeNextCookieChangeEvent(); + await cookieStore.set({ + name: 'cookie', + value: 'ALREADY-EXPIRED', + expires: new Date(new Date() - 10_000), + partitioned: true, + }); + await cookieStore.set('alt-cookie', 'IGNORE'); + assert_equals( + await getCookieString(), + 'alt-cookie=IGNORE', + 'Already-expired cookie not included in CookieStore'); + await verifyCookieChangeEvent( + eventPromise, + {deleted: [], changed: [{name: 'alt-cookie', value: 'IGNORE'}]}, + 'Deletion not observed after document.cookie sets already-expired cookie'); +}, 'CookieStore setting already-expired partitioned cookie should not be observed'); diff --git a/tests/wpt/tests/cookie-store/change_eventhandler_for_document_cookie.https.window.js b/tests/wpt/tests/cookie-store/change_eventhandler_for_document_cookie.https.window.js index 82b0f2baa2b..1937ebdae35 100644 --- a/tests/wpt/tests/cookie-store/change_eventhandler_for_document_cookie.https.window.js +++ b/tests/wpt/tests/cookie-store/change_eventhandler_for_document_cookie.https.window.js @@ -78,6 +78,21 @@ cookie_test(async t => { 'Deletion not observed after document.cookie sets already-expired cookie'); }, 'document.cookie set already-expired cookie should not be observed by CookieStore'); +cookie_test(async t => { + let eventPromise = observeNextCookieChangeEvent(); + await setCookieStringDocument('DOCUMENT-cookie=VALUE; path=/'); + await verifyCookieChangeEvent( + eventPromise, {changed: [{name: 'DOCUMENT-cookie', value: 'VALUE'}]}, + 'Original cookie is observed.'); + + eventPromise = observeNextCookieChangeEvent(); + // Overwrite the original cookie with a duplicate, this should not dispatch an event. + await setCookieStringDocument('DOCUMENT-cookie=VALUE; path=/'); + await setCookieStringDocument('DOCUMENT-alt-cookie=IGNORE; path=/'); + await verifyCookieChangeEvent( + eventPromise, {changed: [{name: 'DOCUMENT-alt-cookie', value: 'IGNORE'}]}, + 'Duplicate cookie is not observed.'); +}, 'document.cookie duplicate cookie should not be observed by CookieStore'); cookie_test(async t => { let eventPromise = observeNextCookieChangeEvent(); diff --git a/tests/wpt/tests/cookie-store/change_eventhandler_for_http_cookie_and_set_cookie_headers.https.window.js b/tests/wpt/tests/cookie-store/change_eventhandler_for_http_cookie_and_set_cookie_headers.https.window.js index 8f5ef1cabbe..8517995acfe 100644 --- a/tests/wpt/tests/cookie-store/change_eventhandler_for_http_cookie_and_set_cookie_headers.https.window.js +++ b/tests/wpt/tests/cookie-store/change_eventhandler_for_http_cookie_and_set_cookie_headers.https.window.js @@ -62,6 +62,22 @@ cookie_test(async t => { 'Deletion not observed after HTTP sets already-expired cookie'); }, 'HTTP set already-expired cookie should not be observed by CookieStore'); +cookie_test(async t => { + let eventPromise = observeNextCookieChangeEvent(); + await setCookieStringHttp('HTTP-cookie=VALUE; path=/'); + await verifyCookieChangeEvent( + eventPromise, {changed: [{name: 'HTTP-cookie', value: 'VALUE'}]}, + 'Original cookie is observed.'); + + eventPromise = observeNextCookieChangeEvent(); + // Overwrite the original cookie with a duplicate, this should not dispatch an event. + await setCookieStringHttp('HTTP-cookie=VALUE; path=/'); + await setCookieStringHttp('HTTP-alt-cookie=IGNORE; path=/'); + await verifyCookieChangeEvent( + eventPromise, {changed: [{name: 'HTTP-alt-cookie', value: 'IGNORE'}]}, + 'Duplicate cookie is not observed.'); +}, 'HTTP duplicate cookie should not be observed by CookieStore'); + cookie_test(async t => { let eventPromise = observeNextCookieChangeEvent(); diff --git a/tests/wpt/tests/cookie-store/change_eventhandler_for_no_change.https.window.js b/tests/wpt/tests/cookie-store/change_eventhandler_for_no_change.https.window.js new file mode 100644 index 00000000000..5f9c2927433 --- /dev/null +++ b/tests/wpt/tests/cookie-store/change_eventhandler_for_no_change.https.window.js @@ -0,0 +1,43 @@ +// META: title=Cookie Store API: Test that setting a duplicate cookie does not fire a second event. +// META: script=resources/cookie-test-helpers.js + +'use strict'; + +cookie_test(async t => { + let eventPromise = observeNextCookieChangeEvent(); + await cookieStore.set('cookie', 'VALUE'); + await verifyCookieChangeEvent( + eventPromise, {changed: [{name: 'cookie', value: 'VALUE'}]}, + 'Original cookie is observed.'); + + eventPromise = observeNextCookieChangeEvent(); + await cookieStore.set('cookie', 'VALUE'); + await cookieStore.set('alt-cookie', 'IGNORE'); + await verifyCookieChangeEvent( + eventPromise, {changed: [{name: 'alt-cookie', value: 'IGNORE'}]}, + 'Duplicate cookie is not observed.'); +}, 'CookieStore duplicate cookie should not be observed'); + +cookie_test(async t => { + let eventPromise = observeNextCookieChangeEvent(); + await cookieStore.set({ + name: 'cookie', + value: 'VALUE', + partitioned: true, + }); + await verifyCookieChangeEvent( + eventPromise, + {changed: [{name: 'cookie', value: 'VALUE', partitioned: true}]}, + 'Original cookie is observed.'); + + eventPromise = observeNextCookieChangeEvent(); + await cookieStore.set({ + name: 'cookie', + value: 'VALUE', + partitioned: true, + }); + await cookieStore.set('alt-cookie', 'IGNORE'); + await verifyCookieChangeEvent( + eventPromise, {changed: [{name: 'alt-cookie', value: 'IGNORE'}]}, + 'Duplicate cookie is not observed.'); +}, 'CookieStore duplicate partitioned cookie should not be observed'); diff --git a/tests/wpt/tests/css/css-align/abspos/align-items-static-position-001-ref.tentative.html b/tests/wpt/tests/css/css-align/abspos/align-items-static-position-001-ref.tentative.html new file mode 100644 index 00000000000..22c1fd03e38 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-items-static-position-001-ref.tentative.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<style> +.block { + display: block; + width: 75%; + height: 75%; + border: 5px dotted blue; +} + +.container { + border: 1px solid; + position: relative; + width: 100px; + height: 100px; + display: inline-block; + margin-left: 50px; + margin-bottom: 50px; +} + +.abs { + width: 50px; + height: 50px; + position: absolute; + background: purple; + justify-self: center; +} +</style> +<div class="container"><div class="block"> + <div class="abs"></div> +</div></div> diff --git a/tests/wpt/tests/css/css-align/abspos/align-items-static-position-001.tentative.html b/tests/wpt/tests/css/css-align/abspos/align-items-static-position-001.tentative.html new file mode 100644 index 00000000000..06c11e6cdb6 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-items-static-position-001.tentative.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<title>Align-items only applies to OOF elements of block elements when statically positioned if it would apply if not OOF.</title> +<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com"> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-self-auto"> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-justify-self-auto"> +<link rel="help" href="https://drafts.csswg.org/css-position-3/#abspos-alignment"> +<link rel="help" href="https://issues.chromium.org/issues/409806799"> +<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/12121"> +<link rel="match" href="align-items-static-position-001-ref.tentative.html"> +<style> +.block { + display: block; + width: 75%; + height: 75%; + border: 5px dotted blue; + align-items: center; + justify-items: center; +} + +.container { + border: 1px solid; + position: relative; + width: 100px; + height: 100px; + display: inline-block; + margin-left: 50px; + margin-bottom: 50px; +} + +.abs { + width: 50px; + height: 50px; + position: absolute; + background: purple; +} +</style> +<div class="container"><div class="block"> + <div class="abs"></div> +</div></div> diff --git a/tests/wpt/tests/css/css-align/abspos/align-items-static-position-002-ref.tentative.html b/tests/wpt/tests/css/css-align/abspos/align-items-static-position-002-ref.tentative.html new file mode 100644 index 00000000000..6f53b041787 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-items-static-position-002-ref.tentative.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<link rel="stylesheet" href="/fonts/ahem.css"> +<style> +.inline { + display: inline; + color: transparent; + font: 10px Ahem; + line-height: 25px; +} + +.container { + border: 1px solid; + position: relative; + width: 100px; + height: 100px; + display: inline-block; + margin-left: 50px; + margin-bottom: 50px; +} + +.abs { + width: 50px; + height: 50px; + position: absolute; + background: purple; +} +</style> +<div class="container"><div class="inline">text + <div class="abs"></div> + <br>text +</div></div> + diff --git a/tests/wpt/tests/css/css-align/abspos/align-items-static-position-002.tentative.html b/tests/wpt/tests/css/css-align/abspos/align-items-static-position-002.tentative.html new file mode 100644 index 00000000000..f90004b5672 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-items-static-position-002.tentative.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<title>Align-items doesn't apply to OOF elements of inline elements when statically positioned because they would apply if not OOF.</title> +<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com"> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-self-auto"> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-justify-self-auto"> +<link rel="help" href="https://drafts.csswg.org/css-position-3/#abspos-alignment"> +<link rel="help" href="https://issues.chromium.org/issues/409806799"> +<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/12121"> +<link rel="match" href="align-items-static-position-002-ref.tentative.html"> +<link rel="stylesheet" href="/fonts/ahem.css"> +<style> +.inline { + display: inline; + color: transparent; + font: 10px Ahem; + line-height: 25px; + align-items: center; + justify-items: center; +} + +.container { + border: 1px solid; + position: relative; + width: 100px; + height: 100px; + display: inline-block; + margin-left: 50px; + margin-bottom: 50px; +} + +.abs { + width: 50px; + height: 50px; + position: absolute; + background: purple; +} +</style> +<div class="container"><div class="inline">text + <div class="abs"></div> + <br>text +</div></div> diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-003-ref.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-003-ref.html new file mode 100644 index 00000000000..132bbb7360f --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-003-ref.html @@ -0,0 +1,59 @@ +<!DOCTYPE html> +<link rel="stylesheet" href="/fonts/ahem.css"> +<style> +.inline { + display: inline; + color: transparent; + font: 10px Ahem; + line-height: 25px; +} + +.container { + border: 1px solid; + position: relative; + width: 100px; + height: 100px; + display: inline-block; + margin-left: 50px; + margin-bottom: 50px; +} + +.abs { + width: 50px; + height: 50px; + position: absolute; + background: purple; +} +</style> +<!-- start aligned --> +<div class="container"><div class="inline">text + <div class="abs" style="top: 25px;"></div> +</div></div> +<div class="container"><div class="inline">text + <div class="abs" style="top: 0px;"></div> +</div></div> +<div class="container"><div class="inline">text + <div class="abs" style="top: 25px;"></div> +</div></div> +<br> +<!-- end aligned --> +<div class="container"><div class="inline">text + <div class="abs" style="bottom: 50px; left: -50px"></div> +</div></div> +<div class="container"><div class="inline">text + <div class="abs" style="bottom: 0px; left: -50px;"></div> +</div></div> +<div class="container"><div class="inline">text + <div class="abs" style="bottom: 50px; left: 50px;"></div> +</div></div> +<br> +<!-- center aligned --> +<div class="container"><div class="inline">text + <div class="abs" style="top: 12.5px; left: -25px;"></div> +</div></div> +<div class="container"><div class="inline">text + <div class="abs" style="top: 25px; left: -25px;"></div> +</div></div> +<div class="container"><div class="inline">text + <div class="abs" style="top: 12.5px; left: 25px;"></div> +</div></div> diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-003.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-003.html new file mode 100644 index 00000000000..39f871f4c2b --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-003.html @@ -0,0 +1,110 @@ +<!DOCTYPE html> +<title>Align-self applies to OOF elements of inline elements when statically positioned.</title> +<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com"> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-self-auto"> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-justify-self-auto"> +<link rel="help" href="https://drafts.csswg.org/css-position-3/#abspos-alignment"> +<link rel="help" href="https://issues.chromium.org/issues/409806799"> +<link rel="match" href="align-self-static-position-003-ref.html"> +<link rel="stylesheet" href="/fonts/ahem.css"> +<style> +.inline { + display: inline; + color: transparent; + font: 10px Ahem; + line-height: 25px; +} + +.container { + border: 1px solid; + position: relative; + width: 100px; + height: 100px; + display: inline-block; + margin-left: 50px; + margin-bottom: 50px; +} + +.abs { + width: 50px; + height: 50px; + position: absolute; + background: purple; +} + +.static-positioned-inline { + left: auto; + right: auto; +} + +.static-positioned-block { + top: auto; + bottom: auto; +} + +.positioned-inline { + left: 0; + right: 0; +} + +.positioned-block { + top: 0; + bottom: 0; +} + +.center { + justify-self: center; + align-self: center; +} + +.end { + justify-self: end; + align-self: end; +} + +.start { + justify-self: start; + align-self: start; +} +</style> +<!-- start aligned --> +<div class="container"><div class="inline">text + <div class="abs static-positioned-inline static-positioned-block start"></div> + <br>text +</div></div> +<div class="container"><div class="inline">text + <div class="abs static-positioned-inline positioned-block start"></div> + <br>text +</div></div> +<div class="container"><div class="inline">text + <div class="abs positioned-inline static-positioned-block start"></div> + <br>text +</div></div> +<br> +<!-- end aligned --> +<div class="container"><div class="inline">text + <div class="abs static-positioned-inline static-positioned-block end"></div> + <br>text +</div></div> +<div class="container"><div class="inline">text + <div class="abs static-positioned-inline positioned-block end"></div> + <br>text +</div></div> +<div class="container"><div class="inline">text + <div class="abs positioned-inline static-positioned-block end"></div> + <br>text +</div></div> +<br> +<!-- center aligned --> +<div class="container"><div class="inline">text + <div class="abs static-positioned-inline static-positioned-block center"></div> + <br>text +</div></div> +<div class="container"><div class="inline">text + <div class="abs static-positioned-inline positioned-block center"></div> + <br>text +</div></div> +<div class="container"><div class="inline">text + <div class="abs positioned-inline static-positioned-block center"></div> + <br>text +</div></div> diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-004-ref.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-004-ref.html new file mode 100644 index 00000000000..68130ee1d7e --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-004-ref.html @@ -0,0 +1,67 @@ +<!DOCTYPE html> +<link rel="stylesheet" href="/fonts/ahem.css"> +<style> +.inline { + display: inline; + color: transparent; + font: 10px Ahem; + line-height: 25px; +} + +.container { + border: 1px solid; + position: relative; + width: 100px; + height: 100px; + display: inline-block; + margin-left: 50px; + margin-bottom: 50px; +} + +.abs { + width: 50px; + height: 50px; + position: absolute; + background: purple; +} + +.vertRL { + writing-mode: vertical-rl; +} + +.vertLR { + writing-mode: vertical-lr; +} +</style> +<!-- start aligned --> +<div class="container vertRL"><div class="inline">text + <div class="abs" style="top: 0px; right: 25px;"></div> +</div></div> +<div class="container vertLR"><div class="inline">text + <div class="abs" style="top: 0px; left: 25px;"></div> +</div></div> +<div class="container vertRL"><div class="inline">text + <div class="abs" style="top: 0px; right: 0px;"></div> +</div></div> +<br> +<!-- end aligned --> +<div class="container vertLR"><div class="inline">text + <div class="abs" style="top: -50px; right: 50px"></div> +</div></div> +<div class="container vertRL"><div class="inline">text + <div class="abs" style="bottom: 0px; left: 50px;"></div> +</div></div> +<div class="container vertLR"><div class="inline">text + <div class="abs" style="top: -50px; right: 0px;"></div> +</div></div> +<br> +<!-- center aligned --> +<div class="container vertLR"><div class="inline">text + <div class="abs" style="right: 12.5px; top: -25px;"></div> +</div></div> +<div class="container vertRL"><div class="inline">text + <div class="abs" style="top: 25px; left: 12.5px;"></div> +</div></div> +<div class="container vertLR"><div class="inline">text + <div class="abs" style="top: -25px; left: 25px;"></div> +</div></div> diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-004.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-004.html new file mode 100644 index 00000000000..afba7215b11 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-004.html @@ -0,0 +1,118 @@ +<!DOCTYPE html> +<title>Align-self applies to OOF elements of inline elements when statically positioned with different writing modes.</title> +<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com"> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-self-auto"> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-justify-self-auto"> +<link rel="help" href="https://drafts.csswg.org/css-position-3/#abspos-alignment"> +<link rel="help" href="https://issues.chromium.org/issues/409806799"> +<link rel="match" href="align-self-static-position-004-ref.html"> +<link rel="stylesheet" href="/fonts/ahem.css"> +<style> +.inline { + display: inline; + color: transparent; + font: 10px Ahem; + line-height: 25px; +} + +.container { + border: 1px solid; + position: relative; + width: 100px; + height: 100px; + display: inline-block; + margin-left: 50px; + margin-bottom: 50px; +} + +.abs { + width: 50px; + height: 50px; + position: absolute; + background: purple; +} + +.static-positioned-inline { + left: auto; + right: auto; +} + +.static-positioned-block { + top: auto; + bottom: auto; +} + +.positioned-inline { + left: 0; + right: 0; +} + +.positioned-block { + top: 0; + bottom: 0; +} + +.center { + justify-self: center; + align-self: center; +} + +.end { + justify-self: end; + align-self: end; +} + +.start { + justify-self: start; + align-self: start; +} + +.vertRL { + writing-mode: vertical-rl; +} + +.vertLR { + writing-mode: vertical-lr; +} +</style> +<!-- start aligned --> +<div class="container vertRL"><div class="inline">text + <div class="abs static-positioned-inline static-positioned-block start"></div> + <br>text +</div></div> +<div class="container vertLR"><div class="inline">text + <div class="abs static-positioned-inline positioned-block start"></div> + <br>text +</div></div> +<div class="container vertRL"><div class="inline">text + <div class="abs positioned-inline static-positioned-block start"></div> + <br>text +</div></div> +<br> +<!-- end aligned --> +<div class="container vertLR"><div class="inline">text + <div class="abs static-positioned-inline static-positioned-block end"></div> + <br>text +</div></div> +<div class="container vertRL"><div class="inline">text + <div class="abs static-positioned-inline positioned-block end"></div> + <br>text +</div></div> +<div class="container vertLR"><div class="inline">text + <div class="abs positioned-inline static-positioned-block end"></div> + <br>text +</div></div> +<br> +<!-- center aligned --> +<div class="container vertRL"><div class="inline">text + <div class="abs static-positioned-inline static-positioned-block center"></div> + <br>text +</div></div> +<div class="container vertLR"><div class="inline">text + <div class="abs static-positioned-inline positioned-block center"></div> + <br>text +</div></div> +<div class="container vertRL"><div class="inline">text + <div class="abs positioned-inline static-positioned-block center"></div> + <br>text +</div></div> diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-005-ref.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-005-ref.html new file mode 100644 index 00000000000..947bd270448 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-005-ref.html @@ -0,0 +1,21 @@ +<!DOCTYPE html> +<link rel="stylesheet" href="/fonts/ahem.css"> +<style> +.container { + position: relative; + border: 1px solid; +} + +.abs { + position: absolute; + background: purple; + opacity: 0.5; + bottom: 0px; +} +</style> +<div class="container"> + <span style="font: 20px Ahem;">hello + <span class="abs">hello</span> + <span style="vertical-align: top; font-size: 50px;">world</span> + </span> +</div> diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-005.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-005.html new file mode 100644 index 00000000000..e148f0ebda3 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-005.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<title>Align-self applies to OOF elements of inline elements when statically positioned.</title> +<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com"> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-self-normal"> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-justify-self-normal"> +<link rel="help" href="https://drafts.csswg.org/css-position-3/#abspos-alignment"> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-abspos"> +<link rel="help" href="https://issues.chromium.org/issues/409806799"> +<link rel="match" href="align-self-static-position-005-ref.html"> +<link rel="stylesheet" href="/fonts/ahem.css"> +<style> +.container { + position: relative; + border: 1px solid; +} + +.abs { + position: absolute; + background: purple; + align-self: end; + opacity: 0.5; +} +</style> +<div class="container"> + <span style="font: 20px Ahem;">hello + <span class="abs">hello</span> + <span style="vertical-align: top; font-size: 50px;">world</span> + </span> +</div> diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-006-ref.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-006-ref.html new file mode 100644 index 00000000000..5bbafc64845 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-006-ref.html @@ -0,0 +1,48 @@ +<!DOCTYPE html> +<style> +.block { + width: 75px; + height: 75px; + z-index: -1; + border: 5px dotted blue; +} + +.container { + border: 1px solid; + position: relative; + width: 100px; + height: 100px; + display: inline-block; + margin-left: 50px; + margin-bottom: 50px; +} + +.abs { + width: 50px; + height: 50px; + position: absolute; + background: purple; +} +</style> +<!-- start aligned --> +<div class="container"><div class="block"> + <div class="abs"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="left: 30px;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs"></div> +</div></div> +<br> +<!-- end aligned --> +<div class="container"><div class="block"> + <div class="abs" style="top: -45px; left: 30px;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="top: -45px;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="top: -45px; left: 30px;"></div> +</div></div> +<br> diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-006.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-006.html new file mode 100644 index 00000000000..253b2a52f61 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-006.html @@ -0,0 +1,64 @@ +<!DOCTYPE html> +<title>Align-self:self-start/end applies to OOF elements of block elements when statically positioned.</title> +<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com"> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-self-auto"> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-justify-self-auto"> +<link rel="help" href="https://drafts.csswg.org/css-position-3/#abspos-alignment"> +<link rel="help" href="https://issues.chromium.org/issues/409806799"> +<link rel="match" href="align-self-static-position-006-ref.html"> +<style> +.block { + display: block; + width: 75%; + height: 75%; + border: 5px dotted blue; +} + +.container { + border: 1px solid; + position: relative; + display: inline-block; + width: 100px; + height: 100px; + margin-left: 50px; + margin-bottom: 50px; +} + +.abs { + width: 50px; + height: 50px; + position: absolute; + background: purple; +} + +.end { + justify-self: self-end; + align-self: self-end; +} + +.start { + justify-self: self-start; + align-self: self-start; +} +</style> +<!-- self-start aligned --> +<div class="container"><div class="block"> + <div class="abs start"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs start" style="direction: rtl;"></div> +</div></div> +<div class="container"><div class="block" style="direction: rtl;"> + <div class="abs start" style="direction: ltr;"></div> +</div></div> +<br> +<!-- self-end aligned --> +<div class="container"><div class="block"> + <div class="abs end"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs end" style="direction: rtl;"></div> +</div></div> +<div class="container"><div class="block" style="direction: rtl;"> + <div class="abs end" style="direction: ltr;"></div> +</div></div> diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-007-ref.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-007-ref.html new file mode 100644 index 00000000000..bc9b5f4f650 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-007-ref.html @@ -0,0 +1,48 @@ +<!DOCTYPE html> +<link rel="stylesheet" href="/fonts/ahem.css"> +<style> +.inline { + display: inline; + color: transparent; + font: 10px Ahem; + line-height: 25px; +} + +.container { + border: 1px solid; + position: relative; + width: 100px; + height: 100px; + display: inline-block; + margin-left: 50px; + margin-bottom: 50px; +} + +.abs { + width: 50px; + height: 50px; + position: absolute; + background: purple; +} +</style> +<!-- start aligned --> +<div class="container"><div class="inline">text + <div class="abs" style="top: 25px;"></div> +</div></div> +<div class="container"><div class="inline">text + <div class="abs" style="left: -50px;"></div> +</div></div> +<div class="container"><div class="inline">text + <div class="abs" style="top: 0px;"></div> +</div></div> +<br> +<!-- end aligned --> +<div class="container"><div class="inline">text + <div class="abs" style="bottom: 50px; left: -50px"></div> +</div></div> +<div class="container"><div class="inline">text + <div class="abs" style="top: 0px;"></div> +</div></div> +<div class="container"><div class="inline">text + <div class="abs" style="top: -25px; left: -50px;"></div> +</div></div> diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-007.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-007.html new file mode 100644 index 00000000000..ebe872aaab9 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-007.html @@ -0,0 +1,71 @@ +<!DOCTYPE html> +<title>Align-self:self-start/end applies to OOF elements of inline elements when statically positioned.</title> +<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com"> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-self-auto"> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-justify-self-auto"> +<link rel="help" href="https://drafts.csswg.org/css-position-3/#abspos-alignment"> +<link rel="help" href="https://issues.chromium.org/issues/409806799"> +<link rel="match" href="align-self-static-position-007-ref.html"> +<link rel="stylesheet" href="/fonts/ahem.css"> +<style> +.inline { + display: inline; + color: transparent; + font: 10px Ahem; + line-height: 25px; +} + +.container { + border: 1px solid; + position: relative; + width: 100px; + height: 100px; + display: inline-block; + margin-left: 50px; + margin-bottom: 50px; +} + +.abs { + width: 50px; + height: 50px; + position: absolute; + background: purple; +} + +.end { + justify-self: self-end; + align-self: self-end; +} + +.start { + justify-self: self-start; + align-self: self-start; +} +</style> +<!-- self-start aligned --> +<div class="container"><div class="inline">text + <div class="abs start"></div> + <br>text +</div></div> +<div class="container"><div class="inline">text + <div class="abs start" style="direction: rtl;"></div> + <br>text +</div></div> +<div class="container"><div class="inline" style="direction: rtl;">text + <div class="abs start" style="direction: ltr;"></div> + <br>text +</div></div> +<br> +<!-- self-end aligned --> +<div class="container"><div class="inline">text + <div class="abs end"></div> + <br>text +</div></div> +<div class="container"><div class="inline">text + <div class="abs end" style="direction: rtl;"></div> + <br>text +</div></div> +<div class="container"><div class="inline" style="direction: rtl;">text + <div class="abs end" style="direction: ltr;"></div> + <br>text +</div></div> diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-008-ref.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-008-ref.html new file mode 100644 index 00000000000..79cf612b8f8 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-008-ref.html @@ -0,0 +1,103 @@ +<!DOCTYPE html> +<style> +.block { + display: block; + width: 75%; + height: 75%; + border: 5px dotted blue; +} + +.container { + border: 1px solid; + position: relative; + display: inline-block; + width: 100px; + height: 100px; + margin-left: 50px; + margin-bottom: 50px; +} + +.abs { + width: 50px; + height: 50px; + position: absolute; + background: purple; +} +</style> +<!-- justify-self --> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: start;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: start;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: end;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: start;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: start;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: end;"></div> +</div></div> +<br> +<div class="container"><div class="block"> + <div class="abs" style="left: 25px;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: start;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: start;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: end;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: start;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: start;"></div> +</div></div> +<br> +<!-- align-self --> +<div class="container"><div class="block"> + <div class="abs" style="align-self: start;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="align-self: start;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="align-self: start;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="align-self: start;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="align-self: start;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="align-self: end;"></div> +</div></div> +<br> +<div class="container"><div class="block"> + <div class="abs" style="top: 25px;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="align-self: start;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="align-self: start;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="align-self: end;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="align-self: start;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="align-self: start;"></div> +</div></div> diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-008.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-008.html new file mode 100644 index 00000000000..187974884b4 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-008.html @@ -0,0 +1,110 @@ +<!DOCTYPE html> +<title>Align-self applies to OOF elements of block elements when statically positioned.</title> +<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com"> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-self-auto"> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-justify-self-auto"> +<link rel="help" href="https://drafts.csswg.org/css-position-3/#abspos-alignment"> +<link rel="help" href="https://issues.chromium.org/issues/409806799"> +<link rel="match" href="align-self-static-position-008-ref.html"> +<style> +.block { + display: block; + width: 75%; + height: 75%; + border: 5px dotted blue; +} + +.container { + border: 1px solid; + position: relative; + display: inline-block; + width: 100px; + height: 100px; + margin-left: 50px; + margin-bottom: 50px; +} + +.abs { + width: 50px; + height: 50px; + position: absolute; + background: purple; +} +</style> +<!-- justify-self --> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: auto;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: normal;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: right;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: left;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: flex-start;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: flex-end;"></div> +</div></div> +<br> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: anchor-center;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: baseline;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: first baseline;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: last baseline;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: legacy;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="justify-self: stretch;"></div> +</div></div> +<br> +<!-- align-self --> +<div class="container"><div class="block"> + <div class="abs" style="align-self: auto;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="align-self: normal;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="align-self: right;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="align-self: left;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="align-self: flex-start;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="align-self: flex-end;"></div> +</div></div> +<br> +<div class="container"><div class="block"> + <div class="abs" style="align-self: anchor-center;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="align-self: baseline;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="align-self: first baseline;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="align-self: last baseline;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="align-self: legacy;"></div> +</div></div> +<div class="container"><div class="block"> + <div class="abs" style="align-self: stretch;"></div> +</div></div> diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-stretch-auto-margins-aspect-ratio.html b/tests/wpt/tests/css/css-align/abspos/align-self-stretch-auto-margins-aspect-ratio.html new file mode 100644 index 00000000000..4eaa9d2f3a6 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-stretch-auto-margins-aspect-ratio.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/11195#issuecomment-2824879710"> +<link rel="match" href="../../reference/ref-filled-green-100px-square.xht"> +<style> +.container { + position: relative; + width: 200px; + height: 200px; + top: -50px; + left: -50px; +} +.abspos { + position: absolute; + inset: 10px auto 10px 50px; + margin: auto 0 auto 0; + align-self: stretch; + background: green; +} +.abspos::before { + content: ''; + min-width: 100px; + height: 100%; + aspect-ratio: 1; + display: block; +} +</style> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div class="container"> + <div class="abspos"></div> +</div> diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-stretch-auto-margins.html b/tests/wpt/tests/css/css-align/abspos/align-self-stretch-auto-margins.html new file mode 100644 index 00000000000..9d1b6454c84 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/align-self-stretch-auto-margins.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/11195#issuecomment-2824879710"> +<link rel="match" href="../../reference/ref-filled-green-100px-square.xht"> +<style> +.container { + position: relative; + width: 200px; + height: 200px; + top: -50px; + left: -50px; +} +.abspos { + position: absolute; + inset: 10px 50px 10px 50px; + margin: auto 0 auto 0; + align-self: stretch; + background: green; +} +.abspos::before { + content: ''; + width: 100px; + height: 100px; + display: block; +} +</style> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div class="container"> + <div class="abspos"></div> +</div> diff --git a/tests/wpt/tests/css/css-align/abspos/justify-self-stretch-auto-margins-aspect-ratio.html b/tests/wpt/tests/css/css-align/abspos/justify-self-stretch-auto-margins-aspect-ratio.html new file mode 100644 index 00000000000..c50b32f089b --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/justify-self-stretch-auto-margins-aspect-ratio.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/11195#issuecomment-2824879710"> +<link rel="match" href="../../reference/ref-filled-green-100px-square.xht"> +<style> +.container { + position: relative; + width: 200px; + height: 200px; + top: -50px; + left: -50px; +} +.abspos { + position: absolute; + inset: 50px 10px auto 10px; + margin: 0 auto 0 auto; + justify-self: stretch; + background: green; +} +.abspos::before { + content: ''; + width: 100%; + min-height: 100px; + aspect-ratio: 1; + display: block; +} +</style> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div class="container"> + <div class="abspos"></div> +</div> diff --git a/tests/wpt/tests/css/css-align/abspos/justify-self-stretch-auto-margins.html b/tests/wpt/tests/css/css-align/abspos/justify-self-stretch-auto-margins.html new file mode 100644 index 00000000000..7d7b4bfc857 --- /dev/null +++ b/tests/wpt/tests/css/css-align/abspos/justify-self-stretch-auto-margins.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/11195#issuecomment-2824879710"> +<link rel="match" href="../../reference/ref-filled-green-100px-square.xht"> +<style> +.container { + position: relative; + width: 200px; + height: 200px; + top: -50px; + left: -50px; +} +.abspos { + position: absolute; + inset: 50px 10px 50px 10px; + margin: 0 auto 0 auto; + justify-self: stretch; + background: green; +} +.abspos::before { + content: ''; + width: 100px; + height: 100px; + display: block; +} +</style> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div class="container"> + <div class="abspos"></div> +</div> diff --git a/tests/wpt/tests/css/css-animations/crashtests/chrome-bug-405795970.html b/tests/wpt/tests/css/css-animations/crashtests/chrome-bug-405795970.html new file mode 100644 index 00000000000..5b45527fd9c --- /dev/null +++ b/tests/wpt/tests/css/css-animations/crashtests/chrome-bug-405795970.html @@ -0,0 +1,17 @@ +<!DOCTYPE html> +<link rel="help" href="https://crbug.com/405795970"> +<style> + @keyframes --anim { + from { + width: calc(10px * sibling-index()); + } + to { + width: calc(50px); + } + } + #target { + animation: --anim 2s; + } +</style> +<p>Pass if no crash</p> +<div id="target"></div> diff --git a/tests/wpt/tests/css/css-box/parsing/margin-trim-computed.html b/tests/wpt/tests/css/css-box/parsing/margin-trim-computed.html index ad2d17f2ef0..c38adea9a68 100644 --- a/tests/wpt/tests/css/css-box/parsing/margin-trim-computed.html +++ b/tests/wpt/tests/css/css-box/parsing/margin-trim-computed.html @@ -27,8 +27,13 @@ test_computed_value("margin-trim", "inline-start block-start", "block-start inli test_computed_value("margin-trim", "inline-end block-start", "block-start inline-end"); test_computed_value("margin-trim", "inline-end block-end", "block-end inline-end"); test_computed_value("margin-trim", "block-start block-end inline-start", "block-start inline-start block-end"); -test_computed_value("margin-trim", "inline-start block-start inline-end block-end", "block-start inline-start block-end inline-end"); -test_computed_value("margin-trim", "inline-start inline-end block-start", "block-start inline-start inline-end"); + +test_computed_value("margin-trim", "block-start inline-start block-end inline-end", "block inline"); +test_computed_value("margin-trim", "block-start block-end inline-end inline-start", "block inline"); +test_computed_value("margin-trim", "block-start block-end inline-start inline-end", "block inline"); +test_computed_value("margin-trim", "inline-start block-end block-start inline-end", "block inline"); +test_computed_value("margin-trim", "inline-start inline-end block-start block-end", "block inline"); +test_computed_value("margin-trim", "inline-end block-end inline-start block-start", "block inline"); </script> </body> </html> diff --git a/tests/wpt/tests/css/css-box/parsing/margin-trim.html b/tests/wpt/tests/css/css-box/parsing/margin-trim.html index 0d92f80b9b9..e8679f9cbf3 100644 --- a/tests/wpt/tests/css/css-box/parsing/margin-trim.html +++ b/tests/wpt/tests/css/css-box/parsing/margin-trim.html @@ -21,6 +21,9 @@ test_valid_value("margin-trim", "block-end"); test_valid_value("margin-trim", "inline-start"); test_valid_value("margin-trim", "inline-end"); +test_valid_value("margin-trim", "block inline"); +test_valid_value("margin-trim", "inline block"); + // Serialize values into either block or inline test_valid_value("margin-trim", "block-start block-end", "block"); test_valid_value("margin-trim", "inline-start inline-end", "inline"); @@ -29,10 +32,15 @@ test_valid_value("margin-trim", "inline-end inline-start", "inline"); test_valid_value("margin-trim", "inline-start block-start"); test_valid_value("margin-trim", "inline-end block-start block-end"); -test_valid_value("margin-trim", "block-start inline-start block-end inline-end"); -test_valid_value("margin-trim", "inline-end block-end inline-start block-start"); -test_invalid_value("margin-trim", "block inline"); +// Serialize 4 values into "block inline" +test_valid_value("margin-trim", "block-start inline-start block-end inline-end", "block inline"); +test_valid_value("margin-trim", "block-start block-end inline-end inline-start", "block inline"); +test_valid_value("margin-trim", "block-start block-end inline-start inline-end", "block inline"); +test_valid_value("margin-trim", "inline-start block-end block-start inline-end", "block inline"); +test_valid_value("margin-trim", "inline-start inline-end block-start block-end", "block inline"); +test_valid_value("margin-trim", "inline-end block-end inline-start block-start", "block inline"); + test_invalid_value("margin-trim", "block block"); test_invalid_value("margin-trim", "inline inline"); test_invalid_value("margin-trim", "block inline-start inline-end"); diff --git a/tests/wpt/tests/css/css-easing/linear-timing-functions-syntax.html b/tests/wpt/tests/css/css-easing/linear-timing-functions-syntax.html index 0c949e9ea7d..408264b58df 100644 --- a/tests/wpt/tests/css/css-easing/linear-timing-functions-syntax.html +++ b/tests/wpt/tests/css/css-easing/linear-timing-functions-syntax.html @@ -26,6 +26,7 @@ test_valid_value("animation-timing-function", "linear(0, 0.5 25% 75%, 1 100% 100 test_valid_value("animation-timing-function", "linear(0, 1.3, 1, 0.92, 1, 0.99, 1, 0.998, 1 100% 100%)"); test_valid_value("animation-timing-function", "linear(0, 0 40%, 1, 0.5, 1)"); test_valid_value("animation-timing-function", "linear(0, 1.3, 1, 0.92, 1, 0.99, 1, 1.004, 0.998, 1 100% 100%)"); +test_valid_value("animation-timing-function", "linear(calc(0/0), 1)", "linear(0 0%, 1 100%)"); test_invalid_value("animation-timing-function", "linear()"); test_invalid_value("animation-timing-function", "linear(0)"); diff --git a/tests/wpt/tests/css/css-easing/step-timing-functions-syntax.html b/tests/wpt/tests/css/css-easing/step-timing-functions-syntax.html index 4e8b21e4413..e8465ff7a33 100644 --- a/tests/wpt/tests/css/css-easing/step-timing-functions-syntax.html +++ b/tests/wpt/tests/css/css-easing/step-timing-functions-syntax.html @@ -29,6 +29,7 @@ test_invalid_value("animation-timing-function", "steps(0, jump-start)"); test_invalid_value("animation-timing-function", "steps(0, jump-end)"); test_invalid_value("animation-timing-function", "steps(0, jump-both)"); test_invalid_value("animation-timing-function", "steps(1, jump-none)"); +test_invalid_value("animation-timing-function", "steps(calc(0/0), jump-none)"); </script> </body> diff --git a/tests/wpt/tests/css/css-fonts/parsing/font-palette-values-invalid.html b/tests/wpt/tests/css/css-fonts/parsing/font-palette-values-invalid.html index a3a0a88ba68..32c9c4c5efe 100644 --- a/tests/wpt/tests/css/css-fonts/parsing/font-palette-values-invalid.html +++ b/tests/wpt/tests/css/css-fonts/parsing/font-palette-values-invalid.html @@ -140,13 +140,18 @@ @font-palette-values --A { override-colors: 0 color-mix(in lch, red, color-mix(in lch, currentcolor, black)); } + +/* 24 */ +@font-palette-values --A { + base-palette: sibling-index(); +} </style> </head> <body> <script> let rules = document.getElementById("style").sheet.cssRules; test(function() { - assert_equals(rules.length, 24); + assert_equals(rules.length, 25); }); test(function() { @@ -343,6 +348,13 @@ test(function() { assert_equals(text.indexOf("override-colors"), -1); assert_equals(rule.overrideColors, ""); }); + +test(function() { + let text = rules[24].cssText; + let rule = rules[24]; + assert_equals(text.indexOf("base-palette"), -1); + assert_equals(rule.basePalette, ""); +}, "sibling-index() is invalid in base-palette descriptor"); </script> </body> </html> diff --git a/tests/wpt/tests/css/css-fonts/test_font_feature_values_parsing.html b/tests/wpt/tests/css/css-fonts/test_font_feature_values_parsing.html index 7a5844d5600..08c20142449 100644 --- a/tests/wpt/tests/css/css-fonts/test_font_feature_values_parsing.html +++ b/tests/wpt/tests/css/css-fonts/test_font_feature_values_parsing.html @@ -81,6 +81,7 @@ var testrules = [ { rule: _("@styleset { ok-1: 1; }"), serializationSame: true }, { rule: _("@annotation { ok-1: 3; }"), serializationSame: true }, { rule: _("@stylistic { blah: 3; }"), serializationSame: true }, + { rule: _("@stylistic { blah: sibling-index(); }"), serializationNoValueDefn: true }, { rule: makeRule("bongo", "\n@styleset\n { blah: 3; super-blah: 4 5;\n more-blah: 5 6 7;\n }"), serializationSame: true }, { rule: makeRule("bongo", "\n@styleset\n {\n blah:\n 3\n;\n super-blah:\n 4\n 5\n;\n more-blah:\n 5 6\n 7;\n }"), serializationSame: true }, diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-001-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-001-ref.html new file mode 100644 index 00000000000..834c96ccd39 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-001-ref.html @@ -0,0 +1,49 @@ +<!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; + } + + .container { + border: 2px solid rgb(96 139 168); + width: 200px; + height: 130px; + column-gap: 10px; + display: flex; + } + + .items { + background: rgb(96 139 168 / 0.2); + height: 130px; + margin: 0px; + width: 60px; + } + + .row-gap { + position: absolute; + height: 10px; + width: 200px; + background: gold; + left: 2px; + top: 62px; + } + + .column-gap { + position: absolute; + height: 130px; + width: 10px; + background: blue; + top: 2px; + } +</style> + +<div class="container"> + <div class="items"></div> + <div class="items"></div> + <div class="items"></div> +</div> +<div class="column-gap" style="left:62px;"></div> +<div class="column-gap" style="left:132px;"></div> +<div class="row-gap"></div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-001.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-001.html new file mode 100644 index 00000000000..c3752156c7d --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-001.html @@ -0,0 +1,45 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: Multicolumn gap decorations painted with column-wrap. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="multicol-gap-decorations-001-ref.html"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .container { + border: 2px solid rgb(96 139 168); + width: 200px; + height: 130px; + column-count: 3; + column-width: 60px; + column-height: 60px; + column-gap: 10px; + row-gap: 10px; + column-rule-width: 10px; + column-rule-style: solid; + column-rule-color: blue; + row-rule-width: 10px; + row-rule-style: solid; + row-rule-color: gold; + column-wrap: wrap; + } + + p { + background: rgb(96 139 168 / 0.2); + height: 60px; + margin: 0px; + } +</style> + +<div class="container"> + <p></p> + <p></p> + <p></p> + <p></p> + <p></p> + <p></p> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-002-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-002-ref.html new file mode 100644 index 00000000000..d132f0ca677 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-002-ref.html @@ -0,0 +1,96 @@ +<!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; + } + + .outer { + border: 2px solid rgb(96 139 168); + width: 200px; + height: 200px; + } + + .container1 { + position: absolute; + top: 2px; + column-gap: 10px; + display: flex; + } + + .items1 { + background: rgb(96 139 168 / 0.2); + height: 40px; + margin: 0px; + width: 60px; + } + + .container2 { + position: absolute; + top: 60px; + column-gap: 10px; + display: flex; + } + + .items2 { + background: rgb(96 139 168 / 0.2); + height: 130px; + margin: 0px; + width: 60px; + } + + .row-gap { + position: absolute; + height: 10px; + width: 200px; + background: gold; + left: 2px; + top: 120px; + } + + .column-gap1 { + position: absolute; + height: 40px; + width: 10px; + background: blue; + top: 2px; + } + + .column-gap2 { + position: absolute; + height: 142px; + width: 10px; + background: blue; + top: 60px; + } + + .spanner { + position: absolute; + background: cyan; + width: 200px; + height: 18px; + top: 42px; + left: 2px; + opacity: 0.5; + } +</style> + +<div class="outer"> + <div class="container1"> + <div class="items1"></div> + <div class="items1"></div> + <div class="items1"></div> + </div> + <div class="container2"> + <div class="items2"></div> + <div class="items2"></div> + <div class="items2"></div> + </div> + <div class="column-gap1" style="left:62px;"></div> + <div class="column-gap1" style="left:132px;"></div> + <div class="column-gap2" style="left:62px;"></div> + <div class="column-gap2" style="left:132px;"></div> + <div class="row-gap"></div> + <div class="spanner"></div> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-002.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-002.html new file mode 100644 index 00000000000..0b632fa94ac --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-002.html @@ -0,0 +1,59 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: Multicolumn gap decorations painted with column-wrap and a spanner. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="multicol-gap-decorations-002-ref.html"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .container { + border: 2px solid rgb(96 139 168); + width: 200px; + height: 200px; + column-height: 60px; + column-gap: 10px; + row-gap: 10px; + column-rule-width: 10px; + column-rule-style: solid; + column-rule-color: blue; + row-rule-width: 10px; + row-rule-style: solid; + row-rule-color: gold; + column-wrap: wrap; + column-width: 60px; + column-count: 3; + column-fill: auto; + } + + p { + background: rgb(96 139 168 / 0.2); + height: 60px; + margin: 0px; + } + + h2 { + column-span: all; + background-color: cyan; + color: #fff; + margin: 0px; + opacity: 0.5; + height: 18px; + } +</style> + +<div class="container"> + <p></p> + <p></p> + <h2></h2> + + <p></p> + <p></p> + <p></p> + <p></p> + <p></p> + <p></p> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-003-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-003-ref.html new file mode 100644 index 00000000000..cd26da24389 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-003-ref.html @@ -0,0 +1,59 @@ +<!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; + } + + .outer { + + border: 2px solid rgb(96 139 168); + width: 200px; + height: 200px; + + } + + .container1 { + position: absolute; + top: 2px; + column-gap: 10px; + display: flex; + height: 200px; + } + + .items1 { + background: rgb(96 139 168 / 0.2); + height: 40px; + margin: 0px; + width: 60px; + height: 200px; + } + + .column-gap1 { + position: absolute; + height: 200px; + width: 10px; + background: blue; + top: 2px; + } + + .spanner { + position: absolute; + background: cyan; + width: 200px; + height: 18px; + top: 42px; + left: 2px; + opacity: 0.5; + } +</style> +<div class="outer"> + <div class="container1"> + <div class="items1"></div> + <div class="items1"></div> + <div class="items1"></div> + </div> + <div class="column-gap1" style="left:62px;"></div> + <div class="column-gap1" style="left:132px;"></div> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-003.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-003.html new file mode 100644 index 00000000000..2f2473fd046 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-003.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: Multicolumn gap decorations painted basic case. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="multicol-gap-decorations-003-ref.html"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + #container { + border: 2px solid rgb(96 139 168); + width: 200px; + column-count: 3; + column-width: 60px; + column-gap: 10px; + column-rule-width: 10px; + column-rule-style: solid; + column-rule-color: blue; + } + + p { + background: rgb(96 139 168 / 0.2); + height: 200px; + margin: 0px; + } +</style> + +<div id="container"> + <p></p> + <p></p> + <p></p> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-004-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-004-ref.html new file mode 100644 index 00000000000..002b1f2b594 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-004-ref.html @@ -0,0 +1,78 @@ +<!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; + } + + .outer { + border: 2px solid rgb(96 139 168); + width: 200px; + height: 130px; + } + + .container1 { + width: 200px; + height: 130px; + column-gap: 10px; + display: flex; + } + + .items1 { + background: rgb(96 139 168 / 0.2); + height: 60px; + margin: 0px; + width: 60px; + } + + .container2 { + position: absolute; + top: 72px; + left: 2px; + width: 200px; + height: 60px; + column-gap: 10px; + display: flex; + } + + .items2 { + background: rgb(96 139 168 / 0.2); + height: 60px; + margin: 0px; + width: 60px; + } + + .row-gap { + position: absolute; + height: 4px; + width: 200px; + background: gold; + left: 2px; + top: 65px; + } + + .column-gap { + position: absolute; + height: 130px; + width: 4px; + background: blue; + top: 2px; + } +</style> + +<div class="outer"> + <div class="container1"> + <div class="items1"></div> + <div class="items1"></div> + <div class="items1"></div> + </div> + <div class="container2"> + <div class="items2"></div> + <div class="items2"></div> + <div class="items2"></div> + </div> + <div class="column-gap" style="left:65px;"></div> + <div class="column-gap" style="left:135px;"></div> + <div class="row-gap"></div> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-004.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-004.html new file mode 100644 index 00000000000..0dcbeef4df8 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-004.html @@ -0,0 +1,46 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: Multicolumn gap decorations painted with smaller width than gap and column-wrap. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="multicol-gap-decorations-004-ref.html"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .container { + border: 2px solid rgb(96 139 168); + width: 200px; + height: 130px; + column-count: 3; + column-width: 60px; + column-height: 60px; + column-gap: 10px; + row-gap: 10px; + column-rule-width: 4px; + column-rule-style: solid; + column-rule-color: blue; + row-rule-width: 4px; + row-rule-style: solid; + row-rule-color: gold; + column-wrap: wrap; + column-fill: auto; + } + + p { + background: rgb(96 139 168 / 0.2); + height: 60px; + margin: 0px; + } +</style> + +<div class="container"> + <p></p> + <p></p> + <p></p> + <p></p> + <p></p> + <p></p> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-005-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-005-ref.html new file mode 100644 index 00000000000..6543021c979 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-005-ref.html @@ -0,0 +1,64 @@ +<!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; + } + + .outer { + display: flex; + border: 1px solid #ccc; + height: 50px; + width: 210px; + column-gap: 10px; + } + + .outer-items { + background: rgb(96 139 168 / 0.2); + height 50px; + width: 100px; + } + + .inner { + display: flex; + height: 50px; + column-gap: 10px; + width: 100px; + } + + .inner-items { + height: 50px; + width: 45px; + background: black; + } + + .column-gap { + position: absolute; + height: 50px; + top: 1px; + left: 101px; + width: 10px; + } + + .row-gap { + position: absolute; + background: purple; + height: 10px; + top: 21px; + left: 111px; + width: 100px; + } +</style> +<div class="outer"> + <div class="outer-items"></div> + <div class="outer-items" id="nested"> + <div class="inner"> + <div class="inner-items"></div> + <div class="inner-items"></div> + </div> + </div> +</div> +<div class="column-gap" style="background: blue;"></div> +<div class="column-gap" style="background: gold; left: 156px"></div> +<div class="row-gap"></div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-005.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-005.html new file mode 100644 index 00000000000..daa65e904e7 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-005.html @@ -0,0 +1,64 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: Multicolumn gap decorations painted with nested multicol with column wrap. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="multicol-gap-decorations-005-ref.html"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .outer-container { + column-count: 2; + column-gap: 10px; + column-rule-width: 10px; + column-rule-style: solid; + column-rule-color: blue; + border: 1px solid #ccc; + width: 210px; + height: 50px; + } + + .nested-container { + column-count: 2; + column-gap: 10px; + width: 100px; + column-rule-width: 10px; + column-rule-style: solid; + column-rule-color: gold; + row-gap: 10px; + row-rule-width: 10px; + row-rule-style: solid; + row-rule-color: purple; + column-wrap: wrap; + column-fill: auto; + column-height: 20px; + } + + .column1 { + background: rgb(96 139 168 / 0.2); + width: 100px; + height: 50px + } + + .nested-column { + background: black; + width: 45px; + height: 20px; + } +</style> + +<div class="outer-container"> + <div class="column1"> + </div> + <div class="column2"> + <div class="nested-container"> + <div class="nested-column"></div> + <div class="nested-column"></div> + <div class="nested-column"></div> + <div class="nested-column"></div> + </div> + </div> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-006-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-006-ref.html new file mode 100644 index 00000000000..4cb56d207fe --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-006-ref.html @@ -0,0 +1,52 @@ +<!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> + .outer-container { + columns: 3; + column-fill: auto; + height: 100px; + width: 600px; + gap: 10px; + background: yellow; + } + + .nested-container { + columns: 2; + box-decoration-break: clone; + padding: 10px; + gap: 10px; + background: cyan; + } + + .inner-column { + height: 250px; + background: hotpink; + width: 80px; + } + + #col-gap1 { + position: absolute; + height: 80px; + width: 1px; + background: green; + top: 18px; + left: 104px; + } + + #col-gap2 { + position: absolute; + width: 1px; + background: green; + top: 18px; + left: 307px; + height: 45px; + } +</style> +<div class="outer-container"> + <div class="nested-container"> + <div class="inner-column"></div> + </div> +</div> +<div id="col-gap1"></div> +<div id="col-gap2"></div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-006.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-006.html new file mode 100644 index 00000000000..64b3b007ab5 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-006.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: Multicolumn gap decorations painted with nested fragmented multicol. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="multicol-gap-decorations-006-ref.html"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + .outer-container { + columns: 3; + column-fill: auto; + height: 100px; + width: 600px; + gap: 10px; + background: yellow; + } + + .nested-container { + columns: 2; + box-decoration-break: clone; + padding: 10px; + column-rule: solid; + column-rule-color: green; + column-rule-width: 1px; + background: cyan; + gap: 10px; + } + + .inner-column { + height: 250px; + background: hotpink; + width: 80px; + } +</style> +<div class="outer-container"> + <div class="nested-container"> + <div class="inner-column"></div> + </div> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-007-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-007-ref.html new file mode 100644 index 00000000000..09973ddc690 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-007-ref.html @@ -0,0 +1,133 @@ +<!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; + } + + #outer { + width: 620px; + height: 200px; + background: yellow; + } + + .inner1 { + border-top: 2px solid; + border-left: 2px solid; + border-right: 2px solid; + background: cyan; + height: 198px; + width: 296px; + } + + .inner2 { + border-bottom: 2px solid; + border-left: 2px solid; + border-right: 2px solid; + position: absolute; + left: 320px; + top: 0px; + height: 130px; + width: 296px; + background: cyan + } + + .inner-flex { + display: flex; + column-gap: 20px; + } + + .inner-items { + background: hotpink; + width: 85.333px; + } + + .column-gap1 { + width: 10px; + background: blue; + position: absolute; + top: 2px; + } + + .column-gap2 { + width: 10px; + background: blue; + position: absolute; + top: 40px; + } + + .spanner { + background: grey; + opacity: 0.5; + height: 18px; + width: 296px; + } + + .row-gap1 { + height: 10px; + background: green; + position: relative; + width: 296px; + top: 105px; + } + + .row-gap2 { + height: 10px; + background: green; + position: absolute; + width: 296px; + top: 105px; + } + + .column-gap3 { + background: blue; + height: 130px; + position: absolute; + width: 10px; + top: 0px; + } +</style> + +<div id="outer"> + <div class="inner1"> + <div class="inner-flex"> + <div class="inner-items" style="height:20px;"></div> + <div class="inner-items" style="height:20px" ;></div> + <div class="inner-items" style="height:20px;"></div> + </div> + <div class="inner-flex" style="position: absolute; left:2px; top:40px"> + <div class="inner-items" style="height:100px;"></div> + <div class="inner-items" style="height:100px" ;></div> + <div class="inner-items" style="height:100px;"></div> + </div> + <div class="inner-flex" style="position: absolute; left:2px; top:160px"> + <div class="inner-items" style="height:40px;"></div> + <div class="inner-items" style="height:40px" ;></div> + <div class="inner-items" style="height:40px;"></div> + </div> + <div class="spanner"></div> + <div class="column-gap1" style="height: 20px; left:calc(2px + 85.333px + 5px)"></div> + <div class="column-gap1" style="height: 20px; left:calc(2px + 85.333px + 5px + 10px + 5px + 85.333px + 5px)"> + </div> + <div class="column-gap2" style="height: 160px; left:calc(2px + 85.333px + 5px)"></div> + <div class="column-gap2" style="height: 160px; left:calc(2px + 85.333px + 5px + 10px + 5px + 85.333px + 5px)"> + </div> + <div class="row-gap1"></div> + </div> + <div class="inner2"> + <div class="inner-flex"> + <div class="inner-items" style="height:100px"></div> + <div class="inner-items" style="height:100px"></div> + <div class="inner-items" style="height:100px"></div> + </div> + <div class="inner-flex" style="position: absolute; top:120px;"> + <div class="inner-items" style="height:10px"></div> + <div class="inner-items" style="height:10px"></div> + <div class="inner-items" style="height:10px"></div> + </div> + <div class="column-gap3" style="left:calc(85.333px + 5px);"></div> + <div class="column-gap3" style="left:calc(85.333px + 5px + 10px + 5px + 85.333px + 5px);"></div> + <div class="row-gap2"></div> + </div> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-007.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-007.html new file mode 100644 index 00000000000..1f23ed7f7ca --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-007.html @@ -0,0 +1,44 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: Multicolumn gap decorations painted with nested fragmented multicol. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="multicol-gap-decorations-007-ref.html"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + #outer { + width: 620px; + columns: 2; + column-fill: auto; + gap: 20px; + height: 200px; + background: yellow; + } + + #inner { + columns: 3; + border: 2px solid; + gap: 20px; + column-height: 100px; + column-rule-style: solid; + column-rule-color: blue; + column-rule-width: 10px; + row-rule-style: solid; + row-rule-color: green; + row-rule-width: 10px; + column-wrap: wrap; + background: cyan; + } +</style> + +<div id="outer"> + <div id="inner"> + <div style="height:60px; background:hotpink;"></div> + <div style="column-span:all; background: grey; opacity: 0.5; height:18px"></div> + <div style="height:750px; background:hotpink;"></div> + </div> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-008-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-008-ref.html new file mode 100644 index 00000000000..d49c2f50f19 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-008-ref.html @@ -0,0 +1,115 @@ +<!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; + } + + .outer { + border: 2px solid rgb(96 139 168); + width: 200px; + height: 200px; + } + + .container1 { + position: absolute; + top: 2px; + column-gap: 10px; + display: flex; + } + + .items1 { + background: rgb(96 139 168 / 0.2); + height: 40px; + margin: 0px; + width: 60px; + } + + .container2 { + position: absolute; + top: 60px; + column-gap: 10px; + display: flex; + } + + .items2 { + background: rgb(96 139 168 / 0.2); + height: 130px; + margin: 0px; + width: 60px; + } + + .row-gap { + position: absolute; + height: 10px; + width: 200px; + left: 2px; + top: 120px; + display: flex; + column-gap: 10px; + } + + .row-gap-items { + width: 60px; + background: gold; + } + + .column-gap1 { + position: absolute; + height: 40px; + width: 10px; + background: blue; + top: 2px; + } + + .column-gap2 { + position: absolute; + height: 60px; + width: 10px; + background: blue; + top: 60px; + } + + .spanner { + position: absolute; + background: cyan; + width: 200px; + height: 18px; + top: 42px; + left: 2px; + opacity: 0.5; + } + + .column-gap3 { + position: absolute; + height: 72px; + width: 10px; + background: blue; + top: 130px; + } +</style> +<div class="outer"> + <div class="container1"> + <div class="items1"></div> + <div class="items1"></div> + <div class="items1"></div> + </div> + <div class="container2"> + <div class="items2"></div> + <div class="items2"></div> + <div class="items2"></div> + </div> + <div class="row-gap"> + <div class="row-gap-items"></div> + <div class="row-gap-items"></div> + <div class="row-gap-items"></div> + </div> + <div class="spanner"></div> + <div class="column-gap1" style="left:62px;"></div> + <div class="column-gap1" style="left:132px;"></div> + <div class="column-gap2" style="left:62px;"></div> + <div class="column-gap2" style="left:132px;"></div> + <div class="column-gap3" style="left:62px;"></div> + <div class="column-gap3" style="left:132px;"></div> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-008.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-008.html new file mode 100644 index 00000000000..ed299b5d9f6 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-008.html @@ -0,0 +1,63 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: Multicolumn gap decorations painted with 0px outset and rule-break intersection. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="multicol-gap-decorations-008-ref.html"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .container { + border: 2px solid rgb(96 139 168); + width: 200px; + height: 200px; + column-height: 60px; + column-gap: 10px; + row-gap: 10px; + column-rule-width: 10px; + column-rule-style: solid; + column-rule-color: blue; + row-rule-width: 10px; + row-rule-style: solid; + row-rule-color: gold; + row-rule-break: intersection; + column-rule-break: intersection; + column-rule-outset: 0px; + row-rule-outset: 0px; + column-wrap: wrap; + column-width: 60px; + column-count: 3; + column-fill: auto; + } + + p { + background: rgb(96 139 168 / 0.2); + height: 60px; + margin: 0px; + } + + h2 { + column-span: all; + background-color: cyan; + color: #fff; + margin: 0px; + opacity: 0.5; + height: 18px; + } +</style> + +<div class="container"> + <p></p> + <p></p> + <h2></h2> + + <p></p> + <p></p> + <p></p> + <p></p> + <p></p> + <p></p> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-009-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-009-ref.html new file mode 100644 index 00000000000..124bf7eaeb1 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-009-ref.html @@ -0,0 +1,116 @@ +<!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; + } + + .outer { + border: 2px solid rgb(96 139 168); + width: 200px; + height: 200px; + } + + .container1 { + position: absolute; + top: 2px; + column-gap: 10px; + display: flex; + } + + .items1 { + background: rgb(96 139 168 / 0.2); + height: 40px; + margin: 0px; + width: 60px; + } + + .container2 { + position: absolute; + top: 60px; + column-gap: 10px; + display: flex; + } + + .items2 { + background: rgb(96 139 168 / 0.2); + height: 130px; + margin: 0px; + width: 60px; + } + + .row-gap { + position: absolute; + height: 10px; + width: 204px; + left: 0px; + top: 120px; + display: flex; + column-gap: 6px; + } + + .row-gap-items { + width: 64px; + background: gold; + } + + .column-gap1 { + position: absolute; + height: 44px; + width: 10px; + background: blue; + top: 0px; + } + + .column-gap2 { + position: absolute; + height: 64px; + width: 10px; + background: blue; + top: 58px; + } + + .spanner { + position: absolute; + background: cyan; + width: 200px; + height: 18px; + top: 42px; + left: 2px; + opacity: 0.5; + } + + .column-gap3 { + position: absolute; + height: 76px; + width: 10px; + background: blue; + top: 128px; + } +</style> + +<div class="outer"> + <div class="container1"> + <div class="items1"></div> + <div class="items1"></div> + <div class="items1"></div> + </div> + <div class="container2"> + <div class="items2"></div> + <div class="items2"></div> + <div class="items2"></div> + </div> + <div class="column-gap1" style="left:62px;"></div> + <div class="column-gap1" style="left:132px;"></div> + <div class="column-gap2" style="left:62px;"></div> + <div class="column-gap2" style="left:132px;"></div> + <div class="spanner"></div> + <div class="column-gap3" style="left:62px;"></div> + <div class="column-gap3" style="left:132px;"></div> + <div class="row-gap"> + <div class="row-gap-items"></div> + <div class="row-gap-items"></div> + <div class="row-gap-items"></div> + </div> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-009.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-009.html new file mode 100644 index 00000000000..b00c6a70f8a --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-009.html @@ -0,0 +1,63 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: Multicolumn gap decorations painted with 2px outset and rule-break intersection. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="multicol-gap-decorations-009-ref.html"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .container { + border: 2px solid rgb(96 139 168); + width: 200px; + height: 200px; + column-height: 60px; + column-gap: 10px; + row-gap: 10px; + column-rule-width: 10px; + column-rule-style: solid; + column-rule-color: blue; + row-rule-width: 10px; + row-rule-style: solid; + row-rule-color: gold; + row-rule-break: intersection; + column-rule-break: intersection; + column-rule-outset: 2px; + row-rule-outset: 2px; + column-wrap: wrap; + column-width: 60px; + column-count: 3; + column-fill: auto; + } + + p { + background: rgb(96 139 168 / 0.2); + height: 60px; + margin: 0px; + } + + h2 { + column-span: all; + background-color: cyan; + color: #fff; + margin: 0px; + opacity: 0.5; + height: 18px; + } +</style> + +<div class="container"> + <p></p> + <p></p> + <h2></h2> + + <p></p> + <p></p> + <p></p> + <p></p> + <p></p> + <p></p> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-010-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-010-ref.html new file mode 100644 index 00000000000..9582ab4103d --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-010-ref.html @@ -0,0 +1,135 @@ +<!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; + } + + .outer { + border: 2px solid rgb(96 139 168); + width: 200px; + height: 200px; + } + + .container1 { + position: absolute; + top: 2px; + column-gap: 10px; + display: flex; + } + + .items1 { + background: rgb(96 139 168 / 0.2); + height: 40px; + margin: 0px; + width: 60px; + } + + .container2 { + position: absolute; + top: 60px; + column-gap: 10px; + display: flex; + } + + .items2 { + background: rgb(96 139 168 / 0.2); + height: 60px; + margin: 0px; + width: 60px; + } + + .container3 { + position: absolute; + top: 130px; + column-gap: 10px; + display: flex; + } + + .items3 { + background: rgb(96 139 168 / 0.2); + height: 60px; + margin: 0px; + width: 60px; + } + + .row-gap { + position: absolute; + height: 10px; + width: 204px; + left: 4px; + top: 120px; + display: flex; + column-gap: 14px; + } + + .row-gap-items { + width: 56px; + background: gold; + } + + .column-gap1 { + position: absolute; + height: 36px; + width: 10px; + background: blue; + top: 4px; + } + + .column-gap2 { + position: absolute; + height: 56px; + width: 10px; + background: blue; + top: 62px; + } + + .spanner { + position: absolute; + background: cyan; + width: 200px; + height: 18px; + top: 42px; + left: 2px; + opacity: 0.5; + } + + .column-gap3 { + position: absolute; + height: 68px; + width: 10px; + background: blue; + top: 132px; + } +</style> + +<div class="outer"> + <div class="container1"> + <div class="items1"></div> + <div class="items1"></div> + <div class="items1"></div> + </div> + <div class="container2"> + <div class="items2"></div> + <div class="items2"></div> + <div class="items2"></div> + </div> + <div class="container3"> + <div class="items3"></div> + <div class="items3"></div> + <div class="items3"></div> + </div> + <div class="row-gap"> + <div class="row-gap-items"></div> + <div class="row-gap-items"></div> + <div class="row-gap-items"></div> + </div> + <div class="column-gap1" style="left:62px;"></div> + <div class="column-gap1" style="left:132px;"></div> + <div class="column-gap2" style="left:62px;"></div> + <div class="column-gap2" style="left:132px;"></div> + <div class="spanner"></div> + <div class="column-gap3" style="left:62px;"></div> + <div class="column-gap3" style="left:132px;"></div> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-010.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-010.html new file mode 100644 index 00000000000..61bb4a9b933 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-010.html @@ -0,0 +1,63 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: Multicolumn gap decorations painted with -2px outset and rule-break intersection. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="multicol-gap-decorations-010-ref.html"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .container { + border: 2px solid rgb(96 139 168); + width: 200px; + height: 200px; + column-height: 60px; + column-gap: 10px; + row-gap: 10px; + column-rule-width: 10px; + column-rule-style: solid; + column-rule-color: blue; + row-rule-width: 10px; + row-rule-style: solid; + row-rule-color: gold; + row-rule-break: intersection; + column-rule-break: intersection; + column-rule-outset: -2px; + row-rule-outset: -2px; + column-wrap: wrap; + column-width: 60px; + column-count: 3; + column-fill: auto; + } + + p { + background: rgb(96 139 168 / 0.2); + height: 60px; + margin: 0px; + } + + h2 { + column-span: all; + background-color: cyan; + color: #fff; + margin: 0px; + opacity: 0.5; + height: 18px; + } +</style> + +<div class="container"> + <p></p> + <p></p> + <h2></h2> + + <p></p> + <p></p> + <p></p> + <p></p> + <p></p> + <p></p> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-011-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-011-ref.html new file mode 100644 index 00000000000..3387918d399 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-011-ref.html @@ -0,0 +1,115 @@ +<!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; + } + + .outer { + border: 2px solid rgb(96 139 168); + width: 200px; + height: 200px; + } + + .container1 { + position: absolute; + top: 2px; + column-gap: 10px; + display: flex; + } + + .items1 { + background: rgb(96 139 168 / 0.2); + height: 40px; + margin: 0px; + width: 60px; + } + + .container2 { + position: absolute; + top: 60px; + column-gap: 10px; + display: flex; + } + + .items2 { + background: rgb(96 139 168 / 0.2); + height: 60px; + margin: 0px; + width: 60px; + } + + .container3 { + position: absolute; + top: 130px; + column-gap: 10px; + display: flex; + } + + .items3 { + background: rgb(96 139 168 / 0.2); + height: 60px; + margin: 0px; + width: 60px; + } + + .row-gap { + position: absolute; + height: 2px; + width: 200px; + background: gold; + left: 2px; + top: 124px; + } + + .column-gap1 { + position: absolute; + height: 40px; + width: 2px; + background: blue; + top: 2px; + } + + .column-gap2 { + position: absolute; + height: 142px; + width: 2px; + background: blue; + top: 60px; + } + + .spanner { + position: absolute; + background: cyan; + width: 200px; + height: 18px; + top: 42px; + left: 2px; + opacity: 0.5; + } +</style> + +<div class="outer"> + <div class="container1"> + <div class="items1"></div> + <div class="items1"></div> + <div class="items1"></div> + </div> + <div class="container2"> + <div class="items2"></div> + <div class="items2"></div> + <div class="items2"></div> + </div> + <div class="container3"> + <div class="items3"></div> + <div class="items3"></div> + <div class="items3"></div> + </div> + <div class="column-gap1" style="left:66px;"></div> + <div class="column-gap1" style="left:136px;"></div> + <div class="column-gap2" style="left:66px;"></div> + <div class="column-gap2" style="left:136px;"></div> + <div class="row-gap"></div> + <div class="spanner"></div> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-011.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-011.html new file mode 100644 index 00000000000..cf588ded41e --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-011.html @@ -0,0 +1,63 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: Multicolumn gap decorations painted with 100% outset and rule-break intersection. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="multicol-gap-decorations-011-ref.html"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .container { + border: 2px solid rgb(96 139 168); + width: 200px; + height: 200px; + column-height: 60px; + column-gap: 10px; + row-gap: 10px; + column-rule-width: 2px; + column-rule-style: solid; + column-rule-color: blue; + row-rule-width: 2px; + row-rule-style: solid; + row-rule-color: gold; + row-rule-break: intersection; + column-rule-break: intersection; + column-rule-outset: 100%; + row-rule-outset: 100%; + column-wrap: wrap; + column-width: 60px; + column-count: 3; + column-fill: auto; + } + + p { + background: rgb(96 139 168 / 0.2); + height: 60px; + margin: 0px; + } + + h2 { + column-span: all; + background-color: cyan; + color: #fff; + margin: 0px; + opacity: 0.5; + height: 18px; + } +</style> + +<div class="container"> + <p></p> + <p></p> + <h2></h2> + + <p></p> + <p></p> + <p></p> + <p></p> + <p></p> + <p></p> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-012-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-012-ref.html new file mode 100644 index 00000000000..9fb5e85e920 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-012-ref.html @@ -0,0 +1,104 @@ +<!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; + } + + .outer { + border: 2px solid rgb(96 139 168); + width: 200px; + height: 200px; + } + + .container1 { + position: absolute; + top: 2px; + column-gap: 10px; + display: flex; + } + + .items1 { + background: rgb(96 139 168 / 0.2); + height: 40px; + margin: 0px; + width: 60px; + } + + .container2 { + position: absolute; + top: 60px; + column-gap: 10px; + display: flex; + } + + .items2 { + background: rgb(96 139 168 / 0.2); + height: 60px; + margin: 0px; + width: 60px; + } + + .container3 { + position: absolute; + top: 130px; + column-gap: 10px; + display: flex; + } + + .items3 { + background: rgb(96 139 168 / 0.2); + height: 60px; + margin: 0px; + width: 60px; + } + + .row-gap { + position: absolute; + height: 2px; + width: 200px; + background: gold; + left: 2px; + top: 124px; + } + + .column-gap1 { + position: absolute; + height: 200px; + width: 2px; + background: blue; + top: 2px; + } + + .spanner { + position: absolute; + background: cyan; + width: 200px; + height: 18px; + top: 42px; + left: 2px; + opacity: 0.5; + } +</style> +<div class="outer"> + <div class="container1"> + <div class="items1"></div> + <div class="items1"></div> + <div class="items1"></div> + </div> + <div class="container2"> + <div class="items2"></div> + <div class="items2"></div> + <div class="items2"></div> + </div> + <div class="container3"> + <div class="items3"></div> + <div class="items3"></div> + <div class="items3"></div> + </div> + <div class="column-gap1" style="left:66px;"></div> + <div class="column-gap1" style="left:136px;"></div> + <div class="row-gap"></div> + <div class="spanner"></div> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-012.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-012.html new file mode 100644 index 00000000000..078b810cf8e --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-012.html @@ -0,0 +1,60 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: Multicolumn gap decorations painted with 2px width and rule-break none. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="multicol-gap-decorations-012-ref.html"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .container { + border: 2px solid rgb(96 139 168); + width: 200px; + height: 200px; + column-height: 60px; + column-gap: 10px; + row-gap: 10px; + column-rule-width: 2px; + column-rule-style: solid; + column-rule-color: blue; + row-rule-width: 2px; + row-rule-style: solid; + row-rule-color: gold; + row-rule-break: none; + column-rule-break: none; + column-wrap: wrap; + column-width: 60px; + column-count: 3; + column-fill: auto; + } + + p { + background: rgb(96 139 168 / 0.2); + height: 60px; + margin: 0px; + } + + h2 { + column-span: all; + background-color: cyan; + color: #fff; + margin: 0px; + opacity: 0.5; + height: 18px; + } +</style> +<div class="container"> + <p></p> + <p></p> + <h2></h2> + + <p></p> + <p></p> + <p></p> + <p></p> + <p></p> + <p></p> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-013-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-013-ref.html new file mode 100644 index 00000000000..8e426d8ed32 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-013-ref.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<style> + body { + margin: 0px; + } + + .mc { + position: absolute; + top: 0px; + left: 0px; + width: 100px; + height: 100px; + columns: 2; + column-fill: auto; + column-gap: 10px; + } + + .fake-column-gaps { + position: absolute; + top: 4px; + left: 45px; + display: flex; + height: 92px; + column-gap: 45px; + } + + .column-gap { + width: 10px; + background: gold; + } +</style> + +<div class="fake-column-gaps"> + <div class="column-gap"></div> + <div class="column-gap"></div> + <div class="column-gap"></div> +</div> +<div class="mc"> + <div style="height: 400px; background: cyan;"> + </div> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-013.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-013.html new file mode 100644 index 00000000000..d4170084f06 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-013.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="multicol-gap-decorations-013-ref.html"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .mc { + position: absolute; + top: 0px; + width: 100px; + height: 100px; + columns: 2; + column-fill: auto; + column-gap: 10px; + column-rule-color: gold; + column-rule-width: 10px; + column-rule-style: solid; + column-rule-outset: -4px; + } +</style> + +<div class="mc"> + <div style="height: 400px; background: cyan;"> + </div> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-014-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-014-ref.html new file mode 100644 index 00000000000..9d9674bd476 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-014-ref.html @@ -0,0 +1,62 @@ +<!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; + } + + .container { + border: 2px solid rgb(96 139 168); + width: 200px; + height: 130px; + column-gap: 10px; + display: flex; + } + + .items { + background: rgb(96 139 168 / 0.2); + height: 60px; + margin: 0px; + width: 60px; + } + + .last-item { + position: absolute; + left: 2px; + top: 72px; + background: rgb(96 139 168 / 0.2); + height: 60px; + margin: 0px; + width: 60px; + } + + .row-gap { + position: absolute; + height: 2px; + width: 200px; + background: gold; + left: 2px; + top: 66px; + } + + .column-gap { + position: absolute; + height: 60px; + width: 10px; + background: blue; + top: 2px; + } +</style> + +<div class="container"> + <div class="items"></div> + <div class="items"></div> + <div class="items"></div> +</div> +<div class="last-item"></div> +<div class="column-gap" style="left:62px;"></div> +<div class="column-gap" style="left:132px;"></div> +<div class="column-gap" style="left:62px; top: 72px;"></div> +<div class="column-gap" style="left:132px; top: 72px;"></div> +<div class="row-gap"></div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-014.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-014.html new file mode 100644 index 00000000000..1dcd393d99a --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-014.html @@ -0,0 +1,47 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: Multicolumn gap decorations painted with column-wrap, rule-break-intersection, and fewer + columns in last row. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="multicol-gap-decorations-014-ref.html"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .container { + border: 2px solid rgb(96 139 168); + width: 200px; + height: 130px; + column-count: 3; + column-width: 60px; + column-height: 60px; + column-gap: 10px; + row-gap: 10px; + column-rule-width: 10px; + column-rule-style: solid; + column-rule-color: blue; + row-rule-width: 2px; + row-rule-style: solid; + row-rule-color: gold; + column-wrap: wrap; + column-fill: auto; + column-rule-break: intersection; + column-rule-outset: 0; + } + + p { + background: rgb(96 139 168 / 0.2); + height: 60px; + margin: 0px; + } +</style> + +<div class="container"> + <p></p> + <p></p> + <p></p> + <p></p> +</div> diff --git a/tests/wpt/tests/css/css-grid/grid-items/replaced-element-016.tentative.html b/tests/wpt/tests/css/css-grid/grid-items/replaced-element-016.tentative.html new file mode 100644 index 00000000000..2d5b401b8d2 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/grid-items/replaced-element-016.tentative.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com"> +<link rel="author" title="Mozilla" href="https://mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#min-content-zero"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1308929"> +<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/12133"> +<meta name="assert" content="A replaced element with a percentage block-size doesn't compress the min-content contribution on its block axis to zero."> +<link rel="match" href="../../reference/ref-filled-green-100px-square-only.html"> + +<p>Test passes if there is a filled green square.</p> +<div style="display: grid; grid-template-rows: min-content;"> + <canvas width="100" height="100" style="background: green; block-size: 100%"></canvas> +</div> diff --git a/tests/wpt/tests/css/css-grid/grid-items/replaced-element-017.tentative.html b/tests/wpt/tests/css/css-grid/grid-items/replaced-element-017.tentative.html new file mode 100644 index 00000000000..575fa8c7817 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/grid-items/replaced-element-017.tentative.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com"> +<link rel="author" title="Mozilla" href="https://mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#min-content-zero"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1308929"> +<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/12133"> +<link rel="match" href="../../reference/ref-filled-green-100px-square-only.html"> +<meta name="assert" content="A replaced element with a percentage max-block-size doesn't compress the min-content contribution on its block axis to zero."> + +<p>Test passes if there is a filled green square.</p> +<div style="display: grid; grid-template-rows: min-content;"> + <canvas width="200" height="200" style="background: green; max-block-size: 50%"></canvas> +</div> diff --git a/tests/wpt/tests/css/css-overflow/scroll-button-display-none.html b/tests/wpt/tests/css/css-overflow/scroll-button-display-none.html new file mode 100644 index 00000000000..8b3068be6da --- /dev/null +++ b/tests/wpt/tests/css/css-overflow/scroll-button-display-none.html @@ -0,0 +1,54 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Overflow Test: focused ::scroll-button() does not crash after becoming display none</title> +<link rel="help" href="http://crbug.com/402673873"> +<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> +<style> + #scroller::scroll-button(left) { + content: ""; + background-color: red; + height: 100px; + width: 100px; + top: 0; + left: 0; + position: absolute; + } + + #scroller.hide::scroll-button(left) { + display: none; + } + + #scroller { + width: 300px; + height: 300px; + overflow: auto; + } + + #filler { + height: 20000x; + } +</style> +<div id="scroller"> + <div id="filler"></div> +</div> +<script> + promise_test(async t => { + await new test_driver.Actions() + .pointerMove(15, 15) + .pointerDown() + .pointerUp() + .send(); + scroller.className = "hide"; + document.documentElement.offsetTop; + await new test_driver.Actions() + .pointerMove(15, 15) + .pointerDown() + .pointerUp() + .send(); + assert_true(true); + }); +</script> diff --git a/tests/wpt/tests/css/css-overscroll-behavior/overscroll-behavior-root.html b/tests/wpt/tests/css/css-overscroll-behavior/overscroll-behavior-root.html index a116ead01b7..71c5f6573d6 100644 --- a/tests/wpt/tests/css/css-overscroll-behavior/overscroll-behavior-root.html +++ b/tests/wpt/tests/css/css-overscroll-behavior/overscroll-behavior-root.html @@ -33,6 +33,10 @@ promise_test(async function() { Math.round(bounds.top + bounds.height / 2), 0, -100) .send(); + // Await two animation frames to give a chance to scroll. + await new Promise(resolve => requestAnimationFrame(resolve)); + await new Promise(resolve => requestAnimationFrame(resolve)); + assert_equals(window.scrollY, originalScrollPos, "overscroll-behavior should work on the root"); }); </script> diff --git a/tests/wpt/tests/css/css-shadow-parts/host-part-nesting.html b/tests/wpt/tests/css/css-shadow-parts/host-part-nesting.html new file mode 100644 index 00000000000..c0dc8e20eee --- /dev/null +++ b/tests/wpt/tests/css/css-shadow-parts/host-part-nesting.html @@ -0,0 +1,31 @@ +<!doctype html> +<title>CSS Shadow Parts - :host::part() in nesting</title> +<link rel="help" href="https://drafts.csswg.org/css-shadow-parts/#part"> +<link rel="help" href="https://drafts.csswg.org/css-scoping/#host-selector"> +<link rel="help" href="https://crbug.com/326526716"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="host"></div> +<script> +test(function() { + let host = document.getElementById("host"); + host.attachShadow({ mode: "open" }).innerHTML = ` + <style> + :host { + &::part(mypart) { + color: lime; + } + } + </style> + <div part="mypart">This text should be green.</div> + `; + + let part = host.shadowRoot.querySelector("[part]"); + + assert_equals( + window.getComputedStyle(part).color, + "rgb(0, 255, 0)", + ":host::part() works in nesting", + ); +}, ":host::part works in nesting"); +</script> diff --git a/tests/wpt/tests/css/css-sizing/intrinsic-percent-replaced-029.tentative.html b/tests/wpt/tests/css/css-sizing/intrinsic-percent-replaced-029.tentative.html new file mode 100644 index 00000000000..feff03bbe2e --- /dev/null +++ b/tests/wpt/tests/css/css-sizing/intrinsic-percent-replaced-029.tentative.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org/"> +<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#min-content-zero"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1308929"> +<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/12133"> +<link rel="match" href="../reference/ref-filled-green-100px-square-only.html"> +<meta name="assert" content="A replaced element with a percentage block-size doesn't compress the min-content contribution on its block axis to zero."> + +<p>Test passes if there is a filled green square.</p> +<div style="inline-size: min-content"> + <canvas width="100" height="100" + style="writing-mode:vertical-rl; background: green; block-size: 100%"></canvas> +</div> diff --git a/tests/wpt/tests/css/css-sizing/intrinsic-percent-replaced-030.tentative.html b/tests/wpt/tests/css/css-sizing/intrinsic-percent-replaced-030.tentative.html new file mode 100644 index 00000000000..5a6b103c22e --- /dev/null +++ b/tests/wpt/tests/css/css-sizing/intrinsic-percent-replaced-030.tentative.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org/"> +<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#min-content-zero"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1308929"> +<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/12133"> +<link rel="match" href="../reference/ref-filled-green-100px-square-only.html"> +<meta name="assert" content="A replaced element with a percentage max-block-size doesn't compress the min-content contribution on its block axis to zero."> + +<p>Test passes if there is a filled green square.</p> +<div style="inline-size: min-content"> + <canvas width="200" height="200" + style="writing-mode:vertical-rl; background: green; max-block-size: 50%"></canvas> +</div> diff --git a/tests/wpt/tests/css/css-view-transitions/scoped/run_in_parallel.html b/tests/wpt/tests/css/css-view-transitions/scoped/run_in_parallel.html new file mode 100644 index 00000000000..1afdae2be9d --- /dev/null +++ b/tests/wpt/tests/css/css-view-transitions/scoped/run_in_parallel.html @@ -0,0 +1,128 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <!-- TODO update link --> + <link rel="help" href="https://www.w3.org/TR/css-view-transitions-2/"> + <title>Scope view transitions run in parallel</title> +</head> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<style type="text/css"> + .block { + background-color: blue; + position: relative; + height: 100px; + width: 100px; + margin: 50px; + } + + #target1 { + view-transition-name: a; + } + + #target2 { + view-transition-name: b; + } + + ::view-transition-group(*), + ::view-transition-image-pair(*), + ::view-transition-old(*) { + animation: unset; + } + + ::view-transition-old(*) { + opacity: 0; + } + + @keyframes stylize { + from { + opacity: 0.5; + } + to { + opacity: 1.0; + } + } + ::view-transition-new(*) { + animation: stylize 1s paused; + } + +</style> +<body> + <div id="target1" class="block"></div> + <div id="target2" class="block"></div> +</body> +<script type="text/javascript"> + + async function run_parallel_scoped_view_transition_test( + transition_update_callback, + message) { + promise_test(async t => { + const vt1 = target1.startViewTransition(() => {}); + const vt2 = target2.startViewTransition(() => {}); + await Promise.all([vt1.ready, vt2.ready]); + + let list = document.getAnimations().map(a => { + return `${a.effect.pseudoElement}:${a.animationName}`; + }); + let expected = [ + '::view-transition-new(a):stylize', + '::view-transition-new(b):stylize' + ]; + assert_array_equals(list, expected, 'Before callback'); + assert_equals( + getComputedStyle(target1, "::view-transition-new(a)") + .getPropertyValue("opacity"), + "0.5"); + assert_equals( + getComputedStyle(target2, "::view-transition-new(b)") + .getPropertyValue("opacity"), + "0.5"); + + transition_update_callback(vt1); + await vt1.finished.then( + () => {}, + () => { + // The only case where the finished promise should not be resolved is + // when the DOM update callback returns a rejected promise. + assert_unreached('Finished promise should have been resolved'); + }); + + list = document.getAnimations().map(a => { + return `${a.effect.pseudoElement}:${a.animationName}`; + }); + assert_array_equals(list, [`::view-transition-new(b):stylize`], + 'After callback'); + assert_equals( + getComputedStyle(target2, "::view-transition-new(b)") + .getPropertyValue("opacity"), + "0.5"); + }, message); + } + + run_parallel_scoped_view_transition_test( + (vt) => { + vt.skipTransition(); + }, + 'Concurrent transition keeps running after transition skipped'); + + run_parallel_scoped_view_transition_test( + () => { + document.getAnimations().filter(a => { + return a.effect.target.id == 'target1'; + }).forEach(a => { + a.finish(); + }); + }, 'Concurrent transition keeps running after transition finished'); + + run_parallel_scoped_view_transition_test( + () => { + document.getAnimations().filter(a => { + return a.effect.target.id == 'target1'; + }).forEach(a => { + a.cancel(); + }); + }, 'Concurrent transition keeps running after transition canceled'); +</script> +</html> diff --git a/tests/wpt/tests/css/css-writing-modes/reference/table-cell-align-006-ref.html b/tests/wpt/tests/css/css-writing-modes/reference/table-cell-align-006-ref.html new file mode 100644 index 00000000000..c5b52346fc0 --- /dev/null +++ b/tests/wpt/tests/css/css-writing-modes/reference/table-cell-align-006-ref.html @@ -0,0 +1,106 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Writing Modes reference: text-align in orthogonal table cell</title> + +<meta name="flags" content="ahem" /> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> + +<style> +table { + font: 20px/1 Ahem; + border: 1px solid gray; + display: inline-table; + margin: 1em; +} + +td { + padding: 0; + color: green; + vertical-align: top; +} + +td div { + position: relative; +} + +.t { + top: 0; +} +.m { + top: 2em; +} +.b { + top: 4em; +} +</style> + +<div> +<table> + <tr> + <td>X<br>X<br>X<br>X<br>X</td> + <td><div class=t>X</div></td> + <td><div class=m>X</div></td> + <td><div class=b>X</div></td> + <td><div class=t>X</div></td> + <td><div class=b>X</div></td> + <td>X<br> <br> <br> <br>X</td> + </tr> +</table> +<table> + <tr> + <td>X<br>X<br>X<br>X<br>X</td> + <td><div class=t>X</div></td> + <td><div class=m>X</div></td> + <td><div class=b>X</div></td> + <td><div class=b>X</div></td> + <td><div class=t>X</div></td> + <td>X<br> <br> <br> <br>X</td> + </tr> +</table> +</div> + +<div> +<table> + <tr> + <td>X<br>X<br>X<br>X<br>X</td> + <td><div class=b>X</div></td> + <td><div class=m>X</div></td> + <td><div class=t>X</div></td> + <td><div class=b>X</div></td> + <td><div class=t>X</div></td> + <td>X<br> <br> <br> <br>X</td> + </tr> +</table> +<table> + <tr> + <td>X<br>X<br>X<br>X<br>X</td> + <td><div class=b>X</div></td> + <td><div class=m>X</div></td> + <td><div class=t>X</div></td> + <td><div class=t>X</div></td> + <td><div class=b>X</div></td> + <td>X<br> <br> <br> <br>X</td> + </tr> +</table> +</div> + +<div> +<table> + <tr><td>XXXXX</td></tr> + <tr><td>X </td></tr> + <tr><td> X </td></tr> + <tr><td> X</td></tr> + <tr><td>X </td></tr> + <tr><td> X</td></tr> + <tr><td>X X</td></tr> +</table> +<table> + <tr><td>XXXXX</td></tr> + <tr><td>X </td></tr> + <tr><td> X </td></tr> + <tr><td> X</td></tr> + <tr><td> X</td></tr> + <tr><td>X </td></tr> + <tr><td>X X</td></tr> +</table> +</div> diff --git a/tests/wpt/tests/css/css-writing-modes/table-cell-align-006.html b/tests/wpt/tests/css/css-writing-modes/table-cell-align-006.html new file mode 100644 index 00000000000..a8d33f281fd --- /dev/null +++ b/tests/wpt/tests/css/css-writing-modes/table-cell-align-006.html @@ -0,0 +1,187 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Writing Modes test: text-align in orthogonal table cell</title> + +<link rel="help" href="https://drafts.csswg.org/css-writing-modes-3/#line-mappings"> +<meta assert="text-align values respect line-relative mappings of the table cell"> +<link rel="match" href="reference/table-cell-align-006-ref.html"> +<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com"> + +<meta name="flags" content="ahem" /> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> + +<style> +table { + font: 20px/1 Ahem; + border: 1px solid gray; + display: inline-table; + margin: 1em; +} + +td { + padding: 0; + color: green; +} + +table.vrl td { + writing-mode: vertical-rl; +} + +table.slr td { + writing-mode: sideways-lr; +} + +table.h { + writing-mode: vertical-lr; +} + +table.h td { + writing-mode: initial; +} + +/* If text-align works correctly on the cells, their green Ahem glyphs + should cover the red part of each background. */ +.left { + text-align: left; + background: linear-gradient(to bottom, red 20%, transparent 20%); +} +.slr .left { + background: linear-gradient(to top, red 20%, transparent 20%); +} +.center { + text-align: center; + background: linear-gradient(to bottom, transparent 40%, red 40%, red 60%, transparent 60%); +} +.right { + text-align: right; + background: linear-gradient(to bottom, transparent 80%, red 80%); +} +.slr .right { + background: linear-gradient(to top, transparent 80%, red 80%); +} +.start, +.slr .start:dir(rtl) + { + text-align: start; + background: linear-gradient(to bottom, red 20%, transparent 20%); +} +.start:dir(rtl), +.slr .start { + background: linear-gradient(to top, red 20%, transparent 20%); +} +.end, +.slr .end:dir(rtl) + { + text-align: end; + background: linear-gradient(to bottom, transparent 80%, red 80%); +} +.end:dir(rtl), +.slr .end + { + background: linear-gradient(to top, transparent 80%, red 80%); +} +.justify { + text-align-last: justify; + background: linear-gradient(to bottom, red 20%, transparent 20% 80%, red 80% ); +} + +.h .left { + background: linear-gradient(to right, red 20%, transparent 20%); +} +.h .center { + background: linear-gradient(to right, transparent 40%, red 40%, red 60%, transparent 60%); +} +.h .right { + background: linear-gradient(to right, transparent 80%, red 80%); +} +.h .start { + background: linear-gradient(to right, red 20%, transparent 20%); +} +.h .start:dir(rtl) { + background: linear-gradient(to left, red 20%, transparent 20%); +} +.h .end { + background: linear-gradient(to right, transparent 80%, red 80%); +} +.h .end:dir(rtl) { + background: linear-gradient(to left, transparent 80%, red 80%); +} +.h .justify { + background: linear-gradient(to right, red 20%, transparent 20% 80%, red 80% ); +} +</style> + +</div> +<table class=vrl> + <tr> + <td>XXXXX</td> + <td class=left>X</td> + <td class=center>X</td> + <td class=right>X</td> + <td class=start>X</td> + <td class=end>X</td> + <td class=justify>X X</td> + </tr> +</table> +<table class=vrl> + <tr dir=rtl> + <td>XXXXX</td> + <td class=left>X</td> + <td class=center>X</td> + <td class=right>X</td> + <td class=start>X</td> + <td class=end>X</td> + <td class=justify>X X</td> + </tr> +</table> +</div> + +<div> +<table class=slr> + <tr> + <td>XXXXX</td> + <td class=left>X</td> + <td class=center>X</td> + <td class=right>X</td> + <td class=start>X</td> + <td class=end>X</td> + <td class=justify>X X</td> + </tr> +</table> +<table class=slr> + <tr dir=rtl> + <td>XXXXX</td> + <td class=left>X</td> + <td class=center>X</td> + <td class=right>X</td> + <td class=start>X</td> + <td class=end>X</td> + <td class=justify>X X</td> + </tr> +</table> +</div> + +<div> +<table class=h> + <tr> + <td>XXXXX</td> + <td class=left>X</td> + <td class=center>X</td> + <td class=right>X</td> + <td class=start>X</td> + <td class=end>X</td> + <td class=justify>X X</td> + </tr> +</table> +<table class=h> + <tr dir=rtl> + <td>XXXXX</td> + <td class=left>X</td> + <td class=center>X</td> + <td class=right>X</td> + <td class=start>X</td> + <td class=end>X</td> + <td class=justify>X X</td> + </tr> +</table> +</div> diff --git a/tests/wpt/tests/dom/events/non-cancelable-when-passive/generic-events-stay-cancelable.html b/tests/wpt/tests/dom/events/non-cancelable-when-passive/generic-events-stay-cancelable.html new file mode 100644 index 00000000000..961794728d3 --- /dev/null +++ b/tests/wpt/tests/dom/events/non-cancelable-when-passive/generic-events-stay-cancelable.html @@ -0,0 +1,14 @@ +<!doctype html> +<meta charset=utf-8> +<title></title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script> +async_test((t) => { + const et = new EventTarget(); + et.addEventListener('test', t.step_func_done((e) => { + assert_true(e.cancelable); + }), {passive: true}); + et.dispatchEvent(new Event('test', {cancelable: true})); +}, "A generic event with only passive listeners remains cancelable"); +</script> diff --git a/tests/wpt/tests/domparsing/XMLSerializer-serializeToString.html b/tests/wpt/tests/domparsing/XMLSerializer-serializeToString.html index c3b704bf188..6c294e464a5 100644 --- a/tests/wpt/tests/domparsing/XMLSerializer-serializeToString.html +++ b/tests/wpt/tests/domparsing/XMLSerializer-serializeToString.html @@ -81,6 +81,25 @@ test(function() { }, 'Check if inconsistent xmlns="..." is dropped.'); test(function() { + const root1 = parse('<package></package>'); + root1.setAttribute('xmlns', 'http://www.idpf.org/2007/opf'); + const manifest1 = root1.appendChild(root1.ownerDocument.createElement('manifest')); + manifest1.setAttribute('xmlns', 'http://www.idpf.org/2007/opf'); + assert_equals(serialize(root1), '<package><manifest/></package>'); + + const root2 = parse('<package xmlns="http://www.idpf.org/2007/opf"></package>'); + const manifest2 = root2.appendChild(root2.ownerDocument.createElement('manifest')); + manifest2.setAttribute('xmlns', 'http://www.idpf.org/2007/opf'); + assert_equals(serialize(root2), + '<package xmlns="http://www.idpf.org/2007/opf"><manifest xmlns=""/></package>'); + + const root3 = parse('<package xmlns="http://www.idpf.org/2007/opf"></package>'); + const manifest3 = root3.appendChild(root3.ownerDocument.createElement('manifest')); + assert_equals(serialize(root3), + '<package xmlns="http://www.idpf.org/2007/opf"><manifest xmlns=""/></package>'); +}, 'Drop inconsistent xmlns="..." by matching on local name'); + +test(function() { let root = parse('<r xmlns:xx="uri"></r>'); root.setAttributeNS('uri', 'name', 'v'); assert_equals(serialize(root), '<r xmlns:xx="uri" xx:name="v"/>'); diff --git a/tests/wpt/tests/domparsing/xml-parse-serialize-roundtrip.html b/tests/wpt/tests/domparsing/xml-parse-serialize-roundtrip.html new file mode 100644 index 00000000000..5195b9f04b5 --- /dev/null +++ b/tests/wpt/tests/domparsing/xml-parse-serialize-roundtrip.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<link rel=author href="mailto:jarhar@chromium.org"> +<link rel=help href="https://issues.chromium.org/issues/327273585"> +<link rel=help href="https://issues.chromium.org/issues/41101979"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<script> +function runTest(xmlString, testName) { + test(() => { + const xmlDoc = (new DOMParser()).parseFromString(xmlString, 'text/xml'); + const result = (new XMLSerializer()).serializeToString(xmlDoc); + assert_equals(result, xmlString); + }, `DOMParser and XMLSerializer should round trip with CDATA sections: ${testName}`); +} + +runTest( + `<root><![CDATA[ +12345678901234567890123456789012345678901234567890123456789012345678901234567890 +12345678901234567890123456789012345678901234567890123456789012345678901234567890 +12345678901234567890123456789012345678901234567890123456789012345678901234567890 +12345678901234567890123456789012345678901234567890123456789012345678901234567890 +12345678901234567890123456789012345678901234567890123456789012345678901234567890 +12345678901234567890123456789012345678901234567890123456789012345678901234567890 +12345678901234567890123456789012345678901234567890123456789012345678901234567890 +12345678901234567890123456789012345678901234567890123456789012345678901234567890 +12345678901234567890123456789012345678901234567890123456789012345678901234567890 +12345678901234567890123456789012345678901234567890123456789012345678901234567890 +12345678901234567890123456789012345678901234567890123456789012345678901234567890 +]]></root>`, + 'large CDATA'); + +runTest( + '<root><htmlDefn><![CDATA[<div><![CDATA[ Just Rubbish Data $#$^#^$ ]]]]><![CDATA[></div><div></div>]]></htmlDefn></root>', + 'multiple CDATAs'); +</script> diff --git a/tests/wpt/tests/editing/include/editor-test-utils.js b/tests/wpt/tests/editing/include/editor-test-utils.js index 9c5600af77b..f0c4f583992 100644 --- a/tests/wpt/tests/editing/include/editor-test-utils.js +++ b/tests/wpt/tests/editing/include/editor-test-utils.js @@ -568,5 +568,8 @@ class EditorTestUtils { }) - (${EditorTestUtils.getNodeDescription(range.endContainer)}, ${range.endOffset})`; } + static waitForRender() { + return new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve))); + } } diff --git a/tests/wpt/tests/editing/other/selection-change-not-fired-if-selection-set-to-root.html b/tests/wpt/tests/editing/other/selection-change-not-fired-if-selection-set-to-root.html index 39e8b46e69b..cac621ad3cd 100644 --- a/tests/wpt/tests/editing/other/selection-change-not-fired-if-selection-set-to-root.html +++ b/tests/wpt/tests/editing/other/selection-change-not-fired-if-selection-set-to-root.html @@ -3,6 +3,7 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> +<script src="../include/editor-test-utils.js"></script> <body> <div contenteditable="true" id="target"> @@ -11,13 +12,13 @@ // Selectionchange event should not get fired if the selection is already set to the beginning of the root promise_test(async () => { let selectionChangeCount = 0; - document.getElementById("target").focus(); - await new Promise(resolve => step_timeout(resolve, 50)); + const target = document.getElementById("target"); + await new test_driver.click(target); + await EditorTestUtils.waitForRender(); document.addEventListener("selectionchange", () => ++selectionChangeCount); - test_driver.send_keys(target, "\uE003"); - // Waits a short time to allow any events to be processed. - await new Promise(resolve => step_timeout(resolve, 50)); + await new test_driver.send_keys(target, "\uE003"); + await EditorTestUtils.waitForRender(); assert_equals(selectionChangeCount, 0, "Selectionchange event should not get fired"); - }, "Selectionchange event not get fired when the selection is already set to the beginning of the root "); + }, "Selectionchange event should not get fired when the selection is already set to the beginning of the root "); </script> </body>
\ No newline at end of file diff --git a/tests/wpt/tests/fledge/tentative/generate-bid-browser-signals.https.window.js b/tests/wpt/tests/fledge/tentative/generate-bid-browser-signals.https.window.js index e472fccdc4d..ee0cdd84efa 100644 --- a/tests/wpt/tests/fledge/tentative/generate-bid-browser-signals.https.window.js +++ b/tests/wpt/tests/fledge/tentative/generate-bid-browser-signals.https.window.js @@ -11,7 +11,9 @@ // META: variant=?17-20 // META: variant=?21-24 // META: variant=?25-28 -// META: variant=?29-last +// META: variant=?29-32 +// META: variant=?33-36 +// META: variant=?37-last "use strict"; @@ -35,7 +37,21 @@ subsetTest(promise_test, async test => { 'bidCount': 0, 'multiBidLimit': 1, 'prevWinsMs': [], - 'forDebuggingOnlySampling': false + 'forDebuggingOnlySampling': false, + 'viewCounts': { + 'pastHour': 0, + 'pastDay': 0, + 'pastWeek': 0, + 'past30Days': 0, + 'past90Days': 0 + }, + 'clickCounts': { + 'pastHour': 0, + 'pastDay': 0, + 'pastWeek': 0, + 'past30Days': 0, + 'past90Days': 0 + } }; let biddingLogicURL = createBiddingScriptURL({ generateBid: @@ -48,6 +64,17 @@ subsetTest(promise_test, async test => { expectedBrowserSignals.forDebuggingOnlyInCooldownOrLockout = browserSignals.forDebuggingOnlyInCooldownOrLockout; + // Don't check exact values of view/click reports. + function zeroCounts(object) { + object.pastHour = 0; + object.pastDay = 0; + object.pastWeek = 0; + object.past30Days = 0; + object.past90Days = 0; + } + zeroCounts(browserSignals.viewCounts); + zeroCounts(browserSignals.clickCounts); + // Remove deprecated field, if present. delete browserSignals.prevWins; @@ -947,3 +974,253 @@ subsetTest(promise_test, async test => { } }); }, 'browserSignals.wasmHelper.'); + + +// Generates 0 or 1 clicks, dependent on `produceAttributionSrc` & +// `produceUserAction`, and `numViews` views for `igOwner`, provided by +// `viewClickProvider`. +async function generateViewsAndClicks( + test, uuid, viewClickProvider, igOwner, numViews, produceAttributionSrc, + produceUserAction) { + let iframe = await createIframe(test, viewClickProvider); + let script = ` + // We use a wrapper iframe here so the original remains in communication. + let frame = document.createElement('iframe'); + document.body.appendChild(frame); + let frameDocument = frame.contentDocument; + let a = frameDocument.createElement('a'); + a.href = '${RESOURCE_PATH}/record-click.py?' + + 'eligible_origin=${igOwner}&num_views=${numViews}'; + if (${produceAttributionSrc}) { + a.attributionSrc = ''; + } + a.target = '_self'; + a.appendChild(frameDocument.createTextNode('Click me')); + frameDocument.body.appendChild(a); + + if (${produceUserAction}) { + // Note: test_driver.click() seems to not work well with Chrome's + // content_shell; while .bless() does... unreliably. + // headless_shell/chrome path seems to work reliably. User activation + // is used sparingly to work around content_shell flakiness. + await test_driver.bless('User-initiated click', () => { a.click() }); + } else { + a.click(); + } + `; + + await runInFrame(test, iframe, script); +} + +// Keep running a basic auction with an interest group in +// `interestGroupOverrides` until it succeeds; joining and leaving the +// IG every time to bypass caching which is permitted to provide stale +// view/click counts. +async function keepTryingAuctionUntilWinBypassCaching( + test, uuid, interestGroupOverrides) { + while (true) { + await joinInterestGroup(test, uuid, interestGroupOverrides); + let result = await runBasicFledgeAuction(test, uuid); + if (result !== null) { // Got a winner. + break; + } + await leaveInterestGroup(interestGroupOverrides); + } +} + +// Like keepTryingAuctionUntilWinBypassCaching but for auctions with +// cross-origin interest group, owned by `igOwner`. +async function crossOriginKeepTryingAuctionUntilWinBypassCaching( + test, uuid, igOwner, interestGroupOverrides) { + while (true) { + await joinCrossOriginInterestGroup( + test, uuid, igOwner, interestGroupOverrides); + const auctionConfigOverrides = {interestGroupBuyers: [igOwner]}; + let result = + await runBasicFledgeAuction(test, uuid, auctionConfigOverrides); + if (result !== null) { // Got a winner. + break; + } + await leaveCrossOriginInterestGroup( + test, uuid, igOwner, interestGroupOverrides); + } +} + +// Generates `numViews` views and 0 or 1 clicks based on `produceAttributionSrc` +// and `produceUserAction`, by `viewClickProvider` available to `igOwner`, then +// creates an interest group for `igOwner` with given +// `viewAndClickCountsProviders`, and runs an auction +// to make sure the events are eventually available. +async function testClickiness( + test, igOwner, viewClickProvider, numViews, produceAttributionSrc, + produceUserAction, viewAndClickCountsProviders = undefined) { + const uuid = generateUuid(test); + + await generateViewsAndClicks( + test, uuid, viewClickProvider, igOwner, numViews, produceAttributionSrc, + produceUserAction); + + // For clicks to be recorded, both attributionsrc attribution must exist + // and a user action must be used. If we don't expect clicks, we can expect + // that the number is exactly 0 since re-running the test won't break that. + // + // This is relying on all tests using Ad-Auction-Record-Event using distinct + // `viewClickProvider`s. + let clicksBadTest = + produceAttributionSrc && produceUserAction ? '< 1' : ' !== 0'; + + let viewsBadTest = (numViews > 0) ? `< ${numViews}` : ' !== 0'; + + // Join an IG to read view/click info back. We use a UUID for a name to make + // sure nothing old is cached, since view/clicks are permitted to be a bit + // stale. + let interestGroupOverrides = { + owner: igOwner, + name: uuid, + biddingLogicURL: createBiddingScriptURL({ + origin: igOwner, + generateBid: ` + // We should see at least one click and numViews views the test injects. + if (browserSignals.clickCounts.pastHour ${clicksBadTest} || + browserSignals.clickCounts.pastDay ${clicksBadTest} || + browserSignals.clickCounts.pastWeek ${clicksBadTest} || + browserSignals.clickCounts.past30Days ${clicksBadTest} || + browserSignals.clickCounts.past90Days ${clicksBadTest} || + browserSignals.viewCounts.pastHour ${viewsBadTest} || + browserSignals.viewCounts.pastDay ${viewsBadTest} || + browserSignals.viewCounts.pastWeek ${viewsBadTest} || + browserSignals.viewCounts.past30Days ${viewsBadTest} || + browserSignals.viewCounts.past90Days ${viewsBadTest}) { + return -1; + } + ` + }) + }; + + if (viewAndClickCountsProviders) { + interestGroupOverrides.viewAndClickCountsProviders = + viewAndClickCountsProviders; + } + + await crossOriginKeepTryingAuctionUntilWinBypassCaching( + test, uuid, igOwner, interestGroupOverrides); +} + +subsetTest(promise_test, async test => { + const IG_OWNER = OTHER_ORIGIN5; + const VIEW_CLICK_PROVIDER = OTHER_ORIGIN6; + await testClickiness( + test, IG_OWNER, VIEW_CLICK_PROVIDER, /*numViews=*/ 2, + /*produceAttributionSrc=*/ true, + /*produceUserAction=*/ true, [VIEW_CLICK_PROVIDER]); +}, 'browserSignals for clickiness.'); + +subsetTest(promise_test, async test => { + const IG_OWNER = OTHER_ORIGIN5; + const VIEW_CLICK_PROVIDER = OTHER_ORIGIN5; + + await testClickiness( + test, IG_OWNER, VIEW_CLICK_PROVIDER, /*numViews=*/ 4, + /*produceAttributionSrc=*/ false, + /*produceUserAction=*/ false); +}, 'IG owner is default clickiness provider if nothing is specified'); + +subsetTest(promise_test, async test => { + const IG_OWNER = OTHER_ORIGIN4; + const VIEW_CLICK_PROVIDER = OTHER_ORIGIN4; + + await testClickiness( + test, IG_OWNER, VIEW_CLICK_PROVIDER, /*numViews=*/ 6, + /*produceAttributionSrc=*/ true, + /*produceUserAction=*/ true, []); +}, 'IG owner is default clickiness provider if empty list provided'); + +subsetTest(promise_test, async test => { + const IG_OWNER = OTHER_ORIGIN3; + const VIEW_CLICK_PROVIDER = OTHER_ORIGIN3; + + await testClickiness( + test, IG_OWNER, VIEW_CLICK_PROVIDER, /*numViews=*/ 0, + /*produceAttributionSrc=*/ true, + /*produceUserAction=*/ true, []); +}, 'browserSignals for clickiness --- just a click'); + +subsetTest(promise_test, async test => { + const IG_OWNER = OTHER_ORIGIN2; + const VIEW_CLICK_PROVIDER = OTHER_ORIGIN2; + + await testClickiness( + test, IG_OWNER, VIEW_CLICK_PROVIDER, /*numViews=*/ 1, + /*produceAttributionSrc=*/ true, + /*produceUserAction=*/ false, [VIEW_CLICK_PROVIDER]); +}, 'browserSignals for clickiness --- no click report w/o user action'); + +subsetTest(promise_test, async test => { + const uuid = generateUuid(test); + const IG_OWNER = window.location.origin; + const VIEW_CLICK_PROVIDER1 = OTHER_ORIGIN1; + const VIEW_CLICK_PROVIDER2 = window.location.origin; + + // From provider 1 have click, no views. + // From provider 2 have views, no clicks; + await generateViewsAndClicks( + test, uuid, VIEW_CLICK_PROVIDER1, IG_OWNER, + /*numViews=*/ 0, /*produceAttributionSrc=*/ true, + /*produceUserAction=*/ true); + await generateViewsAndClicks( + test, uuid, VIEW_CLICK_PROVIDER2, IG_OWNER, + /*numViews=*/ 2, /*produceAttributionSrc=*/ false, + /*produceUserAction=*/ false); + + // Create an IG that subscribes only to provider 2 --- it should only see + // the views. + let interestGroupOverrides = { + name: uuid, + viewAndClickCountsProviders: [VIEW_CLICK_PROVIDER2], + biddingLogicURL: createBiddingScriptURL({ + generateBid: ` + if (browserSignals.clickCounts.pastHour !== 0 || + browserSignals.viewCounts.pastHour < 2) { + throw JSON.stringify(browserSignals); + } + ` + }) + }; + + await keepTryingAuctionUntilWinBypassCaching( + test, uuid, interestGroupOverrides); + + // Now see that subscribing only to 1 provides only the click. + interestGroupOverrides = { + name: uuid, + viewAndClickCountsProviders: [VIEW_CLICK_PROVIDER1], + biddingLogicURL: createBiddingScriptURL({ + generateBid: ` + if (browserSignals.clickCounts.pastHour < 1 || + browserSignals.viewCounts.pastHour !== 0) { + throw JSON.stringify(browserSignals); + } + ` + }) + }; + + await keepTryingAuctionUntilWinBypassCaching( + test, uuid, interestGroupOverrides); + + // Now subscribe to both. + interestGroupOverrides = { + name: uuid, + viewAndClickCountsProviders: [VIEW_CLICK_PROVIDER1, VIEW_CLICK_PROVIDER2], + biddingLogicURL: createBiddingScriptURL({ + generateBid: ` + if (browserSignals.clickCounts.pastHour < 1 || + browserSignals.viewCounts.pastHour < 2) { + throw JSON.stringify(browserSignals); + } + ` + }) + }; + + await keepTryingAuctionUntilWinBypassCaching( + test, uuid, interestGroupOverrides); +}, 'browserSignals for clickiness --- viewAndClickCountsProviders works.'); diff --git a/tests/wpt/tests/fledge/tentative/resources/fledge-util.sub.js b/tests/wpt/tests/fledge/tentative/resources/fledge-util.sub.js index 0a18ea40d3d..49ebfd1c596 100644 --- a/tests/wpt/tests/fledge/tentative/resources/fledge-util.sub.js +++ b/tests/wpt/tests/fledge/tentative/resources/fledge-util.sub.js @@ -695,6 +695,16 @@ async function joinCrossOriginInterestGroup(test, uuid, origin, interestGroupOve `await joinInterestGroup(test_instance, "${uuid}", ${interestGroup})`); } +// Leaves a cross-origin interest group, by running a leave in an iframe. +async function leaveCrossOriginInterestGroup(test, uuid, origin, interestGroupOverrides = {}) { + let interestGroup = JSON.stringify( + createInterestGroupForOrigin(uuid, origin, interestGroupOverrides)); + + let iframe = await createIframe(test, origin, 'join-ad-interest-group'); + await runInFrame(test, iframe, + `await leaveInterestGroup(${interestGroup})`); +} + // Joins an interest group in a top-level window, which has the same origin // as the joined interest group. async function joinInterestGroupInTopLevelWindow( diff --git a/tests/wpt/tests/fledge/tentative/resources/record-click.py b/tests/wpt/tests/fledge/tentative/resources/record-click.py new file mode 100644 index 00000000000..b4e76873d9b --- /dev/null +++ b/tests/wpt/tests/fledge/tentative/resources/record-click.py @@ -0,0 +1,21 @@ +# This responds with a page reporting a click event to the origin provided in +# the `eligible_origin` query param. The pages loads `num_views` copies of +# record-view.py as images in a clickiness-eligible way; with them reporting +# view events. +def main(request, response): + eligible_origin = request.GET.get(b"eligible_origin") + num_views = int(request.GET.get(b"num_views")) + response.status = (200, b"OK") + response.headers.set(b"Content-Type", b"text/html") + response.headers.set( + b"Ad-Auction-Record-Event", + b"type=\"click\", eligible-origins=(\"%s\")" % eligible_origin) + + result = b"<!DOCTYPE html>" + img_template = b"<img src=\"record-view.py?i=%d&eligible_origin=%s\"" + \ + b" attributionsrc>" + for i in range(0, num_views): + view = img_template % (i, eligible_origin) + result = result + view + return result.decode("utf-8") + diff --git a/tests/wpt/tests/fledge/tentative/resources/record-view.py b/tests/wpt/tests/fledge/tentative/resources/record-view.py new file mode 100644 index 00000000000..d423b2d9c72 --- /dev/null +++ b/tests/wpt/tests/fledge/tentative/resources/record-view.py @@ -0,0 +1,19 @@ +# This responds with an image reporting a view event to the origin provided in +# the `eligible_origin` query param. +def main(request, response): + eligible_origin = request.GET.get(b"eligible_origin") + response.status = (200, b"OK") + response.headers.set(b"Content-Type", b"image/png") + response.headers.set( + b"Ad-Auction-Record-Event", + b"type=\"view\", eligible-origins=(\"%s\")" % eligible_origin) + png = b"\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d" + \ + b"\x49\x48\x44\x52\x00\x00\x00\x05\x00\x00\x00\x05" + \ + b"\x08\x06\x00\x00\x00\x8d\x6f\x26\xe5\x00\x00\x00" + \ + b"\x09\x70\x48\x59\x73\x00\x00\x0e\xc4\x00\x00\x0e" + \ + b"\xc4\x01\x95\x2b\x0e\x1b\x00\x00\x00\x15\x49\x44" + \ + b"\x41\x54\x08\x99\x63\x64\xf8\xcf\xf0\x9f\x01\x0d" + \ + b"\x30\xa1\x0b\x50\x41\x10\x00\xcd\xaa\x02\x08\x0f" + \ + b"\x23\x6b\x59\x00\x00\x00\x00\x49\x45\x4e\x44\xae" + \ + b"\x42\x60\x82" + return png diff --git a/tests/wpt/tests/html/canvas/element/fill-and-stroke-styles/WEB_FEATURES.yml b/tests/wpt/tests/html/canvas/element/fill-and-stroke-styles/WEB_FEATURES.yml new file mode 100644 index 00000000000..319b5b8e04c --- /dev/null +++ b/tests/wpt/tests/html/canvas/element/fill-and-stroke-styles/WEB_FEATURES.yml @@ -0,0 +1,4 @@ +features: +- name: canvas-createconicgradient + files: + - 2d.gradient.conic.* diff --git a/tests/wpt/tests/html/canvas/element/manual/fill-and-stroke-styles/WEB_FEATURES.yml b/tests/wpt/tests/html/canvas/element/manual/fill-and-stroke-styles/WEB_FEATURES.yml new file mode 100644 index 00000000000..5d9106c1cd6 --- /dev/null +++ b/tests/wpt/tests/html/canvas/element/manual/fill-and-stroke-styles/WEB_FEATURES.yml @@ -0,0 +1,5 @@ +features: +- name: canvas-createconicgradient + files: + - conic-gradient.html + - conic-gradient-rotation.html diff --git a/tests/wpt/tests/html/canvas/offscreen/fill-and-stroke-styles/WEB_FEATURES.yml b/tests/wpt/tests/html/canvas/offscreen/fill-and-stroke-styles/WEB_FEATURES.yml new file mode 100644 index 00000000000..319b5b8e04c --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/fill-and-stroke-styles/WEB_FEATURES.yml @@ -0,0 +1,4 @@ +features: +- name: canvas-createconicgradient + files: + - 2d.gradient.conic.* diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/README.md b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/README.md deleted file mode 100644 index b3c24c3f82d..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/README.md +++ /dev/null @@ -1,9 +0,0 @@ -Because this test suite is run as a virtual suite and it's quite deep in the -folders, we have to use abbreviations for the test names to not run over 200 -characters, which is problematic on Windows. - -* unspecified -> "u" -* unsafe-none -> "un" -* same-origin -> "so" -* same-origin-allow-popups -> "soap" -* restrict-properties -> omitted diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-closed.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-closed.https.html deleted file mode 100644 index 1c315b35d7f..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-closed.https.html +++ /dev/null @@ -1,19 +0,0 @@ -<!doctype html> -<title> Check openee.closed access is allowed for COOP: restrict-properties</title> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src=/common/get-host-info.sub.js></script> -<script src="/common/utils.js"></script> -<script src="/common/dispatcher/dispatcher.js"></script> -<script src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js"></script> -<script src="/html/cross-origin-opener-policy/reporting/resources/test-access-property.js"></script> -<script> - -testAccessProperty( - "closed", - w => w.closed, - expectReport = false, - use_restrict_properties = true -); - -</script> diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-openee-rp-ro.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-openee-rp-ro.https.html deleted file mode 100644 index 7a96f4f5762..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-openee-rp-ro.https.html +++ /dev/null @@ -1,62 +0,0 @@ -<!doctype html> -<title> - COOP reports are sent to the openee when the openee used COOP-RO: - restrict-properties and its same-origin opener tries to access it. -</title> -<meta name=timeout content=long> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src=/common/get-host-info.sub.js></script> -<script src="/common/utils.js"></script> -<script src="/common/dispatcher/dispatcher.js"></script> -<script src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js"></script> -<script src="/html/cross-origin-opener-policy/reporting/resources/try-access.js"></script> -<script> - -const directory = "/html/cross-origin-opener-policy"; -const same_origin = get_host_info().HTTPS_ORIGIN; - -promise_test(async t => { - const report_token = token(); - const openee_token = token(); - const opener_token = token(); // The current test window. - - const opener_url = location.href; - - const reportTo = reportToHeaders(report_token); - const openee_url = same_origin + executor_path + reportTo.header + - reportTo.coopReportOnlyRestrictPropertiesHeader + - `&uuid=${openee_token}`; - - const openee = window.open(openee_url); - t.add_cleanup(() => send(openee_token, "window.close()")) - - // 1. Make sure the new document to be loaded. - send(openee_token, ` - send("${opener_token}", "Ready"); - `); - let reply = await receive(opener_token); - assert_equals(reply, "Ready"); - - // 2. Try to access the openee. A report is sent, because of COOP-RO: - // restrict-properties. - tryAccess(openee); - - // 3. Check a report is sent to the openee. - let report = - await receiveReport(report_token, "access-to-coop-page-from-opener"); - assert_equals(report.type, "coop"); - assert_equals(report.url, openee_url.replace(/"/g, '%22')); - assert_equals(report.body.disposition, "reporting"); - assert_equals(report.body.effectivePolicy, "restrict-properties"); - assert_equals(report.body.property, "blur"); - assert_source_location_missing(report); - assert_equals(report.body.openerURL, opener_url); - assert_equals(report.body.openeeURL, undefined); - assert_equals(report.body.otherDocumentURL, undefined); - assert_equals(report.body.referrer, opener_url); - assert_equals(report.body.initialPopupURL, undefined); -}, "access-reporting-openee-rp-ro"); - -</script> - diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-opener-rp-ro.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-opener-rp-ro.https.html deleted file mode 100644 index 9e1e85b16a5..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-opener-rp-ro.https.html +++ /dev/null @@ -1,71 +0,0 @@ -<!doctype html> -<title> - COOP reports are sent to the opener when the opener used COOP-RO: - restrict-properties and its same-origin openee tries to access it. -</title> -<meta name=timeout content=long> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src=/common/get-host-info.sub.js></script> -<script src="/common/utils.js"></script> -<script src="/common/dispatcher/dispatcher.js"></script> -<script src="/html/cross-origin-opener-policy/resources/common.js"></script> -<script src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js"></script> -<script src="/html/cross-origin-opener-policy/reporting/resources/try-access.js"></script> -<script> - -const directory = "/html/cross-origin-opener-policy"; -const same_origin = get_host_info().HTTPS_ORIGIN; - -promise_test(async t => { - // The test window. - const this_window_token = token(); - - // The "opener" window. This has COOP and a reporter. - const opener_report_token= token(); - const opener_token = token(); - const opener_reportTo = reportToHeaders(opener_report_token); - const opener_url = same_origin + executor_path + opener_reportTo.header + - opener_reportTo.coopReportOnlyRestrictPropertiesHeader + - `&uuid=${opener_token}`; - - // The "openee" window. This is same origin with the "opener". - const openee_report_token= token(); - const openee_token = token(); - const openee_url = same_origin + executor_path + `&uuid=${openee_token}`; - - // 1. Create the opener window. - let opener_window_proxy = window.open(opener_url); - t.add_cleanup(() => send(opener_token, "window.close()")); - - // 2. The opener opens its openee. - send(opener_token, ` - openee = window.open("${openee_url}"); - send("${this_window_token}", "ACK 1"); - `); - assert_equals("ACK 1", await receive(this_window_token)); - t.add_cleanup(() => send(openee_token, "window.close()")); - - // 3. The openee tries to access its opener. - send(openee_token, addScriptAndTriggerOnload( - directory + "/reporting/resources/try-access.js", - "tryAccess(opener);") - ); - - // 4. Check a report sent to the opener. - let report = - await receiveReport(opener_report_token, "access-to-coop-page-from-openee"); - assert_equals(report.type, "coop"); - assert_equals(report.url, opener_url.replace(/"/g, '%22')); - assert_equals(report.body.disposition, "reporting"); - assert_equals(report.body.effectivePolicy, "restrict-properties"); - assert_equals(report.body.property, "blur"); - assert_source_location_missing(report); - assert_equals(report.body.openerURL, undefined); - assert_equals(report.body.openeeURL, openee_url); - assert_equals(report.body.otherDocumentURL, undefined); - assert_equals(report.body.referrer, undefined); - assert_equals(report.body.initialPopupURL, openee_url); -}, "access-reporting-opener-rp-ro"); - -</script> diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-post-message.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-post-message.https.html deleted file mode 100644 index 5bc718e2a89..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-post-message.https.html +++ /dev/null @@ -1,19 +0,0 @@ -<!doctype html> -<title> Check openee.postMessage() access is allowed for COOP: restrict-properties</title> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src=/common/get-host-info.sub.js></script> -<script src="/common/utils.js"></script> -<script src="/common/dispatcher/dispatcher.js"></script> -<script src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js"></script> -<script src="/html/cross-origin-opener-policy/reporting/resources/test-access-property.js"></script> -<script> - -testAccessProperty( - "postMessage", - w => w.postMessage("message", "*"), - expectReport = false, - use_restrict_properties = true -); - -</script> diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/coop-rp-in-navigation-chain.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/coop-rp-in-navigation-chain.https.html deleted file mode 100644 index e5c87751748..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/coop-rp-in-navigation-chain.https.html +++ /dev/null @@ -1,65 +0,0 @@ -<!doctype html> -<meta charset=utf-8> -<meta name=timeout content=long> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src="/common/dispatcher/dispatcher.js"></script> -<script src="/common/get-host-info.sub.js"></script> -<script src="/common/utils.js"></script> -<script src="../../resources/common.js"></script> -<script src="../../resources/popup-test.js"></script> -<script> - -promise_test(async t => { - const popup_token = token(); - const second_popup_token = token(); - const reply_token = token(); - - const unsafe_none_url = getExecutorPath( - popup_token, - SAME_ORIGIN.origin, - { coop: "unsafe-none"}); - - const restrict_properties_url = getExecutorPath( - second_popup_token, - SAME_ORIGIN.origin, - { coop: "restrict-properties"}); - - // We open popup and then ping it, it will respond after loading. - const popup = window.open(unsafe_none_url); - send(popup_token, `send('${reply_token}', 'Popup loaded');`); - assert_equals(await receive(reply_token), 'Popup loaded'); - - // Make sure the popup will be closed once the test has run, keeping a clean - // state. - t.add_cleanup(() => { - send(popup_token, `close()`); - }); - - // Now navigate this popup to a restrict-properties page. - send(popup_token, `document.location = '${restrict_properties_url}'`); - send(second_popup_token, `send('${reply_token}', 'Popup loaded');`); - assert_equals(await receive(reply_token), 'Popup loaded'); - - // Navigate again to the original page. - send(second_popup_token, `document.location = '${unsafe_none_url}'`); - send(popup_token, `send('${reply_token}', 'Popup loaded');`); - assert_equals(await receive(reply_token), 'Popup loaded'); - - // Give some time for things to settle across processes etc. before - // proceeding with verifications. - await new Promise(resolve => { t.step_timeout(resolve, 500); }); - - // Verify that we have full access to the popup. - assert_false(popup.closed, 'Popup is closed from opener?'); - assert_true(await getPopupHasOpener(popup_token) === "true", - 'Popup has nulled opener?'); - assert_true(canAccessProperty(popup, "document"), - 'Main page has dom access to the popup?'); - assert_true(canAccessProperty(popup, "frames"), - 'Main page has cross origin access to the popup?'); - -}, "COOP: restrict-properties has no impact in a navigation chain between " + - "multiple unsafe-none pages."); - -</script> diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/coop-rp-in-navigation-chain.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/coop-rp-in-navigation-chain.https.html.headers deleted file mode 100644 index 073ce7adfbd..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/coop-rp-in-navigation-chain.https.html.headers +++ /dev/null @@ -1 +0,0 @@ -Cross-Origin-Opener-Policy: unsafe-none diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-about-blank.https.window.js b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-about-blank.https.window.js deleted file mode 100644 index 1247400a4e3..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-about-blank.https.window.js +++ /dev/null @@ -1,144 +0,0 @@ -// META: script=/common/get-host-info.sub.js -// META: script=/common/utils.js -// META: script=/common/dispatcher/dispatcher.js - -const executor_path = '/common/dispatcher/executor.html?pipe='; -const cross_origin = get_host_info().OTHER_ORIGIN; -const same_origin = get_host_info().ORIGIN; -const coep_require_corp_header = - '|header(Cross-Origin-Embedder-Policy,require-corp)'; -const corp_cross_origin_header = - '|header(Cross-Origin-Resource-Policy,cross-origin)'; -const coop_restrict_properties_header = - '|header(Cross-Origin-Opener-Policy,restrict-properties)'; - -function iframePopupAboutBlankTest( - origin, {expectedCrossOriginIsolated}, description) { - promise_test(async t => { - assert_true(crossOriginIsolated, 'Is main frame crossOriginIsolated?'); - assert_true( - 'SharedArrayBuffer' in globalThis, - 'Is SharedArrayBuffer defined in main frame?'); - - const reply_token = token(); - const iframe_token = token(); - - const iframe = document.createElement('iframe'); - iframe.src = origin + executor_path + coep_require_corp_header + - corp_cross_origin_header + `&uuid=${iframe_token}`; - document.body.appendChild(iframe); - - send(iframe_token, `send('${reply_token}', 'Iframe loaded');`); - assert_equals(await receive(reply_token), 'Iframe loaded'); - - send(iframe_token, ` - window.popup = window.open(); - send('${reply_token}', popup === null); - `); - assert_equals(await receive(reply_token), 'false', 'Is popup handle null?'); - - send( - iframe_token, - `send('${reply_token}', popup.window.crossOriginIsolated);`); - assert_equals( - await receive(reply_token), `${expectedCrossOriginIsolated}`, - 'Is popup crossOriginIsolated?'); - - send(iframe_token, ` - send('${reply_token}', 'SharedArrayBuffer' in popup.window.globalThis); - `); - assert_equals( - await receive(reply_token), `${expectedCrossOriginIsolated}`, - 'Is SharedArrayBuffer defined in popup?'); - - // Test whether the popup's subframe is crossOriginIsolated - const popup_iframe_token = token(); - const popup_iframe_src = origin + executor_path + coep_require_corp_header + - corp_cross_origin_header + `&uuid=${popup_iframe_token}`; - send(iframe_token, ` - const iframe = window.popup.document.createElement('iframe'); - iframe.src = '${popup_iframe_src}'; - popup.document.body.appendChild(iframe); - `); - - send(popup_iframe_token, ` - send('${reply_token}', 'Iframe in popup loaded'); - `); - assert_equals(await receive(reply_token), 'Iframe in popup loaded'); - - send(popup_iframe_token, ` - send('${reply_token}', crossOriginIsolated); - `); - assert_equals( - await receive(reply_token), `${expectedCrossOriginIsolated}`, - 'Is iframe in popup crossOriginIsolated?'); - - send(popup_iframe_token, ` - send('${reply_token}', 'SharedArrayBuffer' in globalThis); - `); - assert_equals( - await receive(reply_token), `${expectedCrossOriginIsolated}`, - 'Is SharedArrayBuffer defined in iframe in popup?'); - - // Test whether a nested iframe is crossOriginIsolated - const popup_nested_iframe_token = token(); - const popup_nested_iframe_src = origin + executor_path + - coep_require_corp_header + corp_cross_origin_header + - `&uuid=${popup_nested_iframe_token}`; - send(iframe_token, ` - blank_iframe = popup.document.createElement('iframe'); - blank_iframe.src = ''; - popup.document.body.appendChild(blank_iframe); - nested_iframe = - blank_iframe.contentDocument.createElement('iframe'); - nested_iframe.src = '${popup_nested_iframe_src}'; - blank_iframe.contentDocument.body.appendChild(nested_iframe); - `); - - send(popup_nested_iframe_token, ` - send('${reply_token}', 'Nested iframe in popup loaded'); - `); - assert_equals(await receive(reply_token), 'Nested iframe in popup loaded'); - - send(popup_nested_iframe_token, ` - send('${reply_token}', crossOriginIsolated); - `); - assert_equals( - await receive(reply_token), `${expectedCrossOriginIsolated}`, - 'Is nested iframe in popup crossOriginIsolated?'); - - send(popup_nested_iframe_token, ` - send('${reply_token}', 'SharedArrayBuffer' in globalThis); - `); - assert_equals( - await receive(reply_token), `${expectedCrossOriginIsolated}`, - 'Is SharedArrayBuffer defined in nested iframe in popup?'); - - // Navigate the popup out of the initial empty document, with COOP:RP and - // COEP: require-corp. Expect to be crossOriginIsolated. - const popup_token = token(); - const popup_src = origin + executor_path + coop_restrict_properties_header + - coep_require_corp_header + `&uuid=${popup_token}`; - send(iframe_token, `popup.window.location = '${popup_src}';`); - - send(popup_token, `send('${reply_token}', 'Popup loaded');`); - assert_equals(await receive(reply_token), 'Popup loaded'); - - send(popup_token, `send('${reply_token}', crossOriginIsolated);`); - assert_equals( - await receive(reply_token), 'true', - 'Is popup crossOriginIsolated after navigation?'); - - send(popup_token, ` - send('${reply_token}', 'SharedArrayBuffer' in globalThis); - `); - assert_equals( - await receive(reply_token), 'true', - 'Is SharedArrayBuffer defined in popup after navigation?'); - }, description); -} - -iframePopupAboutBlankTest( - cross_origin, {expectedCrossOriginIsolated: false}, 'Cross-origin iframe'); -iframePopupAboutBlankTest( - same_origin, {expectedCrossOriginIsolated: true}, 'Same-origin iframe'); diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-about-blank.https.window.js.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-about-blank.https.window.js.headers deleted file mode 100644 index 19d0dbe4e18..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-about-blank.https.window.js.headers +++ /dev/null @@ -1,2 +0,0 @@ -Cross-Origin-Opener-Policy: restrict-properties -Cross-Origin-Embedder-Policy: require-corp diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html deleted file mode 100644 index 8cf2679e190..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html +++ /dev/null @@ -1,94 +0,0 @@ -<!doctype html> -<meta charset=utf-8> -<meta name=timeout content=long> -<meta name="variant" content="?1-1"> -<meta name="variant" content="?2-2"> -<meta name="variant" content="?3-3"> -<meta name="variant" content="?4-4"> -<meta name="variant" content="?5-5"> -<meta name="variant" content="?6-6"> -<meta name="variant" content="?7-7"> -<meta name="variant" content="?8-8"> -<meta name="variant" content="?9-last"> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src=/common/dispatcher/dispatcher.js></script> -<script src=/common/get-host-info.sub.js></script> -<script src=/common/subset-tests.js></script> -<script src=/common/utils.js></script> -<script src="../../resources/common.js"></script> -<script src="../../resources/iframe-test.js"></script> - -<body> -<script> - -// This document has COOP: restrict-properties. The popup has COOP: same-origin. -// Opening from an iframe should not be different from opening from the main -// frame and the opener should be severed. -[ - { - "title": "same origin iframe, same origin popup", - "iframeOrigin": SAME_ORIGIN, - "popupOrigin": SAME_ORIGIN, - "opener": "severed" - }, - { - "title": "same site iframe, same origin popup", - "iframeOrigin": SAME_SITE, - "popupOrigin": SAME_ORIGIN, - "opener": "severed" - }, - { - "title": "cross origin iframe, same origin popup", - "iframeOrigin": CROSS_ORIGIN, - "popupOrigin": SAME_ORIGIN, - "opener": "severed" - }, - { - "title": "same origin iframe, same site popup", - "iframeOrigin": SAME_ORIGIN, - "popupOrigin": SAME_SITE, - "opener": "severed" - }, - { - "title": "same site iframe, same site popup", - "iframeOrigin": SAME_SITE, - "popupOrigin": SAME_SITE, - "opener": "severed" - }, - { - "title": "cross origin iframe, same site popup", - "iframeOrigin": CROSS_ORIGIN, - "popupOrigin": SAME_SITE, - "opener": "severed" - }, - { - "title": "same origin iframe, cross origin popup", - "iframeOrigin": SAME_ORIGIN, - "popupOrigin": CROSS_ORIGIN, - "opener": "severed" - }, - { - "title": "same site iframe, cross origin popup", - "iframeOrigin": SAME_SITE, - "popupOrigin": CROSS_ORIGIN, - "opener": "severed" - }, - { - "title": "cross origin iframe, cross origin popup", - "iframeOrigin": CROSS_ORIGIN, - "popupOrigin": CROSS_ORIGIN, - "opener": "severed" - } -].forEach(variant => { - subsetTest( - iframe_test, - `COOP: restrict-properties to popup COOP: same-origin via an iframe, ` + - `with ${variant.title}`, - variant.iframeOrigin, - variant.popupOrigin, - { coop: 'same-origin' }, - variant.opener); -}); -</script> -</body> diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html.headers deleted file mode 100644 index d5c99062d2b..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html.headers +++ /dev/null @@ -1 +0,0 @@ -Cross-Origin-Opener-Policy: restrict-properties diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html deleted file mode 100644 index f3af3ca7db1..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html +++ /dev/null @@ -1,91 +0,0 @@ -<!doctype html> -<meta charset=utf-8> -<meta name=timeout content=long> -<meta name="variant" content="?1-2"> -<meta name="variant" content="?3-4"> -<meta name="variant" content="?5-6"> -<meta name="variant" content="?7-8"> -<meta name="variant" content="?9-last"> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src=/common/dispatcher/dispatcher.js></script> -<script src=/common/get-host-info.sub.js></script> -<script src=/common/subset-tests.js></script> -<script src=/common/utils.js></script> -<script src="../../resources/common.js"></script> -<script src="../../resources/iframe-test.js"></script> - -<body> -<script> - - -// This document has COOP: restrict-properties. The popup has COOP: -// same-origin-allow-popups. Opening from an iframe should not be different from -// opening from the main frame and the opener should be severed. -[ - { - "title": "same origin iframe, same origin popup", - "iframeOrigin": SAME_ORIGIN, - "popupOrigin": SAME_ORIGIN, - "opener": "severed" - }, - { - "title": "same site iframe, same origin popup", - "iframeOrigin": SAME_SITE, - "popupOrigin": SAME_ORIGIN, - "opener": "severed" - }, - { - "title": "cross origin iframe, same origin popup", - "iframeOrigin": CROSS_ORIGIN, - "popupOrigin": SAME_ORIGIN, - "opener": "severed" - }, - { - "title": "same origin iframe, same site popup", - "iframeOrigin": SAME_ORIGIN, - "popupOrigin": SAME_SITE, - "opener": "severed" - }, - { - "title": "same site iframe, same site popup", - "iframeOrigin": SAME_SITE, - "popupOrigin": SAME_SITE, - "opener": "severed" - }, - { - "title": "cross origin iframe, same site popup", - "iframeOrigin": CROSS_ORIGIN, - "popupOrigin": SAME_SITE, - "opener": "severed" - }, - { - "title": "same origin iframe, cross origin popup", - "iframeOrigin": SAME_ORIGIN, - "popupOrigin": CROSS_ORIGIN, - "opener": "severed" - }, - { - "title": "same site iframe, cross origin popup", - "iframeOrigin": SAME_SITE, - "popupOrigin": CROSS_ORIGIN, - "opener": "severed" - }, - { - "title": "cross origin iframe, cross origin popup", - "iframeOrigin": CROSS_ORIGIN, - "popupOrigin": CROSS_ORIGIN, - "opener": "severed" - } -].forEach(variant => { - subsetTest( - iframe_test, - `COOP: restrict-properties to popup COOP: same-origin-allow-popups ` + - `via an iframe, with ${variant.title}`, - variant.iframeOrigin, - variant.popupOrigin, - { coop: 'same-origin-allow-popups' }, - variant.opener); -}); -</script> -</body> diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html.headers deleted file mode 100644 index d5c99062d2b..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html.headers +++ /dev/null @@ -1 +0,0 @@ -Cross-Origin-Opener-Policy: restrict-properties diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html deleted file mode 100644 index 560dfd90511..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html +++ /dev/null @@ -1,90 +0,0 @@ -<!doctype html> -<meta charset=utf-8> -<meta name=timeout content=long> -<meta name="variant" content="?1-2"> -<meta name="variant" content="?3-4"> -<meta name="variant" content="?5-6"> -<meta name="variant" content="?7-8"> -<meta name="variant" content="?9-last"> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src=/common/dispatcher/dispatcher.js></script> -<script src=/common/get-host-info.sub.js></script> -<script src=/common/subset-tests.js></script> -<script src=/common/utils.js></script> -<script src="../../resources/common.js"></script> -<script src="../../resources/iframe-test.js"></script> - -<body> -<script> - -// This document has COOP: restrict-properties. The popup has COOP: unsafe-none. -// Opening from an iframe should not be different from opening from the main -// frame and the opener should be severed. -[ - { - "title": "same origin iframe, same origin popup", - "iframeOrigin": SAME_ORIGIN, - "popupOrigin": SAME_ORIGIN, - "opener": "restricted" - }, - { - "title": "same site iframe, same origin popup", - "iframeOrigin": SAME_SITE, - "popupOrigin": SAME_ORIGIN, - "opener": "restricted" - }, - { - "title": "cross origin iframe, same origin popup", - "iframeOrigin": CROSS_ORIGIN, - "popupOrigin": SAME_ORIGIN, - "opener": "restricted" - }, - { - "title": "same origin iframe, same site popup", - "iframeOrigin": SAME_ORIGIN, - "popupOrigin": SAME_SITE, - "opener": "restricted" - }, - { - "title": "same site iframe, same site popup", - "iframeOrigin": SAME_SITE, - "popupOrigin": SAME_SITE, - "opener": "restricted" - }, - { - "title": "cross origin iframe, same site popup", - "iframeOrigin": CROSS_ORIGIN, - "popupOrigin": SAME_SITE, - "opener": "restricted" - }, - { - "title": "same origin iframe, cross origin popup", - "iframeOrigin": SAME_ORIGIN, - "popupOrigin": CROSS_ORIGIN, - "opener": "restricted" - }, - { - "title": "same site iframe, cross origin popup", - "iframeOrigin": SAME_SITE, - "popupOrigin": CROSS_ORIGIN, - "opener": "restricted" - }, - { - "title": "cross origin iframe, cross origin popup", - "iframeOrigin": CROSS_ORIGIN, - "popupOrigin": CROSS_ORIGIN, - "opener": "restricted" - } -].forEach(variant => { - subsetTest( - iframe_test, - `COOP: restrict-properties to popup COOP: unsafe-none via an iframe, ` + - `with ${variant.title}`, - variant.iframeOrigin, - variant.popupOrigin, - { coop: 'unsafe-none' }, - variant.opener); -}); -</script> -</body> diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html.headers deleted file mode 100644 index d5c99062d2b..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html.headers +++ /dev/null @@ -1 +0,0 @@ -Cross-Origin-Opener-Policy: restrict-properties diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html deleted file mode 100644 index 17840724d9e..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html +++ /dev/null @@ -1,91 +0,0 @@ -<!doctype html> -<meta charset=utf-8> -<meta name=timeout content=long> -<meta name="variant" content="?1-2"> -<meta name="variant" content="?3-4"> -<meta name="variant" content="?5-6"> -<meta name="variant" content="?7-8"> -<meta name="variant" content="?9-last"> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src=/common/dispatcher/dispatcher.js></script> -<script src=/common/get-host-info.sub.js></script> -<script src=/common/subset-tests.js></script> -<script src=/common/utils.js></script> -<script src="../../resources/common.js"></script> -<script src="../../resources/iframe-test.js"></script> - -<body> -<script> - -// This document has COOP: restrict-properties. The popup has COOP: -// restrict-properties. Opening from an iframe should not be different from -// opening from the main frame and the opener should be restricted if -// cross-origin. -[ - { - "title": "same origin iframe, same origin popup", - "iframeOrigin": SAME_ORIGIN, - "popupOrigin": SAME_ORIGIN, - "opener": "preserved" - }, - { - "title": "same site iframe, same origin popup", - "iframeOrigin": SAME_SITE, - "popupOrigin": SAME_ORIGIN, - "opener": "preserved" - }, - { - "title": "cross origin iframe, same origin popup", - "iframeOrigin": CROSS_ORIGIN, - "popupOrigin": SAME_ORIGIN, - "opener": "preserved" - }, - { - "title": "same origin iframe, same site popup", - "iframeOrigin": SAME_ORIGIN, - "popupOrigin": SAME_SITE, - "opener": "restricted" - }, - { - "title": "same site iframe, same site popup", - "iframeOrigin": SAME_SITE, - "popupOrigin": SAME_SITE, - "opener": "restricted" - }, - { - "title": "cross origin iframe, same site popup", - "iframeOrigin": CROSS_ORIGIN, - "popupOrigin": SAME_SITE, - "opener": "restricted" - }, - { - "title": "same origin iframe, cross origin popup", - "iframeOrigin": SAME_ORIGIN, - "popupOrigin": CROSS_ORIGIN, - "opener": "restricted" - }, - { - "title": "same site iframe, cross origin popup", - "iframeOrigin": SAME_SITE, - "popupOrigin": CROSS_ORIGIN, - "opener": "restricted" - }, - { - "title": "cross origin iframe, cross origin popup", - "iframeOrigin": CROSS_ORIGIN, - "popupOrigin": CROSS_ORIGIN, - "opener": "restricted" - } -].forEach(variant => { - subsetTest( - iframe_test, - `COOP: restrict-properties to popup COOP: restrict-properties via an ` + - `iframe, with ${variant.title}`, - variant.iframeOrigin, - variant.popupOrigin, - { coop: 'restrict-properties' }, - variant.opener); -}); -</script> -</body> diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html.headers deleted file mode 100644 index d5c99062d2b..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html.headers +++ /dev/null @@ -1 +0,0 @@ -Cross-Origin-Opener-Policy: restrict-properties diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/named_targeting.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/named_targeting.https.html deleted file mode 100644 index 10929847ee6..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/named_targeting.https.html +++ /dev/null @@ -1,57 +0,0 @@ -<!doctype html> -<meta charset=utf-8> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src="/common/dispatcher/dispatcher.js"></script> -<script src="/common/get-host-info.sub.js"></script> -<script src="/common/utils.js"></script> -<script src="../../resources/common.js"></script> - -<script> - -async function createCoopRestrictPropertiesPopup(popupToken, name) { - const url = SAME_ORIGIN.origin + '/common/dispatcher/executor.html' + - `?uuid=${popupToken}` + - '&pipe=|header(Cross-Origin-Opener-Policy, restrict-properties)'; - const popup = window.open(url, name); - add_completion_callback(() => popup.close()); - - // Wait for the popup to be loaded. - const replyToken = token(); - send(popupToken, `send('${replyToken}', 'Done loading')`); - assert_equals(await receive(replyToken), 'Done loading'); - - return popup; -} - -promise_test(async t => { - // Start by opening a first COOP: restrict-properties popup. No name is set to - // begin with. - const popupToken1 = token(); - const popup1 = await createCoopRestrictPropertiesPopup(popupToken1, ''); - - // Once the popup is live, explicitly set a name. - const name = token(); - send(popupToken1, `window.name = '${name}'`); - - // To make sure this name has been propagated to other processes, send a dummy - // message from the popup to the main page, and wait for it to be received. - // It should be delivered after the name change is replicated. - const message_waiter = new Promise(resolve => { - onmessage = (event) => { - if (event.data == 'Waited enough') { resolve(); } - } - }); - send(popupToken1, `opener.postMessage('Waited enough', '*')`); - await message_waiter; - - // Finally, call window.open with the same name. This should not resolve - // across browsing context groups, and create a brand new popup. - const popupToken2 = token(); - const popup2 = await createCoopRestrictPropertiesPopup(popupToken2, name); - assert_not_equals(popup1, popup2, - 'Named targeting resolved across isolation boundaries'); - -}, 'Verify that named targeting does not work across isolation boundaries.'); - -</script> diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-so.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-so.https.html deleted file mode 100644 index e5313a6e222..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-so.https.html +++ /dev/null @@ -1,37 +0,0 @@ -<!doctype html> -<meta charset=utf-8> -<meta name=timeout content=long> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src="/common/dispatcher/dispatcher.js"></script> -<script src="/common/get-host-info.sub.js"></script> -<script src="/common/utils.js"></script> -<script src="../../resources/common.js"></script> -<script src="../../resources/popup-test.js"></script> -<script> - -[ - { - "title": "popup with coop restrict-properties", - "coop": "restrict-properties", - "opener": "severed", - "origin": SAME_ORIGIN - }, - { - "title": "popup with coop restrict-properties", - "coop": "restrict-properties", - "opener": "severed", - "origin": SAME_SITE - }, - { - "title": "popup with coop restrict-properties", - "coop": "restrict-properties", - "opener": "severed", - "origin": CROSS_ORIGIN - } -].forEach(variant => { - popup_test(`${variant.origin.name} ${variant.title}`, variant.origin, - { coop: variant.coop }, variant.opener); -}); - -</script> diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-so.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-so.https.html.headers deleted file mode 100644 index 46ad58d83bf..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-so.https.html.headers +++ /dev/null @@ -1 +0,0 @@ -Cross-Origin-Opener-Policy: same-origin diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-soap.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-soap.https.html deleted file mode 100644 index 595a10a84bb..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-soap.https.html +++ /dev/null @@ -1,37 +0,0 @@ -<!doctype html> -<meta charset=utf-8> -<meta name=timeout content=long> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src="/common/dispatcher/dispatcher.js"></script> -<script src="/common/get-host-info.sub.js"></script> -<script src="/common/utils.js"></script> -<script src="../../resources/common.js"></script> -<script src="../../resources/popup-test.js"></script> -<script> - -[ - { - "title": "popup with coop restrict-properties", - "coop": "restrict-properties", - "opener": "restricted", - "origin": SAME_ORIGIN - }, - { - "title": "popup with coop restrict-properties", - "coop": "restrict-properties", - "opener": "restricted", - "origin": SAME_SITE - }, - { - "title": "popup with coop restrict-properties", - "coop": "restrict-properties", - "opener": "restricted", - "origin": CROSS_ORIGIN - } -].forEach(variant => { - popup_test(`${variant.origin.name} ${variant.title}`, variant.origin, - { coop: variant.coop }, variant.opener); -}); - -</script> diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-soap.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-soap.https.html.headers deleted file mode 100644 index d83ed86fb9b..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-soap.https.html.headers +++ /dev/null @@ -1 +0,0 @@ -Cross-Origin-Opener-Policy: same-origin-allow-popups diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-u.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-u.https.html deleted file mode 100644 index 595a10a84bb..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-u.https.html +++ /dev/null @@ -1,37 +0,0 @@ -<!doctype html> -<meta charset=utf-8> -<meta name=timeout content=long> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src="/common/dispatcher/dispatcher.js"></script> -<script src="/common/get-host-info.sub.js"></script> -<script src="/common/utils.js"></script> -<script src="../../resources/common.js"></script> -<script src="../../resources/popup-test.js"></script> -<script> - -[ - { - "title": "popup with coop restrict-properties", - "coop": "restrict-properties", - "opener": "restricted", - "origin": SAME_ORIGIN - }, - { - "title": "popup with coop restrict-properties", - "coop": "restrict-properties", - "opener": "restricted", - "origin": SAME_SITE - }, - { - "title": "popup with coop restrict-properties", - "coop": "restrict-properties", - "opener": "restricted", - "origin": CROSS_ORIGIN - } -].forEach(variant => { - popup_test(`${variant.origin.name} ${variant.title}`, variant.origin, - { coop: variant.coop }, variant.opener); -}); - -</script> diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-un.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-un.https.html deleted file mode 100644 index 595a10a84bb..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-un.https.html +++ /dev/null @@ -1,37 +0,0 @@ -<!doctype html> -<meta charset=utf-8> -<meta name=timeout content=long> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src="/common/dispatcher/dispatcher.js"></script> -<script src="/common/get-host-info.sub.js"></script> -<script src="/common/utils.js"></script> -<script src="../../resources/common.js"></script> -<script src="../../resources/popup-test.js"></script> -<script> - -[ - { - "title": "popup with coop restrict-properties", - "coop": "restrict-properties", - "opener": "restricted", - "origin": SAME_ORIGIN - }, - { - "title": "popup with coop restrict-properties", - "coop": "restrict-properties", - "opener": "restricted", - "origin": SAME_SITE - }, - { - "title": "popup with coop restrict-properties", - "coop": "restrict-properties", - "opener": "restricted", - "origin": CROSS_ORIGIN - } -].forEach(variant => { - popup_test(`${variant.origin.name} ${variant.title}`, variant.origin, - { coop: variant.coop }, variant.opener); -}); - -</script> diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-un.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-un.https.html.headers deleted file mode 100644 index 073ce7adfbd..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-un.https.html.headers +++ /dev/null @@ -1 +0,0 @@ -Cross-Origin-Opener-Policy: unsafe-none diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-cross-origin.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-cross-origin.https.html deleted file mode 100644 index a84d52584e9..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-cross-origin.https.html +++ /dev/null @@ -1,44 +0,0 @@ -<!doctype html> -<meta charset=utf-8> -<meta name=timeout content=long> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src="/common/dispatcher/dispatcher.js"></script> -<script src="/common/get-host-info.sub.js"></script> -<script src="/common/utils.js"></script> -<script src="../../resources/common.js"></script> -<script src="../../resources/popup-test.js"></script> -<script> - -[ - { - "title": "popup with empty coop", - "coop": "", - "opener": "restricted" - }, - { - "title": "popup with coop unsafe-none", - "coop": "unsafe-none", - "opener": "restricted" - }, - { - "title": "popup with coop same-origin", - "coop": "same-origin", - "opener": "severed" - }, - { - "title": "popup with coop same-origin-allow-popups", - "coop": "same-origin-allow-popups", - "opener": "severed" - }, - { - "title": "popup with coop restrict-properties", - "coop": "restrict-properties", - "opener": "restricted" - } -].forEach(variant => { - popup_test(`Cross-origin ${variant.title}`, CROSS_ORIGIN, - { coop: variant.coop }, variant.opener); -}); - -</script> diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-cross-origin.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-cross-origin.https.html.headers deleted file mode 100644 index d5c99062d2b..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-cross-origin.https.html.headers +++ /dev/null @@ -1 +0,0 @@ -Cross-Origin-Opener-Policy: restrict-properties diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-origin.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-origin.https.html deleted file mode 100644 index c0020fa23a4..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-origin.https.html +++ /dev/null @@ -1,44 +0,0 @@ -<!doctype html> -<meta charset=utf-8> -<meta name=timeout content=long> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src="/common/dispatcher/dispatcher.js"></script> -<script src="/common/get-host-info.sub.js"></script> -<script src="/common/utils.js"></script> -<script src="../../resources/common.js"></script> -<script src="../../resources/popup-test.js"></script> -<script> - -[ - { - "title": "popup with empty coop", - "coop": "", - "opener": "restricted" - }, - { - "title": "popup with coop unsafe-none", - "coop": "unsafe-none", - "opener": "restricted" - }, - { - "title": "popup with coop same-origin", - "coop": "same-origin", - "opener": "severed" - }, - { - "title": "popup with coop same-origin-allow-popups", - "coop": "same-origin-allow-popups", - "opener": "severed" - }, - { - "title": "popup with coop restrict-properties", - "coop": "restrict-properties", - "opener": "preserved" - } -].forEach(variant => { - popup_test(`Same-origin ${variant.title}`, SAME_ORIGIN, - { coop: variant.coop }, variant.opener); -}); - -</script> diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-origin.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-origin.https.html.headers deleted file mode 100644 index d5c99062d2b..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-origin.https.html.headers +++ /dev/null @@ -1 +0,0 @@ -Cross-Origin-Opener-Policy: restrict-properties diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-site.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-site.https.html deleted file mode 100644 index 7d115ac7e63..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-site.https.html +++ /dev/null @@ -1,44 +0,0 @@ -<!doctype html> -<meta charset=utf-8> -<meta name=timeout content=long> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src="/common/dispatcher/dispatcher.js"></script> -<script src="/common/get-host-info.sub.js"></script> -<script src="/common/utils.js"></script> -<script src="../../resources/common.js"></script> -<script src="../../resources/popup-test.js"></script> -<script> - -[ - { - "title": "popup with empty coop", - "coop": "", - "opener": "restricted" - }, - { - "title": "popup with coop unsafe-none", - "coop": "unsafe-none", - "opener": "restricted" - }, - { - "title": "popup with coop same-origin", - "coop": "same-origin", - "opener": "severed" - }, - { - "title": "popup with coop same-origin-allow-popups", - "coop": "same-origin-allow-popups", - "opener": "severed" - }, - { - "title": "popup with coop restrict-properties", - "coop": "restrict-properties", - "opener": "restricted" - } -].forEach(variant => { - popup_test(`Same-site ${variant.title}`, SAME_SITE, - { coop: variant.coop }, variant.opener); -}); - -</script> diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-site.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-site.https.html.headers deleted file mode 100644 index d5c99062d2b..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-site.https.html.headers +++ /dev/null @@ -1 +0,0 @@ -Cross-Origin-Opener-Policy: restrict-properties diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html deleted file mode 100644 index 9bc171a269c..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html +++ /dev/null @@ -1,62 +0,0 @@ -<!doctype html> -<title> - Verify that we consider browsing context group reuse for COOP reporting. -</title> -<meta name="timeout" content="long"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/common/get-host-info.sub.js"></script> -<script src="/common/utils.js"></script> -<script src="/common/dispatcher/dispatcher.js"></script> -<script src="/html/cross-origin-opener-policy/reporting/resources/try-access.js"></script> -<script src="/html/cross-origin-opener-policy/resources/common.js"></script> -<script - src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js?pipe=sub&report_id=f1e361ab5854f2dcfe0224b19bc53199&report_only_id=b6fe666b74547291d52d72790adde05c"></script> -<script> - -const same_origin = get_host_info().HTTPS_ORIGIN; -const cross_origin = get_host_info().HTTPS_REMOTE_ORIGIN; - -promise_test(async test => { - // To receive reports use the same hard-coded value as the one passed in the - // headers and to "reporting-common.js". - const report_token = "b6fe666b74547291d52d72790adde05c"; - const reportTo = reportToHeaders(report_token); - - // 1. Open a popup without any COOP. It should be in a - // different virtual browsing context group. - const opener_token = token(); // For this window. - const initial_openee_token = token(); - const initial_openee_url = cross_origin + executor_path + - `&uuid=${initial_openee_token}`; - let openee = window.open(initial_openee_url); - - // 2. Navigate the openee to a COOP-RO: restrict-properties page. If the - // policy was enforced, it would live in the same browsing context group as - // this page. The virtual browsing context group should similarly be equal. - // Note: We omit the reporting endpoint header, because it is not possible to - // easily escape it. Since it is not necessary in this test, we skip it. - const final_openee_token = token(); - const final_openee_url = same_origin + executor_path + - reportTo.coopReportOnlyRestrictPropertiesHeader + - `&uuid=${final_openee_token}`; - - send(initial_openee_token, `location.href = '${final_openee_url}';`); - test.add_cleanup(() => send(final_openee_token, "window.close()")); - - // Wait for the final openee to load. - send(final_openee_token, - `send("${opener_token}", "Ready"); - `); - assert_equals(await receive(opener_token), "Ready"); - - // 3. Try to access the openee from the opener. No report should be sent. - tryAccess(openee); - - let report = - await receiveReport(report_token, "access-from-coop-page-to-openee") - assert_equals(report, "timeout"); - -}, "access-reporting-browsing-context-group-reuse"); - -</script> diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html.sub.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html.sub.headers deleted file mode 100644 index 33abadd83dd..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html.sub.headers +++ /dev/null @@ -1,2 +0,0 @@ -Cross-Origin-Opener-Policy-Report-Only: restrict-properties; report-to="coop-report-only-endpoint" -Reporting-Endpoints: coop-report-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=f1e361ab5854f2dcfe0224b19bc53199", coop-report-only-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=b6fe666b74547291d52d72790adde05c" diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html deleted file mode 100644 index b89030f218f..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html +++ /dev/null @@ -1,55 +0,0 @@ -<!doctype html> -<meta name=timeout content=long> -<title>Opening a restrict-properties</title> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src="/common/get-host-info.sub.js"></script> -<script src="/common/utils.js"></script> -<script src="/common/dispatcher/dispatcher.js"></script> -<script src="/html/cross-origin-opener-policy/resources/common.js"></script> -<script - src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js?pipe=sub&report_id=fb054dadb3a9ec17b5cd5c0152d2a7dd&report_only_id=c265b07fbb3bffa2cd2a5179d686ced2"></script> - -<script> - -let tests = [ - // popup origin, popup COOP, popup COEP, popup COOP report-only, popup COEP report-only, expected reports - - // Open a same-origin popup with COOP unsafe-none, which mismatches with the - // current document (opener) COOP report-only (restrict-properties) values. - [ - SAME_ORIGIN, - "unsafe-none", - "", - "", - "", - [] - ], - - // Open a cross-origin popup with COOP unsafe-none, which mismatches with the - // current document (opener) COOP report-only (restrict-properties) values. - [ - CROSS_ORIGIN, - "unsafe-none", - "", - "", - "", - [] - ], - - // Open a same-origin popup with COOP restrict-properties, which matches with - // the current document (opener) COOP report-only (restrict-properties) value. - [ - SAME_ORIGIN, - "restrict-properties", - "", - "", - "", - [] - ], -]; - -runNavigationReportingTests(document.title, tests); - -</script> - diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html.sub.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html.sub.headers deleted file mode 100644 index 07ecad96f24..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html.sub.headers +++ /dev/null @@ -1,2 +0,0 @@ -Cross-Origin-Opener-Policy-Report-Only: restrict-properties; report-to="coop-report-only-endpoint" -Reporting-Endpoints: coop-report-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=fb054dadb3a9ec17b5cd5c0152d2a7dd", coop-report-only-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=c265b07fbb3bffa2cd2a5179d686ced2" diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html deleted file mode 100644 index 6b31f7e0098..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html +++ /dev/null @@ -1,55 +0,0 @@ -<!doctype html> -<meta name=timeout content=long> -<title>Opening a restrict-properties</title> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src="/common/get-host-info.sub.js"></script> -<script src="/common/utils.js"></script> -<script src="/common/dispatcher/dispatcher.js"></script> -<script src="/html/cross-origin-opener-policy/resources/common.js"></script> -<script - src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js?pipe=sub&report_id=ed5a8be35e4e21c2ba960e6574e0a32c&report_only_id=fa22ddc676642edae42c75defb82ba2e"></script> - -<script> - -let tests = [ - // popup origin, popup COOP, popup COEP, popup COOP report-only, popup COEP report-only, expected reports - - // Open a same-origin popup with COOP unsafe-none, which mismatches - // with the current document (opener) COOP (restrict-properties) values. - [ - SAME_ORIGIN, - "unsafe-none", - "", - "", - "", - [] - ], - - // Open a cross-origin popup with COOP unsafe-none, which mismatches - // with the current document (opener) COOP (restrict-properties) values. - [ - CROSS_ORIGIN, - "unsafe-none", - "", - "", - "", - [] - ], - - // Open a same-origin popup with COOP restrict-properties, which matches with - // the current document (opener) COOP (restrict-properties) value. - [ - SAME_ORIGIN, - "restrict-properties", - "", - "", - "", - [] - ], -]; - -runNavigationReportingTests(document.title, tests); - -</script> - diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html.sub.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html.sub.headers deleted file mode 100644 index a61e2919c8a..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html.sub.headers +++ /dev/null @@ -1,2 +0,0 @@ -Cross-Origin-Opener-Policy: restrict-properties; report-to="coop-report-endpoint" -Reporting-Endpoints: coop-report-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=ed5a8be35e4e21c2ba960e6574e0a32c", coop-report-only-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=fa22ddc676642edae42c75defb82ba2e" diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp-ro.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp-ro.https.html deleted file mode 100644 index c47e59cd8f1..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp-ro.https.html +++ /dev/null @@ -1,43 +0,0 @@ -<!doctype html> -<meta name=timeout content=long> -<title>reporting same origin with report-to</title> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src="/common/get-host-info.sub.js"></script> -<script src="/common/utils.js"></script> -<script src="/common/dispatcher/dispatcher.js"></script> -<script src="/html/cross-origin-opener-policy/resources/common.js"></script> -<script src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js"></script> - -<script> - -let tests = [ - // popup origin, popup COOP, popup COEP, popup COOP report-only, popup COEP report-only, expected reports - - // Open a same-origin popup with COOP report-only restrict-properties, which - // mismatches with the current document (opener) COOP (unsafe-none). - [ - SAME_ORIGIN, - "", - "", - `restrict-properties; report-to="${popupReportOnlyEndpoint.name}"`, - "", - [] - ], - - // Open a cross-origin popup with COOP report-only restrict-properties, which - // mismatches with the current document (opener) COOP (unsafe-none). - [ - CROSS_ORIGIN, - "", - "", - `restrict-properties; report-to="${popupReportOnlyEndpoint.name}"`, - "", - [] - ], -]; - -runNavigationReportingTests(document.title, tests); - -</script> - diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp-ro.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp-ro.https.html.headers deleted file mode 100644 index 16903320bb5..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp-ro.https.html.headers +++ /dev/null @@ -1,2 +0,0 @@ -Cross-Origin-Opener-Policy: unsafe-none -Referrer-Policy: origin diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp.https.html deleted file mode 100644 index ff60e8c5afd..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp.https.html +++ /dev/null @@ -1,43 +0,0 @@ -<!doctype html> -<meta name=timeout content=long> -<title>reporting same origin with report-to</title> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src="/common/get-host-info.sub.js"></script> -<script src="/common/utils.js"></script> -<script src="/common/dispatcher/dispatcher.js"></script> -<script src="/html/cross-origin-opener-policy/resources/common.js"></script> -<script src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js"></script> - -<script> - -let tests = [ - // popup origin, popup COOP, popup COEP, popup COOP report-only, popup COEP report-only, expected reports - - // Open a same-origin popup with COOP report-only restrict-properties, which - // mismatches with the current document (opener) COOP (unsafe-none). - [ - SAME_ORIGIN, - `restrict-properties; report-to="${popupReportEndpoint.name}"`, - "", - "", - "", - [] - ], - - // Open a cross-origin popup with COOP report-only restrict-properties, which - // mismatches with the current document (opener) COOP (unsafe-none). - [ - CROSS_ORIGIN, - `restrict-properties; report-to="${popupReportEndpoint.name}"`, - "", - "", - "", - [] - ], -]; - -runNavigationReportingTests(document.title, tests); - -</script> - diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp.https.html.headers deleted file mode 100644 index 16903320bb5..00000000000 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp.https.html.headers +++ /dev/null @@ -1,2 +0,0 @@ -Cross-Origin-Opener-Policy: unsafe-none -Referrer-Policy: origin diff --git a/tests/wpt/tests/html/editing/editing-0/writing-suggestions/WEB_FEATURES.yml b/tests/wpt/tests/html/editing/editing-0/writing-suggestions/WEB_FEATURES.yml new file mode 100644 index 00000000000..4700eca4a12 --- /dev/null +++ b/tests/wpt/tests/html/editing/editing-0/writing-suggestions/WEB_FEATURES.yml @@ -0,0 +1,3 @@ +features: +- name: writingsuggestions + files: "**" diff --git a/tests/wpt/tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types-ref.html b/tests/wpt/tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types-ref.html index b177f47b757..5042557212e 100644 --- a/tests/wpt/tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types-ref.html +++ b/tests/wpt/tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types-ref.html @@ -1,8 +1,8 @@ <!doctype html> <html> <body> -<div style="width: 1em; color: white; background-color: black;"> - <marquee loop="1" behavior="alternate">m</marquee> +<div style="vertical-align: text-bottom; display: inline-block;"> + <div style="width: 10px; height: 10px; background-color: green;"></div> </div> </body> </html> diff --git a/tests/wpt/tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types.html b/tests/wpt/tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types.html index 57f49850321..f16c58bb85d 100644 --- a/tests/wpt/tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types.html +++ b/tests/wpt/tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types.html @@ -1,12 +1,12 @@ <!doctype html> <html> <head> -<meta http-equiv="Content-Security-Policy" content="require-trusted-types-for 'script'"> -<link rel="match" href="marquee-with-trusted-types-ref.html"> + <meta http-equiv="Content-Security-Policy" content="require-trusted-types-for 'script'"> + <link rel="match" href="marquee-with-trusted-types-ref.html"> </head> <body> -<div style="width: 1em; color: white; background-color: black;"> - <marquee loop="1" behavior="alternate">m</marquee> -</div> +<marquee scrollamount="0"> + <div style="width: 10px; height: 10px; background-color: green;"></div> +</marquee> </body> </html> diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance-ref.html b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance-ref.html new file mode 100644 index 00000000000..57ea51e367c --- /dev/null +++ b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance-ref.html @@ -0,0 +1,49 @@ +<!DOCTYPE html> +<link rel=stylesheet href="resources/customizable-select-in-page.css"> +<link rel=stylesheet href="../customizable-select/resources/customizable-select-styles.css"> +<script src="resources/customizable-select-in-page.js"></script> + +<div class=customizable-select-in-page size=4> + <div class="customizable-select-option selected">select multiple</div> + <div class=customizable-select-option>two</div> + <div class=customizable-select-option>three</div> +</div> + +<div class=customizable-select-in-page size=4> + <div class="customizable-select-option selected">select size=4</div> + <div class=customizable-select-option>two</div> + <div class=customizable-select-option>three</div> +</div> + +<div class="customizable-select-in-page disabled" size=4> + <div class="customizable-select-option selected">select disabled</div> + <div class=customizable-select-option>two</div> + <div class=customizable-select-option>three</div> + <div class=customizable-select-option>disabled</div> +</div> + +<!-- TODO(crbug.com/407801061): Fix padding and remove this div. --> +<div style="position: absolute; top: 150px"> + +<div class=customizable-select-in-page size=4> + <div class="customizable-select-option selected">with disabled option</div> + <div class=customizable-select-option>two</div> + <div class=customizable-select-option>three</div> + <div class="customizable-select-option disabled">disabled</div> +</div> + +<div class=customizable-select-in-page size=4> + <div class=customizable-select-legend>optgroup</div> + <div class=customizable-select-option>option in optgroup</div> + <div class=customizable-select-option>option out of optgroup</div> +</div> + +<div class=customizable-select-in-page size=4> + <div class="customizable-select-legend disabled">disabled optgroup</div> + <div class="customizable-select-option disabled">option in optgroup</div> + <div class=customizable-select-option>option out of optgroup</div> +</div> + +<script> +updateCustomizableSelectInPageSize(); +</script> diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance.tentative.html b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance.tentative.html new file mode 100644 index 00000000000..b3bf75eb0ff --- /dev/null +++ b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance.tentative.html @@ -0,0 +1,55 @@ +<!DOCTYPE html> +<link rel=author href="mailto:jarhar@chromium.org"> +<link rel=help href="https://issues.chromium.org/issues/357649033"> +<link rel=match href="customizable-select-in-page-appearance-ref.html"> + +<style> +select { + appearance: base-select; +} +</style> + +<select multiple> + <option selected>select multiple</option> + <option>two</option> + <option>three</option> +</select> + +<select size=4> + <option selected>select size=4</option> + <option>two</option> + <option>three</option> +</select> + +<select size=4 disabled> + <option selected>select disabled</option> + <option>two</option> + <option>three</option> + <option disabled>disabled</option> +</select> + +<!-- TODO(crbug.com/407801061): Fix padding and remove this div. --> +<div style="position: absolute; top: 150px"> + +<select size=4> + <option selected>with disabled option</option> + <option>two</option> + <option>three</option> + <option disabled>disabled</option> +</select> + +<select size=4> + <optgroup> + <legend>optgroup</legend> + <option>option in optgroup</option> + </optgroup> + <option>option out of optgroup</option> +</select> + +<select size=4> + <optgroup disabled> + <legend>disabled optgroup</legend> + <option>option in optgroup</option> + </optgroup> + <option>option out of optgroup</option> +</select> diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-keyboard-behavior.tentative.html b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-keyboard-behavior.tentative.html new file mode 100644 index 00000000000..24e6e39ea48 --- /dev/null +++ b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-keyboard-behavior.tentative.html @@ -0,0 +1,192 @@ +<!DOCTYPE html> +<link rel=author href="mailto:jarhar@chromium.org"> +<link rel=help href="https://issues.chromium.org/issues/357649033"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script src="/resources/testdriver-actions.js"></script> + +<style> +select { + appearance: base-select; +} +</style> + +<button id=beforemultiple>button before multiple</button> +<select multiple> + <option class=one>one</option> + <option class=two>two</option> + <option class=disabled disabled>disabled</option> +</select> + +<button id=beforesize>button before size=4</button> +<select size=4> + <option class=one>one</option> + <option class=two>two</option> + <option class=disabled disabled>disabled</option> +</select> + +<script> +const tabKey = '\uE004'; +const enterKey = '\uE007'; +const spaceKey = '\uE00D'; +const arrowUp = '\uE013'; +const arrowDown = '\uE015'; +function pressKey(keyCode) { + return (new test_driver.Actions() + .keyDown(keyCode) + .keyUp(keyCode)) + .send(); +} + +promise_test(async () => { + const select = document.querySelector('select[multiple]'); + const optionOne = select.querySelector('.one'); + const optionTwo = select.querySelector('.two'); + assert_equals(select.selectedOptions.length, 0, + 'No options should be selected at the start of the test.'); + + beforemultiple.focus(); + await pressKey(tabKey); + assert_equals(document.activeElement, optionOne, + 'The first option should get focus when keyboard focusing into a select.'); + + await pressKey(spaceKey); + assert_equals(document.activeElement, optionOne, + 'Focus should not be moved after pressing space.'); + assert_equals(select.selectedOptions.length, 1, + 'One option should be selected after the first space.'); + assert_equals(select.selectedOptions[0], optionOne, + 'First option should be selected after the first space.'); + + await pressKey(arrowDown); + assert_equals(document.activeElement, optionTwo, + 'Second option should be focused after arrow down.'); + + await pressKey(arrowDown); + assert_equals(document.activeElement, optionTwo, + 'Disabled option should not be focusable.'); + + await pressKey(spaceKey); + assert_equals(document.activeElement, optionTwo, + 'Second option should be focused after second space.'); + assert_equals(select.selectedOptions.length, 2, + 'Two options should be selected after second space.'); + assert_equals(select.selectedOptions[0], optionOne, + 'First option should stay selected after second space.'); + assert_equals(select.selectedOptions[1], optionTwo, + 'Second option should be selected after second space.'); + + await pressKey(spaceKey); + assert_equals(document.activeElement, optionTwo, + 'Second option should be focused after third space.'); + assert_equals(select.selectedOptions.length, 1, + 'One option should be selected after third space.'); + assert_equals(select.selectedOptions[0], optionOne, + 'First option should stay selected after third space.'); + + await pressKey(enterKey); + assert_equals(document.activeElement, optionTwo, + 'Second option should be focused after first enter.'); + assert_equals(select.selectedOptions.length, 2, + 'Two options should be selected after first enter.'); + assert_equals(select.selectedOptions[0], optionOne, + 'First option should stay selected after first enter.'); + assert_equals(select.selectedOptions[1], optionTwo, + 'Second option should be selected after first enter.'); + + await pressKey(enterKey); + assert_equals(document.activeElement, optionTwo, + 'Second option should be focused after second enter.'); + assert_equals(select.selectedOptions.length, 1, + 'One option should be selected after second enter.'); + assert_equals(select.selectedOptions[0], optionOne, + 'First option should stay selected after second enter.'); + + await pressKey(arrowUp); + assert_equals(document.activeElement, optionOne, + 'First option should be focused after arrow up.'); + assert_equals(select.selectedOptions.length, 1, + 'One option should be selected after arrow up.'); + assert_equals(select.selectedOptions[0], optionOne, + 'First option should stay selected after arrow up.'); +}, 'Keyboard behavior for base appearance <select multiple>'); + +promise_test(async () => { + const select = document.querySelector('select[size]'); + const optionOne = select.querySelector('.one'); + const optionTwo = select.querySelector('.two'); + assert_equals(select.selectedOptions.length, 0, + 'No options should be selected at the start of the test.'); + + beforesize.focus(); + await pressKey(tabKey); + assert_equals(document.activeElement, optionOne, + 'The first option should get focus when keyboard focusing into a select.'); + + await pressKey(spaceKey); + assert_equals(document.activeElement, optionOne, + 'Focus should not be moved after pressing space.'); + assert_equals(select.selectedOptions.length, 1, + 'One option should be selected after the first space.'); + assert_equals(select.selectedOptions[0], optionOne, + 'First option should be selected after the first space.'); + + await pressKey(arrowDown); + assert_equals(document.activeElement, optionTwo, + 'Second option should be focused after arrow down.'); + + await pressKey(arrowDown); + assert_equals(document.activeElement, optionTwo, + 'Disabled option should not be focusable.'); + + await pressKey(spaceKey); + assert_equals(document.activeElement, optionTwo, + 'Second option should be focused after second space.'); + assert_equals(select.selectedOptions.length, 1, + 'One options should be selected after second space.'); + assert_equals(select.selectedOptions[0], optionTwo, + 'Second option should be selected after second space.'); + + await pressKey(spaceKey); + assert_equals(document.activeElement, optionTwo, + 'Second option should be focused after third space.'); + assert_equals(select.selectedOptions.length, 0, + 'No options should be selected after third space.'); + + await pressKey(enterKey); + assert_equals(document.activeElement, optionTwo, + 'Second option should be focused after first enter.'); + assert_equals(select.selectedOptions.length, 1, + 'One option should be selected after first enter.'); + assert_equals(select.selectedOptions[0], optionTwo, + 'Second option should be selected after first enter.'); + + await pressKey(enterKey); + assert_equals(document.activeElement, optionTwo, + 'Second option should be focused after second enter.'); + assert_equals(select.selectedOptions.length, 0, + 'No options should be selected after second enter.'); + + await pressKey(arrowUp); + assert_equals(document.activeElement, optionOne, + 'First option should be focused after arrow up.'); + assert_equals(select.selectedOptions.length, 0, + 'No options should be selected after arrow up.'); +}, 'Keyboard behavior for base appearance <select size=4>'); + +promise_test(async () => { + document.body.focus(); + + const selectMultiple = document.querySelector('select[multiple]'); + selectMultiple.focus(); + assert_not_equals(document.activeElement, selectMultiple, '<select multiple>'); + + const selectSize = document.querySelector('select[size]'); + selectSize.focus(); + assert_not_equals(document.activeElement, selectSize, '<select size=4>'); +}, 'Base appearance in-page selects should not be focusable.'); + +// TODO(crbug.com/357649033): Test tab key while focused on an option after deciding behavior. +</script> diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-mouse-behavior.tentative.html b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-mouse-behavior.tentative.html new file mode 100644 index 00000000000..d5b93693cf7 --- /dev/null +++ b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-mouse-behavior.tentative.html @@ -0,0 +1,129 @@ +<!DOCTYPE html> +<link rel=author href="mailto:jarhar@chromium.org"> +<link rel=help href="https://issues.chromium.org/issues/357649033"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script src="/resources/testdriver-actions.js"></script> + +<style> +select { + appearance: base-select; +} +</style> + +<select multiple> + <option class=one>one</option> + <option class=two>two</option> + <option class=disabled disabled>disabled</option> +</select> + +<select size=4> + <option class=one>one</option> + <option class=two>two</option> + <option class=disabled disabled>disabled</option> +</select> + +<script> +function click(element) { + return (new test_driver.Actions() + .pointerMove(1, 1, {origin: element}) + .pointerDown() + .pointerUp()) + .send(); +} + +function touch(element) { + return (new test_driver.Actions() + .addPointer('finger', 'touch') + .pointerMove(1, 1, {origin: element, sourceName: 'finger'}) + .pointerDown({sourceName: 'finger'}) + .pointerUp({sourceName: 'finger'})) + .send(); +} + +['mouse', 'touch'].forEach(inputType => { + const activate = inputType == 'touch' ? touch : click; + + promise_test(async () => { + const select = document.querySelector('select[multiple]'); + select.value = null; + select.removeAttribute('disabled'); + const optionOne = select.querySelector('.one'); + const optionTwo = select.querySelector('.two'); + const disabledOption = select.querySelector('.disabled'); + assert_equals(select.selectedOptions.length, 0, + 'No options should be selected at the start of the test.'); + + await activate(optionOne); + assert_equals(select.selectedOptions.length, 1, + 'There should be one selected option after first click.'); + assert_equals(select.selectedOptions[0], optionOne, + 'Option one should be selected after first click.'); + + await activate(optionTwo); + assert_equals(select.selectedOptions.length, 2, + 'There should be two selected options after second click.'); + assert_equals(select.selectedOptions[0], optionOne, + 'Option one should stay selected after second click.'); + assert_equals(select.selectedOptions[1], optionTwo, + 'Option two should be seleted after second click.'); + + await activate(optionTwo); + assert_equals(select.selectedOptions.length, 1, + 'There should be one selected option after third click.'); + assert_equals(select.selectedOptions[0], optionOne, + 'Option one should stay selected after third click.'); + + await activate(disabledOption); + assert_equals(select.selectedOptions.length, 1, + 'Disabled option should not be checkable.'); + assert_equals(select.selectedOptions[0], optionOne, + 'Disabled option should not be checkable.'); + + select.setAttribute('disabled', ''); + await activate(optionTwo); + assert_equals(select.selectedOptions.length, 1, + 'Disabled select should not have checkable options.'); + assert_equals(select.selectedOptions[0], optionOne, + 'Disabled select should not have checkable options.'); + }, `${inputType}: input behavior for base appearance <select multiple>`); + + promise_test(async () => { + const select = document.querySelector('select[size]'); + select.value = null; + select.removeAttribute('disabled'); + const optionOne = select.querySelector('.one'); + const optionTwo = select.querySelector('.two'); + const disabledOption = select.querySelector('.disabled'); + assert_equals(select.selectedOptions.length, 0, + 'No options should be selected at the start of the test.'); + + await activate(optionOne); + assert_equals(select.selectedOptions.length, 1, + 'There should be one selected option after first click.'); + assert_equals(select.selectedOptions[0], optionOne, + 'Option one should be selected after first click.'); + + await activate(optionTwo); + assert_equals(select.selectedOptions.length, 1, + 'There should be one selected option after second click.'); + assert_equals(select.selectedOptions[0], optionTwo, + 'Option two should be selected after second click.'); + + await activate(optionTwo); + assert_equals(select.selectedOptions.length, 0, + 'There should be no selected options after third click.'); + + await activate(disabledOption); + assert_equals(select.selectedOptions.length, 0, + 'Disabled option should not be checkable.'); + + select.setAttribute('disabled', ''); + await activate(optionTwo); + assert_equals(select.selectedOptions.length, 0, + 'Disabled select should not have checkable options.'); + }, `${inputType}: input behavior for base appearance <select size=4>`); +}); +</script> diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/resources/customizable-select-in-page.css b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/resources/customizable-select-in-page.css new file mode 100644 index 00000000000..deb080b4756 --- /dev/null +++ b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/resources/customizable-select-in-page.css @@ -0,0 +1,14 @@ +.customizable-select-in-page { + display: inline-block; + border: 1px solid; + overflow-inline: hidden; + overflow-block: scroll; +} + +.customizable-select-in-page.disabled { + color: color-mix(in lab, currentColor 50%, transparent); +} + +.customizable-select-in-page:not(.disabled) .customizable-select-legend.disabled { + color: color-mix(in lab, currentColor 50%, transparent); +} diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/resources/customizable-select-in-page.js b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/resources/customizable-select-in-page.js new file mode 100644 index 00000000000..13230943321 --- /dev/null +++ b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/resources/customizable-select-in-page.js @@ -0,0 +1,13 @@ +function updateCustomizableSelectInPageSize() { + document.querySelectorAll('.customizable-select-in-page').forEach(select => { + const size = Number(select.getAttribute('size')); + if (size) { + let optionHeight = 0; + select.querySelectorAll('.customizable-select-option').forEach(option => { + const rect = option.getBoundingClientRect(); + optionHeight = Math.max(optionHeight, rect.height); + }); + select.style.height = (optionHeight * size) + 'px'; + } + }); +} diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-multiple-base-appearance-ref.html b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-multiple-base-appearance-ref.html deleted file mode 100644 index 45a74da7559..00000000000 --- a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-multiple-base-appearance-ref.html +++ /dev/null @@ -1,16 +0,0 @@ -<!DOCTYPE html> -<select multiple> - <option>one</option> - <option>two div button</option> -</select> - -<select multiple size=2> - <option>one</option> - <option>two</option> - <option>three</option> - <option>four</option> -</select> - -<select multiple> - <option selected>option</option> -</select> diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-multiple-base-appearance.html b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-multiple-base-appearance.html deleted file mode 100644 index 48673b446bc..00000000000 --- a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-multiple-base-appearance.html +++ /dev/null @@ -1,39 +0,0 @@ -<!DOCTYPE html> -<html class=reftest-wait> -<link rel=author href="mailto:jarhar@chromium.org"> -<link rel=match href="select-multiple-base-appearance-ref.html"> - -<style> -select, ::picker(select) { - appearance: base-select; -} -</style> - -<select multiple> - <option>one</option> - <option> - two - <div>div</div> - <button>button</button> - </option> -</select> - -<select multiple size=2> - <option>one</option> - <option>two</option> - <option>three</option> - <option>four</option> -</select> - -<select id=needsmultiple> - <option selected>option</option> -</select> - -<script> -requestAnimationFrame(() => { - document.getElementById('needsmultiple').setAttribute('multiple', ''); - requestAnimationFrame(() => { - document.documentElement.classList.remove('reftest-wait'); - }); -}); -</script> diff --git a/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-focusability.html b/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-focusability.html index 1e000866099..5afb407640b 100644 --- a/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-focusability.html +++ b/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-focusability.html @@ -48,11 +48,9 @@ } } - async_test((t) => { - window.onload = async () => { - await assert_focus_order([before,within1,after1,dialog2,within2,after2, - within3,after3,dialog4,within4,after4]); - t.done(); - }; + promise_test(async () => { + await new Promise(resolve => window.onload = resolve); + await assert_focus_order([before,within1,after1,dialog2,within2,after2, + within3,after3,dialog4,within4,after4]); }, "The dialog element itself should not be keyboard focusable."); </script> diff --git a/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-requestclose.html b/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-requestclose.html index 9a9c87167d5..6555f1b43bd 100644 --- a/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-requestclose.html +++ b/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-requestclose.html @@ -35,14 +35,8 @@ function openDialog(openMethod) { assert_true(dialog.matches(':open')); assert_equals(dialog.matches(':modal'),openMethod === 'modal'); } -function getSignal(t) { - const controller = new AbortController(); - const signal = controller.signal; - t.add_cleanup(() => controller.abort()); - return signal; -} -async function setup(t,closedby) { +function setup(t,closedby) { t.add_cleanup(() => { dialog.close(); dialog.removeAttribute('closedby'); @@ -52,16 +46,14 @@ async function setup(t,closedby) { if (closedby) { dialog.setAttribute('closedby',closedby); } - // Be sure any pending close events (from prior test cleanups) get fired. - await waitForRender(); - return getSignal(t); + return t.get_signal(); } ['modeless','modal','open'].forEach(openMethod => { [null,'any','closedrequest','none'].forEach(closedby => { const testDescription = `for ${openMethod} dialog with closedby=${closedby}`; promise_test(async (t) => { - await setup(t,closedby); + setup(t,closedby); openDialog(openMethod); dialog.requestClose(); assert_false(dialog.open); @@ -69,25 +61,35 @@ async function setup(t,closedby) { },`requestClose basic behavior ${testDescription}`); promise_test(async (t) => { - const signal = await setup(t,closedby); + const signal = setup(t,closedby); let events = []; + const { promise: untilFullyClosed, resolve: hasClosed } = Promise.withResolvers(); dialog.addEventListener('cancel',() => events.push('cancel'),{signal}); - dialog.addEventListener('close',() => events.push('close'),{signal}); + dialog.addEventListener('close',() => { + events.push('close'); + hasClosed(); + },{signal}); openDialog(openMethod); assert_array_equals(events,[]); dialog.requestClose(); assert_false(dialog.open); assert_false(dialog.matches(':open')); assert_array_equals(events,['cancel'],'close is scheduled'); - await waitForRender(); + await untilFullyClosed; assert_array_equals(events,['cancel','close']); },`requestClose fires both cancel and close ${testDescription}`); promise_test(async (t) => { - const signal = await setup(t,'none'); + const signal = setup(t,'none'); let events = []; + const { promise: untilFullyClosed, resolve: hasClosed } = Promise.withResolvers(); + const { promise: untilFullyClosedAgain, resolve: hasClosedAgain } = Promise.withResolvers(); + const closeResolvers = [hasClosed, hasClosedAgain]; dialog.addEventListener('cancel',() => events.push('cancel'),{signal}); - dialog.addEventListener('close',() => events.push('close'),{signal}); + dialog.addEventListener('close',() => { + events.push('close'); + closeResolvers.shift()(); + },{signal}); openDialog(openMethod); dialog.setAttribute('closedby',closedby); assert_array_equals(events,[]); @@ -95,6 +97,7 @@ async function setup(t,closedby) { assert_false(dialog.open,'Adding closedby after dialog is open'); assert_false(dialog.matches(':open')); assert_array_equals(events,['cancel']); + await untilFullyClosed; events=[]; openDialog(openMethod); dialog.removeAttribute('closedby'); @@ -102,11 +105,13 @@ async function setup(t,closedby) { dialog.requestClose(); assert_false(dialog.open,'Removing closedby after dialog is open'); assert_array_equals(events,['cancel']); + await untilFullyClosedAgain; + assert_array_equals(events,['cancel', 'close']); },`closedby has no effect on dialog.requestClose() ${testDescription}`); if (closedby != "none") { promise_test(async (t) => { - const signal = await setup(t,closedby); + const signal = setup(t,closedby); let shouldPreventDefault = true; dialog.addEventListener('cancel',(e) => { if (shouldPreventDefault) { @@ -124,7 +129,7 @@ async function setup(t,closedby) { },`requestClose can be cancelled ${testDescription}`); promise_test(async (t) => { - const signal = await setup(t,closedby); + const signal = setup(t,closedby); dialog.addEventListener('cancel',(e) => e.preventDefault(),{signal}); openDialog(openMethod); // No user activation here. @@ -136,7 +141,7 @@ async function setup(t,closedby) { },`requestClose avoids abuse prevention logic ${testDescription}`); promise_test(async (t) => { - await setup(t,closedby); + setup(t,closedby); openDialog(openMethod); assert_equals(dialog.returnValue,'','Return value starts out empty'); const returnValue = 'The return value'; @@ -153,7 +158,7 @@ async function setup(t,closedby) { },`requestClose(returnValue) passes along the return value ${testDescription}`); promise_test(async (t) => { - await setup(t,closedby); + setup(t,closedby); dialog.addEventListener('cancel',(e) => e.preventDefault(),{once:true}); openDialog(openMethod); dialog.returnValue = 'foo'; @@ -168,23 +173,27 @@ async function setup(t,closedby) { }); promise_test(async (t) => { - await setup(t); + setup(t); dialog.open = true; dialog.requestClose(); assert_false(dialog.open); },`requestClose basic behavior when dialog is open via attribute`); promise_test(async (t) => { - const signal = await setup(t); + const signal = setup(t); let events = []; + const { promise: untilFullyClosed, resolve: hasClosed } = Promise.withResolvers(); dialog.addEventListener('cancel',() => events.push('cancel'),{signal}); - dialog.addEventListener('close',() => events.push('close'),{signal}); + dialog.addEventListener('close',() => { + events.push('close') + hasClosed(); + },{signal}); dialog.open = true; assert_array_equals(events,[]); dialog.requestClose(); assert_false(dialog.open); assert_array_equals(events,['cancel'],'close is scheduled'); - await waitForRender(); + await untilFullyClosed; assert_array_equals(events,['cancel','close']); },`requestClose fires cancel and close when dialog is open via attribute`); diff --git a/tests/wpt/tests/html/syntax/serializing-html-fragments/serializing-cdata-in-html-document.html b/tests/wpt/tests/html/syntax/serializing-html-fragments/serializing-cdata-in-html-document.html new file mode 100644 index 00000000000..b2366285a41 --- /dev/null +++ b/tests/wpt/tests/html/syntax/serializing-html-fragments/serializing-cdata-in-html-document.html @@ -0,0 +1,12 @@ +<!DOCTYPE html> +<title>Serializing CDATA in an HTML document</title> +<link rel="help" href="https://html.spec.whatwg.org/multipage/parsing.html#serialising-html-fragments"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +test(t => { + const doc = new DOMParser().parseFromString('<svg xmlns="http://www.w3.org/2000/svg"><![CDATA[<img>]]></svg>', 'application/xml'); + const el = document.adoptNode(doc.documentElement); + assert_equals(el.outerHTML, '<svg xmlns="http://www.w3.org/2000/svg"><img></svg>'); +}); +</script> diff --git a/tests/wpt/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/WEB_FEATURES.yml b/tests/wpt/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/WEB_FEATURES.yml new file mode 100644 index 00000000000..a1af3e21a48 --- /dev/null +++ b/tests/wpt/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/WEB_FEATURES.yml @@ -0,0 +1,4 @@ +features: +- name: pdf-viewer + files: + - plugins-and-mimetypes.html diff --git a/tests/wpt/tests/infrastructure/metadata/infrastructure/testdriver/bidi/emulation/set_geolocation_override.https.html.ini b/tests/wpt/tests/infrastructure/metadata/infrastructure/testdriver/bidi/emulation/set_geolocation_override.https.html.ini new file mode 100644 index 00000000000..7de34991442 --- /dev/null +++ b/tests/wpt/tests/infrastructure/metadata/infrastructure/testdriver/bidi/emulation/set_geolocation_override.https.html.ini @@ -0,0 +1,3 @@ +[set_geolocation_override.https.html] + expected: + if product != "chrome": ERROR diff --git a/tests/wpt/tests/infrastructure/testdriver/bidi/emulation/set_geolocation_override.https.html b/tests/wpt/tests/infrastructure/testdriver/bidi/emulation/set_geolocation_override.https.html new file mode 100644 index 00000000000..5cbcf546423 --- /dev/null +++ b/tests/wpt/tests/infrastructure/testdriver/bidi/emulation/set_geolocation_override.https.html @@ -0,0 +1,71 @@ +<!DOCTYPE html> +<meta charset="utf-8"/> +<title>TestDriver bidi.emulation.set_geolocation_override method</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js?feature=bidi"></script> +<script src="/resources/testdriver-vendor.js"></script> + +<script> + promise_setup(async () => { + // Ensure permission is granted before proceeding. + await test_driver.bidi.permissions.set_permission({ + descriptor: {name: "geolocation"}, + state: "granted", + }); + + // Ensure any previously set geolocation emulations are cleared. + await test_driver.bidi.emulation.set_geolocation_override( + {coordinates: null}); + }); + + /** Get the current geolocation or error */ + function get_current_geolocation() { + return new Promise( + resolve => window.navigator.geolocation.getCurrentPosition( + position => resolve(position.coords.toJSON()), + error => resolve({code: error.code, message: error.message}), + // Fail fast if geolocation is not available. + {timeout: 500} + )) + } + + /** Asserts that relevant coordinate properties match */ + function assert_coordinates_match(actual, expected) { + for (const key in expected) { + assert_equals(actual[key], expected[key], + `"${key}" should match the expected value ${expected[key]}`); + } + } + + const SOME_COORDINATES = { + latitude: 52.51, + longitude: 13.39, + accuracy: 0.5, + altitude: 34, + altitudeAccuracy: 0.75, + heading: 180, + speed: 2.77 + }; + + promise_test(async (t) => { + // Get the initial geolocation (might be error). + const initial_coords = await get_current_geolocation(); + + // Set the geolocation override + await test_driver.bidi.emulation.set_geolocation_override({ + coordinates: SOME_COORDINATES + }); + + // Get the geolocation after setting the override. + const coords = await get_current_geolocation(); + // Assert the coordinates match the override. + assert_coordinates_match(coords, SOME_COORDINATES); + + // Clear the geolocation override. + await test_driver.bidi.emulation.set_geolocation_override( + {coordinates: null}); + // Assert coordinates are set to the original value. + assert_coordinates_match(await get_current_geolocation(), initial_coords); + }, "emulate geolocation and clear override"); +</script> diff --git a/tests/wpt/tests/interfaces/fedcm.idl b/tests/wpt/tests/interfaces/fedcm.idl index 215f375432e..5ce2d260f11 100644 --- a/tests/wpt/tests/interfaces/fedcm.idl +++ b/tests/wpt/tests/interfaces/fedcm.idl @@ -84,8 +84,10 @@ dictionary IdentityProviderAPIConfig { dictionary IdentityProviderAccount { required USVString id; - required USVString name; - required USVString email; + USVString name; + USVString email; + USVString tel; + USVString username; USVString given_name; USVString picture; sequence<USVString> approved_clients; diff --git a/tests/wpt/tests/interfaces/image-capture.idl b/tests/wpt/tests/interfaces/image-capture.idl index 21e03d4db82..26cc7fab5cd 100644 --- a/tests/wpt/tests/interfaces/image-capture.idl +++ b/tests/wpt/tests/interfaces/image-capture.idl @@ -3,7 +3,7 @@ // (https://github.com/w3c/webref) // Source: MediaStream Image Capture (https://w3c.github.io/mediacapture-image/) -[Exposed=Window] +[Exposed=Window, SecureContext] interface ImageCapture { constructor(MediaStreamTrack videoTrack); Promise<Blob> takePhoto(optional PhotoSettings photoSettings = {}); diff --git a/tests/wpt/tests/interfaces/mediastream-recording.idl b/tests/wpt/tests/interfaces/mediastream-recording.idl index 496bfcf2e27..68c891cdc91 100644 --- a/tests/wpt/tests/interfaces/mediastream-recording.idl +++ b/tests/wpt/tests/interfaces/mediastream-recording.idl @@ -56,7 +56,7 @@ interface BlobEvent : Event { readonly attribute DOMHighResTimeStamp timecode; }; -dictionary BlobEventInit { +dictionary BlobEventInit : EventInit { required Blob data; DOMHighResTimeStamp timecode; }; diff --git a/tests/wpt/tests/interfaces/turtledove.idl b/tests/wpt/tests/interfaces/turtledove.idl index b9f50d47885..7f11cdc3790 100644 --- a/tests/wpt/tests/interfaces/turtledove.idl +++ b/tests/wpt/tests/interfaces/turtledove.idl @@ -206,6 +206,7 @@ partial interface Navigator { [Exposed=InterestGroupScriptRunnerGlobalScope] interface InterestGroupScriptRunnerGlobalScope { readonly attribute PrivateAggregation? privateAggregation; + readonly attribute ProtectedAudienceUtilities protectedAudience; }; dictionary PASignalValue { @@ -220,6 +221,12 @@ dictionary PAExtendedHistogramContribution { bigint filteringId = 0; }; +[Exposed=InterestGroupScriptRunnerGlobalScope] +interface ProtectedAudienceUtilities { + Uint8Array encodeUtf8(USVString input); + USVString decodeUtf8(Uint8Array bytes); +}; + [Exposed=InterestGroupBiddingAndScoringScriptRunnerGlobalScope] interface ForDebuggingOnly { undefined reportAdAuctionWin(USVString url); diff --git a/tests/wpt/tests/interfaces/webcodecs.idl b/tests/wpt/tests/interfaces/webcodecs.idl index 274ef96578a..3d4db1ed49d 100644 --- a/tests/wpt/tests/interfaces/webcodecs.idl +++ b/tests/wpt/tests/interfaces/webcodecs.idl @@ -141,7 +141,7 @@ dictionary AudioDecoderConfig { required DOMString codec; [EnforceRange] required unsigned long sampleRate; [EnforceRange] required unsigned long numberOfChannels; - BufferSource description; + AllowSharedBufferSource description; }; dictionary VideoDecoderConfig { diff --git a/tests/wpt/tests/interfaces/WebCryptoAPI.idl b/tests/wpt/tests/interfaces/webcrypto.idl index ff7a89cd0d5..ff7a89cd0d5 100644 --- a/tests/wpt/tests/interfaces/WebCryptoAPI.idl +++ b/tests/wpt/tests/interfaces/webcrypto.idl diff --git a/tests/wpt/tests/interfaces/webgpu.idl b/tests/wpt/tests/interfaces/webgpu.idl index de1f7c1e52b..4fec46a2557 100644 --- a/tests/wpt/tests/interfaces/webgpu.idl +++ b/tests/wpt/tests/interfaces/webgpu.idl @@ -109,6 +109,7 @@ dictionary GPUDeviceDescriptor }; enum GPUFeatureName { + "core-features-and-limits", "depth-clip-control", "depth32float-stencil8", "texture-compression-bc", diff --git a/tests/wpt/tests/interfaces/webnn.idl b/tests/wpt/tests/interfaces/webnn.idl index 57f2a4a9890..37fcc32501e 100644 --- a/tests/wpt/tests/interfaces/webnn.idl +++ b/tests/wpt/tests/interfaces/webnn.idl @@ -36,6 +36,8 @@ interface MLContext { undefined dispatch(MLGraph graph, MLNamedTensors inputs, MLNamedTensors outputs); Promise<MLTensor> createTensor(MLTensorDescriptor descriptor); + Promise<MLTensor> createConstantTensor( + MLOperandDescriptor descriptor, AllowSharedBufferSource inputData); Promise<ArrayBuffer> readTensor(MLTensor tensor); Promise<undefined> readTensor(MLTensor tensor, AllowSharedBufferSource outputData); @@ -133,6 +135,7 @@ interface MLTensor { readonly attribute FrozenArray<unsigned long> shape; readonly attribute boolean readable; readonly attribute boolean writable; + readonly attribute boolean constant; undefined destroy(); }; @@ -154,6 +157,9 @@ interface MLGraphBuilder { // Create a scalar operand from the specified number of the specified type. MLOperand constant(MLOperandDataType type, MLNumber value); + // Create an operand from a specified constant tensor. + MLOperand constant(MLTensor tensor); + // Compile the graph up to the specified output operands asynchronously. Promise<MLGraph> build(MLNamedOperands outputs); }; diff --git a/tests/wpt/tests/interfaces/webxr-depth-sensing.idl b/tests/wpt/tests/interfaces/webxr-depth-sensing.idl index 9befd640646..7ddbec7cc97 100644 --- a/tests/wpt/tests/interfaces/webxr-depth-sensing.idl +++ b/tests/wpt/tests/interfaces/webxr-depth-sensing.idl @@ -34,6 +34,10 @@ partial interface XRSession { readonly attribute XRDepthUsage depthUsage; readonly attribute XRDepthDataFormat depthDataFormat; readonly attribute XRDepthType? depthType; + readonly attribute boolean? depthActive; + + undefined pauseDepthSensing(); + undefined resumeDepthSensing(); }; [SecureContext, Exposed=Window] @@ -43,9 +47,10 @@ interface XRDepthInformation { [SameObject] readonly attribute XRRigidTransform normDepthBufferFromNormView; readonly attribute float rawValueToMeters; - readonly attribute XRView? view; }; +XRDepthInformation includes XRViewGeometry; + [Exposed=Window] interface XRCPUDepthInformation : XRDepthInformation { [SameObject] readonly attribute ArrayBuffer data; diff --git a/tests/wpt/tests/interfaces/webxr.idl b/tests/wpt/tests/interfaces/webxr.idl index 1098000d6c2..874994086a2 100644 --- a/tests/wpt/tests/interfaces/webxr.idl +++ b/tests/wpt/tests/interfaces/webxr.idl @@ -118,6 +118,11 @@ interface XRBoundedReferenceSpace : XRReferenceSpace { readonly attribute FrozenArray<DOMPointReadOnly> boundsGeometry; }; +[SecureContext, Exposed=Window] interface mixin XRViewGeometry { + readonly attribute Float32Array projectionMatrix; + [SameObject] readonly attribute XRRigidTransform transform; +}; + enum XREye { "none", "left", @@ -126,13 +131,13 @@ enum XREye { [SecureContext, Exposed=Window] interface XRView { readonly attribute XREye eye; - readonly attribute Float32Array projectionMatrix; - [SameObject] readonly attribute XRRigidTransform transform; readonly attribute double? recommendedViewportScale; undefined requestViewportScale(double? scale); }; +XRView includes XRViewGeometry; + [SecureContext, Exposed=Window] interface XRViewport { readonly attribute long x; readonly attribute long y; diff --git a/tests/wpt/tests/interfaces/writing-assistance-apis.idl b/tests/wpt/tests/interfaces/writing-assistance-apis.idl new file mode 100644 index 00000000000..916daee754e --- /dev/null +++ b/tests/wpt/tests/interfaces/writing-assistance-apis.idl @@ -0,0 +1,193 @@ +// GENERATED CONTENT - DO NOT EDIT +// Content was automatically extracted by Reffy into webref +// (https://github.com/w3c/webref) +// Source: Writing Assistance APIs (https://webmachinelearning.github.io/writing-assistance-apis/) + +[Exposed=Window, SecureContext] +interface Summarizer { + static Promise<Summarizer> create(optional SummarizerCreateOptions options = {}); + static Promise<Availability> availability(optional SummarizerCreateCoreOptions options = {}); + + Promise<DOMString> summarize( + DOMString input, + optional SummarizerSummarizeOptions options = {} + ); + ReadableStream summarizeStreaming( + DOMString input, + optional SummarizerSummarizeOptions options = {} + ); + + readonly attribute DOMString sharedContext; + readonly attribute SummarizerType type; + readonly attribute SummarizerFormat format; + readonly attribute SummarizerLength length; + + readonly attribute FrozenArray<DOMString>? expectedInputLanguages; + readonly attribute FrozenArray<DOMString>? expectedContextLanguages; + readonly attribute DOMString? outputLanguage; + + Promise<double> measureInputUsage( + DOMString input, + optional SummarizerSummarizeOptions options = {} + ); + readonly attribute unrestricted double inputQuota; +}; +Summarizer includes DestroyableModel; + +dictionary SummarizerCreateCoreOptions { + SummarizerType type = "key-points"; + SummarizerFormat format = "markdown"; + SummarizerLength length = "short"; + + sequence<DOMString> expectedInputLanguages; + sequence<DOMString> expectedContextLanguages; + DOMString outputLanguage; +}; + +dictionary SummarizerCreateOptions : SummarizerCreateCoreOptions { + AbortSignal signal; + CreateMonitorCallback monitor; + + DOMString sharedContext; +}; + +dictionary SummarizerSummarizeOptions { + AbortSignal signal; + DOMString context; +}; + +enum SummarizerType { "tl;dr", "teaser", "key-points", "headline" }; +enum SummarizerFormat { "plain-text", "markdown" }; +enum SummarizerLength { "short", "medium", "long" }; + +[Exposed=Window, SecureContext] +interface Writer { + static Promise<Writer> create(optional WriterCreateOptions options = {}); + static Promise<Availability> availability(optional WriterCreateCoreOptions options = {}); + + Promise<DOMString> write( + DOMString input, + optional WriterWriteOptions options = {} + ); + ReadableStream writeStreaming( + DOMString input, + optional WriterWriteOptions options = {} + ); + + readonly attribute DOMString sharedContext; + readonly attribute WriterTone tone; + readonly attribute WriterFormat format; + readonly attribute WriterLength length; + + readonly attribute FrozenArray<DOMString>? expectedInputLanguages; + readonly attribute FrozenArray<DOMString>? expectedContextLanguages; + readonly attribute DOMString? outputLanguage; + + Promise<double> measureInputUsage( + DOMString input, + optional WriterWriteOptions options = {} + ); + readonly attribute unrestricted double inputQuota; +}; +Writer includes DestroyableModel; + +dictionary WriterCreateCoreOptions { + WriterTone tone = "neutral"; + WriterFormat format = "markdown"; + WriterLength length = "short"; + + sequence<DOMString> expectedInputLanguages; + sequence<DOMString> expectedContextLanguages; + DOMString outputLanguage; +}; + +dictionary WriterCreateOptions : WriterCreateCoreOptions { + AbortSignal signal; + CreateMonitorCallback monitor; + + DOMString sharedContext; +}; + +dictionary WriterWriteOptions { + DOMString context; + AbortSignal signal; +}; + +enum WriterTone { "formal", "neutral", "casual" }; +enum WriterFormat { "plain-text", "markdown" }; +enum WriterLength { "short", "medium", "long" }; + +[Exposed=Window, SecureContext] +interface Rewriter { + static Promise<Rewriter> create(optional RewriterCreateOptions options = {}); + static Promise<Availability> availability(optional RewriterCreateCoreOptions options = {}); + + Promise<DOMString> rewrite( + DOMString input, + optional RewriterRewriteOptions options = {} + ); + ReadableStream rewriteStreaming( + DOMString input, + optional RewriterRewriteOptions options = {} + ); + + readonly attribute DOMString sharedContext; + readonly attribute RewriterTone tone; + readonly attribute RewriterFormat format; + readonly attribute RewriterLength length; + + readonly attribute FrozenArray<DOMString>? expectedInputLanguages; + readonly attribute FrozenArray<DOMString>? expectedContextLanguages; + readonly attribute DOMString? outputLanguage; + + Promise<double> measureInputUsage( + DOMString input, + optional RewriterRewriteOptions options = {} + ); + readonly attribute unrestricted double inputQuota; +}; +Rewriter includes DestroyableModel; + +dictionary RewriterCreateCoreOptions { + RewriterTone tone = "as-is"; + RewriterFormat format = "as-is"; + RewriterLength length = "as-is"; + + sequence<DOMString> expectedInputLanguages; + sequence<DOMString> expectedContextLanguages; + DOMString outputLanguage; +}; + +dictionary RewriterCreateOptions : RewriterCreateCoreOptions { + AbortSignal signal; + CreateMonitorCallback monitor; + + DOMString sharedContext; +}; + +dictionary RewriterRewriteOptions { + DOMString context; + AbortSignal signal; +}; + +enum RewriterTone { "as-is", "more-formal", "more-casual" }; +enum RewriterFormat { "as-is", "plain-text", "markdown" }; +enum RewriterLength { "as-is", "shorter", "longer" }; + +[Exposed=Window, SecureContext] +interface CreateMonitor : EventTarget { + attribute EventHandler ondownloadprogress; +}; + +callback CreateMonitorCallback = undefined (CreateMonitor monitor); + +enum Availability { + "unavailable", + "downloadable", + "downloading", + "available" +}; + +interface mixin DestroyableModel { + undefined destroy(); +}; diff --git a/tests/wpt/tests/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https.html b/tests/wpt/tests/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https.html index 714355f5c1c..467cf5d50c7 100644 --- a/tests/wpt/tests/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https.html +++ b/tests/wpt/tests/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https.html @@ -9,8 +9,8 @@ <script src=permission-helper.js></script> </head> <body> - <iframe allow="camera 'src';microphone 'src'" id=same src="/mediacapture-streams/iframe-enumerate.html"></iframe> -<iframe allow="camera 'src';microphone 'src'" id=cross src="https://{{hosts[][www1]}}:{{ports[https][0]}}/mediacapture-streams/iframe-enumerate.html"></iframe> + <iframe allow="camera 'src';microphone 'src';speaker-selection 'src'" id=same src="/mediacapture-streams/iframe-enumerate.html"></iframe> +<iframe allow="camera 'src';microphone 'src';speaker-selection 'src'" id=cross src="https://{{hosts[][www1]}}:{{ports[https][0]}}/mediacapture-streams/iframe-enumerate.html"></iframe> <script> let deviceList; diff --git a/tests/wpt/tests/pointerevents/pointerevent_pointerout_no_pointer_movement.html b/tests/wpt/tests/pointerevents/pointerevent_pointerout_no_pointer_movement.html index 856f2ce37ce..1af16659326 100644 --- a/tests/wpt/tests/pointerevents/pointerevent_pointerout_no_pointer_movement.html +++ b/tests/wpt/tests/pointerevents/pointerevent_pointerout_no_pointer_movement.html @@ -1,85 +1,62 @@ <!doctype html> -<html> -<head> -<title>The pointerout event should not be fired if the pointer doesn't move</title> +<title> + Layout change under a stationary pointer fires boundary events and no pointermove event +</title> <meta name="viewport" content="width=device-width"> -<link rel="help" href="https://github.com/w3c/pointerevents/issues/457"> +<link rel="help" + href="https://w3c.github.io/pointerevents/#boundary-events-caused-by-layout-changes"> <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="pointerevent_support.js"></script> <style> -#target{ - width:100px; - height:100px; - background-color:red; -} - -#overlay{ - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - background-color: rgba(0,0,0,0.2); - z-index: 1000; - text-align: center; - display:none; -} + div { + position: absolute; + top: 0; + left: 0; + width: 50px; + height: 50px; + } + + #overlay { + z-index: 1000; + display: none; + } </style> -</head> -<body> -<h1>The pointerout event should not be fired if the pointer doesn't move</h1> -<h4> - Test Description: This test checks if the pointerout event dispatched unexpectedly. - <ol> - <li>Click on the black rectangle. - <li>Don't move mouse after clicking. - </ol> -</h4> -<p> <div id="target"></div> <div id="overlay"></div> -<div id="log"></div> <script> -function waitForAnimationFrame() { - return new Promise(resolve => { - requestAnimationFrame(() => { - requestAnimationFrame(resolve); - }); - }); -} + "use strict"; -promise_test(async () => { const target = document.getElementById("target"); + const overlay = document.getElementById("overlay"); - let out_event_count = 0; - target.addEventListener("pointerout", function() { - out_event_count++; - }); + let logging_active = false; + let num_pointermoves = 0; - // Wait for the click event on target element and update display style on - // overlay element. - const promise = new Promise(resolve => { - target.addEventListener("click", async function() { - const overlay = document.getElementById("overlay"); - overlay.style.display= 'block'; - await waitForAnimationFrame(); + target.addEventListener("click", () => logging_active = true); + target.addEventListener("pointermove", () => { + if (logging_active) num_pointermoves++; + }); - overlay.style.display= 'none' - await waitForAnimationFrame(); + promise_test(async t => { + await test_driver.click(target); - resolve(); - }, { once: true }); - }); + let pointerout_promise = getEvent("pointerout", target); + overlay.style.display = "block"; + await pointerout_promise; - // Click target. - test_driver.click(target); - await promise; + let pointerover_promise = getEvent("pointerover", target); + overlay.style.display = "none"; + await waitForAnimationFrames(2); + // Why does Chrome time out at the next line w/o the redundant wait above? + // Does chrome require something to request a main frame in order to detect + // the new pointer target after the style update to generate the event? + // https://crbug.com/413595088 + await pointerover_promise; - assert_equals(out_event_count, 0, "The pointerout event should not be fired"); -}, "The pointerout event should not be fired if the pointer doesn't move"); + assert_equals(num_pointermoves, 0, "no pointermove events are expected"); + }, "Layout change under a stationary pointer fires boundary events and no pointermove event"); </script> -</body> -</html> diff --git a/tests/wpt/tests/resources/chromium/webxr-test.js b/tests/wpt/tests/resources/chromium/webxr-test.js index 0885b559e63..ce2503b1bbc 100644 --- a/tests/wpt/tests/resources/chromium/webxr-test.js +++ b/tests/wpt/tests/resources/chromium/webxr-test.js @@ -757,30 +757,34 @@ class MockRuntime { const viewport_size = 20; return [{ eye: vrMojom.XREye.kLeft, - fieldOfView: { - upDegrees: 48.316, - downDegrees: 50.099, - leftDegrees: 50.899, - rightDegrees: 35.197 + geometry: { + fieldOfView: { + upDegrees: 48.316, + downDegrees: 50.099, + leftDegrees: 50.899, + rightDegrees: 35.197 + }, + mojoFromView: this._getMojoFromViewerWithOffset(composeGFXTransform({ + position: [-0.032, 0, 0], + orientation: [0, 0, 0, 1] + })) }, - mojoFromView: this._getMojoFromViewerWithOffset(composeGFXTransform({ - position: [-0.032, 0, 0], - orientation: [0, 0, 0, 1] - })), viewport: { x: 0, y: 0, width: viewport_size, height: viewport_size } }, { eye: vrMojom.XREye.kRight, - fieldOfView: { - upDegrees: 48.316, - downDegrees: 50.099, - leftDegrees: 50.899, - rightDegrees: 35.197 + geometry: { + fieldOfView: { + upDegrees: 48.316, + downDegrees: 50.099, + leftDegrees: 50.899, + rightDegrees: 35.197 + }, + mojoFromView: this._getMojoFromViewerWithOffset(composeGFXTransform({ + position: [0.032, 0, 0], + orientation: [0, 0, 0, 1] + })) }, - mojoFromView: this._getMojoFromViewerWithOffset(composeGFXTransform({ - position: [0.032, 0, 0], - orientation: [0, 0, 0, 1] - })), viewport: { x: viewport_size, y: 0, width: viewport_size, height: viewport_size } }]; } @@ -835,13 +839,15 @@ class MockRuntime { return { eye: viewEye, - fieldOfView: fov, - mojoFromView: this._getMojoFromViewerWithOffset(composeGFXTransform(fakeXRViewInit.viewOffset)), + geometry: { + fieldOfView: fov, + mojoFromView: this._getMojoFromViewerWithOffset(composeGFXTransform(fakeXRViewInit.viewOffset)) + }, viewport: { x: xOffset, - y: 0, - width: fakeXRViewInit.resolution.width, - height: fakeXRViewInit.resolution.height + y: 0, + width: fakeXRViewInit.resolution.width, + height: fakeXRViewInit.resolution.height }, isFirstPersonObserver: fakeXRViewInit.isFirstPersonObserver ? true : false, viewOffset: composeGFXTransform(fakeXRViewInit.viewOffset) @@ -915,12 +921,12 @@ class MockRuntime { let frame_views = this.primaryViews_; for (let i = 0; i < this.primaryViews_.length; i++) { - this.primaryViews_[i].mojoFromView = + this.primaryViews_[i].geometry.mojoFromView = this._getMojoFromViewerWithOffset(this.primaryViews_[i].viewOffset); } if (this.enabledFeatures_.includes(xrSessionMojom.XRSessionFeature.SECONDARY_VIEWS)) { for (let i = 0; i < this.secondaryViews_.length; i++) { - this.secondaryViews_[i].mojoFromView = + this.secondaryViews_[i].geometry.mojoFromView = this._getMojoFromViewerWithOffset(this.secondaryViews_[i].viewOffset); } diff --git a/tests/wpt/tests/resources/testdriver.js b/tests/wpt/tests/resources/testdriver.js index f127e2b2c8d..6e8410b7ea4 100644 --- a/tests/wpt/tests/resources/testdriver.js +++ b/tests/wpt/tests/resources/testdriver.js @@ -254,12 +254,57 @@ } }, /** - * `log <https://w3c.github.io/webdriver-bidi/#module-log>`_ module. + * `emulation <https://www.w3.org/TR/webdriver-bidi/#module-emulation>`_ module. + */ + emulation: { + /** + * Overrides the geolocation coordinates for the specified + * browsing contexts. + * Matches the `emulation.setGeolocationOverride + * <https://w3c.github.io/webdriver-bidi/#command-emulation-setGeolocationOverride>`_ + * WebDriver BiDi command. + * + * @example + * await test_driver.bidi.emulation.set_geolocation_override({ + * coordinates: { + * latitude: 52.51, + * longitude: 13.39, + * accuracy: 0.5, + * altitude: 34, + * altitudeAccuracy: 0.75, + * heading: 180, + * speed: 2.77 + * } + * }); + * + * @param {object} params - Parameters for the command. + * @param {null|object} params.coordinates - The optional + * geolocation coordinates to set. Matches the + * `emulation.GeolocationCoordinates <https://w3c.github.io/webdriver-bidi/#type-emulation-GeolocationCoordinates>`_ + * value. If null or omitted, the emulation will be removed. + * @param {null|Array.<(Context)>} [params.contexts] The + * optional contexts parameter specifies which browsing contexts + * to set the geolocation override on. It should be either an + * array of Context objects (window or browsing context id), or + * null. If null or omitted, the override will be set on the + * current browsing context. + * @returns {Promise<void>} Resolves when the geolocation + * override is successfully set. + */ + set_geolocation_override: function (params) { + // Ensure the bidi feature is enabled before calling the internal method + assertBidiIsEnabled(); + return window.test_driver_internal.bidi.emulation.set_geolocation_override( + params); + }, + }, + /** + * `log <https://www.w3.org/TR/webdriver-bidi/#module-log>`_ module. */ log: { entry_added: { /** - * @typedef {object} LogEntryAdded `log.entryAdded <https://w3c.github.io/webdriver-bidi/#event-log-entryAdded>`_ event. + * @typedef {object} LogEntryAdded `log.entryAdded <https://www.w3.org/TR/webdriver-bidi/#event-log-entryAdded>`_ event. */ /** @@ -1576,6 +1621,12 @@ } } }, + emulation: { + set_geolocation_override: function (params) { + throw new Error( + "bidi.emulation.set_geolocation_override is not implemented by testdriver-vendor.js"); + } + }, log: { entry_added: { async subscribe() { diff --git a/tests/wpt/tests/scroll-animations/scroll-timelines/animation-with-transform.html b/tests/wpt/tests/scroll-animations/scroll-timelines/animation-with-transform.html index f741cc634d7..323d984c989 100644 --- a/tests/wpt/tests/scroll-animations/scroll-timelines/animation-with-transform.html +++ b/tests/wpt/tests/scroll-animations/scroll-timelines/animation-with-transform.html @@ -21,7 +21,7 @@ } #scroller { - overflow: auto; + overflow: hidden; height: 100px; width: 100px; will-change: transform; /* force compositing */ diff --git a/tests/wpt/tests/scroll-animations/scroll-timelines/two-animations-attach-to-same-scroll-timeline-cancel-one.html b/tests/wpt/tests/scroll-animations/scroll-timelines/two-animations-attach-to-same-scroll-timeline-cancel-one.html index ed8e8337a65..28973d2d185 100644 --- a/tests/wpt/tests/scroll-animations/scroll-timelines/two-animations-attach-to-same-scroll-timeline-cancel-one.html +++ b/tests/wpt/tests/scroll-animations/scroll-timelines/two-animations-attach-to-same-scroll-timeline-cancel-one.html @@ -22,7 +22,7 @@ } #scroller { - overflow: auto; + overflow: hidden; height: 100px; width: 100px; will-change: transform; /* force compositing */ diff --git a/tests/wpt/tests/scroll-animations/scroll-timelines/two-animations-attach-to-same-scroll-timeline.html b/tests/wpt/tests/scroll-animations/scroll-timelines/two-animations-attach-to-same-scroll-timeline.html index de50599fbaf..45ba3f99ccd 100644 --- a/tests/wpt/tests/scroll-animations/scroll-timelines/two-animations-attach-to-same-scroll-timeline.html +++ b/tests/wpt/tests/scroll-animations/scroll-timelines/two-animations-attach-to-same-scroll-timeline.html @@ -22,7 +22,7 @@ drive two animations"> } #scroller { - overflow: auto; + overflow: hidden; height: 100px; width: 100px; will-change: transform; /* force compositing */ diff --git a/tests/wpt/tests/scroll-animations/view-timelines/fieldset-source.html b/tests/wpt/tests/scroll-animations/view-timelines/fieldset-source.html index d75f30e664e..cdd2e0be40c 100644 --- a/tests/wpt/tests/scroll-animations/view-timelines/fieldset-source.html +++ b/tests/wpt/tests/scroll-animations/view-timelines/fieldset-source.html @@ -87,7 +87,7 @@ parseFloat(getComputedStyle(fieldset).borderBottom); // Validate the start and end offsets for each view timeline. - anims.forEach(async (anim) => { + for (let anim of anims) { assert_equals(anim.timeline.source.id, 'fieldset'); assert_equals(anim.timeline.subject.tagName, 'INPUT'); const bounds = anim.effect.target.getBoundingClientRect(); @@ -96,13 +96,13 @@ const expectedEndOffset = bounds.bottom - fieldsetContentTop; assert_approx_equals( parseFloat(anim.timeline.startOffset), - expectedStartOffset, 0.1, + expectedStartOffset, 0.5, `Unexpected start offset for ${anim.effect.target.id}`); assert_approx_equals( parseFloat(anim.timeline.endOffset), - expectedEndOffset, 0.1, + expectedEndOffset, 0.5, `Unexpected end offset for ${anim.effect.target.id}`); - }); + }; }, 'Fieldset is a valid source for a view timeline'); } diff --git a/tests/wpt/tests/shadow-dom/reference-target/tentative/form.html b/tests/wpt/tests/shadow-dom/reference-target/tentative/form.html index a4a5f372838..5ab144b05ed 100644 --- a/tests/wpt/tests/shadow-dom/reference-target/tentative/form.html +++ b/tests/wpt/tests/shadow-dom/reference-target/tentative/form.html @@ -9,6 +9,13 @@ </head> <body> + <div> + <template shadowrootmode="open"> + <!-- This button shouldn't link to the real form in fancy-form-1 as it's in a different tree scope --> + <button id="button-in-shadow" form="fancy-form-1"></button> + </template> + </div> + <button id="reset-button-1" type="reset" form="fancy-form-1"></button> <fancy-form-1 id="fancy-form-1"> <template shadowrootmode="open" shadowrootreferencetarget="real-form"> @@ -44,6 +51,9 @@ input.value = "new value"; const resetButton = document.getElementById(resetButtonId); + assert_equals(realForm.elements.length, 2, "The .elements property should have 2 elements."); + assert_equals(realForm.elements[0], resetButton, "The first element should be the referencing element."); + assert_equals(realForm.elements[1], input, "The 2nd element should be the input inside the real form."); assert_equals(input.value, "new value", "The input value should be updated to the new value."); resetButton.click(); assert_equals(input.value, "default value", "The input value should be reset to the default value."); @@ -56,5 +66,107 @@ document.getElementById('reset-button-3').setAttribute('form', "fancy-form-3"); testFormWithReferenceTarget('fancy-form-3', 'reset-button-3', "Reference target works with setAttribute('form')"); </script> + + <form-associated-custom-button id="custom-button" form="fancy-form-4"></form-associated-custom-button> + <fancy-form-4 id="fancy-form-4"> + <template shadowrootmode="open" shadowrootreferencetarget="real-form"> + <form id="real-form"> + <input type="text" value="default value"> + <!-- The internal button of the custom button below shouldn't be associated with real-form --> + <form-associated-custom-button id="custom-button-in-shadow"></form-associated-custom-button> + </form> + </template> + </fancy-form-4> + <script> + class FormAssociatedCustomButton extends HTMLElement { + static formAssociated = true; + constructor() { + super(); + this.internals_ = this.attachInternals(); + const shadow = this.attachShadow({ mode: 'open' }); + shadow.innerHTML = `<button>fancy button</button>`; + } + } + window.customElements.define("form-associated-custom-button", FormAssociatedCustomButton); + test(function () { + const customElement = document.getElementById("custom-button"); + const fancyForm = document.getElementById("fancy-form-4"); + const realForm = fancyForm.shadowRoot.getElementById("real-form"); + const customElementInShadow = fancyForm.shadowRoot.getElementById("custom-button-in-shadow"); + const input = realForm.firstElementChild; + + assert_equals(realForm.elements.length, 3, "The .elements property should have 3 elements."); + assert_equals(realForm.elements[0], customElement, "The first element should be the form-associated custom element."); + assert_equals(realForm.elements[1], input, "The 2nd element should be the input inside the real form."); + assert_equals(realForm.elements[2], customElementInShadow, "The 3rd element should be the custom element inside the real form."); + + // Swap the input and the custom element in real-form. + realForm.moveBefore(customElementInShadow, input); + assert_equals(realForm.elements.length, 3, "The .elements property should have 3 elements."); + assert_equals(realForm.elements[0], customElement, "The first element should be the form-associated custom element."); + assert_equals(realForm.elements[1], customElementInShadow, "The 2nd element should be the custom element inside the real form."); + assert_equals(realForm.elements[2], input, "The 3rd element should be the input inside the real form."); + + // Swap the referencing element and the fancy form + customElement.parentNode.moveBefore(fancyForm, customElement); + assert_equals(realForm.elements.length, 3, "The .elements property should have 3 elements."); + assert_equals(realForm.elements[0], customElementInShadow, "The first element should be the custom element inside the real form."); + assert_equals(realForm.elements[1], input, "The 2nd element should be the input inside the real form."); + assert_equals(realForm.elements[2], customElement, "The 3rd element should be the form-associated custom element."); + }, "Reference target works with form-associated custom element."); + </script> + + <button id="reset-button-5" type="reset" form="fancy-form-5"></button> + <fancy-form-5 id="fancy-form-5"> + <template shadowrootmode="open" shadowrootreferencetarget="nested-element"> + <nested-element id="nested-element"> + <template shadowrootmode="open" shadowrootreferencetarget="real-form"> + <form id="real-form"> + <input type="text" value="default value"> + </form> + </template> + </nested-element> + <button id="button-in-shadow" form="nested-element"></button> + <div> + <template shadowrootmode="open"> + <!-- This button shouldn't link to the real form in nested-element as it's in a different tree scope --> + <button id="button-in-different-shadow" form="nested-element"></button> + </template> + </div> + </template> + </fancy-form-5> + <script> + test(function () { + const fancyForm = document.getElementById("fancy-form-5"); + const nestedElement = fancyForm.shadowRoot.getElementById("nested-element"); + const buttonInShadow = fancyForm.shadowRoot.getElementById("button-in-shadow"); + const realForm = nestedElement.shadowRoot.getElementById("real-form"); + const input = realForm.firstElementChild; + + input.value = "new value"; + const resetButton = document.getElementById("reset-button-5"); + assert_equals(realForm.elements.length, 3, "The .elements property should have 3 elements."); + // The elements in .elements property should be in tree order (preorder, depth-first). + assert_equals(realForm.elements[0], resetButton, "The first element should be the referencing element."); + assert_equals(realForm.elements[1], input, "The 2nd element should be the input inside the real form."); + assert_equals(realForm.elements[2], buttonInShadow, "The 3rd element should be the button in the shadow dom."); + assert_equals(input.value, "new value", "The input value should be updated to the new value."); + resetButton.click(); + assert_equals(input.value, "default value", "The input value should be reset to the default value."); + + // Remove the button that's using reference target in the 1st level shadow. + buttonInShadow.remove(); + assert_equals(realForm.elements.length, 2, "The .elements property should have 2 elements after removing the button."); + + // Add a new button using reference target in the 1st level shadow. + const newButtonInShadow = document.createElement("button"); + newButtonInShadow.setAttribute("form", "nested-element"); + nestedElement.parentNode.insertBefore(newButtonInShadow, nestedElement); + assert_equals(realForm.elements.length, 3, "The .elements property should have 3 elements after a new button is inserted."); + assert_equals(realForm.elements[0], resetButton, "The first element should be the referencing element."); + assert_equals(realForm.elements[1], newButtonInShadow, "The 2nd element should be the button in the shadow dom."); + assert_equals(realForm.elements[2], input, "The 3rd element should be the input inside the real form."); + }, "Reference target works with nested shadow trees."); + </script> </body> </html> diff --git a/tests/wpt/tests/speculation-rules/prefetch/clear-prefetch-cache-after-clear-site-data-cache.https.html b/tests/wpt/tests/speculation-rules/prefetch/clear-prefetch-cache-after-clear-site-data-cache.https.html deleted file mode 100644 index c5796e48b76..00000000000 --- a/tests/wpt/tests/speculation-rules/prefetch/clear-prefetch-cache-after-clear-site-data-cache.https.html +++ /dev/null @@ -1,35 +0,0 @@ -<!DOCTYPE html> -<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="../resources/utils.js"></script> -<script src="resources/utils.sub.js"></script> -<script> - setup(() => assertSpeculationRulesIsSupported()); - - promise_test(async t => { - let agent = await spawnWindow(t, { protocol: 'https' }); - let nextUrl = agent.getExecutorURL({protocol: 'https', page: 2 }); - await agent.forceSinglePrefetch(nextUrl); - - // Open new window with url to clear cache data through Clear-Site-Data header. - // Ensure that the cache is cleared before the navigation. - const gotMessage = new Promise(resolve => { - window.addEventListener('message', e => { - resolve(e.data); - }, { - once: true - }); - }); - let cache_helper = "cache_helper=" + token() + "&"; - window.open("../../clear-site-data/support/clear-site-data-cache.py?" + cache_helper + "response=single_html&cache&clear_first=all"); await gotMessage; - await gotMessage; - - await agent.navigate(nextUrl); - // Because Clear-Site-Data response header is sent, prefetches are expected - // to be evicted. - // The navigation to nextURL is not expected to use the prefetch cache. - assert_not_prefetched(await agent.getRequestHeaders()); - }, "clear-site-data cache headers should prevent it from being fetched"); -</script> diff --git a/tests/wpt/tests/speculation-rules/prefetch/clear-prefetch-cache-after-clear-site-data-cache.tentative.https.html b/tests/wpt/tests/speculation-rules/prefetch/clear-prefetch-cache-after-clear-site-data-cache.tentative.https.html new file mode 100644 index 00000000000..48f6264e852 --- /dev/null +++ b/tests/wpt/tests/speculation-rules/prefetch/clear-prefetch-cache-after-clear-site-data-cache.tentative.https.html @@ -0,0 +1,66 @@ +<!DOCTYPE html> +<!-- +This file is marked as "tentative" until: +* The feature flag ClearSiteDataPrefetchPrerenderCache is enabled and + https://github.com/WICG/nav-speculation/issues/357 is added to the specification. +--> +<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="../resources/utils.js"></script> +<script src="resources/utils.sub.js"></script> +<script> + setup(() => assertSpeculationRulesIsSupported()); + + // Test that Clear-Site-Data header value "prefetchCache" clears prefetch cache + promise_test(async t => { + let agent = await spawnWindow(t, { protocol: 'https' }); + let nextUrl = agent.getExecutorURL({protocol: 'https', page: 2 }); + await agent.forceSinglePrefetch(nextUrl); + + // Open new window with url to clear cache data through Clear-Site-Data header. + // Ensure that the cache is cleared before the navigation. + const gotMessage = new Promise(resolve => { + window.addEventListener('message', e => { + resolve(e.data); + }, { + once: true + }); + }); + window.open("/../../clear-site-data/support/clear-site-data-prefetchCache.py"); + await gotMessage; + + await agent.navigate(nextUrl); + // Because Clear-Site-Data response header is sent, prefetches are expected + // to be evicted. + // The navigation to nextURL is not expected to use the prefetch cache. + assert_not_prefetched(await agent.getRequestHeaders()); + }, "clear-site-data prefetchCache headers should prevent it from being fetched"); + + // Test that Clear-Site-Data header value "cache" clears prefetch cache + promise_test(async t => { + let agent = await spawnWindow(t, { protocol: 'https' }); + let nextUrl = agent.getExecutorURL({protocol: 'https', page: 2 }); + await agent.forceSinglePrefetch(nextUrl); + + // Open new window with url to clear cache data through Clear-Site-Data header. + // Ensure that the cache is cleared before the navigation. + const gotMessage = new Promise(resolve => { + window.addEventListener('message', e => { + resolve(e.data); + }, { + once: true + }); + }); + let cache_helper = "cache_helper=" + self.crypto.randomUUID() + "&"; + window.open("/../../clear-site-data/support/clear-site-data-cache.py?" + cache_helper + "response=single_html&cache&clear_first=all"); + await gotMessage; + + await agent.navigate(nextUrl); + // Because Clear-Site-Data response header is sent, prefetches are expected + // to be evicted. + // The navigation to nextURL is not expected to use the prefetch cache. + assert_not_prefetched(await agent.getRequestHeaders()); + }, "clear-site-data cache headers should prevent it from being fetched"); +</script> diff --git a/tests/wpt/tests/speculation-rules/prerender/cancel-prerendering-after-clear-site-data-cache-different-origins.https.html b/tests/wpt/tests/speculation-rules/prerender/cancel-prerendering-after-clear-site-data-cache-different-origins.tentative.https.html index 34b77f8bc47..db52e758750 100644 --- a/tests/wpt/tests/speculation-rules/prerender/cancel-prerendering-after-clear-site-data-cache-different-origins.https.html +++ b/tests/wpt/tests/speculation-rules/prerender/cancel-prerendering-after-clear-site-data-cache-different-origins.tentative.https.html @@ -1,4 +1,9 @@ <!DOCTYPE html> +<!-- +This file is marked as "tentative" until: +* The feature flag ClearSiteDataPrefetchPrerenderCache is enabled and + https://github.com/WICG/nav-speculation/issues/357 is added to the specification. +--> <title>clear-site-data-cache cancels prerenders</title> <meta name="timeout" content="long"> <body> @@ -40,8 +45,7 @@ promise_test(async t => { once: true }); }); - let cache_helper = "cache_helper=" + self.crypto.randomUUID() + "&"; - window.open(differentOrigin + "/../../clear-site-data/support/clear-site-data-cache.py?" + cache_helper + "response=single_html&cache&clear_first=all"); + window.open(differentOrigin + "/../../clear-site-data/support/clear-site-data-prerenderCache.py"); await gotMessage; // Because Clear-Site-Data response header is sent on a different origin than diff --git a/tests/wpt/tests/speculation-rules/prerender/cancel-prerendering-after-clear-site-data-cache-same-origin.https.html b/tests/wpt/tests/speculation-rules/prerender/cancel-prerendering-after-clear-site-data-cache-same-origin.tentative.https.html index cb253d45eaa..23d862c5130 100644 --- a/tests/wpt/tests/speculation-rules/prerender/cancel-prerendering-after-clear-site-data-cache-same-origin.https.html +++ b/tests/wpt/tests/speculation-rules/prerender/cancel-prerendering-after-clear-site-data-cache-same-origin.tentative.https.html @@ -1,4 +1,9 @@ <!DOCTYPE html> +<!-- +This file is marked as "tentative" until: +* The feature flag ClearSiteDataPrefetchPrerenderCache is enabled and + https://github.com/WICG/nav-speculation/issues/357 is added to the specification. +--> <title>clear-site-data-cache cancels prerenders</title> <meta name="timeout" content="long"> <body> @@ -13,6 +18,41 @@ <script> setup(() => assertSpeculationRulesIsSupported()); +// Test that Clear-Site-Data header value "prerenderCache" clears prerender cache +promise_test(async t => { + + const rcHelper = new RemoteContextHelper(); + const referrerRC = await rcHelper.addWindow({ + origin: 'HTTPS_ORIGIN' + }, { + features: 'noopener' + }); + const prerenderedRC = await addPrerenderRC(referrerRC, { + origin: 'HTTPS_ORIGIN' + }); + + const sameOrigin = get_host_info().HTTPS_ORIGIN; + + // Open new window with url to clear cache data through Clear-Site-Data header. + // Ensure that the cache is cleared before the navigation. + const gotMessage = new Promise(resolve => { + window.addEventListener('message', e => { + resolve(e.data); + }, { + once: true + }); + }); + window.open(sameOrigin + "/../../clear-site-data/support/clear-site-data-prerenderCache.py"); + await gotMessage; + + // Because Clear-Site-Data response header is sent, the existing prerender + // is expected to be canceled. + // And the navigation is expected to create another page instead of activation. + referrerRC.navigateTo(prerenderedRC.url); + assert_equals(await getActivationStart(prerenderedRC), 0); +}, "clear-site-data prerenderCache headers should prevent it from being activated"); + +// Test that Clear-Site-Data header value "cache" clears prerender cache promise_test(async t => { const rcHelper = new RemoteContextHelper(); @@ -37,7 +77,7 @@ promise_test(async t => { }); }); let cache_helper = "cache_helper=" + self.crypto.randomUUID() + "&"; - new_window = window.open(sameOrigin + "/../../clear-site-data/support/clear-site-data-cache.py?" + cache_helper + "response=single_html&cache&clear_first=all"); + window.open(sameOrigin + "/../../clear-site-data/support/clear-site-data-cache.py?" + cache_helper + "response=single_html&cache&clear_first=all"); await gotMessage; // Because Clear-Site-Data response header is sent, the existing prerender @@ -45,7 +85,7 @@ promise_test(async t => { // And the navigation is expected to create another page instead of activation. referrerRC.navigateTo(prerenderedRC.url); assert_equals(await getActivationStart(prerenderedRC), 0); -}); +}, "clear-site-data cache headers should prevent it from being activated"); </script> </body> </html> diff --git a/tests/wpt/tests/streams/readable-streams/crashtests/garbage-collection.any.js b/tests/wpt/tests/streams/readable-streams/crashtests/garbage-collection.any.js index b2ba5cd4c27..cf10f7f2e83 100644 --- a/tests/wpt/tests/streams/readable-streams/crashtests/garbage-collection.any.js +++ b/tests/wpt/tests/streams/readable-streams/crashtests/garbage-collection.any.js @@ -4,12 +4,64 @@ // See https://crbug.com/335506658 for details. promise_test(async () => { - let closed = new ReadableStream({ - pull(controller) { - controller.enqueue('is there anybody in there?'); - } - }).getReader().closed; - // 3 GCs are actually required to trigger the bug at time of writing. - for (let i = 0; i < 5; ++i) - await garbageCollect(); + const closed = new ReadableStream({ + pull(controller) { + controller.enqueue('is there anybody in there?'); + } + }).getReader().closed; + // 3 GCs are actually required to trigger the bug at time of writing. + for (let i = 0; i < 5; ++i) + await garbageCollect(); }, 'Garbage-collecting a stream along with its reader should not crash'); + + +// See https://crbug.com/390646657 for details. +promise_test(async () => { + const written = new WritableStream({ + write(chunk) { + return new Promise(resolve => {}); + } + }).getWriter().write('just nod if you can hear me'); + for (let i = 0; i < 5; ++i) + await garbageCollect(); +}, 'Garbage-collecting a stream writer with a pending write should not crash'); + + +promise_test(async () => { + const closed = new WritableStream({ + write(chunk) { } + }).getWriter().closed; + for (let i = 0; i < 5; ++i) + await garbageCollect(); +}, 'Garbage-collecting a stream writer should not crash with closed promise is retained'); + +promise_test(async () => { + const ready = new WritableStream({ + write(chunk) { } + }, {highWaterMark: 0}).getWriter().ready; + for (let i = 0; i < 5; ++i) + await garbageCollect(); +}, 'Garbage-collecting a stream writer should not crash when backpressure is being applied'); + +promise_test(async () => { + let reader = new ReadableStream({ + pull() { } + }).getReader(); + const promise = reader.read(); + reader = null; + for (let i = 0; i < 5; ++i) + await garbageCollect(); +}, 'Garbage-collecting a stream with a pending read should not crash'); + +promise_test(async () => { + let reader = new ReadableStream({ + type: "bytes", + pull() { return new Promise(resolve => {}); } + }).getReader({mode: "byob"}); + const promise = reader.read(new Uint8Array(42)); + reader = null; + for (let i = 0; i < 5; ++i) + await garbageCollect(); +}, 'Garbage-collecting a stream with a pending BYOB read should not crash'); + + diff --git a/tests/wpt/tests/svg/embedded/attr-image-fetchpriority.html b/tests/wpt/tests/svg/embedded/attr-image-fetchpriority.html new file mode 100644 index 00000000000..b083538a8b8 --- /dev/null +++ b/tests/wpt/tests/svg/embedded/attr-image-fetchpriority.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<title>Fetch Priority - SVG Image element</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<svg> +<image id=image1 fetchpriority="high"/> +<image id=image2 fetchpriority="low"/> +<image id=image3 fetchpriority="auto"/> +<image id=image4 fetchpriority="xyz"/> +<image id=image5 /> +</svg> + +<script> + test(() => { + assert_equals(image1.fetchPriority, "high", "high fetchPriority is a valid IDL value on the image element"); + assert_equals(image2.fetchPriority, "low", "low fetchPriority is a valid IDL value on the image element"); + assert_equals(image3.fetchPriority, "auto", "auto fetchPriority is a valid IDL value on the image element"); + assert_equals(image4.fetchPriority, "auto", "invalid fetchPriority reflects as 'auto' IDL attribute on the image element"); + assert_equals(image5.fetchPriority, "auto", "missing fetchPriority reflects as 'auto' IDL attribute on the image element"); + }, "fetchpriority attribute on <image> elements should reflect valid IDL values"); + + test(() => { + const image = document.createElementNS("http://www.w3.org/2000/svg", "image"); + assert_equals(image.fetchPriority, "auto"); + }, "default fetchpriority attribute on <image> elements should be 'auto'"); +</script> diff --git a/tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-01.html b/tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-01.html new file mode 100644 index 00000000000..25765c5b93e --- /dev/null +++ b/tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-01.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Tabbing through Non-Rendered SVG elements</title> +<link rel="author" title="Divyansh Mangal" href="mailto:dmangal@microsoft.com"> +<link rel="help" href="https://svgwg.org/svg2-draft/single-page.html#interact-Focus"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> + +<svg xmlns="http://www.w3.org/2000/svg"> + <text tabindex='1' id="start" x="10" y="10">start</text> + <g x="30" y="10" style="display: none;"> + <text tabindex='2' id="middle" x="30" y="10">middle</text> + </g> + <text tabindex='3' id="end" x="50" y="10">end</text> +</svg> + +<script> + promise_test(async t => { + const start = document.getElementById('start'); + const end = document.getElementById('end'); + + start.focus(); + assert_equals(document.activeElement, start, "Start element should be focused initially"); + + // Simulate pressing the Tab key + await test_driver.send_keys(start, '\uE004'); // '\uE004' is the WebDriver key code for Tab + + // Verify that the focus moved to the end element and middle element is skipped + assert_equals(document.activeElement, end, "End element should be focused after pressing Tab"); + }, "Hidden SVG Tab focus test"); +</script> diff --git a/tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-02.html b/tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-02.html new file mode 100644 index 00000000000..fd9fd34275d --- /dev/null +++ b/tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-02.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Tabbing through Non-Rendered SVG elements</title> +<link rel="author" title="Divyansh Mangal" href="mailto:dmangal@microsoft.com"> +<link rel="help" href="https://svgwg.org/svg2-draft/single-page.html#interact-Focus"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> + +<svg xmlns="http://www.w3.org/2000/svg"> + <a href="#void" id="start"> + <text tabindex='-1' x="10" y="10">start</text> + </a> + <g x="30" y="10" style="display: none;"> + <a href="#void" id="middle"> + <text tabindex='-1' x="30" y="10">middle</text> + </a> + </g> + <a href="#void" id="end"> + <text tabindex='-1' x="50" y="10">end</text> + </a> +</svg> + +<script> + promise_test(async t => { + const start = document.getElementById('start'); + const end = document.getElementById('end'); + + start.focus(); + assert_equals(document.activeElement, start, "Start element should be focused initially"); + + // Simulate pressing the Tab key + await test_driver.send_keys(start, '\uE004'); // '\uE004' is the WebDriver key code for Tab + + // Verify that the focus moved to the end element and middle element is skipped + assert_equals(document.activeElement, end, "End element should be focused after pressing Tab"); + }, "Hidden SVG Tab focus test"); +</script> diff --git a/tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-03.html b/tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-03.html new file mode 100644 index 00000000000..097cff57b5a --- /dev/null +++ b/tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-03.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Tabbing through Non-Rendered SVG elements</title> +<link rel="author" title="Divyansh Mangal" href="mailto:dmangal@microsoft.com"> +<link rel="help" href="https://svgwg.org/svg2-draft/single-page.html#interact-Focus"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> + +<svg xmlns="http://www.w3.org/2000/svg"> + <text tabindex='1' id="start" x="10" y="10">start</text> + <defs> + <text tabindex='2' id="middle" x="30" y="10">middle</text> + </defs> + <text tabindex='3' id="end" x="50" y="10">end</text> +</svg> + +<script> + promise_test(async t => { + const start = document.getElementById('start'); + const end = document.getElementById('end'); + + start.focus(); + assert_equals(document.activeElement, start, "Start element should be focused initially"); + + // Simulate pressing the Tab key + await test_driver.send_keys(start, '\uE004'); // '\uE004' is the WebDriver key code for Tab + + // Verify that the focus moved to the end element and middle element is skipped + assert_equals(document.activeElement, end, "End element should be focused after pressing Tab"); + }, "Hidden SVG Tab focus test"); +</script> diff --git a/tests/wpt/tests/svg/scripted/attr-script-fetchpriority.html b/tests/wpt/tests/svg/scripted/attr-script-fetchpriority.html new file mode 100644 index 00000000000..2f73e1e59a8 --- /dev/null +++ b/tests/wpt/tests/svg/scripted/attr-script-fetchpriority.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<title>Fetch Priority - SVG Script element</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<svg> +<script id=script1 href="resources/script.js" fetchpriority="high"></script> +<script id=script2 href="resources/script.js" fetchpriority="low"></script> +<script id=script3 href="resources/script.js" fetchpriority="auto"></script> +<script id=script4 href="resources/script.js" fetchpriority="xyz"></script> +<script id=script5 href="resources/script.js"></script> +</svg> + +<script> + test(() => { + assert_equals(script1.fetchPriority, "high", "high fetchPriority is a valid IDL value on the script element"); + assert_equals(script2.fetchPriority, "low", "low fetchPriority is a valid IDL value on the script element"); + assert_equals(script3.fetchPriority, "auto", "auto fetchPriority is a valid IDL value on the script element"); + assert_equals(script4.fetchPriority, "auto", "invalid fetchPriority reflects as 'auto' IDL attribute on the script element"); + assert_equals(script5.fetchPriority, "auto", "missing fetchPriority reflects as 'auto' IDL attribute on the script element"); + }, "fetchpriority attribute on SVG <script> elements should reflect valid IDL values"); + + test(() => { + const script = document.createElementNS("http://www.w3.org/2000/svg", "script"); + assert_equals(script.fetchPriority, "auto"); + }, "default fetchpriority attribute on SVG <script> elements should be 'auto'"); +</script> diff --git a/tests/wpt/tests/svg/styling/cx-sibling-index-crash.html b/tests/wpt/tests/svg/styling/cx-sibling-index-crash.html new file mode 100644 index 00000000000..9fe97b12d77 --- /dev/null +++ b/tests/wpt/tests/svg/styling/cx-sibling-index-crash.html @@ -0,0 +1,5 @@ +<!DOCTYPE html> +<title>SVG Test: sibling-index() as cx property value should not crash</title> +<link rel="help" href="https://crbug.com/407890255"> +<style>circle { cx: sibling-index(); }</style> +<p>Pass if loading this page does not crash</p> diff --git a/tests/wpt/tests/tools/ci/requirements_tc.txt b/tests/wpt/tests/tools/ci/requirements_tc.txt index cb4ba194778..ada75c2f761 100644 --- a/tests/wpt/tests/tools/ci/requirements_tc.txt +++ b/tests/wpt/tests/tools/ci/requirements_tc.txt @@ -1,4 +1,4 @@ pygithub==2.6.1 pyyaml==6.0.1 requests==2.32.3 -taskcluster==83.5.6 +taskcluster==83.5.8 diff --git a/tests/wpt/tests/tools/requirements_tests.txt b/tests/wpt/tests/tools/requirements_tests.txt index 833fdb3b876..ca00b8f1f98 100644 --- a/tests/wpt/tests/tools/requirements_tests.txt +++ b/tests/wpt/tests/tools/requirements_tests.txt @@ -2,5 +2,5 @@ httpx[http2]==0.27.2 json-e==4.7.0 jsonschema==4.17.3 pyyaml==6.0.1 -taskcluster==83.5.6 +taskcluster==83.5.8 mozterm==1.0.0 diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/asyncactions.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/asyncactions.py index 71187ee76d7..9925a4b511d 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/asyncactions.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/asyncactions.py @@ -87,6 +87,34 @@ class BidiBluetoothSimulatePreconnectedPeripheralAction: return await self.protocol.bidi_bluetooth.simulate_preconnected_peripheral( context, address, name, manufacturer_data, known_service_uuids) + +class BidiEmulationSetGeolocationOverrideAction: + name = "bidi.emulation.set_geolocation_override" + + def __init__(self, logger, protocol): + do_delayed_imports() + self.logger = logger + self.protocol = protocol + + async def __call__(self, payload): + coordinates = payload['coordinates'] + contexts = [] + for context in payload["contexts"]: + # Context can be either a browsing context id, or a BiDi serialized window. In the latter case, the + # value is extracted from the serialized object. + if isinstance(context, str): + contexts.append(context) + elif isinstance(context, webdriver.bidi.protocol.BidiWindow): + contexts.append(context.browsing_context) + else: + raise ValueError("Unexpected context type: %s" % context) + if len(contexts) == 0: + raise ValueError("At least one context must be provided") + + return await self.protocol.bidi_emulation.set_geolocation_override( + coordinates, contexts) + + class BidiSessionSubscribeAction: name = "bidi.session.subscribe" @@ -133,5 +161,6 @@ async_actions = [ BidiBluetoothHandleRequestDevicePrompt, BidiBluetoothSimulateAdapterAction, BidiBluetoothSimulatePreconnectedPeripheralAction, + BidiEmulationSetGeolocationOverrideAction, BidiPermissionsSetPermissionAction, BidiSessionSubscribeAction] diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py index 123c89c98b2..87403c2944d 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py @@ -39,6 +39,7 @@ from .protocol import (BaseProtocolPart, VirtualSensorProtocolPart, BidiBluetoothProtocolPart, BidiBrowsingContextProtocolPart, + BidiEmulationProtocolPart, BidiEventsProtocolPart, BidiPermissionsProtocolPart, BidiScriptProtocolPart, @@ -263,6 +264,19 @@ class WebDriverBidiScriptProtocolPart(BidiScriptProtocolPart): await_promise=True) +class WebDriverBidiEmulationProtocolPart(BidiEmulationProtocolPart): + def __init__(self, parent): + super().__init__(parent) + self.webdriver = None + + def setup(self): + self.webdriver = self.parent.webdriver + + async def set_geolocation_override(self, coordinates, contexts): + return await self.webdriver.bidi_session.emulation.set_geolocation_override( + coordinates=coordinates, contexts=contexts) + + class WebDriverBidiPermissionsProtocolPart(BidiPermissionsProtocolPart): def __init__(self, parent): super().__init__(parent) @@ -810,6 +824,7 @@ class WebDriverBidiProtocol(WebDriverProtocol): enable_bidi = True implements = [WebDriverBidiBluetoothProtocolPart, WebDriverBidiBrowsingContextProtocolPart, + WebDriverBidiEmulationProtocolPart, WebDriverBidiEventsProtocolPart, WebDriverBidiPermissionsProtocolPart, WebDriverBidiScriptProtocolPart, diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/protocol.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/protocol.py index 7630fe1f358..833dff45636 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/protocol.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/protocol.py @@ -445,6 +445,18 @@ class BidiPermissionsProtocolPart(ProtocolPart): pass +class BidiEmulationProtocolPart(ProtocolPart): + """Protocol part for emulation""" + __metaclass__ = ABCMeta + name = "bidi_emulation" + + @abstractmethod + async def set_geolocation_override(self, + coordinates: Optional[Mapping[str, Any]], + contexts: List[str]) -> None: + pass + + class BidiScriptProtocolPart(ProtocolPart): """Protocol part for executing BiDi scripts""" __metaclass__ = ABCMeta diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/testdriver-extra.js b/tests/wpt/tests/tools/wptrunner/wptrunner/testdriver-extra.js index d83ba4192eb..ab8b04ba3cd 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/testdriver-extra.js +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/testdriver-extra.js @@ -261,6 +261,17 @@ 'bluetooth.requestDevicePromptUpdated', on_event); }; + window.test_driver_internal.bidi.emulation.set_geolocation_override = + function (params) { + return create_action("bidi.emulation.set_geolocation_override", { + // Default to the current window. + contexts: [window], + // Default to no coordinates. + coordinates: null, + ...(params ?? {}) + }); + } + window.test_driver_internal.bidi.log.entry_added.subscribe = function (params) { return subscribe({ diff --git a/tests/wpt/tests/viewport-segments/viewport-segments-segments-property.https.html b/tests/wpt/tests/viewport-segments/viewport-segments-segments-property.https.html index 852e49fa7fe..e6c9d8b4e16 100644 --- a/tests/wpt/tests/viewport-segments/viewport-segments-segments-property.https.html +++ b/tests/wpt/tests/viewport-segments/viewport-segments-segments-property.https.html @@ -15,8 +15,14 @@ promise_test(async (t) => { await test_driver.clear_display_features(); }); - // When the viewport is not divided the segments property should be null. - assert_equals(viewport.segments, null); + // When the viewport is not divided the segments property should return an + // array with one segment, the size of the viewport. + assert_equals(viewport.segments.length, 1); + let segment = viewport.segments[0]; + assert_equals(segment.x, 0); + assert_equals(segment.y, 0); + assert_equals(segment.width, window.innerWidth); + assert_equals(segment.height, window.innerHeight); // iframes do not receive segments information. assert_equals(window.frames[0].viewport.segments, null); @@ -88,7 +94,11 @@ promise_test(async (t) => { }); await test_driver.clear_display_features(); assert_true(await promise); - assert_equals(viewport.segments, null); + segment = viewport.segments[0]; + assert_equals(segment.x, 0); + assert_equals(segment.y, 0); + assert_equals(segment.width, window.innerWidth); + assert_equals(segment.height, window.innerHeight); // iframes do not receive segments information. assert_equals(window.frames[0].viewport.segments, null); diff --git a/tests/wpt/tests/viewport/viewport-segments.html b/tests/wpt/tests/viewport/viewport-segments.html index 64f0eb9caef..cd24f2bd230 100644 --- a/tests/wpt/tests/viewport/viewport-segments.html +++ b/tests/wpt/tests/viewport/viewport-segments.html @@ -9,6 +9,9 @@ test(() => { assert_true('segments' in viewport, "`segments` must be a property of viewport."); - assert_equals(viewport.segments, null, "For a viewport not segmented, no segments must be exposed."); + assert_equals(viewport.segments[0].innerWidth, viewport.innerWidth, + "For a viewport not segmented, there should only one segment with the viewport size."); + assert_equals(viewport.segments[0].innerHeight, viewport.innerHeight, + "For a viewport not segmented, there should only one segment with the viewport size."); }); </script> diff --git a/tests/wpt/tests/web-animations/crashtests/sibling-index-offset-crash.html b/tests/wpt/tests/web-animations/crashtests/sibling-index-offset-crash.html new file mode 100644 index 00000000000..812a7952738 --- /dev/null +++ b/tests/wpt/tests/web-animations/crashtests/sibling-index-offset-crash.html @@ -0,0 +1,8 @@ +<!DOCTYPE html> +<link rel="help" href="https://crbug.com/414645284"> +<div id="target"></div> +<script> + target.animate([ + { offset: "calc(20% * sibling-index())" }, + ], 2000); +</script> diff --git a/tests/wpt/tests/web-animations/resources/keyframe-tests.js b/tests/wpt/tests/web-animations/resources/keyframe-tests.js index 2bcce1ecf47..34a84f45b20 100644 --- a/tests/wpt/tests/web-animations/resources/keyframe-tests.js +++ b/tests/wpt/tests/web-animations/resources/keyframe-tests.js @@ -541,11 +541,6 @@ const gKeyframesTests = [ output: [keyframe(offset(0.5), { left: '10px' })], }, { - desc: 'a single keyframe sequence with a complex calc() offset', - input: [{ offset: 'calc(0.5 + 0.25 * sign(100em - 1px))', left: '10px' }], - output: [keyframe(offset(0.75), { left: '10px' })], - }, - { desc: 'a one property keyframe sequence with some omitted offsets', input: [{ offset: 0.00, left: '10px' }, { offset: 0.25, left: '20px' }, diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_closed/user_prompt_closed.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_closed/user_prompt_closed.py index fdb9e8b3ca7..8322829ebaf 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_closed/user_prompt_closed.py +++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_closed/user_prompt_closed.py @@ -318,7 +318,7 @@ async def test_iframe( event = await wait_for_future_safe(on_prompt_closed) assert event == { - "context": new_tab["context"], + "context": frame["context"], "accepted": True, "type": "alert", } diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_opened/user_prompt_opened.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_opened/user_prompt_opened.py index c24128004f7..a9051f662c8 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_opened/user_prompt_opened.py +++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_opened/user_prompt_opened.py @@ -197,7 +197,7 @@ async def test_iframe( event = await wait_for_future_safe(on_entry) assert event == { - "context": new_tab["context"], + "context": frame["context"], "type": "alert", "handler": "dismiss", "message": "in iframe", diff --git a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/invalid.py b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/invalid.py index 79241287fbc..e804848e0be 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/invalid.py +++ b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/invalid.py @@ -114,6 +114,18 @@ async def test_params_coordinates_latitude_invalid_type(bidi_session, top_contex ) +@pytest.mark.parametrize("value", [-90.1, 90.1]) +async def test_params_coordinates_latitude_invalid_value(bidi_session, top_context, value): + with pytest.raises(error.InvalidArgumentException): + await bidi_session.emulation.set_geolocation_override( + contexts=[top_context["context"]], + coordinates=CoordinatesOptions( + latitude=value, + longitude=10, + ), + ) + + async def test_params_coordinates_longitude_missing(bidi_session, top_context): with pytest.raises(error.InvalidArgumentException): await bidi_session.emulation.set_geolocation_override( @@ -136,6 +148,18 @@ async def test_params_coordinates_longitude_invalid_type(bidi_session, top_conte ) +@pytest.mark.parametrize("value", [-180.5, 180.5]) +async def test_params_coordinates_longitude_invalid_value(bidi_session, top_context, value): + with pytest.raises(error.InvalidArgumentException): + await bidi_session.emulation.set_geolocation_override( + contexts=[top_context["context"]], + coordinates=CoordinatesOptions( + latitude=10, + longitude=value, + ), + ) + + @pytest.mark.parametrize("value", [False, "foo", [], {}]) async def test_params_coordinates_accuracy_invalid_type(bidi_session, top_context, value): with pytest.raises(error.InvalidArgumentException): @@ -149,6 +173,18 @@ async def test_params_coordinates_accuracy_invalid_type(bidi_session, top_contex ) +async def test_params_coordinates_accuracy_invalid_value(bidi_session, top_context): + with pytest.raises(error.InvalidArgumentException): + await bidi_session.emulation.set_geolocation_override( + contexts=[top_context["context"]], + coordinates=CoordinatesOptions( + latitude=10, + longitude=10, + accuracy=-1, + ), + ) + + @pytest.mark.parametrize("value", [False, "foo", [], {}]) async def test_params_coordinates_altitude_invalid_type(bidi_session, top_context, value): with pytest.raises(error.InvalidArgumentException): @@ -176,6 +212,19 @@ async def test_params_coordinates_altitude_accuracy_invalid_type(bidi_session, t ) +async def test_params_coordinates_altitude_accuracy_invalid_value(bidi_session, top_context): + with pytest.raises(error.InvalidArgumentException): + await bidi_session.emulation.set_geolocation_override( + contexts=[top_context["context"]], + coordinates=CoordinatesOptions( + latitude=10, + longitude=10, + altitude=10, + altitude_accuracy=-1, + ), + ) + + async def test_params_coordinates_altitude_accuracy_without_altitude(bidi_session, top_context): with pytest.raises(error.InvalidArgumentException): await bidi_session.emulation.set_geolocation_override( @@ -201,6 +250,19 @@ async def test_params_coordinates_heading_invalid_type(bidi_session, top_context ) +@pytest.mark.parametrize("value", [-0.5, 360, 360.5]) +async def test_params_coordinates_heading_invalid_value(bidi_session, top_context, value): + with pytest.raises(error.InvalidArgumentException): + await bidi_session.emulation.set_geolocation_override( + contexts=[top_context["context"]], + coordinates=CoordinatesOptions( + latitude=10, + longitude=10, + heading=value, + ), + ) + + @pytest.mark.parametrize("value", [False, "foo", [], {}]) async def test_params_coordinates_speed_invalid_type(bidi_session, top_context, value): with pytest.raises(error.InvalidArgumentException): @@ -214,6 +276,18 @@ async def test_params_coordinates_speed_invalid_type(bidi_session, top_context, ) +async def test_params_coordinates_speed_invalid_value(bidi_session, top_context): + with pytest.raises(error.InvalidArgumentException): + await bidi_session.emulation.set_geolocation_override( + contexts=[top_context["context"]], + coordinates=CoordinatesOptions( + latitude=10, + longitude=10, + speed=-1.5, + ), + ) + + @pytest.mark.parametrize("value", [True, "foo", 42, {}]) async def test_params_user_contexts_invalid_type(bidi_session, value): with pytest.raises(error.InvalidArgumentException): diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/before_request_sent/before_request_sent_cached.py b/tests/wpt/tests/webdriver/tests/bidi/network/before_request_sent/before_request_sent_cached.py index 9483a707eab..e8119d29d9e 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/network/before_request_sent/before_request_sent_cached.py +++ b/tests/wpt/tests/webdriver/tests/bidi/network/before_request_sent/before_request_sent_cached.py @@ -396,7 +396,7 @@ async def test_page_with_cached_script_javascript( @pytest.mark.asyncio -async def tst_page_with_cached_javascript_module( +async def test_page_with_cached_javascript_module( bidi_session, url, inline, diff --git a/tests/wpt/tests/webnn/conformance_tests/abs.https.any.js b/tests/wpt/tests/webnn/conformance_tests/abs.https.any.js index fcf144200f6..de6a5761df4 100644 --- a/tests/wpt/tests/webnn/conformance_tests/abs.https.any.js +++ b/tests/wpt/tests/webnn/conformance_tests/abs.https.any.js @@ -14,11 +14,8 @@ // MLOperand abs(MLOperand input); -const getAbsPrecisionTolerance = (graphResources) => { - const toleranceValueDict = {float32: 0, float16: 0}; - const expectedDataType = - getExpectedDataTypeOfSingleOutput(graphResources.expectedOutputs); - return {metricType: 'ULP', value: toleranceValueDict[expectedDataType]}; +const getAbsPrecisionTolerance = () => { + return {metricType: 'ULP', value: 0}; }; const absTests = [ @@ -538,6 +535,62 @@ const absTests = [ } } } + }, + + // int8 tests + { + 'name': 'abs int8 4D tensor', + 'graph': { + 'inputs': { + 'absInput': { + 'data': [ + // int8 range: [/* -(2**7) */ -128, /* 2**7 - 1 */ 127] + // abs(-128) would overflow when data type is int8 + -127, 0, 126, 127 + ], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int8'} + } + }, + 'operators': [{ + 'name': 'abs', + 'arguments': [{'input': 'absInput'}], + 'outputs': 'absOutput' + }], + 'expectedOutputs': { + 'absOutput': { + 'data': [127, 0, 126, 127], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int8'} + } + } + } + }, + + // int32 tests + { + 'name': 'abs int32 4D tensor', + 'graph': { + 'inputs': { + 'absInput': { + 'data': [ + // int32 range: [/* -(2**31) */ -2147483648, /* 2**31 - 1 */ 2147483647] + // abs(-2147483648) would overflow when data type is int32 + -2147483647, 0, 2147483646, 2147483647 + ], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int32'} + } + }, + 'operators': [{ + 'name': 'abs', + 'arguments': [{'input': 'absInput'}], + 'outputs': 'absOutput' + }], + 'expectedOutputs': { + 'absOutput': { + 'data': [2147483647, 0, 2147483646, 2147483647], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int32'} + } + } + } } ]; diff --git a/tests/wpt/tests/webnn/conformance_tests/concat.https.any.js b/tests/wpt/tests/webnn/conformance_tests/concat.https.any.js index 0208e2ec605..d4192172046 100644 --- a/tests/wpt/tests/webnn/conformance_tests/concat.https.any.js +++ b/tests/wpt/tests/webnn/conformance_tests/concat.https.any.js @@ -22,50 +22,6 @@ const getConcatPrecisionTolerance = (graphResources) => { return {metricType: 'ULP', value: toleranceValueDict[expectedDataType]}; }; -const buildAndExecuteGraphWithConcat = - async (context, builder, graphResources) => { - const graphInputs = graphResources.inputs; - const operator = graphResources.operators[0]; - - const inputOperands = []; - const inputNameArray = - operator.arguments[0][Object.keys(operator.arguments[0])[0]]; - for (const inputName of inputNameArray) { - const operand = - createOperand(context, builder, inputName, graphInputs[inputName]); - inputOperands.push(operand); - } - - let outputOperand = builder[operator.name]( - inputOperands, - operator.arguments[1][Object.keys(operator.arguments[1])[0]]); - const outputOperandName = Object.keys(graphResources.expectedOutputs)[0]; - const expectedDescriptor = - graphResources.expectedOutputs[outputOperandName].descriptor; - if (!context.opSupportLimits().output.dataTypes.includes( - expectedDescriptor.dataType)) { - const compatibleType = findCompatibleType( - expectedDescriptor.dataType, - context.opSupportLimits().output.dataTypes); - outputOperand = builder.cast(outputOperand, compatibleType); - expectedDescriptor.castedType = compatibleType; - } - - assertDescriptorsEquals(outputOperand, expectedDescriptor); - - const namedOutputOperand = {}; - namedOutputOperand[outputOperandName] = outputOperand; - - // Compile the constructed graph. - const graph = await builder.build(namedOutputOperand); - - // Execute the compiled graph. - const result = await computeGraph( - context, graph, graphInputs, graphResources.expectedOutputs); - - return {result, namedOutputOperand}; -}; - const concatTests = [ { 'name': 'concat two float32 1D constant tensors of same shape along axis 0', @@ -2428,7 +2384,7 @@ const concatTests = [ if (navigator.ml) { concatTests.forEach((test) => { webnn_conformance_test( - buildAndExecuteGraphWithConcat, getConcatPrecisionTolerance, test); + buildAndExecuteGraph, getConcatPrecisionTolerance, test); }); } else { test(() => assert_implements(navigator.ml, 'missing navigator.ml')); diff --git a/tests/wpt/tests/webnn/conformance_tests/neg.https.any.js b/tests/wpt/tests/webnn/conformance_tests/neg.https.any.js index c03afc52516..8bc10475453 100644 --- a/tests/wpt/tests/webnn/conformance_tests/neg.https.any.js +++ b/tests/wpt/tests/webnn/conformance_tests/neg.https.any.js @@ -14,11 +14,8 @@ // MLOperand neg(MLOperand input); -const getNegPrecisionTolerance = (graphResources) => { - const toleranceValueDict = {float32: 0, float16: 0}; - const expectedDataType = - getExpectedDataTypeOfSingleOutput(graphResources.expectedOutputs); - return {metricType: 'ULP', value: toleranceValueDict[expectedDataType]}; +const getNegPrecisionTolerance = () => { + return {metricType: 'ULP', value: 0}; }; const negTests = [ @@ -551,6 +548,62 @@ const negTests = [ } } } + }, + + // int8 tests + { + 'name': 'neg int8 4D tensor', + 'graph': { + 'inputs': { + 'negInput': { + 'data': [ + // int8 range: [/* -(2**7) */ -128, /* 2**7 - 1 */ 127] + // neg(-128) would overflow when data type is int8 + -127, 0, 126, 127 + ], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int8'} + } + }, + 'operators': [{ + 'name': 'neg', + 'arguments': [{'input': 'negInput'}], + 'outputs': 'negOutput' + }], + 'expectedOutputs': { + 'negOutput': { + 'data': [127, 0, -126, -127], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int8'} + } + } + } + }, + + // int32 tests + { + 'name': 'neg int32 4D tensor', + 'graph': { + 'inputs': { + 'negInput': { + 'data': [ + // int32 range: [/* -(2**31) */ -2147483648, /* 2**31 - 1 */ 2147483647] + // neg(-2147483648) would overflow when data type is int32 + -2147483647, 0, 2147483646, 2147483647 + ], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int32'} + } + }, + 'operators': [{ + 'name': 'neg', + 'arguments': [{'input': 'negInput'}], + 'outputs': 'negOutput' + }], + 'expectedOutputs': { + 'negOutput': { + 'data': [2147483647, 0, -2147483646, -2147483647], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int32'} + } + } + } } ]; diff --git a/tests/wpt/tests/webnn/conformance_tests/qdq_subgraph.https.any.js b/tests/wpt/tests/webnn/conformance_tests/qdq_subgraph.https.any.js index 8f6f2246b04..3b59c3bb49d 100644 --- a/tests/wpt/tests/webnn/conformance_tests/qdq_subgraph.https.any.js +++ b/tests/wpt/tests/webnn/conformance_tests/qdq_subgraph.https.any.js @@ -558,6 +558,372 @@ const subgraphTests = [ } } }, + { + 'name': 'quantized tanh', + 'graph': { + 'inputs': { + 'input': { + 'data': [ + 0.6811466217041016, 0.0479511022567749, 0.33355462551116943, + 0.19882695376873016, 0.41167140007019043, 0.07934240251779556, + ], + 'descriptor': {shape: [2, 3], dataType: 'float32'}, + 'constant': false + }, + 'inputScale': { + 'data': [0.003921568859368563], + 'descriptor': {shape: [1], dataType: 'float32'}, + 'constant': true + }, + 'inputZeroPoint': { + 'data': [-128], + 'descriptor': {shape: [1], dataType: 'int8'}, + 'constant': true + }, + 'outputScale': { + 'data': [0.003921568859368563], + 'descriptor': {shape: [1], dataType: 'float32'}, + 'constant': true + }, + 'outputZeroPoint': { + 'data': [-128], + 'descriptor': {shape: [1], dataType: 'int8'}, + 'constant': true + }, + }, + 'operators': [ + { + 'name': 'quantizeLinear', + 'arguments': [ + {'input': 'input'}, + {'scale': 'inputScale', 'zeroPoint': 'inputZeroPoint'} + ], + 'outputs': 'quantizedInput' + }, + { + 'name': 'dequantizeLinear', + 'arguments': [ + {'input': 'quantizedInput'}, + {'scale': 'inputScale', 'zeroPoint': 'inputZeroPoint'} + ], + 'outputs': 'dequantizedInput' + }, + { + 'name': 'tanh', + 'arguments': [{'input': 'dequantizedInput'}], + 'outputs': 'tanhOutput' + }, + { + 'name': 'quantizeLinear', + 'arguments': [ + {'input': 'tanhOutput'}, + {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} + ], + 'outputs': 'quantizedtanhOutput' + }, + { + 'name': 'dequantizeLinear', + 'arguments': [ + {'input': 'quantizedtanhOutput'}, + {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} + ], + 'outputs': 'output' + } + ], + 'expectedOutputs': { + 'output': { + 'data': [ + 0.5921568870544434, 0.0470588281750679, 0.32156863808631897, + 0.19607844948768616, 0.38823533058166504, 0.0784313753247261, + ], + 'descriptor': {shape: [2, 3], dataType: 'float32'} + } + } + } + }, + { + 'name': 'quantized sigmoid', + 'graph': { + 'inputs': { + 'input': { + 'data': [ + 0.6811466217041016, 0.0479511022567749, 0.33355462551116943, + 0.19882695376873016, 0.41167140007019043, 0.07934240251779556, + ], + 'descriptor': {shape: [2, 3], dataType: 'float32'}, + 'constant': false + }, + 'inputScale': { + 'data': [0.00390625], + 'descriptor': {shape: [1], dataType: 'float32'}, + 'constant': true + }, + 'inputZeroPoint': { + 'data': [-128], + 'descriptor': {shape: [1], dataType: 'int8'}, + 'constant': true + }, + 'outputScale': { + 'data': [0.00390625], + 'descriptor': {shape: [1], dataType: 'float32'}, + 'constant': true + }, + 'outputZeroPoint': { + 'data': [-128], + 'descriptor': {shape: [1], dataType: 'int8'}, + 'constant': true + }, + }, + 'operators': [ + { + 'name': 'quantizeLinear', + 'arguments': [ + {'input': 'input'}, + {'scale': 'inputScale', 'zeroPoint': 'inputZeroPoint'} + ], + 'outputs': 'quantizedInput' + }, + { + 'name': 'dequantizeLinear', + 'arguments': [ + {'input': 'quantizedInput'}, + {'scale': 'inputScale', 'zeroPoint': 'inputZeroPoint'} + ], + 'outputs': 'dequantizedInput' + }, + { + 'name': 'sigmoid', + 'arguments': [{'input': 'dequantizedInput'}], + 'outputs': 'sigmoidOutput' + }, + { + 'name': 'quantizeLinear', + 'arguments': [ + {'input': 'sigmoidOutput'}, + {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} + ], + 'outputs': 'quantizedsigmoidOutput' + }, + { + 'name': 'dequantizeLinear', + 'arguments': [ + {'input': 'quantizedsigmoidOutput'}, + {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} + ], + 'outputs': 'output' + } + ], + 'expectedOutputs': { + 'output': { + 'data': [ + 0.6640625, 0.51171875, 0.58203125, + 0.55078125, 0.6015625, 0.51953125, + ], + 'descriptor': {shape: [2, 3], dataType: 'float32'} + } + } + } + }, + { + 'name': 'quantized leaky relu', + 'graph': { + 'inputs': { + 'input': { + 'data': [ + 1.6811466217041016, 0.0479511022567749, 0.33355462551116943, + -0.1988269537687301, -0.0041167140007019, -0.0634240251779556, + ], + 'descriptor': {shape: [2, 3], dataType: 'float32'}, + 'constant': false + }, + 'inputScale': { + 'data': [0.003921568859368563], + 'descriptor': {shape: [1], dataType: 'float32'}, + 'constant': true + }, + 'inputZeroPoint': { + 'data': [0], + 'descriptor': {shape: [1], dataType: 'int8'}, + 'constant': true + }, + 'outputScale': { + 'data': [0.003921568859368563], + 'descriptor': {shape: [1], dataType: 'float32'}, + 'constant': true + }, + 'outputZeroPoint': { + 'data': [0], + 'descriptor': {shape: [1], dataType: 'int8'}, + 'constant': true + }, + }, + 'operators': [ + { + 'name': 'quantizeLinear', + 'arguments': [ + {'input': 'input'}, + {'scale': 'inputScale', 'zeroPoint': 'inputZeroPoint'} + ], + 'outputs': 'quantizedInput' + }, + { + 'name': 'dequantizeLinear', + 'arguments': [ + {'input': 'quantizedInput'}, + {'scale': 'inputScale', 'zeroPoint': 'inputZeroPoint'} + ], + 'outputs': 'dequantizedInput' + }, + { + 'name': 'leakyRelu', + 'arguments': [ + {'input': 'dequantizedInput'}, + {'options': {'alpha': 5.799162942273234}} + ], + 'outputs': 'leakyReluOutput' + }, + { + 'name': 'quantizeLinear', + 'arguments': [ + {'input': 'leakyReluOutput'}, + {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} + ], + 'outputs': 'quantizedleakyReluOutput' + }, + { + 'name': 'dequantizeLinear', + 'arguments': [ + {'input': 'quantizedleakyReluOutput'}, + {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} + ], + 'outputs': 'output' + } + ], + 'expectedOutputs': { + 'output': { + 'data': [ + 0.49803924560546875, 0.0470588281750679, 0.3333333432674408, + -0.501960813999176, -0.02352941408753395, -0.364705890417099, + ], + 'descriptor': {shape: [2, 3], dataType: 'float32'} + } + } + } + }, + { + 'name': 'quantized concat', + 'graph': { + 'inputs': { + 'inputA': { + 'data': [ + -0.990639865398407, -0.576785683631897, -0.32276400923728943, + -0.44735023379325867, -0.11028251051902771, -0.5945112705230713, + ], + 'descriptor': {shape: [3, 2], dataType: 'float32'}, + 'constant': false + }, + 'inputAScale': { + 'data': [0.003921568859368563], + 'descriptor': {shape: [1], dataType: 'float32'}, + 'constant': true + }, + 'inputAZeroPoint': { + 'data': [127], + 'descriptor': {shape: [1], dataType: 'int8'}, + 'constant': true + }, + 'inputB': { + 'data': [ + 2, 27, 38, + ], + 'descriptor': {shape: [3, 1], dataType: 'int8'}, + 'constant': true + }, + 'inputBScale': { + 'data': [0.003921568859368563], + 'descriptor': {shape: [1], dataType: 'float32'}, + 'constant': true + }, + 'inputBZeroPoint': { + 'data': [127], + 'descriptor': {shape: [1], dataType: 'int8'}, + 'constant': true + }, + 'outputScale': { + 'data': [0.003921568859368563], + 'descriptor': {shape: [1], dataType: 'float32'}, + 'constant': true + }, + 'outputZeroPoint': { + 'data': [127], + 'descriptor': {shape: [1], dataType: 'int8'}, + 'constant': true + }, + }, + 'operators': [ + { + 'name': 'quantizeLinear', + 'arguments': [ + {'input': 'inputA'}, + {'scale': 'inputAScale', 'zeroPoint': 'inputAZeroPoint'} + ], + 'outputs': 'quantizedInputA' + }, + { + 'name': 'dequantizeLinear', + 'arguments': [ + {'input': 'quantizedInputA'}, + {'scale': 'inputAScale', 'zeroPoint': 'inputAZeroPoint'} + ], + 'outputs': 'dequantizedInputA' + }, + { + 'name': 'dequantizeLinear', + 'arguments': [ + {'input': 'inputB'}, + {'scale': 'inputBScale', 'zeroPoint': 'inputBZeroPoint'} + ], + 'outputs': 'dequantizedInputB' + }, + { + 'name': 'concat', + 'arguments': [ + { + 'inputs': ['dequantizedInputA', 'dequantizedInputB'] + }, + {'axis': 1} + ], + 'outputs': 'concatOutput' + }, + { + 'name': 'quantizeLinear', + 'arguments': [ + {'input': 'concatOutput'}, + {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} + ], + 'outputs': 'quantizedConcatOutput' + }, + { + 'name': 'dequantizeLinear', + 'arguments': [ + {'input': 'quantizedConcatOutput'}, + {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} + ], + 'outputs': 'output' + } + ], + 'expectedOutputs': { + 'output': { + 'data': [ + -0.9921569228172302, -0.5764706134796143, -0.4901961088180542, + -0.32156863808631897, -0.44705885648727417, -0.3921568989753723, + -0.1098039299249649, -0.5960784554481506, -0.3490196168422699, + ], + 'descriptor': {shape: [3, 3], dataType: 'float32'} + } + } + } + }, ]; if (navigator.ml) { diff --git a/tests/wpt/tests/webnn/conformance_tests/relu.https.any.js b/tests/wpt/tests/webnn/conformance_tests/relu.https.any.js index 16cc2a3fa67..63ef9fa9ff0 100644 --- a/tests/wpt/tests/webnn/conformance_tests/relu.https.any.js +++ b/tests/wpt/tests/webnn/conformance_tests/relu.https.any.js @@ -581,7 +581,61 @@ const reluTests = [ } } } - } + }, + + // int8 tests + { + 'name': 'relu int8 4D tensor', + 'graph': { + 'inputs': { + 'reluInput': { + 'data': [ + // int8 range: [/* -(2**7) */ -128, /* 2**7 - 1 */ 127] + -128, 0, 126, 127 + ], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int8'} + } + }, + 'operators': [{ + 'name': 'relu', + 'arguments': [{'input': 'reluInput'}], + 'outputs': 'reluOutput' + }], + 'expectedOutputs': { + 'reluOutput': { + 'data': [0, 0, 126, 127], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int8'} + } + } + } + }, + + // int32 tests + { + 'name': 'relu int32 4D tensor', + 'graph': { + 'inputs': { + 'reluInput': { + 'data': [ + // int32 range: [/* -(2**31) */ -2147483648, /* 2**31 - 1 */ 2147483647] + -2147483648, 0, 2147483646, 2147483647 + ], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int32'} + } + }, + 'operators': [{ + 'name': 'relu', + 'arguments': [{'input': 'reluInput'}], + 'outputs': 'reluOutput' + }], + 'expectedOutputs': { + 'reluOutput': { + 'data': [0, 0, 2147483646, 2147483647], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int32'} + } + } + } + }, ]; if (navigator.ml) { diff --git a/tests/wpt/tests/webnn/conformance_tests/sub.https.any.js b/tests/wpt/tests/webnn/conformance_tests/sub.https.any.js index 2f2fadf7282..85b15f5a000 100644 --- a/tests/wpt/tests/webnn/conformance_tests/sub.https.any.js +++ b/tests/wpt/tests/webnn/conformance_tests/sub.https.any.js @@ -14,7 +14,16 @@ const getSubPrecisionTolerance = (graphResources) => { - const toleranceValueDict = {float32: 1, float16: 1}; + const toleranceValueDict = { + float32: 1, + float16: 1, + int8: 0, + uint8: 0, + int32: 0, + uint32: 0, + int64: 0, + uint64: 0 + }; const expectedDataType = getExpectedDataTypeOfSingleOutput(graphResources.expectedOutputs); return {metricType: 'ULP', value: toleranceValueDict[expectedDataType]}; @@ -916,6 +925,208 @@ const subTests = [ } } } + }, + + // int8 tests + { + 'name': 'sub int8 4D tensors', + 'graph': { + 'inputs': { + 'inputA': { + 'data': [ + 73, 14, -69, -52, -75, -2, -83, 15, -62, 32, 82, -74, + 78, 48, -19, -85, 89, 22, 80, 97, 52, 89, -20, 99 + ], + 'descriptor': {shape: [2, 2, 2, 3], dataType: 'int8'} + }, + 'inputB': { + 'data': [ + -49, 40, 7, 76, -81, 59, 11, 48, 65, 27, 30, -38, + -49, -78, 16, 35, -28, 28, 35, -3, -57, -21, 27, 32 + ], + 'descriptor': {shape: [2, 2, 2, 3], dataType: 'int8'} + } + }, + 'operators': [{ + 'name': 'sub', + 'arguments': [{'a': 'inputA'}, {'b': 'inputB'}], + 'outputs': 'output' + }], + 'expectedOutputs': { + 'output': { + // the range of int8 result: [-128, 127] + 'data': [ + 122, -26, -76, -128, 6, -61, -94, -33, -127, 5, 52, -36, + 127, 126, -35, -120, 117, -6, 45, 100, 109, 110, -47, 67 + ], + 'descriptor': {shape: [2, 2, 2, 3], dataType: 'int8'} + } + } + } + }, + + // uint8 tests + { + 'name': 'sub uint8 4D tensors', + 'graph': { + 'inputs': { + 'inputA': { + 'data': [1, 10, 100, 255], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'uint8'} + }, + 'inputB': { + // b should be lesser than or equal to a, otherwise the result would + // overflow when testing uint8 data type + 'data': [1, 8, 88, 254], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'uint8'} + } + }, + 'operators': [{ + 'name': 'sub', + 'arguments': [{'a': 'inputA'}, {'b': 'inputB'}], + 'outputs': 'output' + }], + 'expectedOutputs': { + 'output': { + 'data': [0, 2, 12, 1], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'uint8'} + } + } + } + }, + + // int32 tests + { + 'name': 'sub int32 4D tensors', + 'graph': { + 'inputs': { + 'inputA': { + 'data': [ + 73, 14, -69, -52, -75, -2, -83, 15, -62, 32, 82, -74, + 78, 48, -19, -85, 89, 22, 80, 97, 52, 89, -20, 99 + ], + 'descriptor': {shape: [2, 2, 2, 3], dataType: 'int32'} + }, + 'inputB': { + 'data': [ + -49, 40, 7, 89, -81, 59, 11, 48, 85, 27, 30, -38, + -83, -86, 16, 46, -28, 28, 35, -77, -57, -58, 27, 32 + ], + 'descriptor': {shape: [2, 2, 2, 3], dataType: 'int32'} + } + }, + 'operators': [{ + 'name': 'sub', + 'arguments': [{'a': 'inputA'}, {'b': 'inputB'}], + 'outputs': 'output' + }], + 'expectedOutputs': { + 'output': { + 'data': [ + 122, -26, -76, -141, 6, -61, -94, -33, -147, 5, 52, -36, + 161, 134, -35, -131, 117, -6, 45, 174, 109, 147, -47, 67 + ], + 'descriptor': {shape: [2, 2, 2, 3], dataType: 'int32'} + } + } + } + }, + + // uint32 tests + { + 'name': 'sub uint32 4D tensors', + 'graph': { + 'inputs': { + 'inputA': { + 'data': [1, 10, 100, 1024], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'uint32'} + }, + 'inputB': { + // b should be lesser than or equal to a, otherwise the result would + // overflow when testing uint32 data type + 'data': [1, 8, 88, 1000], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'uint32'} + } + }, + 'operators': [{ + 'name': 'sub', + 'arguments': [{'a': 'inputA'}, {'b': 'inputB'}], + 'outputs': 'output' + }], + 'expectedOutputs': { + 'output': { + 'data': [0, 2, 12, 24], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'uint32'} + } + } + } + }, + + // int64 tests + { + 'name': 'sub int64 4D tensors', + 'graph': { + 'inputs': { + 'inputA': { + 'data': [ + 73, 14, -69, -52, -75, -2, -83, 15, -62, 32, 82, -74, + 78, 48, -19, -85, 89, 22, 80, 97, 52, 89, -20, 99 + ], + 'descriptor': {shape: [2, 2, 2, 3], dataType: 'int64'} + }, + 'inputB': { + 'data': [ + -49, 40, 7, 89, -81, 59, 11, 48, 85, 27, 30, -38, + -83, -86, 16, 46, -28, 28, 35, -77, -57, -58, 27, 32 + ], + 'descriptor': {shape: [2, 2, 2, 3], dataType: 'int64'} + } + }, + 'operators': [{ + 'name': 'sub', + 'arguments': [{'a': 'inputA'}, {'b': 'inputB'}], + 'outputs': 'output' + }], + 'expectedOutputs': { + 'output': { + 'data': [ + 122, -26, -76, -141, 6, -61, -94, -33, -147, 5, 52, -36, + 161, 134, -35, -131, 117, -6, 45, 174, 109, 147, -47, 67 + ], + 'descriptor': {shape: [2, 2, 2, 3], dataType: 'int64'} + } + } + } + }, + + // uint64 tests + { + 'name': 'sub uint64 4D tensors', + 'graph': { + 'inputs': { + 'inputA': { + 'data': [1, 10, 100, 1024], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'uint64'} + }, + 'inputB': { + // b should be lesser than or equal to a, otherwise the result would + // overflow when testing uint64 data type + 'data': [1, 8, 88, 1000], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'uint64'} + } + }, + 'operators': [{ + 'name': 'sub', + 'arguments': [{'a': 'inputA'}, {'b': 'inputB'}], + 'outputs': 'output' + }], + 'expectedOutputs': { + 'output': { + 'data': [0, 2, 12, 24], + 'descriptor': {shape: [1, 2, 2, 1], dataType: 'uint64'} + } + } + } } ]; diff --git a/tests/wpt/tests/webnn/resources/utils.js b/tests/wpt/tests/webnn/resources/utils.js index d19cb7cf760..50d7911a918 100644 --- a/tests/wpt/tests/webnn/resources/utils.js +++ b/tests/wpt/tests/webnn/resources/utils.js @@ -10,7 +10,7 @@ const operatorToleranceDict = { leakyRelu: {float32: 1, float16: 2}, linear: {float32: 2, float16: 2}, prelu: {float32: 1, float16: 1}, - relu: {float32: 0, float16: 0}, + relu: {float32: 0, float16: 0, int8: 0, int32: 0}, reshape: {float32: 0, float16: 0}, sigmoid: {float32: 34, float16: 10}, softplus: {float32: 18, float16: 18}, @@ -703,6 +703,10 @@ function validateContextSupportsGraph(context, graph) { assert( typeof inputName === 'string', `the inputs' item of ${operatorName} should be a string.`); + if (!graph.inputs[inputName]) { + // intermediate input + continue; + } validateInputOrConstantDataType( inputName, operatorSupportLimits, 'inputs'); } @@ -788,7 +792,21 @@ const buildAndExecuteGraph = async (context, builder, graphResources) => { for (const argument of operator.arguments) { for (const argumentName in argument) { if (argumentName !== 'options') { - if (graphInputs.hasOwnProperty(argument[argumentName])) { + if (operator.name === 'concat' && argumentName === 'inputs') { + const concatInputs = []; + for (const inputName of argument[argumentName]) { + if (graphInputs.hasOwnProperty(inputName)) { + const operandName = inputName; + const operand = createOperand( + context, builder, operandName, graphInputs[operandName]); + concatInputs.push(operand); + } else if (intermediateOperands.hasOwnProperty(inputName)) { + concatInputs.push(intermediateOperands[inputName]); + } + // concatInputs.push(intermediateOperands[inputName]); + } + argumentArray.push(concatInputs); + } else if (graphInputs.hasOwnProperty(argument[argumentName])) { const operandName = argument[argumentName]; const operand = createOperand( context, builder, operandName, graphInputs[operandName]); diff --git a/tests/wpt/tests/webrtc-stats/supported-stats.https.html b/tests/wpt/tests/webrtc-stats/supported-stats.https.html index 677736f3cd8..81aef5f94b9 100644 --- a/tests/wpt/tests/webrtc-stats/supported-stats.https.html +++ b/tests/wpt/tests/webrtc-stats/supported-stats.https.html @@ -69,6 +69,7 @@ function isPropertyTestable(type, property) { ], 'inbound-rtp': [ 'fecSsrc', // requires FlexFEC to be negotiated. + 'fecBytesReceived', // requires FlexFEC to be negotiated. ], 'media-source': [ 'echoReturnLoss', // requires gUM with an audio input device. diff --git a/tests/wpt/tests/webrtc/RTCConfiguration-iceServers.html b/tests/wpt/tests/webrtc/RTCConfiguration-iceServers.html index aa66bfbb2bf..bc7831361ab 100644 --- a/tests/wpt/tests/webrtc/RTCConfiguration-iceServers.html +++ b/tests/wpt/tests/webrtc/RTCConfiguration-iceServers.html @@ -301,4 +301,28 @@ }] })); }, `with empty urls should throw SyntaxError`); + test(() => { + const pc = new RTCPeerConnection({ iceServers: [{ + urls: 'stun:stun1.example.net' + }] }); + let config = pc.getConfiguration(); + assert_equals(config.iceServers.length, 1); + pc.setConfiguration({}); + config = pc.getConfiguration(); + assert_equals(config.iceServers.length, 0); + }, `setConfiguration(config) - without iceServers removes ice servers`); + + config_test(makePc => { + const pc = makePc({ iceServers: [...Array(32)].map((_, i) => ({ + urls: `stun:stun${i+1}.example.net` + })) }); + + const { iceServers } = pc.getConfiguration(); + assert_equals(iceServers.length, 32); + + for (let i = 0; i < 32; i++) { + const server = iceServers[i]; + assert_array_equals(server.urls, [`stun:stun${i+1}.example.net`]); + } + }, `with 32 ice servers must succeed`); </script> diff --git a/tests/wpt/tests/webrtc/RTCPeerConnection-addTransceiver.https.html b/tests/wpt/tests/webrtc/RTCPeerConnection-addTransceiver.https.html index 3fd83a76fe2..62df4293067 100644 --- a/tests/wpt/tests/webrtc/RTCPeerConnection-addTransceiver.https.html +++ b/tests/wpt/tests/webrtc/RTCPeerConnection-addTransceiver.https.html @@ -319,18 +319,21 @@ of 16 characters. If one of the RIDs does not meet these requirements, throw a TypeError. */ + +["video", "audio"].forEach(kind => { + test(t => { const pc = new RTCPeerConnection(); t.add_cleanup(() => pc.close()); assert_idl_attribute(pc, 'addTransceiver'); assert_throws_js(TypeError, () => - pc.addTransceiver('video', { + pc.addTransceiver(kind, { sendEncodings: [{ rid: '@Invalid!' }] })); - }, 'addTransceiver() with rid containing invalid non-alphanumeric characters should throw TypeError'); + }, `addTransceiver("${kind}") with rid containing invalid non-alphanumeric characters should throw TypeError`); test(t => { const pc = new RTCPeerConnection(); @@ -338,22 +341,41 @@ assert_idl_attribute(pc, 'addTransceiver'); assert_throws_js(TypeError, () => - pc.addTransceiver('audio', { + pc.addTransceiver(kind, { sendEncodings: [{ rid: 'a'.repeat(17) }] })); - }, 'addTransceiver() with rid longer than 16 characters should throw TypeError'); + }, `addTransceiver("${kind}") with rid longer than 16 characters should throw TypeError`); + + test(t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + assert_idl_attribute(pc, 'addTransceiver'); + + assert_throws_js(TypeError, () => + pc.addTransceiver(kind, { + sendEncodings: [{rid: 'a'}, {rid: 'a'}] + })); + }, `addTransceiver("${kind}") with duplicate rids should throw TypeError`); test(t => { const pc = new RTCPeerConnection(); t.add_cleanup(() => pc.close()); - pc.addTransceiver('audio', { + pc.addTransceiver(kind, { sendEncodings: [{ rid: 'foo' }] }); - }, `addTransceiver() with valid rid value should succeed`); + }, `addTransceiver("${kind}") with valid rid value should succeed`); + + test(t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + pc.addTransceiver('video', { + sendEncodings: [{rid: 'a'}, {rid: 'b'}] + }); + }, `addTransceiver("${kind}") with multiple rid values should succeed`); test(t => { const pc = new RTCPeerConnection(); @@ -369,7 +391,8 @@ rid: 'foo' }] }); - }, `addTransceiver() with valid sendEncodings should succeed`); + }, `addTransceiver("${kind}") with valid sendEncodings should succeed`); +}); /* TODO diff --git a/tests/wpt/tests/webxr/depth-sensing/cpu/depth_sensing_cpu_matchDepthViewIdentity.https.html b/tests/wpt/tests/webxr/depth-sensing/cpu/depth_sensing_cpu_matchDepthViewIdentity.https.html new file mode 100644 index 00000000000..f3256106e90 --- /dev/null +++ b/tests/wpt/tests/webxr/depth-sensing/cpu/depth_sensing_cpu_matchDepthViewIdentity.https.html @@ -0,0 +1,61 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="../../resources/webxr_util.js"></script> +<script src="../../resources/webxr_math_utils.js"></script> +<script src="../../resources/webxr_test_constants.js"></script> +<script src="../../resources/webxr_test_asserts.js"></script> +<script src="../../resources/webxr_test_constants_fake_depth.js"></script> +<script src="../matchDepthViewValues.js"></script> + +<script> + +const fakeDeviceInitParams = { + supportedModes: ["immersive-ar"], + views: VALID_VIEWS, + supportedFeatures: ALL_FEATURES, + depthSensingData: DEPTH_SENSING_DATA, +}; + +function matchDepthViewFalsePlaceholderTest(session) { + // Currently we just assert that we are able to get a session when + // matchDepthView is false. If we got to this point, we have a session. + return Promise.resolve(); +} + +xr_session_promise_test("Ensures XRViewGeometry values are identity when matchDepthView is unset, `cpu-optimized`", + depthViewGeometryTestGenerator(/*isCpuOptimized=*/true), + fakeDeviceInitParams, + 'immersive-ar', { + requiredFeatures: ['depth-sensing'], + depthSensing: { + usagePreference: ['cpu-optimized'], + dataFormatPreference: [], + }, + }); + +xr_session_promise_test("Ensures XRViewGeometry values are identity when matchDepthView=true, `cpu-optimized`", + depthViewGeometryTestGenerator(/*isCpuOptimized=*/true), + fakeDeviceInitParams, + 'immersive-ar', { + requiredFeatures: ['depth-sensing'], + depthSensing: { + usagePreference: ['cpu-optimized'], + dataFormatPreference: [], + matchDepthView: true, + }, + }); + +xr_session_promise_test("Ensures session can be created when matchDepthView=false, `cpu-optimized`", + matchDepthViewFalsePlaceholderTest, + fakeDeviceInitParams, + 'immersive-ar', { + requiredFeatures: ['depth-sensing'], + depthSensing: { + usagePreference: ['cpu-optimized'], + dataFormatPreference: [], + matchDepthView: false, + }, + }); + +</script> diff --git a/tests/wpt/tests/webxr/depth-sensing/gpu/depth_sensing_gpu_matchDepthViewIdentity.https.html b/tests/wpt/tests/webxr/depth-sensing/gpu/depth_sensing_gpu_matchDepthViewIdentity.https.html new file mode 100644 index 00000000000..1813ddd449e --- /dev/null +++ b/tests/wpt/tests/webxr/depth-sensing/gpu/depth_sensing_gpu_matchDepthViewIdentity.https.html @@ -0,0 +1,61 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="../../resources/webxr_util.js"></script> +<script src="../../resources/webxr_math_utils.js"></script> +<script src="../../resources/webxr_test_constants.js"></script> +<script src="../../resources/webxr_test_asserts.js"></script> +<script src="../../resources/webxr_test_constants_fake_depth.js"></script> +<script src="../matchDepthViewValues.js"></script> + +<script> + +const fakeDeviceInitParams = { + supportedModes: ["immersive-ar"], + views: VALID_VIEWS, + supportedFeatures: ALL_FEATURES, + depthSensingData: DEPTH_SENSING_DATA, +}; + +function matchDepthViewFalsePlaceholderTest(session) { + // Currently we just assert that we are able to get a session when + // matchDepthView is false. If we got to this point, we have a session. + return Promise.resolve(); +} + +xr_session_promise_test("Ensures XRViewGeometry values are identity when matchDepthView is unset, `gpu-optimized`", + depthViewGeometryTestGenerator(/*isCpuOptimized=*/false), + fakeDeviceInitParams, + 'immersive-ar', { + requiredFeatures: ['depth-sensing'], + depthSensing: { + usagePreference: ['gpu-optimized'], + dataFormatPreference: [], + }, + }); + +xr_session_promise_test("Ensures XRViewGeometry values are identity when matchDepthView=true, `gpu-optimized`", + depthViewGeometryTestGenerator(/*isCpuOptimized=*/false), + fakeDeviceInitParams, + 'immersive-ar', { + requiredFeatures: ['depth-sensing'], + depthSensing: { + usagePreference: ['gpu-optimized'], + dataFormatPreference: [], + matchDepthView: true, + }, + }); + +xr_session_promise_test("Ensures session can be created when matchDepthView=false, `gpu-optimized`", + matchDepthViewFalsePlaceholderTest, + fakeDeviceInitParams, + 'immersive-ar', { + requiredFeatures: ['depth-sensing'], + depthSensing: { + usagePreference: ['gpu-optimized'], + dataFormatPreference: [], + matchDepthView: false, + }, + }); + +</script> diff --git a/tests/wpt/tests/webxr/depth-sensing/matchDepthViewValues.js b/tests/wpt/tests/webxr/depth-sensing/matchDepthViewValues.js new file mode 100644 index 00000000000..597f9734d3f --- /dev/null +++ b/tests/wpt/tests/webxr/depth-sensing/matchDepthViewValues.js @@ -0,0 +1,31 @@ +'use strict'; + +// import * as XrConstants from 'resources/webxr_test_constants.js' +// import * as XrAsserts from 'resources/webxr_test_asserts.js' + +// TODO: Expand the WebXrTestApi to specify a viewGeometry that this can validate +// as well. +const depthViewGeometryTestGenerator = function(isCpuOptimized) { + return (session, controller, t, sessionObjects) => { + + return session.requestReferenceSpace('viewer').then((viewerSpace) => new Promise((resolve) => { + + const glBinding = new XRWebGLBinding(session, sessionObjects.gl); + + const rafCb = function(time, frame) { + const pose = frame.getViewerPose(viewerSpace); + for(const view of pose.views) { + const depthInformation = isCpuOptimized ? frame.getDepthInformation(view) + : glBinding.getDepthInformation(view); + t.step(()=> { + assert_matrix_approx_equals(IDENTITY_MATRIX, depthInformation.projectionMatrix); + assert_transform_approx_equals(IDENTITY_TRANSFORM, depthInformation.transform); + }); + } + resolve(); + } + + session.requestAnimationFrame(rafCb); + })); // Promise + }; // Test Func +}; // Generator Func diff --git a/tests/wpt/webgl/meta/conformance/textures/misc/texture-upload-size.html.ini b/tests/wpt/webgl/meta/conformance/textures/misc/texture-upload-size.html.ini index 37602dbc1f6..435cfbe0d5c 100644 --- a/tests/wpt/webgl/meta/conformance/textures/misc/texture-upload-size.html.ini +++ b/tests/wpt/webgl/meta/conformance/textures/misc/texture-upload-size.html.ini @@ -13,6 +13,3 @@ [WebGL test #588] expected: FAIL - - [WebGL test #52] - expected: FAIL |