diff options
404 files changed, 10968 insertions, 2222 deletions
diff --git a/tests/wpt/meta/FileAPI/url/url-with-fetch.any.js.ini b/tests/wpt/meta/FileAPI/url/url-with-fetch.any.js.ini index 5f4566bad57..b275cb58343 100644 --- a/tests/wpt/meta/FileAPI/url/url-with-fetch.any.js.ini +++ b/tests/wpt/meta/FileAPI/url/url-with-fetch.any.js.ini @@ -5,9 +5,6 @@ [Revoke blob URL after creating Request, then clone Request, will fetch] expected: FAIL - [Revoke blob URL after calling fetch, fetch should succeed] - expected: FAIL - [url-with-fetch.any.worker.html] [Revoke blob URL after creating Request, will fetch] diff --git a/tests/wpt/meta/MANIFEST.json b/tests/wpt/meta/MANIFEST.json index 117f1af832b..a9e0663a711 100644 --- a/tests/wpt/meta/MANIFEST.json +++ b/tests/wpt/meta/MANIFEST.json @@ -762,6 +762,13 @@ {} ] ], + "chrome-bug-404743651.html": [ + "238862374028415bb2ddb91de5f9a16132ec654d", + [ + null, + {} + ] + ], "pseudo-element-animation-with-marker.html": [ "ba7fc2371abfdc463f8ed36e6f1bb39fb9ef6ef5", [ @@ -2496,6 +2503,15 @@ ] ] }, + "css-easing": { + "linear-timing-functions-chrome-405004975-crash.html": [ + "510b51716cec67fcdad51d44e2124c5986efa3f3", + [ + null, + {} + ] + ] + }, "css-flexbox": { "animation": { "flex-basis-content-crash.html": [ @@ -4162,6 +4178,13 @@ {} ] ], + "line-clamp-auto-002-crash.html": [ + "be5693c70456bd664dd219d6985067400a26084e", + [ + null, + {} + ] + ], "webkit-line-clamp-041-crash.html": [ "3f4bf3c8ef578fa22469e81e504879aa5d713bf8", [ @@ -5735,6 +5758,13 @@ null, {} ] + ], + "zoom-revert-layer-crash.html": [ + "c75b792e6de78a27a4c5961a0efcbf7593f02eb7", + [ + null, + {} + ] ] } }, @@ -123902,6 +123932,35 @@ } ] ], + "root-element-background-margin-opacity.html": [ + "e1e7fed5a66b0993174617550e2775206a91930b", + [ + null, + [ + [ + "/css/compositing/root-element-background-margin-opacity-ref.html", + "==" + ] + ], + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 1 + ], + [ + 0, + 10000 + ] + ] + ] + ] + } + ] + ], "root-element-background-transparency.html": [ "910eb08e8d3004da7418f8f00f38d022841262f2", [ @@ -125550,6 +125609,19 @@ ] }, "css-animations": { + "animate-with-background-color-oklch-001.html": [ + "37d10e07cdb467aee54d5826ce2a1604417829f8", + [ + null, + [ + [ + "/css/css-animations/animate-with-background-color-oklch-001-ref.html", + "==" + ] + ], + {} + ] + ], "animation-delay-008.html": [ "52883fa72ff5a4a57c6a8c2866805ceb5fa0a507", [ @@ -135995,7 +136067,7 @@ }, "corner-shape": { "corner-shape-any.html": [ - "9c256eb89778f8060906b7d943d08a01a3cfe300", + "5b197317eb182639168b21a8ad522c081aba6f26", [ "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-bottom-left-shape=bevel&border-bottom-left-radius=30px", [ @@ -136023,6 +136095,84 @@ } ], [ + "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-bottom-left-shape=bevel&border-width=10px&border-radius=20px", + [ + [ + "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-bottom-left-shape=bevel&border-width=10px&border-radius=20px", + "==" + ] + ], + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 180 + ], + [ + 0, + 520 + ] + ] + ] + ] + } + ], + [ + "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-bottom-right-shape=bevel&border-width=10px&border-radius=20px", + [ + [ + "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-bottom-right-shape=bevel&border-width=10px&border-radius=20px", + "==" + ] + ], + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 180 + ], + [ + 0, + 520 + ] + ] + ] + ] + } + ], + [ + "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-bottom-right-shape=bevel&corner-bottom-left-shape=bevel", + [ + [ + "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-bottom-right-shape=bevel&corner-bottom-left-shape=bevel", + "==" + ] + ], + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 180 + ], + [ + 0, + 520 + ] + ] + ] + ] + } + ], + [ "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-bottom-right-shape=superellipse(1.9)&border-bottom-right-radius=50%", [ [ @@ -136049,6 +136199,32 @@ } ], [ + "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-shape=squircle&border-radius=25%&border-width=20px", + [ + [ + "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-shape=squircle&border-radius=25%&border-width=20px", + "==" + ] + ], + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 180 + ], + [ + 0, + 520 + ] + ] + ] + ] + } + ], + [ "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-shape=squircle&border-radius=50%", [ [ @@ -136075,6 +136251,32 @@ } ], [ + "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-shape=squircle&border-top-left-radius=25%&border-width=10px", + [ + [ + "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-shape=squircle&border-top-left-radius=25%&border-width=10px", + "==" + ] + ], + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 180 + ], + [ + 0, + 520 + ] + ] + ] + ] + } + ], + [ "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-shape=squircle&border-top-left-radius=30%", [ [ @@ -136205,10 +136407,10 @@ } ], [ - "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-top-left-shape=scoop&corner-top-right-shape=scoop&border-radius=50%", + "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-top-left-shape=bevel&border-radius=40px", [ [ - "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-top-left-shape=scoop&corner-top-right-shape=scoop&border-radius=50%", + "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-top-left-shape=bevel&border-radius=40px", "==" ] ], @@ -136231,10 +136433,10 @@ } ], [ - "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-top-right-shape=superellipse(0.1)&border-top-right-radius=50px", + "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-top-left-shape=bevel&border-radius=40px&border-width=10px", [ [ - "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-top-right-shape=superellipse(0.1)&border-top-right-radius=50px", + "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-top-left-shape=bevel&border-radius=40px&border-width=10px", "==" ] ], @@ -136255,15 +136457,12 @@ ] ] } - ] - ], - "corner-shape-bevel-overflow-composite.html": [ - "985b5efdc9b9c868465d658e5486cd1e7eae5fd5", + ], [ - null, + "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-top-left-shape=bevel&border-width=10px&border-color=black", [ [ - "/css/css-borders/tentative/corner-shape/corner-shape-bevel-overflow-composite-ref.html", + "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-top-left-shape=bevel&border-width=10px&border-color=black", "==" ] ], @@ -136274,25 +136473,22 @@ [ [ 0, - 100 + 180 ], [ 0, - 255 + 520 ] ] ] ] } - ] - ], - "corner-shape-bevel-overflow.html": [ - "df604db8d13888a2c59488e374ee27ebe6878001", + ], [ - null, + "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-top-left-shape=scoop&border-radius=40px", [ [ - "/css/css-borders/tentative/corner-shape/corner-shape-bevel-overflow-ref.html", + "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-top-left-shape=scoop&border-radius=40px", "==" ] ], @@ -136303,25 +136499,22 @@ [ [ 0, - 32 + 180 ], [ 0, - 32 + 520 ] ] ] ] } - ] - ], - "corner-shape-fill.html": [ - "6e5df8364c5fa57398644a72d40ca0e3dc8b2b65", + ], [ - null, + "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-top-left-shape=scoop&corner-top-right-shape=scoop&border-radius=50%", [ [ - "/css/css-borders/tentative/corner-shape/corner-shape-fill-ref.html", + "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-top-left-shape=scoop&corner-top-right-shape=scoop&border-radius=50%", "==" ] ], @@ -136332,25 +136525,22 @@ [ [ 0, - 32 + 180 ], [ 0, - 32 + 520 ] ] ] ] } - ] - ], - "corner-shape-notch.html": [ - "79f64070bd8389e5cdcf01566bb0da117d1f313a", + ], [ - null, + "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-top-left-shape=superellipse(0.2)&border-radius=40px", [ [ - "/css/css-borders/tentative/corner-shape/corner-shape-notch-ref.html", + "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-top-left-shape=superellipse(0.2)&border-radius=40px", "==" ] ], @@ -136361,25 +136551,22 @@ [ [ 0, - 64 + 180 ], [ 0, - 64 + 520 ] ] ] ] } - ] - ], - "corner-shape-render.html": [ - "6b9acb3447f7745757ca4f749057cd5177e8d59e", + ], [ - "css/css-borders/tentative/corner-shape/corner-shape-render.html?corner-bottom-left-shape=bevel", + "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-top-left-shape=superellipse(0.3)&border-radius=40%", [ [ - "/css/css-borders/tentative/corner-shape/corner-shape-render-ref.html?corner-bottom-left-shape=bevel", + "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-top-left-shape=superellipse(0.3)&border-radius=40%", "==" ] ], @@ -136390,11 +136577,11 @@ [ [ 0, - 82 + 180 ], [ 0, - 800 + 520 ] ] ] @@ -136402,10 +136589,10 @@ } ], [ - "css/css-borders/tentative/corner-shape/corner-shape-render.html?corner-bottom-right-shape=bevel", + "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-top-left-shape=superellipse(0.8)&border-radius=40px", [ [ - "/css/css-borders/tentative/corner-shape/corner-shape-render-ref.html?corner-bottom-right-shape=bevel", + "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-top-left-shape=superellipse(0.8)&border-radius=40px", "==" ] ], @@ -136416,11 +136603,11 @@ [ [ 0, - 82 + 180 ], [ 0, - 800 + 520 ] ] ] @@ -136428,10 +136615,10 @@ } ], [ - "css/css-borders/tentative/corner-shape/corner-shape-render.html?corner-bottom-right-shape=bevel&corner-bottom-left-shape=bevel", + "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-top-left-shape=superellipse(1.2)&border-radius=40px", [ [ - "/css/css-borders/tentative/corner-shape/corner-shape-render-ref.html?corner-bottom-right-shape=bevel&corner-bottom-left-shape=bevel", + "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-top-left-shape=superellipse(1.2)&border-radius=40px", "==" ] ], @@ -136442,11 +136629,11 @@ [ [ 0, - 82 + 180 ], [ 0, - 800 + 520 ] ] ] @@ -136454,10 +136641,10 @@ } ], [ - "css/css-borders/tentative/corner-shape/corner-shape-render.html?corner-shape=bevel", + "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-top-left-shape=superellipse(6)&border-radius=20%&border-width=10px", [ [ - "/css/css-borders/tentative/corner-shape/corner-shape-render-ref.html?corner-shape=bevel", + "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-top-left-shape=superellipse(6)&border-radius=20%&border-width=10px", "==" ] ], @@ -136468,11 +136655,11 @@ [ [ 0, - 82 + 180 ], [ 0, - 800 + 520 ] ] ] @@ -136480,10 +136667,10 @@ } ], [ - "css/css-borders/tentative/corner-shape/corner-shape-render.html?corner-top-left-shape=bevel", + "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-top-right-shape=bevel&border-width=10px&border-color=black", [ [ - "/css/css-borders/tentative/corner-shape/corner-shape-render-ref.html?corner-top-left-shape=bevel", + "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-top-right-shape=bevel&border-width=10px&border-color=black", "==" ] ], @@ -136494,11 +136681,11 @@ [ [ 0, - 82 + 180 ], [ 0, - 800 + 520 ] ] ] @@ -136506,10 +136693,10 @@ } ], [ - "css/css-borders/tentative/corner-shape/corner-shape-render.html?corner-top-left-shape=bevel&border-radius=40px", + "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-top-right-shape=superellipse(0.1)&border-top-right-radius=50px", [ [ - "/css/css-borders/tentative/corner-shape/corner-shape-render-ref.html?corner-top-left-shape=bevel&border-radius=40px", + "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-top-right-shape=superellipse(0.1)&border-top-right-radius=50px", "==" ] ], @@ -136520,22 +136707,25 @@ [ [ 0, - 82 + 180 ], [ 0, - 800 + 520 ] ] ] ] } - ], + ] + ], + "corner-shape-bevel-overflow-composite.html": [ + "985b5efdc9b9c868465d658e5486cd1e7eae5fd5", [ - "css/css-borders/tentative/corner-shape/corner-shape-render.html?corner-top-right-shape=bevel", + null, [ [ - "/css/css-borders/tentative/corner-shape/corner-shape-render-ref.html?corner-top-right-shape=bevel", + "/css/css-borders/tentative/corner-shape/corner-shape-bevel-overflow-composite-ref.html", "==" ] ], @@ -136546,22 +136736,25 @@ [ [ 0, - 82 + 100 ], [ 0, - 800 + 255 ] ] ] ] } - ], + ] + ], + "corner-shape-bevel-overflow.html": [ + "df604db8d13888a2c59488e374ee27ebe6878001", [ - "css/css-borders/tentative/corner-shape/corner-shape-render.html?corner-top-right-shape=bevel&corner-bottom-right-shape=bevel&border-bottom-right-radius=80px&border-width=32px", + null, [ [ - "/css/css-borders/tentative/corner-shape/corner-shape-render-ref.html?corner-top-right-shape=bevel&corner-bottom-right-shape=bevel&border-bottom-right-radius=80px&border-width=32px", + "/css/css-borders/tentative/corner-shape/corner-shape-bevel-overflow-ref.html", "==" ] ], @@ -136572,22 +136765,25 @@ [ [ 0, - 82 + 32 ], [ 0, - 800 + 32 ] ] ] ] } - ], + ] + ], + "corner-shape-fill.html": [ + "6e5df8364c5fa57398644a72d40ca0e3dc8b2b65", [ - "css/css-borders/tentative/corner-shape/corner-shape-render.html?corner-top-right-shape=bevel&corner-bottom-right-shape=bevel&border-radius=80px", + null, [ [ - "/css/css-borders/tentative/corner-shape/corner-shape-render-ref.html?corner-top-right-shape=bevel&corner-bottom-right-shape=bevel&border-radius=80px", + "/css/css-borders/tentative/corner-shape/corner-shape-fill-ref.html", "==" ] ], @@ -136598,11 +136794,40 @@ [ [ 0, - 82 + 32 ], [ 0, - 800 + 32 + ] + ] + ] + ] + } + ] + ], + "corner-shape-notch.html": [ + "79f64070bd8389e5cdcf01566bb0da117d1f313a", + [ + null, + [ + [ + "/css/css-borders/tentative/corner-shape/corner-shape-notch-ref.html", + "==" + ] + ], + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 64 + ], + [ + 0, + 64 ] ] ] @@ -154382,6 +154607,32 @@ {} ] ], + "at-supports-selector-details-content-before.html": [ + "731b2c4d6d2f6f871f41ffb4cf6a2e700d992f64", + [ + null, + [ + [ + "/css/css-conditional/at-supports-001-ref.html", + "==" + ] + ], + {} + ] + ], + "at-supports-selector-details-content.html": [ + "89e7606de5b27d586468a9ef98788c2988d8adf6", + [ + null, + [ + [ + "/css/css-conditional/at-supports-001-ref.html", + "==" + ] + ], + {} + ] + ], "at-supports-selector-detecting-invalid-in-logical-combinations.html": [ "ff4c09195a9de215117241abc0601a4f79f5cad1", [ @@ -184968,6 +185219,136 @@ ], {} ] + ], + "grid-gap-decorations-006.html": [ + "7b1187c4e44bed68af665462107fa34d7a2cfc4a", + [ + null, + [ + [ + "/css/css-gaps/tentative/grid/grid-gap-decorations-006-ref.html", + "==" + ] + ], + {} + ] + ], + "grid-gap-decorations-007.html": [ + "adc98e4bc03dd1305402ab33ed1c146f7f4c5718", + [ + null, + [ + [ + "/css/css-gaps/tentative/grid/grid-gap-decorations-007-ref.html", + "==" + ] + ], + {} + ] + ], + "grid-gap-decorations-008.html": [ + "f8dc0df36e2d7a4a30576e60180647bf7b2edb94", + [ + null, + [ + [ + "/css/css-gaps/tentative/grid/grid-gap-decorations-008-ref.html", + "==" + ] + ], + {} + ] + ], + "grid-gap-decorations-009.html": [ + "0756b9294be1daae5af190bf27235fdc23f9c5f8", + [ + null, + [ + [ + "/css/css-gaps/tentative/grid/grid-gap-decorations-009-ref.html", + "==" + ] + ], + {} + ] + ], + "grid-gap-decorations-010.html": [ + "d9201b51cea33053cdab2d55ddb10b06acc7f629", + [ + null, + [ + [ + "/css/css-gaps/tentative/grid/grid-gap-decorations-010-ref.html", + "==" + ] + ], + {} + ] + ], + "grid-gap-decorations-011.html": [ + "c0540398d0533e66d2f86a3aa15cf4998a4e74f4", + [ + null, + [ + [ + "/css/css-gaps/tentative/grid/grid-gap-decorations-011-ref.html", + "==" + ] + ], + {} + ] + ], + "grid-gap-decorations-012.html": [ + "26ba45a14ff9b1526bfe44e480171e0f95a0e8a7", + [ + null, + [ + [ + "/css/css-gaps/tentative/grid/grid-gap-decorations-012-ref.html", + "==" + ] + ], + {} + ] + ], + "grid-gap-decorations-013.html": [ + "4a056134089e58169ae0769633c30ed1ca160478", + [ + null, + [ + [ + "/css/css-gaps/tentative/grid/grid-gap-decorations-013-ref.html", + "==" + ] + ], + {} + ] + ], + "grid-gap-decorations-014.html": [ + "97ad626e1f24cd489a4470c84118d1161b4c46e2", + [ + null, + [ + [ + "/css/css-gaps/tentative/grid/grid-gap-decorations-014-ref.html", + "==" + ] + ], + {} + ] + ], + "grid-gap-decorations-015.html": [ + "e575c134353b2c97e16a1440e25fc5d6a28cadc9", + [ + null, + [ + [ + "/css/css-gaps/tentative/grid/grid-gap-decorations-015-ref.html", + "==" + ] + ], + {} + ] ] } } @@ -192325,7 +192706,7 @@ ] ], "masonry-grid-item-self-baseline-002a.html": [ - "6708e58332808b1bba0f20db46cfa062270956b8", + "4ece8d754d3d686e4691f5140af9b7f14503e036", [ null, [ @@ -192338,7 +192719,7 @@ ] ], "masonry-grid-item-self-baseline-002b.html": [ - "34911b7c9fa632da919b769e015148e2b8c4c488", + "cc0eaaa9cc27dc3e54f660314d63f155a838212e", [ null, [ @@ -192998,7 +193379,7 @@ ] ], "masonry-item-placement-004.html": [ - "52867cd4a213530e8cb9640b20371a7f35bbaac8", + "92741f4b1153ff7487a84e4f053c1288bcd2fa0f", [ null, [ @@ -193011,7 +193392,7 @@ ] ], "masonry-item-placement-005.html": [ - "7d4993fb3a61a015af6098e1f79d7e5f94d1b17e", + "f879ddce562b40133ac6e5522b86c4bd177c85ef", [ null, [ @@ -193024,7 +193405,7 @@ ] ], "masonry-item-placement-006.html": [ - "467e313d339776a90d994459991724b75210e1b9", + "0f963762af5a71a73ddbbaa1a6f01ab0396d875a", [ null, [ @@ -193037,7 +193418,7 @@ ] ], "masonry-item-placement-007.html": [ - "4c8053ba666b5c6ddc3b61f74a2233151414e4ff", + "ebbed114a1171a3218be7e1378c199cb82c0fe97", [ null, [ @@ -193062,19 +193443,6 @@ {} ] ], - "masonry-rows-item-placement-auto-flow-next-001.html": [ - "c425490d2d8f464e9fae0a1777c4c8366cb283af", - [ - null, - [ - [ - "/css/css-grid/masonry/tentative/item-placement/masonry-rows-item-placement-auto-flow-next-001-ref.html", - "==" - ] - ], - {} - ] - ], "masonry-rows-with-grid-width-changed.html": [ "3a1c4cfa9c065425d8de17dba157663f6024711c", [ @@ -193128,19 +193496,6 @@ ], {} ] - ], - "masonry-order-002.html": [ - "5ebdec27193a454e98fb54ea48508c2b26b3cfa8", - [ - null, - [ - [ - "/css/css-grid/masonry/tentative/order/masonry-order-002-ref.html", - "==" - ] - ], - {} - ] ] }, "subgrid": { @@ -196656,6 +197011,19 @@ {} ] ], + "conic-gradient-001.html": [ + "37e41094fb28a03d3dbbcd6e88c0c36e1e520b62", + [ + null, + [ + [ + "/css/css-images/gradient/conic-gradient-001-ref.html", + "==" + ] + ], + {} + ] + ], "css-color-4-colors-default-to-oklab-gradient.html": [ "2b1edca0da1e168c3fa921202c54346b911f354a", [ @@ -196724,6 +197092,19 @@ {} ] ], + "gradient-analogous-missing-components-004.html": [ + "286caa0226a529082daf4b63c60a846344d5f826", + [ + null, + [ + [ + "/css/css-images/gradient/gradient-analogous-missing-components-004-ref.html", + "==" + ] + ], + {} + ] + ], "gradient-decreasing-hue-hsl.html": [ "973974417ea306380adc4f3fc3e75b6daa0b9af9", [ @@ -196870,7 +197251,7 @@ ] ], "gradient-eval-004.html": [ - "ada406fd2a0ec8bea1af74daeafc95563174ac1f", + "1a9c43610f41cb8cab10543ffcc3fd7ee378dd07", [ null, [ @@ -196890,7 +197271,7 @@ ], [ 0, - 10000 + 2000 ] ] ] @@ -200413,7 +200794,7 @@ ] ], "object-fit-containcontainintrinsicsize-png-001c.tentative.html": [ - "b17f59f887f216f11a386077c41156388624ee27", + "dd1bf249a5555aaeec924de5d944442b55452e2f", [ null, [ @@ -200465,7 +200846,7 @@ ] ], "object-fit-containsize-png-001c.tentative.html": [ - "43a50adcedcf2bcdf81d86f717ec52e6a96e0f1a", + "733b7592f3ba8f748300c7ee681b765ba66cb559", [ null, [ @@ -216381,6 +216762,123 @@ {} ] ], + "column-height-001.html": [ + "cb7cb6323f5a77fe0d461cd687fa589dd66a038a", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "column-height-002.html": [ + "902076a65a8d224059cb4e9ad57ad024bf888c00", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "column-height-003.html": [ + "879358c1803c49374f98092aaa7301c03ed30ddb", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "column-height-004.html": [ + "07107f3c3695038030e09395b49831d000d58eef", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "column-height-005.html": [ + "e131d62ee5dbeb8f13e68427983f0bc85d2c99c0", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "column-height-006.html": [ + "773f25edd5c7b6015c8d2185c0f6dca8a189aeb0", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "column-height-007.html": [ + "4e7308dbd12025ea9d0b9b2b930595a974fb8ee7", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "column-height-008.html": [ + "f8ef2b1477f4be36a2300bc7b45d2393a4abb56d", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "column-height-009.html": [ + "1e08242e0f9c9dc415854af29ce04a6e7ee2ef9e", + [ + null, + [ + [ + "/css/css-multicol/column-height-009-ref.html", + "==" + ] + ], + {} + ] + ], "column-pseudo-background-color.html": [ "f321b1076eb58fcc00add55ab9f7dacd9daa2fba", [ @@ -225434,6 +225932,58 @@ {} ] ], + "scroll-marker-contain-001.tentative.html": [ + "93d7df72508d19d89ac6c2d775e24a1937b660aa", + [ + null, + [ + [ + "/css/css-overflow/scroll-marker-contain-001-ref.tentative.html", + "==" + ] + ], + {} + ] + ], + "scroll-marker-contain-002.tentative.html": [ + "af2a5e668be4673ae5d976fa901fd5106dc8ad1c", + [ + null, + [ + [ + "/css/css-overflow/scroll-marker-contain-002-ref.tentative.html", + "==" + ] + ], + {} + ] + ], + "scroll-marker-contain-003.tentative.html": [ + "59daa5cf5ced7c57248cfbbf4fef637ad91728be", + [ + null, + [ + [ + "/css/css-overflow/scroll-marker-contain-003-ref.tentative.html", + "==" + ] + ], + {} + ] + ], + "scroll-marker-contain-004.tentative.html": [ + "2ec6f6bde76fb3c16b04628f49415edda014985e", + [ + null, + [ + [ + "/css/css-overflow/scroll-marker-contain-001-ref.tentative.html", + "==" + ] + ], + {} + ] + ], "scroll-marker-counters.html": [ "25e4fdfd24f849128c711cdc5a8610abba5e1d8f", [ @@ -230468,6 +231018,19 @@ {} ] ], + "position-sticky-table-pixel-rounding.html": [ + "3bda20efc9d7381f5967810711d552fe4a2a57b8", + [ + null, + [ + [ + "/css/css-position/sticky/position-sticky-table-pixel-rounding-ref.html", + "==" + ] + ], + {} + ] + ], "position-sticky-table-td-bottom.html": [ "7cd3b8d695e00a68e58c9016aa2990eaf78ba846", [ @@ -236544,6 +237107,19 @@ {} ] ], + "host-has-internal-004.html": [ + "fe51186f59f88bdfcf5ed8641938b7491024bfda", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square-only.html", + "==" + ] + ], + {} + ] + ], "host-is-001.html": [ "16d0dd76691362ee963e386a2fd238783c096243", [ @@ -244508,7 +245084,7 @@ ] ], "replaced-element-013.html": [ - "bcbf653d68af4c1f908a59ca6e66e5752a09c833", + "564858e360eee6aaa676224fe342409d06486f1b", [ null, [ @@ -244521,7 +245097,7 @@ ] ], "replaced-element-014.html": [ - "4c1ad16ce8624295251b73d1a14f53b9c9905610", + "8b7bdafc10770d3f3371c5ec7a699f4189c982cb", [ null, [ @@ -244845,6 +245421,32 @@ {} ] ], + "replaced-element-045.html": [ + "3339de4cb7dfc7aaf7cb8f27de542515626a0563", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "replaced-element-046.html": [ + "13a9fd99513aa622bf1338a497d5810822de1aaf", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "replaced-element-dynamic-aspect-ratio.html": [ "d4b83d3673cbfba940baec1c88f3e6630c760eb4", [ @@ -265245,7 +265847,7 @@ ] ], "text-wrap-balance-before-after-001.html": [ - "9f5741e23492875670f1406e934a1306bdd51973", + "7176768b8df4fe19d63188097cd8be96c43ae1cb", [ null, [ @@ -265258,7 +265860,7 @@ ] ], "text-wrap-balance-before-after-002.html": [ - "e9d08953fac0963ba2a9639ac9aabb6f3f59764b", + "60e3a777df33b008284669c35c64742ea19d6ba0", [ null, [ @@ -304533,6 +305135,35 @@ } ] ], + "nested-root-capture-with-clip.html": [ + "eb728182865eb5388053b0039e22d9f75f5da8f6", + [ + null, + [ + [ + "/css/css-view-transitions/nested/nested-root-capture-with-clip-ref.html", + "==" + ] + ], + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 40 + ], + [ + 0, + 400 + ] + ] + ] + ] + } + ] + ], "normal-goes-up.tentative.html": [ "f68c93d474425d958b46c3dcd2d29197f797fbdd", [ @@ -307183,6 +307814,19 @@ {} ] ], + "font-size-keyword-specified.html": [ + "fc724307f46bc5c77f8599f07e4cca1411d6d0e3", + [ + null, + [ + [ + "/css/css-viewport/zoom/font-size-keyword-specified-ref.html", + "==" + ] + ], + {} + ] + ], "font-size.html": [ "e572806be41f21297b6b864f9b74378de35a28c6", [ @@ -325286,6 +325930,19 @@ {} ] ], + "feComposite-intersection-feTile-input.html": [ + "1bf1f4b8fba8ca37705e276d8c72888f01db4954", + [ + null, + [ + [ + "/css/filter-effects/feComposite-intersection-feTile-input-ref.html", + "==" + ] + ], + {} + ] + ], "fecolormatrix-negative.html": [ "eddec862154fc9929a9f7ad8f9cbb0a7d182ef18", [ @@ -346604,6 +347261,19 @@ ] }, "the-option-element": { + "option-label-whitespace-2.html": [ + "95b3a3c73db92ee641384fb54c599c9765bf9004", + [ + null, + [ + [ + "/html/rendering/replaced-elements/the-option-element/option-label-whitespace-2-ref.html", + "!=" + ] + ], + {} + ] + ], "option-label-whitespace.html": [ "aad1039d7b4f1c0078b622a94bc6364b992e60af", [ @@ -347338,7 +348008,7 @@ ] ], "field-sizing-textarea-relayout.html": [ - "1e18bd2070377923ec1e29d012ddcf94ad7aa6a2", + "579462ca2f579b7360790c3ad3a63d0de45e4c41", [ null, [ @@ -347353,11 +348023,11 @@ null, [ [ - 153, + 0, 153 ], [ - 2, + 0, 2 ] ] @@ -366932,7 +367602,7 @@ [] ], "docker.yml": [ - "6d5c7c79a05faeaeb5e18040ceedaf99240020c4", + "9119c018c2f88232b4aea1bd22e8d69bc9aa3af0", [] ], "documentation.yml": [ @@ -370269,6 +370939,10 @@ [] ], "support": { + "clear-cache-helper.sub.js": [ + "2b2d35abfc571969f414d6f8f7d61f9ac189f284", + [] + ], "clear-site-data-cache.py": [ "38f131bdd52b51250204cca79972d93a62ace715", [] @@ -409787,6 +410461,10 @@ "b07685d951735d521418a98e2b7bf283a068019b", [] ], + "root-element-background-margin-opacity-ref.html": [ + "afe543029d800f5b3c53c1c2179e981693c033ba", + [] + ], "root-element-background-transparency-ref.html": [ "4671d44c1c3f3e2ff16149cbaabebb0433aef3e5", [] @@ -410225,6 +410903,10 @@ "398217c4587e0c5f5364b00b8b39b49885c7f27b", [] ], + "animate-with-background-color-oklch-001-ref.html": [ + "92b91077f3fe1cc66cca5b5202cd5d9a2d5f6b50", + [] + ], "animation-common-ref.html": [ "ddc7da67ddf5fed83e653d1130a65f5c1e3a6dec", [] @@ -412436,7 +413118,7 @@ "tentative": { "corner-shape": { "corner-shape-any-ref.html": [ - "688f01c8668554efce1ccde22ebf2b12a2ff61c8", + "36fc7a88825fea38ad5cfcdf544946e3644cc00b", [] ], "corner-shape-bevel-overflow-composite-ref.html": [ @@ -412455,25 +413137,21 @@ "8963c0ca2939c4036d9505461c9772b803b586f2", [] ], - "corner-shape-render-ref.html": [ - "1a9043cbc827f4ef4b1ba753e1fae278647de5f2", - [] - ], "corner-shape-straight-ref.html": [ "4576240ef3288a954c9a627cbafd640eacd95444", [] ], "resources": { "corner-shape.js": [ - "2aaaf5ed28987608fba8f4f8b756cd3062e82498", + "6de6c9a5d7ef206f8f6bebae651a0e93b55cec77", [] ], "corner-utils.js": [ - "39203aefc67d57e9e0128112e60ac5b01e147d95", + "bacaaa8a6e4ae7f68bab460e8e98b292d103bb69", [] ], "resolve-corner-style.js": [ - "ea065f577e09c30b56cf1171685375b7aefeebc7", + "b584994b4ea52295381f4c79b34fa63a78afec7a", [] ] } @@ -420341,14 +421019,6 @@ "ea32e1787e58047763ca26ca575e5ff67325d110", [] ], - "Lato-Medium-Liga.ttf": [ - "3a0beaea38b8bc0cbf6fa656bf23e28cfdf18c6f", - [] - ], - "Lato-Medium.ttf": [ - "2c612da2ae589dc264deb683f90baf75c8e18e03", - [] - ], "LigatureSymbolsWithSpaces.woff": [ "1f0e7ca0076ae09f3fdea656052a1a08ab2b1111", [] @@ -426636,6 +427306,46 @@ "grid-gap-decorations-005-ref.html": [ "aebfba5a20e97e826e27e27c0ce962f6f675eba2", [] + ], + "grid-gap-decorations-006-ref.html": [ + "f77ec2a9d43899e971dea9ee1596595561fe2bf8", + [] + ], + "grid-gap-decorations-007-ref.html": [ + "9d74fa00f41fd5599f8c9d4c6d32b5b69363d42b", + [] + ], + "grid-gap-decorations-008-ref.html": [ + "200a2621a2181d52e1a16fc6919f944ee08f0b36", + [] + ], + "grid-gap-decorations-009-ref.html": [ + "11d8267235b8a24a9118b0b638a9a0519e69b784", + [] + ], + "grid-gap-decorations-010-ref.html": [ + "747391cfedc88bd46f3a13ca8895d5bc6101a6d2", + [] + ], + "grid-gap-decorations-011-ref.html": [ + "c49eb95f72eff1e8ed657fbead3243abd57af908", + [] + ], + "grid-gap-decorations-012-ref.html": [ + "ded98fa1c8d314be49ed7a2d3159fea2d7efe0d7", + [] + ], + "grid-gap-decorations-013-ref.html": [ + "bd8456f525ef3cc6406658db68b893baa0352301", + [] + ], + "grid-gap-decorations-014-ref.html": [ + "25a930a51af81d12ebc8e5fa4dcedff31510c0dc", + [] + ], + "grid-gap-decorations-015-ref.html": [ + "0937a62da6f153b1df1facb3ad8b472d57339784", + [] ] } } @@ -427093,7 +427803,7 @@ [] ], "grid-item-aspect-ratio-stretch-4-ref.html": [ - "8d7fc870fae1ad7f969b7a9de4035da783c1dae4", + "8c251a9d9f002041354bb252baf12e694b6a2207", [] ], "grid-item-content-baseline-001-ref.html": [ @@ -427795,7 +428505,7 @@ [] ], "masonry-intrinsic-sizing-rows-003-fr-ref.html": [ - "ca2aaef482dc6207913d66db1d38fba4e21f43b0", + "41a032712a21a28b2710630425391f7f63d15402", [] ], "masonry-intrinsic-sizing-rows-003-mix1-ref.html": [ @@ -427819,7 +428529,7 @@ [] ], "masonry-intrinsic-sizing-rows-004-mix2-ref.html": [ - "97e6b3ea2922b8810d5bc940caad3eb48b3ac371", + "4d1470896c8e828f3aa52d6e6dc701f76fbd31a0", [] ], "masonry-intrinsic-sizing-rows-005-ref.html": [ @@ -427851,29 +428561,25 @@ [] ], "masonry-item-placement-004-ref.html": [ - "75d6b741c2f04de618708486dfbd0e066b4fc738", + "ba9c72f292553fe9ad54c6c218741b0126ba7bde", [] ], "masonry-item-placement-005-ref.html": [ - "806f314300dd1c9127a8f59ba9e1bb09c6d99265", + "bd5d55262a3c0579fa208b85aab10c74b9a071d1", [] ], "masonry-item-placement-006-ref.html": [ - "a6e9b75d0e61ce1404229781f5d55da34c4d2a68", + "a54476a6ba806d5b003b74a8c8fd12dfca1dfc0e", [] ], "masonry-item-placement-007-ref.html": [ - "50236046fb0610dcac5723f212ab69a9155847b1", + "5c1fd18b3d14664e3908d98f2af3fbce0da1b580", [] ], "masonry-item-placement-008-ref.html": [ "f3503bf071131f396111956dcc0ebddf5e9bd051", [] ], - "masonry-rows-item-placement-auto-flow-next-001-ref.html": [ - "cbb3e825a4b76d28dc6e93b53eeeea1b5e40a118", - [] - ], "masonry-rows-with-grid-width-changed-ref.html": [ "71c081f2cac1b1f358b484834ab0c5f8df68625c", [] @@ -427887,10 +428593,6 @@ "masonry-order-001-ref.html": [ "6f20bd05838efed10a0915b30941ff7bcbb73b6a", [] - ], - "masonry-order-002-ref.html": [ - "15be3fde83710c6a7876a5befa8d91dc9f26f8e7", - [] ] }, "subgrid": { @@ -428658,6 +429360,10 @@ "28d57bc19c779250d792eafc2d5e4461baece0d5", [] ], + "conic-gradient-001-ref.html": [ + "2f12c01bb5fe1aee2f1eedd2461133ed257f3bf9", + [] + ], "gradient-analogous-missing-components-001-ref.html": [ "5e89048bf00d924bc63fce23301c59c0a4a3c417", [] @@ -428670,6 +429376,10 @@ "134388315a03691bdd20e77cf7d54ba959e9b7fb", [] ], + "gradient-analogous-missing-components-004-ref.html": [ + "09f168115bee8485e27da66a686d888cfcc3259b", + [] + ], "gradient-decreasing-hue-hsl-ref.html": [ "df6dc90ac033e4d00fca3e8f5f6e7ad998aa4c6c", [] @@ -428691,7 +429401,7 @@ [] ], "gradient-eval-004-ref.html": [ - "f197386bcfb4af5bc084fd262cc29a73f2329ffe", + "f28b30137cdc176fa6c9134ffecbb981e87da557", [] ], "gradient-eval-005-ref.html": [ @@ -432013,6 +432723,10 @@ "f0ee4df8c9de3a77fb39b40942dbf0743312494f", [] ], + "column-height-009-ref.html": [ + "034440ebd5c81be43f0d871d3adb276b2a735768", + [] + ], "column-pseudo-background-color-ref.html": [ "8a6d741542939fda5e165f56129a44fdd2e950a9", [] @@ -433865,6 +434579,18 @@ "dca775fcecadf26d115e3961da6affb519b0fdba", [] ], + "scroll-marker-contain-001-ref.tentative.html": [ + "69e9167cc33a2ec61e47ea9c2199141c028424b2", + [] + ], + "scroll-marker-contain-002-ref.tentative.html": [ + "3fa777f7863f1f5e395e3304f6fbd763a9cf206e", + [] + ], + "scroll-marker-contain-003-ref.tentative.html": [ + "09bb93d4ebcefa99f22ae932626bf21c0b6ba528", + [] + ], "scroll-marker-counters-ref.html": [ "7113a5c5d23a97cf83f173a72ef96b57ecf09263", [] @@ -435552,6 +436278,10 @@ "9ba42e18b2bc6d37ac1d98af14d30f9894d4e2bc", [] ], + "position-sticky-table-pixel-rounding-ref.html": [ + "83313e0ad109ffee6bc313d9814aa26866e839f7", + [] + ], "position-sticky-table-td-bottom-ref.html": [ "e851315641e0212bcbc2453b56e831422b6d6c32", [] @@ -445741,7 +446471,7 @@ [] ], "properties.js": [ - "81cf9d46d5ff575e16b955ec2d64f579699fd441", + "e450208389086aa559b576eeea723800c3acf933", [] ], "ruler-h-50%.png": [ @@ -448306,7 +449036,7 @@ [] ], "navigate-after-hide.html": [ - "0b6a3d669e89e07b6b6476dcdaafef3157fdaa77", + "9bed19eda2a0187a18583f05a151ca0ebb1247a2", [] ], "opt-in-style.css": [ @@ -448392,6 +449122,10 @@ "d189a460c7cb5147b04367d4e56aac0ae751c6d5", [] ], + "nested-root-capture-with-clip-ref.html": [ + "0e2c7d025431898870762711a18e38150448985a", + [] + ], "resources": { "compute-common.css": [ "20337ccce5f3387e7e70e6fb219544369b74aa06", @@ -448808,6 +449542,10 @@ "d1b9a0d68dd5cf15d035896a6e4deac59b950310", [] ], + "font-size-keyword-specified-ref.html": [ + "3395465c5d59422520d62002618e406e97e63423", + [] + ], "font-size-ref.html": [ "30eaa4aeb9fcae4e42ca2061358bd976e9144eee", [] @@ -451448,7 +452186,7 @@ [] ], "wm-propagation-body-044-ref.html": [ - "9cf46c0b214652ca0bd7f28fe88c7943f6ccef8c", + "f61f97c9a1de34e246f1edb056cab56cc6db62b7", [] ], "wm-propagation-body-047-ref.html": [ @@ -451826,6 +452564,10 @@ "b0dbb071d5b05d1c574cd5c9a660f1e3d62c573b", [] ], + "action-utils.js": [ + "c3ab5272da666146564deae7fc6ab9ffbec3a9e4", + [] + ], "b-green.css": [ "a0473f5ca26652c1229290bbf1f81eabc1e37280", [] @@ -452227,6 +452969,10 @@ "21c33ea1cd44fa23f6f92c3881e6ef22d33587d2", [] ], + "feComposite-intersection-feTile-input-ref.html": [ + "4345e3d8ac143dfffef9638d75481bfe40630163", + [] + ], "fecolormatrix-negative-ref.html": [ "95a0051c18a1219012e48ad91e58ecc213ba24b6", [] @@ -457272,6 +458018,10 @@ "e38d492da0a2c22c30bdc799b6b06c224bfec136", [] ], + "WEB_FEATURES.yml": [ + "b20102ff2a34622e493481126f59717660d9d2fd", + [] + ], "resources": { "crossiframe-childframe.html": [ "6a8bc6b64240636dbc576aaa15b9c86b799dae8e", @@ -460240,7 +460990,7 @@ [] ], "README.md": [ - "a69aab487239021088f944b0a8cee2dad4b3d111", + "cbb5b85b74d1347b93c7f0e480cf978262da6b03", [] ], "resources": { @@ -460507,7 +461257,7 @@ [] ], "ba-fledge-util.sub.js": [ - "3371813feee6e11dedd71126ca1b354e64021d73", + "8fa4eb1e3514274e9ca179253fdae56150ccf07b", [] ], "ba-public-keys": [ @@ -460535,7 +461285,7 @@ [] ], "fledge-util.sub.js": [ - "ebd2b44b9928a9c72e93112f226e51cfa54d4094", + "e0d5d99bb6553e441de6e4a8213cf114002666f0", [] ], "fledge_http_server_util.py": [ @@ -460567,7 +461317,7 @@ [] ], "service-worker-helper.js": [ - "cc00181359740b51f83c3289cfc215252123b67e", + "2b94dc60e0175996ac27dfcc8df93ef573978a56", [] ], "service-worker-helper.js.headers": [ @@ -461226,6 +461976,14 @@ "2d3bf3ed873e8b1d361afbd8aacaee3f3d0b6251", [] ], + "Lato-Medium-Liga.ttf": [ + "3a0beaea38b8bc0cbf6fa656bf23e28cfdf18c6f", + [] + ], + "Lato-Medium.ttf": [ + "2c612da2ae589dc264deb683f90baf75c8e18e03", + [] + ], "META.yml": [ "5b04a86e6ef33a371a3e4199fff4cd8d2fc6e25b", [] @@ -467051,11 +467809,11 @@ [] ], "canvas-promise-test-worker.js": [ - "f5410efca5b92d3b1272f94a9049027972698996", + "2cb50c322f7978c12bbc10faed1d8302ad58d79a", [] ], "canvas-promise-test.js": [ - "1b2e2b3a584a1740c01e6911f6e5c72b0a5aafda", + "09e01633ace2fc9157ae8b98f47fed3edc7a90d9", [] ], "canvas-spec.css": [ @@ -467220,7 +467978,7 @@ [] ], "text.yaml": [ - "48a0429f267d281927fad8d59dd6a791e6f029ac", + "900431860e27fa1c41276cc43bc961ea3da45270", [] ], "the-canvas-state.yaml": [ @@ -473239,6 +473997,10 @@ ] }, "the-option-element": { + "option-label-whitespace-2-ref.html": [ + "b0567c2b4e33f48efe31b62620f243b0089f0589", + [] + ], "option-label-whitespace-ref.html": [ "acb4f9ee2478898eb648c00ea6b9f6ed0e71c7a7", [] @@ -482232,6 +482994,10 @@ "e11810cc10fa16774924fe8a8080ab5aae161ac7", [] ], + "WEB_FEATURES.yml": [ + "fbd4cc58df949323199f8832a72592f6e00d8b5f", + [] + ], "resources": { "iframe-stores-entry.html": [ "cd600254805570deab8447ea843657d7f268b7c5", @@ -482324,7 +483090,7 @@ ] }, "lint.ignore": [ - "65e22dccbc1d9cce01a6c570fe739e68d112df3e", + "8df85b016fe85482344b9d5cbe76f1e15a8d8827", [] ], "loading": { @@ -490113,7 +490879,7 @@ [] ], "testdriver.js": [ - "05301bf55895eef71dc7e949871388f8f9cd7a49", + "b63d5b176636bfc2477cae4a9858872530211394", [] ], "testdriver.js.headers": [ @@ -490272,7 +491038,7 @@ [] ], "sandboxed-iframe-locking.html": [ - "436c67f5b53b1f88ef1537072be3b0011724d7b3", + "f4773535dbc3d21319f8dd7a398ff7731d19a240", [] ] } @@ -490314,6 +491080,14 @@ "adf4bf2ac173e8bff0978fa19b24e535f4229c2e", [] ], + "animation-trigger": { + "support": { + "support.js": [ + "f5aa18e82f19f7fa56b2853e2c46b21342b7d970", + [] + ] + } + }, "css": { "animation-fill-outside-range-ref.html": [ "998576b3a4f2257006232506ee32306bc716895c", @@ -494732,6 +495506,14 @@ "8cfe09a41fe2ac32e734073329681bb74962eb03", [] ], + "protocol-handler-service-worker.js": [ + "cb6142db0e3c4b00fecfde154b77f06a3517ef9d", + [] + ], + "protocol-handler.html": [ + "210b23aae21a5ab25d48262b9f0bd31f489a7de8", + [] + ], "push.https.html": [ "30eb563ab75532d47dfc5706b81686059d19a8a0", [] @@ -494808,8 +495590,12 @@ "06688e3bd4cf6e8d251ef694ffba40b8dab95248", [] ], + "shared-storage-worklet.js": [ + "92a1a7325bb7ac7c169cc1745241d08e5717d5f4", + [] + ], "shared-storage.https.html": [ - "53edf109698d013e21c001525e00a74e9a3a5350", + "408168e4c4c7599eaa81654289b234e16b9de8a5", [] ], "shared-worker.py": [ @@ -495259,7 +496045,7 @@ ], "tentative": { "helper.js": [ - "e5e00ec7b5318d5bbe5c8542458e61b4105c5c93", + "458da38213a83f48faa772f22dbe655f75684c23", [] ] } @@ -496786,7 +497572,7 @@ [] ], "requirements_build.txt": [ - "e74e4e5302de95611631ab3193f8ae38f643f7dc", + "60c09170a98e2d16fd3e499962f59b0df8089fd3", [] ], "requirements_macos_color_profile.txt": [ @@ -508068,7 +508854,7 @@ [] ], "chrome.py": [ - "76bc652075eef3e4738ec4b276e1b19bcd55579e", + "e3ef73de6a04a354ba3d72db85dc0d149c21050a", [] ], "chrome_android.py": [ @@ -508168,7 +508954,7 @@ [] ], "actions.py": [ - "859ce8f4fa604481a029b0af624d4cddaeafd429", + "06d58e7e87b6dc9bad8c8eddadcdb2597779b24e", [] ], "asyncactions.py": [ @@ -508188,7 +508974,7 @@ [] ], "executormarionette.py": [ - "ebc4a4a565667d66af7da73332802da72fadf580", + "b4b5b2a3ea664d7652e3735e360f2b01b04c74ed", [] ], "executorselenium.py": [ @@ -508204,7 +508990,7 @@ [] ], "executorwebdriver.py": [ - "95667480afe7bd67a54f235428f12a45879bac5a", + "bea6ab57ba8ac93f5812569d489336d36ba1ac87", [] ], "executorwktr.py": [ @@ -508220,7 +509006,7 @@ [] ], "protocol.py": [ - "0940e87cdbdea9b78397a067240553f3034eb0f6", + "53a7b4378483e183d10532c50d26be1586a95dbe", [] ], "pytestrunner": { @@ -508335,7 +509121,7 @@ [] ], "testdriver-extra.js": [ - "9ddbe2e8df53886c5c3c89e5f21b62c5da760a2d", + "71c1be2732f3e62f156c2d1017eee8e8111ac254", [] ], "testdriver-vendor.js": [ @@ -509148,7 +509934,7 @@ [] ], "csp-violations.js": [ - "49649f45cd6e263bff984f0afcb5ecafbbb8a0a5", + "46c2ca1b30f33bec538b2245ed8e9a8c1a1b7c6d", [] ], "event-handler-attributes.mjs": [ @@ -509195,10 +509981,110 @@ "45053d43e362e223e0ce5e6dffb4da09c0ce3f34", [] ], + "should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker.js": [ + "dc3eb004c384b578f1217575626ba5725018f15e", + [] + ], + "should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker.js.headers": [ + "c17d57d19ae4ef9d3e584d10fc39065823cb2f73", + [] + ], + "should-trusted-type-policy-creation-be-blocked-by-csp-004-worker.js": [ + "c5c512d98a2748bfbe12880b7003a6845806c6a2", + [] + ], + "should-trusted-type-policy-creation-be-blocked-by-csp-004-worker.js.headers": [ + "c27bd116d8d25f28a411097e6d53b1dc30f3bdc5", + [] + ], + "trusted-types-reporting-check-report-create-policy-worker.js": [ + "6bb346e3195f613bc45d806b63496c7c9a0b6903", + [] + ], + "trusted-types-reporting-check-report-create-policy-worker.js.sub.headers": [ + "58beda2418334357fedf554f2dfda27aaff10040", + [] + ], + "trusted-types-reporting-check-report-create-policy.js": [ + "5d96829727b7df77c3d37c2a4f1b56f689c0742e", + [] + ], + "trusted-types-reporting-check-report-sink-mismatch-worker.js": [ + "85910e2e92622c3550e455aa61fde11a31c69a50", + [] + ], + "trusted-types-reporting-check-report-sink-mismatch-worker.js.sub.headers": [ + "5fcdf6ccbfcc9121834a2b3e04650fd185232a90", + [] + ], + "trusted-types-reporting-check-report-sink-mismatch.js": [ + "96ad9c116b4035c8787fc8bf64b776de5fc28640", + [] + ], "trusted-types-reporting-for-DOMWindowTimers-setTimeout-setInterval.js": [ "15a18304496c21f074354a8e7e0a7671cceed738", [] ], + "trusted-types-reporting-for-DedicatedWorker-constructor-worker.js": [ + "e5b09eb3707ef22b96160f7b4143b35f07728118", + [] + ], + "trusted-types-reporting-for-DedicatedWorker-constructor-worker.js.headers": [ + "54d8b1d4c1285d05cbabf7b35b0facea96284bad", + [] + ], + "trusted-types-reporting-for-DedicatedWorker-constructor.js": [ + "cb5ae4c8e2cd1b2cc20e7e1d9928cc2078106ac7", + [] + ], + "trusted-types-reporting-for-ServiceWorkerContainer-register-worker.https.js": [ + "cce29cb2f7b946d9aa0171a54b26b541204076c4", + [] + ], + "trusted-types-reporting-for-ServiceWorkerContainer-register-worker.https.js.headers": [ + "54d8b1d4c1285d05cbabf7b35b0facea96284bad", + [] + ], + "trusted-types-reporting-for-ServiceWorkerContainer-register.https.js": [ + "f59799d4776d33534d610c2fc6e83bf7c9a1deb1", + [] + ], + "trusted-types-reporting-for-SharedWorker-constructor.js": [ + "a65731a2f9c5e569e2653d46ca0740dda7c31c15", + [] + ], + "trusted-types-reporting-for-eval-worker.js": [ + "2a4780dcbaddfc8cab4dc2e3d895db94ba7f4edf", + [] + ], + "trusted-types-reporting-for-eval-worker.js.headers": [ + "54d8b1d4c1285d05cbabf7b35b0facea96284bad", + [] + ], + "trusted-types-reporting-for-eval.js": [ + "0f8120a7a1fb901b0e7836a1ba04b644228e9a28", + [] + ], + "trusted-types-reporting-for-function-constructor-worker.js": [ + "ce73b9136897416dfef0d229bd5c87ceea1e5305", + [] + ], + "trusted-types-reporting-for-function-constructor-worker.js.headers": [ + "54d8b1d4c1285d05cbabf7b35b0facea96284bad", + [] + ], + "trusted-types-reporting-for-function-constructor.js": [ + "51d04b661f4e4a0d3ad11ea90a9bb09a624a1183", + [] + ], + "trusted-types-reporting-for-importScripts.js": [ + "c8de9f8d5fdab4d4d2d82ec37eedd7785c1ceee1", + [] + ], + "trusted-types-reporting-for-importScripts.js.headers": [ + "54d8b1d4c1285d05cbabf7b35b0facea96284bad", + [] + ], "trusted-types-reporting-for-setTimeout-setInterval-worker.js": [ "7c65802c9ef09696f0f74fa386629948847c1783", [] @@ -509207,6 +510093,14 @@ "54d8b1d4c1285d05cbabf7b35b0facea96284bad", [] ], + "trusted-types-sandbox-no-allow-scripts.html": [ + "11967a4d97f80d0ce5344cb2dc309070c2ab57da", + [] + ], + "trusted-types-sandbox-no-allow-scripts.html.headers": [ + "da0823c6bc5d9682dd643ee9d6a64b4f3be47bae", + [] + ], "worker.https.js": [ "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", [] @@ -509220,28 +510114,28 @@ "b6608515aa85a08dbb56531c46c097e179c76200", [] ], - "trusted-types-eval-reporting-no-unsafe-eval.html.headers": [ - "72cebc03552da9db7a51cf88a4f709f950d5b5c9", - [] - ], "trusted-types-eval-reporting-report-only.html.headers": [ "9ab275fe6f1d4988717f004be774f84374df276f", [] ], - "trusted-types-eval-reporting.html.headers": [ - "1e57f8bf5851bc42b282a554e4d5211281850f8d", + "trusted-types-report-only.html.headers": [ + "096c0b401953f847a278792d810402e6ccc633c7", [] ], - "trusted-types-report-only.html.headers": [ - "602186027d0d759b9cc224f29de584bb9c71c198", + "trusted-types-reporting-check-report-Window-create-policy.html.sub.headers": [ + "4653c9d7031864065b600f460dd604de64886f7e", [] ], - "trusted-types-reporting-check-report.html.sub.headers": [ - "c055bdc6563685adabeffb8141a83376a0cea1f2", + "trusted-types-reporting-check-report-Window-sink-mismatch.html.sub.headers": [ + "62a0c13f0a38df5b092cdab116f4fdc556a126ec", [] ], "trusted-types-reporting.html.headers": [ - "7076f4106f73488aad64064213fda18b4c43392b", + "5809a919913781a50db9612d0173e529eac7a826", + [] + ], + "trusted-types-sandbox-allow-scripts.html.headers": [ + "6bd66164613016269ebcee6416ed41cdf312a42a", [] ] }, @@ -509938,7 +510832,7 @@ [] ], "urlpatterntestdata.json": [ - "f92ab76b71df5ab42b729ebe366e381bd9e939af", + "75f1cf8694523b63cee9c94dd90eebeb13434ba5", [] ], "urlpatterntests.js": [ @@ -511121,7 +512015,7 @@ "animation-model": { "animation-types": { "property-list.js": [ - "f31ee8e4ccf05471e94417971da6ca31b288719e", + "9cfd90d17f2e95986cd3db5999447faef9a64df6", [] ], "property-types.js": [ @@ -512505,7 +513399,7 @@ [] ], "video-encoder-utils.js": [ - "916f995156e51d7fed083d9ab175cc44d974dc6b", + "5c8d17e5bfe65ff382cc8ae617350873f7cabd4d", [] ], "videoDecoder-codec-specific-setup.js": [ @@ -514078,7 +514972,7 @@ }, "resources": { "utils.js": [ - "7cecf29061fe35408b0875ba3cf2638ea5eb0605", + "70c97a8454cdd95ad9af78702cafb0dcc7515986", [] ], "utils_validation.js": [ @@ -518778,7 +519672,7 @@ [] ], "redirect.py": [ - "3839b635e022a347a7877e9022d9820d55831588", + "e2786b45031b3d6493eeff9bbe8d7eaf7a46c566", [] ], "requri.py": [ @@ -545042,7 +545936,7 @@ "ai": { "language_detection": { "detector.https.tentative.any.js": [ - "337f11d338d495a46a6926308970768f99ac2526", + "98968415ddd2af1530a95986dc7cdb727ad61551", [ "ai/language_detection/detector.https.tentative.any.html", { @@ -545206,7 +546100,7 @@ ] ], "ai_translator_translate.tentative.https.any.js": [ - "729cb04fb76e94d9bf8eb40e463b840931b0e3a7", + "992215d921025079dfee122672fcde827c249e6a", [ "ai/translator/ai_translator_translate.tentative.https.any.html", { @@ -553102,8 +553996,8 @@ ] }, "clear-site-data": { - "clear-cache-partitioning.sub.https.html": [ - "b3841450b5a3fcfbe79857cebd7da8855754597a", + "clear-cache-partitioning.https.html": [ + "2deadeef2d0853d08a559a9af8050646fb8e3163", [ null, { @@ -553112,7 +554006,7 @@ ] ], "clear-cache.https.html": [ - "e356001d0c89e39273e3070dec43e3a66cd44171", + "c75c2e16becf994dccfc7d05aa6147ba1022d72b", [ null, { @@ -570778,14 +571672,14 @@ ] ], "anchor-center-htb-htb.html": [ - "50fc09061073a7bcd16d9669b3fd6ad85234e783", + "88e01619cafad8a51e5dcea6bbb565e8cdae14e2", [ null, {} ] ], "anchor-center-htb-vrl.html": [ - "eba72d649133da882a9fa095f0433f426b54bf8e", + "f777a2caf8803f77283d9fe667ca29c7ecdf4fa0", [ null, {} @@ -570799,14 +571693,14 @@ ] ], "anchor-center-vrl-htb.html": [ - "8f7af0414edd4eb606e7be3437f81468696522b9", + "595f7ea1ecdc6fb52e86624fa6dccc7861563aa7", [ null, {} ] ], "anchor-center-vrl-vrl.html": [ - "d8e90057dc3372c5ccca659132e708c678678a56", + "e22391a8192e1c0909a7983b08c450f9bff219e3", [ null, {} @@ -571692,21 +572586,21 @@ ] ], "position-area-anchor-outside.html": [ - "d8fb5dbc98fa90513e339487b6e8284ca2db92bc", + "9b0c74170aa0f44821b28c7899011128c18c896e", [ null, {} ] ], "position-area-anchor-partially-outside.html": [ - "e23cea474787b1f613a87fdddf306aec40fb93b1", + "3dd537d26e09fb43bbf0fd3cd3dd30efd8b55e94", [ null, {} ] ], "position-area-basic.html": [ - "6cbaf8e50145b19a3e761f91abb7adcdb30d400d", + "2a568cc80281489fb54da4c48e55400d816718ab", [ null, {} @@ -572220,6 +573114,13 @@ {} ] ], + "animate-with-background-color-oklch-002.html": [ + "ee6847c11bf1257c59bdcf5b53a61245403d7cfa", + [ + null, + {} + ] + ], "animate-with-color-mix.html": [ "0b6d9bb4ab3ae911e7291e1da5e2259c0afbd0fc", [ @@ -575826,7 +576727,7 @@ ] ], "color-computed-relative-color.html": [ - "23ee07d177ac525c2ce2b4e60cd1861a33cc23c5", + "9bb87459623ac3c50b2154432269adef114fe811", [ null, {} @@ -577415,6 +578316,13 @@ {} ] ], + "CSS-supports-details-content-pseudo-parsing.html": [ + "67a46fe82a2ffaa4d5a9bd0729831c6e4415ab54", + [ + null, + {} + ] + ], "CSS-supports-selector-detecting-invalid-in-logical-combinations.html": [ "3adcd7ae2e62bd76130b3ecf2b903e1401b23c77", [ @@ -579660,6 +580568,13 @@ {} ] ], + "flex-shorthand-calc.html": [ + "6498988dd53b3e6f7e48f643094551121fdc28f4", + [ + null, + {} + ] + ], "flex-shorthand-flex-basis-middle.html": [ "284aac275b87b59a2703e3aaaf78e2369d77a95a", [ @@ -580667,7 +581582,7 @@ ] ], "flex-computed.html": [ - "ea1f4f6fa4568e8a3b4913aea52d89d5ec1e1870", + "074d0f7395c1ce53fb37e2875d389ddf8c352c7e", [ null, {} @@ -580744,7 +581659,7 @@ ] ], "flex-invalid.html": [ - "ae010d7b4b4540f6591c1ad42f1c89753a71afc6", + "d47f8b6793074c5aa27881eaf58809e69a76812d", [ null, {} @@ -580779,7 +581694,7 @@ ] ], "flex-valid.html": [ - "f3eaf118da61d2eb9cd6f30e7f703a0de8053305", + "4c57fe4e25361f9223fade0794bb3a1869c89caa", [ null, {} @@ -580835,6 +581750,13 @@ ] ] }, + "percent-height-flex-items-cross-sizes-with-mutations.html": [ + "87f20000f1f2e1718e31dddb9c92d0edf10b6cb3", + [ + null, + {} + ] + ], "percentage-heights-000.html": [ "cf501031448c8d3d020061d29a2c7e6991deea92", [ @@ -581393,6 +582315,13 @@ {} ] ], + "font-variation-settings-calc.html": [ + "e3f5178952e0df7aa8f6f185edc6148144975a9d", + [ + null, + {} + ] + ], "font-variation-settings-serialization-001.html": [ "88764fd652f453f2def184a26f922783aa6d0121", [ @@ -585619,7 +586548,7 @@ ], "parsing": { "masonry-parsing.html": [ - "2204c06f72b8bd15c9662def13c3d89fb64048b4", + "64af83b316c912fcc4eeac9a13f52ed089d0f358", [ null, {} @@ -585630,7 +586559,7 @@ }, "parsing": { "grid-area-computed.html": [ - "d1ae78c7023c9cbd9ea4040e63692c24b1323a74", + "9b31e2b23c6fbe99bc712a116a57e0384a5396e0", [ null, {} @@ -589252,6 +590181,15 @@ } ] ], + "column-scroll-marker-focus-002.html": [ + "cd26b8aca85fe6d4e9ac643f4675d8ca1a3b83bd", + [ + null, + { + "testdriver": true + } + ] + ], "column-updates-computed-style.html": [ "d741b8cf915a189e13a7f7c2738bb2880aa4e852", [ @@ -589668,6 +590606,13 @@ } ] ], + "scroll-marker-15.html": [ + "764e56b55436ad461df39ec44e25d660c1d99bc6", + [ + null, + {} + ] + ], "scroll-marker-activation-retains-focus.html": [ "cf38ed354c73d3c5840258f87912a76c50ccebed", [ @@ -590115,7 +591060,7 @@ ] ], "overscroll-behavior-root.html": [ - "18c172b40a13b5bac3bcfeb08f23d59fd94ee17e", + "a116ead01b71db7b72bfd483b10b35b2e83ea1b8", [ null, { @@ -591785,6 +592730,15 @@ {} ] ], + "focus-visible-originating-element.html": [ + "05fc82324917c49ce3fab8e667dd3a9df51825d8", + [ + null, + { + "testdriver": true + } + ] + ], "highlight-cascade": { "highlight-cascade-007.html": [ "df79d8dff51ae23a75a7a4ef593f673ea596f36d", @@ -593966,6 +594920,13 @@ {} ] ], + "resnap-on-oveflow-hidden-container.html": [ + "41e454b2789cb90f1c72edf9f3dab8b3960b400d", + [ + null, + {} + ] + ], "resnap-on-reconstructing-frame.html": [ "d046608815aff119e443a17594a4947bea2ce587", [ @@ -596134,7 +597095,7 @@ ] ], "contain-intrinsic-size-028.html": [ - "15e8e0e89108b112bc113d6090946307379f53e7", + "da31a1efeadea5bf6f32b6aee6ec9e452a30917c", [ null, {} @@ -596176,7 +597137,7 @@ ] ], "contain-intrinsic-size-logical-003.html": [ - "48fedb11483342fd6f6fd580bab4f16b0b0fa334", + "9ee60268d60482ddbfe4c7263d2ce7b85e3c3c55", [ null, {} @@ -602925,7 +603886,7 @@ }, "inline": { "append.tentative.html": [ - "f80875622366939f48a7471513fb6319f75be718", + "fa23071c4f22468fd46015b9767c91d6ef81e232", [ null, {} @@ -603381,6 +604342,13 @@ {} ] ], + "column-height.html": [ + "f9986221f4886a756584258e8e3d4ad01c39c81c", + [ + null, + {} + ] + ], "column-rule-color.html": [ "3d35b856d71f2de9c87e83aa1ace57b3b4d8cf5d", [ @@ -604882,6 +605850,13 @@ {} ] ], + "cursor-calc-hotspot.html": [ + "84f9ca35b79878972d61e132857640a9f5e86fa7", + [ + null, + {} + ] + ], "historical": { "moz-user-modify-01.html": [ "595df9440e523fc371cf55975e4042d569163136", @@ -605569,6 +606544,13 @@ {} ] ], + "calc-complex-unresolved-serialize.html": [ + "64bccd216abe357a3594d27f1b016d473c44f7a0", + [ + null, + {} + ] + ], "calc-in-color-001.html": [ "7db087def7552af2662524e26813aa51daae0cb1", [ @@ -606082,7 +607064,7 @@ ] ], "hypot-pow-sqrt-invalid.html": [ - "edecfceb13afe79ad0b13b6b5d29a9924f5fad9b", + "3e29889588399a53ddb7b1dbce84a9f2c0c36f7c", [ null, {} @@ -607274,7 +608256,7 @@ ] ], "pageswap-in-hidden-doc-should-skip-transition.html": [ - "aceced0dded84f88782356a99d96fec5febd40c3", + "2fddb7e17a4c7bdd006a255cb8e7d713c2c29660", [ null, { @@ -610816,8 +611798,26 @@ {} ] ], - "visual-scrollIntoView.html": [ - "78a3203c58587b6cf9d78faa607105dc8751179d", + "visual-scrollIntoView-001.html": [ + "825556be9691c2438be783df203e54d6b1c8d189", + [ + null, + { + "testdriver": true + } + ] + ], + "visual-scrollIntoView-002.html": [ + "7f9170654e3220807b7980bfb9c2e16c1821ce7b", + [ + null, + { + "testdriver": true + } + ] + ], + "visual-scrollIntoView-003.html": [ + "c0592098a90e7550781242a042c810d655b4c356", [ null, { @@ -617213,9 +618213,37 @@ ] ], "scrollend-event-fired-for-scrollIntoView.html": [ - "40aa77f4764b6c4301b8aba7221e1e42e768505d", + "e3e63f2820158623851bc83ec6b49d6da9adc0c2", [ - null, + "dom/events/scrolling/scrollend-event-fired-for-scrollIntoView.html?include=nested-scrollIntoView", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "dom/events/scrolling/scrollend-event-fired-for-scrollIntoView.html?include=root-inline-end-block-end-behavior-auto", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "dom/events/scrolling/scrollend-event-fired-for-scrollIntoView.html?include=root-inline-start-block-start-behavior-smooth", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "dom/events/scrolling/scrollend-event-fired-for-scrollIntoView.html?include=subframe-inline-end-block-end-behavior-auto", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "dom/events/scrolling/scrollend-event-fired-for-scrollIntoView.html?include=subframe-inline-start-block-start-behavior-smooth", { "testdriver": true, "timeout": "long" @@ -620999,7 +622027,7 @@ }, "ecmascript": { "locale-compat.html": [ - "74806987879e74befd087489285b6610d8107089", + "1f863b21ecb3b74287f9f5464303dec45c116c16", [ null, {} @@ -625738,6 +626766,33 @@ } ] ], + "delete-word-around-span.html": [ + "6250e9aec21620334d0d74e6d7642a21480ec0a1", + [ + "editing/whitespaces/delete-word-around-span.html?white-space=normal", + { + "testdriver": true + } + ], + [ + "editing/whitespaces/delete-word-around-span.html?white-space=pre", + { + "testdriver": true + } + ], + [ + "editing/whitespaces/delete-word-around-span.html?white-space=pre-line", + { + "testdriver": true + } + ], + [ + "editing/whitespaces/delete-word-around-span.html?white-space=pre-wrap", + { + "testdriver": true + } + ] + ], "forwarddelete-chars-following-collapsible-white-space.html": [ "2bf42ed18e521cfd0916307e14a3db98d6b2c439", [ @@ -625748,6 +626803,33 @@ } ] ], + "forwarddelete-word-around-span.html": [ + "ac7cbaee18654d43a657beb568bf0bd5ea426b69", + [ + "editing/whitespaces/forwarddelete-word-around-span.html?white-space=normal", + { + "testdriver": true + } + ], + [ + "editing/whitespaces/forwarddelete-word-around-span.html?white-space=pre", + { + "testdriver": true + } + ], + [ + "editing/whitespaces/forwarddelete-word-around-span.html?white-space=pre-line", + { + "testdriver": true + } + ], + [ + "editing/whitespaces/forwarddelete-word-around-span.html?white-space=pre-wrap", + { + "testdriver": true + } + ] + ], "inserttext-at-end-of-block-when-br-always-block.html": [ "922b8bd1c86230c1284fc0f14ce2031ab345c1ee", [ @@ -659026,7 +660108,7 @@ "fledge": { "tentative": { "abort.https.window.js": [ - "db6aae4604575fd0f096efeec45c86fe94e11e3d", + "e4a3189a30c823b9c7135c1733b0021ea8728684", [ "fledge/tentative/abort.https.window.html", { @@ -659057,7 +660139,7 @@ ] ], "additional-bids.https.window.js": [ - "edacb05512e968fb98668a4b40ec92c68c9a1410", + "384a9e620307bd05ba4594bb4494fd3382126333", [ "fledge/tentative/additional-bids.https.window.html?1-last", { @@ -659096,7 +660178,7 @@ ] ], "auction-config-passed-to-worklets.https.window.js": [ - "dec49b80a96967e86d318f9e31995c1786e95654", + "1fb59972b58768227e3e1e2e272ee3e8969d86dd", [ "fledge/tentative/auction-config-passed-to-worklets.https.window.html?1-5", { @@ -659519,7 +660601,7 @@ ] ], "auction-config.https.window.js": [ - "50b9cb9e9e6b071604522268fc1113a7f1a8a662", + "e32d8b31773295aa498db9109f20128109def8da", [ "fledge/tentative/auction-config.https.window.html?1-5", { @@ -660754,7 +661836,7 @@ ] ], "clear-origin-joined-ad-interest-groups.https.window.js": [ - "097978a7858523c759a70ac9843baec8eee65dc4", + "9f0818da2c4b1600d9c1f3ba7668c2e434f14cbe", [ "fledge/tentative/clear-origin-joined-ad-interest-groups.https.window.html?1-4", { @@ -661339,7 +662421,7 @@ ] ], "cross-origin.https.window.js": [ - "9669f2790bcfa492a5419c9f7f16d39b12da0f2c", + "6c95f74c1f597332e2b74d9c5dd18f7808d34124", [ "fledge/tentative/cross-origin.https.window.html?1-4", { @@ -661534,7 +662616,7 @@ ] ], "currency.https.window.js": [ - "f1b2bba87340340fdf04b5d4c065fe06707f53a1", + "b65dea5820ab69aad19839281dcda54ea7d0b1d1", [ "fledge/tentative/currency.https.window.html?1-4", { @@ -662149,7 +663231,7 @@ ] ], "deprecated-render-url-replacements.https.window.js": [ - "75377ca7aa348486fad8ed589e7d947f2dcb3b64", + "51daaf277975043f065c39fc2dfc043c5301af8d", [ "fledge/tentative/deprecated-render-url-replacements.https.window.html?1-5", { @@ -662344,7 +663426,7 @@ ] ], "direct-from-seller-signals.https.window.js": [ - "3f58b2c8ad541da98b1345bc7db3994d8ed5340e", + "a4e6911491d2c7b1f5df6f190139d0d7a15752e8", [ "fledge/tentative/direct-from-seller-signals.https.window.html?1-4", { @@ -662973,7 +664055,7 @@ ] ], "generate-bid-browser-signals.https.window.js": [ - "00c4bfdcc315c02211792888b0e377302df2e36d", + "e472fccdc4da37c1a2cebb80921809cab5788b54", [ "fledge/tentative/generate-bid-browser-signals.https.window.html?1-4", { @@ -663488,7 +664570,7 @@ ] ], "get-interest-group-auction-data.https.window.js": [ - "855e6b5a075cfbbba74772dc222e8a487fb3a118", + "de749e1e60a2d5f010c07dd98829ede5c7da21ea", [ "fledge/tentative/get-interest-group-auction-data.https.window.html?1-4", { @@ -663798,7 +664880,7 @@ ] ], "interest-group-passed-to-generate-bid.https.window.js": [ - "172cbab466440b4f2d8ffe3a1f937e9b4520461d", + "6b5602158ffcfe5930feeb653e0a85e3ab599b60", [ "fledge/tentative/interest-group-passed-to-generate-bid.https.window.html?1-5", { @@ -665501,7 +666583,7 @@ ] ], "interest-group-update.https.window.js": [ - "ceac2c79a6e93635f5f4ebb9e7e26256cb695a7b", + "041100547446369dd7566d2ab010319edc434135", [ "fledge/tentative/interest-group-update.https.window.html?1-4", { @@ -665764,7 +666846,7 @@ ] ], "join-leave-ad-interest-group-in-fenced-frame.https.window.js": [ - "1e2824666cc7c2b8c1fd8c19e2414bdea07f9714", + "2939d3847841357187e1999e4ad214510bac60cc", [ "fledge/tentative/join-leave-ad-interest-group-in-fenced-frame.https.window.html?1-4", { @@ -665899,7 +666981,7 @@ ] ], "join-leave-ad-interest-group.https.window.js": [ - "68a4e9d09c941493b8dd8c85c5a535a5d962d761", + "5e004ed1dc5dbb71216eb0f2f5e44cea41e722b5", [ "fledge/tentative/join-leave-ad-interest-group.https.window.html?1-10", { @@ -666514,7 +667596,7 @@ ] ], "kanon-status-below-threshold.https.window.js": [ - "6f3c2f572a198469607a27b51328c9ff8364d7a0", + "419b94bd7814756059a2029562510915a1c648ef", [ "fledge/tentative/kanon-status-below-threshold.https.window.html", { @@ -666544,7 +667626,7 @@ ] ], "kanon-status-not-calculated.https.window.js": [ - "87a66c106fbff5388e05905539840556ceb41e35", + "965082d8ffd0a2f4cbdedea298f19abddab1afa9", [ "fledge/tentative/kanon-status-not-calculated.https.window.html", { @@ -666769,7 +667851,7 @@ ] ], "no-winner.https.window.js": [ - "2632a95deeeb85eb9bc7be26194260af218c59ad", + "cfa0704dbc400248d48ed8bbfa771af86fc73dc6", [ "fledge/tentative/no-winner.https.window.html?1-5", { @@ -667492,7 +668574,7 @@ ] ], "private-aggregation.https.window.js": [ - "a1c261b6291495ffb778753f1444dac5f414b910", + "474bf4ced76c2214d9abc82e0e5b69fe7b787b82", [ "fledge/tentative/private-aggregation.https.window.html?1-5", { @@ -667703,7 +668785,7 @@ ] ], "real-time-reporting.https.window.js": [ - "5ebd20d19aec35f8c5fa14c314621f8724493126", + "84dce53844f44c9dc468ad63f168588bd973841d", [ "fledge/tentative/real-time-reporting.https.window.html?1-5", { @@ -667794,7 +668876,7 @@ ] ], "register-ad-beacon.https.window.js": [ - "d74f0dab5e56601c808d7cd28dc6dea78aa5b628", + "98b6a75c42f33bf5d8a900d817c5a20e718718da", [ "fledge/tentative/register-ad-beacon.https.window.html?1-5", { @@ -667929,7 +669011,7 @@ ] ], "reporting-arguments.https.window.js": [ - "a3b546f596476d95d36e6d0a6c7dd858c2a62e27", + "04af8ebc64354d6fe987c310352f08eb2d8a289f", [ "fledge/tentative/reporting-arguments.https.window.html?1-5", { @@ -668124,7 +669206,7 @@ ] ], "reporting-ids.https.window.js": [ - "43c78987f1e8610c5aff66f72ec37d2e58330dca", + "0019393008bc565c10aa8af9cd7ab28f82d102d1", [ "fledge/tentative/reporting-ids.https.window.html?1-5", { @@ -668207,7 +669289,7 @@ ] ], "round-a-value.https.window.js": [ - "2195b45ea5f81893699a6732f102d492f3d12bec", + "21bbf29572659789651de645f38a89d759f62dc0", [ "fledge/tentative/round-a-value.https.window.html", { @@ -668238,7 +669320,7 @@ ] ], "score-ad-browser-signals.https.window.js": [ - "23fee313af53b5431928f6d4c5cd406c3ccb915c", + "9acf994cf9fd9b0355561af7ca3b97ea5eb5ddc1", [ "fledge/tentative/score-ad-browser-signals.https.window.html?1-last", { @@ -668277,7 +669359,7 @@ ] ], "send-report-to.https.window.js": [ - "163443cb76d450e5a559fefcbd48ac26266e33dc", + "fa0f01ccfe8b403fcd6ceded435688481b37f467", [ "fledge/tentative/send-report-to.https.window.html?1-5", { @@ -668360,7 +669442,7 @@ ] ], "server-response-for-debugging-only.https.window.js": [ - "1b4edc66a89ce0577f14ef76b79d655492629a19", + "e6787e8a2d9bda86c78b289e26ac1361f1652c35", [ "fledge/tentative/server-response-for-debugging-only.https.window.html?1-last", { @@ -668411,7 +669493,7 @@ ] ], "server-response-private-aggregation.https.window.js": [ - "d7f21e16cf08506ec277985dec74ae81e350a2e6", + "6d9a8a887706eeb75506a95884271a754e4ee05e", [ "fledge/tentative/server-response-private-aggregation.https.window.html?1-6", { @@ -668518,7 +669600,7 @@ ] ], "server-response.https.window.js": [ - "d4eaf0d25123298a696f0116cb54c6fe144038d4", + "4241cc8e1c9025bfae29d72a1567fcf63be3242e", [ "fledge/tentative/server-response.https.window.html?1-6", { @@ -670357,7 +671439,7 @@ ] ], "service-worker-request-visibility.https.window.js": [ - "8b8618420e56e30d2a9e4428f24f22cc7d9053b9", + "41ebf839600bb2cd52bbb9f01b7a8118dc1eee13", [ "fledge/tentative/service-worker-request-visibility.https.window.html?1-last", { @@ -670396,7 +671478,7 @@ ] ], "tie.https.window.js": [ - "f528df8fb020382907a63d372452010217bf2b55", + "21be690c92ef4386d7100d1e600a1c3524f48809", [ "fledge/tentative/tie.https.window.html", { @@ -672929,7 +674011,7 @@ ] ], "utf8-helpers.https.window.js": [ - "4a712bf6269ea1fc2b9e7eb832a2b3cdcf2a9e07", + "9d8d0836419fd7f7223707be99d700b28ee39aca", [ "fledge/tentative/utf8-helpers.https.window.html?1-5", { @@ -684883,6 +685965,13 @@ "timeout": "long" } ] + ], + "open_initial_size.html": [ + "a3a82d7646891edc92008073c1bb66fab7d36fa6", + [ + null, + {} + ] ] }, "proxy-getOwnPropertyDescriptor.html": [ @@ -692947,6 +694036,20 @@ {} ] ], + "2d.text.measure.lang.html": [ + "a11e838799c635a33b35c2233bcf92f8d0b71b7d", + [ + null, + {} + ] + ], + "2d.text.measure.lang.inherit.html": [ + "565308a895bc2442c98087f0e5341cd7ac530697", + [ + null, + {} + ] + ], "2d.text.measure.selection-rects-baselines.tentative.html": [ "8ef5e83199c395d1de79b7730b47c2c9342d074e", [ @@ -706844,6 +707947,27 @@ {} ] ], + "2d.text.measure.lang.html": [ + "22183f9434296c0d6f99266fa06659a40194719f", + [ + null, + {} + ] + ], + "2d.text.measure.lang.inherit.html": [ + "8b630794e1d6daeb0c48953d71f07ee86adb24d1", + [ + null, + {} + ] + ], + "2d.text.measure.lang.worker.js": [ + "5bbb2317f243b09f6030b86895f3622993cd2f32", + [ + "html/canvas/offscreen/text/2d.text.measure.lang.worker.html", + {} + ] + ], "2d.text.measure.selection-rects-baselines.tentative.html": [ "fc1683bcce17a948e3580a64357da5a7927ce289", [ @@ -712776,14 +713900,14 @@ ] ], "nameditem-01.html": [ - "2b428aa65bd7d6cda28fee7e83ef2528a1b751f5", + "2caeed7dd000a7ca7951980ac59c724f251ee0f4", [ null, {} ] ], "nameditem-02.html": [ - "8c3155e7e4cabc69a58315d620ace5b20fa91b4c", + "84cf64c1ffc685164bda1f3e5493c2fe9db0bda8", [ null, {} @@ -712797,28 +713921,28 @@ ] ], "nameditem-04.html": [ - "b7c3ef8e9bb1697d57f451021672b5491a21e090", + "2b4a3c55b71d16660c680bc86e799b43565586ee", [ null, {} ] ], "nameditem-05.html": [ - "843ce357962e5990ed8e72674b46def587b2badc", + "b38872498b60fa728d7617243d4bdf206146609c", [ null, {} ] ], "nameditem-06.html": [ - "15a72b5f6bad01ca6a71eb432522acf905322340", + "592535f0d6a3172c711dd5b85919336616743921", [ null, {} ] ], "nameditem-07.html": [ - "fc3f06c01b9ec6f0c8ea51c0474da9adaa7c9d70", + "69a3bb0f09ac6311c3fc08a1a04f2e337341b6f0", [ null, {} @@ -713844,6 +714968,20 @@ {} ] ], + "element-render-blocking-040.html": [ + "3ef1fefc4f85bc6accb6b5d81c2f58bef821578e", + [ + null, + {} + ] + ], + "element-render-blocking-041.html": [ + "c6d87710f7e56fd3e80b60f21c79ac4a28431330", + [ + null, + {} + ] + ], "non-render-blocking-scripts.optional.html": [ "a4c32ea037b7b47490c54ddd7616b88bfebcdc76", [ @@ -717311,6 +718449,27 @@ {} ] ], + "fieldset-multicol-column-height.html": [ + "afd2425221f86878ec407064c8c87c528fdc6e78", + [ + null, + {} + ] + ], + "fieldset-multicol-only-column-count.html": [ + "9f794007a47e517a357818e007333277c486e47f", + [ + null, + {} + ] + ], + "fieldset-multicol-only-column-width.html": [ + "e3fd552439af219ca7b6f329e5719218c9365a51", + [ + null, + {} + ] + ], "fieldset-multicol.html": [ "bdb2c2fd94686b502ed5a663b1026180283af22f", [ @@ -725900,6 +727059,13 @@ } ] ], + "option-color-inheritance.html": [ + "d96124d008c50be1f62a7b2f4c3ddf153c62bdd6", + [ + null, + {} + ] + ], "option-computed-style.tentative.html": [ "ba2861a5c6181b72c3b8abc3e077a9f414f2cd99", [ @@ -727109,7 +728275,7 @@ ] ], "focus-after-close.html": [ - "93baf65cf60c17d9292525e110faff15bcbd52b9", + "7137edcd1a18080c96d627e5f40da13b1d36437f", [ null, { @@ -746918,7 +748084,7 @@ ] ], "decodingInfo.any.js": [ - "2fd3743b442cf8f3143ee2d4c3ccb02571036b15", + "e7a0e6ae430deb71e0f426f63bcac60e60d0448a", [ "media-capabilities/decodingInfo.any.html", { @@ -746988,7 +748154,7 @@ ] ], "encodingInfo.any.js": [ - "14612238e60cdb45cf716a6bd0d7037e1e2506a6", + "97b6c196f09d3c4fc3d46f92a916e4020c39d646", [ "media-capabilities/encodingInfo.any.html", {} @@ -748226,7 +749392,7 @@ ] ], "MediaRecorder-canvas-media-source.https.html": [ - "0c5f47f0ef83efe6d8e36d76a1ff88534b51c6ab", + "847e6618b3b66a5297f617959c37d70f1bf7d342", [ "mediacapture-record/MediaRecorder-canvas-media-source.https.html?mimeType=''", { @@ -748868,6 +750034,123 @@ } ] ], + "legacy": { + "MediaRecorder-canvas-media-source-legacy.https.html": [ + "bcfc2af2737716810d22826ff8441b5a0bc668a0", + [ + "mediacapture-record/legacy/MediaRecorder-canvas-media-source-legacy.https.html?mimeType=''", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "mediacapture-record/legacy/MediaRecorder-canvas-media-source-legacy.https.html?mimeType=video/mp4", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "mediacapture-record/legacy/MediaRecorder-canvas-media-source-legacy.https.html?mimeType=video/mp4;codecs=av01,mp4a.40.2", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "mediacapture-record/legacy/MediaRecorder-canvas-media-source-legacy.https.html?mimeType=video/mp4;codecs=av01,opus", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "mediacapture-record/legacy/MediaRecorder-canvas-media-source-legacy.https.html?mimeType=video/mp4;codecs=avc1.64003E,mp4a.40.2", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "mediacapture-record/legacy/MediaRecorder-canvas-media-source-legacy.https.html?mimeType=video/mp4;codecs=avc3.64003E,mp4a.40.2", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "mediacapture-record/legacy/MediaRecorder-canvas-media-source-legacy.https.html?mimeType=video/mp4;codecs=hev1.1.6.L186.B0,mp4a.40.2", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "mediacapture-record/legacy/MediaRecorder-canvas-media-source-legacy.https.html?mimeType=video/mp4;codecs=hev1.1.6.L186.B0,opus", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "mediacapture-record/legacy/MediaRecorder-canvas-media-source-legacy.https.html?mimeType=video/mp4;codecs=hvc1.1.6.L186.B0,mp4a.40.2", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "mediacapture-record/legacy/MediaRecorder-canvas-media-source-legacy.https.html?mimeType=video/mp4;codecs=hvc1.1.6.L186.B0,opus", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "mediacapture-record/legacy/MediaRecorder-canvas-media-source-legacy.https.html?mimeType=video/mp4;codecs=vp9,opus", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "mediacapture-record/legacy/MediaRecorder-canvas-media-source-legacy.https.html?mimeType=video/webm;codecs=av1,opus", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "mediacapture-record/legacy/MediaRecorder-canvas-media-source-legacy.https.html?mimeType=video/webm;codecs=vp8,opus", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "mediacapture-record/legacy/MediaRecorder-canvas-media-source-legacy.https.html?mimeType=video/webm;codecs=vp9,opus", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "mediacapture-record/legacy/MediaRecorder-canvas-media-source-legacy.https.html?mimeType=video/x-matroska;codecs=hev1.1.6.L186.B0,opus", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "mediacapture-record/legacy/MediaRecorder-canvas-media-source-legacy.https.html?mimeType=video/x-matroska;codecs=hvc1.1.6.L186.B0,opus", + { + "testdriver": true, + "timeout": "long" + } + ] + ] + }, "passthrough": { "MediaRecorder-passthrough.https.html": [ "6a8ebf50dd59c87eeef411566998bd5bb79ff9a9", @@ -777536,7 +778819,7 @@ ] ], "sanitizer-config.tentative.html": [ - "438e1db7eadc0a5f6404c4f7f2ce39d7f37c3eac", + "4a7b7ecc517fb2ecfc0bc1f800d1e650dbde86b6", [ null, {} @@ -779496,7 +780779,7 @@ ] ], "lock-sandboxed-iframe.html": [ - "ab954f04b4c5d9043d893e36892c4061ed446661", + "f78d7d72d538fd9384e9b5f7193d318a0ae69589", [ null, { @@ -779772,6 +781055,50 @@ ] }, "scroll-animations": { + "animation-trigger": { + "animation-trigger-alternate.tentative.html": [ + "aa92e32c5628392813cd576b64eb2bb32129e2ef", + [ + null, + {} + ] + ], + "animation-trigger-once-play-state.tentative.html": [ + "23c6aa8ce9f697cab4121e713556b544cb4202cf", + [ + null, + {} + ] + ], + "animation-trigger-once.tentative.html": [ + "e7603b458bc0793a9b5303d8bd72b8d6908ebf26", + [ + null, + {} + ] + ], + "animation-trigger-repeat.tentative.html": [ + "cfbe9d3c9334148789d4cebc7a01a2f9e848b22d", + [ + null, + {} + ] + ], + "animation-trigger-state.tentative.html": [ + "a9d58ae4c3268baa4c7b3ad61310b73cc00cf467", + [ + null, + {} + ] + ], + "animation-trigger.html": [ + "dd4820dfe5fe0a964044b0d27eea153b9fbbfb3e", + [ + null, + {} + ] + ] + }, "css": { "animation-duration-auto.tentative.html": [ "01982859137855c7f6c3c5011b013ea715c9c4ea", @@ -786192,6 +787519,15 @@ } ] ], + "text-selection-with-delegatesFocus-text-control.html": [ + "6474729b8b4a8c496b33e40d5b056a12b7232418", + [ + null, + { + "testdriver": true + } + ] + ], "text-selection-with-delegatesFocus.html": [ "7c92d35394f126d878780a1c04f2bdb49550ba86", [ @@ -790780,6 +792116,35 @@ } ] ], + "protocol-handler-register.https.html": [ + "af2df0f12abac3d7f8908e01a987e0cbd5e2fe25", + [ + null, + { + "testdriver": true, + "timeout": "long" + } + ] + ], + "protocol-handler-unregister.https.html": [ + "586ce43385445f85ee0a9d52105a77a447c1294c", + [ + null, + { + "testdriver": true, + "timeout": "long" + } + ] + ], + "protocol-handler-validation.https.html": [ + "613b9bfad087e1ca10c79c4481f99e841d1a56a3", + [ + null, + { + "timeout": "long" + } + ] + ], "referrer-policy-from-rules.html": [ "7e3b65fe6127c9ecd6f5448d0d31be8962ff8db2", [ @@ -791540,6 +792905,15 @@ } ] ], + "restrictions_shared_storage_worklet.https.html": [ + "72a46c3137ff9595147901a5d48297613d1033dd", + [ + null, + { + "timeout": "long" + } + ] + ], "sandbox-iframe.html": [ "469b8aadc31137d412faad400523af61922c6c0b", [ @@ -805020,7 +806394,7 @@ ] ], "accept-signature.window.js": [ - "efcbf0cdad6cb2816b47e989701835a30b777639", + "97e817e328c279149ac9668ed5014a30f811006d", [ "subresource-integrity/signatures/tentative/accept-signature.window.html", { @@ -808967,6 +810341,13 @@ {} ] ], + "SVGGraphicsElement-padding.svg": [ + "7bf47767a525a4950cf4be9f7da970ec9c8fdbe0", + [ + null, + {} + ] + ], "SVGGraphicsElement.getBBox-01.html": [ "773b06e5043d8d942b793a03d967a8acc925d5b1", [ @@ -810265,7 +811646,16 @@ ] ], "should-sink-type-mismatch-violation-be-blocked-by-csp-001.html": [ - "5662c64ac4ed531d2dee12356e8ab2c117a01c5f", + "add14466e57d6c7ead8690a7f19d89565eaca7e6", + [ + null, + { + "timeout": "long" + } + ] + ], + "should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker.html": [ + "9a7b237f11a5c436141f8f658b1d21b816ceadff", [ null, { @@ -810300,6 +811690,15 @@ } ] ], + "should-trusted-type-policy-creation-be-blocked-by-csp-004-worker.html": [ + "7e928d2d7192e694d632ce5907c430a673653bf8", + [ + null, + { + "timeout": "long" + } + ] + ], "trusted-types-createHTMLDocument.html": [ "38223dac7016eb766d4c3369a4d1c912290bd14b", [ @@ -810336,21 +811735,14 @@ ] ], "trusted-types-eval-reporting-no-unsafe-eval.html": [ - "69b5bf3c1d1e901227a37d841f4bafae0401e362", + "27bd4644496e34bf6a253a80ffeff059a317770c", [ null, {} ] ], "trusted-types-eval-reporting-report-only.html": [ - "a9e14f09e4ab322d6dcb6935b83cc819aa55f412", - [ - null, - {} - ] - ], - "trusted-types-eval-reporting.html": [ - "d037c058d9b2b495a8b90954b17b89075b98ccf2", + "09b2f1c258574087b7de48d5a568a77dbdd2c2a9", [ null, {} @@ -810378,14 +811770,35 @@ ] ], "trusted-types-report-only.html": [ - "f4386f832f43f57b82c52edc5e7dbe16308b6255", + "7b1a9c7e302c9da93b65b420e316c7cc94823a99", + [ + null, + {} + ] + ], + "trusted-types-reporting-check-report-DedicatedWorker-create-policy.html": [ + "71576c4ecc121a1005237773ed7d17b871ee7fd0", [ null, {} ] ], - "trusted-types-reporting-check-report.html": [ - "ae5ac25052d34be4d64bada3fb23283c783978ee", + "trusted-types-reporting-check-report-DedicatedWorker-sink-mismatch.html": [ + "72354a99eed9d2d26f4b01ab811a6ab41b788551", + [ + null, + {} + ] + ], + "trusted-types-reporting-check-report-Window-create-policy.html": [ + "4c9506c5b435d41241d0aa905a357db0c739f211", + [ + null, + {} + ] + ], + "trusted-types-reporting-check-report-Window-sink-mismatch.html": [ + "ad855dfb2f15a85548c423fe587592925e9a962d", [ null, {} @@ -810398,6 +811811,41 @@ {} ] ], + "trusted-types-reporting-for-DedicatedWorker-DedicatedWorker-constructor.html": [ + "b70a074fc7fd2c07428a3aca281ec263825a6883", + [ + null, + {} + ] + ], + "trusted-types-reporting-for-DedicatedWorker-ServiceWorkerContainer-register.https.html": [ + "9db187a2f91600b83883226aedca2b339f01e77f", + [ + null, + {} + ] + ], + "trusted-types-reporting-for-DedicatedWorker-eval.html": [ + "184bc8ad333b855745c29ca3709bf55696a5fd8f", + [ + null, + {} + ] + ], + "trusted-types-reporting-for-DedicatedWorker-function-constructor.html": [ + "26d4e54634a218d504adc136eb10f4813e38a973", + [ + null, + {} + ] + ], + "trusted-types-reporting-for-DedicatedWorker-importScripts.html": [ + "5db284f715cfc67847cd61e8028c2887d4a20fe4", + [ + null, + {} + ] + ], "trusted-types-reporting-for-DedicatedWorker-setTimeout-setInterval.html": [ "7e44a12fd2df50ee5beaf478470c4c828ab9c2b8", [ @@ -810496,6 +811944,41 @@ {} ] ], + "trusted-types-reporting-for-ServiceWorker-ServiceWorkerContainer-register.https.html": [ + "ac853cd8f6e71245d561bdc0abf2342b6afb22d9", + [ + null, + {} + ] + ], + "trusted-types-reporting-for-ServiceWorker-eval.https.html": [ + "2d0b6315fb9dc160e03167d567845e82fafbcae8", + [ + null, + {} + ] + ], + "trusted-types-reporting-for-ServiceWorker-function-constructor.html": [ + "791663dfc792179e9c145bc33442fa0b81966f7a", + [ + null, + {} + ] + ], + "trusted-types-reporting-for-ServiceWorker-importScripts.https.html": [ + "865409aca1b55958a0c7ca3751b289820c8b8123", + [ + null, + {} + ] + ], + "trusted-types-reporting-for-ServiceWorker-setTimeout-setInterval.https.html": [ + "34b962df085e29da2301156ba495b336866a4554", + [ + null, + {} + ] + ], "trusted-types-reporting-for-ShadowRoot-innerHTML.html": [ "9aaf2d8aa4f50dd4712efb1f6f47bbe05b0dd2c9", [ @@ -810510,6 +811993,41 @@ {} ] ], + "trusted-types-reporting-for-SharedWorker-DedicatedWorker-constructor.html": [ + "3b382d8774a0c8bff47847118cfa5df5f5f09688", + [ + null, + {} + ] + ], + "trusted-types-reporting-for-SharedWorker-ServiceWorkerContainer-register.https.html": [ + "00e9a75dfb0443edbf789d42be9759db670b8930", + [ + null, + {} + ] + ], + "trusted-types-reporting-for-SharedWorker-eval.html": [ + "6ae0f60351f30ccb339c0e7af757fd9f991b1ec0", + [ + null, + {} + ] + ], + "trusted-types-reporting-for-SharedWorker-function-constructor.html": [ + "dc77be79640b692a618a853cea67cc9159e7eab4", + [ + null, + {} + ] + ], + "trusted-types-reporting-for-SharedWorker-importScripts.html": [ + "fb01333dd463c4860aa3f7fc25e1bbf1568a06ab", + [ + null, + {} + ] + ], "trusted-types-reporting-for-SharedWorker-setTimeout-setInterval.html": [ "7c97f644873f4ad4888c72d07e0ffbb4698cde05", [ @@ -810517,6 +812035,41 @@ {} ] ], + "trusted-types-reporting-for-Window-DedicatedWorker-constructor.html": [ + "3d2a91d74ca45fec8ecba500c6da50d02cb68cdb", + [ + null, + {} + ] + ], + "trusted-types-reporting-for-Window-ServiceWorkerContainer-register.https.html": [ + "482b9c333e3a9ea16de19d8e53fc8125b7250396", + [ + null, + {} + ] + ], + "trusted-types-reporting-for-Window-SharedWorker-constructor.html": [ + "a03dd21be9779b113eca42a46444d554faaf1d63", + [ + null, + {} + ] + ], + "trusted-types-reporting-for-Window-eval.html": [ + "7f4772aed149ee0ce2458d1f8df13500d2418f65", + [ + null, + {} + ] + ], + "trusted-types-reporting-for-Window-function-constructor.html": [ + "9b9617a9b5df7be69271bf7fe7a184b542c56491", + [ + null, + {} + ] + ], "trusted-types-reporting-for-Window-setTimeout-setInterval.html": [ "87e26060ab74a44db8ae902ff178642b1aa6081f", [ @@ -810525,7 +812078,7 @@ ] ], "trusted-types-reporting.html": [ - "5e7930382ad16c3def4ae4055148595cf64a2325", + "7432d3bded8c45b64e12eca00cc6c477349d4869", [ null, { @@ -810533,6 +812086,20 @@ } ] ], + "trusted-types-sandbox-allow-scripts.html": [ + "b89cb56710266c91fd06bb7462d953a3efd695ea", + [ + null, + {} + ] + ], + "trusted-types-sandbox-no-allow-scripts.html": [ + "c4e4683934ec2d59a521e5cb7f99e2d0799723fa", + [ + null, + {} + ] + ], "trusted-types-source-file-path.html": [ "105a04247f630ddb49a2813cfa2345226eac91aa", [ @@ -825956,7 +827523,7 @@ ] ], "style-change-events.html": [ - "d1c1c96f7b03e8f8cd6596f1ae24772d292e77b4", + "c64400e869df5e844e276facb7d975827027f68a", [ null, {} @@ -835465,7 +837032,7 @@ ] ], "video-decoder-no-size-in-configure.https.any.js": [ - "3481b465f9eb431ce3dc799f4f1e625fbe3d7c0c", + "2ad7040e08b72617ac77b19fb47efc967c95bea8", [ "webcodecs/video-decoder-no-size-in-configure.https.any.html?av1", { @@ -836727,6 +838294,55 @@ } ] ], + "video-encoder-orientation.https.any.js": [ + "de687f114987bc0172f0fc2fe5e343e268d72a45", + [ + "webcodecs/video-encoder-orientation.https.any.html", + { + "script_metadata": [ + [ + "global", + "window,dedicatedworker" + ], + [ + "script", + "/common/media.js" + ], + [ + "script", + "/webcodecs/utils.js" + ], + [ + "script", + "/webcodecs/video-encoder-utils.js" + ] + ] + } + ], + [ + "webcodecs/video-encoder-orientation.https.any.worker.html", + { + "script_metadata": [ + [ + "global", + "window,dedicatedworker" + ], + [ + "script", + "/common/media.js" + ], + [ + "script", + "/webcodecs/utils.js" + ], + [ + "script", + "/webcodecs/video-encoder-utils.js" + ] + ] + } + ] + ], "video-encoder-rescaling.https.any.js": [ "70bafa04964cba77acc1c86b3f7d6f4b8ce4b728", [ @@ -842858,6 +844474,117 @@ } ] ], + "constant-reshape-optimization.https.any.js": [ + "eaa232b7413ebd132509ae9a605d3f5e49dc8d17", + [ + "webnn/conformance_tests/constant-reshape-optimization.https.any.html?cpu", + { + "script_metadata": [ + [ + "title", + "test constant reshape optimization" + ], + [ + "global", + "window" + ], + [ + "variant", + "?cpu" + ], + [ + "variant", + "?gpu" + ], + [ + "variant", + "?npu" + ], + [ + "script", + "../resources/utils.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ], + [ + "webnn/conformance_tests/constant-reshape-optimization.https.any.html?gpu", + { + "script_metadata": [ + [ + "title", + "test constant reshape optimization" + ], + [ + "global", + "window" + ], + [ + "variant", + "?cpu" + ], + [ + "variant", + "?gpu" + ], + [ + "variant", + "?npu" + ], + [ + "script", + "../resources/utils.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ], + [ + "webnn/conformance_tests/constant-reshape-optimization.https.any.html?npu", + { + "script_metadata": [ + [ + "title", + "test constant reshape optimization" + ], + [ + "global", + "window" + ], + [ + "variant", + "?cpu" + ], + [ + "variant", + "?gpu" + ], + [ + "variant", + "?npu" + ], + [ + "script", + "../resources/utils.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ] + ], "conv2d.https.any.js": [ "9fe246c9395c6cacf7e2f5245dac420e295707be", [ @@ -846282,7 +848009,7 @@ ] ], "instance_normalization.https.any.js": [ - "26e0cd0aa935d473a7bdb84da59e46f534544066", + "08d7d6ca337e4b426825bdd1808026dd2a28ef11", [ "webnn/conformance_tests/instance_normalization.https.any.html?cpu", { @@ -850824,7 +852551,7 @@ ] ], "reshape.https.any.js": [ - "fe758193730c0c8a43ba226bd3c50cccb3224b70", + "05b8ea21e674796818f4c6143044a1beaaa3fb59", [ "webnn/conformance_tests/reshape.https.any.html?cpu", { @@ -853176,7 +854903,7 @@ ] ], "subgraph.https.any.js": [ - "9b21d6e4f9453fb72c3f7a6850c5690cc9ed87cf", + "a494a8b7a95d7ff9b4a4be717d7f876a1b061b26", [ "webnn/conformance_tests/subgraph.https.any.html?cpu", { @@ -870167,7 +871894,7 @@ ] ], "RTCIceCandidate-constructor.html": [ - "b760c7b05a565c97c9c75287d11ca8cc83258d1f", + "05c0849f7a040b08dabd6201e08825328bdc7a8b", [ null, {} @@ -870233,7 +871960,7 @@ ] ], "RTCPeerConnection-addIceCandidate.html": [ - "618ef7e33c69735338ec4e05f2e15cd40d34c063", + "4517554bc0bcd5fe0275a358b4c51e5dca7dfaa5", [ null, {} @@ -870796,7 +872523,7 @@ ] ], "RTCRtpReceiver-getSynchronizationSources.https.html": [ - "cb5336f3f3523d0684e48de42f2666a6e6a3aa50", + "de9ad184af0d7619a725bb302b0814bf57b70c62", [ null, { @@ -871345,6 +873072,15 @@ {} ] ], + "h265-loopback.https.html": [ + "c3a394ef8f4ce5fa03ff8b272eacbd1b61e6ff07", + [ + null, + { + "timeout": "long" + } + ] + ], "handover-datachannel.html": [ "8f224f822a76bb48924bc13e59d53f8a24d99f64", [ @@ -895704,7 +897440,7 @@ ] ], "send-redirect.htm": [ - "7d73f0f64cc4d7506e607f75d3bba37b9d3d74a9", + "de3899f5e5d3ccef28ac54dfa05a7dbf8af98bd9", [ null, {} @@ -895852,7 +897588,7 @@ ] ], "setrequestheader-case-insensitive.htm": [ - "1aed30d1c2a13fcb35e90a31e599a6cc963c6491", + "ce10482cad8d47f8f3933a55f321b44f88f663aa", [ null, {} diff --git a/tests/wpt/meta/css/compositing/root-element-background-margin-opacity.html.ini b/tests/wpt/meta/css/compositing/root-element-background-margin-opacity.html.ini new file mode 100644 index 00000000000..bc87205da82 --- /dev/null +++ b/tests/wpt/meta/css/compositing/root-element-background-margin-opacity.html.ini @@ -0,0 +1,2 @@ +[root-element-background-margin-opacity.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-animations/animate-with-background-color-oklch-001.html.ini b/tests/wpt/meta/css/css-animations/animate-with-background-color-oklch-001.html.ini new file mode 100644 index 00000000000..18f732010f3 --- /dev/null +++ b/tests/wpt/meta/css/css-animations/animate-with-background-color-oklch-001.html.ini @@ -0,0 +1,2 @@ +[animate-with-background-color-oklch-001.html] + expected: TIMEOUT diff --git a/tests/wpt/meta/css/css-animations/animate-with-background-color-oklch-002.html.ini b/tests/wpt/meta/css/css-animations/animate-with-background-color-oklch-002.html.ini new file mode 100644 index 00000000000..6a465429bf8 --- /dev/null +++ b/tests/wpt/meta/css/css-animations/animate-with-background-color-oklch-002.html.ini @@ -0,0 +1,6 @@ +[animate-with-background-color-oklch-002.html] + [Animate from legacy rgb to oklch] + expected: FAIL + + [Animate from legacy rgb to color-mix oklch] + expected: FAIL diff --git a/tests/wpt/meta/css/css-animations/crashtests/chrome-bug-404743651.html.ini b/tests/wpt/meta/css/css-animations/crashtests/chrome-bug-404743651.html.ini new file mode 100644 index 00000000000..d99d36b7a59 --- /dev/null +++ b/tests/wpt/meta/css/css-animations/crashtests/chrome-bug-404743651.html.ini @@ -0,0 +1,2 @@ +[chrome-bug-404743651.html] + expected: TIMEOUT diff --git a/tests/wpt/meta/css/css-borders/tentative/corner-shape/corner-shape-any.html.ini b/tests/wpt/meta/css/css-borders/tentative/corner-shape/corner-shape-any.html.ini index f1903acb386..c528fee0d39 100644 --- a/tests/wpt/meta/css/css-borders/tentative/corner-shape/corner-shape-any.html.ini +++ b/tests/wpt/meta/css/css-borders/tentative/corner-shape/corner-shape-any.html.ini @@ -27,3 +27,48 @@ [corner-shape-any.html?corner-shape=squircle&border-top-right-radius=30px] expected: FAIL + +[corner-shape-any.html?corner-top-left-shape=superellipse(0.2)&border-radius=40px] + expected: FAIL + +[corner-shape-any.html?corner-shape=squircle&border-radius=25%&border-width=20px] + expected: FAIL + +[corner-shape-any.html?corner-top-right-shape=bevel&border-width=10px&border-color=black] + expected: FAIL + +[corner-shape-any.html?corner-top-left-shape=bevel&border-radius=40px] + expected: FAIL + +[corner-shape-any.html?corner-bottom-right-shape=bevel&border-width=10px&border-radius=20px] + expected: FAIL + +[corner-shape-any.html?corner-top-left-shape=scoop&border-radius=40px] + expected: FAIL + +[corner-shape-any.html?corner-bottom-left-shape=bevel&border-width=10px&border-radius=20px] + expected: FAIL + +[corner-shape-any.html?corner-top-left-shape=superellipse(6)&border-radius=20%&border-width=10px] + expected: FAIL + +[corner-shape-any.html?corner-top-left-shape=bevel&border-radius=40px&border-width=10px] + expected: FAIL + +[corner-shape-any.html?corner-top-left-shape=superellipse(0.3)&border-radius=40%] + expected: FAIL + +[corner-shape-any.html?corner-shape=squircle&border-top-left-radius=25%&border-width=10px] + expected: FAIL + +[corner-shape-any.html?corner-top-left-shape=superellipse(0.8)&border-radius=40px] + expected: FAIL + +[corner-shape-any.html?corner-top-left-shape=superellipse(1.2)&border-radius=40px] + expected: FAIL + +[corner-shape-any.html?corner-bottom-right-shape=bevel&corner-bottom-left-shape=bevel] + expected: FAIL + +[corner-shape-any.html?corner-top-left-shape=bevel&border-width=10px&border-color=black] + expected: FAIL diff --git a/tests/wpt/meta/css/css-borders/tentative/corner-shape/corner-shape-render.html.ini b/tests/wpt/meta/css/css-borders/tentative/corner-shape/corner-shape-render.html.ini deleted file mode 100644 index cdeb8243f40..00000000000 --- a/tests/wpt/meta/css/css-borders/tentative/corner-shape/corner-shape-render.html.ini +++ /dev/null @@ -1,26 +0,0 @@ -[corner-shape-render.html?corner-bottom-left-shape=bevel] - expected: FAIL - -[corner-shape-render.html?corner-top-left-shape=bevel] - expected: FAIL - -[corner-shape-render.html?corner-bottom-right-shape=bevel&corner-bottom-left-shape=bevel] - expected: FAIL - -[corner-shape-render.html?corner-bottom-right-shape=bevel] - expected: FAIL - -[corner-shape-render.html?corner-top-right-shape=bevel&corner-bottom-right-shape=bevel&border-radius=80px] - expected: FAIL - -[corner-shape-render.html?corner-top-right-shape=bevel&corner-bottom-right-shape=bevel&border-bottom-right-radius=80px&border-width=32px] - expected: FAIL - -[corner-shape-render.html?corner-top-left-shape=bevel&border-radius=40px] - expected: FAIL - -[corner-shape-render.html?corner-shape=bevel] - expected: FAIL - -[corner-shape-render.html?corner-top-right-shape=bevel] - expected: FAIL diff --git a/tests/wpt/meta/css/css-conditional/at-supports-selector-details-content-before.html.ini b/tests/wpt/meta/css/css-conditional/at-supports-selector-details-content-before.html.ini new file mode 100644 index 00000000000..dfbeb3e7278 --- /dev/null +++ b/tests/wpt/meta/css/css-conditional/at-supports-selector-details-content-before.html.ini @@ -0,0 +1,2 @@ +[at-supports-selector-details-content-before.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-conditional/at-supports-selector-details-content.html.ini b/tests/wpt/meta/css/css-conditional/at-supports-selector-details-content.html.ini new file mode 100644 index 00000000000..6e22bf2f1b6 --- /dev/null +++ b/tests/wpt/meta/css/css-conditional/at-supports-selector-details-content.html.ini @@ -0,0 +1,2 @@ +[at-supports-selector-details-content.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-conditional/js/CSS-supports-details-content-pseudo-parsing.html.ini b/tests/wpt/meta/css/css-conditional/js/CSS-supports-details-content-pseudo-parsing.html.ini new file mode 100644 index 00000000000..ac733ce1164 --- /dev/null +++ b/tests/wpt/meta/css/css-conditional/js/CSS-supports-details-content-pseudo-parsing.html.ini @@ -0,0 +1,15 @@ +[CSS-supports-details-content-pseudo-parsing.html] + [selector() function accepts ::details-content] + expected: FAIL + + [selector() function accepts ::details-content followed by ::before] + expected: FAIL + + [selector() function accepts ::details-content followed by ::first-line] + expected: FAIL + + [selector() function accepts ::details-content followed by a state pseudo-class] + expected: FAIL + + [selector() function accepts ::details-content followed by :lang()] + expected: FAIL diff --git a/tests/wpt/meta/css/css-flexbox/flex-shorthand-calc.html.ini b/tests/wpt/meta/css/css-flexbox/flex-shorthand-calc.html.ini new file mode 100644 index 00000000000..4f43d0e7e64 --- /dev/null +++ b/tests/wpt/meta/css/css-flexbox/flex-shorthand-calc.html.ini @@ -0,0 +1,12 @@ +[flex-shorthand-calc.html] + [e.style['flex'\] = "sign(1em - 1px) sibling-index()" should set flex-basis] + expected: FAIL + + [e.style['flex'\] = "sign(1em - 1px) sibling-index()" should set flex-grow] + expected: FAIL + + [e.style['flex'\] = "sign(1em - 1px) sibling-index()" should set flex-shrink] + expected: FAIL + + [e.style['flex'\] = "sign(1em - 1px) sibling-index()" should not set unrelated longhands] + expected: FAIL diff --git a/tests/wpt/meta/css/css-flexbox/parsing/flex-computed.html.ini b/tests/wpt/meta/css/css-flexbox/parsing/flex-computed.html.ini new file mode 100644 index 00000000000..961cc35e1fd --- /dev/null +++ b/tests/wpt/meta/css/css-flexbox/parsing/flex-computed.html.ini @@ -0,0 +1,6 @@ +[flex-computed.html] + [Property flex value 'calc(10 + (sign(20cqw - 10px) * 5)) calc(10 + (sign(20cqw - 10px) * 5)) 1px'] + expected: FAIL + + [Property flex value '1 1 calc(10px + (sign(20cqw - 10px) * 5px))'] + expected: FAIL diff --git a/tests/wpt/meta/css/css-flexbox/parsing/flex-valid.html.ini b/tests/wpt/meta/css/css-flexbox/parsing/flex-valid.html.ini new file mode 100644 index 00000000000..b41d365170c --- /dev/null +++ b/tests/wpt/meta/css/css-flexbox/parsing/flex-valid.html.ini @@ -0,0 +1,6 @@ +[flex-valid.html] + [e.style['flex'\] = "calc(10 + (sign(20cqw - 10px) * 5)) calc(10 + (sign(20cqw - 10px) * 5)) 1px" should set the property value] + expected: FAIL + + [e.style['flex'\] = "1 1 calc(10px + (sign(20cqw - 10px) * 5px))" should set the property value] + expected: FAIL diff --git a/tests/wpt/meta/css/css-fonts/font-synthesis-08.html.ini b/tests/wpt/meta/css/css-fonts/font-synthesis-08.html.ini deleted file mode 100644 index 20db075c10c..00000000000 --- a/tests/wpt/meta/css/css-fonts/font-synthesis-08.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[font-synthesis-08.html] - expected: FAIL diff --git a/tests/wpt/meta/css/css-fonts/font-variation-settings-calc.html.ini b/tests/wpt/meta/css/css-fonts/font-variation-settings-calc.html.ini new file mode 100644 index 00000000000..1d2d3f28119 --- /dev/null +++ b/tests/wpt/meta/css/css-fonts/font-variation-settings-calc.html.ini @@ -0,0 +1,12 @@ +[font-variation-settings-calc.html] + [e.style['font-variation-settings'\] = "\\"wght\\" sign(1em - 1px)" should set the property value] + expected: FAIL + + [e.style['font-variation-settings'\] = "\\"wght\\" sibling-index()" should set the property value] + expected: FAIL + + [Property font-variation-settings value '"wght" sign(1em - 1px)'] + expected: FAIL + + [Property font-variation-settings value '"wght" sibling-index()'] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-006.html.ini b/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-006.html.ini new file mode 100644 index 00000000000..c7b6f64746b --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-006.html.ini @@ -0,0 +1,2 @@ +[grid-gap-decorations-006.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-007.html.ini b/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-007.html.ini new file mode 100644 index 00000000000..78c144577df --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-007.html.ini @@ -0,0 +1,2 @@ +[grid-gap-decorations-007.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-008.html.ini b/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-008.html.ini new file mode 100644 index 00000000000..0d707b027b1 --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-008.html.ini @@ -0,0 +1,2 @@ +[grid-gap-decorations-008.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-009.html.ini b/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-009.html.ini new file mode 100644 index 00000000000..47829d9a1f4 --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-009.html.ini @@ -0,0 +1,2 @@ +[grid-gap-decorations-009.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-010.html.ini b/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-010.html.ini new file mode 100644 index 00000000000..3604969e91b --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-010.html.ini @@ -0,0 +1,2 @@ +[grid-gap-decorations-010.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-011.html.ini b/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-011.html.ini new file mode 100644 index 00000000000..a19940da849 --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-011.html.ini @@ -0,0 +1,2 @@ +[grid-gap-decorations-011.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-012.html.ini b/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-012.html.ini new file mode 100644 index 00000000000..9d4c60da0ee --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-012.html.ini @@ -0,0 +1,2 @@ +[grid-gap-decorations-012.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-013.html.ini b/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-013.html.ini new file mode 100644 index 00000000000..e8909f26d4b --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-013.html.ini @@ -0,0 +1,2 @@ +[grid-gap-decorations-013.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-014.html.ini b/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-014.html.ini new file mode 100644 index 00000000000..c6bb632ecd6 --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-014.html.ini @@ -0,0 +1,2 @@ +[grid-gap-decorations-014.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-015.html.ini b/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-015.html.ini new file mode 100644 index 00000000000..82c738da9f5 --- /dev/null +++ b/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-015.html.ini @@ -0,0 +1,2 @@ +[grid-gap-decorations-015.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-grid/masonry/tentative/order/masonry-order-002.html.ini b/tests/wpt/meta/css/css-grid/masonry/tentative/order/masonry-order-002.html.ini deleted file mode 100644 index 93e7786887e..00000000000 --- a/tests/wpt/meta/css/css-grid/masonry/tentative/order/masonry-order-002.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[masonry-order-002.html] - expected: FAIL diff --git a/tests/wpt/meta/css/css-grid/parsing/grid-area-computed.html.ini b/tests/wpt/meta/css/css-grid/parsing/grid-area-computed.html.ini new file mode 100644 index 00000000000..f4149d38b90 --- /dev/null +++ b/tests/wpt/meta/css/css-grid/parsing/grid-area-computed.html.ini @@ -0,0 +1,3 @@ +[grid-area-computed.html] + [Property grid-row-start value 'calc(10 + (sign(2cqw - 10px) * 5)) -a-'] + expected: FAIL diff --git a/tests/wpt/meta/css/css-images/gradient/conic-gradient-001.html.ini b/tests/wpt/meta/css/css-images/gradient/conic-gradient-001.html.ini new file mode 100644 index 00000000000..baebe61217c --- /dev/null +++ b/tests/wpt/meta/css/css-images/gradient/conic-gradient-001.html.ini @@ -0,0 +1,2 @@ +[conic-gradient-001.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-images/gradient/gradient-analogous-missing-components-004.html.ini b/tests/wpt/meta/css/css-images/gradient/gradient-analogous-missing-components-004.html.ini new file mode 100644 index 00000000000..5378b6b6110 --- /dev/null +++ b/tests/wpt/meta/css/css-images/gradient/gradient-analogous-missing-components-004.html.ini @@ -0,0 +1,2 @@ +[gradient-analogous-missing-components-004.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-overflow/scroll-marker-15.html.ini b/tests/wpt/meta/css/css-overflow/scroll-marker-15.html.ini new file mode 100644 index 00000000000..02bf8170bc2 --- /dev/null +++ b/tests/wpt/meta/css/css-overflow/scroll-marker-15.html.ini @@ -0,0 +1,6 @@ +[scroll-marker-15.html] + [::scroll-marker is not activated when its originating element is not scrolled into the view] + expected: FAIL + + [::scroll-marker is activated when its originating element is scrolled into the view] + expected: FAIL diff --git a/tests/wpt/meta/css/css-overflow/scroll-marker-contain-001.tentative.html.ini b/tests/wpt/meta/css/css-overflow/scroll-marker-contain-001.tentative.html.ini new file mode 100644 index 00000000000..0d5590a9293 --- /dev/null +++ b/tests/wpt/meta/css/css-overflow/scroll-marker-contain-001.tentative.html.ini @@ -0,0 +1,2 @@ +[scroll-marker-contain-001.tentative.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-overflow/scroll-marker-contain-002.tentative.html.ini b/tests/wpt/meta/css/css-overflow/scroll-marker-contain-002.tentative.html.ini new file mode 100644 index 00000000000..fd0d2f5788e --- /dev/null +++ b/tests/wpt/meta/css/css-overflow/scroll-marker-contain-002.tentative.html.ini @@ -0,0 +1,2 @@ +[scroll-marker-contain-002.tentative.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-overflow/scroll-marker-contain-003.tentative.html.ini b/tests/wpt/meta/css/css-overflow/scroll-marker-contain-003.tentative.html.ini new file mode 100644 index 00000000000..04e56713889 --- /dev/null +++ b/tests/wpt/meta/css/css-overflow/scroll-marker-contain-003.tentative.html.ini @@ -0,0 +1,2 @@ +[scroll-marker-contain-003.tentative.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-overflow/scroll-marker-contain-004.tentative.html.ini b/tests/wpt/meta/css/css-overflow/scroll-marker-contain-004.tentative.html.ini new file mode 100644 index 00000000000..908e3e40d04 --- /dev/null +++ b/tests/wpt/meta/css/css-overflow/scroll-marker-contain-004.tentative.html.ini @@ -0,0 +1,2 @@ +[scroll-marker-contain-004.tentative.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-sizing/aspect-ratio/replaced-element-013.html.ini b/tests/wpt/meta/css/css-sizing/aspect-ratio/replaced-element-013.html.ini deleted file mode 100644 index e31d7aaca38..00000000000 --- a/tests/wpt/meta/css/css-sizing/aspect-ratio/replaced-element-013.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[replaced-element-013.html] - expected: FAIL diff --git a/tests/wpt/meta/css/css-sizing/aspect-ratio/replaced-element-014.html.ini b/tests/wpt/meta/css/css-sizing/aspect-ratio/replaced-element-014.html.ini deleted file mode 100644 index 330d09977bd..00000000000 --- a/tests/wpt/meta/css/css-sizing/aspect-ratio/replaced-element-014.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[replaced-element-014.html] - expected: FAIL diff --git a/tests/wpt/meta/css/css-tables/table-cell-overflow-auto-scrolled.html.ini b/tests/wpt/meta/css/css-tables/table-cell-overflow-auto-scrolled.html.ini new file mode 100644 index 00000000000..55805c45ee2 --- /dev/null +++ b/tests/wpt/meta/css/css-tables/table-cell-overflow-auto-scrolled.html.ini @@ -0,0 +1,2 @@ +[table-cell-overflow-auto-scrolled.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-ui/cursor-calc-hotspot.html.ini b/tests/wpt/meta/css/css-ui/cursor-calc-hotspot.html.ini new file mode 100644 index 00000000000..2c6132a8ab9 --- /dev/null +++ b/tests/wpt/meta/css/css-ui/cursor-calc-hotspot.html.ini @@ -0,0 +1,6 @@ +[cursor-calc-hotspot.html] + [cursor hotspot with sign() depending on font relative units] + expected: FAIL + + [cursor hotspot depending on sibling-index()] + expected: FAIL diff --git a/tests/wpt/meta/css/css-values/calc-complex-unresolved-serialize.html.ini b/tests/wpt/meta/css/css-values/calc-complex-unresolved-serialize.html.ini new file mode 100644 index 00000000000..519f4a685c9 --- /dev/null +++ b/tests/wpt/meta/css/css-values/calc-complex-unresolved-serialize.html.ini @@ -0,0 +1,27 @@ +[calc-complex-unresolved-serialize.html] + ['calc(pow(2, sign(1em - 18px)))' as a computed value should serialize as '2'.] + expected: FAIL + + ['calc(pow(sign(1em - 18px), 2))' as a computed value should serialize as '1'.] + expected: FAIL + + ['calc(pow(sign(1em - 18px), sign(1em - 18px)))' as a computed value should serialize as '1'.] + expected: FAIL + + ['calc(pow(2, sibling-index())' as a specified value should serialize as 'calc(pow(2, sibling-index()))'.] + expected: FAIL + + ['calc(pow(2, sibling-index())' as a computed value should serialize as '2'.] + expected: FAIL + + ['calc(pow(sibling-index(), 2)' as a specified value should serialize as 'calc(pow(sibling-index(), 2))'.] + expected: FAIL + + ['calc(pow(sibling-index(), 2)' as a computed value should serialize as '1'.] + expected: FAIL + + ['calc(pow(sibling-index(), sibling-index())' as a specified value should serialize as 'calc(pow(sibling-index(), sibling-index()))'.] + expected: FAIL + + ['calc(pow(sibling-index(), sibling-index())' as a computed value should serialize as '1'.] + expected: FAIL diff --git a/tests/wpt/meta/css/filter-effects/feComposite-intersection-feTile-input.html.ini b/tests/wpt/meta/css/filter-effects/feComposite-intersection-feTile-input.html.ini new file mode 100644 index 00000000000..6fff47b1875 --- /dev/null +++ b/tests/wpt/meta/css/filter-effects/feComposite-intersection-feTile-input.html.ini @@ -0,0 +1,2 @@ +[feComposite-intersection-feTile-input.html] + expected: FAIL diff --git a/tests/wpt/meta/fetch/metadata/generated/css-font-face.https.sub.tentative.html.ini b/tests/wpt/meta/fetch/metadata/generated/css-font-face.https.sub.tentative.html.ini index d471ef76873..fb584b75a0b 100644 --- a/tests/wpt/meta/fetch/metadata/generated/css-font-face.https.sub.tentative.html.ini +++ b/tests/wpt/meta/fetch/metadata/generated/css-font-face.https.sub.tentative.html.ini @@ -47,9 +47,6 @@ [sec-fetch-user] expected: FAIL - [sec-fetch-dest] - expected: FAIL - [sec-fetch-storage-access - Same site] expected: FAIL diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/empty-iframe-load-event.html.ini b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/empty-iframe-load-event.html.ini new file mode 100644 index 00000000000..3e07e6b7d1f --- /dev/null +++ b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/empty-iframe-load-event.html.ini @@ -0,0 +1,6 @@ +[empty-iframe-load-event.html] + [Check execution order from nested timeout] + expected: FAIL + + [Check execution order on load handler] + expected: FAIL diff --git a/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-transfer.html.ini b/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-transfer.html.ini index 5d2657041d1..7e036a1c4e4 100644 --- a/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-transfer.html.ini +++ b/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-transfer.html.ini @@ -1,5 +1,5 @@ [createImageBitmap-transfer.html] - expected: ERROR + expected: TIMEOUT [Transfer ImageBitmap created from a vector HTMLImageElement] expected: FAIL diff --git a/tests/wpt/meta/html/canvas/element/manual/text/canvas.2d.disconnected.html.ini b/tests/wpt/meta/html/canvas/element/manual/text/canvas.2d.disconnected.html.ini new file mode 100644 index 00000000000..5cdcce07c65 --- /dev/null +++ b/tests/wpt/meta/html/canvas/element/manual/text/canvas.2d.disconnected.html.ini @@ -0,0 +1,2 @@ +[canvas.2d.disconnected.html] + expected: FAIL diff --git a/tests/wpt/meta/html/canvas/element/text/2d.text.measure.lang.html.ini b/tests/wpt/meta/html/canvas/element/text/2d.text.measure.lang.html.ini new file mode 100644 index 00000000000..069e5f18a03 --- /dev/null +++ b/tests/wpt/meta/html/canvas/element/text/2d.text.measure.lang.html.ini @@ -0,0 +1,3 @@ +[2d.text.measure.lang.html] + [Testing the lang attribute] + expected: FAIL diff --git a/tests/wpt/meta/html/canvas/element/text/2d.text.measure.lang.inherit.html.ini b/tests/wpt/meta/html/canvas/element/text/2d.text.measure.lang.inherit.html.ini new file mode 100644 index 00000000000..22dc67b5974 --- /dev/null +++ b/tests/wpt/meta/html/canvas/element/text/2d.text.measure.lang.inherit.html.ini @@ -0,0 +1,3 @@ +[2d.text.measure.lang.inherit.html] + [Testing the lang attribute] + expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/manual/text/canvas.2d.offscreen.lang.html.ini b/tests/wpt/meta/html/canvas/offscreen/manual/text/canvas.2d.offscreen.lang.html.ini new file mode 100644 index 00000000000..5544627aa21 --- /dev/null +++ b/tests/wpt/meta/html/canvas/offscreen/manual/text/canvas.2d.offscreen.lang.html.ini @@ -0,0 +1,2 @@ +[canvas.2d.offscreen.lang.html] + expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/manual/text/canvas.2d.offscreen.lang.inherit.html.ini b/tests/wpt/meta/html/canvas/offscreen/manual/text/canvas.2d.offscreen.lang.inherit.html.ini new file mode 100644 index 00000000000..46ed1107ac1 --- /dev/null +++ b/tests/wpt/meta/html/canvas/offscreen/manual/text/canvas.2d.offscreen.lang.inherit.html.ini @@ -0,0 +1,2 @@ +[canvas.2d.offscreen.lang.inherit.html] + expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/manual/text/canvas.2d.offscreen.transferred.lang.html.ini b/tests/wpt/meta/html/canvas/offscreen/manual/text/canvas.2d.offscreen.transferred.lang.html.ini new file mode 100644 index 00000000000..2303d27219f --- /dev/null +++ b/tests/wpt/meta/html/canvas/offscreen/manual/text/canvas.2d.offscreen.transferred.lang.html.ini @@ -0,0 +1,2 @@ +[canvas.2d.offscreen.transferred.lang.html] + expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/manual/text/canvas.2d.offscreen.transferred.lang.inherit.document.html.ini b/tests/wpt/meta/html/canvas/offscreen/manual/text/canvas.2d.offscreen.transferred.lang.inherit.document.html.ini new file mode 100644 index 00000000000..14cb2ad57df --- /dev/null +++ b/tests/wpt/meta/html/canvas/offscreen/manual/text/canvas.2d.offscreen.transferred.lang.inherit.document.html.ini @@ -0,0 +1,2 @@ +[canvas.2d.offscreen.transferred.lang.inherit.document.html] + expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/manual/text/canvas.2d.offscreen.transferred.lang.inherit.html.ini b/tests/wpt/meta/html/canvas/offscreen/manual/text/canvas.2d.offscreen.transferred.lang.inherit.html.ini new file mode 100644 index 00000000000..3c2d2b828f8 --- /dev/null +++ b/tests/wpt/meta/html/canvas/offscreen/manual/text/canvas.2d.offscreen.transferred.lang.inherit.html.ini @@ -0,0 +1,2 @@ +[canvas.2d.offscreen.transferred.lang.inherit.html] + expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/text/2d.text.measure.lang.html.ini b/tests/wpt/meta/html/canvas/offscreen/text/2d.text.measure.lang.html.ini new file mode 100644 index 00000000000..069e5f18a03 --- /dev/null +++ b/tests/wpt/meta/html/canvas/offscreen/text/2d.text.measure.lang.html.ini @@ -0,0 +1,3 @@ +[2d.text.measure.lang.html] + [Testing the lang attribute] + expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/text/2d.text.measure.lang.inherit.html.ini b/tests/wpt/meta/html/canvas/offscreen/text/2d.text.measure.lang.inherit.html.ini new file mode 100644 index 00000000000..22dc67b5974 --- /dev/null +++ b/tests/wpt/meta/html/canvas/offscreen/text/2d.text.measure.lang.inherit.html.ini @@ -0,0 +1,3 @@ +[2d.text.measure.lang.inherit.html] + [Testing the lang attribute] + expected: FAIL diff --git a/tests/wpt/meta/html/canvas/offscreen/text/2d.text.measure.lang.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/text/2d.text.measure.lang.worker.js.ini new file mode 100644 index 00000000000..39980cbd9b7 --- /dev/null +++ b/tests/wpt/meta/html/canvas/offscreen/text/2d.text.measure.lang.worker.js.ini @@ -0,0 +1,3 @@ +[2d.text.measure.lang.worker.html] + [Testing the lang attribute] + expected: FAIL diff --git a/tests/wpt/meta/html/dom/documents/dom-tree-accessors/nameditem-01.html.ini b/tests/wpt/meta/html/dom/documents/dom-tree-accessors/nameditem-01.html.ini new file mode 100644 index 00000000000..50950d2751b --- /dev/null +++ b/tests/wpt/meta/html/dom/documents/dom-tree-accessors/nameditem-01.html.ini @@ -0,0 +1,9 @@ +[nameditem-01.html] + [img elements that have a name and id attribute with same value.] + expected: FAIL + + [Dynamically updating the name attribute from img elements, should be accessible by values.] + expected: FAIL + + [Dynamically updating the id attribute from img elements, should be accessible by values.] + expected: FAIL diff --git a/tests/wpt/meta/html/dom/documents/dom-tree-accessors/nameditem-05.html.ini b/tests/wpt/meta/html/dom/documents/dom-tree-accessors/nameditem-05.html.ini index 704c73f2085..bc9680580ee 100644 --- a/tests/wpt/meta/html/dom/documents/dom-tree-accessors/nameditem-05.html.ini +++ b/tests/wpt/meta/html/dom/documents/dom-tree-accessors/nameditem-05.html.ini @@ -13,3 +13,15 @@ [An id shouldn't affect getting an embed by name] expected: FAIL + + [Dynamically removing the name attribute from embed elements, should not be accessible.] + expected: FAIL + + [Dynamically updating the name attribute from embed elements, should be accessible by its name.] + expected: FAIL + + [Dynamically updating the id attribute from embed elements, should be accessible only by its name.] + expected: FAIL + + [embed elements that is removed, should not be accessible.] + expected: FAIL diff --git a/tests/wpt/meta/html/dom/documents/dom-tree-accessors/nameditem-07.html.ini b/tests/wpt/meta/html/dom/documents/dom-tree-accessors/nameditem-07.html.ini index 2829186d845..b23c03a5a9b 100644 --- a/tests/wpt/meta/html/dom/documents/dom-tree-accessors/nameditem-07.html.ini +++ b/tests/wpt/meta/html/dom/documents/dom-tree-accessors/nameditem-07.html.ini @@ -22,3 +22,18 @@ [An id shouldn't affect getting an object by name] expected: FAIL + + [Dynamically removing the name attribute from object elements, should not be accessible.] + expected: FAIL + + [Dynamically removing the id attribute from object elements, should not be accessible.] + expected: FAIL + + [Dynamically updating the name attribute from object elements, should be accessible by its name and id.] + expected: FAIL + + [Dynamically updating the id attribute from object elements, should be accessible by its name and id.] + expected: FAIL + + [object elements that is removed, should not be accessible.] + expected: FAIL diff --git a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-040.html.ini b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-040.html.ini new file mode 100644 index 00000000000..0193f3ac3ab --- /dev/null +++ b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-040.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-040.html] + [blocking defers frames until full parsing] + expected: FAIL diff --git a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-041.html.ini b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-041.html.ini new file mode 100644 index 00000000000..34e1dea6d54 --- /dev/null +++ b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-041.html.ini @@ -0,0 +1,3 @@ +[element-render-blocking-041.html] + [blocking defers frames until full parsing] + expected: FAIL diff --git a/tests/wpt/meta/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js.ini b/tests/wpt/meta/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js.ini deleted file mode 100644 index c8a80140995..00000000000 --- a/tests/wpt/meta/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js.ini +++ /dev/null @@ -1,12 +0,0 @@ -[structured-cloning-error-stack-optional.sub.window.html] - [web API-created TypeError (structuredClone())] - expected: FAIL - - [web API-created TypeError (worker)] - expected: FAIL - - [web API-created TypeError (cross-site iframe)] - expected: FAIL - - [web API-created TypeError (same-origin iframe)] - expected: FAIL diff --git a/tests/wpt/meta/html/rendering/replaced-elements/the-option-element/option-label-whitespace-2.html.ini b/tests/wpt/meta/html/rendering/replaced-elements/the-option-element/option-label-whitespace-2.html.ini new file mode 100644 index 00000000000..d0b62d151b9 --- /dev/null +++ b/tests/wpt/meta/html/rendering/replaced-elements/the-option-element/option-label-whitespace-2.html.ini @@ -0,0 +1,2 @@ +[option-label-whitespace-2.html] + expected: FAIL diff --git a/tests/wpt/meta/html/rendering/widgets/field-sizing-textarea-relayout.html.ini b/tests/wpt/meta/html/rendering/widgets/field-sizing-textarea-relayout.html.ini deleted file mode 100644 index 02d9bcc43ae..00000000000 --- a/tests/wpt/meta/html/rendering/widgets/field-sizing-textarea-relayout.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[field-sizing-textarea-relayout.html] - expected: FAIL diff --git a/tests/wpt/meta/html/semantics/embedded-content/media-elements/offsets-into-the-media-resource/currentTime.html.ini b/tests/wpt/meta/html/semantics/embedded-content/media-elements/offsets-into-the-media-resource/currentTime.html.ini new file mode 100644 index 00000000000..f374bb50e79 --- /dev/null +++ b/tests/wpt/meta/html/semantics/embedded-content/media-elements/offsets-into-the-media-resource/currentTime.html.ini @@ -0,0 +1,4 @@ +[currentTime.html] + expected: TIMEOUT + [setting currentTime when readyState is greater than HAVE_NOTHING] + expected: TIMEOUT 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 b83d68ddd33..68203d2a082 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: CRASH [Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used] expected: TIMEOUT diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini index 7da2bc5ac80..ef88bb2e2fd 100644 --- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini +++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini @@ -1,4 +1,4 @@ [iframe_sandbox_popups_escaping-3.html] expected: TIMEOUT [Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used] - expected: TIMEOUT + expected: FAIL diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini index c6f1e5d7d84..90c8bd71ded 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 + expected: CRASH [Check that popups from a sandboxed iframe do not escape the sandbox] expected: NOTRUN 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 d5fd800f09d..ff6467094b8 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,3 @@ [iframe_sandbox_popups_nonescaping-3.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-img-element/image-loading-lazy-subframe-detached-crash.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-img-element/image-loading-lazy-subframe-detached-crash.html.ini deleted file mode 100644 index 396e716c857..00000000000 --- a/tests/wpt/meta/html/semantics/embedded-content/the-img-element/image-loading-lazy-subframe-detached-crash.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[image-loading-lazy-subframe-detached-crash.html] - expected: TIMEOUT diff --git a/tests/wpt/meta/mixed-content/gen/top.http-rp/opt-in/audio-tag.https.html.ini b/tests/wpt/meta/mixed-content/gen/top.http-rp/opt-in/audio-tag.https.html.ini index f137b6ba51c..3af98fe9c4e 100644 --- a/tests/wpt/meta/mixed-content/gen/top.http-rp/opt-in/audio-tag.https.html.ini +++ b/tests/wpt/meta/mixed-content/gen/top.http-rp/opt-in/audio-tag.https.html.ini @@ -1,4 +1,5 @@ [audio-tag.https.html] + expected: TIMEOUT [Mixed-Content: Expects blocked for audio-tag to cross-http origin and keep-scheme redirection from https context.] expected: FAIL @@ -12,13 +13,13 @@ expected: FAIL [Mixed-Content: Expects blocked for audio-tag to same-http origin and keep-scheme redirection from https context.] - expected: FAIL + expected: NOTRUN [Mixed-Content: Expects blocked for audio-tag to same-http origin and no-redirect redirection from https context.] - expected: FAIL + expected: NOTRUN [Mixed-Content: Expects blocked for audio-tag to same-http origin and swap-scheme redirection from https context.] - expected: FAIL + expected: NOTRUN [Mixed-Content: Expects blocked for audio-tag to same-https origin and swap-scheme redirection from https context.] - expected: FAIL + expected: NOTRUN diff --git a/tests/wpt/meta/subresource-integrity/signatures/tentative/accept-signature.window.js.ini b/tests/wpt/meta/subresource-integrity/signatures/tentative/accept-signature.window.js.ini index 68b6e50ddde..5e485daa4cb 100644 --- a/tests/wpt/meta/subresource-integrity/signatures/tentative/accept-signature.window.js.ini +++ b/tests/wpt/meta/subresource-integrity/signatures/tentative/accept-signature.window.js.ini @@ -10,3 +10,12 @@ [ed25519-xDnP380zcL4rJ76rXYjeHlfMyPZEOqpJYjsjEppbuXE= malformed-thing ed25519-JrQLj5P/89iXES9+vFgrIy29clF9CC/oPPsw3c5D0bs=] expected: FAIL + + [ed25519-JrQLj5P/89iXES9+vFgrIy29clF9CC/oPPsw3c5D0bs= ed25519-JrQLj5P/89iXES9+vFgrIy29clF9CC/oPPsw3c5D0bs=] + expected: FAIL + + [ed25519-JrQLj5P/89iXES9+vFgrIy29clF9CC/oPPsw3c5D0bs= ed25519-xDnP380zcL4rJ76rXYjeHlfMyPZEOqpJYjsjEppbuXE=] + expected: FAIL + + [ed25519-JrQLj5P/89iXES9+vFgrIy29clF9CC/oPPsw3c5D0bs= malformed-thing ed25519-xDnP380zcL4rJ76rXYjeHlfMyPZEOqpJYjsjEppbuXE=] + expected: FAIL diff --git a/tests/wpt/meta/wasm/jsapi/global/type.tentative.any.js.ini b/tests/wpt/meta/wasm/jsapi/global/type.tentative.any.js.ini index 6bc8c09ae52..89330feabf4 100644 --- a/tests/wpt/meta/wasm/jsapi/global/type.tentative.any.js.ini +++ b/tests/wpt/meta/wasm/jsapi/global/type.tentative.any.js.ini @@ -123,4 +123,4 @@ expected: ERROR [type.tentative.https.any.shadowrealm-in-audioworklet.html] - expected: ERROR + expected: TIMEOUT diff --git a/tests/wpt/meta/wasm/jsapi/global/valueOf.any.js.ini b/tests/wpt/meta/wasm/jsapi/global/valueOf.any.js.ini index 9198393a92f..766d339198a 100644 --- a/tests/wpt/meta/wasm/jsapi/global/valueOf.any.js.ini +++ b/tests/wpt/meta/wasm/jsapi/global/valueOf.any.js.ini @@ -18,7 +18,7 @@ expected: ERROR [valueOf.https.any.shadowrealm-in-audioworklet.html] - expected: ERROR + expected: TIMEOUT [valueOf.any.shadowrealm-in-shadowrealm.html] expected: ERROR diff --git a/tests/wpt/meta/wasm/jsapi/memory/type.tentative.any.js.ini b/tests/wpt/meta/wasm/jsapi/memory/type.tentative.any.js.ini index bcc1dbe1112..f91dc75092c 100644 --- a/tests/wpt/meta/wasm/jsapi/memory/type.tentative.any.js.ini +++ b/tests/wpt/meta/wasm/jsapi/memory/type.tentative.any.js.ini @@ -54,7 +54,7 @@ expected: ERROR [type.tentative.https.any.shadowrealm-in-audioworklet.html] - expected: ERROR + expected: TIMEOUT [type.tentative.any.shadowrealm-in-dedicatedworker.html] expected: ERROR diff --git a/tests/wpt/tests/.github/workflows/docker.yml b/tests/wpt/tests/.github/workflows/docker.yml index 6d5c7c79a05..9119c018c2f 100644 --- a/tests/wpt/tests/.github/workflows/docker.yml +++ b/tests/wpt/tests/.github/workflows/docker.yml @@ -26,7 +26,7 @@ jobs: uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 # Based on https://docs.github.com/en/actions/publishing-packages/publishing-docker-images. - name: Log in to the Container registry - uses: docker/login-action@0d4c9c5ea7693da7b068278f7b52bda2a190a446 # v3.2.0 + uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} diff --git a/tests/wpt/tests/ai/language_detection/detector.https.tentative.any.js b/tests/wpt/tests/ai/language_detection/detector.https.tentative.any.js index 337f11d338d..98968415ddd 100644 --- a/tests/wpt/tests/ai/language_detection/detector.https.tentative.any.js +++ b/tests/wpt/tests/ai/language_detection/detector.https.tentative.any.js @@ -32,6 +32,12 @@ promise_test(async t => { }, 'AILanguageDetectorFactory.create() call with an aborted signal.'); promise_test(async t => { + await testAbortPromise(t, signal => { + return ai.languageDetector.create({signal}); + }); +}, 'Aborting AILanguageDetectorFactory.create().'); + +promise_test(async t => { const controller = new AbortController(); controller.abort(); diff --git a/tests/wpt/tests/ai/translator/ai_translator_translate.tentative.https.any.js b/tests/wpt/tests/ai/translator/ai_translator_translate.tentative.https.any.js index 729cb04fb76..992215d9210 100644 --- a/tests/wpt/tests/ai/translator/ai_translator_translate.tentative.https.any.js +++ b/tests/wpt/tests/ai/translator/ai_translator_translate.tentative.https.any.js @@ -60,7 +60,7 @@ promise_test(async t => { await createTranslator({sourceLanguage: 'en', targetLanguage: 'ja'}); assert_equals(translator.sourceLanguage, 'en'); assert_equals(translator.targetLanguage, 'ja'); -}, 'AITranslator: sourceLanguage and targetLanguage are equal to their respective option passed in to AITranslatorFactory.create.') +}, 'AITranslator: sourceLanguage and targetLanguage are equal to their respective option passed in to AITranslatorFactory.create.'); promise_test(async (t) => { const translator = @@ -109,16 +109,22 @@ promise_test(async t => { promise_test(async t => { let monitorCalled = false; + let createdTranslator = false; const progressEvents = []; function monitor(m) { monitorCalled = true; m.addEventListener('downloadprogress', e => { + // No progress events should have been fired after we've created the + // translator. + assert_false(createdTranslator); + progressEvents.push(e); }); } await createTranslator({sourceLanguage: 'en', targetLanguage: 'ja', monitor}); + createdTranslator = true; // Monitor callback must be called. assert_true(monitorCalled); @@ -166,3 +172,41 @@ promise_test(async t => { assert_not_equals(translatedTranslatableString[i], translatableStrings[i]); } }, 'AITranslator.translate() echos non-translatable content'); + +promise_test(async t => { + const translator = + await createTranslator({sourceLanguage: 'en', targetLanguage: 'ja'}); + + const text = 'hello'; + const inputUsage = await translator.measureInputUsage(text); + + assert_greater_than_equal(translator.inputQuota, 0); + assert_greater_than_equal(inputUsage, 0); + + if (inputUsage < translator.inputQuota) { + assert_equals(await translator.translate(text), 'こんにちは'); + } else { + await promise_rejects_dom( + t, 'QuotaExceededError', translator.translate(text)); + } +}, 'AITranslator.measureInputUsage() and inputQuota basic usage.'); + +promise_test(async t => { + const controller = new AbortController(); + controller.abort(); + + const translator = + await createTranslator({sourceLanguage: 'en', targetLanguage: 'ja'}); + const measureInputUsagePromise = + translator.measureInputUsage('hello', {signal: controller.signal}); + + await promise_rejects_dom(t, 'AbortError', measureInputUsagePromise); +}, 'AITranslator.measureInputUsage() call with an aborted signal.'); + +promise_test(async t => { + const translator = + await createTranslator({sourceLanguage: 'en', targetLanguage: 'ja'}); + await testAbortPromise(t, signal => { + return translator.measureInputUsage('hello', {signal}); + }); +}, 'Aborting AITranslator.measureInputUsage().'); diff --git a/tests/wpt/tests/clear-site-data/clear-cache-partitioning.https.html b/tests/wpt/tests/clear-site-data/clear-cache-partitioning.https.html new file mode 100644 index 00000000000..2deadeef2d0 --- /dev/null +++ b/tests/wpt/tests/clear-site-data/clear-cache-partitioning.https.html @@ -0,0 +1,149 @@ +<!DOCTYPE html> +<body> +<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="support/clear-cache-helper.sub.js"></script> +<script> +"use strict"; + +const CLEAR_ORIGIN_CACHE = { + clear: "cache", +} + +promise_test(test => { + const TEST_SITE = { + iframe: { + cache: true, + } + } + return testCacheClear(test, [TEST_SITE, CLEAR_ORIGIN_CACHE, TEST_SITE], assert_not_equals); +}, "same site data also gets cleared in iframe"); + +promise_test(test => { + const TEST_SITE = { + iframe: { + cache: true, + secondOrigin: true, + } + } + return testCacheClear(test, [TEST_SITE, CLEAR_ORIGIN_CACHE, TEST_SITE], assert_equals); +}, "cross origin iframe data doesn't get cleared"); + +promise_test(test => { + const TEST_SITE = { + cache: true, + } + const CLEAR_ORIGIN_CACHE = { + iframe: { + clear: "cache", + secondOrigin: true, + } + } + return testCacheClear(test, [TEST_SITE, CLEAR_ORIGIN_CACHE, TEST_SITE], assert_equals); +}, "clear in cross origin iframe doesn't affect embedder"); + +promise_test(test => { + const TEST_SITE = { + cache: true, + subdomain: true, + } + return testCacheClear(test, [TEST_SITE, CLEAR_ORIGIN_CACHE, TEST_SITE], assert_equals); +}, "clearing cache doesn't affect subdomain"); + +promise_test(test => { + const TEST_SITE = { + iframe: { + secondOrigin: true, + cache: true, + } + } + const TEST_SITE_CLEAR_IFRAME = { + iframe: { + secondOrigin: true, + clear: "all", + } + } + return testCacheClear(test, [TEST_SITE, TEST_SITE_CLEAR_IFRAME, TEST_SITE], assert_not_equals); +}, "clear in cross origin iframe clears data from that iframe"); + +promise_test(test => { + const TEST_SITE = { + cache: true + }; + const TEST_SITE_CLEAR_IFRAME = { + secondOrigin: true, + iframe: { + clear: "cache", + } + } + return testCacheClear(test, [TEST_SITE, TEST_SITE_CLEAR_IFRAME, TEST_SITE], assert_equals); +}, "clear in cross origin iframe doesn't clear unpartitioned data from that cross origin"); + +promise_test(test => { + const TEST_SITE = { + secondOrigin: true, + iframe: { + cache: true, + } + } + + const TEST_SITE_CLEAR_IFRAME = { + clear: "cache" + }; + return testCacheClear(test, [TEST_SITE, TEST_SITE_CLEAR_IFRAME, TEST_SITE], assert_equals); +}, "clear in unpartitioned context doesn't clear partitioned data"); + +promise_test(test => { + const TEST_SITE = { + iframe: { + secondOrigin: true, + iframe: { + cache: true, + } + } + } + return testCacheClear(test, [TEST_SITE, CLEAR_ORIGIN_CACHE, TEST_SITE], assert_equals); +}, "clear in unpartitioned context doesn't clear double partitioned data with intermediate cross origin"); + +promise_test(test => { + const TEST_SITE = { + cache: true, + }; + + const TEST_CLEAR_IFRAME_IFRAME = { + iframe: { + secondOrigin: true, + iframe: { + clear: "cache", + } + } + } + return testCacheClear(test, [TEST_SITE, TEST_CLEAR_IFRAME_IFRAME, TEST_SITE], assert_equals); +}, "clear in double partitioned with intermediate cross origin context doesn't clear unpartitioned data"); + +promise_test(test => { + const TEST_SITE = { + iframe: { + secondOrigin: true, + iframe: { + cache: true, + } + } + } + + const TEST_CLEAR_IFRAME_IFRAME = { + iframe: { + secondOrigin: true, + iframe: { + clear: "cache", + } + } + } + return testCacheClear(test, [TEST_SITE, TEST_CLEAR_IFRAME_IFRAME, TEST_SITE], assert_not_equals); +}, "clear double partitioned context with intermediate cross origin clears that partitioned data"); + +</script> +</body> +</html> diff --git a/tests/wpt/tests/clear-site-data/clear-cache.https.html b/tests/wpt/tests/clear-site-data/clear-cache.https.html index e356001d0c8..c75c2e16bec 100644 --- a/tests/wpt/tests/clear-site-data/clear-cache.https.html +++ b/tests/wpt/tests/clear-site-data/clear-cache.https.html @@ -4,100 +4,111 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> +<script src="support/clear-cache-helper.sub.js"></script> <script> -// Here's the set-up for this test: -// Step 1 (main window) Open first window with first url putting some resource -// into the cache and maybe receiving clear-site-data header -// Step 2 (first window) Message main window with uuid -// Step 3 (main window) Open second window with second url -// Step 4 (second window) Message main window with uuid (either cached or non-cached) -// Optional Step 5 (main window) Open third window with third url -// Optional Step 6 (third window) Message main window with uuid (either cached or non-cached) -// Step 7 (main window): Assert first and last uuid not equal due to `clear-site-data: "cache"` header -function test_cache_clear(test, params1, params2, params3) { - let cache_helper = "cache_helper=" + self.crypto.randomUUID() + "&"; - let firstUrl = "/clear-site-data/support/clear-site-data-cache.py?" + cache_helper + params1 - let secondUrl = "/clear-site-data/support/clear-site-data-cache.py?" + cache_helper + params2; - let thirdUrl = params3 ? "/clear-site-data/support/clear-site-data-cache.py?" + cache_helper + params3 : null; - - return new Promise(resolve => { - window.addEventListener("message", test.step_func(e => { - // Result Step 2 - let firstUuid = e.data; - - window.addEventListener("message", test.step_func(e => { - // Result Step 4 - let secondUuid = e.data; - - if (thirdUrl === null) { - // Step 7, skipping the optional step 5 and 6 - assert_not_equals(firstUuid, secondUuid); - resolve(); - } else { - window.addEventListener("message", test.step_func(e => { - // Result Step 6 - let thirdUuid = e.data; - - // Step 7 - assert_not_equals(firstUuid, thirdUuid); - resolve(); - - }), {once: true}); - - // Step 5 - window.open(thirdUrl); - } - - }), {once: true}); - - // Step 3 - window.open(secondUrl); - }), {once: true}); - - // Step 1 - window.open(firstUrl); - }); -} - -promise_test(t => { - return test_cache_clear(t, "response=single_html&cache&clear_first=cache", "response=single_html&cache&clear_first=cache"); +promise_test(test => { + const TEST_SITE = { + cache: true, + clearFirst: "cache", + }; + return testCacheClear(test, [TEST_SITE, TEST_SITE], assert_not_equals); }, "clear cache: Document with clear-cache header doesn't get cached"); -promise_test(t => { - return test_cache_clear(t, "response=single_html&cache&clear_first=all", "response=single_html&cache&clear_first=all"); +promise_test(test => { + const TEST_SITE = { + cache: true, + clearFirst: "all", + }; + return testCacheClear(test, [TEST_SITE, TEST_SITE], assert_not_equals); }, "clear all: Document with clear-cache header doesn't get cached"); -promise_test(t => { - return test_cache_clear(t, "response=html_embed_json&clear=cache", "response=html_embed_json&clear=cache"); -}, "clear cache: Fetch on docment with clear-cache header doesn't get cached"); - -promise_test(t => { - return test_cache_clear(t, "response=html_embed_json&clear=all", "response=html_embed_json&clear=all"); -}, "clear all: Fetch on docment with clear-cache header doesn't get cached"); - -promise_test(t => { - return test_cache_clear(t, "response=html_embed_json", "response=html_embed_json&clear=cache"); +promise_test(test => { + const TEST_SITE_INITAL = { + response: "html_embed_json", + clear: "cache", + }; + const TEST_SITE_FINAL = { + response: "html_embed_json", + }; + // Clear-Cache header doesn't affect fetch on document due to clear-cache + // being initiated in a point of time. The fetch happens later and stays + // in the cache. + return testCacheClear(test, [TEST_SITE_INITAL, TEST_SITE_FINAL], assert_equals); +}, "clear cache: Fetch on docment with clear-cache header is unaffected"); + +promise_test(test => { + const TEST_SITE_INITAL = { + response: "html_embed_json", + clear: "all", + }; + const TEST_SITE_FINAL = { + response: "html_embed_json", + }; + // same as above + return testCacheClear(test, [TEST_SITE_INITAL, TEST_SITE_FINAL], assert_equals); +}, "clear all: Fetch on docment with clear-cache header is unaffected"); + +promise_test(test => { + const TEST_SITE_INITAL = { + response: "html_embed_json", + }; + const TEST_SITE_FINAL = { + response: "html_embed_json", + clear: "cache", + }; + return testCacheClear(test, [TEST_SITE_INITAL, TEST_SITE_FINAL], assert_not_equals); }, "clear cache: Previously cached fetch gets cleared"); -promise_test(t => { - return test_cache_clear(t, "response=html_embed_json", "response=html_embed_json&clear=all"); +promise_test(test => { + const TEST_SITE_INITAL = { + response: "html_embed_json", + }; + const TEST_SITE_FINAL = { + response: "html_embed_json", + clear: "all", + }; + return testCacheClear(test, [TEST_SITE_INITAL, TEST_SITE_FINAL], assert_not_equals); }, "clear all: Previously cached fetch gets cleared"); -promise_test(t => { - return test_cache_clear(t, "response=html_embed_json", "response=single_html&clear=cache", "response=html_embed_json"); +promise_test(test => { + const TEST_SITE = { + response: "html_embed_json", + }; + const TEST_SITE_CLEAR = { + clear: "cache", + }; + return testCacheClear(test, [TEST_SITE, TEST_SITE_CLEAR, TEST_SITE], assert_not_equals); }, "clear cache: Clear fetch on intermediate navigation"); -promise_test(t => { - return test_cache_clear(t, "response=html_embed_json", "response=single_html&clear=all", "response=html_embed_json"); +promise_test(test => { + const TEST_SITE = { + response: "html_embed_json", + }; + const TEST_SITE_CLEAR = { + clear: "all", + }; + return testCacheClear(test, [TEST_SITE, TEST_SITE_CLEAR, TEST_SITE], assert_not_equals); }, "clear all: Clear fetch on intermediate navigation"); -promise_test(t => { - return test_cache_clear(t, "response=single_html&cache", "response=single_html&clear=cache", "response=single_html&cache"); +promise_test(test => { + const TEST_SITE = { + cache: true, + }; + const TEST_SITE_CLEAR = { + clear: "cache", + }; + return testCacheClear(test, [TEST_SITE, TEST_SITE_CLEAR, TEST_SITE], assert_not_equals); }, "clear cache: Clear document in intermediate load"); -promise_test(t => { - return test_cache_clear(t, "response=single_html&cache", "response=single_html&clear=all", "response=single_html&cache"); +promise_test(test => { + const TEST_SITE = { + cache: true, + }; + const TEST_SITE_CLEAR = { + clear: "all", + }; + return testCacheClear(test, [TEST_SITE, TEST_SITE_CLEAR, TEST_SITE], assert_not_equals); }, "clear all: Clear document in intermediate load"); </script> diff --git a/tests/wpt/tests/clear-site-data/clear-cache-partitioning.sub.https.html b/tests/wpt/tests/clear-site-data/support/clear-cache-helper.sub.js index b3841450b5a..2b2d35abfc5 100644 --- a/tests/wpt/tests/clear-site-data/clear-cache-partitioning.sub.https.html +++ b/tests/wpt/tests/clear-site-data/support/clear-cache-helper.sub.js @@ -1,10 +1,7 @@ -<!DOCTYPE html> -<body> -<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> +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict" /** * Constructs a url for an intermediate "bounce" hop which represents a tracker. @@ -18,7 +15,10 @@ * Clear-Site-Data header. * @param {(null|'cache'|'all')} [options.clear_first] - whether to send the * Clear-Site-Data header on first response - * @param {*} [options.iframe] - iframe same parameters as options (recursive) + * @param {string} [response] - which response to elict - defaults to "single_html". Other + * options can be found in "clear-site-data-cache.py" server helper. + * @param {*} [options.iframe] - iframe same parameters as options (recursive). Only works on + * "single_html" variation of response */ function getUrl(cacheHelper, { subdomain = false, @@ -26,6 +26,7 @@ function getUrl(cacheHelper, { cache = false, clear = null, clearFirst = null, + response = "single_html", iframe = null, }) { let url = "https://"; @@ -43,7 +44,7 @@ function getUrl(cacheHelper, { url = new URL(url); let params = new URLSearchParams(); params.append("cache_helper", cacheHelper); - params.append("response", "single_html") + params.append("response", response) if (clear !== null) { params.append("clear", clear); } @@ -130,142 +131,3 @@ function testCacheClear(test, params, assert) { }); } -const CLEAR_ORIGIN_CACHE = { - clear: "cache", -} - -promise_test(test => { - const TEST_SITE = { - iframe: { - cache: true, - } - } - return testCacheClear(test, [TEST_SITE, CLEAR_ORIGIN_CACHE, TEST_SITE], assert_not_equals); -}, "same site data also gets cleared in iframe"); - -promise_test(test => { - const TEST_SITE = { - iframe: { - cache: true, - secondOrigin: true, - } - } - return testCacheClear(test, [TEST_SITE, CLEAR_ORIGIN_CACHE, TEST_SITE], assert_equals); -}, "cross origin iframe data doesn't get cleared"); - -promise_test(test => { - const TEST_SITE = { - cache: true, - } - const CLEAR_ORIGIN_CACHE = { - iframe: { - clear: "cache", - secondOrigin: true, - } - } - return testCacheClear(test, [TEST_SITE, CLEAR_ORIGIN_CACHE, TEST_SITE], assert_equals); -}, "clear in cross origin iframe doesn't affect embedder"); - -promise_test(test => { - const TEST_SITE = { - cache: true, - subdomain: true, - } - return testCacheClear(test, [TEST_SITE, CLEAR_ORIGIN_CACHE, TEST_SITE], assert_equals); -}, "clearing cache doesn't affect subdomain"); - -promise_test(test => { - const TEST_SITE = { - iframe: { - secondOrigin: true, - cache: true, - } - } - const TEST_SITE_CLEAR_IFRAME = { - iframe: { - secondOrigin: true, - clear: "all", - } - } - return testCacheClear(test, [TEST_SITE, TEST_SITE_CLEAR_IFRAME, TEST_SITE], assert_not_equals); -}, "clear in cross origin iframe clears data from that iframe"); - -promise_test(test => { - const TEST_SITE = { - cache: true - }; - const TEST_SITE_CLEAR_IFRAME = { - secondOrigin: true, - iframe: { - clear: "cache", - } - } - return testCacheClear(test, [TEST_SITE, TEST_SITE_CLEAR_IFRAME, TEST_SITE], assert_equals); -}, "clear in cross origin iframe doesn't clear unpartitioned data from that cross origin"); - -promise_test(test => { - const TEST_SITE = { - secondOrigin: true, - iframe: { - cache: true, - } - } - - const TEST_SITE_CLEAR_IFRAME = { - clear: "cache" - }; - return testCacheClear(test, [TEST_SITE, TEST_SITE_CLEAR_IFRAME, TEST_SITE], assert_equals); -}, "clear in unpartitioned context doesn't clear partitioned data"); - -promise_test(test => { - const TEST_SITE = { - iframe: { - secondOrigin: true, - iframe: { - cache: true, - } - } - } - return testCacheClear(test, [TEST_SITE, CLEAR_ORIGIN_CACHE, TEST_SITE], assert_equals); -}, "clear in unpartitioned context doesn't clear double partitioned data with intermediate cross origin"); - -promise_test(test => { - const TEST_SITE = { - cache: true, - }; - - const TEST_CLEAR_IFRAME_IFRAME = { - iframe: { - secondOrigin: true, - iframe: { - clear: "cache", - } - } - } - return testCacheClear(test, [TEST_SITE, TEST_CLEAR_IFRAME_IFRAME, TEST_SITE], assert_equals); -}, "clear in double partitioned with intermediate cross origin context doesn't clear unpartitioned data"); - -promise_test(test => { - const TEST_SITE = { - iframe: { - secondOrigin: true, - iframe: { - cache: true, - } - } - } - - const TEST_CLEAR_IFRAME_IFRAME = { - iframe: { - secondOrigin: true, - iframe: { - clear: "cache", - } - } - } - return testCacheClear(test, [TEST_SITE, TEST_CLEAR_IFRAME_IFRAME, TEST_SITE], assert_not_equals); -}, "clear double partitioned context with intermediate cross origin clears that partitioned data"); - -</script> -</body> -</html> diff --git a/tests/wpt/tests/css/compositing/root-element-background-margin-opacity-ref.html b/tests/wpt/tests/css/compositing/root-element-background-margin-opacity-ref.html new file mode 100644 index 00000000000..afe543029d8 --- /dev/null +++ b/tests/wpt/tests/css/compositing/root-element-background-margin-opacity-ref.html @@ -0,0 +1,3 @@ +<!DOCTYPE html> +<div style="position: absolute; top: 100px; left: 100px; width: 100px; height: 100px; + background: green; opacity: 0.5"></div> diff --git a/tests/wpt/tests/css/compositing/root-element-background-margin-opacity.html b/tests/wpt/tests/css/compositing/root-element-background-margin-opacity.html new file mode 100644 index 00000000000..e1e7fed5a66 --- /dev/null +++ b/tests/wpt/tests/css/compositing/root-element-background-margin-opacity.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<link rel="help" href="https://www.w3.org/TR/compositing-1/#pagebackdrop"> +<link rel="help" href="https://crbug.com/40904650"> +<link rel="match" href="root-element-background-margin-opacity-ref.html"> +<meta name="fuzzy" content="maxDifference=0-1;totalPixels=0-10000"> +<style> +html { + margin: 100px; + width: 100px; + height: 100px; + background: linear-gradient(green, green) top left no-repeat; + opacity: 0.5; +} +</style> diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-center-htb-htb.html b/tests/wpt/tests/css/css-anchor-position/anchor-center-htb-htb.html index 50fc0906107..88e01619caf 100644 --- a/tests/wpt/tests/css/css-anchor-position/anchor-center-htb-htb.html +++ b/tests/wpt/tests/css/css-anchor-position/anchor-center-htb-htb.html @@ -59,7 +59,7 @@ <div class="container"> <div class="anchor"></div> - <div class="target" style="right: 20px;" data-expected-width="80" data-offset-x="20"></div> + <div class="target" style="right: 20px;" data-expected-width="80" data-offset-x="0"></div> </div> <div class="container"> @@ -80,7 +80,7 @@ <!-- both insets --> <div class="container"> <div class="anchor"></div> - <div class="target" style="left: 10px; right: 20px;" data-expected-width="70" data-offset-x="30"></div> + <div class="target" style="left: 10px; right: 20px;" data-expected-width="70" data-offset-x="10"></div> </div> <div class="container"> diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-center-htb-vrl.html b/tests/wpt/tests/css/css-anchor-position/anchor-center-htb-vrl.html index eba72d64913..f777a2caf88 100644 --- a/tests/wpt/tests/css/css-anchor-position/anchor-center-htb-vrl.html +++ b/tests/wpt/tests/css/css-anchor-position/anchor-center-htb-vrl.html @@ -60,7 +60,7 @@ <div class="container"> <div class="anchor"></div> - <div class="target" style="bottom: 20px;" data-expected-height="80" data-offset-y="20"></div> + <div class="target" style="bottom: 20px;" data-expected-height="80" data-offset-y="0"></div> </div> <div class="container"> @@ -81,7 +81,7 @@ <!-- both insets --> <div class="container"> <div class="anchor"></div> - <div class="target" style="top: 10px; bottom: 20px;" data-expected-height="70" data-offset-y="30"></div> + <div class="target" style="top: 10px; bottom: 20px;" data-expected-height="70" data-offset-y="10"></div> </div> <div class="container"> diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-center-vrl-htb.html b/tests/wpt/tests/css/css-anchor-position/anchor-center-vrl-htb.html index 8f7af0414ed..595f7ea1ecd 100644 --- a/tests/wpt/tests/css/css-anchor-position/anchor-center-vrl-htb.html +++ b/tests/wpt/tests/css/css-anchor-position/anchor-center-vrl-htb.html @@ -61,7 +61,7 @@ <div class="container"> <div class="anchor"></div> - <div class="target" style="right: 20px;" data-expected-width="80" data-offset-x="20"></div> + <div class="target" style="right: 20px;" data-expected-width="80" data-offset-x="0"></div> </div> <div class="container"> @@ -82,7 +82,7 @@ <!-- both insets --> <div class="container"> <div class="anchor"></div> - <div class="target" style="left: 10px; right: 20px;" data-expected-width="70" data-offset-x="30"></div> + <div class="target" style="left: 10px; right: 20px;" data-expected-width="70" data-offset-x="10"></div> </div> <div class="container"> diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-center-vrl-vrl.html b/tests/wpt/tests/css/css-anchor-position/anchor-center-vrl-vrl.html index d8e90057dc3..e22391a8192 100644 --- a/tests/wpt/tests/css/css-anchor-position/anchor-center-vrl-vrl.html +++ b/tests/wpt/tests/css/css-anchor-position/anchor-center-vrl-vrl.html @@ -60,7 +60,7 @@ <div class="container"> <div class="anchor"></div> - <div class="target" style="bottom: 20px;" data-expected-height="80" data-offset-y="20"></div> + <div class="target" style="bottom: 20px;" data-expected-height="80" data-offset-y="0"></div> </div> <div class="container"> @@ -81,7 +81,7 @@ <!-- both insets --> <div class="container"> <div class="anchor"></div> - <div class="target" style="top: 10px; bottom: 20px;" data-expected-height="70" data-offset-y="30"></div> + <div class="target" style="top: 10px; bottom: 20px;" data-expected-height="70" data-offset-y="10"></div> </div> <div class="container"> diff --git a/tests/wpt/tests/css/css-anchor-position/position-area-anchor-outside.html b/tests/wpt/tests/css/css-anchor-position/position-area-anchor-outside.html index d8fb5dbc98f..9b0c74170aa 100644 --- a/tests/wpt/tests/css/css-anchor-position/position-area-anchor-outside.html +++ b/tests/wpt/tests/css/css-anchor-position/position-area-anchor-outside.html @@ -8,6 +8,9 @@ position: relative; width: 400px; height: 400px; + margin: 0 auto; + border: 2px solid; + background: #eee; } #anchor { position: absolute; @@ -16,12 +19,15 @@ width: 100px; height: 100px; anchor-name: --anchor; + background: blue; } #anchored { position: absolute; align-self: stretch; justify-self: stretch; position-anchor: --anchor; + background: #FA08; + outline: 1px solid orange; } </style> <div id="container"> @@ -40,17 +46,17 @@ }, "Offsets for position-area: " + position_area); } - test_position_area("span-all", {left:0, top:0, width:400, height:400}); + test_position_area("span-all", {left:-200, top:0, width:600, height:600}); - test_position_area("left span-all", {left:-200, top:0, width:0, height:400}); - test_position_area("span-left span-all", {left:-100, top:0, width:0, height:400}); - test_position_area("span-all center", {left:-200, top:0, width:100, height:400}); - test_position_area("span-right span-all", {left:-200, top:0, width:600, height:400}); - test_position_area("right span-all", {left:-100, top:0, width:500, height:400}); + test_position_area("left span-all", {left:-200, top:0, width:0, height:600}); + test_position_area("span-left span-all", {left:-200, top:0, width:100, height:600}); + test_position_area("span-all center", {left:-200, top:0, width:100, height:600}); + test_position_area("span-right span-all", {left:-200, top:0, width:600, height:600}); + test_position_area("right span-all", {left:-100, top:0, width:500, height:600}); - test_position_area("top span-all", {left:0, top:0, width:400, height:500}); - test_position_area("span-top span-all", {left:0, top:0, width:400, height:600}); - test_position_area("center span-all", {left:0, top:500, width:400, height:100}); - test_position_area("span-bottom span-all", {left:0, top:500, width:400, height:0}); - test_position_area("bottom span-all", {left:0, top:600, width:400, height:0}); + test_position_area("top span-all", {left:-200, top:0, width:600, height:500}); + test_position_area("span-top span-all", {left:-200, top:0, width:600, height:600}); + test_position_area("center span-all", {left:-200, top:500, width:600, height:100}); + test_position_area("span-bottom span-all", {left:-200, top:500, width:600, height:100}); + test_position_area("bottom span-all", {left:-200, top:600, width:600, height:0}); </script> diff --git a/tests/wpt/tests/css/css-anchor-position/position-area-anchor-partially-outside.html b/tests/wpt/tests/css/css-anchor-position/position-area-anchor-partially-outside.html index e23cea47478..3dd537d26e0 100644 --- a/tests/wpt/tests/css/css-anchor-position/position-area-anchor-partially-outside.html +++ b/tests/wpt/tests/css/css-anchor-position/position-area-anchor-partially-outside.html @@ -8,6 +8,9 @@ position: relative; width: 400px; height: 400px; + margin: 100px auto; + border: 2px solid; + background: #eee; } #anchor { position: absolute; @@ -16,12 +19,15 @@ width: 100px; height: 100px; anchor-name: --anchor; + background: blue; } #anchored { position: absolute; align-self: stretch; justify-self: stretch; position-anchor: --anchor; + background: #FA08; + outline: 1px solid orange; } </style> <div id="container"> @@ -40,17 +46,17 @@ }, "Offsets for position-area: " + position_area); } - test_position_area("span-all", {left:0, top:0, width:400, height:400}); + test_position_area("span-all", {left:0, top:-50, width:450, height:450}); - test_position_area("left span-all", {left:0, top:0, width:350, height:400}); - test_position_area("span-left span-all", {left:0, top:0, width:450, height:400}); - test_position_area("span-all center", {left:350, top:0, width:100, height:400}); - test_position_area("span-right span-all", {left:350, top:0, width:50, height:400}); - test_position_area("right span-all", {left:450, top:0, width:0, height:400}); + test_position_area("left span-all", {left:0, top:-50, width:350, height:450}); + test_position_area("span-left span-all", {left:0, top:-50, width:450, height:450}); + test_position_area("span-all center", {left:350, top:-50, width:100, height:450}); + test_position_area("span-right span-all", {left:350, top:-50, width:100, height:450}); + test_position_area("right span-all", {left:450, top:-50, width:0, height:450}); - test_position_area("top span-all", {left:0, top:-50, width:400, height:0}); - test_position_area("span-top span-all", {left:0, top:0, width:400, height:50}); - test_position_area("center span-all", {left:0, top:-50, width:400, height:100}); - test_position_area("span-bottom span-all", {left:0, top:-50, width:400, height:450}); - test_position_area("bottom span-all", {left:0, top:50, width:400, height:350}); + test_position_area("top span-all", {left:0, top:-50, width:450, height:0}); + test_position_area("span-top span-all", {left:0, top:-50, width:450, height:100}); + test_position_area("center span-all", {left:0, top:-50, width:450, height:100}); + test_position_area("span-bottom span-all", {left:0, top:-50, width:450, height:450}); + test_position_area("bottom span-all", {left:0, top:50, width:450, height:350}); </script> diff --git a/tests/wpt/tests/css/css-anchor-position/position-area-basic.html b/tests/wpt/tests/css/css-anchor-position/position-area-basic.html index 6cbaf8e5014..2a568cc8028 100644 --- a/tests/wpt/tests/css/css-anchor-position/position-area-basic.html +++ b/tests/wpt/tests/css/css-anchor-position/position-area-basic.html @@ -26,12 +26,17 @@ position: absolute; width: 400px; height: 400px; + margin: 0 auto; + border: 2px solid; + background: #eee; } #anchored { position: absolute; align-self: stretch; justify-self: stretch; position-anchor: --anchor; + background: #FA08; + outline: 1px solid orange; } #anchor { margin-top: 150px; @@ -39,6 +44,7 @@ width: 150px; height: 75px; anchor-name: --anchor; + background: blue; } </style> <div id="container"> diff --git a/tests/wpt/tests/css/css-animations/animate-with-background-color-oklch-001-ref.html b/tests/wpt/tests/css/css-animations/animate-with-background-color-oklch-001-ref.html new file mode 100644 index 00000000000..92b91077f3f --- /dev/null +++ b/tests/wpt/tests/css/css-animations/animate-with-background-color-oklch-001-ref.html @@ -0,0 +1,16 @@ +<!doctype html> +<html> +<meta charset="utf-8"> +<title>CSS Animations Test: animation with background-color "oklch"</title> +<link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com"> +<link rel="help" href="https://www.w3.org/TR/css-animations-2/"> +<meta name="assert" content="Check that the background-color is animated with oklch correctly"> +<style> +#box { + block-size: 200px; + inline-size: 200px; + background-color: oklch(45% 0.2 264); +} +</style> +<div id="box"></div> +</html> diff --git a/tests/wpt/tests/css/css-animations/animate-with-background-color-oklch-001.html b/tests/wpt/tests/css/css-animations/animate-with-background-color-oklch-001.html new file mode 100644 index 00000000000..37d10e07cdb --- /dev/null +++ b/tests/wpt/tests/css/css-animations/animate-with-background-color-oklch-001.html @@ -0,0 +1,34 @@ +<!doctype html> +<html class="reftest-wait"> +<meta charset="utf-8"> +<title>CSS Animations Test: animation with background-color "oklch"</title> +<link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com"> +<link rel="help" href="https://www.w3.org/TR/css-animations-2/"> +<link rel="match" href="animate-with-background-color-oklch-001-ref.html"> +<meta name="assert" content="Check that the background-color is animated with oklch correctly"> +<style> +@keyframes bg-color-oklch { + to { + background-color: oklch(45% 0.2 264); /* blue */ + } +} +#box { + block-size: 200px; + inline-size: 200px; + background-color: #ff0000; + animation: linear 1s forwards bg-color-oklch; +} +</style> +<div id="box"></div> +<script> +window.onload = () => { + requestAnimationFrame(() => { + const anim = document.getAnimations()[0]; + anim.finish(); + requestAnimationFrame(() => { + document.documentElement.classList.remove("reftest-wait"); + }); + }); +}; +</script> +</html> diff --git a/tests/wpt/tests/css/css-animations/animate-with-background-color-oklch-002.html b/tests/wpt/tests/css/css-animations/animate-with-background-color-oklch-002.html new file mode 100644 index 00000000000..ee6847c11bf --- /dev/null +++ b/tests/wpt/tests/css/css-animations/animate-with-background-color-oklch-002.html @@ -0,0 +1,85 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <title>CSS animations with background-color from legacy rgb to oklch</title> + <link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com"> + <link rel="help" href="https://www.w3.org/TR/css-animations-2/"> +</head> +<style> + @keyframes bg-color-oklch { + to { + background-color: oklch(45% 0.2 264); /* blue */ + } + } + @keyframes bg-mix-color-oklch { + to { + background-color: color-mix(in oklch, oklch(45% 0.2 264), oklch(45% 0.2 264)); + } + } + + #target { + background: #ff0000; + animation-duration: 1s; + animation-timing-function: linear; + animation-play-state: paused; + animation-fill-mode: forwards; + height: 100px; + width: 100px; + } + .bg-color-oklch { + animation-name: bg-color-oklch; + } + .bg-mix-color-oklch { + animation-name: bg-mix-color-oklch; + } +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/web-animations/testcommon.js"></script> +<script src="/css/support/color-testcommon.js"></script> + +<body> + <div id="target"></div> + <div id="test"></div> +</body> +<script> + 'use strict'; + + async function runAnimationTest(t, name, expected_colors) { + const target = document.getElementById('target'); + target.classList.add(name); + t.add_cleanup(() => { + target.classList.remove(name); + }); + const anim = document.getAnimations()[0]; + await anim.ready; + expected_colors.forEach(data => { + anim.currentTime = 1000 * data.at; + const actual = getComputedStyle(target).backgroundColor; + const expected = data.value; + assert_equals(actual, expected, `Background color at ${100*data.at}% animation progress`); + }); + } + + const bg_color_legacy_rgb_to_oklch = [ + { at: 0, value: 'rgb(255, 0, 0)' }, + { at: 0.25, value: 'oklab(0.583475 0.163433 0.0446685)' }, + { at: 0.5, value: 'oklab(0.538983 0.101987 -0.0365225)' }, + { at: 0.75, value: 'oklab(0.494492 0.0405407 -0.117713)' }, + { at: 1, value: 'oklab(0.45 -0.0209057 -0.198904)' } + ]; + + window.onload = async () => { + promise_test(t => { + return runAnimationTest(t, 'bg-color-oklch', bg_color_legacy_rgb_to_oklch); + }, 'Animate from legacy rgb to oklch'); + + promise_test(t => { + return runAnimationTest(t, 'bg-mix-color-oklch', bg_color_legacy_rgb_to_oklch); + }, 'Animate from legacy rgb to color-mix oklch'); + }; + +</script> +</html> diff --git a/tests/wpt/tests/css/css-animations/crashtests/chrome-bug-404743651.html b/tests/wpt/tests/css/css-animations/crashtests/chrome-bug-404743651.html new file mode 100644 index 00000000000..23886237402 --- /dev/null +++ b/tests/wpt/tests/css/css-animations/crashtests/chrome-bug-404743651.html @@ -0,0 +1,17 @@ +<!DOCTYPE html> +<title>CSS Animations: Chrome crash for getKeyframes() when animating background-image</title> +<link rel="help" href="https://crbug.com/404743651"> +<style> + @keyframes animate { + to { background-image: url(foo.jpg); } + } + #target { + animation: animate 100s; + } +</style> +<div id="target"></div> +<script> + for (let anim of document.getAnimations()) { + anim.effect.getKeyframes(); + } +</script> diff --git a/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html b/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html index 688f01c8668..36fc7a88825 100644 --- a/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html +++ b/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html @@ -5,6 +5,11 @@ <script src="resources/resolve-corner-style.js"></script> <script src="resources/corner-utils.js"></script> <script src="resources/corner-shape.js"></script> +<style> + body { + margin: 0; + } +</style> <script> const canvas = document.getElementById("target"); const params = new URLSearchParams(location.search); diff --git a/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-any.html b/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-any.html index 9c256eb8977..5b197317eb1 100644 --- a/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-any.html +++ b/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-any.html @@ -4,6 +4,9 @@ <link rel="help" href="https://drafts.csswg.org/css-borders-4/#corner-shaping"> <link rel="match" href="corner-shape-any-ref.html"> <meta name="variant" content="?corner-shape=squircle&border-radius=50%"> +<meta name="variant" content="?corner-shape=squircle&border-top-left-radius=25%&border-width=10px"> +<meta name="variant" content="?corner-shape=squircle&border-radius=25%&border-width=20px"> +<meta name="variant" content="?corner-top-left-shape=superellipse(6)&border-radius=20%&border-width=10px"> <meta name="variant" content="?corner-shape=squircle&border-top-left-radius=30%"> <meta name="variant" content="?corner-shape=squircle&border-top-right-radius=30px"> <meta name="variant" content="?corner-shape=straight&border-bottom-leftradius=5px"> @@ -13,13 +16,31 @@ <meta name="variant" content="?corner-top-right-shape=superellipse(0.1)&border-top-right-radius=50px"> <meta name="variant" content="?corner-bottom-left-shape=bevel&border-bottom-left-radius=30px"> <meta name="variant" content="?corner-bottom-right-shape=superellipse(1.9)&border-bottom-right-radius=50%"> +<meta name="variant" content="?corner-top-left-shape=bevel&border-width=10px&border-color=black"> +<meta name="variant" content="?corner-top-right-shape=bevel&border-width=10px&border-color=black"> +<meta name="variant" content="?corner-bottom-left-shape=bevel&border-width=10px&border-radius=20px"> +<meta name="variant" content="?corner-bottom-right-shape=bevel&border-width=10px&border-radius=20px"> +<meta name="variant" content="?corner-bottom-right-shape=bevel&corner-bottom-left-shape=bevel"> +<meta name="variant" content="?corner-top-left-shape=bevel&border-radius=40px"> +<meta name="variant" content="?corner-top-left-shape=scoop&border-radius=40px"> +<meta name="variant" content="?corner-top-left-shape=superellipse(0.2)&border-radius=40px"> +<meta name="variant" content="?corner-top-left-shape=superellipse(0.3)&border-radius=40%"> +<meta name="variant" content="?corner-top-left-shape=superellipse(1.2)&border-radius=40px"> +<meta name="variant" content="?corner-top-left-shape=superellipse(0.8)&border-radius=40px"> +<meta name="variant" content="?corner-top-left-shape=bevel&border-radius=40px&border-width=10px"> <meta name="fuzzy" content="maxDifference=0-180;totalPixels=0-520"> <style> + body { + margin: 0; + } #target { width: 200px; height: 100px; box-sizing: border-box; background: green; + border-style: solid; + border-color: black; + border-width: 0; } </style> <div id="target"></div> diff --git a/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-render-ref.html b/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-render-ref.html deleted file mode 100644 index 1a9043cbc82..00000000000 --- a/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-render-ref.html +++ /dev/null @@ -1,172 +0,0 @@ -<!DOCTYPE html> -<head> -<meta charset="utf-8"> -<title>CSS Borders and Box Decorations 4: 'corner-shape' rendering</title> -</head> -<body> -<canvas width="200" height="200" id="canvas"></canvas> -<style> - canvas { - width: 200px; - height: 200px; - } -</style> -<script> -const canvas = document.getElementById("canvas"); -const params = new URLSearchParams(location.search); -const style = Object.fromEntries(params.entries()); -const { width, height } = canvas; - -// Populate defaults and constraints. -for (const vSide of ["top", "bottom"]) { - for (const hSide of ["left", "right"]) { - let shape = - style[`corner-${vSide}-${hSide}-shape`] || - style["corner-shape"] || - "round"; - const hWidth = parseFloat( - style[`border-${hSide}-width`] || style["border-width"] || "10px" - ); - const vWidth = parseFloat( - style[`border-${vSide}-width`] || style["border-width"] || "10px" - ); - let radius = ( - style[`border-${vSide}-${hSide}-radius`] || - style["border-radius"] || - "20px" - ).match(/[0-9]*(\.[0-9]+)?/)?.[0]; - - radius = [ - Math.min(parseFloat(radius), width / 2), - Math.min(parseFloat(radius), height / 2) - ]; - style[`corner-${vSide}-${hSide}-shape`] = shape; - style[`border-${vSide}-${hSide}-radius`] = radius; - style[`border-${hSide}-width`] = hWidth; - style[`border-${vSide}-width`] = vWidth; - } -} - -const ctx = canvas.getContext("2d"); -const keywords = {bevel: 1, round: 2}; -// Adjust outer width for curvature -const outer_width = ["top", "bottom"].flatMap((vSide) => - ["left", "right"].map((hSide) => { - const corner = `${vSide}-${hSide}`; - let shape = style[`corner-${corner}-shape`]; - shape = keywords[shape] || shape; - const radius = style[`border-${corner}-radius`]; - const hWidth = style[`border-${hSide}-width`]; - const vWidth = style[`border-${vSide}-width`]; - if (shape >= 2.) - return radius; - if (shape <= 0.5) - return [radius[0] - vWidth, radius[1] - hWidth]; - const offset = Math.sqrt(2. / shape) - 1; - return [radius[0] - vWidth * offset, radius[1] - hWidth * offset]; - }) -); -let cursor = []; -function lineTo(x, y) { - ctx.lineTo(x, y); - cursor = [x, y]; -} -function moveTo(x, y) { - ctx.moveTo(x, y); - cursor = [x, y]; -} - -function cornerTo(x, y, corner) { - if (x == cursor[0] && y === cursor[1]) return; - const shape = style[`corner-${corner}-shape`]; - - // TODO: add other curves. - if (shape === "bevel") - lineTo(x, y); - else { - ctx.arcTo( - corner === "top-left" || corner === "bottom-right" ? cursor[0] : x, - corner === "top-left" || corner === "bottom-right" ? y : cursor[1], - x, - y, - Math.abs(x - cursor[0]) - ); - cursor = [x, y]; - } -} - -ctx.clearRect(0, 0, width, height); -ctx.beginPath(); - - -moveTo(width - outer_width[1][0], 0); -cornerTo(width, outer_width[1][1], "top-right"); -lineTo(width, height - outer_width[3][1]); -cornerTo(width - outer_width[3][0], height, "bottom-right"); -lineTo(outer_width[2][0], height); -cornerTo(0, height - outer_width[2][1], "bottom-left"); -lineTo(0, outer_width[0][1]); -cornerTo(outer_width[0][0], 0, "top-left"); -lineTo(width - outer_width[1][0], 0); - -// Inner path -moveTo( - Math.max(style["border-top-left-radius"][0], style["border-left-width"]), - style["border-top-width"] -); - -lineTo(width - style["border-top-right-radius"][0], style["border-top-width"]); -cornerTo( - width - style["border-right-width"], - Math.max(style["border-top-width"], style["border-top-right-radius"][1]), - "top-right" -); - -lineTo( - width - style["border-right-width"], - height - - Math.max( - style["border-bottom-width"], - style["border-bottom-right-radius"][1] - ) -); - -cornerTo( - width - - Math.max( - style["border-right-width"], - style["border-bottom-right-radius"][0] - ), - height - style["border-bottom-width"], - "bottom-right" -); - -lineTo( - Math.max(style["border-left-width"], style["border-bottom-left-radius"][0]), - height - style["border-bottom-width"] -); - -cornerTo( - style["border-left-width"], - height - - Math.max(style["border-top-width"], style["border-bottom-left-radius"][1]), - "bottom-left" -); - -lineTo( - style["border-left-width"], - Math.max(style["border-top-width"], style["border-top-left-radius"][1]) -); -cornerTo( - Math.max(style["border-left-width"], style["border-top-left-radius"][0]), - style["border-top-width"], - "top-left" -); - -if ("background-color" in style) { - ctx.fillStyle = style["background-color"]; - ctx.fill("nonzero"); -} -ctx.fillStyle = "black"; -ctx.fill("evenodd"); -</script> diff --git a/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-render.html b/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-render.html deleted file mode 100644 index 6b9acb3447f..00000000000 --- a/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-render.html +++ /dev/null @@ -1,37 +0,0 @@ -<!DOCTYPE html> -<head> -<meta charset="utf-8"> -<title>CSS Borders and Box Decorations 4: 'corner-shape' rendering</title> -<link rel="help" href="https://drafts.csswg.org/css-borders-4/#corner-shaping"> -<link rel="match" href="corner-shape-render-ref.html"> -<meta name="variant" content="?corner-shape=bevel"> -<meta name="variant" content="?corner-top-left-shape=bevel"> -<meta name="variant" content="?corner-top-right-shape=bevel"> -<meta name="variant" content="?corner-bottom-left-shape=bevel"> -<meta name="variant" content="?corner-bottom-right-shape=bevel"> -<meta name="variant" content="?corner-bottom-right-shape=bevel&corner-bottom-left-shape=bevel"> -<meta name="variant" content="?corner-top-left-shape=bevel&border-radius=40px"> -<meta name="variant" content="?corner-top-right-shape=bevel&corner-bottom-right-shape=bevel&border-radius=80px"> -<meta name="variant" content="?corner-top-right-shape=bevel&corner-bottom-right-shape=bevel&border-bottom-right-radius=80px&border-width=32px"> -<meta name="fuzzy" content="maxDifference=0-82;totalPixels=0-800"> -</head> -<body> - <style> - #target { - width: 200px; - height: 200px; - border-width: 10px; - border-radius: 20px; - border-style: solid; - box-sizing: border-box; - } - </style> -<div id="target"></div> -<script> - const target = document.getElementById("target"); - const params = new URLSearchParams(location.search); - for (const [key, value] of params.entries()) { - target.style[key] = value; - } -</script> -</body>
\ No newline at end of file diff --git a/tests/wpt/tests/css/css-borders/tentative/corner-shape/resources/corner-shape.js b/tests/wpt/tests/css/css-borders/tentative/corner-shape/resources/corner-shape.js index 2aaaf5ed289..6de6c9a5d7e 100644 --- a/tests/wpt/tests/css/css-borders/tentative/corner-shape/resources/corner-shape.js +++ b/tests/wpt/tests/css/css-borders/tentative/corner-shape/resources/corner-shape.js @@ -109,7 +109,7 @@ function render_rect_with_corner_shapes(style, ctx, width, height) { } function draw_inner_corner_from_params(params, phase = "both", direction) { - add_corner(ctx, ...params.inner_rect, params.shape, phase, direction); + add_corner(ctx, ...params.inner_rect, params.inner_shape, phase, direction); } function draw_inner_corner(corner, phase = "both", direction) { @@ -123,7 +123,7 @@ function render_rect_with_corner_shapes(style, ctx, width, height) { draw_outer_corner("bottom-left"); draw_outer_corner("top-left"); ctx.closePath(); - ctx.clip("nonzero"); + ctx.fill("nonzero"); const inner_rect = [ style["border-left-width"], diff --git a/tests/wpt/tests/css/css-borders/tentative/corner-shape/resources/corner-utils.js b/tests/wpt/tests/css/css-borders/tentative/corner-shape/resources/corner-utils.js index 39203aefc67..bacaaa8a6e4 100644 --- a/tests/wpt/tests/css/css-borders/tentative/corner-shape/resources/corner-utils.js +++ b/tests/wpt/tests/css/css-borders/tentative/corner-shape/resources/corner-utils.js @@ -7,8 +7,9 @@ function offset_for_curvature(curvature) { // Find the superellipse's control point. // we do that by approximating the superellipse as a quadratic // curve that has the same point at t = 0.5. - if (curvature <= 0.001) return [1, -1]; - const { x } = superellipse(curvature); + if (curvature <= 0.001) + return [1, -1]; + const {x} = superellipse(Math.min(2, Math.max(0.5, curvature))); const [a, b] = [x, 1 - x].map((m) => 2 * m - 0.5); const magnitude = Math.hypot(a, b); // Normalize a & b @@ -17,6 +18,19 @@ function offset_for_curvature(curvature) { return [norm_a, -norm_b]; } +function compute_inner_curvature(curvature, outer_length, inner_length) { + if (curvature === 0) + return 0; + if (curvature < 1) + return 1 / + compute_inner_curvature(1 / curvature, outer_length, inner_length); + const target_length = (inner_length - outer_length) / Math.SQRT2; + return Math.log(0.5) / + Math.log( + (Math.pow(0.5, 1 / curvature) * outer_length + target_length) / + inner_length); +} + /** * * @param {number} curvature @@ -91,36 +105,49 @@ function resolve_corner_params(style, width, height, outset = null) { }; return Object.fromEntries( - Object.entries(params).map(([corner, { outer, inset }]) => { - if (outset !== null) inset = [-outset, -outset]; - const shape = style[`corner-${corner}-shape`]; - const s1 = Math.sign(outer[2] - outer[0]); - const s2 = Math.sign(outer[3] - outer[1]); - const [sw1, sw2] = inset; - const inner_offset = [s1 * sw1, s2 * sw1, -s1 * sw2, -s2 * sw2]; + Object.entries(params).map(([corner, {outer, inset}]) => { + const outer_rect = outer; + if (outset !== null) + inset = [-outset, -outset]; + const shape = style[`corner-${corner}-shape`]; + const s1 = Math.sign(outer[2] - outer[0]); + const s2 = Math.sign(outer[3] - outer[1]); + const [sw1, sw2] = inset; + const inner_offset = [s1 * sw1, s2 * sw1, -s1 * sw2, -s2 * sw2]; + + const offset = offset_for_curvature(shape); + if (Math.sign(inner_offset[0]) === Math.sign(inner_offset[1])) { + offset.reverse(); + } - const offset = offset_for_curvature(shape); - if (Math.sign(inner_offset[0]) === Math.sign(inner_offset[1])) { - offset.reverse(); - } + const inner_rect = [ + outer_rect[0] + inner_offset[0] * offset[0], + outer_rect[1] + inner_offset[1] * offset[1], + outer_rect[2] + inner_offset[2] * offset[1], + outer_rect[3] + inner_offset[3] * offset[0], + ]; - const inner_rect = [ - outer[0] + inner_offset[0] * offset[0], - outer[1] + inner_offset[1] * offset[1], - outer[2] + inner_offset[2] * offset[1], - outer[3] + inner_offset[3] * offset[0], - ]; + let inner_shape = shape; + if (shape > 2 || shape < 0.5) { + const outer_length = Math.hypot( + outer_rect[2] - outer_rect[0], outer_rect[3] - outer_rect[1]); + const inner_length = Math.hypot( + inner_rect[2] - inner_rect[0], inner_rect[3] - inner_rect[1]) + inner_shape = + compute_inner_curvature(shape, outer_length, inner_length); + } - return [ - corner, - { - outer_rect: outer, - shape, - inset, - inner_rect, - inner_offset, - }, - ]; - }) - ); + return [ + corner, + { + outer_rect, + shape, + inner_shape, + inset, + inner_rect, + inner_offset, + inner_shape + }, + ]; + })); } diff --git a/tests/wpt/tests/css/css-borders/tentative/corner-shape/resources/resolve-corner-style.js b/tests/wpt/tests/css/css-borders/tentative/corner-shape/resources/resolve-corner-style.js index ea065f577e0..b584994b4ea 100644 --- a/tests/wpt/tests/css/css-borders/tentative/corner-shape/resources/resolve-corner-style.js +++ b/tests/wpt/tests/css/css-borders/tentative/corner-shape/resources/resolve-corner-style.js @@ -17,8 +17,8 @@ function resolve_corner_style(style, w, h) { style['corner-shape'] || 'round'; const match = shape.match(/superellipse\((\.?[0-9]+(.[0-9]+)?)\)/); shape = match ? +match[1] : keywords[shape]; - const hWidth = style[`border-${hSide}-width`] || style['border-width'] || 0; - const vWidth = style[`border-${vSide}-width`] || style['border-width'] || 0; + const hWidth = parseFloat(style[`border-${hSide}-width`] || style['border-width'] || 0); + const vWidth = parseFloat(style[`border-${vSide}-width`] || style['border-width'] || 0); let radius = style[`border-${vSide}-${hSide}-radius`] || style['border-radius'] || 0; if (!Array.isArray(radius)) diff --git a/tests/wpt/tests/css/css-color/parsing/color-computed-relative-color.html b/tests/wpt/tests/css/css-color/parsing/color-computed-relative-color.html index 23ee07d177a..9bb87459623 100644 --- a/tests/wpt/tests/css/css-color/parsing/color-computed-relative-color.html +++ b/tests/wpt/tests/css/css-color/parsing/color-computed-relative-color.html @@ -527,6 +527,8 @@ fuzzy_test_computed_color(`lch(from lch(0.7 45 30 / 40%) calc(l) calc(c) calc(h) / calc(alpha))`, `lch(0.7 45 30 / 0.4)`); fuzzy_test_computed_color(`lch(from lch(50 5 10 / 0.8) calc(l + 1) calc(c + 1) calc(h + 1) / calc(alpha + 0.01))`, `lch(51 6 11 / 0.81)`); fuzzy_test_computed_color(`lch(from lch(0.7 45 30) calc((l / 100) * 100%) calc((c / 150) * 100%) calc((h / 360) * 360deg) / calc(alpha * 100%))`, `lch(0.7 45 30)`); + fuzzy_test_computed_color(`lch(from red calc((49.44 - l) * infinity) 0 0)`, `lch(0 0 0)`); + fuzzy_test_computed_color(`lch(from blue calc((49.44 - l) * infinity) 0 0)`, `lch(100 0 0)`); // Alpha is clamped to [0,1] fuzzy_test_computed_color(`lch(from lch(from lch(0.7 45 30) l c h / calc(alpha + 0.5)) l c h / calc(alpha - 0.5))`, `lch(0.7 45 30 / 0.5)`); diff --git a/tests/wpt/tests/css/css-conditional/at-supports-selector-details-content-before.html b/tests/wpt/tests/css/css-conditional/at-supports-selector-details-content-before.html new file mode 100644 index 00000000000..731b2c4d6d2 --- /dev/null +++ b/tests/wpt/tests/css/css-conditional/at-supports-selector-details-content-before.html @@ -0,0 +1,24 @@ +<!doctype html> +<html> + <head> + <title>CSS Test (Conditional Rules): In @supports, ::details-content::before can be parsed successfully</title> + <link rel="author" title="Luke Warlow" href="mailto:lwarlow@igalia.com"> + <link rel="help" href="https://drafts.csswg.org/css-conditional-3/#at-supports"> + <link rel="help" href="https://drafts.csswg.org/css-pseudo-4/#details-content-pseudo"> + <link rel="match" href="at-supports-001-ref.html"> + <style> + div { + background: red; + height: 100px; + width: 100px; + } + @supports selector(input::details-content::before) { + div { background-color:green; } + } + </style> + </head> + <body> + <p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p> + <div></div> + </body> +</html> diff --git a/tests/wpt/tests/css/css-conditional/at-supports-selector-details-content.html b/tests/wpt/tests/css/css-conditional/at-supports-selector-details-content.html new file mode 100644 index 00000000000..89e7606de5b --- /dev/null +++ b/tests/wpt/tests/css/css-conditional/at-supports-selector-details-content.html @@ -0,0 +1,24 @@ +<!doctype html> +<html> + <head> + <title>CSS Test (Conditional Rules): In @supports, ::details-content can be parsed successfully</title> + <link rel="author" title="Luke Warlow" href="mailto:lwarlow@igalia.com"> + <link rel="help" href="https://drafts.csswg.org/css-conditional-3/#at-supports"> + <link rel="help" href="https://drafts.csswg.org/css-pseudo-4/#details-content-pseudo"> + <link rel="match" href="at-supports-001-ref.html"> + <style> + div { + background: red; + height: 100px; + width: 100px; + } + @supports selector(input::details-content) { + div { background-color:green; } + } + </style> + </head> + <body> + <p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p> + <div></div> + </body> +</html> diff --git a/tests/wpt/tests/css/css-conditional/js/CSS-supports-details-content-pseudo-parsing.html b/tests/wpt/tests/css/css-conditional/js/CSS-supports-details-content-pseudo-parsing.html new file mode 100644 index 00000000000..67a46fe82a2 --- /dev/null +++ b/tests/wpt/tests/css/css-conditional/js/CSS-supports-details-content-pseudo-parsing.html @@ -0,0 +1,41 @@ +<!doctype html> +<meta charset="utf-8"> +<title>CSS.supports() ::details-content parsing</title> +<link rel="author" title="Luke Warlow" href="mailto:lwarlow@igalia.com"> +<link rel="help" href="https://www.w3.org/TR/css-conditional-4/#the-css-namespace"> +<link rel="help" href="https://drafts.csswg.org/css-pseudo-4/#element-like"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> + test(function() { + assert_equals(CSS.supports("selector(::details-content)"), true); + }, "selector() function accepts ::details-content"); + + test(function() { + assert_equals(CSS.supports("selector(::details-content::before)"), true); + }, "selector() function accepts ::details-content followed by ::before"); + + test(function() { + assert_equals(CSS.supports("selector(::details-content::first-line)"), true); + }, "selector() function accepts ::details-content followed by ::first-line"); + + test(function() { + assert_equals(CSS.supports("selector(::details-content:hover"), true); + }, "selector() function accepts ::details-content followed by a state pseudo-class"); + + test(function() { + assert_equals(CSS.supports("selector(::details-content:lang(en)"), true); + }, "selector() function accepts ::details-content followed by :lang()"); + + test(function() { + assert_equals(CSS.supports("selector(::details-content:nth-of-type(slot)"), false); + }, "selector() function doesn't accept ::details-content followed by a tree-structural pseudo-class"); + + test(function() { + assert_equals(CSS.supports("selector(::details-content:has(a)"), false); + }, "selector() function doesn't accept ::details-content followed by :has()"); + + test(function() { + assert_equals(CSS.supports("selector(::details-content::part(a)"), false); + }, "selector() function doesn't accept ::details-content followed by a part"); +</script> diff --git a/tests/wpt/tests/css/css-easing/linear-timing-functions-chrome-405004975-crash.html b/tests/wpt/tests/css/css-easing/linear-timing-functions-chrome-405004975-crash.html new file mode 100644 index 00000000000..510b51716ce --- /dev/null +++ b/tests/wpt/tests/css/css-easing/linear-timing-functions-chrome-405004975-crash.html @@ -0,0 +1,10 @@ +<!DOCTYPE html> +<title>Chrome crash bug 405004975</title> +<link rel="help" href="https://crbug.com/405004975"> +<style> + div { + transition-timing-function: linear(0, 0.25, sibling-index()); + transition-timing-function: linear(0, 0.25, sign(2em - 20px)); + } +</style> +<p>Passes if test does not fail any CHECKs or DCHECKs.</p> diff --git a/tests/wpt/tests/css/css-flexbox/flex-shorthand-calc.html b/tests/wpt/tests/css/css-flexbox/flex-shorthand-calc.html new file mode 100644 index 00000000000..6498988dd53 --- /dev/null +++ b/tests/wpt/tests/css/css-flexbox/flex-shorthand-calc.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<title>CSS Flexbox Test: Allow complex calc expressions in flex shorthand</title> +<link rel="help" href="https://drafts.csswg.org/css-flexbox/#flex-property"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/shorthand-testcommon.js"></script> +<div> + <div id="target"></div> +</div> +<script> + test_shorthand_value('flex', 'sign(1em - 1px) sibling-index()', { + 'flex-grow': 'sign(1em - 1px)', + 'flex-shrink': 'sibling-index()', + 'flex-basis': 'auto' + }); +</script> diff --git a/tests/wpt/tests/css/css-flexbox/parsing/flex-computed.html b/tests/wpt/tests/css/css-flexbox/parsing/flex-computed.html index ea1f4f6fa45..074d0f7395c 100644 --- a/tests/wpt/tests/css/css-flexbox/parsing/flex-computed.html +++ b/tests/wpt/tests/css/css-flexbox/parsing/flex-computed.html @@ -9,13 +9,19 @@ <script src="/resources/testharnessreport.js"></script> <script src="/css/support/computed-testcommon.js"></script> <style> + #container { + container-type: inline-size; + width: 10px; + } #target { font-size: 40px; } </style> </head> <body> -<div id="target"></div> +<div id="container"> + <div id="target"></div> +</div> <script> test_computed_value("flex", "none", "0 0 auto"); test_computed_value("flex", "1", "1 1 0%"); @@ -25,6 +31,12 @@ test_computed_value("flex", "7% 8", "8 1 7%"); test_computed_value("flex", "8 auto", "8 1 auto"); test_computed_value("flex", "calc(10px + 0.5em)", "1 1 30px"); test_computed_value("flex", "calc(10px - 0.5em)", "1 1 0px"); +test_computed_value("flex", "1 1 calc(10em)", "1 1 400px"); +test_computed_value("flex", "1 1 calc(-10em)", "1 1 0px"); +test_computed_value("flex", "calc(10 + (sign(20cqw - 10px) * 5)) calc(10 + (sign(20cqw - 10px) * 5)) 1px", "5 5 1px"); +test_computed_value("flex", "1 1 calc(10px + (sign(20cqw - 10px) * 5px))", "1 1 5px"); +test_computed_value("flex", "calc(1) calc(2 + 1) calc(3px)", "1 3 3px"); +test_computed_value("flex", "calc(-1) calc(-1) 0", "0 0 0px"); </script> </body> </html> diff --git a/tests/wpt/tests/css/css-flexbox/parsing/flex-invalid.html b/tests/wpt/tests/css/css-flexbox/parsing/flex-invalid.html index ae010d7b4b4..d47f8b67930 100644 --- a/tests/wpt/tests/css/css-flexbox/parsing/flex-invalid.html +++ b/tests/wpt/tests/css/css-flexbox/parsing/flex-invalid.html @@ -16,6 +16,8 @@ test_invalid_value("flex", "none 1"); test_invalid_value("flex", "2 3 4"); test_invalid_value("flex", "5px 7%"); test_invalid_value("flex", "9 none"); +test_invalid_value("flex", "1 2 calc(0)"); +test_invalid_value("flex", "1 2 calc(3 - 3)"); </script> </body> </html> diff --git a/tests/wpt/tests/css/css-flexbox/parsing/flex-valid.html b/tests/wpt/tests/css/css-flexbox/parsing/flex-valid.html index f3eaf118da6..4c57fe4e253 100644 --- a/tests/wpt/tests/css/css-flexbox/parsing/flex-valid.html +++ b/tests/wpt/tests/css/css-flexbox/parsing/flex-valid.html @@ -9,15 +9,37 @@ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/css/support/parsing-testcommon.js"></script> +<style> + #container { + container-type: inline-size; + width: 10px; + } + #target { + font-size: 40px; + } +</style> </head> <body> +<div id="container"> + <div id="target"></div> +</div> <script> test_valid_value("flex", "none", "0 0 auto"); test_valid_value("flex", "1", "1 1 0%"); test_valid_value("flex", "2 3", "2 3 0%"); test_valid_value("flex", "4 5 6px"); +test_valid_value("flex", "6px 4 5", "4 5 6px"); +test_valid_value("flex", "6px 4", "4 1 6px"); +test_valid_value("flex", "6px", "1 1 6px"); test_valid_value("flex", "7% 8", "8 1 7%"); test_valid_value("flex", "8 auto", "8 1 auto"); +test_valid_value("flex", "1 1 10em", "1 1 10em"); +test_valid_value("flex", "1 1 calc(10em)", "1 1 calc(10em)"); +test_valid_value("flex", "1 1 calc(-10em)", "1 1 calc(-10em)"); +test_valid_value("flex", "calc(10 + (sign(20cqw - 10px) * 5)) calc(10 + (sign(20cqw - 10px) * 5)) 1px", "calc(10 + (5 * sign(20cqw - 10px))) calc(10 + (5 * sign(20cqw - 10px))) 1px"); +test_valid_value("flex", "1 1 calc(10px + (sign(20cqw - 10px) * 5px))", "1 1 calc(10px + (5px * sign(20cqw - 10px)))"); +test_valid_value("flex", "calc(1) calc(2 + 1) calc(3px)", "calc(1) calc(3) calc(3px)"); +test_valid_value("flex", "calc(-1) calc(-1) 0", "calc(-1) calc(-1) 0px"); // The following is not yet supported by browsers: // test_valid_value("flex", "content"); diff --git a/tests/wpt/tests/css/css-flexbox/percent-height-flex-items-cross-sizes-with-mutations.html b/tests/wpt/tests/css/css-flexbox/percent-height-flex-items-cross-sizes-with-mutations.html new file mode 100644 index 00000000000..87f20000f1f --- /dev/null +++ b/tests/wpt/tests/css/css-flexbox/percent-height-flex-items-cross-sizes-with-mutations.html @@ -0,0 +1,125 @@ +<!DOCTYPE html> +<html> +<head> +<link rel="author" title="Sammy Gill" href="mailto:sammy.gill@apple.com"> +<link rel="help" href="https://drafts.csswg.org/css-flexbox-1/#layout-algorithm"> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css"> +<meta name="assert" content="Tests that the cross size of flexboxes and flex items with % height are computed correctly with various mutations."> +<style> +.flexbox { + display: flex; + font: 10px/1 Ahem; + outline: 1px solid black; +} +.grid { + display: grid; + outline: 1px solid magenta; +} +.flexbox > div { + width: min-content; + outline: 1px solid blue; +} +.percent-height { + min-height: 100%; +} +.fixed-height { + height: 100px; +} +.align-start { + align-items: start; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +function mutateContent() { + document.querySelectorAll("#one, #two, #three").forEach((element) => { + element.innerHTML += " a"; + }); + + document.querySelector("#four").style.width = "auto"; + document.querySelector("#five").style.height = "auto"; + document.querySelector("#six").style.height = "100px"; + + document.querySelectorAll("#seven, #eight").forEach((element) => { + element.style.alignItems = "start"; + }); +} +</script> +</head> +<body> + +<!-- Non-percent height flex item is mutated and percent height flex item should be + stretched up. --> +<div class="flexbox test" data-expected-height="40"> + <div id="one" class="test" data-expected-height="40">a a a</div> + <div class="percent-height test" data-expected-height="40">a</div> +</div> + +<!-- Non-percent height flex item content is mutated and should be stretched to percent + height flex item's size. --> +<div class="flexbox test" data-expected-height="40"> + <div id="two" class="min-content percent-height test" data-expected-height="40">a a a</div> + <div class="test" data-expected-height="40">a</div> +</div> + +<!-- Percent height flex item content is mutated and increased flexbox's cross axis size. --> +<div class="flexbox test" data-expected-height="30"> + <div class="min-content percent-height test" data-expected-height="30">a a a</div> + <div id="three" data-expected-height="30">a</div> +</div> + +<!-- Percent height flex item's main axis size changes from min-content to auto which + should result in different cross size. --> +<div class="flexbox test" data-expected-height="10"> + <div class="min-content percent-height test" id="four" data-expected-height="10">a a a</div> +</div> + +<!-- Flexbox with align-items: flex-start changes from definite to indefinite cross size + which results in different hypothetical cross size for flex item.--> +<div class="flexbox fixed-height align-start test" id="five" data-expected-height="30"> + <div class="min-content percent-height test" data-expected-height="30">a a a</div> + <div class="test" data-expected-height="10">a</div> +</div> + + +<!-- Flexbox with align-items: flex-start changes from indefinite to definite cross size + which results in different hypothetical cross size for the flex item. --> +<div class="flexbox align-start test" id="six" data-expected-height="100"> + <div class="min-content percent-height test" data-expected-height="100">a a a</div> +</div> + +<!-- Outer flexbox goes from stretching its content to no longer stretching with a + definite cross size. The inner flexbox is no longer stretching which affects the + hypothetical cross axis size of its flex item. --> +<div class="flexbox fixed-height test" id="seven" data-expected-height="100""> + <div class="flexbox align-start test" data-expected-height="30"> + <div class="min-content percent-height test" data-expected-height="30">a a a</div> + </div> +</div> + +<!-- Grid goes from stretching its content to no longer stretching with a definite cross + size. The flexbox is no longer stretching which affects the hypothetical cross axis + size of tis flex item.--> +<div class="grid fixed-height test" id="eight" data-expected-height="100"> + <div class="flexbox align-start test" data-expected-height="30"> + <div class="min-content percent-height test" data-expected-height="30">a a a</div> + </div> +</div> + +</body> +<script> +document.body.offsetHeight; +mutateContent(); +document.body.offsetHeight; + +let tests = document.querySelectorAll(".test"); +tests.forEach((element) => { + test(function() { + let expectedHeight = element.getAttribute("data-expected-height"); + assert_equals(element.offsetHeight, Number(expectedHeight), "height"); + }); +}); +</script> +</html> + diff --git a/tests/wpt/tests/css/css-fonts/font-variation-settings-calc.html b/tests/wpt/tests/css/css-fonts/font-variation-settings-calc.html new file mode 100644 index 00000000000..e3f5178952e --- /dev/null +++ b/tests/wpt/tests/css/css-fonts/font-variation-settings-calc.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<title>CSS Fonts Test: Allow complex calc expressions in font-variation-settings</title> +<link rel="help" href="https://drafts.csswg.org/css-fonts-4/#propdef-font-variation-settings"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +<script src="/css/support/computed-testcommon.js"></script> +<div> + <div id="target"></div> +</div> +<script> + test_valid_value('font-variation-settings', '"wght" sign(1em - 1px)'); + test_valid_value('font-variation-settings', '"wght" sibling-index()'); + test_computed_value('font-variation-settings', '"wght" sign(1em - 1px)', '"wght" 1'); + test_computed_value('font-variation-settings', '"wght" sibling-index()', '"wght" 1'); +</script> diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-006-ref.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-006-ref.html new file mode 100644 index 00000000000..f77ec2a9d43 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-006-ref.html @@ -0,0 +1,94 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/#break"> +<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com"> +<style> + body { + margin: 0px; + } + + .grid-container { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 10px; + width: 430px; + height: 430px; + } + + .grid-item { + background-color: gray; + opacity: 0.5; + border: 1px solid #000; + } + + .col-gap { + width: 0; + border-left: solid 5px blue; + } + + .col-gap1 { + + position: absolute; + top: 105px; + left: 102.5px; + height: 220px; + } + + .col-gap2 { + position: absolute; + top: 0px; + left: 212.5px; + height: 215px; + } + + .col-gap3 { + position: absolute; + top: 0px; + left: 322.5px; + height: 430px; + } + + .row-gap { + height: 0px; + border-bottom: solid 5px red; + } + + .row-gap1 { + position: absolute; + top: 102.5px; + left: 0px; + width: 215px; + } + + .row-gap2 { + position: absolute; + top: 212.5px; + left: 105px; + width: 220px; + } + + .row-gap3 { + position: absolute; + top: 322.5px; + left: 0px; + width: 430px; + } +</style> + +<div class="grid-container"> + <div class="grid-item" style="grid-column: 1 / 3; grid-row: 1 / 2;"></div> + <div class="grid-item" style="grid-column: 3 / 4; grid-row: 1 / 3;"></div> + <div class="grid-item" style="grid-row: 2 / 4;"></div> + <div class="grid-item" style="grid-column: 2 / 4; grid-row: 3 / 4;"></div> + <div class="grid-item" style="grid-column: 2 / 3; grid-row: 2 / 3;"></div> + <div class="grid-item" style="grid-column: 4 / 5; grid-row: 1 / 4;"></div> + <div class="grid-item" style="grid-column: 1 / 4; grid-row: 4 / 5;"></div> + <div class="grid-item" style="grid-column: 4 / 5; grid-row: 4 / 5;"></div> +</div> + +<div class="row-gap row-gap1"> </div> +<div class="row-gap row-gap2"> </div> +<div class="row-gap row-gap3"> </div> + +<div class="col-gap col-gap1"> </div> +<div class="col-gap col-gap2"> </div> +<div class="col-gap col-gap3"> </div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-006.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-006.html new file mode 100644 index 00000000000..7b1187c4e44 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-006.html @@ -0,0 +1,45 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: *rule-break defaults to spanning-item and avoids painting behind spanners. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/#break"> +<link rel="match" href="grid-gap-decorations-006-ref.html"> +<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com"> +<style> + body { + margin: 0px; + } + .grid-container { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 10px; + + width: 430px; + height: 430px; + + column-rule-color: blue; + column-rule-style: solid; + column-rule-width: 5px; + + row-rule-color: red; + row-rule-style: solid; + row-rule-width: 5px; + } + + .grid-item { + background-color: gray; + opacity: 0.5; + border: 1px solid #000; + } + +</style> +<div class="grid-container"> + <div class="grid-item" style="grid-column: 1 / 3; grid-row: 1 / 2;"></div> + <div class="grid-item" style="grid-column: 3 / 4; grid-row: 1 / 3;"></div> + <div class="grid-item" style="grid-row: 2 / 4;"></div> + <div class="grid-item" style="grid-column: 2 / 4; grid-row: 3 / 4;"></div> + <div class="grid-item" style="grid-column: 2 / 3; grid-row: 2 / 3;"></div> + <div class="grid-item" style="grid-column: 4 / 5; grid-row: 1 / 4;"></div> + <div class="grid-item" style="grid-column: 1 / 4; grid-row: 4 / 5;"></div> + <div class="grid-item" style="grid-column: 4 / 5; grid-row: 4 / 5;"></div> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-007-ref.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-007-ref.html new file mode 100644 index 00000000000..9d74fa00f41 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-007-ref.html @@ -0,0 +1,188 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/#break"> +<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com"> +<style> + body { + margin: 0px; + } + + .grid-container { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 10px; + + width: 430px; + height: 430px; + } + + .grid-item { + background-color: gray; + opacity: 0.5; + border: 1px solid #000; + } + + .row-gap1 { + position: absolute; + height: 0px; + display: flex; + gap: 10px; + top: 102.5px; + left: 0px; + } + + .row-gap1a { + width: 100px; + border-bottom: solid 5px red; + } + + .row-gap1b { + width: 100px; + border-bottom: solid 5px red; + } + + .row-gap2 { + position: absolute; + height: 0px; + display: flex; + gap: 10px; + top: 212.5px; + left: 110px; + } + + .row-gap2a { + width: 100px; + border-bottom: solid 5px red; + } + + .row-gap2b { + width: 100px; + border-bottom: solid 5px red; + } + + .row-gap3 { + position: absolute; + height: 0px; + display: flex; + gap: 10px; + top: 322.5px; + left: 0px; + } + + .row-gap3a { + width: 100px; + border-bottom: solid 5px red; + } + + .row-gap3b { + width: 210px; + border-bottom: solid 5px red; + } + + .row-gap3c { + width: 100px; + border-bottom: solid 5px red; + } + + .col-gap1 { + position: absolute; + width: 0; + display: flex; + flex-direction: column; + gap: 10px; + top: 110px; + left: 102.5px; + } + + .col-gap1a { + height: 100px; + border-left: solid 5px blue; + } + + .col-gap1b { + height: 100px; + border-left: solid 5px blue; + } + + .col-gap2 { + position: absolute; + width: 0; + display: flex; + flex-direction: column; + gap: 10px; + top: 0px; + left: 212.5px; + } + + .col-gap2a { + height: 100px; + border-left: solid 5px blue; + } + + .col-gap2b { + height: 100px; + border-left: solid 5px blue; + } + + .col-gap3 { + position: absolute; + width: 0; + display: flex; + flex-direction: column; + gap: 10px; + top: 0px; + left: 322.5px; + } + + .col-gap3a { + height: 210px; + border-left: solid 5px blue; + } + + .col-gap3b { + height: 100px; + border-left: solid 5px blue; + } + + .col-gap3c { + height: 100px; + border-left: solid 5px blue; + } +</style> +<div class="grid-container"> + <div class="grid-item" style="grid-column: 1 / 3; grid-row: 1 / 2;"></div> + <div class="grid-item" style="grid-column: 3 / 4; grid-row: 1 / 3;"></div> + <div class="grid-item" style="grid-row: 2 / 4;"></div> + <div class="grid-item" style="grid-column: 2 / 4; grid-row: 3 / 4;"></div> + <div class="grid-item" style="grid-column: 2 / 3; grid-row: 2 / 3;"></div> + <div class="grid-item" style="grid-column: 4 / 5; grid-row: 1 / 4;"></div> + <div class="grid-item" style="grid-column: 1 / 4; grid-row: 4 / 5;"></div> + <div class="grid-item" style="grid-column: 4 / 5; grid-row: 4 / 5;"></div> +</div> + +<div class="row-gap1"> + <div class="row-gap1a"></div> + <div class="row-gap1b"></div> +</div> +<div class="row-gap2"> + <div class="row-gap2a"></div> + <div class="row-gap2b"></div> +</div> +<div class="row-gap3"> + <div class="row-gap3a"></div> + <div class="row-gap3b"></div> + <div class="row-gap3c"></div> +</div> + +<div class="col-gap1"> + <div class="col-gap1a"></div> + <div class="col-gap1b"></div> +</div> +<div class="col-gap2"> + <div class="col-gap2a"></div> + <div class="col-gap2b"></div> +</div> +<div class="col-gap3"> + <div class="col-gap3a"></div> + <div class="col-gap3b"></div> + <div class="col-gap3c"></div> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-007.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-007.html new file mode 100644 index 00000000000..adc98e4bc03 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-007.html @@ -0,0 +1,50 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: setting *rule-break to intersection stops painting decorations at each intersection. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/#break"> +<link rel="match" href="grid-gap-decorations-007-ref.html"> +<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com"> +<style> + body { + margin: 0px; + } + .grid-container { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 10px; + + width: 430px; + height: 430px; + + column-rule-color: blue; + column-rule-style: solid; + column-rule-width: 5px; + + row-rule-color: red; + row-rule-style: solid; + row-rule-width: 5px; + + column-rule-break: intersection; + column-rule-outset: 0px; + + row-rule-break: intersection; + row-rule-outset: 0px; + } + + .grid-item { + background-color: gray; + opacity: 0.5; + border: 1px solid #000; + } +</style> +<div class="grid-container"> + <div class="grid-item" style="grid-column: 1 / 3; grid-row: 1 / 2;"></div> + <div class="grid-item" style="grid-column: 3 / 4; grid-row: 1 / 3;"></div> + <div class="grid-item" style="grid-row: 2 / 4;"></div> + <div class="grid-item" style="grid-column: 2 / 4; grid-row: 3 / 4;"></div> + <div class="grid-item" style="grid-column: 2 / 3; grid-row: 2 / 3;"></div> + <div class="grid-item" style="grid-column: 4 / 5; grid-row: 1 / 4;"></div> + <div class="grid-item" style="grid-column: 1 / 4; grid-row: 4 / 5;"></div> + <div class="grid-item" style="grid-column: 4 / 5; grid-row: 4 / 5;"></div> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-008-ref.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-008-ref.html new file mode 100644 index 00000000000..200a2621a21 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-008-ref.html @@ -0,0 +1,102 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/#break"> +<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com"> +<style> + body { + margin: 0px; + } + + .grid-container { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 10px; + + width: 430px; + height: 430px; + } + + .grid-container>div { + z-index: 2 + } + + .grid-item { + background-color: gray; + opacity: 0.5; + border: 1px solid #000; + } + + .row-gap1 { + position: absolute; + height: 0px; + top: 102.5px; + left: 0px; + width: 430px; + border-bottom: solid 5px red; + } + + .row-gap2 { + position: absolute; + height: 0px; + + top: 212.5px; + left: 0px; + width: 430px; + border-bottom: solid 5px red; + } + + .row-gap3 { + position: absolute; + height: 0px; + display: flex; + top: 322.5px; + left: 0px; + border-bottom: solid 5px red; + width: 430px; + } + + .col-gap1 { + position: absolute; + width: 0; + height: 430px; + border-left: solid 5px blue; + top: 0px; + left: 102.5px; + } + + .col-gap2 { + position: absolute; + width: 0; + height: 430px; + top: 0px; + left: 212.5px; + border-left: solid 5px blue; + } + + .col-gap3 { + position: absolute; + width: 0; + height: 430px; + top: 0px; + left: 322.5px; + border-left: solid 5px blue; + + } +</style> +<div class="grid-container"> + <div class="grid-item" style="grid-column: 1 / 3; grid-row: 1 / 2;"></div> + <div class="grid-item" style="grid-column: 3 / 4; grid-row: 1 / 3;"></div> + <div class="grid-item" style="grid-row: 2 / 4;"></div> + <div class="grid-item" style="grid-column: 2 / 4; grid-row: 3 / 4;"></div> + <div class="grid-item" style="grid-column: 2 / 3; grid-row: 2 / 3;"></div> + <div class="grid-item" style="grid-column: 4 / 5; grid-row: 1 / 4;"></div> + <div class="grid-item" style="grid-column: 1 / 4; grid-row: 4 / 5;"></div> + <div class="grid-item" style="grid-column: 4 / 5; grid-row: 4 / 5;"></div> +</div> + +<div class="row-gap1"></div> +<div class="row-gap2"></div> +<div class="row-gap3"></div> + +<div class="col-gap1"></div> +<div class="col-gap2"></div> +<div class="col-gap3"></div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-008.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-008.html new file mode 100644 index 00000000000..f8dc0df36e2 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-008.html @@ -0,0 +1,48 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: setting *rule-break to none paints decorations from first grid line to last grid line. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/#break"> +<link rel="match" href="grid-gap-decorations-008-ref.html"> +<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com"> +<style> + body { + margin: 0px; + } + + .grid-container { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 10px; + + width: 430px; + height: 430px; + + column-rule-color: blue; + column-rule-style: solid; + column-rule-width: 5px; + + row-rule-color: red; + row-rule-style: solid; + row-rule-width: 5px; + + column-rule-break: none; + row-rule-break: none; + } + + .grid-item { + background-color: gray; + opacity: 0.5; + border: 1px solid #000; + } +</style> +<div class="grid-container"> + <div class="grid-item" style="grid-column: 1 / 3; grid-row: 1 / 2;"></div> + <div class="grid-item" style="grid-column: 3 / 4; grid-row: 1 / 3;"></div> + <div class="grid-item" style="grid-row: 2 / 4;"></div> + <div class="grid-item" style="grid-column: 2 / 4; grid-row: 3 / 4;"></div> + <div class="grid-item" style="grid-column: 2 / 3; grid-row: 2 / 3;"></div> + <div class="grid-item" style="grid-column: 4 / 5; grid-row: 1 / 4;"></div> + <div class="grid-item" style="grid-column: 1 / 4; grid-row: 4 / 5;"></div> + <div class="grid-item" style="grid-column: 4 / 5; grid-row: 4 / 5;"></div> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-009-ref.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-009-ref.html new file mode 100644 index 00000000000..11d8267235b --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-009-ref.html @@ -0,0 +1,71 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/#break"> +<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com"> +<style> + body { + margin: 0px; + } + + .grid-container { + display: grid; + gap: 10px; + grid-template-columns: 100px 100px 100px; + height: 320px; + } + + .item { + background: gray; + opacity: 0.5; + } + + .col-gap1 { + position: absolute; + width: 0; + height: 215px; + border-left: solid 5px blue; + top: 105px; + left: 102.5px; + } + + + .col-gap2 { + position: absolute; + width: 0; + height: 105px; + top: 0px; + left: 212.5px; + border-left: solid 5px blue; + } + + .row-gap1 { + position: absolute; + height: 0px; + top: 102.5px; + left: 0px; + width: 320px; + border-bottom: solid 5px red; + } + + .row-gap2 { + position: absolute; + height: 0px; + top: 212.5px; + left: 0px; + width: 105px; + border-bottom: solid 5px red; + + } +</style> +<div class="grid-container"> + <div class="item" style="grid-column: 1 / 3; grid-row: 1 / 2;"></div> + <div class="item" style=" grid-column: 3 / 4;"></div> + <div class="item"></div> + <div class="item" style="grid-column: 2 / 4; grid-row: 2 / 4;"></div> + <div class="item"></div> +</div> + +<div class="row-gap1"></div> +<div class="row-gap2"></div> + +<div class="col-gap1"></div> +<div class="col-gap2"></div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-009.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-009.html new file mode 100644 index 00000000000..0756b9294be --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-009.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: Grid with 2x2 item, decorations are not painted within item when *-rule-break is spanning-item. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="grid-gap-decorations-009-ref.html"> +<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com"> +<style> + body { + margin: 0px; + } + + .grid-container { + display: grid; + gap: 10px; + grid-template-columns: 100px 100px 100px; + height: 320px; + + column-rule-color: blue; + column-rule-style: solid; + column-rule-width: 5px; + + row-rule-color: red; + row-rule-style: solid; + row-rule-width: 5px; + } + + .item { + background: gray; + opacity: 0.5; + } +</style> +<div class="grid-container"> + <div class="item" style="grid-column: 1 / 3; grid-row: 1 / 2;"></div> + <div class="item" style=" grid-column: 3 / 4;"></div> + <div class="item"></div> + <div class="item" style="grid-column: 2 / 4; grid-row: 2 / 4;"></div> + <div class="item"></div> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-010-ref.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-010-ref.html new file mode 100644 index 00000000000..747391cfedc --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-010-ref.html @@ -0,0 +1,94 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/#outset"> +<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com"> +<style> + body { + margin: 0px; + } + + .grid-container { + display: grid; + grid-gap: 10px; + grid-template-columns: 100px 100px 100px; + height: 320px; + } + + .item { + background: gray; + opacity: 0.5; + } + + .row-gap { + width: 320px; + height: 0px; + border-bottom: solid 5px red; + } + + .row-gap1 { + position: absolute; + top: 102.5px; + } + + .row-gap2 { + position: absolute; + top: 212.5px; + } + + .col-gap1 { + position: absolute; + width: 0; + display: flex; + gap: 10px; + flex-direction: column; + top: 0px; + left: 102.5px; + } + + .col-gap1>div { + height: 100px; + border-left: solid 5px blue; + } + + .col-gap2 { + position: absolute; + width: 0; + display: flex; + gap: 10px; + flex-direction: column; + top: 0px; + left: 212.5px; + } + + .col-gap2>div { + height: 100px; + border-left: solid 5px blue; + } +</style> + +<body> + <div class="grid-container"> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + </div> +</body> + +<div class="row-gap row-gap1"> </div> +<div class="row-gap row-gap2"> </div> + +<div class="col-gap1"> + <div class="col-gap1a"></div> + <div class="col-gap1b"></div> + <div class="col-gap1c"></div> +</div> +<div class="col-gap2"> + <div class="col-gap2a"></div> + <div class="col-gap2b"></div> + <div class="col-gap2c"></div> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-010.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-010.html new file mode 100644 index 00000000000..d9201b51cea --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-010.html @@ -0,0 +1,46 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: An outset of 0px aligns the ends of gap decorations with adjacent item. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="grid-gap-decorations-010-ref.html"> +<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com"> +<style> + body { + margin: 0px; + } + + .grid-container { + display: grid; + grid-gap: 10px; + grid-template-columns: 100px 100px 100px; + height: 320px; + + column-rule-color: blue; + column-rule-style: solid; + column-rule-width: 5px; + + row-rule-color: red; + row-rule-style: solid; + row-rule-width: 5px; + + column-rule-outset: 0px; + column-rule-break: intersection; + } + + .item { + background: gray; + opacity: 0.5; + } +</style> +<div class="grid-container"> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-011-ref.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-011-ref.html new file mode 100644 index 00000000000..c49eb95f72e --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-011-ref.html @@ -0,0 +1,68 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/#outset"> +<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com"> +<style> + body { + margin: 0px; + } + + .grid-container { + display: grid; + grid-gap: 10px; + grid-template-columns: 100px 100px 100px; + height: 320px; + } + + .item { + background: gray; + opacity: 0.5; + } + + .row-gap { + position: absolute; + width: 320px; + height: 0px; + border-bottom: solid 5px red; + } + + .row-gap1 { + top: 102.5px; + } + + .row-gap2 { + top: 212.5px; + } + + .col-gap { + position: absolute; + top: 0px; + width: 0px; + height: 320px; + border-left: solid 5px blue; + } + + .col-gap1 { + left: 102.5px; + } + + .col-gap2 { + left: 212.5px; + } +</style> +<div class="grid-container"> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> +</div> + +<div class="row-gap row-gap1"> </div> +<div class="row-gap row-gap2"> </div> + +<div class="col-gap col-gap1"> </div> +<div class="col-gap col-gap2"> </div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-011.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-011.html new file mode 100644 index 00000000000..c0540398d05 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-011.html @@ -0,0 +1,43 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: *rule-outset defaults to 50% and extends each decoration end halfway into its intersection. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="grid-gap-decorations-011-ref.html"> +<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com"> +<style> + body { + margin: 0px; + } + .grid-container { + display: grid; + grid-gap: 10px; + grid-template-columns: 100px 100px 100px; + height: 320px; + + column-rule-color: blue; + column-rule-style: solid; + column-rule-width: 5px; + + row-rule-color: red; + row-rule-style: solid; + row-rule-width: 5px; + + column-rule-break: intersection; + } + .item { + background: gray; + opacity: 0.5; + } + </style> +<div class="grid-container"> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-012-ref.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-012-ref.html new file mode 100644 index 00000000000..ded98fa1c8d --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-012-ref.html @@ -0,0 +1,71 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/#outset"> +<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com"> +<style> + .grid-container { + display: grid; + grid-gap: 10px; + grid-template-columns: 100px 100px 100px; + height: 320px; + + column-rule-color: blue; + column-rule-style: solid; + column-rule-width: 5px; + } + + .item { + background: gray; + opacity: 0.5; + } + + .row-gap { + position: absolute; + width: 320px; + height: 0px; + border-bottom: solid 5px red; + } + + .row-gap1 { + top: 110.5px; + } + + .row-gap2 { + top: 220.5px; + } + + .col-gap { + position: absolute; + top: 3px; + width: 0px; + height: 330px; + border-left: solid 5px blue; + } + + .col-gap1 { + left: 110.5px; + } + + .col-gap2 { + left: 220.5px; + } +</style> + +<body> + <div class="grid-container"> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + </div> +</body> + +<div class="row-gap row-gap1"> </div> +<div class="row-gap row-gap2"> </div> + +<div class="col-gap col-gap1"> </div> +<div class="col-gap col-gap2"> </div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-012.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-012.html new file mode 100644 index 00000000000..26ba45a14ff --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-012.html @@ -0,0 +1,45 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: An outset of 5px extends decorations slightly beyond the edges of adjacent items. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="grid-gap-decorations-012-ref.html"> +<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com"> +<style> + .grid-container { + display: grid; + grid-gap: 10px; + grid-template-columns: 100px 100px 100px; + height: 320px; + + column-rule-color: blue; + column-rule-style: solid; + column-rule-width: 5px; + + row-rule-color: red; + row-rule-style: solid; + row-rule-width: 5px; + + column-rule-outset: 5px; + column-rule-break: intersection; + } + + .item { + background: gray; + opacity: 0.5; + } +</style> + +<body> + <div class="grid-container"> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + </div> +</body> diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-013-ref.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-013-ref.html new file mode 100644 index 00000000000..bd8456f525e --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-013-ref.html @@ -0,0 +1,94 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/#outset"> +<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com"> +<style> + body { + margin: 0px; + } + + .grid-container { + display: grid; + grid-gap: 10px; + grid-template-columns: 100px 100px 100px; + height: 320px; + } + + .item { + background: gray; + opacity: 0.5; + } + + .row-gap { + width: 320px; + height: 0px; + border-bottom: solid 5px red; + } + + .row-gap1 { + position: absolute; + top: 102.5px; + } + + .row-gap2 { + position: absolute; + top: 212.5px; + } + + .col-gap1 { + position: absolute; + width: 0; + display: flex; + gap: 20px; + flex-direction: column; + top: 5px; + left: 102.5px; + } + + .col-gap1>div { + height: 90px; + border-left: solid 5px blue; + } + + .col-gap2 { + position: absolute; + width: 0; + display: flex; + gap: 20px; + flex-direction: column; + top: 5px; + left: 212.5px; + } + + .col-gap2>div { + height: 90px; + border-left: solid 5px blue; + } +</style> + +<body> + <div class="grid-container"> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + </div> +</body> + +<div class="row-gap row-gap1"> </div> +<div class="row-gap row-gap2"> </div> + +<div class="col-gap1"> + <div class="col-gap1a"></div> + <div class="col-gap1b"></div> + <div class="col-gap1c"></div> +</div> +<div class="col-gap2"> + <div class="col-gap2a"></div> + <div class="col-gap2b"></div> + <div class="col-gap2c"></div> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-013.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-013.html new file mode 100644 index 00000000000..4a056134089 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-013.html @@ -0,0 +1,49 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: An outset of -5px shortens the ends of decorations relative to the edges of adjacent items. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="grid-gap-decorations-013-ref.html"> +<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com"> +<style> + body { + margin: 0px; + } + + .grid-container { + display: grid; + grid-gap: 10px; + grid-template-columns: 100px 100px 100px; + height: 320px; + + column-rule-color: blue; + column-rule-style: solid; + column-rule-width: 5px; + + row-rule-color: red; + row-rule-style: solid; + row-rule-width: 5px; + + column-rule-outset: -5px; + column-rule-break: intersection; + } + + .item { + background: gray; + opacity: 0.5; + } +</style> + +<body> + <div class="grid-container"> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + </div> +</body> diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-014-ref.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-014-ref.html new file mode 100644 index 00000000000..25a930a51af --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-014-ref.html @@ -0,0 +1,68 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/#outset"> +<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com"> +<style> + .grid-container { + display: grid; + grid-gap: 10px; + grid-template-columns: 100px 100px 100px; + height: 320px; + + column-rule-color: blue; + column-rule-style: solid; + column-rule-width: 5px; + } + + .item { + background: gray; + opacity: 0.5; + } + + .row-gap { + position: absolute; + width: 320px; + height: 0px; + border-bottom: solid 5px red; + } + + .row-gap1 { + top: 110.5px; + } + + .row-gap2 { + top: 220.5px; + } + + .col-gap { + position: absolute; + top: 3px; + width: 0px; + height: 330px; + border-left: solid 5px blue; + } + + .col-gap1 { + left: 110.5px; + } + + .col-gap2 { + left: 220.5px; + } +</style> +<div class="grid-container"> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> +</div> + +<div class="row-gap row-gap1"> </div> +<div class="row-gap row-gap2"> </div> + +<div class="col-gap col-gap1"> </div> +<div class="col-gap col-gap2"> </div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-014.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-014.html new file mode 100644 index 00000000000..97ad626e1f2 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-014.html @@ -0,0 +1,42 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: An outset of 5px with rule-break: `none` extends decorations outside edge track lines. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="grid-gap-decorations-014-ref.html"> +<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com"> +<style> + .grid-container { + display: grid; + grid-gap: 10px; + grid-template-columns: 100px 100px 100px; + height: 320px; + + column-rule-color: blue; + column-rule-style: solid; + column-rule-width: 5px; + + row-rule-color: red; + row-rule-style: solid; + row-rule-width: 5px; + + column-rule-outset: 5px; + column-rule-break: none; + } + + .item { + background: gray; + opacity: 0.5; + } +</style> +<div class="grid-container"> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> +</div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-015-ref.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-015-ref.html new file mode 100644 index 00000000000..0937a62da6f --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-015-ref.html @@ -0,0 +1,95 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/#outset"> +<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com"> +<style> + body { + margin-top: 20px; + } + + .grid-container { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 10px; + width: 430px; + height: 430px; + } + + .grid-item { + background-color: gray; + opacity: 0.5; + border: 1px solid #000; + z-index: 2; + } + + .col-gap { + width: 0; + border-left: solid 5px blue; + } + + .col-gap1 { + + position: absolute; + top: 110px; + left: 110.5px; + height: 250px; + } + + .col-gap2 { + position: absolute; + top: 0px; + left: 220.5px; + height: 250px; + } + + .col-gap3 { + position: absolute; + top: 0px; + left: 330.5px; + height: 470px; + } + + .row-gap { + height: 0px; + border-bottom: solid 5px red; + } + + .row-gap1 { + position: absolute; + top: 122.5px; + left: 8px; + width: 215px; + } + + .row-gap2 { + position: absolute; + top: 232.5px; + left: 113px; + width: 220px; + } + + .row-gap3 { + position: absolute; + top: 342.5px; + left: 8px; + width: 430px; + } +</style> + +<div class="grid-container"> + <div class="grid-item" style="grid-column: 1 / 3; grid-row: 1 / 2;"></div> + <div class="grid-item" style="grid-column: 3 / 4; grid-row: 1 / 3;"></div> + <div class="grid-item" style="grid-row: 2 / 4;"></div> + <div class="grid-item" style="grid-column: 2 / 4; grid-row: 3 / 4;"></div> + <div class="grid-item" style="grid-column: 2 / 3; grid-row: 2 / 3;"></div> + <div class="grid-item" style="grid-column: 4 / 5; grid-row: 1 / 4;"></div> + <div class="grid-item" style="grid-column: 1 / 4; grid-row: 4 / 5;"></div> + <div class="grid-item" style="grid-column: 4 / 5; grid-row: 4 / 5;"></div> +</div> + +<div class="row-gap row-gap1"> </div> +<div class="row-gap row-gap2"> </div> +<div class="row-gap row-gap3"> </div> + +<div class="col-gap col-gap1"> </div> +<div class="col-gap col-gap2"> </div> +<div class="col-gap col-gap3"> </div> diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-015.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-015.html new file mode 100644 index 00000000000..e575c134353 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-015.html @@ -0,0 +1,49 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: An outset of 20px with rule-break: `spanning-item` extends decorations into spanning items and outside edge track lines. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/#break"> +<link rel="match" href="grid-gap-decorations-015-ref.html"> +<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com"> +<style> + body { + margin-top: 20px; + } + + .grid-container { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 10px; + + width: 430px; + height: 430px; + + column-rule-color: blue; + column-rule-style: solid; + column-rule-width: 5px; + + row-rule-color: red; + row-rule-style: solid; + row-rule-width: 5px; + + column-rule-break: spanning-item; + row-rule-break: spanning-item; + column-rule-outset: 20px; + } + + .grid-item { + background-color: gray; + opacity: 0.5; + border: 1px solid #000; + } +</style> +<div class="grid-container"> + <div class="grid-item" style="grid-column: 1 / 3; grid-row: 1 / 2;"></div> + <div class="grid-item" style="grid-column: 3 / 4; grid-row: 1 / 3;"></div> + <div class="grid-item" style="grid-row: 2 / 4;"></div> + <div class="grid-item" style="grid-column: 2 / 4; grid-row: 3 / 4;"></div> + <div class="grid-item" style="grid-column: 2 / 3; grid-row: 2 / 3;"></div> + <div class="grid-item" style="grid-column: 4 / 5; grid-row: 1 / 4;"></div> + <div class="grid-item" style="grid-column: 1 / 4; grid-row: 4 / 5;"></div> + <div class="grid-item" style="grid-column: 4 / 5; grid-row: 4 / 5;"></div> +</div> diff --git a/tests/wpt/tests/css/css-grid/alignment/grid-item-aspect-ratio-stretch-4-ref.html b/tests/wpt/tests/css/css-grid/alignment/grid-item-aspect-ratio-stretch-4-ref.html index 8d7fc870fae..8c251a9d9f0 100644 --- a/tests/wpt/tests/css/css-grid/alignment/grid-item-aspect-ratio-stretch-4-ref.html +++ b/tests/wpt/tests/css/css-grid/alignment/grid-item-aspect-ratio-stretch-4-ref.html @@ -39,7 +39,7 @@ <img class="justify"> </div> <div> - <img style="width:20px; height:0px"> + <img style="width:20px; height:40px"> </div> <script> diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/baseline/masonry-grid-item-self-baseline-002a.html b/tests/wpt/tests/css/css-grid/masonry/tentative/baseline/masonry-grid-item-self-baseline-002a.html index 6708e583328..4ece8d754d3 100644 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/baseline/masonry-grid-item-self-baseline-002a.html +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/baseline/masonry-grid-item-self-baseline-002a.html @@ -23,7 +23,6 @@ body { width:600px; height:600px; border:1px solid; box-sizing:border-box; } padding-block-start: 1px; margin-left: 1px; border:1px solid; - masonry-auto-flow: next; height: 100px; width: 100px; } diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/baseline/masonry-grid-item-self-baseline-002b.html b/tests/wpt/tests/css/css-grid/masonry/tentative/baseline/masonry-grid-item-self-baseline-002b.html index 34911b7c9fa..cc0eaaa9cc2 100644 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/baseline/masonry-grid-item-self-baseline-002b.html +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/baseline/masonry-grid-item-self-baseline-002b.html @@ -23,7 +23,6 @@ body { width:600px; height:600px; border:1px solid; box-sizing:border-box; } padding-block-start: 1px; margin-left: 1px; border:1px solid; - masonry-auto-flow: next; height: 100px; width: 100px; } diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-fr-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-fr-ref.html index ca2aaef482d..41a032712a2 100644 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-fr-ref.html +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-fr-ref.html @@ -83,51 +83,51 @@ grid > item:nth-child(6) { <item class="hidden" style="grid-area: 4/2">0 0</item> </grid> - <grid> - <item>1</item> - <item>2 2</item> - <item style="grid-column: span 2">3 3</item> - <item>4</item> - <item style="height:2ch; grid-row:2">5 5</item> - - <item class="hidden" style="grid-column: 2; grid-row: 1">0 0</item> - <item class="hidden" style="grid-column: 2; grid-row: 4">0 0</item> - </grid> - - <grid> - <item>1</item> - <item>2 2</item> - <item>3 3</item> - <item>4</item> - <item style="height:4ch; grid-row:2/span 2">5 5</item> - - <item class="hidden" style="grid-column: 2; grid-row: 1">0 0</item> - <item class="hidden" style="grid-column: 2; grid-row: 4">0 0</item> - </grid> - - <grid> - <item>1</item> - <item>2 2</item> - <item>3 3</item> - <item>4</item> - <item style="grid-row:2/span 2">5 5</item> - <item style="height:5ch; grid-row:span 3/4">6</item> - - <item class="hidden" style="grid-column: 2; grid-row: 1">0 0</item> - <item class="hidden" style="grid-column: 2; grid-row: 4">0 0</item> - </grid> - - <grid> - <item>1</item> - <item>2 2</item> - <item>3 3</item> - <item>4</item> - <item style="height:3ch; grid-row:span 2/4">5</item> - <item style="height:5ch; grid-row:1/span 3">6</item> - - <item class="hidden" style="grid-column: 2; grid-row: 1">0 0</item> - <item class="hidden" style="grid-column: 2; grid-row: 4">0 0</item> - </grid> +<grid> + <item>1</item> + <item>2 2</item> + <item style="grid-column: span 2">3 3</item> + <item>4</item> + <item style="height:2ch; grid-row:2">5 5</item> + + <item class="hidden" style="grid-column: 2; grid-row: 1">0 0</item> + <item class="hidden" style="grid-column: 2; grid-row: 4">0 0</item> +</grid> + +<grid> + <item>1</item> + <item>2 2</item> + <item>3 3</item> + <item>4</item> + <item style="height:4ch; grid-row:2/span 2">5 5</item> + + <item class="hidden" style="grid-column: 2; grid-row: 1">0 0</item> + <item class="hidden" style="grid-column: 2; grid-row: 4">0 0</item> +</grid> + +<grid> + <item>1</item> + <item>2 2</item> + <item>3 3</item> + <item>4</item> + <item style="grid-row:2/span 2">5 5</item> + <item style="height:5ch; grid-row:span 3/4">6</item> + + <item class="hidden" style="grid-column: 2; grid-row: 1">0 0</item> + <item class="hidden" style="grid-column: 2; grid-row: 4">0 0</item> +</grid> + +<grid> + <item>1</item> + <item>2 2</item> + <item>3 3</item> + <item>4</item> + <item style="height:3ch; grid-row:span 2/4">5</item> + <item style="height:5ch; grid-row:1/span 3">6</item> + + <item class="hidden" style="grid-column: 2; grid-row: 1">0 0</item> + <item class="hidden" style="grid-column: 2; grid-row: 4">0 0</item> +</grid> <grid> <item>1</item> diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-mix2-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-mix2-ref.html index 97e6b3ea292..4d1470896c8 100644 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-mix2-ref.html +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-mix2-ref.html @@ -4,36 +4,36 @@ http://creativecommons.org/publicdomain/zero/1.0/ --> <html> -<meta charset="utf-8"> -<title>Reference: Masonry layout max-content sizing</title> -<link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com"> + <meta charset="utf-8"> + <title>Reference: Masonry layout max-content sizing</title> + <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com"> <style> - @import "support/masonry-intrinsic-sizing-visual.css"; - - grid { - display: inline-grid; - gap: 1px 2px; - /* keep fixed values small enough for spanners to have an effect */ - grid-template-rows: 1.1ch auto 1.4ch 1fr; - grid-auto-flow: column; - border: 1px solid; - padding: 1px 0 2px 0; - vertical-align: top; - height: max-content; - } - - item { - justify-self: start; - writing-mode: vertical-rl; - text-orientation: sideways; - } - - .hidden { - visibility: hidden; - opacity: 0.5; - width: 1em; - } +@import "support/masonry-intrinsic-sizing-visual.css"; + +grid { + display: inline-grid; + gap: 1px 2px; + /* keep fixed values small enough for spanners to have an effect */ + grid-template-rows: 1.1ch auto 1.4ch 1fr; + grid-auto-flow: column; + border: 1px solid; + padding: 1px 0 2px 0; + vertical-align: top; + height: max-content; +} + +item { + justify-self: start; + writing-mode: vertical-rl; + text-orientation: sideways; +} + +.hidden { + visibility: hidden; + opacity: 0.5; + width: 1em; +} </style> <body> @@ -111,12 +111,12 @@ <item class="hidden" style="grid-area: 4/3">0 0</item> </grid> - <grid> - <item>1</item> - <item>2 2</item> - <item style="grid-column: span 2">3 3</item> - <item>4</item> - <item style="height:6ch; grid-area: 1/3/5/4">5 5</item> +<grid> + <item>1</item> + <item>2 2</item> + <item style="grid-column: span 2">3 3</item> + <item>4</item> + <item style="height:6ch; grid-area: 1/3/5/4">5 5</item> <item class="hidden" style="grid-area: 4/3">0 0</item> </grid> diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-004-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-004-ref.html index 75d6b741c2f..ba9c72f2925 100644 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-004-ref.html +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-004-ref.html @@ -31,36 +31,9 @@ item { <body> <grid> - <item style="grid-column:1/2">3</item> + <item style="grid-column:1/2; grid-row: 1;">2</item> <item style="grid-column:2/span 2">1</item> - <item style="grid-column:4/5">2</item> - <item style="grid-column:2/1">5</item> - <item style="grid-column:2/3">6</item> - <item style="grid-column:3/span 2">4</item> -</grid> - -<grid> - <item style="grid-column:1/2">3</item> - <item style="grid-column:2/span 2">1</item> - <item style="grid-column:4/5">2</item> - <item style="grid-column:2/3">5</item> - <item style="grid-column:3/span 2">4</item> - <item style="grid-column:3/4">6</item> -</grid> - -<grid> - <item style="grid-column:1/2">3</item> - <item style="grid-column:2/span 2">1</item> - <item style="grid-column:4/5">2</item> - <item style="grid-column:2/1">5</item> - <item style="grid-column:2/3">6</item> - <item style="grid-column:3/span 2">4</item> -</grid> - -<grid> - <item style="grid-column:1/2">3</item> - <item style="grid-column:2/span 2">1</item> - <item style="grid-column:4/5">2</item> + <item style="grid-column:4/5; grid-row: 1;">3</item> <item style="grid-column:2/1">5</item> <item style="grid-column:2/3">6</item> <item style="grid-column:3/span 2">4</item> @@ -68,36 +41,9 @@ item { <div style="direction:rtl"> <grid> - <item style="grid-column:1/2">3</item> - <item style="grid-column:2/span 2">1</item> - <item style="grid-column:4/5">2</item> - <item style="grid-column:2/1">5</item> - <item style="grid-column:2/3">6</item> - <item style="grid-column:3/span 2">4</item> -</grid> - -<grid> - <item style="grid-column:1/2">3</item> - <item style="grid-column:2/span 2">1</item> - <item style="grid-column:4/5">2</item> - <item style="grid-column:2/3">5</item> - <item style="grid-column:3/span 2">4</item> - <item style="grid-column:3/4">6</item> -</grid> - -<grid> - <item style="grid-column:1/2">3</item> - <item style="grid-column:2/span 2">1</item> - <item style="grid-column:4/5">2</item> - <item style="grid-column:2/1">5</item> - <item style="grid-column:2/3">6</item> - <item style="grid-column:3/span 2">4</item> -</grid> - -<grid> - <item style="grid-column:1/2">3</item> + <item style="grid-column:1/2">2</item> <item style="grid-column:2/span 2">1</item> - <item style="grid-column:4/5">2</item> + <item style="grid-column:4/5">3</item> <item style="grid-column:2/1">5</item> <item style="grid-column:2/3">6</item> <item style="grid-column:3/span 2">4</item> diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-004.html b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-004.html index 52867cd4a21..92741f4b115 100644 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-004.html +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-004.html @@ -41,33 +41,6 @@ item { <item>6</item> </grid> -<grid style="masonry-auto-flow: next"> - <item style="grid-column:2/span 2">1</item> - <item>2</item> - <item>3</item> - <item style="grid-column:3/span 2">4</item> - <item>5</item> - <item>6</item> -</grid> - -<grid style="masonry-auto-flow: ordered"> - <item style="grid-column:2/span 2">1</item> - <item>2</item> - <item>3</item> - <item style="grid-column:3/span 2">4</item> - <item>5</item> - <item>6</item> -</grid> - -<grid style="masonry-auto-flow: next ordered"> - <item style="grid-column:2/span 2">1</item> - <item>2</item> - <item>3</item> - <item style="grid-column:3/span 2">4</item> - <item>5</item> - <item>6</item> -</grid> - <div style="direction:rtl"> <grid> <item style="grid-column:2/span 2">1</item> @@ -77,33 +50,6 @@ item { <item>5</item> <item>6</item> </grid> - -<grid style="masonry-auto-flow: next"> - <item style="grid-column:2/span 2">1</item> - <item>2</item> - <item>3</item> - <item style="grid-column:3/span 2">4</item> - <item>5</item> - <item>6</item> -</grid> - -<grid style="masonry-auto-flow: ordered"> - <item style="grid-column:2/span 2">1</item> - <item>2</item> - <item>3</item> - <item style="grid-column:3/span 2">4</item> - <item>5</item> - <item>6</item> -</grid> - -<grid style="masonry-auto-flow: next ordered"> - <item style="grid-column:2/span 2">1</item> - <item>2</item> - <item>3</item> - <item style="grid-column:3/span 2">4</item> - <item>5</item> - <item>6</item> -</grid> </div> </body></html> diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-005-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-005-ref.html index 806f314300d..bd5d55262a3 100644 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-005-ref.html +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-005-ref.html @@ -32,76 +32,22 @@ item { <grid> <item style="grid-column:2/span 2">1</item> - <item style="grid-column:4/5">2</item> - <item style="grid-column:1/span 2">4</item> - <item style="grid-column:3/4">3</item> - <item style="grid-column:4/5">5</item> - <item style="grid-column:1/2">6</item> -</grid> - -<grid> - <item style="grid-column:1/2">3</item> - <item style="grid-column:2/span 2">1</item> - <item style="grid-column:4/5">2</item> + <item style="grid-column:1/2; grid-row: 1;">2</item> <item style="grid-column:1/span 2">4</item> + <item style="grid-column:4/5; grid-row: 1;">3</item> <item style="grid-column:3/4">5</item> <item style="grid-column:4/5">6</item> </grid> -<grid> - <item style="grid-column:1/2">3</item> - <item style="grid-column:2/span 2">1</item> - <item style="grid-column:4/5">2</item> - <item style="grid-column:1/span 2">4</item> - <item style="grid-column:3/4">5</item> - <item style="grid-column:4/5">6</item> -</grid> - -<grid> - <item style="grid-column:2/span 2">1</item> - <item style="grid-column:4/5">2</item> - <item style="grid-column:1/span 2">4</item> - <item style="grid-column:3/4">3</item> - <item style="grid-column:4/5">5</item> - <item style="grid-column:1/2">6</item> -</grid> - <div style="direction:rtl"> <grid> <item style="grid-column:2/span 2">1</item> - <item style="grid-column:4/5">2</item> - <item style="grid-column:1/span 2">4</item> - <item style="grid-column:3/4">3</item> - <item style="grid-column:4/5">5</item> - <item style="grid-column:1/2">6</item> -</grid> - -<grid> - <item style="grid-column:1/2">3</item> - <item style="grid-column:2/span 2">1</item> - <item style="grid-column:4/5">2</item> + <item style="grid-column:1/2; grid-row: 1;">2</item> <item style="grid-column:1/span 2">4</item> + <item style="grid-column:4/5; grid-row: 1;">3</item> <item style="grid-column:3/4">5</item> <item style="grid-column:4/5">6</item> </grid> - -<grid> - <item style="grid-column:1/2">3</item> - <item style="grid-column:2/span 2">1</item> - <item style="grid-column:4/5">2</item> - <item style="grid-column:1/span 2">4</item> - <item style="grid-column:3/4">5</item> - <item style="grid-column:4/5">6</item> -</grid> - -<grid> - <item style="grid-column:2/span 2">1</item> - <item style="grid-column:4/5">2</item> - <item style="grid-column:1/span 2">4</item> - <item style="grid-column:3/4">3</item> - <item style="grid-column:4/5">5</item> - <item style="grid-column:1/2">6</item> -</grid> </div> </body></html> diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-005.html b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-005.html index 7d4993fb3a6..f879ddce562 100644 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-005.html +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-005.html @@ -41,33 +41,6 @@ item { <item>6</item> </grid> -<grid style="masonry-auto-flow: ordered"> - <item style="grid-column:2/span 2">1</item> - <item>2</item> - <item>3</item> - <item style="grid-column:1/span 2">4</item> - <item>5</item> - <item>6</item> -</grid> - -<grid style="masonry-auto-flow: ordered next"> - <item style="grid-column:2/span 2">1</item> - <item>2</item> - <item>3</item> - <item style="grid-column:1/span 2">4</item> - <item>5</item> - <item>6</item> -</grid> - -<grid style="masonry-auto-flow: next"> - <item style="grid-column:2/span 2">1</item> - <item>2</item> - <item>3</item> - <item style="grid-column:1/span 2">4</item> - <item>5</item> - <item>6</item> -</grid> - <div style="direction:rtl"> <grid> <item style="grid-column:2/span 2">1</item> @@ -77,33 +50,6 @@ item { <item>5</item> <item>6</item> </grid> - -<grid style="masonry-auto-flow: ordered"> - <item style="grid-column:2/span 2">1</item> - <item>2</item> - <item>3</item> - <item style="grid-column:1/span 2">4</item> - <item>5</item> - <item>6</item> -</grid> - -<grid style="masonry-auto-flow: ordered next"> - <item style="grid-column:2/span 2">1</item> - <item>2</item> - <item>3</item> - <item style="grid-column:1/span 2">4</item> - <item>5</item> - <item>6</item> -</grid> - -<grid style="masonry-auto-flow: next"> - <item style="grid-column:2/span 2">1</item> - <item>2</item> - <item>3</item> - <item style="grid-column:1/span 2">4</item> - <item>5</item> - <item>6</item> -</grid> </div> </body></html> diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-006-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-006-ref.html index a6e9b75d0e6..a54476a6ba8 100644 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-006-ref.html +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-006-ref.html @@ -84,61 +84,5 @@ item { <item style="grid-column:2/3">6</item> </grid> -<span class="next"> -<grid> - <item style="padding-top:30px; grid-column:1/2">1</item> - <item style="grid-column:2/3">2</item> - <item style="grid-column:3/4">3</item> - <item style="grid-column:4/5">4</item> - <item style="grid-column:1/2">5</item> - <item style="grid-column:2/3">6</item> -</grid> - -<grid> - <item style="grid-column:1/2">1</item> - <item style="padding-top:30px; grid-column:2/3">2</item> - <item style="grid-column:3/4">3</item> - <item style="grid-column:4/5">4</item> - <item style="grid-column:1/2">5</item> - <item style="grid-column:2/3">6</item> -</grid> - -<grid> - <item style="padding-top:30px; grid-column:1/2">1</item> - <item style="padding-top:30px; grid-column:2/3">2</item> - <item style="padding-top:10px; grid-column:3/4">3</item> - <item style="grid-column:4/5">4</item> - <item style="grid-column:1/2">5</item> - <item style="grid-column:2/3">6</item> -</grid> - -<grid> - <item style="grid-column:1/2">1</item> - <item style="padding-top:30px; grid-column:2/3">2</item> - <item style="padding-top:10px; grid-column:3/4">3</item> - <item style="grid-column:1/span 2">4</item> - <item style="grid-column:3/4">5</item> - <item style="grid-column:4/5">6</item> -</grid> - -<grid> - <item style="grid-column:1/2">1</item> - <item style="padding-top:30px; grid-column:2/3">2</item> - <item style="padding-top:10px; grid-column:3/4">3</item> - <item style="grid-column:1/span 3">4</item> - <item style="grid-column:4/5">5</item> - <item style="grid-column:1/2">6</item> -</grid> - -<grid> - <item style="grid-column:1/2">1</item> - <item style="padding-top:30px; grid-column:2/3">2</item> - <item style="padding-top:10px; grid-column:3/4">3</item> - <item style="grid-column:1/span 4">4</item> - <item style="grid-column:1/2">5</item> - <item style="grid-column:2/3">6</item> -</grid> -</span> - </body> </html> diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-006.html b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-006.html index 467e313d339..0f963762af5 100644 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-006.html +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-006.html @@ -28,9 +28,6 @@ item { background-color: #444; color: #fff; } -.next > grid { - masonry-auto-flow: next; -} </style> </head> <body> @@ -89,61 +86,5 @@ item { <item>6</item> </grid> -<span class="next"> -<grid> - <item style="padding-top:30px">1</item> - <item>2</item> - <item>3</item> - <item>4</item> - <item>5</item> - <item>6</item> -</grid> - -<grid> - <item>1</item> - <item style="padding-top:30px">2</item> - <item>3</item> - <item>4</item> - <item>5</item> - <item>6</item> -</grid> - -<grid> - <item style="padding-top:30px">1</item> - <item style="padding-top:30px">2</item> - <item style="padding-top:10px">3</item> - <item>4</item> - <item>5</item> - <item>6</item> -</grid> - -<grid> - <item>1</item> - <item style="padding-top:30px">2</item> - <item style="padding-top:10px">3</item> - <item style="grid-column:span 2">4</item> - <item>5</item> - <item>6</item> -</grid> - -<grid> - <item>1</item> - <item style="padding-top:30px">2</item> - <item style="padding-top:10px">3</item> - <item style="grid-column:span 3">4</item> - <item>5</item> - <item>6</item> -</grid> - -<grid> - <item>1</item> - <item style="padding-top:30px">2</item> - <item style="padding-top:10px">3</item> - <item style="grid-column:span 4">4</item> - <item>5</item> - <item>6</item> -</grid> -</span> - </body> </html> diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-007-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-007-ref.html index 50236046fb0..5c1fd18b3d1 100644 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-007-ref.html +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-007-ref.html @@ -85,61 +85,5 @@ item { <item style="grid-column:2/3">6</item> </grid> -<span class="next"> -<grid> - <item style="padding-top:30px; grid-column:1/2">1</item> - <item style="grid-column:2/3">2</item> - <item style="grid-column:3/4">3</item> - <item style="grid-column:4/5">4</item> - <item style="grid-column:1/2">5</item> - <item style="grid-column:2/3">6</item> -</grid> - -<grid> - <item style="grid-column:1/2">1</item> - <item style="padding-top:30px; grid-column:2/3">2</item> - <item style="grid-column:3/4">3</item> - <item style="grid-column:4/5">4</item> - <item style="grid-column:1/2">5</item> - <item style="grid-column:2/3">6</item> -</grid> - -<grid> - <item style="padding-top:30px; grid-column:1/2">1</item> - <item style="padding-top:30px; grid-column:2/3">2</item> - <item style="padding-top:10px; grid-column:3/4">3</item> - <item style="grid-column:4/5">4</item> - <item style="grid-column:1/2">5</item> - <item style="grid-column:2/3">6</item> -</grid> - -<grid> - <item style="grid-column:1/2">1</item> - <item style="padding-top:30px; grid-column:2/3">2</item> - <item style="padding-top:10px; grid-column:3/4">3</item> - <item style="grid-column:1/span 2">4</item> - <item style="grid-column:3/4">5</item> - <item style="grid-column:4/5">6</item> -</grid> - -<grid> - <item style="grid-column:1/2">1</item> - <item style="padding-top:30px; grid-column:2/3">2</item> - <item style="padding-top:10px; grid-column:3/4">3</item> - <item style="grid-column:1/span 3">4</item> - <item style="grid-column:4/5">5</item> - <item style="grid-column:1/2">6</item> -</grid> - -<grid> - <item style="grid-column:1/2">1</item> - <item style="padding-top:30px; grid-column:2/3">2</item> - <item style="padding-top:10px; grid-column:3/4">3</item> - <item style="grid-column:1/span 4">4</item> - <item style="grid-column:1/2">5</item> - <item style="grid-column:2/3">6</item> -</grid> -</span> - </body> </html> diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-007.html b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-007.html index 4c8053ba666..ebbed114a11 100644 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-007.html +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-007.html @@ -29,9 +29,6 @@ item { background-color: #444; color: #fff; } -.next > grid { - masonry-auto-flow: next; -} </style> </head> <body> @@ -90,61 +87,5 @@ item { <item>6</item> </grid> -<span class="next"> -<grid> - <item style="padding-top:30px">1</item> - <item>2</item> - <item>3</item> - <item>4</item> - <item>5</item> - <item>6</item> -</grid> - -<grid> - <item>1</item> - <item style="padding-top:30px">2</item> - <item>3</item> - <item>4</item> - <item>5</item> - <item>6</item> -</grid> - -<grid> - <item style="padding-top:30px">1</item> - <item style="padding-top:30px">2</item> - <item style="padding-top:10px">3</item> - <item>4</item> - <item>5</item> - <item>6</item> -</grid> - -<grid> - <item>1</item> - <item style="padding-top:30px">2</item> - <item style="padding-top:10px">3</item> - <item style="grid-column:span 2">4</item> - <item>5</item> - <item>6</item> -</grid> - -<grid> - <item>1</item> - <item style="padding-top:30px">2</item> - <item style="padding-top:10px">3</item> - <item style="grid-column:span 3">4</item> - <item>5</item> - <item>6</item> -</grid> - -<grid> - <item>1</item> - <item style="padding-top:30px">2</item> - <item style="padding-top:10px">3</item> - <item style="grid-column:span 4">4</item> - <item>5</item> - <item>6</item> -</grid> -</span> - </body> </html> diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-rows-item-placement-auto-flow-next-001-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-rows-item-placement-auto-flow-next-001-ref.html deleted file mode 100644 index cbb3e825a4b..00000000000 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-rows-item-placement-auto-flow-next-001-ref.html +++ /dev/null @@ -1,46 +0,0 @@ -<!DOCTYPE HTML> -<!-- - Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ ---> -<html><head> - <meta charset="utf-8"> - <title>CSS Grid masonry rows masonry-auto-flow next</title> - <link rel="author" title="Sammy Gill" href="mailto:sammy.gill@apple.com"> - <link rel="help" href="https://drafts.csswg.org/css-grid-3/#masonry-auto-flow"> - <meta name="assert" content="Placing item that would span outside the grid using masonry-auto-flow-next should place the item at the first grid axis track" /> - <style> -html,body { - color:black; background-color:white; font:25px/1 monospace; padding:0; margin:0; -} - -grid { - display: inline-grid; - gap: 10px 20px; - grid-template-columns: repeat(4,80px); - grid-template-rows: auto; - color: #444; - border: 1px solid; - padding: 2px; -} - -item { - background-color: #444; - color: #fff; - padding: 20px; - margin: 3px; - border: 5px solid blue; -} -</style> -</head> -<body> - -<grid> - <item>1</item> - <item style="grid-column: span 3">2</item> - <item>3</item> - <item style="grid-column: span 4">4</item> -</grid> - -</body> -</html> diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-rows-item-placement-auto-flow-next-001.html b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-rows-item-placement-auto-flow-next-001.html deleted file mode 100644 index c425490d2d8..00000000000 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-rows-item-placement-auto-flow-next-001.html +++ /dev/null @@ -1,48 +0,0 @@ -<!DOCTYPE HTML> -<!-- - Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ ---> -<html><head> - <meta charset="utf-8"> - <title>CSS Grid masonry rows masonry-auto-flow next</title> - <link rel="author" title="Sammy Gill" href="mailto:sammy.gill@apple.com"> - <link rel="help" href="https://drafts.csswg.org/css-grid-3/#masonry-auto-flow"> - <link rel="match" href="masonry-rows-item-placement-auto-flow-next-001-ref.html"> - <meta name="assert" content="Placing item that would span outside the grid using masonry-auto-flow-next should place the item at the first grid axis track" /> - <style> -html,body { - color:black; background-color:white; font:25px/1 monospace; padding:0; margin:0; -} - -grid { - display: inline-grid; - gap: 10px 20px; - grid-template-columns: repeat(4,80px); - grid-template-rows: masonry; - color: #444; - border: 1px solid; - padding: 2px; - masonry-auto-flow: next; -} - -item { - background-color: #444; - color: #fff; - padding: 20px; - margin: 3px; - border: 5px solid blue; -} -</style> -</head> -<body> - -<grid> - <item>1</item> - <item style="grid-column: span 3">2</item> - <item>3</item> - <item style="grid-column: span 4">4</item> -</grid> - -</body> -</html> diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/order/masonry-order-002-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/order/masonry-order-002-ref.html deleted file mode 100644 index 15be3fde837..00000000000 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/order/masonry-order-002-ref.html +++ /dev/null @@ -1,43 +0,0 @@ -<!DOCTYPE HTML> -<!-- - Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ ---> -<html><head> - <meta charset="utf-8"> - <title>Reference: Masonry layout using `order` and `masonry-auto-flow: next`</title> - <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com"> - <style> - html,body { - color:black; background-color:white; font:25px/1 monospace; padding:0; margin:0; - } - - grid { - display: inline-grid; - gap: 10px 20px; - grid-template-columns: repeat(4,auto); - grid-template-rows: masonry; - color: #444; - border: 1px solid; - padding: 2px; - } - - item { - background-color: #444; - color: #fff; - padding: 20px; - margin: 3px; - border: 5px solid blue; - } - </style> -</head> -<body> - -<grid> - <item style="grid-column: 1">1</item> - <item style="margin-top:10px; grid-column: 2;">4</item> - <item style="grid-column: 3">6</item> - <item style="grid-column: 4">2</item> - <item style="grid-column: 2/span 2">5</item> - <item>3</item> -</grid> diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/order/masonry-order-002.html b/tests/wpt/tests/css/css-grid/masonry/tentative/order/masonry-order-002.html deleted file mode 100644 index 5ebdec27193..00000000000 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/order/masonry-order-002.html +++ /dev/null @@ -1,47 +0,0 @@ -<!DOCTYPE HTML> -<!-- - Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ ---> -<html><head> - <meta charset="utf-8"> - <title>CSS Grid Test: Masonry layout using `order` and `masonry-auto-flow: next`</title> - <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com"> - <link rel="help" href="https://drafts.csswg.org/css-grid-3/#masonry-layout-algorithm"> - <link rel="help" href="https://drafts.csswg.org/css-grid-3/#masonry-auto-flow"> - <link rel="match" href="masonry-order-002-ref.html"> - <style> - html,body { - color:black; background-color:white; font:25px/1 monospace; padding:0; margin:0; - } - - grid { - display: inline-grid; - gap: 10px 20px; - grid-template-columns: repeat(4,auto); - grid-template-rows: masonry; - masonry-auto-flow: next; - color: #444; - border: 1px solid; - padding: 2px; - } - - item { - background-color: #444; - color: #fff; - padding: 20px; - margin: 3px; - border: 5px solid blue; - } - </style> -</head> -<body> - -<grid> - <item>1</item> - <item style="order:1">2</item> - <item style="order:1">3</item> - <item style="margin-top:10px">4</item> - <item style="order:2; grid-column:span 2">5</item> - <item>6</item> -</grid> diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/parsing/masonry-parsing.html b/tests/wpt/tests/css/css-grid/masonry/tentative/parsing/masonry-parsing.html index 2204c06f72b..64af83b316c 100644 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/parsing/masonry-parsing.html +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/parsing/masonry-parsing.html @@ -4,7 +4,6 @@ <meta charset="utf-8"> <title>CSS Masonry Test: parsing properties and shortands</title> <link rel="help" href="https://drafts.csswg.org/css-grid-3/#grid-template-masonry"> -<link rel="help" href="https://drafts.csswg.org/css-grid-3/#masonry-auto-flow"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/css/support/parsing-testcommon.js"></script> @@ -74,17 +73,6 @@ test_shorthand_value("grid", '10px / masonry', { 'grid-auto-flow': 'row' }); -test_valid_value("masonry-auto-flow", 'pack'); -test_valid_value("masonry-auto-flow", 'pack ordered', 'ordered'); -test_valid_value("masonry-auto-flow", 'ordered next', 'next ordered'); -test_valid_value("masonry-auto-flow", 'next definite-first', 'next'); -test_valid_value("masonry-auto-flow", 'definite-first pack', 'pack'); -test_invalid_value("masonry-auto-flow", 'auto'); -test_invalid_value("masonry-auto-flow", 'none'); -test_invalid_value("masonry-auto-flow", '10px'); -test_invalid_value("masonry-auto-flow", 'row'); -test_invalid_value("masonry-auto-flow", 'dense'); - </script> </body> </html> diff --git a/tests/wpt/tests/css/css-grid/parsing/grid-area-computed.html b/tests/wpt/tests/css/css-grid/parsing/grid-area-computed.html index d1ae78c7023..9b31e2b23c6 100644 --- a/tests/wpt/tests/css/css-grid/parsing/grid-area-computed.html +++ b/tests/wpt/tests/css/css-grid/parsing/grid-area-computed.html @@ -7,9 +7,17 @@ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/css/support/computed-testcommon.js"></script> +<style> + #container { + container-type: inline-size; + width: 100px; + } +</style> </head> <body> -<div id="target"></div> +<div id="container"> + <div id="target"></div> +</div> <script> // auto test_computed_value("grid-area", "auto / auto / auto / auto", @@ -34,6 +42,9 @@ test_computed_value("grid-row-start", "9 -Z_"); test_computed_value("grid-column-start", "-44 Z"); test_computed_value("grid-row-end", "1 -πA"); test_computed_value("grid-column-end", "5 π_"); +test_computed_value("grid-row-start", "calc(1.1) -a-", "1 -a-"); +test_computed_value("grid-row-start", "calc(10) -a-", "10 -a-"); +test_computed_value("grid-row-start", "calc(10 + (sign(2cqw - 10px) * 5)) -a-", "5 -a-"); // span && [ <integer> || <custom-ident> ] test_computed_value("grid-area", "span 2 i / auto / auto / auto", diff --git a/tests/wpt/tests/css/css-images/gradient/conic-gradient-001-ref.html b/tests/wpt/tests/css/css-images/gradient/conic-gradient-001-ref.html new file mode 100644 index 00000000000..2f12c01bb5f --- /dev/null +++ b/tests/wpt/tests/css/css-images/gradient/conic-gradient-001-ref.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<meta name="viewport" content="width=device-width, initial-scale=1.0"> +<title>Tests the maximum value of color stops in conic-gradient().</title> +<style> + body { + background-color: lightblue; + } + + .test { + display: flex; + flex-wrap: wrap; + } + + li { + width: 100px; + height: 100px; + margin-right: 30px; + margin-bottom: 30px; + outline: 1px solid black; + font-size: 14px; + text-align: center; + background: lime; + } +</style> +<p>Should be lime in the background of all boxes.</p> +<ol class="test"> + <li>0 999999999%</li> + <li>0 calc(Infinity * 0%)</li> + <li>0 calc(Infinity * 1%)</li> + <li>calc(Infinity * 0%) 100%</li> + <li>calc(Infinity * 1%) 100%</li> + <li>calc(Infinity * -1%) 100%</li> + <li>0% calc(Infinity * 1%)</li> + <li>from calc(Infinity * 1deg)</li> + <li>from calc(Infinity * 0deg)</li> +</ol> diff --git a/tests/wpt/tests/css/css-images/gradient/conic-gradient-001.html b/tests/wpt/tests/css/css-images/gradient/conic-gradient-001.html new file mode 100644 index 00000000000..37e41094fb2 --- /dev/null +++ b/tests/wpt/tests/css/css-images/gradient/conic-gradient-001.html @@ -0,0 +1,78 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<meta name="viewport" content="width=device-width, initial-scale=1.0"> +<link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com"> +<link rel="author" title="一丝" href="mailto:yiorsi@gmail.com"> +<link rel="help" href="https://www.w3.org/TR/css-color-4/#interpolation"> +<link rel="match" href="conic-gradient-001-ref.html"> +<title>Tests the maximum value of color stops in conic-gradient().</title> +<style> + body { + background-color: lightblue; + } + + .test { + display: flex; + flex-wrap: wrap; + } + + li { + width: 100px; + height: 100px; + margin-right: 30px; + margin-bottom: 30px; + outline: 1px solid black; + font-size: 14px; + text-align: center; + background: red; + } + + li:nth-child(1) { + background: conic-gradient(lime 0 999999999%); + } + + li:nth-child(2) { + background: conic-gradient(in hsl, lime 0 calc(Infinity * 0%)); + } + + li:nth-child(3) { + background: conic-gradient(in lch, lime 0 calc(Infinity * 1%)); + } + + li:nth-child(4) { + background: conic-gradient(in oklab, lime calc(Infinity * 0%) 100%); + } + + li:nth-child(5) { + background: conic-gradient(in srgb, lime calc(Infinity * 1%) 100%); + } + + li:nth-child(6) { + background: conic-gradient(in srgb, lime calc(Infinity * -1%) 100%); + } + + li:nth-child(7) { + background: conic-gradient(in srgb, lime 0 calc(Infinity * 1%)); + } + + li:nth-child(8) { + background: conic-gradient(from calc(Infinity * 1deg), lime 0 100%); + } + + li:nth-child(9) { + background: conic-gradient(from calc(Infinity * 0deg), lime 0 100%); + } +</style> + +<p>Should be lime in the background of all boxes.</p> +<ol class="test"> + <li>0 999999999%</li> + <li>0 calc(Infinity * 0%)</li> + <li>0 calc(Infinity * 1%)</li> + <li>calc(Infinity * 0%) 100%</li> + <li>calc(Infinity * 1%) 100%</li> + <li>calc(Infinity * -1%) 100%</li> + <li>0% calc(Infinity * 1%)</li> + <li>from calc(Infinity * 1deg)</li> + <li>from calc(Infinity * 0deg)</li> +</ol> diff --git a/tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-004-ref.html b/tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-004-ref.html new file mode 100644 index 00000000000..09f168115be --- /dev/null +++ b/tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-004-ref.html @@ -0,0 +1,29 @@ +<!doctype html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <title>Gradient analogous missing components carry forward logic tests</title> + <link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com"> + <link rel="author" title="一丝" href="mailto:yiorsi@gmail.com"> + <link rel="help" href="https://www.w3.org/TR/css-color-4/#interpolation"> + <meta name="assert" content="Tests that analogous missing components logic works."> + <style> + div { + display: flex; + align-items: center; + width: 200px; + height: 50px; + /* lime to red */ + background: linear-gradient(to right in oklab, rgb(0, 255, 0), rgb(255, 0, 0)); + } + </style> +</head> +<body> + <p>The background of all boxes should use the oklab color space, with a gradient from lime to red.</p> + <div class="test1">rgb() contains none</div> + <div class="test2">rgb() contains none</div> + <div class="test3">rgb() contains none</div> + <div class="test4">rgb() contains none</div> + <div class="test5">rgb() contains none</div> +</body> +</html> diff --git a/tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-004.html b/tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-004.html new file mode 100644 index 00000000000..286caa0226a --- /dev/null +++ b/tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-004.html @@ -0,0 +1,44 @@ +<!doctype html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <title>Gradient analogous missing components carry forward logic tests</title> + <link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com"> + <link rel="author" title="一丝" href="mailto:yiorsi@gmail.com"> + <link rel="help" href="https://www.w3.org/TR/css-color-4/#interpolation"> + <meta name="assert" content="Tests that analogous missing components logic works."> + <link rel="match" href="gradient-analogous-missing-components-004-ref.html"> + <style> + div { + display: flex; + align-items: center; + width: 200px; + height: 50px; + background: red; + } + .test1 { + background: linear-gradient(to right in oklab, rgb(none 255 0), rgb(255, 0, 0) ); + } + .test2 { + background: linear-gradient(to right in oklab, rgb(none 255 0), rgb(255 none 0) ); + } + .test3 { + background: linear-gradient(to right, rgb(none 255 0), rgb(255 none 0) ); + } + .test4 { + background: linear-gradient(to right, rgb(none 255 0), rgb(255, 0, 0) ); + } + .test5 { + background: linear-gradient(to right in oklab, rgb(0 255 0), rgb(255 0 0) ); + } + </style> +</head> +<body> + <p>The background of all boxes should use the oklab color space, with a gradient from lime to red.</p> + <div class="test1">rgb() contains none</div> + <div class="test2">rgb() contains none</div> + <div class="test3">rgb() contains none</div> + <div class="test4">rgb() contains none</div> + <div class="test5">rgb() contains none</div> +</body> +</html> diff --git a/tests/wpt/tests/css/css-images/gradient/gradient-eval-004-ref.html b/tests/wpt/tests/css/css-images/gradient/gradient-eval-004-ref.html index f197386bcfb..f28b30137cd 100644 --- a/tests/wpt/tests/css/css-images/gradient/gradient-eval-004-ref.html +++ b/tests/wpt/tests/css/css-images/gradient/gradient-eval-004-ref.html @@ -3,11 +3,12 @@ <head> <title>Gradient interpolation</title> <link rel="author" title="Mike Bremford" href="mailto:mike@bfo.com"> + <link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com"> <style> .test { width: 100px; height: 100px; - background: rgb(0% 50% 50%); + background: rgb(0, 0, 99); } </style> </head> diff --git a/tests/wpt/tests/css/css-images/gradient/gradient-eval-004.html b/tests/wpt/tests/css/css-images/gradient/gradient-eval-004.html index ada406fd2a0..1a9c43610f4 100644 --- a/tests/wpt/tests/css/css-images/gradient/gradient-eval-004.html +++ b/tests/wpt/tests/css/css-images/gradient/gradient-eval-004.html @@ -2,16 +2,17 @@ <html> <head> <title>Gradient interpolation</title> - <meta name="fuzzy" content="maxDifference=1-2;totalPixels=0-10000"> + <meta name="fuzzy" content="maxDifference=1-2;totalPixels=0-2000"> <link rel="author" title="Mike Bremford" href="mailto:mike@bfo.com"> + <link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com"> <link rel="help" href="https://www.w3.org/TR/css-color-4/#interpolation"> <link rel="help" href="https://www.w3.org/TR/css-color-4/#missing"> <meta name="assert" content="Gradient evaluation when one of the components is none works as specified"/> <link rel="match" href="gradient-eval-004-ref.html"> <style> :root { - --start: rgb(0% 0% 50%); - --end: rgb(0% 100% none); + --start: rgb(0% 0% 100%); + --end: rgb(0% 0% none); /* none should resolve to 0 as rgb don't have analogous components with oklab */ --t: 0.5; --big: 131070000px; } diff --git a/tests/wpt/tests/css/css-images/object-fit-containcontainintrinsicsize-png-001c.tentative.html b/tests/wpt/tests/css/css-images/object-fit-containcontainintrinsicsize-png-001c.tentative.html index b17f59f887f..dd1bf249a55 100644 --- a/tests/wpt/tests/css/css-images/object-fit-containcontainintrinsicsize-png-001c.tentative.html +++ b/tests/wpt/tests/css/css-images/object-fit-containcontainintrinsicsize-png-001c.tentative.html @@ -17,6 +17,7 @@ float: left; object-position: top left; contain: size; + aspect-ratio: auto; } br { clear: both; diff --git a/tests/wpt/tests/css/css-images/object-fit-containsize-png-001c.tentative.html b/tests/wpt/tests/css/css-images/object-fit-containsize-png-001c.tentative.html index 43a50adcedc..733b7592f3b 100644 --- a/tests/wpt/tests/css/css-images/object-fit-containsize-png-001c.tentative.html +++ b/tests/wpt/tests/css/css-images/object-fit-containsize-png-001c.tentative.html @@ -16,6 +16,7 @@ image-rendering: pixelated; float: left; contain: size; + aspect-ratio: auto; object-position: top left; } br { diff --git a/tests/wpt/tests/css/css-multicol/column-height-001.html b/tests/wpt/tests/css/css-multicol/column-height-001.html new file mode 100644 index 00000000000..cb7cb6323f5 --- /dev/null +++ b/tests/wpt/tests/css/css-multicol/column-height-001.html @@ -0,0 +1,10 @@ +<!DOCTYPE html> +<title>column-height and column-wrap, auto height</title> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-multicol-2/#ch"> +<link rel="help" href="https://drafts.csswg.org/css-multicol-2/#cwr"> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht"> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div style="columns:2; column-fill:auto; width:100px; gap:0; column-height:50px; column-wrap:wrap; background:red;"> + <div style="height:200px; background:green;"></div> +</div> diff --git a/tests/wpt/tests/css/css-multicol/column-height-002.html b/tests/wpt/tests/css/css-multicol/column-height-002.html new file mode 100644 index 00000000000..902076a65a8 --- /dev/null +++ b/tests/wpt/tests/css/css-multicol/column-height-002.html @@ -0,0 +1,12 @@ +<!DOCTYPE html> +<title>column-height and column-wrap, with gaps, auto height</title> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-multicol-2/#ch"> +<link rel="help" href="https://drafts.csswg.org/css-multicol-2/#cwr"> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht"> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div style="position:relative; columns:2; column-fill:auto; width:100px; gap:10px 20px; column-height:45px; column-wrap:wrap; background:red;"> + <div style="position:absolute; left:0; top:45px; width:100%; height:10px; background:green;"></div> + <div style="position:absolute; left:40px; top:0; width:20px; height:100px; background:green;"></div> + <div style="height:180px; background:green;"></div> +</div> diff --git a/tests/wpt/tests/css/css-multicol/column-height-003.html b/tests/wpt/tests/css/css-multicol/column-height-003.html new file mode 100644 index 00000000000..879358c1803 --- /dev/null +++ b/tests/wpt/tests/css/css-multicol/column-height-003.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<title>auto column-height and column-wrap, fixed height, balanced</title> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-multicol-2/#ch"> +<link rel="help" href="https://drafts.csswg.org/css-multicol-2/#cwr"> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht"> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div style="position:relative; width:100px; height:100px; background:red;"> + <div style="columns:2; height:50px; gap:10px 0; column-wrap:wrap;"> + <div style="height:180px; background:green;"></div> + <div style="position:absolute; left:0; top:50px; width:100px; height:10px; background:green;"></div> + </div> +</div> diff --git a/tests/wpt/tests/css/css-multicol/column-height-004.html b/tests/wpt/tests/css/css-multicol/column-height-004.html new file mode 100644 index 00000000000..07107f3c369 --- /dev/null +++ b/tests/wpt/tests/css/css-multicol/column-height-004.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<title>auto column-height and column-wrap, fixed height</title> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-multicol-2/#ch"> +<link rel="help" href="https://drafts.csswg.org/css-multicol-2/#cwr"> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht"> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div style="position:relative; width:100px; height:100px; background:red;"> + <div style="columns:2; column-fill:auto; height:30px; gap:5px 0; column-wrap:wrap;"> + <div style="height:180px; background:green;"></div> + <div style="position:absolute; left:0; top:30px; width:100px; height:5px; background:green;"></div> + <div style="position:absolute; left:0; top:65px; width:100px; height:5px; background:green;"></div> + </div> +</div> diff --git a/tests/wpt/tests/css/css-multicol/column-height-005.html b/tests/wpt/tests/css/css-multicol/column-height-005.html new file mode 100644 index 00000000000..e131d62ee5d --- /dev/null +++ b/tests/wpt/tests/css/css-multicol/column-height-005.html @@ -0,0 +1,12 @@ +<!DOCTYPE html> +<title>column-height and no column-wrap</title> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-multicol-2/#ch"> +<link rel="help" href="https://drafts.csswg.org/css-multicol-2/#cwr"> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht"> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div style="width:100px; height:100px; background:red;"> + <div style="columns:2; column-fill:auto; column-height:100px; width:50px; height:400px; gap:20px 0;"> + <div style="height:400px; background:green;"></div> + </div> +</div> diff --git a/tests/wpt/tests/css/css-multicol/column-height-006.html b/tests/wpt/tests/css/css-multicol/column-height-006.html new file mode 100644 index 00000000000..773f25edd5c --- /dev/null +++ b/tests/wpt/tests/css/css-multicol/column-height-006.html @@ -0,0 +1,21 @@ +<!DOCTYPE html> +<title>column-height, column-wrap, spanner</title> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-multicol-2/#ch"> +<link rel="help" href="https://drafts.csswg.org/css-multicol-2/#cwr"> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht"> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div style="position:relative; width:100px; height:100px; background:red;"> + <div style="columns:2; column-fill:auto; column-height:10px; column-wrap:wrap; gap:10px 0;"> + <div style="background:green;"> + <div style="height:40px;"></div> + <div style="column-span:all; height:10px; background:green;"></div> + <div style="height:20px;"></div> + <div style="column-span:all; height:10px; background:green;"></div> + <div style="height:40px;"></div> + <div style="column-span:all; height:10px; background:green;"></div> + </div> + </div> + <div style="position:absolute; top:10px; left:0; width:100px; height:10px; background:green;"></div> + <div style="position:absolute; top:70px; left:0; width:100px; height:10px; background:green;"></div> +</div> diff --git a/tests/wpt/tests/css/css-multicol/column-height-007.html b/tests/wpt/tests/css/css-multicol/column-height-007.html new file mode 100644 index 00000000000..4e7308dbd12 --- /dev/null +++ b/tests/wpt/tests/css/css-multicol/column-height-007.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<title>column-height and column-wrap in inner multicol, nested multicol</title> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-multicol-2/#ch"> +<link rel="help" href="https://drafts.csswg.org/css-multicol-2/#cwr"> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht"> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div style="position:relative; width:100px; height:100px; background:red;"> + <div style="columns:2; column-fill:auto; height:100px; gap:0;"> + <div style="columns:2; column-fill:auto; column-height:60px; column-wrap:wrap; gap:10px 0;"> + <div style="height:360px; background:green;"></div> + </div> + </div> + <div style="position:absolute; top:60px; left:0; width:100px; height:10px; background:green;"></div> +</div> diff --git a/tests/wpt/tests/css/css-multicol/column-height-008.html b/tests/wpt/tests/css/css-multicol/column-height-008.html new file mode 100644 index 00000000000..f8ef2b1477f --- /dev/null +++ b/tests/wpt/tests/css/css-multicol/column-height-008.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<title>column-height and column-wrap in outer multicol, nested multicol</title> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-multicol-2/#ch"> +<link rel="help" href="https://drafts.csswg.org/css-multicol-2/#cwr"> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht"> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div style="position:relative; width:100px; height:100px; background:red;"> + <div style="columns:2; height:100px; gap:10px 0; column-height:60px; column-wrap:wrap;"> + <div style="columns:2; gap:0;"> + <div style="height:360px; background:green;"></div> + </div> + </div> + <div style="position:absolute; top:60px; left:0; width:100px; height:10px; background:green;"></div> +</div> diff --git a/tests/wpt/tests/css/css-multicol/column-height-009-ref.html b/tests/wpt/tests/css/css-multicol/column-height-009-ref.html new file mode 100644 index 00000000000..034440ebd5c --- /dev/null +++ b/tests/wpt/tests/css/css-multicol/column-height-009-ref.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<style> + .item { + display: block; + width: 50px; + height: 40px; + margin-bottom: 20px; + background: cyan; + } + .column { + float: left; + width: 100px; + } + .rule { + float: left; + width: 2px; + margin-left: 9px; + margin-right: 9px; + background: black; + } +</style> +<div style="width:340px; height:160px; line-height:20px; background:yellow;"> + <div class="column"> + <div class="item">a<br>b</div> + <div class="item">g<br>h</div> + <div class="item">m<br>n</div> + </div> + <div class="rule" style="height:160px;"></div> + <div class="column"> + <div class="item">c<br>d</div> + <div class="item">i<br>j</div> + <div class="item">o<br>p</div> + </div> + <div class="rule" style="height:100px;"></div> + <div class="column"> + <div class="item">e<br>f</div> + <div class="item">k<br>l</div> + </div> +</div> diff --git a/tests/wpt/tests/css/css-multicol/column-height-009.html b/tests/wpt/tests/css/css-multicol/column-height-009.html new file mode 100644 index 00000000000..1e08242e0f9 --- /dev/null +++ b/tests/wpt/tests/css/css-multicol/column-height-009.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<title>column-height, column-wrap, and column-rule</title> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-multicol-2/#ch"> +<link rel="help" href="https://drafts.csswg.org/css-multicol-2/#cwr"> +<link rel="match" href="column-height-009-ref.html"> +<div style="width:340px; orphans:1; widows:1; line-height:20px;"> + <div style="columns:3; gap:20px; column-rule:2px solid; column-height:40px; column-wrap:wrap; background:yellow;"> + <div style="width:50px; background:cyan;"> + a<br> + b<br> + c<br> + d<br> + e<br> + f<br> + g<br> + h<br> + i<br> + j<br> + k<br> + l<br> + m<br> + n<br> + o<br> + p<br> + </div> + </div> +</div> diff --git a/tests/wpt/tests/css/css-overflow/column-scroll-marker-focus-002.html b/tests/wpt/tests/css/css-overflow/column-scroll-marker-focus-002.html new file mode 100644 index 00000000000..cd26b8aca85 --- /dev/null +++ b/tests/wpt/tests/css/css-overflow/column-scroll-marker-focus-002.html @@ -0,0 +1,139 @@ +<!DOCTYPE html> +<title>Tab focus and ::colum::scroll-marker, wrapped column rows</title> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-overflow-5/#scroll-marker-next-focus"> +<style> + body { + margin: 0; + } + #container { + scroll-marker-group: before; + overflow: hidden; + columns: 3; + column-wrap: wrap; + column-height: 100px; + column-fill: auto; + column-rule: solid; + height: 150px; + line-height: 20px; + } + #container::scroll-marker-group { + display: flex; + height: 20px; + background: hotpink; + } + #container::column::scroll-marker { + content: ""; + width: 20px; + height: 20px; + margin-right: 5px; + background: blue; + } + #container::column::scroll-marker:focus { + background: cyan; + } +</style> +<div id="container"> + <!-- Column #0 --> + <div tabindex="0" id="c0" style="height:100px;">First</div> + + <!-- Column #1 --> + <div tabindex="0" id="c1first">line</div> + <div tabindex="0" id="c1second" style="height:100px; background:red;">line</div> + + <!-- Column #2 --> + + <div tabindex="0" id="inlineBlock" style="display:inline-block; box-sizing:border-box; width:100%; height:70px; border:solid;"></div> + + <!-- Column #3 --> + <div> + <div style="display:flex; flex-flow:wrap row-reverse;"> + <div tabindex="0" id="flex1" style="width:30%; height:100px;">A</div> + <div tabindex="0" id="flex2" style="width:30%;">B</div> + <div tabindex="0" id="flex3" style="width:30%;">C</div> + </div> + + <!-- Column #4 --> + <div tabindex="0" id="flex4" style="width:30%;">D</div> + <div tabindex="0" id="flex5" style="width:30%;">E</div> + <div tabindex="0" id="flex6" style="width:30%;">F</div> + </div> +</div> + +<div tabindex="0" id="after">after</div> + +<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> + async function activateMarker(idx) { + await new test_driver.Actions() + .pointerMove(5 + idx*25, 5) + .pointerDown() + .pointerUp() + .send(); + } + + async function focusNext() { + // https://w3c.github.io/webdriver/#keyboard-actions + const kTab = '\uE004'; + + await new test_driver.Actions() + .keyDown(kTab) + .keyUp(kTab) + .send(); + } + + promise_test(async t => { + await activateMarker(1); + await focusNext(); + assert_equals(document.activeElement, c1first); + await focusNext(); + assert_equals(document.activeElement, c1second); + await focusNext(); + assert_equals(document.activeElement, inlineBlock); + }, "Column #1"); + + promise_test(async t => { + await activateMarker(2); + await focusNext(); + assert_equals(document.activeElement, inlineBlock); + await focusNext(); + assert_equals(document.activeElement, flex1); + }, "Column #2"); + + promise_test(async t => { + await activateMarker(0); + await focusNext(); + assert_equals(document.activeElement, c0); + await focusNext(); + assert_equals(document.activeElement, c1first); + }, "Column #0"); + + promise_test(async t => { + await activateMarker(4); + await focusNext(); + assert_equals(document.activeElement, flex4); + await focusNext(); + assert_equals(document.activeElement, flex5); + await focusNext(); + assert_equals(document.activeElement, flex6); + await focusNext(); + assert_equals(document.activeElement, after); + }, "Column #4"); + + promise_test(async t => { + await activateMarker(3); + await focusNext(); + assert_equals(document.activeElement, flex1); + await focusNext(); + assert_equals(document.activeElement, flex2); + await focusNext(); + assert_equals(document.activeElement, flex3); + await focusNext(); + assert_equals(document.activeElement, flex4); + }, "Column #3"); +</script> diff --git a/tests/wpt/tests/css/css-overflow/line-clamp/line-clamp-auto-002-crash.html b/tests/wpt/tests/css/css-overflow/line-clamp/line-clamp-auto-002-crash.html new file mode 100644 index 00000000000..be5693c7045 --- /dev/null +++ b/tests/wpt/tests/css/css-overflow/line-clamp/line-clamp-auto-002-crash.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Overflow: `line-clamp: auto` box containing float after margins should not crash</title> +<link rel="author" title="Andreu Botella" href="mailto:abotella@igalia.com"> +<link rel="help" href="https://crbug.com/404288146"> +<link rel="help" href="https://drafts.csswg.org/css-overflow-4/#line-clamp"> +<style> + .parent { + line-height: 1.2em; + line-clamp: auto; + max-height: 3lh; + } + .float { + float: left; + } + .margins { + margin-block-start: 1em; + margin-block-end: 1em; + } +</style> +<div class="parent"> + <div class="margins">A</div> + <div> + <div class="float"></div> + B + </div> +</div> diff --git a/tests/wpt/tests/css/css-overflow/scroll-marker-15.html b/tests/wpt/tests/css/css-overflow/scroll-marker-15.html new file mode 100644 index 00000000000..764e56b5543 --- /dev/null +++ b/tests/wpt/tests/css/css-overflow/scroll-marker-15.html @@ -0,0 +1,62 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Test: scroll tracking for ::scroll-marker with overflow: hidden</title> +<link rel="help" href="https://drafts.csswg.org/css-overflow-5/#scroll-container-scroll"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/css-transitions/support/helper.js"></script> +<style> + #scroller { + overflow: scroll; + scroll-marker-group: before; + height: 100px; + } + + #scroller::scroll-marker-group { + border: 3px solid black; + display: flex; + width: 100px; + height: 20px; + } + + #scroller div { + width: 100px; + height: 100px; + } + + #scroller div::scroll-marker { + overflow: hidden; + content: ''; + background-color: red; + display: inline-flex; + width: 10px; + height: 10px; + border-radius: 50%; + } + + #scroller div::scroll-marker:target-current { + background-color: green; + } +</style> +<div id='scroller'> + <div></div> + <div id='target'></div> +</div> +<script> + function assertPseudoElementProperty(originatingElement, pseudoType, backgroundColor) { + const pseudoStyle = getComputedStyle(originatingElement, pseudoType); + const pseudoBackgroundColor = pseudoStyle.getPropertyValue('background-color'); + assert_equals(pseudoBackgroundColor, backgroundColor, pseudoType + + " background-color should be " + backgroundColor.toString() + + " but was " + pseudoBackgroundColor.toString()); + } + promise_test(async () => { + await waitForAnimationFrames(2); + assertPseudoElementProperty(target, "::scroll-marker", "rgb(255, 0, 0)"); + }, "::scroll-marker is not activated when its originating element is not scrolled into the view"); + promise_test(async () => { + scroller.scrollTop = 150; + await waitForAnimationFrames(2); + assertPseudoElementProperty(target, "::scroll-marker", "rgb(0, 128, 0)"); + }, "::scroll-marker is activated when its originating element is scrolled into the view"); +</script> diff --git a/tests/wpt/tests/css/css-overflow/scroll-marker-contain-001-ref.tentative.html b/tests/wpt/tests/css/css-overflow/scroll-marker-contain-001-ref.tentative.html new file mode 100644 index 00000000000..69e9167cc33 --- /dev/null +++ b/tests/wpt/tests/css/css-overflow/scroll-marker-contain-001-ref.tentative.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Overflow Test Reference: scroll-marker-contain property makes anchor elements scroll markers</title> +<style> + #scroller { + overflow: auto; + height: 130px; + width: 100px; + } + + #scroller div { + width: 100px; + height: 100px; + background-color: blue; + margin: 5px; + } + + a { + color: red; + } + + a:first-of-type { + color: green; + } +</style> +<div> + <a href="#target1">t1</a> + <a href="#target2">t2</a> + <a href="#target3">t3</a> + <a href="#target4">t4</a> +</div> +<div id="scroller"> + <div id="target1"></div> + <div id="target2"></div> + <div id="target3"></div> + <div id="target4"></div> +</div> + diff --git a/tests/wpt/tests/css/css-overflow/scroll-marker-contain-001.tentative.html b/tests/wpt/tests/css/css-overflow/scroll-marker-contain-001.tentative.html new file mode 100644 index 00000000000..93d7df72508 --- /dev/null +++ b/tests/wpt/tests/css/css-overflow/scroll-marker-contain-001.tentative.html @@ -0,0 +1,44 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Overflow Test: scroll-marker-contain property makes anchor elements scroll markers</title> +<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/10916"> +<link rel="match" href="scroll-marker-contain-001-ref.tentative.html"> +<style> + #wrapper { + scroll-marker-contain: auto; + } + + #scroller { + overflow: auto; + height: 130px; + width: 100px; + } + + #scroller div { + width: 100px; + height: 100px; + background-color: blue; + margin: 5px; + } + + a { + color: red; + } + + a:target-current { + color: green; + } +</style> +<div id="wrapper"> + <a href="#target1">t1</a> + <a href="#target2">t2</a> + <a href="#target3">t3</a> + <a href="#target4">t4</a> +</div> +<div id="scroller"> + <div id="target1"></div> + <div id="target2"></div> + <div id="target3"></div> + <div id="target4"></div> +</div> + diff --git a/tests/wpt/tests/css/css-overflow/scroll-marker-contain-002-ref.tentative.html b/tests/wpt/tests/css/css-overflow/scroll-marker-contain-002-ref.tentative.html new file mode 100644 index 00000000000..3fa777f7863 --- /dev/null +++ b/tests/wpt/tests/css/css-overflow/scroll-marker-contain-002-ref.tentative.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Overflow Test Reference: scroll-marker-contain property makes anchor elements scroll markers and does scroll tracking</title> +<style> + #scroller { + overflow: auto; + height: 130px; + width: 100px; + } + + #scroller div { + width: 100px; + height: 100px; + background-color: blue; + margin: 5px; + } + + a { + color: red; + } + + a:last-of-type { + color: green; + } +</style> +<div> + <a href="#target1">t1</a> + <a href="#target2">t2</a> + <a href="#target3">t3</a> + <a href="#target4">t4</a> +</div> +<div id="scroller"> + <div id="target1"></div> + <div id="target2"></div> + <div id="target3"></div> + <div id="target4"></div> +</div> +<script> + scroller.scrollTop = 400; +</script> + diff --git a/tests/wpt/tests/css/css-overflow/scroll-marker-contain-002.tentative.html b/tests/wpt/tests/css/css-overflow/scroll-marker-contain-002.tentative.html new file mode 100644 index 00000000000..af2a5e668be --- /dev/null +++ b/tests/wpt/tests/css/css-overflow/scroll-marker-contain-002.tentative.html @@ -0,0 +1,48 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Overflow Test: scroll-marker-contain property makes anchor elements scroll markers and does scroll tracking</title> +<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/10916"> +<link rel="match" href="scroll-marker-contain-002-ref.tentative.html"> +<style> + #wrapper { + scroll-marker-contain: auto; + } + + #scroller { + overflow: auto; + height: 130px; + width: 100px; + } + + #scroller div { + width: 100px; + height: 100px; + background-color: blue; + margin: 5px; + } + + a { + color: red; + } + + a:target-current { + color: green; + } +</style> +<div id="wrapper"> + <a href="#target1">t1</a> + <a href="#target2">t2</a> + <a href="#target3">t3</a> + <a id="link4" href="#target4">t4</a> +</div> +<div id="scroller"> + <div id="target1"></div> + <div id="target2"></div> + <div id="target3"></div> + <div id="target4"></div> +</div> +<script> + scroller.scrollTop = 400; + assert_equals(getComputedStyle(link4).color, "rgb(0, 128, 0)", "link4 should be :target-current"); +</script> + diff --git a/tests/wpt/tests/css/css-overflow/scroll-marker-contain-003-ref.tentative.html b/tests/wpt/tests/css/css-overflow/scroll-marker-contain-003-ref.tentative.html new file mode 100644 index 00000000000..09bb93d4ebc --- /dev/null +++ b/tests/wpt/tests/css/css-overflow/scroll-marker-contain-003-ref.tentative.html @@ -0,0 +1,49 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Overflow Test Reference: anchor scroll markers and pseudo element scroll markers</title> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> +<style> + :root { + font-family: "Ahem"; + } + + #scroller { + overflow: auto; + height: 130px; + width: 100px; + } + + #scroller div { + width: 100px; + height: 100px; + background-color: blue; + margin: 5px; + } + + a { + color: red; + } + + a:last-of-type { + color: green; + } +</style> +<div> + <a href="#target1">t1</a> + <a href="#target2">t2</a> + <a href="#target3">t3</a> + <a href="#target4">t4</a> +</div> +<div id="scroller"> + <div id="target1"></div> + <div id="target2"></div> + <div id="target3"></div> + <div id="target4"></div> +</div> +<div> + <a href="#target1">t1</a><a href="#target2">t2</a><a href="#target3">t3</a><a href="#target4">t4</a> +</div> +<script> + scroller.scrollTop = 400; +</script> + diff --git a/tests/wpt/tests/css/css-overflow/scroll-marker-contain-003.tentative.html b/tests/wpt/tests/css/css-overflow/scroll-marker-contain-003.tentative.html new file mode 100644 index 00000000000..59daa5cf5ce --- /dev/null +++ b/tests/wpt/tests/css/css-overflow/scroll-marker-contain-003.tentative.html @@ -0,0 +1,66 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Overflow Test: anchor scroll markers and pseudo element scroll markers</title> +<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/10916"> +<link rel="help" href="https://drafts.csswg.org/css-overflow-5/#scroll-marker"> +<link rel="match" href="scroll-marker-contain-003-ref.tentative.html"> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> +<style> + :root { + font-family: "Ahem"; + } + + #wrapper { + scroll-marker-contain: auto; + } + + #scroller { + overflow: auto; + height: 130px; + width: 100px; + scroll-marker-group: after; + counter-reset: t; + } + + #scroller div { + width: 100px; + height: 100px; + background-color: blue; + margin: 5px; + counter-increment: t; + } + + #scroller div::scroll-marker { + content: "t" counter(t); + color: red; + } + + #scroller div::scroll-marker:target-current { + color: green; + } + + a { + color: red; + } + + a:target-current { + color: green; + } +</style> +<div id="wrapper"> + <a href="#target1">t1</a> + <a href="#target2">t2</a> + <a href="#target3">t3</a> + <a id="link4" href="#target4">t4</a> +</div> +<div id="scroller"> + <div id="target1"></div> + <div id="target2"></div> + <div id="target3"></div> + <div id="target4"></div> +</div> +<script> + scroller.scrollTop = 400; + assert_equals(getComputedStyle(link4).color, "rgb(0, 128, 0)", "link4 should be :target-current"); +</script> + diff --git a/tests/wpt/tests/css/css-overflow/scroll-marker-contain-004.tentative.html b/tests/wpt/tests/css/css-overflow/scroll-marker-contain-004.tentative.html new file mode 100644 index 00000000000..2ec6f6bde76 --- /dev/null +++ b/tests/wpt/tests/css/css-overflow/scroll-marker-contain-004.tentative.html @@ -0,0 +1,47 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Overflow Test: scroll-marker-contain property makes anchor elements scroll markers inside size containers</title> +<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/10916"> +<link rel="match" href="scroll-marker-contain-001-ref.tentative.html"> +<style> + html { + container: my-container / size; + } + + #wrapper { + scroll-marker-contain: auto; + } + + #scroller { + overflow: auto; + height: 130px; + width: 100px; + } + + #scroller div { + width: 100px; + height: 100px; + background-color: blue; + margin: 5px; + } + + a { + color: red; + } + + a:target-current { + color: green; + } +</style> +<div id="wrapper"> + <a href="#target1">t1</a> + <a href="#target2">t2</a> + <a href="#target3">t3</a> + <a href="#target4">t4</a> +</div> +<div id="scroller"> + <div id="target1"></div> + <div id="target2"></div> + <div id="target3"></div> + <div id="target4"></div> +</div> 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 18c172b40a1..a116ead01b7 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 @@ -29,7 +29,8 @@ promise_test(async function() { assert_not_equals(originalScrollPos, 0, "Should have scrolled to get the iframe into view"); await new test_driver.Actions() - .scroll(bounds.left + bounds.width / 2, bounds.top + bounds.height / 2, 0, -100) + .scroll(Math.round(bounds.left + bounds.width / 2), + Math.round(bounds.top + bounds.height / 2), 0, -100) .send(); assert_equals(window.scrollY, originalScrollPos, "overscroll-behavior should work on the root"); diff --git a/tests/wpt/tests/css/css-position/sticky/position-sticky-table-pixel-rounding-ref.html b/tests/wpt/tests/css/css-position/sticky/position-sticky-table-pixel-rounding-ref.html new file mode 100644 index 00000000000..83313e0ad10 --- /dev/null +++ b/tests/wpt/tests/css/css-position/sticky/position-sticky-table-pixel-rounding-ref.html @@ -0,0 +1,23 @@ +<!DOCTYPE html> + <style> + table { + border-spacing: 0; + } + td { + padding: 0px 9.6px; + background-color: #fff; + } + .sticky { + position: sticky; + left: 0px; + background-color: #c3c3c3; + } + </style> + <table> + <tr> + <td class="sticky" style="width: 64px"></td> + <td class="sticky" style="width: 10px"></td> + <td class="sticky">Content</td> + </tr> + </table> + diff --git a/tests/wpt/tests/css/css-position/sticky/position-sticky-table-pixel-rounding.html b/tests/wpt/tests/css/css-position/sticky/position-sticky-table-pixel-rounding.html new file mode 100644 index 00000000000..3bda20efc9d --- /dev/null +++ b/tests/wpt/tests/css/css-position/sticky/position-sticky-table-pixel-rounding.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> + <link rel="help" href="https://www.w3.org/TR/css-position-3/#sticky-pos" /> + <link rel="match" href="position-sticky-table-pixel-rounding-ref.html" /> + <link rel="author" title="Chris Harrelson" href="mailto:chrishtr@chromium.org" /> + <meta name="assert" content="Passes if there is no gap between the second and third column"> + <style> + table { + border-spacing: 0; + } + td { + padding: 0px 9.6px; + background-color: #fff; + } + .sticky { + position: sticky; + left: 0px; + background-color: #c3c3c3; + } + </style> + <table> + <tr> + <td class="sticky" style="width: 64.138px"></td> + <td class="sticky" style="width: 10px"></td> + <td class="sticky">Content</td> + </tr> + </table> + diff --git a/tests/wpt/tests/css/css-pseudo/focus-visible-originating-element.html b/tests/wpt/tests/css/css-pseudo/focus-visible-originating-element.html new file mode 100644 index 00000000000..05fc8232491 --- /dev/null +++ b/tests/wpt/tests/css/css-pseudo/focus-visible-originating-element.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Test: ::before matches when originating element has :focus-visible selector</title> +<link rel="help" href="https://drafts.csswg.org/css-pseudo/#generated-content"> +<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> + input { + outline: none; + + &:not(:disabled):focus-visible::before { + background-color: green; + } + } + + input::before { + content: ""; + background-color: red; + display: inline-block; + height: 50px; + width: 50px; + } +</style> +<input type="checkbox" id="target"/> +<script> + promise_test(async t => { + const kTab = '\uE004'; + await new test_driver.Actions() + .keyDown(kTab) + .keyUp(kTab) + .send(); + assert_equals(getComputedStyle(target, "::before").backgroundColor, "rgb(0, 128, 0)"); + }); +</script> diff --git a/tests/wpt/tests/css/css-scoping/host-has-internal-004.html b/tests/wpt/tests/css/css-scoping/host-has-internal-004.html new file mode 100644 index 00000000000..fe51186f59f --- /dev/null +++ b/tests/wpt/tests/css/css-scoping/host-has-internal-004.html @@ -0,0 +1,22 @@ +<!doctype html> +<meta charset="utf-8"> +<title>:has(...):host internal descendent</title> +<link rel="help" href="https://drafts.csswg.org/css-scoping/#host-selector"> +<link rel="match" href="/css/reference/ref-filled-green-100px-square-only.html"> +<p>Test passes if there is a filled green square.</p> +<div id="host"> + <template shadowrootmode="open"> + <style> + div { + width: 100px; + height: 100px; + background-color: red; + } + :has(section):host div { + background-color: green; + } + </style> + <span><div></div></span> + <section></section> + </template> +</div> diff --git a/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/resnap-on-oveflow-hidden-container.html b/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/resnap-on-oveflow-hidden-container.html new file mode 100644 index 00000000000..41e454b2789 --- /dev/null +++ b/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/resnap-on-oveflow-hidden-container.html @@ -0,0 +1,63 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-scroll-snap/#re-snap" /> +<meta name="viewport" content="width=device-width,initial-scale=1"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1946375"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<style> +#scroller { + display: flex; + overflow-x: hidden; + scroll-snap-align: start; + scroll-snap-type: x mandatory; + width: 500px; + height: 200px; + position: absolute; +} +.child { + display: flex; + flex: 0 0 500px; + scroll-snap-align: start; + width: 500px; + height: 100%; + align-items: center; + justify-content: center; + font-size: 30px; +} +</style> +<div id="scroller"> + <div class="child" style="background-color: blue;">1</div> + <div class="child" style="background-color: green;">2</div> + <div class="child" style="background-color: yellow;">3</div> +</div> +<script> +promise_test(async () => { + assert_equals(scroller.scrollLeft, 0, "The initial scroll position"); + + const scrollPromise = new Promise(resolve => { + scroller.addEventListener("scroll", resolve); + }); + // Do an async scroll operation to the second child. + scroller.scrollTo({ left: 500, behavior: "smooth" }); + + // Wait a scroll event. + await scrollPromise; + + // Assuming that the current scroll position is not yet the scroll + // destination, i.e. during the async scroll is runnig try to do + // a new async scroll operation to the third child. + const scrollendPromise = new Promise(resolve => { + scroller.addEventListener("scrollend", resolve); + }); + scroller.scrollTo({ left: 1000, behavior: "smooth" }); + await scrollendPromise; + + assert_equals(scroller.scrollLeft, 1000, + "Now the scroll position should be 1000px"); + + // Change a child element width so that re-snapping will happen. + document.querySelectorAll(".child")[0].style.width = "501px"; + + assert_equals(scroller.scrollLeft, 1000, "The scroll position should stay"); +}); +</script> diff --git a/tests/wpt/tests/css/css-sizing/aspect-ratio/replaced-element-013.html b/tests/wpt/tests/css/css-sizing/aspect-ratio/replaced-element-013.html index bcbf653d68a..564858e360e 100644 --- a/tests/wpt/tests/css/css-sizing/aspect-ratio/replaced-element-013.html +++ b/tests/wpt/tests/css/css-sizing/aspect-ratio/replaced-element-013.html @@ -2,11 +2,11 @@ <title>CSS aspect-ratio: img</title> <link rel="author" title="Google LLC" href="https://www.google.com/"> <link rel="help" href="https://drafts.csswg.org/css-sizing-4/#aspect-ratio"> +<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/11236"> <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" /> <p>Test passes if there is a filled green square and <strong>no red</strong>.</p> -<!-- Replaced elements should always use content-box sizing for the purpose of - aspect ratio. --> -<img src="support/20x50-green.png" style="aspect-ratio: 20/50; background: green; padding-right: 80px; padding-bottom: 50px; box-sizing: border-box;"> +<!-- When coercing the natural-size and aspect-ratio to be consistent, it should use the correct box-sizing. --> +<img src="support/20x50-green.png" style="aspect-ratio: 1; background: green; padding-right: 80px; padding-bottom: 50px; box-sizing: border-box;"> diff --git a/tests/wpt/tests/css/css-sizing/aspect-ratio/replaced-element-014.html b/tests/wpt/tests/css/css-sizing/aspect-ratio/replaced-element-014.html index 4c1ad16ce86..8b7bdafc107 100644 --- a/tests/wpt/tests/css/css-sizing/aspect-ratio/replaced-element-014.html +++ b/tests/wpt/tests/css/css-sizing/aspect-ratio/replaced-element-014.html @@ -2,11 +2,11 @@ <title>CSS aspect-ratio: img</title> <link rel="author" title="Google LLC" href="https://www.google.com/"> <link rel="help" href="https://drafts.csswg.org/css-sizing-4/#aspect-ratio"> +<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/11236"> <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" /> <p>Test passes if there is a filled green square and <strong>no red</strong>.</p> -<!-- Replaced elements should always use content-box sizing for the purpose of - aspect ratio. --> -<img src="support/20x50-green.png" style="aspect-ratio: 20/50; background: green; padding-right: 80px; padding-bottom: 50px; box-sizing: border-box; max-height: 100px;"> +<!-- When coercing the natural-size and aspect-ratio to be consistent, it should use the correct box-sizing. --> +<img src="support/20x50-green.png" style="aspect-ratio: 1; background: green; padding-right: 80px; padding-bottom: 50px; box-sizing: border-box; max-height: 100px;"> diff --git a/tests/wpt/tests/css/css-sizing/aspect-ratio/replaced-element-045.html b/tests/wpt/tests/css/css-sizing/aspect-ratio/replaced-element-045.html new file mode 100644 index 00000000000..3339de4cb7d --- /dev/null +++ b/tests/wpt/tests/css/css-sizing/aspect-ratio/replaced-element-045.html @@ -0,0 +1,10 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-sizing-4/#aspect-ratio"> +<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/11236"> +<link rel="match" href="../../reference/ref-filled-green-100px-square.xht" /> + +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> + +<!-- The coerced natural-size should be 40px by 40px. --> +<canvas width="40" height="10" style="aspect-ratio: 1; background: green; padding-right: 60px; padding-bottom: 60px; box-sizing: border-box;"> + diff --git a/tests/wpt/tests/css/css-sizing/aspect-ratio/replaced-element-046.html b/tests/wpt/tests/css/css-sizing/aspect-ratio/replaced-element-046.html new file mode 100644 index 00000000000..13a9fd99513 --- /dev/null +++ b/tests/wpt/tests/css/css-sizing/aspect-ratio/replaced-element-046.html @@ -0,0 +1,10 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-sizing-4/#aspect-ratio"> +<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/11236"> +<link rel="match" href="../../reference/ref-filled-green-100px-square.xht" /> + +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> + +<!-- The coerced natural-size should be 10px by 10px. --> +<canvas width="10" height="40" style="aspect-ratio: 1; background: green; padding-right: 90px; padding-bottom: 90px; box-sizing: border-box; max-height: 110px;"> + diff --git a/tests/wpt/tests/css/css-sizing/contain-intrinsic-size/contain-intrinsic-size-028.html b/tests/wpt/tests/css/css-sizing/contain-intrinsic-size/contain-intrinsic-size-028.html index 15e8e0e8910..da31a1efead 100644 --- a/tests/wpt/tests/css/css-sizing/contain-intrinsic-size/contain-intrinsic-size-028.html +++ b/tests/wpt/tests/css/css-sizing/contain-intrinsic-size/contain-intrinsic-size-028.html @@ -31,6 +31,9 @@ .vertical { writing-mode: vertical-lr; } +canvas { + aspect-ratio: auto; +} </style> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> diff --git a/tests/wpt/tests/css/css-sizing/contain-intrinsic-size/contain-intrinsic-size-logical-003.html b/tests/wpt/tests/css/css-sizing/contain-intrinsic-size/contain-intrinsic-size-logical-003.html index 48fedb11483..9ee60268d60 100644 --- a/tests/wpt/tests/css/css-sizing/contain-intrinsic-size/contain-intrinsic-size-logical-003.html +++ b/tests/wpt/tests/css/css-sizing/contain-intrinsic-size/contain-intrinsic-size-logical-003.html @@ -35,6 +35,9 @@ .vertical { writing-mode: vertical-lr; } +canvas { + aspect-ratio: auto; +} </style> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> diff --git a/tests/wpt/tests/css/css-text/white-space/text-wrap-balance-before-after-001.html b/tests/wpt/tests/css/css-text/white-space/text-wrap-balance-before-after-001.html index 9f5741e2349..7176768b8df 100644 --- a/tests/wpt/tests/css/css-text/white-space/text-wrap-balance-before-after-001.html +++ b/tests/wpt/tests/css/css-text/white-space/text-wrap-balance-before-after-001.html @@ -1,5 +1,5 @@ <!DOCTYPE html> -<link rel="help" href="https://drafts.csswg.org/css-text-4/#valdef-text-wrap-balance"> +<link rel="help" href="https://drafts.csswg.org/css-text-4/#valdef-text-wrap-style-balance"> <link rel="match" href="reference/text-wrap-balance-before-after-001-ref.html"> <style> .container { diff --git a/tests/wpt/tests/css/css-text/white-space/text-wrap-balance-before-after-002.html b/tests/wpt/tests/css/css-text/white-space/text-wrap-balance-before-after-002.html index e9d08953fac..60e3a777df3 100644 --- a/tests/wpt/tests/css/css-text/white-space/text-wrap-balance-before-after-002.html +++ b/tests/wpt/tests/css/css-text/white-space/text-wrap-balance-before-after-002.html @@ -1,5 +1,5 @@ <!DOCTYPE html> -<link rel="help" href="https://drafts.csswg.org/css-text-4/#valdef-text-wrap-balance"> +<link rel="help" href="https://drafts.csswg.org/css-text-4/#valdef-text-wrap-style-balance"> <link rel="match" href="reference/text-wrap-balance-before-after-002-ref.html"> <style> .container { diff --git a/tests/wpt/tests/css/css-transitions/support/properties.js b/tests/wpt/tests/css/css-transitions/support/properties.js index 81cf9d46d5f..e4502083890 100644 --- a/tests/wpt/tests/css/css-transitions/support/properties.js +++ b/tests/wpt/tests/css/css-transitions/support/properties.js @@ -265,6 +265,7 @@ var unspecified_properties = { 'column-rule-color': ['color'], 'column-rule-width': ['length'], 'column-width': ['length'], + 'column-height': ['length'], 'transform': ['transform'], 'transform-origin': ['horizontal'], 'display': ['display'], diff --git a/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/inline/append.tentative.html b/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/inline/append.tentative.html index f8087562236..fa23071c4f2 100644 --- a/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/inline/append.tentative.html +++ b/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/inline/append.tentative.html @@ -19,6 +19,7 @@ const gInvalidTestCases = [ { property: 'transition-duration', values: [CSS.s(1), '10px', CSS.px(10)], desc: 'a mix of valid and invalid values' }, { property: 'transition-duration', values: [new CSSUnparsedValue([])], desc: 'a CSSUnparsedValue' }, { property: 'transition-duration', values: ['var(--A)'], desc: 'a var ref' }, + { property: 'background-size', values: [document.getElementsByTagName('title')[0].computedStyleMap().get('mask-position')], desc: 'a CSSVariableReferenceValue property' }, ]; for (const {property, values, desc} of gInvalidTestCases) { diff --git a/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/column-height.html b/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/column-height.html new file mode 100644 index 00000000000..f9986221f48 --- /dev/null +++ b/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/column-height.html @@ -0,0 +1,24 @@ +<!doctype html> +<meta charset="utf-8"> +<title>'column-height' property</title> +<link rel="help" href="https://drafts.css-houdini.org/css-typed-om/#dom-stylepropertymapreadonly-get"> +<link rel="help" href="https://drafts.css-houdini.org/css-typed-om/#dom-stylepropertymap-set"> +<link rel="help" href="https://drafts.css-houdini.org/css-typed-om/#reify-stylevalue"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="../../resources/testhelper.js"></script> +<script src="resources/testsuite.js"></script> +<body> +<div id="log"></div> +<script> +'use strict'; + +runPropertyTests('column-height', [ + { syntax: 'auto' }, + { + syntax: '<length>', + specified: assert_is_equal_with_range_handling + }, +]); + +</script> diff --git a/tests/wpt/tests/css/css-ui/cursor-calc-hotspot.html b/tests/wpt/tests/css/css-ui/cursor-calc-hotspot.html new file mode 100644 index 00000000000..84f9ca35b79 --- /dev/null +++ b/tests/wpt/tests/css/css-ui/cursor-calc-hotspot.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<title>CSS UI Test: Allow complex calc expressions in cursor hotspot</title> +<link rel="help" href="https://drafts.csswg.org/css-ui/#cursor"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<style> + #t1 { + font-size: 20px; + cursor: url(cur.ico) calc(7 * sign(1em - 18px)) 0, auto; + } + #t2 { + cursor: url(cur.ico) calc(4 * sibling-index()) 0, auto; + } +</style> +<div> + <div id="t1"></div> + <div id="t2"></div> +</div> +<script> + test(() => { + assert_equals(getComputedStyle(t1).cursor, "url(cur.ico) 7 0, auto"); + }, "cursor hotspot with sign() depending on font relative units"); + + test(() => { + assert_equals(getComputedStyle(t2).cursor, "url(cur.ico) 8 0, auto"); + }, "cursor hotspot depending on sibling-index()"); +</script> diff --git a/tests/wpt/tests/css/css-values/calc-complex-unresolved-serialize.html b/tests/wpt/tests/css/css-values/calc-complex-unresolved-serialize.html new file mode 100644 index 00000000000..64bccd216ab --- /dev/null +++ b/tests/wpt/tests/css/css-values/calc-complex-unresolved-serialize.html @@ -0,0 +1,26 @@ +<!DOCTYPE html> +<title>CSS Values and Units Test: Serialization of non-simplified calc() expressions</title> +<link rel="help" href="https://drafts.csswg.org/css-values-4/#calc-simplification"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="../support/serialize-testcommon.js"></script> +<style> + #target { font-size: 20px; } +</style> +<div> + <div id="target"></div> +</div> +<script> + function test_serialization(value, specified, computed) { + test_specified_serialization("orphans", value, specified); + test_computed_serialization("orphans", value, computed); + } + + test_serialization("calc(pow(2, sign(1em - 18px)))", "calc(pow(2, sign(1em - 18px)))", "2"); + test_serialization("calc(pow(sign(1em - 18px), 2))", "calc(pow(sign(1em - 18px), 2))", "1"); + test_serialization("calc(pow(sign(1em - 18px), sign(1em - 18px)))", "calc(pow(sign(1em - 18px), sign(1em - 18px)))", "1"); + + test_serialization("calc(pow(2, sibling-index())", "calc(pow(2, sibling-index()))", "2"); + test_serialization("calc(pow(sibling-index(), 2)", "calc(pow(sibling-index(), 2))", "1"); + test_serialization("calc(pow(sibling-index(), sibling-index())", "calc(pow(sibling-index(), sibling-index()))", "1"); +</script> diff --git a/tests/wpt/tests/css/css-values/hypot-pow-sqrt-invalid.html b/tests/wpt/tests/css/css-values/hypot-pow-sqrt-invalid.html index edecfceb13a..3e298895883 100644 --- a/tests/wpt/tests/css/css-values/hypot-pow-sqrt-invalid.html +++ b/tests/wpt/tests/css/css-values/hypot-pow-sqrt-invalid.html @@ -49,6 +49,8 @@ test_invalid_number('pow(1 * )'); test_invalid_number('pow(1 / )'); test_invalid_number('pow(1 2)'); test_invalid_number('pow(1, , 2)'); +test_invalid_number('pow(2px, 2)'); +test_invalid_number('pow(10, 1px)'); // General tests test_invalid_length('calc(1px * pow(1))'); @@ -64,4 +66,5 @@ test_invalid_length('pow())'); test_invalid_length('pow(1, 2)'); test_invalid_length('calc(sqrt())'); test_invalid_length('calc(sqrt(100, 200))'); +test_invalid_length('pow(10px, 1)'); </script> diff --git a/tests/wpt/tests/css/css-view-transitions/navigation/pageswap-in-hidden-doc-should-skip-transition.html b/tests/wpt/tests/css/css-view-transitions/navigation/pageswap-in-hidden-doc-should-skip-transition.html index aceced0dded..2fddb7e17a4 100644 --- a/tests/wpt/tests/css/css-view-transitions/navigation/pageswap-in-hidden-doc-should-skip-transition.html +++ b/tests/wpt/tests/css/css-view-transitions/navigation/pageswap-in-hidden-doc-should-skip-transition.html @@ -9,7 +9,14 @@ promise_test(async t => { let popup; onload = () => { + // Need to restore this browser window once after the window got minimized. + window.set_original_window_rect = rect => { + t.add_cleanup(async () => { + await test_driver.set_window_rect(rect); + }); + }; popup = window.open("resources/navigate-after-hide.html"); + t.add_cleanup(() => popup.close()); }; diff --git a/tests/wpt/tests/css/css-view-transitions/navigation/resources/navigate-after-hide.html b/tests/wpt/tests/css/css-view-transitions/navigation/resources/navigate-after-hide.html index 0b6a3d669e8..9bed19eda2a 100644 --- a/tests/wpt/tests/css/css-view-transitions/navigation/resources/navigate-after-hide.html +++ b/tests/wpt/tests/css/css-view-transitions/navigation/resources/navigate-after-hide.html @@ -4,7 +4,8 @@ <script> onload = async () => { test_driver.set_test_context(window.opener); - await test_driver.minimize_window(); + const original_rect = await test_driver.minimize_window(); + window.opener.set_original_window_rect(original_rect); if (document.visibilityState !== "hidden" || !document.hidden) { window.opener.popup_error("popup isn't hidden"); } else { diff --git a/tests/wpt/tests/css/css-view-transitions/nested/nested-root-capture-with-clip-ref.html b/tests/wpt/tests/css/css-view-transitions/nested/nested-root-capture-with-clip-ref.html new file mode 100644 index 00000000000..0e2c7d02543 --- /dev/null +++ b/tests/wpt/tests/css/css-view-transitions/nested/nested-root-capture-with-clip-ref.html @@ -0,0 +1,26 @@ +<!DOCTYPE html> +<html> +<title>Nested View Transitions root capture with border radius (ref)</title> +<link rel="help" href="https://drafts.csswg.org/css-view-transitions-2/"> +<link rel="author" href="mailto:vmpstr@chromium.org"> + +<style> +#clipper { + overflow: clip; + height: 200px; + width: 100px; + border-radius: 50%; + background: rebeccapurple; +} + +#i0 { + background: pink; + margin-bottom: 10px; + height: 20px; +} +</style> + +<div id=clipper> + <div id=i0 class=item></div> +</div> +</html> diff --git a/tests/wpt/tests/css/css-view-transitions/nested/nested-root-capture-with-clip.html b/tests/wpt/tests/css/css-view-transitions/nested/nested-root-capture-with-clip.html new file mode 100644 index 00000000000..eb728182865 --- /dev/null +++ b/tests/wpt/tests/css/css-view-transitions/nested/nested-root-capture-with-clip.html @@ -0,0 +1,67 @@ +<!DOCTYPE html> +<html class=reftest-wait> +<title>Nested View Transitions root capture with border radius</title> +<link rel="help" href="https://drafts.csswg.org/css-view-transitions-2/"> +<link rel="author" href="mailto:vmpstr@chromium.org"> +<link rel="match" href="nested-root-capture-with-clip-ref.html"> +<meta name=fuzzy content="maxDifference=0-40; totalPixels=0-400"> +<script src="/common/reftest-wait.js"></script> +<script src="/dom/events/scrolling/scroll_support.js"></script> + +<style> +:root { view-transition-name: none } +#clipper { + view-transition-group: contain; + view-transition-name: clipper; + overflow: clip; + height: 200px; + width: 100px; + border-radius: 50%; + background: rebeccapurple; +} + +.item { + view-transition-name: match-element; + view-transition-class: item; + background: pink; + margin-bottom: 10px; + height: 20px; +} +#i0 { + view-transition-name: none; + will-change: transform; +} +::view-transition-group(clipper) { + animation-play-state: pause; +} +::view-transition-new(clipper) { + animation: unset; + opacity: 0; +} +::view-transition-old(clipper) { + animation: unset; + opacity: 1; +} +::view-transition-group(*.item) { + display: none; +} +</style> + +<div id=clipper> + <div id=i0 class=item></div> + <div id=i1 class=item></div> + <div id=i2 class=item></div> + <div id=i3 class=item></div> +</div> + +<script> +function runTest() { + document.startViewTransition().ready.then(takeScreenshot); +} + +onload = async () => { + await waitForCompositorReady(); + runTest(); +} +</script> +</html> diff --git a/tests/wpt/tests/css/css-viewport/zoom/font-size-keyword-specified-ref.html b/tests/wpt/tests/css/css-viewport/zoom/font-size-keyword-specified-ref.html new file mode 100644 index 00000000000..3395465c5d5 --- /dev/null +++ b/tests/wpt/tests/css/css-viewport/zoom/font-size-keyword-specified-ref.html @@ -0,0 +1,5 @@ +<!DOCTYPE html> +<title>CSS zoom applies to font-size when specified by keywords</title> +<div style="font-size: medium"> + <div style="zoom: 2">This is some zoomed medium text</div> +</div> diff --git a/tests/wpt/tests/css/css-viewport/zoom/font-size-keyword-specified.html b/tests/wpt/tests/css/css-viewport/zoom/font-size-keyword-specified.html new file mode 100644 index 00000000000..fc724307f46 --- /dev/null +++ b/tests/wpt/tests/css/css-viewport/zoom/font-size-keyword-specified.html @@ -0,0 +1,7 @@ +<!DOCTYPE html> +<title>CSS zoom applies to font-size when specified by keywords</title> +<link rel="help" href="https://drafts.csswg.org/css-viewport/"> +<link rel="match" href="font-size-keyword-specified-ref.html"> +<div style="zoom: 2"> + <div style="font-size: medium">This is some zoomed medium text</div> +</div> diff --git a/tests/wpt/tests/css/css-viewport/zoom/zoom-revert-layer-crash.html b/tests/wpt/tests/css/css-viewport/zoom/zoom-revert-layer-crash.html new file mode 100644 index 00000000000..c75b792e6de --- /dev/null +++ b/tests/wpt/tests/css/css-viewport/zoom/zoom-revert-layer-crash.html @@ -0,0 +1,4 @@ +<!DOCTYPE html> +<title>Don't crash when zooming revert-layer</title> +<link rel="help" href="https://issues.chromium.org/issues/398060133"> +<span style="zoom: 101%; line-height: revert-layer">PASS if no crash</span> diff --git a/tests/wpt/tests/css/css-writing-modes/wm-propagation-body-044-ref.html b/tests/wpt/tests/css/css-writing-modes/wm-propagation-body-044-ref.html index 9cf46c0b214..f61f97c9a1d 100644 --- a/tests/wpt/tests/css/css-writing-modes/wm-propagation-body-044-ref.html +++ b/tests/wpt/tests/css/css-writing-modes/wm-propagation-body-044-ref.html @@ -7,7 +7,10 @@ <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/"> <style> - + body + { + margin-bottom: 0; + } img#orange-square { padding-right: 16px; diff --git a/tests/wpt/tests/css/cssom-view/support/action-utils.js b/tests/wpt/tests/css/cssom-view/support/action-utils.js new file mode 100644 index 00000000000..c3ab5272da6 --- /dev/null +++ b/tests/wpt/tests/css/cssom-view/support/action-utils.js @@ -0,0 +1,23 @@ +async function pinch_zoom_action(targetWindow = window) { + // Pinch zoom in this document. + await new test_driver.Actions() + .addPointer("finger1", "touch") + .addPointer("finger2", "touch") + .pointerMove(parseInt(targetWindow.innerWidth / 2), + parseInt(targetWindow.innerHeight / 2), + {origin: "viewport", sourceName: "finger1"}) + .pointerMove(parseInt(targetWindow.innerWidth / 2), + parseInt(targetWindow.innerHeight / 2), + {origin: "viewport", sourceName: "finger2"}) + .pointerDown({sourceName: "finger1"}) + .pointerDown({sourceName: "finger2"}) + .pointerMove(parseInt(targetWindow.innerWidth / 3), + parseInt(targetWindow.innerHeight / 3), + {origin: "viewport", sourceName: "finger1"}) + .pointerMove(parseInt(targetWindow.innerWidth / 3 * 2), + parseInt(targetWindow.innerHeight / 3 * 2), + {origin: "viewport", sourceName: "finger2"}) + .pointerUp({sourceName: "finger1"}) + .pointerUp({sourceName: "finger2"}) + .send(); +} diff --git a/tests/wpt/tests/css/cssom-view/visual-scrollIntoView.html b/tests/wpt/tests/css/cssom-view/visual-scrollIntoView-001.html index 78a3203c585..825556be969 100644 --- a/tests/wpt/tests/css/cssom-view/visual-scrollIntoView.html +++ b/tests/wpt/tests/css/cssom-view/visual-scrollIntoView-001.html @@ -6,6 +6,7 @@ <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-actions.js"></script> <script src="/resources/testdriver-vendor.js"></script> +<script src="support/action-utils.js"></script> <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1943865"> <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1943053"> <link rel="help" href="https://drafts.csswg.org/cssom-view/#perform-a-scroll"> @@ -28,26 +29,7 @@ promise_test(async t => { assert_equals(visualViewport.pageTop, 0); // Pinch zoom in this document. - await new test_driver.Actions() - .addPointer("finger1", "touch") - .addPointer("finger2", "touch") - .pointerMove(parseInt(window.innerWidth / 2), - parseInt(window.innerHeight / 2), - {origin: "viewport", sourceName: "finger1"}) - .pointerMove(parseInt(window.innerWidth / 2), - parseInt(window.innerHeight / 2), - {origin: "viewport", sourceName: "finger2"}) - .pointerDown({sourceName: "finger1"}) - .pointerDown({sourceName: "finger2"}) - .pointerMove(parseInt(window.innerWidth / 3), - parseInt(window.innerHeight / 3), - {origin: "viewport", sourceName: "finger1"}) - .pointerMove(parseInt(window.innerWidth / 3 * 2), - parseInt(window.innerHeight / 3 * 2), - {origin: "viewport", sourceName: "finger2"}) - .pointerUp({sourceName: "finger1"}) - .pointerUp({sourceName: "finger2"}) - .send(); + await pinch_zoom_action(); assert_greater_than(visualViewport.scale, 1.0); diff --git a/tests/wpt/tests/css/cssom-view/visual-scrollIntoView-002.html b/tests/wpt/tests/css/cssom-view/visual-scrollIntoView-002.html new file mode 100644 index 00000000000..7f9170654e3 --- /dev/null +++ b/tests/wpt/tests/css/cssom-view/visual-scrollIntoView-002.html @@ -0,0 +1,61 @@ +<!DOCTYPE html> +<html> +<meta name="viewport" content="width=device-width,initial-scale=1"> +<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="support/action-utils.js"></script> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1947470"> +<link rel="help" href="https://drafts.csswg.org/cssom-view/#perform-a-scroll"> +<style> +html { + height: 10000px; +} +body { + margin: 0px; + padding: 0px; +} +#fixed { + position: fixed; + bottom: 0px; + height: 50vh; + width: 100vw; + overflow: scroll; + background-color: gray; +} +input { + height: 20px; +} +</style> +<div id="fixed"> + <div style="height: calc(80vh - 40px)"></div> + <input type="text" id="name" /> +</div> +<script> +promise_test(async t => { + assert_equals(window.scrollY, 0); + assert_equals(visualViewport.scale, 1.0); + assert_equals(visualViewport.pageTop, 0); + + // Pinch zoom in this document. + await pinch_zoom_action(); + + assert_greater_than(visualViewport.scale, 1.0); + + // Scroll the root scroll container. + window.scrollTo(0, 1000); + assert_equals(window.scrollY, 1000); + + const expectedPageTop = visualViewport.pageTop; + + // Now trigger a scrollIntoView call to an element inside a position:fixed element. + scrollPromise = + new Promise(resolve => visualViewport.addEventListener("scroll", resolve)); + document.querySelector('#name').scrollIntoView({ behavior: "instant" }); + await scrollPromise; + + assert_greater_than(visualViewport.pageTop, expectedPageTop); +}, "Element.scrollIntoView scrolls visually to a position: fixed element with non-zero layout scroll offset"); +</script> diff --git a/tests/wpt/tests/css/cssom-view/visual-scrollIntoView-003.html b/tests/wpt/tests/css/cssom-view/visual-scrollIntoView-003.html new file mode 100644 index 00000000000..c0592098a90 --- /dev/null +++ b/tests/wpt/tests/css/cssom-view/visual-scrollIntoView-003.html @@ -0,0 +1,67 @@ +<!DOCTYPE html> +<html> +<meta name="viewport" content="width=device-width,initial-scale=1"> +<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="support/action-utils.js"></script> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1951021"> +<link rel="help" href="https://drafts.csswg.org/cssom-view/#perform-a-scroll"> +<style> +body { + margin: 0px; + padding: 0px; +} +#container { + position: fixed; + width: 100%; + height: 100%; + top: 0px; + left: 0px; +} +#banner { + position: fixed; + bottom: 0px; + left: 0px; + right: 0px; + background-color: blue; +} +</style> +<div id="anchor"></div> +<div id="container"> + <aside id="banner"></aside> +</div> +<script> +promise_test(async t => { + assert_equals(window.scrollY, 0); + assert_equals(visualViewport.scale, 1.0); + assert_equals(visualViewport.pageTop, 0); + + // Pinch zoom in this document. + await pinch_zoom_action(); + + assert_greater_than(visualViewport.scale, 1.0); + + // Suppose that the pinch zoom-in gesture at the center of the document did + // move the visual viewport offset. + assert_greater_than(visualViewport.pageTop, 0); + + // Move to zero offset of the visual viewport. + let scrollPromise = + new Promise(resolve => visualViewport.addEventListener("scroll", resolve)); + document.querySelector('#anchor').scrollIntoView({ behavior: "instant" }); + await scrollPromise; + + assert_equals(visualViewport.pageTop, 0); + + // Now trigger a scrollIntoView call to an element inside nested position:fixed elements. + scrollPromise = + new Promise(resolve => visualViewport.addEventListener("scroll", resolve)); + document.querySelector("#banner").scrollIntoView({ behavior: "instant" }); + await scrollPromise; + + assert_greater_than(visualViewport.pageTop, 0); +}, "Element.scrollIntoView scrolls visually to an element in nested position: fixed elements"); +</script> diff --git a/tests/wpt/tests/css/filter-effects/feComposite-intersection-feTile-input-ref.html b/tests/wpt/tests/css/filter-effects/feComposite-intersection-feTile-input-ref.html new file mode 100644 index 00000000000..4345e3d8ac1 --- /dev/null +++ b/tests/wpt/tests/css/filter-effects/feComposite-intersection-feTile-input-ref.html @@ -0,0 +1,5 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<div style="position: absolute; top: 20px; left: 20px; + width: 100px; height: 100px; background: black"> +</div> diff --git a/tests/wpt/tests/css/filter-effects/feComposite-intersection-feTile-input.html b/tests/wpt/tests/css/filter-effects/feComposite-intersection-feTile-input.html new file mode 100644 index 00000000000..1bf1f4b8fba --- /dev/null +++ b/tests/wpt/tests/css/filter-effects/feComposite-intersection-feTile-input.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<link rel="help" href="https://crbug.com/373759987"> +<link rel="match" href="feComposite-intersection-feTile-input-ref.html"> +<svg width="0" height="0"> + <filter id="test" color-interpolation-filters="sRGB" x="0" y="0"> + <feColorMatrix width="5" height="5"></feColorMatrix> + <feTile result="fill"></feTile> + <feColorMatrix in="SourceGraphic" values="0 0 0 0 0 + 0 0 0 0 0 + 0 0 0 0 0 + 0 1 0 0 0"> + </feColorMatrix> + <feComposite in="fill" operator="in"></feComposite> + </filter> +</svg> +<div></div> +<style> +body { + margin: 0; +} +div { + position: absolute; + top: 0; + border: solid 20px; + width: 100px; height: 100px; + filter: url(#test); +} +div::after { + opacity: 0.5; + position: absolute; + inset: 0; + background: #0f0; + content: ''; +} +</style> diff --git a/tests/wpt/tests/dom/events/scrolling/scrollend-event-fired-for-scrollIntoView.html b/tests/wpt/tests/dom/events/scrolling/scrollend-event-fired-for-scrollIntoView.html index 40aa77f4764..e3e63f28201 100644 --- a/tests/wpt/tests/dom/events/scrolling/scrollend-event-fired-for-scrollIntoView.html +++ b/tests/wpt/tests/dom/events/scrolling/scrollend-event-fired-for-scrollIntoView.html @@ -6,6 +6,12 @@ <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-actions.js"></script> <script src="/resources/testdriver-vendor.js"></script> +<script src="/common/subset-tests-by-key.js"></script> +<meta name="variant" content="?include=subframe-inline-end-block-end-behavior-auto"/> +<meta name="variant" content="?include=subframe-inline-start-block-start-behavior-smooth"/> +<meta name="variant" content="?include=root-inline-end-block-end-behavior-auto"/> +<meta name="variant" content="?include=root-inline-start-block-start-behavior-smooth"/> +<meta name="variant" content="?include=nested-scrollIntoView"/> <script src="scroll_support.js"></script> <style> html { @@ -31,8 +37,8 @@ html { </div> </body> <script> -var element_scrollend_arrived = false; -var document_scrollend_arrived = false; +let element_scrollend_arrived = false; +let document_scrollend_arrived = false; function onElementScrollEnd(event) { assert_false(event.cancelable); @@ -47,80 +53,147 @@ function onDocumentScrollEnd(event) { document_scrollend_arrived = true; } -function callScrollFunction([scrollTarget, scrollFunction, args]) { - scrollTarget[scrollFunction](args); -} +let root_element = document.scrollingElement; +let target_div = document.getElementById("targetDiv"); +let inner_div = document.getElementById("innerDiv"); + +// Get expected position for root_element scrollIntoView. +root_element.scrollTo(10000, 10000); +let max_root_x = root_element.scrollLeft; +let max_root_y = root_element.scrollTop; +root_element.scrollTo(0, 0); + +target_div.scrollTo(10000, 10000); +let max_element_x = target_div.scrollLeft; +let max_element_y = target_div.scrollTop; +target_div.scrollTo(0, 0); + +let test_cases = [ + { + key: "subframe-inline-end-block-end-behavior-auto", + args: { inline: "end", block: "end", behavior: "smooth" }, + target: target_div, + scroll_target: inner_div, + expected: { + pos: { x: max_element_x, y: max_element_y }, + }, + title: "Tests scrollend event for scrollIntoView with behavior 'auto' on subframe.", + }, + { + key: "subframe-inline-start-block-start-behavior-smooth", + args: { inline: "start", block: "start", behavior: "auto" }, + target: target_div, + scroll_target: inner_div, + expected: { + pos: { x: 0, y: 0 }, + }, + title: "Tests scrollend event for scrollIntoView with behavior 'smooth' on subframe.", + }, + { + key: "root-inline-end-block-end-behavior-auto", + args: { inline: "end", block: "end", behavior: "smooth" }, + target: document.scrollingElement, + scroll_target: document.scrollingElement, + expected: { + pos: { x: max_root_x, y: max_root_y }, + }, + title: "Tests scrollend event for scrollIntoView with behavior 'auto' on root.", + }, + { + key: "root-inline-start-block-start-behavior-smooth", + args: { inline: "start", block: "start", behavior: "auto" }, + target: document.scrollingElement, + scroll_target: document.scrollingElement, + expected: { + pos: { x: 0, y: 0 }, + }, + title: "Tests scrollend event for scrollIntoView with behavior 'smooth' on root.", + }, +]; function runTest() { - let root_element = document.scrollingElement; - let target_div = document.getElementById("targetDiv"); - let inner_div = document.getElementById("innerDiv"); - - // Get expected position for root_element scrollIntoView. - root_element.scrollTo(10000, 10000); - let max_root_x = root_element.scrollLeft; - let max_root_y = root_element.scrollTop; - root_element.scrollTo(0, 0); - - target_div.scrollTo(10000, 10000); - let max_element_x = target_div.scrollLeft; - let max_element_y = target_div.scrollTop; - target_div.scrollTo(0, 0); - - promise_test (async (t) => { + async function testScrollIntoView(testInfo, t) { + let test_start = { x: 0, y: 0 }; + if (testInfo.args.inline == "start") { + test_start.x = 10000; + } + if (testInfo.args.block == "start") { + test_start.y = 10000; + } + + if (test_start.x != 0 || test_start.y != 0) { + testInfo.target.scrollTo(test_start.x, test_start.y); + } + await waitForCompositorCommit(); - target_div.addEventListener("scrollend", onElementScrollEnd); + + targetDiv.addEventListener("scrollend", onElementScrollEnd); document.addEventListener("scrollend", onDocumentScrollEnd); - let test_cases = [ - [target_div, max_element_x, max_element_y, [inner_div, "scrollIntoView", { inline: "end", block: "end", behavior: "auto" }]], - [target_div, 0, 0, [inner_div, "scrollIntoView", { inline: "start", block: "start", behavior: "smooth" }]], - [root_element, max_root_x, max_root_y, [root_element, "scrollIntoView", { inline: "end", block: "end", behavior: "smooth" }]], - [root_element, 0, 0, [root_element, "scrollIntoView", { inline: "start", block: "start", behavior: "smooth" }]] - ]; - - for(i = 0; i < test_cases.length; i++) { - let t = test_cases[i]; - let target = t[0]; - let expected_x = t[1]; - let expected_y = t[2]; - let scroll_datas = t[3]; - - callScrollFunction(scroll_datas); - await waitFor(() => { return element_scrollend_arrived || document_scrollend_arrived; }, target.tagName + ".scrollIntoView did not receive scrollend event."); - if (target == root_element) - assert_false(element_scrollend_arrived); - else - assert_false(document_scrollend_arrived); - assert_equals(target.scrollLeft, expected_x, target.tagName + ".scrollIntoView scrollLeft"); - assert_equals(target.scrollTop, expected_y, target.tagName + ".scrollIntoView scrollTop"); - - element_scrollend_arrived = false; - document_scrollend_arrived = false; - } - }, "Tests scrollend event for scrollIntoView."); - - promise_test(async (t) => { - document.body.removeChild(target_div); - let out_div = document.createElement("div"); - out_div.style = "width: 100px; height:100px; overflow:scroll; scroll-behavior:smooth;"; - out_div.appendChild(target_div); - document.body.appendChild(out_div); await waitForCompositorCommit(); - inner_div.scrollIntoView({ inline: "end", block: "end", behavior: "auto" }); - const scrollend_events = [ - waitForScrollendEventNoTimeout(out_div), - waitForScrollendEventNoTimeout(target_div) - ]; - await Promise.all(scrollend_events); - assert_equals(root_element.scrollLeft, 0, "Nested scrollIntoView root_element scrollLeft"); - assert_equals(root_element.scrollTop, 0, "Nested scrollIntoView root_element scrollTop"); - assert_equals(out_div.scrollLeft, 100, "Nested scrollIntoView out_div scrollLeft"); - assert_equals(out_div.scrollTop, 100, "Nested scrollIntoView out_div scrollTop"); - assert_equals(target_div.scrollLeft, max_element_x, "Nested scrollIntoView target_div scrollLeft"); - assert_equals(target_div.scrollTop, max_element_y, "Nested scrollIntoView target_div scrollTop"); - assert_false(document_scrollend_arrived); - }, "Tests scrollend event for nested scrollIntoView."); + testInfo.scroll_target.scrollIntoView({ inline: testInfo.args.inline, + block: testInfo.args.block, + behavior: testInfo.args.behavior }); + + await waitFor( + () => { return element_scrollend_arrived || document_scrollend_arrived; }, + testInfo.target.tagName + ".scrollIntoView did not receive scrollend event." + ); + + assert_equals(testInfo.target.scrollLeft, testInfo.expected.pos.x, + testInfo.target.tagName + ".scrollIntoView scrollLeft"); + assert_equals(testInfo.target.scrollTop, testInfo.expected.pos.y, + testInfo.target.tagName + ".scrollIntoView scrollTop"); + + if (testInfo.target == root_element) { + assert_false(element_scrollend_arrived, + "root element targetted, but element scrollend arrived"); + } else { + assert_false(document_scrollend_arrived, + "subframe targetted, but document scrollend arrived"); + } + } + + test_cases.forEach((test_info) => { + subsetTestByKey(test_info.key, promise_test, + async (t) => testScrollIntoView(test_info, t), test_info.title); + }); + + subsetTestByKey( + "nested-scrollIntoView", + promise_test, + async (t) => { + await waitForCompositorCommit(); + + document.addEventListener("scrollend", onDocumentScrollEnd); + target_div.addEventListener("scrollend", onElementScrollEnd); + + await waitForCompositorCommit(); + + document.body.removeChild(target_div); + let out_div = document.createElement("div"); + out_div.style = "width: 100px; height:100px; overflow:scroll; scroll-behavior:smooth;"; + out_div.appendChild(target_div); + document.body.appendChild(out_div); + await waitForCompositorCommit(); + + inner_div.scrollIntoView({ inline: "end", block: "end", behavior: "auto" }); + const scrollend_events = [ + waitForScrollendEventNoTimeout(out_div), + waitForScrollendEventNoTimeout(target_div) + ]; + await Promise.all(scrollend_events); + assert_equals(root_element.scrollLeft, 0, "Nested scrollIntoView root_element scrollLeft"); + assert_equals(root_element.scrollTop, 0, "Nested scrollIntoView root_element scrollTop"); + assert_equals(out_div.scrollLeft, 100, "Nested scrollIntoView out_div scrollLeft"); + assert_equals(out_div.scrollTop, 100, "Nested scrollIntoView out_div scrollTop"); + assert_equals(target_div.scrollLeft, max_element_x, "Nested scrollIntoView target_div scrollLeft"); + assert_equals(target_div.scrollTop, max_element_y, "Nested scrollIntoView target_div scrollTop"); + assert_false(document_scrollend_arrived); + }, + "Tests scrollend event for nested scrollIntoView.", + ); } + </script> diff --git a/tests/wpt/tests/ecmascript/locale-compat.html b/tests/wpt/tests/ecmascript/locale-compat.html index 74806987879..1f863b21ecb 100644 --- a/tests/wpt/tests/ecmascript/locale-compat.html +++ b/tests/wpt/tests/ecmascript/locale-compat.html @@ -44,7 +44,10 @@ test(t => { // https://bugs.chromium.org/p/chromium/issues/detail?id=1418727 }, '`Date.prototype.toLocaleString` produces `yyyy-mm-dd` instead of `m/d/yyyy` for `en-CA` locale'); test(t => { // https://bugzilla.mozilla.org/show_bug.cgi?id=1864612 - assert_true(new Intl.DateTimeFormat('sv-SE', {}).format(0).endsWith('-01-01')); -}); + const date = new Date('1970-01-01T00:00:00'); + const formatter = new Intl.DateTimeFormat('sv-SE') + + assert_equals(formatter.format(date), '1970-01-01'); +}, '`Intl.DateTimeFormat.prototype.format` produces `yyyy-mm-dd` instead of `yyyy-m-d` for `sv-SE` locale'); </script> diff --git a/tests/wpt/tests/editing/whitespaces/delete-word-around-span.html b/tests/wpt/tests/editing/whitespaces/delete-word-around-span.html new file mode 100644 index 00000000000..6250e9aec21 --- /dev/null +++ b/tests/wpt/tests/editing/whitespaces/delete-word-around-span.html @@ -0,0 +1,75 @@ +<!doctype html> +<html> +<head> +<meta charset="utf-8"> +<meta name="variant" content="?white-space=normal"> +<meta name="variant" content="?white-space=pre"> +<meta name="variant" content="?white-space=pre-wrap"> +<meta name="variant" content="?white-space=pre-line"> +<title>Delete per word should not change the deleting range whether the surrounding word is wrapped in an inline element</title> +<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> +<script src="../include/editor-test-utils.js"></script> +<script> +"use strict"; + +const searchParams = new URLSearchParams(document.location.search); +const whiteSpace = searchParams.get("white-space"); + +document.addEventListener("DOMContentLoaded", () => { + const editingHost = document.querySelector("div[contenteditable]"); + editingHost.style.whiteSpace = whiteSpace; + const utils = new EditorTestUtils(editingHost); + /** + * How to delete per word may depend on the browser and the platform. On the + * other hand, the result (at least in the plaintext point of view) should be + * same even if surrounding word is wrapped in a <span>. + */ + for (const data of [ + { + innerHTML: `abc <span>def</span> ghi[]`, + referenceInnerHTML: `abc def ghi[]`, + }, + { + innerHTML: `abc <span>def</span>[] ghi`, + referenceInnerHTML: `abc def[] ghi`, + }, + { + innerHTML: `abc <span>def[]</span> ghi`, + referenceInnerHTML: `abc def[] ghi`, + }, + { + innerHTML: `abc <span>[]def</span> ghi`, + referenceInnerHTML: `abc []def ghi`, + }, + { + innerHTML: `abc []<span>def</span> ghi`, + referenceInnerHTML: `abc []def ghi`, + }, + { + innerHTML: `abc[] <span>def</span> ghi`, + referenceInnerHTML: `abc[] def ghi`, + }, + ]) { + promise_test(async () => { + utils.setupEditingHost(data.referenceInnerHTML); + await utils.sendBackspaceKey(utils.deleteWordModifier); + const expectedInnerText = editingHost.innerText; + utils.setupEditingHost(data.innerHTML); + await utils.sendBackspaceKey(utils.deleteWordModifier); + assert_equals( + editingHost.innerText.replaceAll("\u00A0", " "), + expectedInnerText.replaceAll("\u00A0", " ") + ); + }, `Ctrl/Cmd - Backspace when "${data.innerHTML}" should get same innerText as when "${data.referenceInnerHTML}"`); + } +}, {once: true}); +</script> +</head> +<body> + <div contenteditable></div> +</body> +</html> diff --git a/tests/wpt/tests/editing/whitespaces/forwarddelete-word-around-span.html b/tests/wpt/tests/editing/whitespaces/forwarddelete-word-around-span.html new file mode 100644 index 00000000000..ac7cbaee186 --- /dev/null +++ b/tests/wpt/tests/editing/whitespaces/forwarddelete-word-around-span.html @@ -0,0 +1,75 @@ +<!doctype html> +<html> +<head> +<meta charset="utf-8"> +<meta name="variant" content="?white-space=normal"> +<meta name="variant" content="?white-space=pre"> +<meta name="variant" content="?white-space=pre-wrap"> +<meta name="variant" content="?white-space=pre-line"> +<title>Forward-delete per word should not change the deleting range whether the surrounding word is wrapped in an inline element</title> +<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> +<script src="../include/editor-test-utils.js"></script> +<script> +"use strict"; + +const searchParams = new URLSearchParams(document.location.search); +const whiteSpace = searchParams.get("white-space"); + +document.addEventListener("DOMContentLoaded", () => { + const editingHost = document.querySelector("div[contenteditable]"); + editingHost.style.whiteSpace = whiteSpace; + const utils = new EditorTestUtils(editingHost); + /** + * How to delete per word may depend on the browser and the platform. On the + * other hand, the result (at least in the plaintext point of view) should be + * same even if surrounding word is wrapped in a <span>. + */ + for (const data of [ + { + innerHTML: `[]abc <span>def</span> ghi`, + referenceInnerHTML: `[]abc def ghi`, + }, + { + innerHTML: `abc[] <span>def</span> ghi`, + referenceInnerHTML: `abc[] def ghi`, + }, + { + innerHTML: `abc []<span>def</span> ghi`, + referenceInnerHTML: `abc []def ghi`, + }, + { + innerHTML: `abc <span>[]def</span> ghi`, + referenceInnerHTML: `abc []def ghi`, + }, + { + innerHTML: `abc <span>def</span>[] ghi`, + referenceInnerHTML: `abc def[] ghi`, + }, + { + innerHTML: `abc <span>def</span> []ghi`, + referenceInnerHTML: `abc def []ghi`, + }, + ]) { + promise_test(async () => { + utils.setupEditingHost(data.referenceInnerHTML); + await utils.sendDeleteKey(utils.deleteWordModifier); + const expectedInnerText = editingHost.innerText; + utils.setupEditingHost(data.innerHTML); + await utils.sendDeleteKey(utils.deleteWordModifier); + assert_equals( + editingHost.innerText.replaceAll("\u00A0", " "), + expectedInnerText.replaceAll("\u00A0", " ") + ); + }, `Ctrl/Cmd - Delete when "${data.innerHTML}" should get same innerText as when "${data.referenceInnerHTML}"`); + } +}, {once: true}); +</script> +</head> +<body> + <div contenteditable></div> +</body> +</html> diff --git a/tests/wpt/tests/event-timing/WEB_FEATURES.yml b/tests/wpt/tests/event-timing/WEB_FEATURES.yml new file mode 100644 index 00000000000..b20102ff2a3 --- /dev/null +++ b/tests/wpt/tests/event-timing/WEB_FEATURES.yml @@ -0,0 +1,3 @@ +features: +- name: event-timing + files: "**" diff --git a/tests/wpt/tests/fetch/private-network-access/README.md b/tests/wpt/tests/fetch/private-network-access/README.md index a69aab48723..cbb5b85b74d 100644 --- a/tests/wpt/tests/fetch/private-network-access/README.md +++ b/tests/wpt/tests/fetch/private-network-access/README.md @@ -8,3 +8,6 @@ See also: * [The specification](https://wicg.github.io/private-network-access/) * [The repository](https://github.com/WICG/private-network-access/) * [Open issues](https://github.com/WICG/private-network-access/issues/) + +Private Network Access is deprecated and will eventually be replaced by [Local +Network Access](https://github.com/explainers-by-googlers/local-network-access). diff --git a/tests/wpt/tests/fledge/tentative/abort.https.window.js b/tests/wpt/tests/fledge/tentative/abort.https.window.js index db6aae46045..e4a3189a30c 100644 --- a/tests/wpt/tests/fledge/tentative/abort.https.window.js +++ b/tests/wpt/tests/fledge/tentative/abort.https.window.js @@ -4,7 +4,7 @@ // META: script=resources/fledge-util.sub.js // META: timeout=long -"use strict;" +"use strict"; promise_test(async test => { const uuid = generateUuid(test); diff --git a/tests/wpt/tests/fledge/tentative/additional-bids.https.window.js b/tests/wpt/tests/fledge/tentative/additional-bids.https.window.js index edacb05512e..384a9e62030 100644 --- a/tests/wpt/tests/fledge/tentative/additional-bids.https.window.js +++ b/tests/wpt/tests/fledge/tentative/additional-bids.https.window.js @@ -6,7 +6,7 @@ // META: timeout=long // META: variant=?1-last -"use strict;" +"use strict"; // This file contains tests for additional bids and negative targeting. // diff --git a/tests/wpt/tests/fledge/tentative/auction-config-passed-to-worklets.https.window.js b/tests/wpt/tests/fledge/tentative/auction-config-passed-to-worklets.https.window.js index dec49b80a96..1fb59972b58 100644 --- a/tests/wpt/tests/fledge/tentative/auction-config-passed-to-worklets.https.window.js +++ b/tests/wpt/tests/fledge/tentative/auction-config-passed-to-worklets.https.window.js @@ -12,7 +12,7 @@ // META: variant=?26-30 // META: variant=?30-35 -"use strict;" +"use strict"; // These tests focus on making sure AuctionConfig fields are passed to seller worklets, // and are normalized if necessary. This test does not check the behaviors of the diff --git a/tests/wpt/tests/fledge/tentative/auction-config.https.window.js b/tests/wpt/tests/fledge/tentative/auction-config.https.window.js index 50b9cb9e9e6..e32d8b31773 100644 --- a/tests/wpt/tests/fledge/tentative/auction-config.https.window.js +++ b/tests/wpt/tests/fledge/tentative/auction-config.https.window.js @@ -19,7 +19,7 @@ // META: variant=?61-65 // META: variant=?66-last -"use strict;" +"use strict"; // The tests in this file focus on calls to runAdAuction with various // auctionConfigs. diff --git a/tests/wpt/tests/fledge/tentative/clear-origin-joined-ad-interest-groups.https.window.js b/tests/wpt/tests/fledge/tentative/clear-origin-joined-ad-interest-groups.https.window.js index 097978a7858..9f0818da2c4 100644 --- a/tests/wpt/tests/fledge/tentative/clear-origin-joined-ad-interest-groups.https.window.js +++ b/tests/wpt/tests/fledge/tentative/clear-origin-joined-ad-interest-groups.https.window.js @@ -9,7 +9,7 @@ // META: variant=?9-12 // META: variant=?13-last -"use strict;" +"use strict"; /////////////////////////////////////////////////////////////////////////////// // Basic tests with no interest groups joined. diff --git a/tests/wpt/tests/fledge/tentative/cross-origin.https.window.js b/tests/wpt/tests/fledge/tentative/cross-origin.https.window.js index 9669f2790bc..6c95f74c1f5 100644 --- a/tests/wpt/tests/fledge/tentative/cross-origin.https.window.js +++ b/tests/wpt/tests/fledge/tentative/cross-origin.https.window.js @@ -9,7 +9,7 @@ // META: variant=?9-12 // META: variant=?13-last -"use strict;" +"use strict"; //////////////////////////////////////////////////////////////////////////////// // Join interest group in iframe tests. diff --git a/tests/wpt/tests/fledge/tentative/currency.https.window.js b/tests/wpt/tests/fledge/tentative/currency.https.window.js index f1b2bba8734..b65dea5820a 100644 --- a/tests/wpt/tests/fledge/tentative/currency.https.window.js +++ b/tests/wpt/tests/fledge/tentative/currency.https.window.js @@ -14,7 +14,7 @@ // META: variant=?29-32 // META: variant=?33-last -'use strict;' +'use strict'; const ORIGIN = window.location.origin; diff --git a/tests/wpt/tests/fledge/tentative/deprecated-render-url-replacements.https.window.js b/tests/wpt/tests/fledge/tentative/deprecated-render-url-replacements.https.window.js index 75377ca7aa3..51daaf27797 100644 --- a/tests/wpt/tests/fledge/tentative/deprecated-render-url-replacements.https.window.js +++ b/tests/wpt/tests/fledge/tentative/deprecated-render-url-replacements.https.window.js @@ -10,7 +10,7 @@ // META: variant=?16-last -"use strict;" +"use strict"; // This test ensures proper handling of deprecatedRenderURLReplacements within auctionConfigOverrides. // It validates that these replacements are correctly applied to the winning bid's renderURL by diff --git a/tests/wpt/tests/fledge/tentative/direct-from-seller-signals.https.window.js b/tests/wpt/tests/fledge/tentative/direct-from-seller-signals.https.window.js index 3f58b2c8ad5..a4e6911491d 100644 --- a/tests/wpt/tests/fledge/tentative/direct-from-seller-signals.https.window.js +++ b/tests/wpt/tests/fledge/tentative/direct-from-seller-signals.https.window.js @@ -14,7 +14,7 @@ // META: variant=?29-32 // META: variant=?33-36 -"use strict;" +"use strict"; subsetTest(promise_test, async test => { const uuid = generateUuid(test); 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 00c4bfdcc31..e472fccdc4d 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 @@ -13,7 +13,7 @@ // META: variant=?25-28 // META: variant=?29-last -"use strict;" +"use strict"; // These tests focus on the browserSignals argument passed to generateBid(). // Note that "topLevelSeller" is covered by component auction tests, diff --git a/tests/wpt/tests/fledge/tentative/get-interest-group-auction-data.https.window.js b/tests/wpt/tests/fledge/tentative/get-interest-group-auction-data.https.window.js index 855e6b5a075..de749e1e60a 100644 --- a/tests/wpt/tests/fledge/tentative/get-interest-group-auction-data.https.window.js +++ b/tests/wpt/tests/fledge/tentative/get-interest-group-auction-data.https.window.js @@ -12,6 +12,8 @@ // META: variant=?13-16 // META: variant=?17-last +"use strict"; + // These tests focus on the navigator.getInterestGroupAdAuctionData() method. // Checks various fields for decoded InterestGroupAdAuctionData that's diff --git a/tests/wpt/tests/fledge/tentative/interest-group-passed-to-generate-bid.https.window.js b/tests/wpt/tests/fledge/tentative/interest-group-passed-to-generate-bid.https.window.js index 172cbab4664..6b5602158ff 100644 --- a/tests/wpt/tests/fledge/tentative/interest-group-passed-to-generate-bid.https.window.js +++ b/tests/wpt/tests/fledge/tentative/interest-group-passed-to-generate-bid.https.window.js @@ -22,7 +22,7 @@ // META: variant=?76-80 // META: variant=?81-85 -"use strict;" +"use strict"; // These tests focus on making sure InterestGroup fields are passed to generateBid(), // and are normalized if necessary. This test does not check the behaviors of the diff --git a/tests/wpt/tests/fledge/tentative/interest-group-update.https.window.js b/tests/wpt/tests/fledge/tentative/interest-group-update.https.window.js index ceac2c79a6e..04110054744 100644 --- a/tests/wpt/tests/fledge/tentative/interest-group-update.https.window.js +++ b/tests/wpt/tests/fledge/tentative/interest-group-update.https.window.js @@ -10,7 +10,7 @@ // META: variant=?15-19 // META: variant=?20-last -"use strict;" +"use strict"; // This test repeatedly runs auctions to verify an update. A modified bidding script // continuously throws errors until it detects the expected change in the interest group @@ -32,7 +32,7 @@ const makeTestForUpdate = ({ }) => { subsetTest(promise_test, async test => { const uuid = generateUuid(test); - extraBiddingLogic = ``; + let extraBiddingLogic = ``; let replacePlaceholders = (ads) => ads.forEach(element => { element.renderURL = element.renderURL.replace(`UUID-PLACEHOLDER`, uuid); diff --git a/tests/wpt/tests/fledge/tentative/join-leave-ad-interest-group-in-fenced-frame.https.window.js b/tests/wpt/tests/fledge/tentative/join-leave-ad-interest-group-in-fenced-frame.https.window.js index 1e2824666cc..2939d384784 100644 --- a/tests/wpt/tests/fledge/tentative/join-leave-ad-interest-group-in-fenced-frame.https.window.js +++ b/tests/wpt/tests/fledge/tentative/join-leave-ad-interest-group-in-fenced-frame.https.window.js @@ -8,7 +8,7 @@ // META: variant=?5-8 // META: variant=?9-last -"use strict;" +"use strict"; // These are separate from the other join-leave tests because these all create // and navigate fenced frames, which is much slower than just joining/leaving diff --git a/tests/wpt/tests/fledge/tentative/join-leave-ad-interest-group.https.window.js b/tests/wpt/tests/fledge/tentative/join-leave-ad-interest-group.https.window.js index 68a4e9d09c9..5e004ed1dc5 100644 --- a/tests/wpt/tests/fledge/tentative/join-leave-ad-interest-group.https.window.js +++ b/tests/wpt/tests/fledge/tentative/join-leave-ad-interest-group.https.window.js @@ -14,7 +14,7 @@ // META: variant=?71-80 // META: variant=?81-last -"use strict;" +"use strict"; // These tests are focused on joinAdInterestGroup() and leaveAdInterestGroup(). // Most join tests do not run auctions, but instead only check the result of @@ -460,7 +460,7 @@ const SIMPLE_JOIN_LEAVE_TEST_CASES = [ }, ]; -for (testCase of SIMPLE_JOIN_LEAVE_TEST_CASES) { +for (let testCase of SIMPLE_JOIN_LEAVE_TEST_CASES) { var test_name = 'Join and leave interest group: '; if ('testCaseName' in testCase) { test_name += testCase.testCaseName; diff --git a/tests/wpt/tests/fledge/tentative/kanon-status-below-threshold.https.window.js b/tests/wpt/tests/fledge/tentative/kanon-status-below-threshold.https.window.js index 6f3c2f572a1..419b94bd781 100644 --- a/tests/wpt/tests/fledge/tentative/kanon-status-below-threshold.https.window.js +++ b/tests/wpt/tests/fledge/tentative/kanon-status-below-threshold.https.window.js @@ -4,7 +4,7 @@ // META: script=resources/fledge-util.sub.js // META: script=/common/subset-tests.js -"use strict;" +"use strict"; subsetTest(promise_test, async test => { const uuid = generateUuid(test); diff --git a/tests/wpt/tests/fledge/tentative/kanon-status-not-calculated.https.window.js b/tests/wpt/tests/fledge/tentative/kanon-status-not-calculated.https.window.js index 87a66c106fb..965082d8ffd 100644 --- a/tests/wpt/tests/fledge/tentative/kanon-status-not-calculated.https.window.js +++ b/tests/wpt/tests/fledge/tentative/kanon-status-not-calculated.https.window.js @@ -4,7 +4,7 @@ // META: script=resources/fledge-util.sub.js // META: script=/common/subset-tests.js -"use strict;" +"use strict"; subsetTest(promise_test, async test => { const uuid = generateUuid(test); diff --git a/tests/wpt/tests/fledge/tentative/no-winner.https.window.js b/tests/wpt/tests/fledge/tentative/no-winner.https.window.js index 2632a95deee..cfa0704dbc4 100644 --- a/tests/wpt/tests/fledge/tentative/no-winner.https.window.js +++ b/tests/wpt/tests/fledge/tentative/no-winner.https.window.js @@ -15,7 +15,7 @@ // META: variant=?41-45 // META: variant=?46-last -"use strict;" +"use strict"; // The tests in this file focus on simple auctions (one bidder, one seller, one // origin, one frame) which have no winning bid, either due to errors or due to @@ -76,7 +76,7 @@ const BIDDING_WASM_HELPER_ERRORS = [ 'error=not-wasm' ]; -for (error of BIDDING_LOGIC_SCRIPT_ERRORS) { +for (let error of BIDDING_LOGIC_SCRIPT_ERRORS) { subsetTest(promise_test, (async (error, test) => { let biddingLogicURL = `${BASE_URL}resources/bidding-logic.sub.py?${error}`; await joinGroupAndRunBasicFledgeTestExpectingNoWinner( @@ -86,7 +86,7 @@ for (error of BIDDING_LOGIC_SCRIPT_ERRORS) { }).bind(undefined, error), `Bidding logic script: ${error}`); } -for (error of DECISION_LOGIC_SCRIPT_ERRORS) { +for (let error of DECISION_LOGIC_SCRIPT_ERRORS) { subsetTest(promise_test, (async (error, test) => { let decisionLogicURL = `${BASE_URL}resources/decision-logic.sub.py?${error}`; @@ -96,7 +96,7 @@ for (error of DECISION_LOGIC_SCRIPT_ERRORS) { }).bind(undefined, error), `Decision logic script: ${error}`); } -for (error of BIDDING_WASM_HELPER_ERRORS) { +for (let error of BIDDING_WASM_HELPER_ERRORS) { subsetTest(promise_test, (async (error, test) => { let biddingWasmHelperURL = `${BASE_URL}resources/wasm-helper.py?${error}`; diff --git a/tests/wpt/tests/fledge/tentative/private-aggregation.https.window.js b/tests/wpt/tests/fledge/tentative/private-aggregation.https.window.js index a1c261b6291..474bf4ced76 100644 --- a/tests/wpt/tests/fledge/tentative/private-aggregation.https.window.js +++ b/tests/wpt/tests/fledge/tentative/private-aggregation.https.window.js @@ -10,7 +10,7 @@ // META: variant=?11-15 // META: variant=?16-20 -'use strict;' +'use strict'; // To better isolate from private aggregation tests run in parallel, // don't use the usual origin here. diff --git a/tests/wpt/tests/fledge/tentative/real-time-reporting.https.window.js b/tests/wpt/tests/fledge/tentative/real-time-reporting.https.window.js index 5ebd20d19ae..84dce53844f 100644 --- a/tests/wpt/tests/fledge/tentative/real-time-reporting.https.window.js +++ b/tests/wpt/tests/fledge/tentative/real-time-reporting.https.window.js @@ -8,7 +8,7 @@ // META: variant=?1-5 // META: variant=?6-last -'use strict;' +'use strict'; // The tests in this file focus on real time reporting. diff --git a/tests/wpt/tests/fledge/tentative/register-ad-beacon.https.window.js b/tests/wpt/tests/fledge/tentative/register-ad-beacon.https.window.js index d74f0dab5e5..98b6a75c42f 100644 --- a/tests/wpt/tests/fledge/tentative/register-ad-beacon.https.window.js +++ b/tests/wpt/tests/fledge/tentative/register-ad-beacon.https.window.js @@ -8,7 +8,7 @@ // META: variant=?6-10 // META: variant=?11-last -"use strict;" +"use strict"; subsetTest(promise_test, async test => { const uuid = generateUuid(test); diff --git a/tests/wpt/tests/fledge/tentative/reporting-arguments.https.window.js b/tests/wpt/tests/fledge/tentative/reporting-arguments.https.window.js index a3b546f5964..04af8ebc643 100644 --- a/tests/wpt/tests/fledge/tentative/reporting-arguments.https.window.js +++ b/tests/wpt/tests/fledge/tentative/reporting-arguments.https.window.js @@ -9,7 +9,7 @@ // META: variant=?11-15 // META: variant=?16-last -"use strict;" +"use strict"; // Simplified version of reportTest() for validating arguments to reporting // methods. Only takes expressions to check in reporting methods. "uuid" is diff --git a/tests/wpt/tests/fledge/tentative/reporting-ids.https.window.js b/tests/wpt/tests/fledge/tentative/reporting-ids.https.window.js index 43c78987f1e..0019393008b 100644 --- a/tests/wpt/tests/fledge/tentative/reporting-ids.https.window.js +++ b/tests/wpt/tests/fledge/tentative/reporting-ids.https.window.js @@ -8,7 +8,7 @@ // META: variant=?6-last -"use strict;" +"use strict"; const makeTest = ({ // Name of the test. diff --git a/tests/wpt/tests/fledge/tentative/resources/ba-fledge-util.sub.js b/tests/wpt/tests/fledge/tentative/resources/ba-fledge-util.sub.js index 3371813feee..8fa4eb1e351 100644 --- a/tests/wpt/tests/fledge/tentative/resources/ba-fledge-util.sub.js +++ b/tests/wpt/tests/fledge/tentative/resources/ba-fledge-util.sub.js @@ -1,4 +1,4 @@ -'use strict;' +'use strict'; let BA = {}; 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 ebd2b44b992..e0d5d99bb65 100644 --- a/tests/wpt/tests/fledge/tentative/resources/fledge-util.sub.js +++ b/tests/wpt/tests/fledge/tentative/resources/fledge-util.sub.js @@ -1,10 +1,10 @@ -"use strict;" +"use strict"; const BASE_URL = document.baseURI.substring(0, document.baseURI.lastIndexOf('/') + 1); const BASE_PATH = (new URL(BASE_URL)).pathname; // Allow overriding to allow other repositories to use these utility functions. -RESOURCE_PATH = `${BASE_PATH}resources/` +let RESOURCE_PATH = `${BASE_PATH}resources/` const DEFAULT_INTEREST_GROUP_NAME = 'default name'; @@ -969,7 +969,7 @@ let additionalBidHelper = function() { // not be reused in a future call to `fetchAdditionalBids()`, since this // mothod consumes and destroys their `testMetadata` field. async function fetchAdditionalBids(seller, additionalBids) { - additionalBidHeaderValues = await Promise.all(additionalBids.map( + let additionalBidHeaderValues = await Promise.all(additionalBids.map( async additionalBid => await _convertAdditionalBidToResponseHeader(additionalBid))); diff --git a/tests/wpt/tests/fledge/tentative/resources/service-worker-helper.js b/tests/wpt/tests/fledge/tentative/resources/service-worker-helper.js index cc001813597..2b94dc60e01 100644 --- a/tests/wpt/tests/fledge/tentative/resources/service-worker-helper.js +++ b/tests/wpt/tests/fledge/tentative/resources/service-worker-helper.js @@ -1,4 +1,4 @@ -"use strict;" +"use strict"; // Service workers, once activated, will use 'clients.claim()' // so that clients loaded in the same scope do not need to be reloaded @@ -18,4 +18,4 @@ self.addEventListener('fetch', (event) => { url: url, message: "Service worker saw this URL: " + url }); -});
\ No newline at end of file +}); diff --git a/tests/wpt/tests/fledge/tentative/round-a-value.https.window.js b/tests/wpt/tests/fledge/tentative/round-a-value.https.window.js index 2195b45ea5f..21bbf295726 100644 --- a/tests/wpt/tests/fledge/tentative/round-a-value.https.window.js +++ b/tests/wpt/tests/fledge/tentative/round-a-value.https.window.js @@ -4,7 +4,7 @@ // META: script=resources/fledge-util.sub.js // META: timeout=long -"use strict;" +"use strict"; promise_test(async test => { const uuid = generateUuid(test); diff --git a/tests/wpt/tests/fledge/tentative/score-ad-browser-signals.https.window.js b/tests/wpt/tests/fledge/tentative/score-ad-browser-signals.https.window.js index 23fee313af5..9acf994cf9f 100644 --- a/tests/wpt/tests/fledge/tentative/score-ad-browser-signals.https.window.js +++ b/tests/wpt/tests/fledge/tentative/score-ad-browser-signals.https.window.js @@ -6,7 +6,7 @@ // META: timeout=long // META: variant=?1-last -"use strict;" +"use strict"; // These tests focus on the browserSignals argument passed to scoreAd(). diff --git a/tests/wpt/tests/fledge/tentative/send-report-to.https.window.js b/tests/wpt/tests/fledge/tentative/send-report-to.https.window.js index 163443cb76d..fa0f01ccfe8 100644 --- a/tests/wpt/tests/fledge/tentative/send-report-to.https.window.js +++ b/tests/wpt/tests/fledge/tentative/send-report-to.https.window.js @@ -7,7 +7,7 @@ // META: variant=?1-5 // META: variant=?6-last -"use strict;" +"use strict"; subsetTest(promise_test, async test => { const uuid = generateUuid(test); diff --git a/tests/wpt/tests/fledge/tentative/server-response-for-debugging-only.https.window.js b/tests/wpt/tests/fledge/tentative/server-response-for-debugging-only.https.window.js index 1b4edc66a89..e6787e8a2d9 100644 --- a/tests/wpt/tests/fledge/tentative/server-response-for-debugging-only.https.window.js +++ b/tests/wpt/tests/fledge/tentative/server-response-for-debugging-only.https.window.js @@ -9,6 +9,8 @@ // META: timeout=long // META: variant=?1-last +"use strict"; + // These tests focus on the debugReports field in AuctionConfig's // serverResponse, i.e. auctions involving forDebuggingOnly reports. // NOTE: Due to DB's fDO lockout/cooldown tables are not cleaned after each run diff --git a/tests/wpt/tests/fledge/tentative/server-response-private-aggregation.https.window.js b/tests/wpt/tests/fledge/tentative/server-response-private-aggregation.https.window.js index d7f21e16cf0..6d9a8a88770 100644 --- a/tests/wpt/tests/fledge/tentative/server-response-private-aggregation.https.window.js +++ b/tests/wpt/tests/fledge/tentative/server-response-private-aggregation.https.window.js @@ -10,6 +10,8 @@ // META: variant=?1-6 // META: variant=?7-last +"use strict"; + // These tests focus on the paggResponse field in AuctionConfig's // serverResponse, i.e. auctions involving private aggregation reporting. NOTE: // Due to debug mode being disabled for B&A's Private Aggregation reports, these diff --git a/tests/wpt/tests/fledge/tentative/server-response.https.window.js b/tests/wpt/tests/fledge/tentative/server-response.https.window.js index d4eaf0d2512..4241cc8e1c9 100644 --- a/tests/wpt/tests/fledge/tentative/server-response.https.window.js +++ b/tests/wpt/tests/fledge/tentative/server-response.https.window.js @@ -24,6 +24,8 @@ // META: variant=?63-66 // META: variant=?67-70 +"use strict"; + // These tests focus on the serverResponse field in AuctionConfig, e.g. // auctions involving bidding and auction services. diff --git a/tests/wpt/tests/fledge/tentative/service-worker-request-visibility.https.window.js b/tests/wpt/tests/fledge/tentative/service-worker-request-visibility.https.window.js index 8b8618420e5..41ebf839600 100644 --- a/tests/wpt/tests/fledge/tentative/service-worker-request-visibility.https.window.js +++ b/tests/wpt/tests/fledge/tentative/service-worker-request-visibility.https.window.js @@ -6,7 +6,7 @@ // META: timeout=long // META: variant=?1-last -"use strict;" +"use strict"; const SERVICE_WORKER_SCRIPT = "resources/service-worker-helper.js"; diff --git a/tests/wpt/tests/fledge/tentative/tie.https.window.js b/tests/wpt/tests/fledge/tentative/tie.https.window.js index f528df8fb02..21be690c92e 100644 --- a/tests/wpt/tests/fledge/tentative/tie.https.window.js +++ b/tests/wpt/tests/fledge/tentative/tie.https.window.js @@ -4,12 +4,12 @@ // META: script=resources/fledge-util.sub.js // META: timeout=long -"use strict;" +"use strict"; // Runs one auction at a time using `auctionConfigOverrides` until the auction // has a winner. async function runAuctionsUntilWinner(test, uuid, auctionConfigOverrides) { - fencedFrameConfig = null; + let fencedFrameConfig = null; while (!fencedFrameConfig) { fencedFrameConfig = await runBasicFledgeAuction(test, uuid, auctionConfigOverrides); diff --git a/tests/wpt/tests/fledge/tentative/utf8-helpers.https.window.js b/tests/wpt/tests/fledge/tentative/utf8-helpers.https.window.js index 4a712bf6269..9d8d0836419 100644 --- a/tests/wpt/tests/fledge/tentative/utf8-helpers.https.window.js +++ b/tests/wpt/tests/fledge/tentative/utf8-helpers.https.window.js @@ -8,7 +8,7 @@ // META: variant=?6-10 // META: variant=?11-15 -'use strict;' +'use strict'; // These tests cover encodeUtf8 and decodeUtf8. diff --git a/tests/wpt/tests/css/css-fonts/support/fonts/Lato-Medium-Liga.ttf b/tests/wpt/tests/fonts/Lato-Medium-Liga.ttf Binary files differindex 3a0beaea38b..3a0beaea38b 100644 --- a/tests/wpt/tests/css/css-fonts/support/fonts/Lato-Medium-Liga.ttf +++ b/tests/wpt/tests/fonts/Lato-Medium-Liga.ttf diff --git a/tests/wpt/tests/css/css-fonts/support/fonts/Lato-Medium.ttf b/tests/wpt/tests/fonts/Lato-Medium.ttf Binary files differindex 2c612da2ae5..2c612da2ae5 100644 --- a/tests/wpt/tests/css/css-fonts/support/fonts/Lato-Medium.ttf +++ b/tests/wpt/tests/fonts/Lato-Medium.ttf diff --git a/tests/wpt/tests/html/browsers/the-window-object/open-close/open_initial_size.html b/tests/wpt/tests/html/browsers/the-window-object/open-close/open_initial_size.html new file mode 100644 index 00000000000..a3a82d76468 --- /dev/null +++ b/tests/wpt/tests/html/browsers/the-window-object/open-close/open_initial_size.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>HTML: window.open: window geometry immediately after open</title> +<link rel="help" href="https://html.spec.whatwg.org/multipage/#apis-for-creating-and-navigating-browsing-contexts-by-name"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/PrefixedPostMessage.js"></script> +<script> +var windowURL = 'resources/message-opener.html'; + +async_test(t => { + var prefixedMessage = new PrefixedMessageTest(); + var initialWidth, initialHeight, initialLeft, initialTop; + prefixedMessage.onMessage(t.step_func_done((data, e) => { + e.source.close(); + assert_equals(initialWidth, data.width); + assert_equals(initialHeight, data.height); + assert_equals(initialLeft, data.left); + assert_equals(initialTop, data.top); + })); + var win = window.open(prefixedMessage.url(windowURL), ''); + initialWidth = win.innerWidth; + initialHeight = win.innerHeight; + initialLeft = win.screenX; + initialTop = win.screenY; +}, "Window geometry is available in opener context immediately"); +</script> diff --git a/tests/wpt/tests/html/canvas/element/text/2d.text.measure.lang.html b/tests/wpt/tests/html/canvas/element/text/2d.text.measure.lang.html new file mode 100644 index 00000000000..a11e838799c --- /dev/null +++ b/tests/wpt/tests/html/canvas/element/text/2d.text.measure.lang.html @@ -0,0 +1,48 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<meta charset="UTF-8"> +<title>Canvas test: 2d.text.measure.lang</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/html/canvas/resources/canvas-tests.js"></script> +<link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css"> +<style> +@font-face { + font-family: Lato-Medium; + src: url("/fonts/Lato-Medium.ttf"); +} +</style> +<body class="show_output"> + +<h1>2d.text.measure.lang</h1> +<p class="desc">Testing the lang attribute</p> + + +<span style="font-family: Lato-Medium; position: absolute; visibility: hidden">A</span> +<p class="output">Actual output:</p> +<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas> + +<ul id="d"></ul> +<script> +promise_test(async t => { + + var canvas = document.getElementById('c'); + var ctx = canvas.getContext('2d'); + + await document.fonts.ready; + + ctx.font = '50px Lato-Medium'; + ctx.lang = 'tr'; + const text = 'fi'; + const tm_tr = ctx.measureText(text); + const tr_width = tm_tr.width; + + ctx.lang = 'en'; + const tm_en = ctx.measureText(text); + const en_width = tm_en.width; + + _assert(tr_width > en_width, "tr_width > en_width"); + +}, "Testing the lang attribute"); +</script> + diff --git a/tests/wpt/tests/html/canvas/element/text/2d.text.measure.lang.inherit.html b/tests/wpt/tests/html/canvas/element/text/2d.text.measure.lang.inherit.html new file mode 100644 index 00000000000..565308a895b --- /dev/null +++ b/tests/wpt/tests/html/canvas/element/text/2d.text.measure.lang.inherit.html @@ -0,0 +1,48 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<meta charset="UTF-8"> +<title>Canvas test: 2d.text.measure.lang.inherit</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/html/canvas/resources/canvas-tests.js"></script> +<link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css"> +<style> +@font-face { + font-family: Lato-Medium; + src: url("/fonts/Lato-Medium.ttf"); +} +</style> +<body class="show_output"> + +<h1>2d.text.measure.lang.inherit</h1> +<p class="desc">Testing the lang attribute</p> + + +<span style="font-family: Lato-Medium; position: absolute; visibility: hidden">A</span> +<p class="output">Actual output:</p> +<canvas id="c" class="output" width="100" height="50"lang="tr"><p class="fallback">FAIL (fallback content)</p></canvas> + +<ul id="d"></ul> +<script> +promise_test(async t => { + + var canvas = document.getElementById('c'); + var ctx = canvas.getContext('2d'); + + await document.fonts.ready; + + ctx.font = '50px Lato-Medium'; + ctx.lang = 'inherit'; + const text = 'fi'; + const tm_tr = ctx.measureText(text); + const tr_width = tm_tr.width; + + ctx.lang = 'en'; + const tm_en = ctx.measureText(text); + const en_width = tm_en.width; + + _assert(tr_width > en_width, "tr_width > en_width"); + +}, "Testing the lang attribute"); +</script> + diff --git a/tests/wpt/tests/html/canvas/offscreen/text/2d.text.measure.lang.html b/tests/wpt/tests/html/canvas/offscreen/text/2d.text.measure.lang.html new file mode 100644 index 00000000000..22183f94342 --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/text/2d.text.measure.lang.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<meta charset="UTF-8"> +<title>OffscreenCanvas test: 2d.text.measure.lang</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/html/canvas/resources/canvas-tests.js"></script> + +<h1>2d.text.measure.lang</h1> +<p class="desc">Testing the lang attribute</p> + + +<script> +promise_test(async t => { + + var canvas = new OffscreenCanvas(100, 50); + var ctx = canvas.getContext('2d'); + + var f = new FontFace("Lato-Medium", "url('/fonts/Lato-Medium.ttf')"); + f.load(); + document.fonts.add(f); + await document.fonts.ready; + + ctx.font = '50px Lato-Medium'; + ctx.lang = 'tr'; + const text = 'fi'; + const tm_tr = ctx.measureText(text); + const tr_width = tm_tr.width; + + ctx.lang = 'en'; + const tm_en = ctx.measureText(text); + const en_width = tm_en.width; + + _assert(tr_width > en_width, "tr_width > en_width"); + +}, "Testing the lang attribute"); +</script> diff --git a/tests/wpt/tests/html/canvas/offscreen/text/2d.text.measure.lang.inherit.html b/tests/wpt/tests/html/canvas/offscreen/text/2d.text.measure.lang.inherit.html new file mode 100644 index 00000000000..8b630794e1d --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/text/2d.text.measure.lang.inherit.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<meta charset="UTF-8"> +<title>OffscreenCanvas test: 2d.text.measure.lang.inherit</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/html/canvas/resources/canvas-tests.js"></script> + +<h1>2d.text.measure.lang.inherit</h1> +<p class="desc">Testing the lang attribute</p> + + +<script> +promise_test(async t => { + + var canvas = new OffscreenCanvas(100, 50); + var ctx = canvas.getContext('2d'); + + document.documentElement.setAttribute('lang','tr'); + var f = new FontFace("Lato-Medium", "url('/fonts/Lato-Medium.ttf')"); + f.load(); + document.fonts.add(f); + await document.fonts.ready; + + ctx.font = '50px Lato-Medium'; + ctx.lang = 'inherit'; + const text = 'fi'; + const tm_tr = ctx.measureText(text); + const tr_width = tm_tr.width; + + ctx.lang = 'en'; + const tm_en = ctx.measureText(text); + const en_width = tm_en.width; + + _assert(tr_width > en_width, "tr_width > en_width"); + +}, "Testing the lang attribute"); +</script> diff --git a/tests/wpt/tests/html/canvas/offscreen/text/2d.text.measure.lang.worker.js b/tests/wpt/tests/html/canvas/offscreen/text/2d.text.measure.lang.worker.js new file mode 100644 index 00000000000..5bbb2317f24 --- /dev/null +++ b/tests/wpt/tests/html/canvas/offscreen/text/2d.text.measure.lang.worker.js @@ -0,0 +1,30 @@ +// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. +// OffscreenCanvas test in a worker:2d.text.measure.lang +// Description:Testing the lang attribute +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/html/canvas/resources/canvas-tests.js"); + +promise_test(async t => { + var canvas = new OffscreenCanvas(100, 50); + var ctx = canvas.getContext('2d'); + + var f = new FontFace("Lato-Medium", "url('/fonts/Lato-Medium.ttf')"); + f.load(); + self.fonts.add(f); + await self.fonts.ready; + + ctx.font = '50px Lato-Medium'; + ctx.lang = 'tr'; + const text = 'fi'; + const tm_tr = ctx.measureText(text); + const tr_width = tm_tr.width; + + ctx.lang = 'en'; + const tm_en = ctx.measureText(text); + const en_width = tm_en.width; + + _assert(tr_width > en_width, "tr_width > en_width"); +}, "Testing the lang attribute"); +done(); diff --git a/tests/wpt/tests/html/canvas/resources/canvas-promise-test-worker.js b/tests/wpt/tests/html/canvas/resources/canvas-promise-test-worker.js index f5410efca5b..2cb50c322f7 100644 --- a/tests/wpt/tests/html/canvas/resources/canvas-promise-test-worker.js +++ b/tests/wpt/tests/html/canvas/resources/canvas-promise-test-worker.js @@ -9,7 +9,8 @@ function canvasPromiseTest( testBody, description, {testTypes = Object.values(CanvasTestType)} = {}) { if (testTypes.includes(CanvasTestType.WORKER)) { - promise_test(() => testBody(new OffscreenCanvas(300, 150)), + promise_test(() => testBody(new OffscreenCanvas(300, 150), + {canvasType: CanvasTestType.WORKER}), 'Worker: ' + description); } } diff --git a/tests/wpt/tests/html/canvas/resources/canvas-promise-test.js b/tests/wpt/tests/html/canvas/resources/canvas-promise-test.js index 1b2e2b3a584..09e01633ace 100644 --- a/tests/wpt/tests/html/canvas/resources/canvas-promise-test.js +++ b/tests/wpt/tests/html/canvas/resources/canvas-promise-test.js @@ -83,18 +83,20 @@ function canvasPromiseTest( } const canvas = document.createElement('canvas'); document.body.appendChild(canvas); - await testBody(canvas); + await testBody(canvas, {canvasType: CanvasTestType.HTML}); document.body.removeChild(canvas); }, 'HTMLCanvasElement: ' + description); } if (testTypes.includes(CanvasTestType.DETACHED_HTML)) { - promise_test(() => testBody(document.createElement('canvas')), + promise_test(() => testBody(document.createElement('canvas'), + {canvasType: CanvasTestType.DETACHED_HTML}), 'Detached HTMLCanvasElement: ' + description); } if (testTypes.includes(CanvasTestType.OFFSCREEN)) { - promise_test(() => testBody(new OffscreenCanvas(300, 150)), + promise_test(() => testBody(new OffscreenCanvas(300, 150), + {canvasType: CanvasTestType.OFFSCREEN}), 'OffscreenCanvas: ' + description); } } diff --git a/tests/wpt/tests/html/canvas/tools/yaml/text.yaml b/tests/wpt/tests/html/canvas/tools/yaml/text.yaml index 48a0429f267..900431860e2 100644 --- a/tests/wpt/tests/html/canvas/tools/yaml/text.yaml +++ b/tests/wpt/tests/html/canvas/tools/yaml/text.yaml @@ -2718,6 +2718,67 @@ @assert ctx.letterSpacing === '1px'; @assert ctx.wordSpacing === '10px'; +- name: 2d.text.measure.lang + desc: Testing the lang attribute + test_type: promise + fonts: + - Lato-Medium + code: | + {{ load_font }} + + ctx.font = '50px Lato-Medium'; + ctx.lang = 'tr'; + const text = 'fi'; + const tm_tr = ctx.measureText(text); + const tr_width = tm_tr.width; + + ctx.lang = 'en'; + const tm_en = ctx.measureText(text); + const en_width = tm_en.width; + + @assert tr_width > en_width; + variants: + - *load-font-variant-definition + +- name: 2d.text.measure.lang.inherit + desc: Testing the lang attribute + test_type: promise + canvas_types: ['HtmlCanvas', 'OffscreenCanvas'] + fonts: + - Lato-Medium + canvas: 'lang="tr"' + code: | + {{ load_font }} + + ctx.font = '50px Lato-Medium'; + ctx.lang = 'inherit'; + const text = 'fi'; + const tm_tr = ctx.measureText(text); + const tr_width = tm_tr.width; + + ctx.lang = 'en'; + const tm_en = ctx.measureText(text); + const en_width = tm_en.width; + + @assert tr_width > en_width; + variants: + - &load-font-variant-definitio-and-set-lang + HtmlCanvas: + append_variants_to_name: false + canvas_types: ['HtmlCanvas'] + load_font: |- + await document.fonts.ready; + OffscreenCanvas: + append_variants_to_name: false + canvas_types: ['OffscreenCanvas'] + load_font: |- + document.documentElement.setAttribute('lang','tr'); + var f = new FontFace("{{ fonts[0] }}", "url('/fonts/{{ fonts[0] }}.ttf')"); + f.load(); + {% set root = 'self' if canvas_type == 'Worker' else 'document' %} + {{ root }}.fonts.add(f); + await {{ root }}.fonts.ready; + - name: 2d.text.drawing.style.font-relative.spacing desc: Testing letter spacing and word spacing with font-relative length code: | diff --git a/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-01.html b/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-01.html index 2b428aa65bd..2caeed7dd00 100644 --- a/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-01.html +++ b/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-01.html @@ -8,12 +8,111 @@ <div id="log"></div> <div id="test"> <img id="a" name="b"> +<img id="test" name="test"> +<img id="test2a" name="test2b"> +<img id="test3a" name="test3b"> +<img id="test4a" name="test4b"> +<img id="test5a" name="test5b"> +<img id="test6a" name="test6b"> </div> <script> test(function() { - assert_equals(document.a, document.getElementsByTagName("img")[0]); - assert_equals(document['a'], document.getElementsByTagName("img")[0]); - assert_equals(document.b, document.getElementsByTagName("img")[0]); - assert_equals(document['b'], document.getElementsByTagName("img")[0]); + let img = document.getElementsByTagName("img")[0]; + assert_equals(document.a, img); + assert_equals(document['a'], img); + assert_equals(document.b, img); + assert_equals(document['b'], img); }, "img elements that have a name and id attribute, should be accessible by both values."); + +test(function() { + let img = document.getElementsByTagName("img")[1]; + assert_equals(document.test, img); + assert_equals(document['test'], img); +}, "img elements that have a name and id attribute with same value."); + +test(function() { + let img = document.getElementsByTagName("img")[2]; + assert_equals(document.test2a, img); + assert_equals(document['test2a'], img); + assert_equals(document.test2b, img); + assert_equals(document['test2b'], img); + + img.removeAttribute("name"); + assert_equals(document.test2a, undefined); + assert_equals(document['test2a'], undefined); + assert_equals(document.test2b, undefined); + assert_equals(document['test2b'], undefined); +}, "Dynamically removing the name attribute from img elements, should not be accessible."); + +test(function() { + let img = document.getElementsByTagName("img")[3]; + assert_equals(document.test3a, img); + assert_equals(document['test3a'], img); + assert_equals(document.test3b, img); + assert_equals(document['test3b'], img); + + img.removeAttribute("id"); + assert_equals(document.test3a, undefined); + assert_equals(document['test3a'], undefined); + assert_equals(document.test3b, img); + assert_equals(document['test3b'], img); +}, "Dynamically removing the id attribute from img elements, should still be accessible by name value."); + +test(function() { + let img = document.getElementsByTagName("img")[4]; + assert_equals(document.test4a, img); + assert_equals(document['test4a'], img); + assert_equals(document.test4b, img); + assert_equals(document['test4b'], img); + + img.name = 'test4a'; + assert_equals(document.test4a, img); + assert_equals(document['test4a'], img); + assert_equals(document.test4b, undefined); + assert_equals(document['test4b'], undefined); + + img.name = 'test4c'; + assert_equals(document.test4a, img); + assert_equals(document['test4a'], img); + assert_equals(document.test4b, undefined); + assert_equals(document['test4b'], undefined); + assert_equals(document.test4c, img); + assert_equals(document['test4c'], img); +}, "Dynamically updating the name attribute from img elements, should be accessible by values."); + +test(function() { + let img = document.getElementsByTagName("img")[5]; + assert_equals(document.test5a, img); + assert_equals(document['test5a'], img); + assert_equals(document.test5b, img); + assert_equals(document['test5b'], img); + + img.id = 'test5b'; + assert_equals(document.test5a, undefined); + assert_equals(document['test5a'], undefined); + assert_equals(document.test5b, img); + assert_equals(document['test5b'], img); + + img.id = 'test5c'; + assert_equals(document.test5a, undefined); + assert_equals(document['test5a'], undefined); + assert_equals(document.test5b, img); + assert_equals(document['test5b'], img); + assert_equals(document.test5c, img); + assert_equals(document['test5c'], img); +}, "Dynamically updating the id attribute from img elements, should be accessible by values."); + +test(function() { + let img = document.getElementsByTagName("img")[6]; + assert_equals(document.test6a, img); + assert_equals(document['test6a'], img); + assert_equals(document.test6b, img); + assert_equals(document['test6b'], img); + + img.remove(); + assert_equals(document.test6a, undefined); + assert_equals(document['test6a'], undefined); + assert_equals(document.test6b, undefined); + assert_equals(document['test6b'], undefined); +}, "img elements that is removed, should not be accessible."); </script> diff --git a/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-02.html b/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-02.html index 8c3155e7e4c..84cf64c1ffc 100644 --- a/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-02.html +++ b/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-02.html @@ -25,6 +25,14 @@ <iframe name="fail" id="test7"></iframe> <iframe name="42"></iframe> + +<iframe name="test9" id="test9"></iframe> + +<iframe></iframe> + +<iframe name="test11a"></iframe> + +<iframe name="test12"></iframe> </div> <script> test(function() { @@ -96,4 +104,71 @@ test(function() { assert_true(42 in document, '42 in document should be true'); assert_equals(document[42], iframe.contentWindow); }, "An iframe whose name looks like an array index should work."); + +test(function() { + var iframe = document.getElementsByTagName("iframe")[9]; + assert_equals(iframe.name, "test9"); + + assert_true("test9" in document, 'test9 in document should be true'); + assert_equals(document["test9"], iframe.contentWindow); + assert_equals(document.test9, iframe.contentWindow); + + iframe.removeAttribute("name"); + assert_false("test9" in document, 'test9 in document should be false'); + assert_equals(document["test9"], undefined); + assert_equals(document.test9, undefined); +}, "Dynamically removing the name attribute from iframe elements, should not be accessible."); + +test(function() { + var iframe = document.getElementsByTagName("iframe")[10]; + iframe.setAttribute("name", "test10a"); + + assert_true("test10a" in document, 'test10a in document should be true'); + assert_equals(document["test10a"], iframe.contentWindow); + assert_equals(document.test10a, iframe.contentWindow); + + iframe.setAttribute("name", "test10b"); + assert_false("test10a" in document, 'test10a in document should be false'); + assert_equals(document["test10a"], undefined); + assert_equals(document.test10a, undefined); + assert_true("test10b" in document, 'test10b in document should be true'); + assert_equals(document["test10b"], iframe.contentWindow); + assert_equals(document.test10b, iframe.contentWindow); +}, "Dynamically updating the name attribute from iframe elements, should be accessible by its name."); + +test(function() { + var iframe = document.getElementsByTagName("iframe")[11]; + assert_equals(iframe.name, "test11a"); + + assert_true("test11a" in document, 'test11a in document should be true'); + assert_equals(document["test11a"], iframe.contentWindow); + assert_equals(document.test11a, iframe.contentWindow); + + iframe.setAttribute("id", "test11a"); + assert_true("test11a" in document, 'test11a in document should be true'); + assert_equals(document["test11a"], iframe.contentWindow); + assert_equals(document.test11a, iframe.contentWindow); + + iframe.setAttribute("id", "test11b"); + assert_true("test11a" in document, 'test11a in document should be true'); + assert_equals(document["test11a"], iframe.contentWindow); + assert_equals(document.test11a, iframe.contentWindow); + assert_false("test11b" in document, 'test11b in document should be false'); + assert_equals(document["test11b"], undefined); + assert_equals(document.test11b, undefined); +}, "Dynamically updating the id attribute from iframe elements, should be accessible only by its name."); + +test(function() { + var iframe = document.getElementsByTagName("iframe")[12]; + assert_equals(iframe.name, "test12"); + + assert_true("test12" in document, 'test12 in document should be true'); + assert_equals(document["test12"], iframe.contentWindow); + assert_equals(document.test12, iframe.contentWindow); + + iframe.remove(); + assert_false("test12" in document, 'test12 in document should be false'); + assert_equals(document["test12"], undefined); + assert_equals(document.test12, undefined); +}, "iframe elements that is removed, should not be accessible."); </script> diff --git a/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-04.html b/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-04.html index b7c3ef8e9bb..2b4a3c55b71 100644 --- a/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-04.html +++ b/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-04.html @@ -26,6 +26,14 @@ <form id=test7 name=fail></form> <form name=test8 id=fail></form> + +<form name=test9 id=test9></form> + +<form></form> + +<form name="test11a"></form> + +<form name="test12"></form> </div> <script> test(function() { @@ -101,4 +109,71 @@ test(function() { assert_true("test8" in document, '"test8" in document should be true'); assert_equals(document.test8, form); }, "An id shouldn't affect getting an form by name"); + +test(function() { + var form = document.getElementsByTagName("form")[12]; + assert_equals(form.name, "test9"); + + assert_true("test9" in document, 'test9 in document should be true'); + assert_equals(document["test9"], form); + assert_equals(document.test9, form); + + form.removeAttribute("name"); + assert_false("test9" in document, 'test9 in document should be false'); + assert_equals(document["test9"], undefined); + assert_equals(document.test9, undefined); +}, "Dynamically removing the name attribute from form elements, should not be accessible."); + +test(function() { + var form = document.getElementsByTagName("form")[13]; + form.setAttribute("name", "test10a"); + + assert_true("test10a" in document, 'test10a in document should be true'); + assert_equals(document["test10a"], form); + assert_equals(document.test10a, form); + + form.setAttribute("name", "test10b"); + assert_false("test10a" in document, 'test10a in document should be false'); + assert_equals(document["test10a"], undefined); + assert_equals(document.test10a, undefined); + assert_true("test10b" in document, 'test10b in document should be true'); + assert_equals(document["test10b"], form); + assert_equals(document.test10b, form); +}, "Dynamically updating the name attribute from form elements, should be accessible by its name."); + +test(function() { + var form = document.getElementsByTagName("form")[14]; + assert_equals(form.name, "test11a"); + + assert_true("test11a" in document, 'test11a in document should be true'); + assert_equals(document["test11a"], form); + assert_equals(document.test11a, form); + + form.setAttribute("id", "test11a"); + assert_true("test11a" in document, 'test11a in document should be true'); + assert_equals(document["test11a"], form); + assert_equals(document.test11a, form); + + form.setAttribute("id", "test11b"); + assert_true("test11a" in document, 'test11a in document should be true'); + assert_equals(document["test11a"], form); + assert_equals(document.test11a, form); + assert_false("test11b" in document, 'test11b in document should be false'); + assert_equals(document["test11b"], undefined); + assert_equals(document.test11b, undefined); +}, "Dynamically updating the id attribute from form elements, should be accessible only by its name."); + +test(function() { + var form = document.getElementsByTagName("form")[15]; + assert_equals(form.name, "test12"); + + assert_true("test12" in document, 'test12 in document should be true'); + assert_equals(document["test12"], form); + assert_equals(document.test12, form); + + form.remove(); + assert_false("test12" in document, 'test12 in document should be false'); + assert_equals(document["test12"], undefined); + assert_equals(document.test12, undefined); +}, "form elements that is removed, should not be accessible."); </script> diff --git a/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-05.html b/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-05.html index 843ce357962..b38872498b6 100644 --- a/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-05.html +++ b/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-05.html @@ -26,6 +26,14 @@ <embed id=test7 name=fail></embed> <embed name=test8 id=fail></embed> + +<embed name="test9" id="test9"></embed> + +<embed></embed> + +<embed name="test11a"></embed> + +<embed name="test12"></embed> </div> <script> test(function() { @@ -101,4 +109,71 @@ test(function() { assert_true("test8" in document, '"test8" in document should be true'); assert_equals(document.test8, embed); }, "An id shouldn't affect getting an embed by name"); + +test(function() { + var embed = document.getElementsByTagName("embed")[12]; + assert_equals(embed.name, "test9"); + + assert_true("test9" in document, 'test9 in document should be true'); + assert_equals(document["test9"], embed); + assert_equals(document.test9, embed); + + embed.removeAttribute("name"); + assert_false("test9" in document, 'test9 in document should be false'); + assert_equals(document["test9"], undefined); + assert_equals(document.test9, undefined); +}, "Dynamically removing the name attribute from embed elements, should not be accessible."); + +test(function() { + var embed = document.getElementsByTagName("embed")[13]; + embed.setAttribute("name", "test10a"); + + assert_true("test10a" in document, 'test10a in document should be true'); + assert_equals(document["test10a"], embed); + assert_equals(document.test10a, embed); + + embed.setAttribute("name", "test10b"); + assert_false("test10a" in document, 'test10a in document should be false'); + assert_equals(document["test10a"], undefined); + assert_equals(document.test10a, undefined); + assert_true("test10b" in document, 'test10b in document should be true'); + assert_equals(document["test10b"], embed); + assert_equals(document.test10b, embed); +}, "Dynamically updating the name attribute from embed elements, should be accessible by its name."); + +test(function() { + var embed = document.getElementsByTagName("embed")[14]; + assert_equals(embed.name, "test11a"); + + assert_true("test11a" in document, 'test11a in document should be true'); + assert_equals(document["test11a"], embed); + assert_equals(document.test11a, embed); + + embed.setAttribute("id", "test11a"); + assert_true("test11a" in document, 'test11a in document should be true'); + assert_equals(document["test11a"], embed); + assert_equals(document.test11a, embed); + + embed.setAttribute("id", "test11b"); + assert_true("test11a" in document, 'test11a in document should be true'); + assert_equals(document["test11a"], embed); + assert_equals(document.test11a, embed); + assert_false("test11b" in document, 'test11b in document should be false'); + assert_equals(document["test11b"], undefined); + assert_equals(document.test11b, undefined); +}, "Dynamically updating the id attribute from embed elements, should be accessible only by its name."); + +test(function() { + var embed = document.getElementsByTagName("embed")[15]; + assert_equals(embed.name, "test12"); + + assert_true("test12" in document, 'test12 in document should be true'); + assert_equals(document["test12"], embed); + assert_equals(document.test12, embed); + + embed.remove(); + assert_false("test12" in document, 'test12 in document should be false'); + assert_equals(document["test12"], undefined); + assert_equals(document.test12, undefined); +}, "embed elements that is removed, should not be accessible."); </script> diff --git a/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-06.html b/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-06.html index 15a72b5f6ba..592535f0d6a 100644 --- a/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-06.html +++ b/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-06.html @@ -23,9 +23,11 @@ <img id=test6> <img name=test6> -<img id=test7 name=fail> +<img name="test7"> -<img name=test8 id=fail> +<img> + +<img name="test9"> </div> <script> test(function() { @@ -88,17 +90,46 @@ test(function() { test(function() { var img = document.getElementsByTagName("img")[10]; - assert_equals(img.id, "test7"); + assert_equals(img.name, "test7"); - assert_true("test7" in document, '"test7" in document should be true'); + assert_true("test7" in document, 'test7 in document should be true'); + assert_equals(document["test7"], img); assert_equals(document.test7, img); -}, "A name should affect getting an img by id"); + + img.removeAttribute("name"); + assert_false("test7" in document, 'test7 in document should be false'); + assert_equals(document["test7"], undefined); + assert_equals(document.test7, undefined); +}, "Dynamically removing the name attribute from img elements, should not be accessible."); test(function() { var img = document.getElementsByTagName("img")[11]; - assert_equals(img.name, "test8"); + img.setAttribute("name", "test8a"); + + assert_true("test8a" in document, 'test8a in document should be true'); + assert_equals(document["test8a"], img); + assert_equals(document.test8a, img); - assert_true("test8" in document, '"test8" in document should be true'); - assert_equals(document.test8, img); -}, "An id shouldn't affect getting an img by name"); + img.setAttribute("name", "test8b"); + assert_false("test8a" in document, 'test8a in document should be false'); + assert_equals(document["test8a"], undefined); + assert_equals(document.test8a, undefined); + assert_true("test8b" in document, 'test8b in document should be true'); + assert_equals(document["test8b"], img); + assert_equals(document.test8b, img); +}, "Dynamically updating the name attribute from img elements, should be accessible by its name."); + +test(function() { + var img = document.getElementsByTagName("img")[12]; + assert_equals(img.name, "test9"); + + assert_true("test9" in document, 'test9 in document should be true'); + assert_equals(document["test9"], img); + assert_equals(document.test9, img); + + img.remove(); + assert_false("test9" in document, 'test9 in document should be false'); + assert_equals(document["test9"], undefined); + assert_equals(document.test9, undefined); +}, "img elements that is removed, should not be accessible."); </script> diff --git a/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-07.html b/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-07.html index fc3f06c01b9..69a3bb0f09a 100644 --- a/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-07.html +++ b/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-07.html @@ -22,9 +22,15 @@ <object id=test6></object> <object name=test6></object> -<object id=test7 name=fail></object> +<object name=test7></object> -<object name=test8 id=fail></object> +<object id=test8></object> + +<object id=test9a></object> + +<object name=test10a></object> + +<object name=test11a id=test11b></object> </div> <script> test(function() { @@ -93,17 +99,114 @@ test(function() { test(function() { var object = document.getElementsByTagName("object")[10]; - assert_equals(object.id, "test7"); + assert_equals(object.name, "test7"); - assert_true("test7" in document, '"test7" in document should be true'); + assert_true("test7" in document, 'test7 in document should be true'); + assert_equals(document["test7"], object); assert_equals(document.test7, object); -}, "A name shouldn't affect getting an object by id"); + + object.removeAttribute("name"); + assert_false("test7" in document, 'test7 in document should be false'); + assert_equals(document["test7"], undefined); + assert_equals(document.test7, undefined); +}, "Dynamically removing the name attribute from object elements, should not be accessible."); test(function() { var object = document.getElementsByTagName("object")[11]; - assert_equals(object.name, "test8"); + assert_equals(object.id, "test8"); - assert_true("test8" in document, '"test8" in document should be true'); + assert_true("test8" in document, 'test8 in document should be true'); + assert_equals(document["test8"], object); assert_equals(document.test8, object); -}, "An id shouldn't affect getting an object by name"); + + object.removeAttribute("id"); + assert_false("test8" in document, 'test8 in document should be false'); + assert_equals(document["test8"], undefined); + assert_equals(document.test8, undefined); +}, "Dynamically removing the id attribute from object elements, should not be accessible."); + +test(function() { + var object = document.getElementsByTagName("object")[12]; + assert_equals(object.id, "test9a"); + assert_true("test9a" in document, 'test9a in document should be true'); + assert_equals(document["test9a"], object); + assert_equals(document.test9a, object); + + object.setAttribute("name", "test9a"); + assert_true("test9a" in document, 'test9a in document should be true'); + assert_equals(document["test9a"], object); + assert_equals(document.test9a, object); + + object.setAttribute("name", "test9b"); + assert_true("test9a" in document, 'test9a in document should be true'); + assert_equals(document["test9a"], object); + assert_equals(document.test9a, object); + assert_true("test9b" in document, 'test9b in document should be true'); + assert_equals(document["test9b"], object); + assert_equals(document.test9b, object); + + object.setAttribute("name", "test9c"); + assert_true("test9a" in document, 'test9a in document should be true'); + assert_equals(document["test9a"], object); + assert_equals(document.test9a, object); + assert_false("test9b" in document, 'test9b in document should be false'); + assert_equals(document["test9b"], undefined); + assert_equals(document.test9b, undefined); + assert_true("test9c" in document, 'test9c in document should be true'); + assert_equals(document["test9c"], object); + assert_equals(document.test9c, object); +}, "Dynamically updating the name attribute from object elements, should be accessible by its name and id."); + +test(function() { + var object = document.getElementsByTagName("object")[13]; + assert_equals(object.name, "test10a"); + assert_true("test10a" in document, 'test11a in document should be true'); + assert_equals(document["test10a"], object); + assert_equals(document.test10a, object); + + object.setAttribute("id", "test10a"); + assert_true("test10a" in document, 'test10a in document should be true'); + assert_equals(document["test10a"], object); + assert_equals(document.test10a, object); + + object.setAttribute("id", "test10b"); + assert_true("test10a" in document, 'test10a in document should be true'); + assert_equals(document["test10a"], object); + assert_equals(document.test10a, object); + assert_true("test10b" in document, 'test10b in document should be false'); + assert_equals(document["test10b"], object); + assert_equals(document.test10b, object); + + object.setAttribute("id", "test10c"); + assert_true("test10a" in document, 'test10a in document should be true'); + assert_equals(document["test10a"], object); + assert_equals(document.test10a, object); + assert_false("test10b" in document, 'test10b in document should be false'); + assert_equals(document["test10b"], undefined); + assert_equals(document.test10b, undefined); + assert_true("test10c" in document, 'test10b in document should be false'); + assert_equals(document["test10c"], object); + assert_equals(document.test10c, object); +}, "Dynamically updating the id attribute from object elements, should be accessible by its name and id."); + +test(function() { + var object = document.getElementsByTagName("object")[14]; + assert_equals(object.name, "test11a"); + assert_equals(object.id, "test11b"); + + assert_true("test11a" in document, 'test11a in document should be true'); + assert_equals(document["test11a"], object); + assert_equals(document.test11a, object); + assert_true("test11b" in document, 'test11b in document should be true'); + assert_equals(document["test11b"], object); + assert_equals(document.test11b, object); + + object.remove(); + assert_false("test11a" in document, 'test11a in document should be false'); + assert_equals(document["test11a"], undefined); + assert_equals(document.test11a, undefined); + assert_false("test11b" in document, 'test11b in document should be false'); + assert_equals(document["test11b"], undefined); + assert_equals(document.test11b, undefined); +}, "object elements that is removed, should not be accessible."); </script> diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-040.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-040.html new file mode 100644 index 00000000000..3ef1fefc4f8 --- /dev/null +++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-040.html @@ -0,0 +1,49 @@ +<!DOCTYPE html> +<head> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/utils.js"></script> +<title>`link rel=expect` is unblocked for dynamically inserted element</title> + +<link rel=expect href="#target" blocking="render"> +<script> +async_test((t) => { + requestAnimationFrame(() => { + t.step(() => assert_true(!!document.getElementById("target"), "The target element should be present when rendering is unblocked")); + t.step(() => assert_false(!!document.getElementById("last"), "the target element should unblock rendering")); + t.done(); + }); +}, "blocking defers frames until full parsing"); +</script> +</head> +<body> + <div id="first"> + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum augue + nibh, venenatis a ligula in, tempus pharetra urna. Fusce semper, velit + tincidunt lobortis sollicitudin, sapien velit fermentum odio, ultricies + tempor mi est eget ipsum egestas. + </div> + <script> + generateParserDelay(); + </script> + <a id="fold"> + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum augue + nibh, venenatis a ligula in, tempus pharetra urna. Fusce semper, velit + tincidunt lobortis sollicitudin, sapien velit fermentum odio, ultricies + tempor mi est eget ipsum egestas. + </a> + <script> + const target = document.createElement("div"); + target.id = "target"; + document.body.append(target); + </script> + <script> + generateParserDelay(); + </script> + <div id="last"> + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum augue + nibh, venenatis a ligula in, tempus pharetra urna. Fusce semper, velit + tincidunt lobortis sollicitudin, sapien velit fermentum odio, ultricies + tempor mi est eget ipsum egestas. + </div> +</body> diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-041.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-041.html new file mode 100644 index 00000000000..c6d87710f7e --- /dev/null +++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-041.html @@ -0,0 +1,49 @@ +<!DOCTYPE html> +<head> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/utils.js"></script> +<title>`link rel=expect` is unblocked for dynamically inserted anchor with name</title> + +<link rel=expect href="#target" blocking="render"> +<script> +async_test((t) => { + requestAnimationFrame(() => { + t.step(() => assert_equals(document.getElementsByName("target").length, 1, "The target element should be present when rendering is unblocked")); + t.step(() => assert_equals(document.getElementById("last"), null, "the target element should unblock rendering")); + t.done(); + }); +}, "blocking defers frames until full parsing"); +</script> +</head> +<body> + <div id="first"> + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum augue + nibh, venenatis a ligula in, tempus pharetra urna. Fusce semper, velit + tincidunt lobortis sollicitudin, sapien velit fermentum odio, ultricies + tempor mi est eget ipsum egestas. + </div> + <script> + generateParserDelay(); + </script> + <a id="fold"> + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum augue + nibh, venenatis a ligula in, tempus pharetra urna. Fusce semper, velit + tincidunt lobortis sollicitudin, sapien velit fermentum odio, ultricies + tempor mi est eget ipsum egestas. + </a> + <script> + const target = document.createElement("a"); + target.name = "target"; + document.body.append(target); + </script> + <script> + generateParserDelay(); + </script> + <div id="last"> + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum augue + nibh, venenatis a ligula in, tempus pharetra urna. Fusce semper, velit + tincidunt lobortis sollicitudin, sapien velit fermentum odio, ultricies + tempor mi est eget ipsum egestas. + </div> +</body> diff --git a/tests/wpt/tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-multicol-column-height.html b/tests/wpt/tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-multicol-column-height.html new file mode 100644 index 00000000000..afd2425221f --- /dev/null +++ b/tests/wpt/tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-multicol-column-height.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<title>fieldset multicol with auto count, non-auto width</title> +<link rel="help" href="https://html.spec.whatwg.org/multipage/rendering.html#the-fieldset-and-legend-elements"> +<link rel="help" href="https://drafts.csswg.org/css-multicol-2/#ch"> +<link rel="help" href="https://drafts.csswg.org/css-multicol-2/#cwr"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<style> + #test { margin: 0; padding: 0; border: none } + #test, #ref { columns:3; column-height:1.5em; column-wrap:wrap; gap:20px; } + p { margin: 0 } +</style> +<fieldset id="test"> + <p>1</p> + <p>2</p> + <p>3</p> + <p>4</p> + <p>5</p> +</fieldset> +<div id="ref"> + <p>1</p> + <p>2</p> + <p>3</p> + <p>4</p> + <p>5</p> +</div> +<script> + test(() => { + assert_equals(getComputedStyle(document.getElementById('test')).height, + getComputedStyle(document.getElementById('ref')).height); + }); +</script> diff --git a/tests/wpt/tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-multicol-only-column-count.html b/tests/wpt/tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-multicol-only-column-count.html new file mode 100644 index 00000000000..9f794007a47 --- /dev/null +++ b/tests/wpt/tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-multicol-only-column-count.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<title>fieldset multicol with auto count, non-auto width</title> +<link rel="help" href="https://html.spec.whatwg.org/multipage/rendering.html#the-fieldset-and-legend-elements"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<style> + #test { margin: 0; padding: 0; border: none } + #test, #ref { width:min-content; column-count:4; } + p { margin: 0 } +</style> +<fieldset id="test"> + <p>1</p> + <p>2</p> + <p>3</p> + <p>4</p> + <p>5</p> +</fieldset> +<div id="ref"> + <p>1</p> + <p>2</p> + <p>3</p> + <p>4</p> + <p>5</p> +</div> +<script> + test(() => { + assert_equals(getComputedStyle(document.getElementById('test')).height, + getComputedStyle(document.getElementById('ref')).height); + }); +</script> diff --git a/tests/wpt/tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-multicol-only-column-width.html b/tests/wpt/tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-multicol-only-column-width.html new file mode 100644 index 00000000000..e3fd552439a --- /dev/null +++ b/tests/wpt/tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-multicol-only-column-width.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<title>fieldset multicol with auto count, non-auto width</title> +<link rel="help" href="https://html.spec.whatwg.org/multipage/rendering.html#the-fieldset-and-legend-elements"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<style> + #test { margin: 0; padding: 0; border: none } + #test, #ref { width:500px; column-width:100px; } + p { margin: 0 } +</style> +<fieldset id="test"> + <p>1</p> + <p>2</p> + <p>3</p> + <p>4</p> + <p>5</p> +</fieldset> +<div id="ref"> + <p>1</p> + <p>2</p> + <p>3</p> + <p>4</p> + <p>5</p> +</div> +<script> + test(() => { + assert_equals(getComputedStyle(document.getElementById('test')).height, + getComputedStyle(document.getElementById('ref')).height); + }); +</script> diff --git a/tests/wpt/tests/html/rendering/replaced-elements/the-option-element/option-label-whitespace-2-ref.html b/tests/wpt/tests/html/rendering/replaced-elements/the-option-element/option-label-whitespace-2-ref.html new file mode 100644 index 00000000000..b0567c2b4e3 --- /dev/null +++ b/tests/wpt/tests/html/rendering/replaced-elements/the-option-element/option-label-whitespace-2-ref.html @@ -0,0 +1,4 @@ +<!DOCTYPE html> +<select> + <option></option> +</select> diff --git a/tests/wpt/tests/html/rendering/replaced-elements/the-option-element/option-label-whitespace-2.html b/tests/wpt/tests/html/rendering/replaced-elements/the-option-element/option-label-whitespace-2.html new file mode 100644 index 00000000000..95b3a3c73db --- /dev/null +++ b/tests/wpt/tests/html/rendering/replaced-elements/the-option-element/option-label-whitespace-2.html @@ -0,0 +1,8 @@ +<!DOCTYPE html> +<link rel=author href="mailto:jarhar@chromium.org"> +<link rel=help href="https://github.com/whatwg/html/issues/10955"> +<link rel=mismatch href="option-label-whitespace-2-ref.html"> + +<select> + <option label=" "></option> +</select> diff --git a/tests/wpt/tests/html/rendering/widgets/field-sizing-textarea-relayout.html b/tests/wpt/tests/html/rendering/widgets/field-sizing-textarea-relayout.html index 1e18bd20703..579462ca2f5 100644 --- a/tests/wpt/tests/html/rendering/widgets/field-sizing-textarea-relayout.html +++ b/tests/wpt/tests/html/rendering/widgets/field-sizing-textarea-relayout.html @@ -2,7 +2,7 @@ <html class="reftest-wait"> <link rel="help" href="https://drafts.csswg.org/css-ui-4/#field-sizing"> <link rel=match href="field-sizing-textarea-relayout-ref.html"> -<meta name="fuzzy" content="maxDifference=153; totalPixels=2" /> +<meta name="fuzzy" content="maxDifference=0-153; totalPixels=0-2" /> <script src="/common/reftest-wait.js"></script> <body> <textarea id="textarea" style="field-sizing: content"></textarea><textarea></textarea> diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/option-color-inheritance.html b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/option-color-inheritance.html new file mode 100644 index 00000000000..d96124d008c --- /dev/null +++ b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/option-color-inheritance.html @@ -0,0 +1,21 @@ +<!DOCTYPE html> +<link rel=author href="mailto:jarhar@chromium.org"> +<link rel=help href="https://issues.chromium.org/issues/404464591"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<select> + <option>option</option> +</select> +<style> +select { + color: rgb(12, 34, 56); +} +</style> + +<script> +test(() => { + const style = getComputedStyle(document.querySelector('option')); + assert_equals(style.color, 'rgb(12, 34, 56)', 'color'); +}, 'option elements should inherit color from their parent select element.'); +</script> diff --git a/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/focus-after-close.html b/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/focus-after-close.html index 93baf65cf60..7137edcd1a1 100644 --- a/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/focus-after-close.html +++ b/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/focus-after-close.html @@ -167,7 +167,12 @@ async function test_move_focus_dont_scroll_viewport(showModal) { document.body.appendChild(outViewPortButton); await new Promise(resolve => { - document.addEventListener("scroll", resolve, { once: true }); + document.addEventListener("scroll", () => { + if (resolve && document.documentElement.scrollTop) { + resolve(); + resolve = null; + } + }); outViewPortButton.focus(); }); diff --git a/tests/wpt/tests/largest-contentful-paint/WEB_FEATURES.yml b/tests/wpt/tests/largest-contentful-paint/WEB_FEATURES.yml new file mode 100644 index 00000000000..fbd4cc58df9 --- /dev/null +++ b/tests/wpt/tests/largest-contentful-paint/WEB_FEATURES.yml @@ -0,0 +1,3 @@ +features: +- name: largest-contentful-paint + files: "**" diff --git a/tests/wpt/tests/lint.ignore b/tests/wpt/tests/lint.ignore index 65e22dccbc1..8df85b016fe 100644 --- a/tests/wpt/tests/lint.ignore +++ b/tests/wpt/tests/lint.ignore @@ -287,6 +287,8 @@ SET TIMEOUT: shadow-dom/scroll-to-the-fragment-in-shadow-tree.html SET TIMEOUT: shadow-dom/slotchange-event.html SET TIMEOUT: trusted-types/support/block-string-assignment-to-DOMWindowTimers-setTimeout-setInterval.js SET TIMEOUT: trusted-types/support/DOMWindowTimers-setTimeout-setInterval.js +SET TIMEOUT: trusted-types/support/should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker.js +SET TIMEOUT: trusted-types/support/trusted-types-reporting-check-report-sink-mismatch.js SET TIMEOUT: trusted-types/support/trusted-types-reporting-for-DOMWindowTimers-setTimeout-setInterval.js SET TIMEOUT: user-timing/* SET TIMEOUT: web-animations/crashtests/reparent-animating-element-002.html diff --git a/tests/wpt/tests/media-capabilities/decodingInfo.any.js b/tests/wpt/tests/media-capabilities/decodingInfo.any.js index 2fd3743b442..e7a0e6ae430 100644 --- a/tests/wpt/tests/media-capabilities/decodingInfo.any.js +++ b/tests/wpt/tests/media-capabilities/decodingInfo.any.js @@ -228,97 +228,6 @@ promise_test(t => { promise_test(t => { return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({ type: 'file', - video: { - contentType: 'video/webm; codecs="vp09.00.10.08"', - width: 800, - height: 600, - bitrate: 3000, - framerate: '24000/1001', - } - })); -}, "Test that decodingInfo rejects framerate in the form of x/y"); - -promise_test(t => { - return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({ - type: 'file', - video: { - contentType: 'video/webm; codecs="vp09.00.10.08"', - width: 800, - height: 600, - bitrate: 3000, - framerate: '24000/0', - } - })); -}, "Test that decodingInfo rejects framerate in the form of x/0"); - -promise_test(t => { - return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({ - type: 'file', - video: { - contentType: 'video/webm; codecs="vp09.00.10.08"', - width: 800, - height: 600, - bitrate: 3000, - framerate: '0/10001', - } - })); -}, "Test that decodingInfo rejects framerate in the form of 0/y"); - -promise_test(t => { - return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({ - type: 'file', - video: { - contentType: 'video/webm; codecs="vp09.00.10.08"', - width: 800, - height: 600, - bitrate: 3000, - framerate: '-24000/10001', - } - })); -}, "Test that decodingInfo rejects framerate in the form of -x/y"); - -promise_test(t => { - return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({ - type: 'file', - video: { - contentType: 'video/webm; codecs="vp09.00.10.08"', - width: 800, - height: 600, - bitrate: 3000, - framerate: '24000/-10001', - } - })); -}, "Test that decodingInfo rejects framerate in the form of x/-y"); - -promise_test(t => { - return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({ - type: 'file', - video: { - contentType: 'video/webm; codecs="vp09.00.10.08"', - width: 800, - height: 600, - bitrate: 3000, - framerate: '24000/', - } - })); -}, "Test that decodingInfo rejects framerate in the form of x/"); - -promise_test(t => { - return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({ - type: 'file', - video: { - contentType: 'video/webm; codecs="vp09.00.10.08"', - width: 800, - height: 600, - bitrate: 3000, - framerate: '1/3x', - } - })); -}, "Test that decodingInfo rejects framerate with trailing unallowed characters"); - -promise_test(t => { - return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({ - type: 'file', audio: { contentType: 'fgeoa' }, })); }, "Test that decodingInfo rejects if the audio configuration contentType doesn't parse"); diff --git a/tests/wpt/tests/media-capabilities/encodingInfo.any.js b/tests/wpt/tests/media-capabilities/encodingInfo.any.js index 14612238e60..97b6c196f09 100644 --- a/tests/wpt/tests/media-capabilities/encodingInfo.any.js +++ b/tests/wpt/tests/media-capabilities/encodingInfo.any.js @@ -198,97 +198,6 @@ promise_test(t => { promise_test(t => { return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({ type: 'record', - video: { - contentType: 'video/webm; codecs="vp09.00.10.08"', - width: 800, - height: 600, - bitrate: 3000, - framerate: '24000/1001', - } - })); -}, "Test that encodingInfo rejects framerate in the form of x/y"); - -promise_test(t => { - return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({ - type: 'record', - video: { - contentType: 'video/webm; codecs="vp09.00.10.08"', - width: 800, - height: 600, - bitrate: 3000, - framerate: '24000/0', - } - })); -}, "Test that encodingInfo rejects framerate in the form of x/0"); - -promise_test(t => { - return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({ - type: 'record', - video: { - contentType: 'video/webm; codecs="vp09.00.10.08"', - width: 800, - height: 600, - bitrate: 3000, - framerate: '0/10001', - } - })); -}, "Test that encodingInfo rejects framerate in the form of 0/y"); - -promise_test(t => { - return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({ - type: 'record', - video: { - contentType: 'video/webm; codecs="vp09.00.10.08"', - width: 800, - height: 600, - bitrate: 3000, - framerate: '-24000/10001', - } - })); -}, "Test that encodingInfo rejects framerate in the form of -x/y"); - -promise_test(t => { - return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({ - type: 'record', - video: { - contentType: 'video/webm; codecs="vp09.00.10.08"', - width: 800, - height: 600, - bitrate: 3000, - framerate: '24000/-10001', - } - })); -}, "Test that encodingInfo rejects framerate in the form of x/-y"); - -promise_test(t => { - return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({ - type: 'record', - video: { - contentType: 'video/webm; codecs="vp09.00.10.08"', - width: 800, - height: 600, - bitrate: 3000, - framerate: '24000/', - } - })); -}, "Test that encodingInfo rejects framerate in the form of x/"); - -promise_test(t => { - return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({ - type: 'record', - video: { - contentType: 'video/webm; codecs="vp09.00.10.08"', - width: 800, - height: 600, - bitrate: 3000, - framerate: '1/3x', - } - })); -}, "Test that encodingInfo rejects framerate with trailing unallowed characters"); - -promise_test(t => { - return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({ - type: 'record', audio: { contentType: 'fgeoa' }, })); }, "Test that encodingInfo rejects if the audio configuration contenType doesn't parse"); diff --git a/tests/wpt/tests/mediacapture-record/MediaRecorder-canvas-media-source.https.html b/tests/wpt/tests/mediacapture-record/MediaRecorder-canvas-media-source.https.html index 0c5f47f0ef8..847e6618b3b 100644 --- a/tests/wpt/tests/mediacapture-record/MediaRecorder-canvas-media-source.https.html +++ b/tests/wpt/tests/mediacapture-record/MediaRecorder-canvas-media-source.https.html @@ -30,8 +30,14 @@ </head> <body> - <canvas id="canvas"></canvas> <script> +async function createWorker(script) { + script += "self.postMessage('ready');"; + const blob = new Blob([script], { type: 'text/javascript' }); + const url = URL.createObjectURL(blob); + const worker = new Worker(url); + await new Promise(resolve => worker.onmessage = resolve); +} async_test(test => { const CANVAS_WIDTH = 256; @@ -100,49 +106,61 @@ async_test(test => { return; } - const canvas = document.querySelector("canvas"); - const ctx = canvas.getContext("2d", { - alpha: false, - }); - - canvas.width = CANVAS_WIDTH; - canvas.height = CANVAS_HEIGHT; - const {startCamera, stopCamera} = useUserMedia(CAMERA_CONSTRAINTS); startCamera().then(async stream => { const videoTrack = stream.getVideoTracks()[0]; - const { readable: readableStream } = new MediaStreamTrackProcessor({ - track: videoTrack - }); - - const composedTrackGenerator = new MediaStreamTrackGenerator({ - kind: "video" - }); - const sink = composedTrackGenerator.writable; - - ctx.fillStyle = "#333"; - ctx.fillRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT); - - const transformer = new TransformStream({ - async transform(cameraFrame, controller) { - if (cameraFrame && cameraFrame?.codedWidth > 0) { - const leftPos = (CANVAS_WIDTH - cameraFrame.displayWidth) / 2; - const topPos = (CANVAS_HEIGHT - cameraFrame.displayHeight) / 2; - - ctx.drawImage(cameraFrame, leftPos, topPos); - - const newFrame = new VideoFrame(canvas, { - timestamp: cameraFrame.timestamp - }); - cameraFrame.close(); - controller.enqueue(newFrame); - } + const worker = await createWorker(` + const CANVAS_WIDTH = ${CANVAS_WIDTH}; + const CANVAS_HEIGHT = ${CANVAS_HEIGHT}; + onmessage = e => { + const videoTrack = e.data; + const { readable: readableStream } = new MediaStreamTrackProcessor({ + track: videoTrack + }); + + const composedTrackGenerator = new VideoTrackGenerator(); + const sink = composedTrackGenerator.writable; + + const canvas = new OffscreenCanvas(CANVAS_WIDTH, CANVAS_HEIGHT); + const ctx = canvas.getContext("2d", { + alpha: false, + }); + ctx.fillStyle = "#333"; + ctx.fillRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT); + + const transformer = new TransformStream({ + async transform(cameraFrame, controller) { + if (cameraFrame && cameraFrame?.codedWidth > 0) { + const leftPos = (CANVAS_WIDTH - cameraFrame.displayWidth) / 2; + const topPos = (CANVAS_HEIGHT - cameraFrame.displayHeight) / 2; + + ctx.drawImage(cameraFrame, leftPos, topPos); + + const newFrame = new VideoFrame(canvas, { + timestamp: cameraFrame.timestamp + }); + cameraFrame.close(); + controller.enqueue(newFrame); + } + } + }); + + readableStream.pipeThrough(transformer).pipeTo(sink); + self.postMessage(composedTrackGenerator.track, [composedTrackGenerator.track]); } + `); + try { + worker.postMessage(videoTrack, [videoTrack]); + } catch(e) { + test.step_func_done(() => { + assert_unreached("MediaStreamTrack transfer not supported"); + })(); + } + const composedTrack = await new Promise((resolve, reject) => { + worker.onmessage = e => resolve(e.data); + test.step_timeout(() => reject("unable to get composited track"), 2000); }); - - readableStream.pipeThrough(transformer).pipeTo(sink); - - const compositedMediaStream = new MediaStream([composedTrackGenerator]); + const compositedMediaStream = new MediaStream([composedTrack]); useMediaRecorder(compositedMediaStream, mimeType, (size => { if (size > THRESHOLD_FOR_EMPTY_FRAMES) { @@ -153,7 +171,6 @@ async_test(test => { })); }); }, "MediaRecorder returns frames containing video content"); - </script> </body> diff --git a/tests/wpt/tests/mediacapture-record/legacy/MediaRecorder-canvas-media-source-legacy.https.html b/tests/wpt/tests/mediacapture-record/legacy/MediaRecorder-canvas-media-source-legacy.https.html new file mode 100644 index 00000000000..bcfc2af2737 --- /dev/null +++ b/tests/wpt/tests/mediacapture-record/legacy/MediaRecorder-canvas-media-source-legacy.https.html @@ -0,0 +1,165 @@ +<!doctype html> +<html> +<meta name="timeout" content="long"> + +<head> + <title>MediaRecorder canvas media source</title> + <meta name=variant content="?mimeType=''"> + <meta name=variant content="?mimeType=video/webm;codecs=vp8,opus"> + <meta name=variant content="?mimeType=video/webm;codecs=vp9,opus"> + <meta name=variant content="?mimeType=video/webm;codecs=av1,opus"> + <meta name=variant content="?mimeType=video/mp4;codecs=avc1.64003E,mp4a.40.2"> + <meta name=variant content="?mimeType=video/mp4;codecs=avc3.64003E,mp4a.40.2"> + <meta name=variant content="?mimeType=video/mp4;codecs=vp9,opus"> + <meta name=variant content="?mimeType=video/mp4;codecs=av01,opus"> + <meta name=variant content="?mimeType=video/mp4;codecs=av01,mp4a.40.2"> + <meta name=variant content="?mimeType=video/mp4;codecs=hvc1.1.6.L186.B0,opus"> + <meta name=variant content="?mimeType=video/mp4;codecs=hev1.1.6.L186.B0,opus"> + <meta name=variant content="?mimeType=video/mp4;codecs=hvc1.1.6.L186.B0,mp4a.40.2"> + <meta name=variant content="?mimeType=video/mp4;codecs=hev1.1.6.L186.B0,mp4a.40.2"> + <meta name=variant content="?mimeType=video/x-matroska;codecs=hvc1.1.6.L186.B0,opus"> + <meta name=variant content="?mimeType=video/x-matroska;codecs=hev1.1.6.L186.B0,opus"> + <meta name=variant content="?mimeType=video/mp4"> + <link rel="help" + href="https://w3c.github.io/mediacapture-record/MediaRecorder.html#dom-mediarecorder-mimeType"> + <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="../../mediacapture-streams/permission-helper.js"></script> +</head> + +<body> + <canvas id="canvas"></canvas> + <script> + +async_test(test => { + const CANVAS_WIDTH = 256; + const CANVAS_HEIGHT = 144; + + let large_size_data_available = false; + + // Empty video frames from this resolution consistently have ~750 bytes in my + // tests, while valid video frames usually contain 7-8KB. A threshold of + // 1.5KB consistently fails when video frames are empty but passes when video + // frames are non-empty. + const THRESHOLD_FOR_EMPTY_FRAMES = 1500; + + const CAMERA_CONSTRAINTS = { + video: { + width: { ideal: CANVAS_WIDTH }, + height: { ideal: CANVAS_HEIGHT } + } + }; + + function useUserMedia(constraints) { + let activeStream = null; + + function startCamera() { + return navigator.mediaDevices.getUserMedia(constraints).then( + (stream) => { + activeStream = stream; + return stream; + } + ); + } + + function stopCamera() { + activeStream?.getTracks().forEach((track) => track.stop()); + } + + return { startCamera, stopCamera }; + } + + function useMediaRecorder(stream, mimeType, frameSizeCallback) { + const mediaRecorder = new MediaRecorder( + stream, { mimeType } + ); + + mediaRecorder.ondataavailable = event => { + const {size} = event.data; + frameSizeCallback(size); + + if (mediaRecorder.state !== "inactive") { + mediaRecorder.stop(); + } + }; + + mediaRecorder.onstop = event => { + assert_equals(large_size_data_available, true), + "onstop is called after valid data is available"; + }; + + mediaRecorder.start(1000); + } + + const params = new URLSearchParams(window.location.search); + const mimeType = params.get('mimeType'); + if (mimeType && !MediaRecorder.isTypeSupported(mimeType)) { + test.done(); + return; + } + + if (!window.MediaStreamTrackProcessor) { + test.done(); + return; + } + + const canvas = document.querySelector("canvas"); + const ctx = canvas.getContext("2d", { + alpha: false, + }); + + canvas.width = CANVAS_WIDTH; + canvas.height = CANVAS_HEIGHT; + + const {startCamera, stopCamera} = useUserMedia(CAMERA_CONSTRAINTS); + startCamera().then(async stream => { + const videoTrack = stream.getVideoTracks()[0]; + const { readable: readableStream } = new MediaStreamTrackProcessor({ + track: videoTrack + }); + + const composedTrackGenerator = new MediaStreamTrackGenerator({ + kind: "video" + }); + const sink = composedTrackGenerator.writable; + + ctx.fillStyle = "#333"; + ctx.fillRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT); + + const transformer = new TransformStream({ + async transform(cameraFrame, controller) { + if (cameraFrame && cameraFrame?.codedWidth > 0) { + const leftPos = (CANVAS_WIDTH - cameraFrame.displayWidth) / 2; + const topPos = (CANVAS_HEIGHT - cameraFrame.displayHeight) / 2; + + ctx.drawImage(cameraFrame, leftPos, topPos); + + const newFrame = new VideoFrame(canvas, { + timestamp: cameraFrame.timestamp + }); + cameraFrame.close(); + controller.enqueue(newFrame); + } + } + }); + + readableStream.pipeThrough(transformer).pipeTo(sink); + + const compositedMediaStream = new MediaStream([composedTrackGenerator]); + + useMediaRecorder(compositedMediaStream, mimeType, (size => { + if (size > THRESHOLD_FOR_EMPTY_FRAMES) { + large_size_data_available = true; + stopCamera(); + test.done(); + } + })); + }); +}, "MediaRecorder returns frames containing video content"); + + </script> +</body> + +</html> diff --git a/tests/wpt/tests/resources/testdriver.js b/tests/wpt/tests/resources/testdriver.js index 05301bf5589..b63d5b17663 100644 --- a/tests/wpt/tests/resources/testdriver.js +++ b/tests/wpt/tests/resources/testdriver.js @@ -1428,7 +1428,7 @@ * Causes a virtual pressure source to report a new reading. * * Matches the `Update virtual pressure source - * <https://w3c.github.io/compute-pressure/#update-virtual-pressure-source>`_ + * <https://w3c.github.io/compute-pressure/?experimental=1#update-virtual-pressure-source>`_ * WebDriver command. * * @param {String} source_type - A `virtual pressure source type @@ -1437,6 +1437,9 @@ * @param {String} sample - A `virtual pressure state * <https://w3c.github.io/compute-pressure/#dom-pressurestate>`_ * such as "critical". + * @param {number} estimate - Optional, A `virtual own contribution estimate` + * <https://w3c.github.io/compute-pressure/?experimental=1#the-owncontributionestimate-attribute>`_ + * @param {WindowProxy} [context=null] - Browsing context in which to * run the call, or null for the * current browsing context. @@ -1447,8 +1450,8 @@ * virtual pressure source of the given type does not * exist). */ - update_virtual_pressure_source: function(source_type, sample, context=null) { - return window.test_driver_internal.update_virtual_pressure_source(source_type, sample, context); + update_virtual_pressure_source: function(source_type, sample, estimate, context=null) { + return window.test_driver_internal.update_virtual_pressure_source(source_type, sample, estimate, context); }, /** @@ -1472,6 +1475,29 @@ */ remove_virtual_pressure_source: function(source_type, context=null) { return window.test_driver_internal.remove_virtual_pressure_source(source_type, context); + }, + + /** + * Sets which hashes are considered k-anonymous for the Protected + * Audience interest group with specified `owner` and `name`. + * + * Matches the `Set Protected Audience K-Anonymity + * <https://wicg.github.io/turtledove/#sctn-automation-set-protected-audience-k-anonymity> + * WebDriver command. + * + * @param {String} owner - Origin of the owner of the interest group + * to modify + * @param {String} name - Name of the interest group to modify + * @param {Array} hashes - An array of strings, each of which is a + * base64 ecoded hash to consider k-anonymous. + * + * @returns {Promise} Fulfilled after the k-anonymity status for the + * specified Protected Audience interest group has + * been updated. + * + */ + set_protected_audience_k_anonymity: function(owner, name, hashes, context = null) { + return window.test_driver_internal.set_protected_audience_k_anonymity(owner, name, hashes, context); } }; @@ -1723,12 +1749,16 @@ throw new Error("create_virtual_pressure_source() is not implemented by testdriver-vendor.js"); }, - async update_virtual_pressure_source(source_type, sample, context=null) { + async update_virtual_pressure_source(source_type, sample, estimate, context=null) { throw new Error("update_virtual_pressure_source() is not implemented by testdriver-vendor.js"); }, async remove_virtual_pressure_source(source_type, context=null) { throw new Error("remove_virtual_pressure_source() is not implemented by testdriver-vendor.js"); + }, + + async set_protected_audience_k_anonymity(owner, name, hashes, context=null) { + throw new Error("set_protected_audience_k_anonymity() is not implemented by testdriver-vendor.js"); } }; })(); diff --git a/tests/wpt/tests/sanitizer-api/sanitizer-config.tentative.html b/tests/wpt/tests/sanitizer-api/sanitizer-config.tentative.html index 438e1db7ead..4a7b7ecc517 100644 --- a/tests/wpt/tests/sanitizer-api/sanitizer-config.tentative.html +++ b/tests/wpt/tests/sanitizer-api/sanitizer-config.tentative.html @@ -95,9 +95,10 @@ for (key of ["attributes", "removeAttributes"]) { test_normalization(key, {name: "href", namespace: null}, {name: "href", namespace: null}); + // https://wicg.github.io/sanitizer-api/#canonicalize-a-sanitizer-name, step 5 test_normalization(key, {name: "href", namespace: ""}, - {name: "href", namespace: null}); // ??? Is this correct? + {name: "href", namespace: null}); test_normalization(key, {name: "href", namespace: "https://www.w3.org/1999/xlink"}, {name: "href", namespace: "https://www.w3.org/1999/xlink"}); diff --git a/tests/wpt/tests/screen-orientation/lock-sandboxed-iframe.html b/tests/wpt/tests/screen-orientation/lock-sandboxed-iframe.html index ab954f04b4c..f78d7d72d53 100644 --- a/tests/wpt/tests/screen-orientation/lock-sandboxed-iframe.html +++ b/tests/wpt/tests/screen-orientation/lock-sandboxed-iframe.html @@ -18,14 +18,13 @@ resolve(evt.data.orientation); break; case "errored": - resolve(evt.data.name); + resolve(evt.data); break; default: assert_unreached(`Unexpected message: ${evt.data.result}`); return; } window.removeEventListener("message", callback); - resolve(evt.data.msg); } window.addEventListener("message", callback); }); @@ -38,10 +37,15 @@ }); const message = await wait_result(); assert_equals( - message, + message.lock_name, "SecurityError", "screen.lockOrientation() throws a SecurityError" ); + assert_equals( + message.unlock_name, + "SecurityError", + "screen.orientation.unlock() throws a SecurityError" + ); }, "Test without 'allow-orientation-lock' sandboxing directive"); promise_test(async (t) => { diff --git a/tests/wpt/tests/screen-orientation/resources/sandboxed-iframe-locking.html b/tests/wpt/tests/screen-orientation/resources/sandboxed-iframe-locking.html index 436c67f5b53..f4773535dbc 100644 --- a/tests/wpt/tests/screen-orientation/resources/sandboxed-iframe-locking.html +++ b/tests/wpt/tests/screen-orientation/resources/sandboxed-iframe-locking.html @@ -4,9 +4,6 @@ <script> test_driver.set_test_context(parent); -// At first, run simple unlock test without lock. -screen.orientation?.unlock(); - test_driver.bless("request full screen", async () => { const data = {}; try { @@ -16,15 +13,22 @@ test_driver.bless("request full screen", async () => { data.orientation = screen.orientation.type; } catch (error) { data.result = "errored"; - data.name = error.name; + data.lock_name = error.name; + } + + // Common safety check test for unlock(). + try { + screen.orientation.unlock(); + } catch (error) { + data.result = "errored"; + data.unlock_name = error.name; } - screen.orientation.unlock(); try { await document.exitFullscreen(); } catch (error) { data.result = "errored"; - data.name = error.name; + data.exit_name = error.name; } parent.window.postMessage(data, "*"); diff --git a/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-alternate.tentative.html b/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-alternate.tentative.html new file mode 100644 index 00000000000..aa92e32c562 --- /dev/null +++ b/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-alternate.tentative.html @@ -0,0 +1,165 @@ +<!DOCTYPE html> +<html> + <head> + <link rel="help" src="https://drafts.csswg.org/css-animations-2/#animation-trigger"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/web-animations/testcommon.js"></script> + <script src="/dom/events/scrolling/scroll_support.js"></script> + <script src="support/support.js"></script> + </head> + <body> + <style> + @keyframes myAnim { + from { transform: scaleX(1); } + to { transform: scaleX(5); } + } + .subject, .target { + height: 50px; + width: 50px; + background-color: red; + } + .target { + animation: myAnim linear 0.5s both; + animation-trigger: alternate; + animation-trigger-range: 150px 200px; + } + .scroll { + animation-trigger-timeline: scroll(); + } + .view { + animation-trigger-timeline: view(); + } + .deferred { + animation-trigger-timeline: --viewtimeline; + } + .deferred.subject { + view-timeline: --viewtimeline; + } + .scroller { + overflow-y: scroll; + height: 500px; + width: 500px; + border: solid 1px; + position: relative; + } + #wrapper { + timeline-scope: --viewtimeline; + } + #space { + width: 50px; + height: 600px; + } + </style> + <div id="wrapper"> + <div id="scroll_scroller" class="scroller"> + <div id="space"></div> + <div id="scroll_target" class="scroll subject target" tabindex="0"></div> + <div id="space"></div> + </div> + <div id="view_scroller" class="scroller"> + <div id="space"></div> + <div id="view_target" class="view subject target" tabindex="0"></div> + <div id="space"></div> + </div> + <div id="deferred_scroller" class="scroller"> + <div id="space"></div> + <div id="deferred_subject" class="deferred subject" tabindex="0"></div> + <div id="space"></div> + </div> + <div id="deferred_target" class="deferred target" tabindex="0"></div> + </div> + <script> + async function testAlternateAnimationTrigger(test, rangeBoundaries) { + // Just short of the trigger range start, no trigger action expected. + await testAnimationTrigger(test, () => { + return rangeBoundaries.exitTriggerRangeAbove(); + }, target, ["animationstart", "animationend"], [false, false]); + + // This skips the trigger range and should not play the animation. + await testAnimationTrigger(test, () => { + return rangeBoundaries.exitTriggerRangeBelow(); + }, target, ["animationstart", "animationend"], [false, false]); + + const initial_transform = getComputedStyle(target).transform; + // This enters the trigger range and should play the animation. + await testAnimationTrigger(test, () => { + return rangeBoundaries.enterTriggerRange(); + }, target, ["animationstart", "animationend"], [true, true]); + + const final_transform = getComputedStyle(target).transform; + // This is an alternate trigger, exiting the exit range reverses the + // animation. + await testAnimationTrigger(test, () => { + return rangeBoundaries.exitExitRangeAbove(); + }, target, ["animationstart", "animationend", "animationcancel"], + [true, true, false]); + assert_equals(getComputedStyle(target).transform, initial_transform, + "animation reversed after reaching end"); + + // This is an alternate trigger, re-entering plays the animation. + await testAnimationTrigger(test, async () => { + // Enter the range. + await rangeBoundaries.enterTriggerRange(); + await waitForAnimationFrames(5); + // Expect some but not all progress. + const current_transform = getComputedStyle(target).transform; + assert_not_equals(current_transform, initial_transform); + assert_not_equals(current_transform, final_transform); + // Exit the range. + return rangeBoundaries.exitExitRangeBelow(); + }, target, + ["animationstart", "animationend", "animationcancel"], + [true, true, false]); + assert_equals(getComputedStyle(target).transform, initial_transform, + "animation reverse mid-animation"); + } + + // The trigger and exit ranges are the same for this test. + const CSS_TRIGGER_START_PX = 150; + const CSS_TRIGGER_END_PX = 200; + + promise_test(async (test) => { + scroller = scroll_scroller; + target = scroll_target; + + const rangeBoundaries = getRangeBoundariesForTest(CSS_TRIGGER_START_PX, + CSS_TRIGGER_END_PX, + CSS_TRIGGER_START_PX, + CSS_TRIGGER_END_PX, + scroller); + await testAlternateAnimationTrigger(test, rangeBoundaries); + }, "once animation triggered via scroll() timeline."); + + promise_test(async (test) => { + scroller = view_scroller; + target = view_target; + + const COVER_START_OFFSET = 100; + + const rangeBoundaries = getRangeBoundariesForTest( + COVER_START_OFFSET + CSS_TRIGGER_START_PX, + COVER_START_OFFSET + CSS_TRIGGER_END_PX, + COVER_START_OFFSET + CSS_TRIGGER_START_PX, + COVER_START_OFFSET + CSS_TRIGGER_END_PX, + scroller); + await testAlternateAnimationTrigger(test, rangeBoundaries); + }, "once animation triggered via view() timeline."); + + promise_test(async (test) => { + scroller = deferred_scroller; + target = deferred_target; + + const COVER_START_OFFSET = 100; + + const rangeBoundaries = getRangeBoundariesForTest( + COVER_START_OFFSET + CSS_TRIGGER_START_PX, + COVER_START_OFFSET + CSS_TRIGGER_END_PX, + COVER_START_OFFSET + CSS_TRIGGER_START_PX, + COVER_START_OFFSET + CSS_TRIGGER_END_PX, + scroller); + await testAlternateAnimationTrigger(test, rangeBoundaries); + }, "once animation triggered via deferred (view) timeline."); + </script> + </body> +</html> diff --git a/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-once-play-state.tentative.html b/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-once-play-state.tentative.html new file mode 100644 index 00000000000..23c6aa8ce9f --- /dev/null +++ b/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-once-play-state.tentative.html @@ -0,0 +1,114 @@ +<!DOCTYPE html> +<html> + <head> + <link rel="help" src="https://drafts.csswg.org/css-animations-2/#animation-trigger"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/web-animations/testcommon.js"></script> + <script src="/dom/events/scrolling/scroll_support.js"></script> + <script src="support/support.js"></script> + </head> + <body> + <style> + @keyframes myAnim { + from { transform: scaleX(1); } + to { transform: scaleX(5); } + } + .subject, .target { + height: 50px; + width: 50px; + background-color: red; + } + .subject { + view-timeline: --viewtimeline; + } + .target { + animation: myAnim linear 0.5s forwards; + animation-trigger: once --viewtimeline 150px 200px; + } + .scroller { + overflow-y: scroll; + height: 500px; + width: 500px; + border: solid 1px; + position: relative; + } + #wrapper { + timeline-scope: --viewtimeline; + } + #space { + width: 50px; + height: 600px; + } + </style> + <div id="wrapper"> + <div id="scroller" class="scroller"> + <div id="space"></div> + <div id="subject" class="subject"></div> + <div id="space"></div> + </div> + <div id="target" class="target"></div> + </div> + <script> + target = document.getElementById("target"); + + function changePlayStateTo(state) { + target.style.animationPlayState = state; + } + + // The trigger and exit ranges are the same for this test. + const CSS_TRIGGER_START_PX = 150; + const CSS_TRIGGER_END_PX = 200; + + async function testPlayStateChange(test, rangeBoundaries) { + const initial_transform = getComputedStyle(target).transform; + // This enters the trigger range and should play the animation. Changing + // animation-play-state to "paused" should pause the animation, so we + // should not see an animationend event. + await testAnimationTrigger(test, async () => { + await rangeBoundaries.enterTriggerRange(); + // Make a little progess. + await waitForAnimationFrames(5); + changePlayStateTo("paused"); + }, target, ["animationstart", "animationend"], [true, false]); + await waitForAnimationFrames(5); + const partial_transform = getComputedStyle(target).transform; + assert_not_equals(partial_transform, initial_transform, + "animation made progress before pause."); + + await waitForAnimationFrames(5); + assert_equals(getComputedStyle(target).transform, partial_transform, + "animation is paused and progress is not being made."); + + await testAnimationTrigger(test, async () => { + await rangeBoundaries.exitExitRangeAbove(); + await waitForAnimationFrames(5); + // check that exiting the exit range did not affect the animation. + assert_equals(getComputedStyle(target).transform, partial_transform, + "animation still paused after exiting the exit range."); + changePlayStateTo("running"); + }, target, ["animationstart", "animationend"], [false, true]); + + const final_transform = getComputedStyle(target).transform; + assert_not_equals(final_transform, initial_transform, + "animation is at the end, not the start"); + assert_not_equals(final_transform, partial_transform, + "animation is at the end, beyond partial progress."); + } + + promise_test(async (test) => { + scroller = document.getElementById("scroller"); + target = document.getElementById("target"); + + const COVER_START_OFFSET = 100; + const rangeBoundaries = getRangeBoundariesForTest( + COVER_START_OFFSET + CSS_TRIGGER_START_PX, + COVER_START_OFFSET + CSS_TRIGGER_END_PX, + COVER_START_OFFSET + CSS_TRIGGER_START_PX, + COVER_START_OFFSET + CSS_TRIGGER_END_PX, + scroller); + await testPlayStateChange(test, rangeBoundaries); + }, "once trigger respects animation-play-state."); + </script> + </body> +</html> diff --git a/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-once.tentative.html b/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-once.tentative.html new file mode 100644 index 00000000000..e7603b458bc --- /dev/null +++ b/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-once.tentative.html @@ -0,0 +1,148 @@ +<!DOCTYPE html> +<html> + <head> + <link rel="help" src="https://drafts.csswg.org/css-animations-2/#animation-trigger"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/web-animations/testcommon.js"></script> + <script src="/dom/events/scrolling/scroll_support.js"></script> + <script src="support/support.js"></script> + </head> + <body> + <style> + @keyframes myAnim { + from { transform: scaleX(1); } + to { transform: scaleX(5); } + } + .subject, .target { + height: 50px; + width: 50px; + background-color: red; + } + .target { + animation: myAnim linear 0.5s forwards; + animation-trigger: once; + animation-trigger-range: 150px 200px; + } + .scroll { + animation-trigger-timeline: scroll(); + } + .view { + animation-trigger-timeline: view(); + } + .deferred { + animation-trigger-timeline: --viewtimeline; + } + .deferred.subject { + view-timeline: --viewtimeline; + } + .scroller { + overflow-y: scroll; + height: 500px; + width: 500px; + border: solid 1px; + position: relative; + } + #wrapper { + timeline-scope: --viewtimeline; + } + #space { + width: 50px; + height: 600px; + } + </style> + <div id="wrapper"> + <div id="scroll_scroller" class="scroller"> + <div id="space"></div> + <div id="scroll_target" class="scroll subject target" tabindex="0"></div> + <div id="space"></div> + </div> + <div id="view_scroller" class="scroller"> + <div id="space"></div> + <div id="view_target" class="view subject target" tabindex="0"></div> + <div id="space"></div> + </div> + <div id="deferred_scroller" class="scroller"> + <div id="space"></div> + <div id="deferred_subject" class="deferred subject" tabindex="0"></div> + <div id="space"></div> + </div> + <div id="deferred_target" class="deferred target" tabindex="0"></div> + </div> + <script> + async function testOnceAnimationTrigger(test, rangeBoundaries) { + // Just short of the trigger range start, no trigger action expected. + await testAnimationTrigger(test, () => { + return rangeBoundaries.exitTriggerRangeAbove(); + }, target, ["animationstart", "animationend"], + [false, false]); + + // This skips the trigger range and should not play the animation. + await testAnimationTrigger(test, () => { + return rangeBoundaries.exitTriggerRangeBelow(); + }, target, ["animationstart", "animationend"], [false, false]); + + // This enters the trigger range and should play the animation. + await testAnimationTrigger(test, () => { + return rangeBoundaries.enterTriggerRange(); + }, target, ["animationstart", "animationend"], [true, true]); + + // This is a once trigger, exiting the exit range has no effect. + await testAnimationTrigger(test, () => { + return rangeBoundaries.exitExitRangeAbove(); + }, target, ["animationcancel", "animationend"], [false, false]); + + // This is a once trigger, re-entering range has no effect. + await testAnimationTrigger(test, () => { + return rangeBoundaries.enterTriggerRange(); + }, target, ["animationstart", "animationend"], [false, false]); + } + + // The trigger and exit ranges are the same for this test. + const CSS_TRIGGER_START_PX = 150; + const CSS_TRIGGER_END_PX = 200; + + promise_test(async (test) => { + scroller = scroll_scroller; + target = scroll_target; + + const rangeBoundaries = getRangeBoundariesForTest(CSS_TRIGGER_START_PX, + CSS_TRIGGER_END_PX, + CSS_TRIGGER_START_PX, + CSS_TRIGGER_END_PX, + scroller); + await testOnceAnimationTrigger(test, rangeBoundaries); + }, "once animation triggered via scroll() timeline."); + + promise_test(async (test) => { + scroller = view_scroller; + target = view_target; + + const COVER_START_OFFSET = 100; + + const rangeBoundaries = getRangeBoundariesForTest( + COVER_START_OFFSET + CSS_TRIGGER_START_PX, + COVER_START_OFFSET + CSS_TRIGGER_END_PX, + COVER_START_OFFSET + CSS_TRIGGER_START_PX, + COVER_START_OFFSET + CSS_TRIGGER_END_PX, + scroller); + await testOnceAnimationTrigger(test, rangeBoundaries); + }, "once animation triggered via view() timeline."); + + promise_test(async (test) => { + scroller = deferred_scroller; + target = deferred_target; + + const COVER_START_OFFSET = 100; + + const rangeBoundaries = getRangeBoundariesForTest( + COVER_START_OFFSET + CSS_TRIGGER_START_PX, + COVER_START_OFFSET + CSS_TRIGGER_END_PX, + COVER_START_OFFSET + CSS_TRIGGER_START_PX, + COVER_START_OFFSET + CSS_TRIGGER_END_PX, + scroller); + await testOnceAnimationTrigger(test, rangeBoundaries); + }, "once animation triggered via deferred (view) timeline."); + </script> + </body> +</html> diff --git a/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-repeat.tentative.html b/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-repeat.tentative.html new file mode 100644 index 00000000000..cfbe9d3c933 --- /dev/null +++ b/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-repeat.tentative.html @@ -0,0 +1,163 @@ +<!DOCTYPE html> +<html> + <head> + <link rel="help" src="https://drafts.csswg.org/css-animations-2/#animation-trigger"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/web-animations/testcommon.js"></script> + <script src="/dom/events/scrolling/scroll_support.js"></script> + <script src="support/support.js"></script> + </head> + <body> + <style> + @keyframes myAnim { + from { transform: scaleX(1); } + to { transform: scaleX(5); } + } + .subject, .target { + height: 50px; + width: 50px; + background-color: red; + } + .target { + animation: myAnim linear 0.5s both; + animation-trigger: repeat; + animation-trigger-range: 250px 300px; + animation-trigger-exit-range: 200px 350px; + } + .scroll { + animation-trigger-timeline: scroll(); + } + .view { + animation-trigger-timeline: view(); + } + .deferred { + animation-trigger-timeline: --viewtimeline; + } + .deferred.subject { + view-timeline: --viewtimeline; + } + .scroller { + overflow-y: scroll; + height: 500px; + width: 500px; + border: solid 1px; + position: relative; + } + #wrapper { + timeline-scope: --viewtimeline; + } + #space { + width: 50px; + height: 600px; + } + </style> + <div id="wrapper"> + <div id="scroll_scroller" class="scroller"> + <div id="space"></div> + <div id="scroll_target" class="scroll subject target" tabindex="0"></div> + <div id="space"></div> + </div> + <div id="view_scroller" class="scroller"> + <div id="space"></div> + <div id="view_target" class="view subject target" tabindex="0"></div> + <div id="space"></div> + </div> + <div id="deferred_scroller" class="scroller"> + <div id="space"></div> + <div id="deferred_subject" class="deferred subject" tabindex="0"></div> + <div id="space"></div> + </div> + <div id="deferred_target" class="deferred target" tabindex="0"></div> + </div> + <script> + // // Each test case sets these. + // let scroller; + // let target; + + async function testRepeatAnimationTrigger(test, rangeBoundaries) { + // Just short of the trigger range start, no trigger action expected. + await testAnimationTrigger(test, () => { + return rangeBoundaries.exitTriggerRangeAbove(); + }, target, ["animationstart", "animationend"], [false, false]); + + // This skips the trigger range and should not play the animation. + await testAnimationTrigger(test, () => { + return rangeBoundaries.exitTriggerRangeBelow(); + }, target, ["animationstart", "animationend"], [false, false]); + + // This enters the trigger range and should play the animation. + await testAnimationTrigger(test, () => { + return rangeBoundaries.enterTriggerRange(); + }, target, ["animationstart", "animationend"], [true, true]); + + // This is a repeat trigger, exiting the exit range resets the animation. + // We waited for an animationend event in the previous step so we won't + // see an animationcancel event here. But, by inspecting + // style.transform, we should see that the animation was reset. + await testAnimationTrigger(test, () => { + return rangeBoundaries.exitExitRangeAbove(); + }, target, ["animationstart", "animationend", "animationcancel"], + [false, false, false]); + assert_equals(getComputedStyle(target).transform, "none"); + + // This is a repeat trigger, re-entering plays the animation. + await testAnimationTrigger(test, async () => { + // Enter the range. + await rangeBoundaries.enterTriggerRange(); + await waitForAnimationFrames(5); + // Exit the range. + return rangeBoundaries.exitExitRangeBelow(); + }, target, ["animationstart", "animationend", "animationcancel"], + [true, false, true]); + } + + const CSS_TRIGGER_START_PX = 250; + const CSS_TRIGGER_END_PX = 300; + const CSS_EXIT_START_PX = 200; + const CSS_EXIT_END_PX = 350; + + promise_test(async (test) => { + scroller = scroll_scroller; + target = scroll_target; + + const rangeBoundaries = getRangeBoundariesForTest(CSS_TRIGGER_START_PX, + CSS_TRIGGER_END_PX, + CSS_EXIT_START_PX, + CSS_EXIT_END_PX, + scroller); + await testRepeatAnimationTrigger(test, rangeBoundaries); + }, "once animation triggered via scroll() timeline."); + + promise_test(async (test) => { + scroller = view_scroller; + target = view_target; + + const COVER_START_OFFSET = 100; + + const rangeBoundaries = getRangeBoundariesForTest( + COVER_START_OFFSET + CSS_TRIGGER_START_PX, + COVER_START_OFFSET + CSS_TRIGGER_END_PX, + COVER_START_OFFSET + CSS_EXIT_START_PX, + COVER_START_OFFSET + CSS_EXIT_END_PX, + scroller); + await testRepeatAnimationTrigger(test, rangeBoundaries); + }, "once animation triggered via view() timeline."); + + promise_test(async (test) => { + scroller = deferred_scroller; + target = deferred_target; + + const COVER_START_OFFSET = 100; + + const rangeBoundaries = getRangeBoundariesForTest( + COVER_START_OFFSET + CSS_TRIGGER_START_PX, + COVER_START_OFFSET + CSS_TRIGGER_END_PX, + COVER_START_OFFSET + CSS_EXIT_START_PX, + COVER_START_OFFSET + CSS_EXIT_END_PX, + scroller); + await testRepeatAnimationTrigger(test, rangeBoundaries); + }, "once animation triggered via deferred (view) timeline."); + </script> + </body> +</html> diff --git a/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-state.tentative.html b/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-state.tentative.html new file mode 100644 index 00000000000..a9d58ae4c32 --- /dev/null +++ b/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-state.tentative.html @@ -0,0 +1,182 @@ +<!DOCTYPE html> +<html> + <head> + <link rel="help" src="https://drafts.csswg.org/css-animations-2/#animation-trigger"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/web-animations/testcommon.js"></script> + <script src="/dom/events/scrolling/scroll_support.js"></script> + <script src="support/support.js"></script> + </head> + <body> + <style> + @keyframes myAnim { + from { transform: scaleX(1); } + to { transform: scaleX(5); } + } + .subject, .target { + height: 50px; + width: 50px; + background-color: red; + } + .target { + animation: myAnim linear 0.5s both; + animation-trigger: state; + animation-trigger-range: 150px 200px; + } + .scroll { + animation-trigger-timeline: scroll(); + } + .view { + animation-trigger-timeline: view(); + } + .deferred { + animation-trigger-timeline: --viewtimeline; + } + .deferred.subject { + view-timeline: --viewtimeline; + } + .scroller { + overflow-y: scroll; + height: 500px; + width: 500px; + border: solid 1px; + position: relative; + } + #wrapper { + timeline-scope: --viewtimeline; + } + #space { + width: 50px; + height: 600px; + } + </style> + <div id="wrapper"> + <div id="scroll_scroller" class="scroller"> + <div id="space"></div> + <div id="scroll_target" class="scroll subject target" tabindex="0"></div> + <div id="space"></div> + </div> + <div id="view_scroller" class="scroller"> + <div id="space"></div> + <div id="view_target" class="view subject target" tabindex="0"></div> + <div id="space"></div> + </div> + <div id="deferred_scroller" class="scroller"> + <div id="space"></div> + <div id="deferred_subject" class="deferred subject" tabindex="0"></div> + <div id="space"></div> + </div> + <div id="deferred_target" class="deferred target" tabindex="0"></div> + </div> + <script> + async function testStateAnimationTrigger(test, rangeBoundaries) { + // Just short of the trigger range start, no trigger action expected. + await testAnimationTrigger(test, () => { + return rangeBoundaries.exitTriggerRangeAbove(); + }, target, ["animationstart", "animationend"], [false, false]); + + // This skips the trigger range and should not play the animation. + await testAnimationTrigger(test, () => { + return rangeBoundaries.exitTriggerRangeBelow(); + }, target, ["animationstart", "animationend"], [false, false]); + + const initial_transform = getComputedStyle(target).transform; + // This is a state trigger, entering the trigger range plays the + // animation. + await testAnimationTrigger(test, async () => { + // Enter the range. + await rangeBoundaries.enterTriggerRange(); + await waitForAnimationFrames(5); + // Expect some progress. + assert_not_equals(getComputedStyle(target).transform, + initial_transform); + // Exit the range, which should pause the animation. + return rangeBoundaries.exitExitRangeBelow(); + }, target, ["animationstart", "animationend", "animationcancel"], + [true, false, false]); + let partial_transform = getComputedStyle(target).transform; + + // Wait a few frames, then check that the animation is still paused. + await waitForAnimationFrames(5); + assert_equals(getComputedStyle(target).transform, partial_transform); + + // This enters the trigger range and should continue the animation. + // Let it play till the end. + await testAnimationTrigger(test, () => { + return rangeBoundaries.enterTriggerRange(); + }, target, ["animationstart", "animationend"], [false, true]); + let final_transform = getComputedStyle(target).transform; + + // Exit the range. This should have no effect as the animation has + // already finished. + await testAnimationTrigger(test, async () => { + return rangeBoundaries.exitExitRangeAbove(); + }, target, ["animationstart", "animationend", "animationcancel"], + [false, false, false]); + + // Wait a few frames. Exiting the animation should make no difference; + // the animation is already finished. + await waitForAnimationFrames(5); + assert_equals(getComputedStyle(target).transform, final_transform); + + // Enter the range again. This should make no difference. The animation + // is already finished. + await testAnimationTrigger(test, async () => { + return rangeBoundaries.enterTriggerRange(); + }, target, ["animationstart", "animationend", "animationcancel"], + [false, false, false]); + + // Wait a few frames. Check the animation is still at the end. + await waitForAnimationFrames(5); + assert_equals(getComputedStyle(target).transform, final_transform); + } + + // The trigger and exit ranges are the same for this test. + const CSS_TRIGGER_START_PX = 150; + const CSS_TRIGGER_END_PX = 200; + + promise_test(async (test) => { + scroller = scroll_scroller; + target = scroll_target; + + const rangeBoundaries = getRangeBoundariesForTest(CSS_TRIGGER_START_PX, + CSS_TRIGGER_END_PX, + CSS_TRIGGER_START_PX, + CSS_TRIGGER_END_PX, + scroller); + await testStateAnimationTrigger(test, rangeBoundaries); + }, "once animation triggered via scroll() timeline."); + + promise_test(async (test) => { + scroller = view_scroller; + target = view_target; + + const COVER_START_OFFSET = 100; + + const rangeBoundaries = getRangeBoundariesForTest( + COVER_START_OFFSET + CSS_TRIGGER_START_PX, + COVER_START_OFFSET + CSS_TRIGGER_END_PX, + COVER_START_OFFSET + CSS_TRIGGER_START_PX, + COVER_START_OFFSET + CSS_TRIGGER_END_PX, + scroller); + await testStateAnimationTrigger(test, rangeBoundaries); + }, "once animation triggered via view() timeline."); + + promise_test(async (test) => { + scroller = deferred_scroller; + target = deferred_target; + + const COVER_START_OFFSET = 100; + + const rangeBoundaries = getRangeBoundariesForTest( + COVER_START_OFFSET + CSS_TRIGGER_START_PX, + COVER_START_OFFSET + CSS_TRIGGER_END_PX, + COVER_START_OFFSET + CSS_TRIGGER_START_PX, + COVER_START_OFFSET + CSS_TRIGGER_END_PX, + scroller); + await testStateAnimationTrigger(test, rangeBoundaries); + }, "once animation triggered via deferred (view) timeline."); + </script> + </body> +</html> diff --git a/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger.html b/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger.html new file mode 100644 index 00000000000..dd4820dfe5f --- /dev/null +++ b/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger.html @@ -0,0 +1,179 @@ +<!DOCTYPE html> +<html> + <head> + <link rel="help" src="https://drafts.csswg.org/css-animations-2/#animation-trigger"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/web-animations/testcommon.js"></script> + <script src="/css/css-typed-om/resources/testhelper.js"></script> + </head> + <body> + <style> + @keyframes myAnim { + from { transform: scaleX(1); } + to { transform: scaleX(5); } + } + .subject, .target { + height: 50px; + width: 50px; + background-color: red; + } + .subject { + view-timeline: --viewtimeline; + } + .target { + animation: myAnim linear 0.5s forwards; + } + .scroll_target { + animation-trigger: repeat scroll(inline) 150px 200px 100px 250px; + } + .view_target { + animation-trigger: state view(x) contain 10% contain 90% cover 10% cover 90%; + } + .deferred_target { + animation-trigger: alternate --viewtimeline contain 5% contain 80% cover 5% cover 80%; + } + .scroller { + overflow-y: scroll; + height: 500px; + width: 500px; + border: solid 1px; + position: relative; + } + #wrapper { + timeline-scope: --viewtimeline; + } + #space { + width: 50px; + height: 600px; + } + </style> + <div id="wrapper"> + <div id="default_target" class="target"></div> + <div id="scroller" class="scroller"> + <div id="space"></div> + <div id="scroll_target" class="target"></div> + <div id="space"></div> + <div id="view_target" class="target"></div> + <div id="space"></div> + <div id="deferred_subject" class="subject"></div> + <div id="space"></div> + </div> + <div id="deferred_target" class="target"></div> + </div> + <script> + function assert_timeline_offset(actual, expected, errorMessage) { + assert_equals(actual.rangeName, expected.rangeName, errorMessage); + assert_style_value_equals(actual.offset, expected.offset); + } + + function testTrigger(trigger, expectation) { + assert_equals(trigger.type, expectation.type, "trigger type matches"); + assert_timeline_offset(trigger.rangeStart, expectation.rangeStart, + "trigger rangeStart matches"); + assert_timeline_offset(trigger.rangeEnd, expectation.rangeEnd, + "trigger rangeEnd matches"); + assert_timeline_offset(trigger.exitRangeStart, expectation.exitRangeStart, + "trigger exitRangeStart matches"); + assert_timeline_offset(trigger.exitRangeEnd, expectation.exitRangeEnd, + "trigger exitRangeEnd matches"); + if (expectation.timeline === document.timeline) { + assert_equals(trigger.timeline, document.timeline, "timeline matches"); + } else { + assert_equals(trigger.timeline.source, expectation.timelineSource, + "trigger timeline source matches"); + assert_equals(trigger.timeline.axis, expectation.timelineAxis, + "trigger timeline axis matches"); + assert_equals(trigger.timeline.subject, expectation.timelineSubject, + "trigger timeline subject matches"); + } + } + + promise_test(async() => { + await waitForNextFrame(); + const animation = default_target.getAnimations()[0]; + const trigger = animation.trigger; + + const expectation = { + type: "once", + rangeStart: "normal", + rangeEnd: "normal", + exitRangeStart: "normal", + exitRangeEnd: "normal", + timeline: document.timeline + }; + + testTrigger(trigger, expectation); + }, "Default AnimationTrigger for CSS Animation"); + + promise_test(async() => { + await waitForNextFrame(); + // Grabbing a reference to the animation and *then* adding the class + // which confers the trigger properties is a workaround to the fact that + // if the scroll-based trigger were already in place, the animation + // would be idle, getAnimations would not include it, and we would not + // be able to get a reference to it. + // TODO: if the definition for getAnimations changes such that it should + // include un-triggered animations, we should remove this workaround. + const animation = scroll_target.getAnimations()[0]; + scroll_target.classList.add("scroll_target"); + const trigger = animation.trigger; + await waitForNextFrame(); + + const expectation = { + type: "repeat", + rangeStart: { rangeName: "none", offset: CSS.px(150) }, + rangeEnd: { rangeName: "none", offset: CSS.px(200) }, + exitRangeStart: { rangeName: "none", offset: CSS.px(100) }, + exitRangeEnd: { rangeName: "none", offset: CSS.px(250) }, + timelineSource: scroller, + timelineAxis: "inline" + }; + + testTrigger(trigger, expectation); + }, "AnimationTrigger for CSS Animation with scroll() timeline"); + + promise_test(async() => { + await waitForNextFrame(); + const animation = view_target.getAnimations()[0]; + view_target.classList.add("view_target"); + const trigger = animation.trigger; + await waitForNextFrame(); + + const expectation = { + type: "state", + rangeStart: { rangeName: 'contain', offset: CSS.percent(10) }, + rangeEnd: { rangeName: 'contain', offset: CSS.percent(90) }, + exitRangeStart: { rangeName: 'cover', offset: CSS.percent(10) }, + exitRangeEnd: { rangeName: 'cover', offset: CSS.percent(90) }, + timelineSource: scroller, + timelineAxis: "x", + timelineSubject: view_target + }; + + testTrigger(trigger, expectation); + }, "AnimationTrigger for CSS Animation with view() timeline"); + + promise_test(async() => { + await waitForNextFrame(); + const animation = deferred_target.getAnimations()[0]; + deferred_target.classList.add("deferred_target"); + const trigger = animation.trigger; + await waitForNextFrame(); + + const expectation = { + type: "alternate", + rangeStart: { rangeName: 'contain', offset: CSS.percent(5) }, + rangeEnd: { rangeName: 'contain', offset: CSS.percent(80) }, + exitRangeStart: { rangeName: 'cover', offset: CSS.percent(5) }, + exitRangeEnd: { rangeName: 'cover', offset: CSS.percent(80) }, + timelineSource: scroller, + timelineAxis: "block", + timelineSubject: deferred_subject + }; + + testTrigger(trigger, expectation); + }, "AnimationTrigger for CSS Animation with deferred timeline"); + </script> + </body> +</html>
\ No newline at end of file diff --git a/tests/wpt/tests/scroll-animations/animation-trigger/support/support.js b/tests/wpt/tests/scroll-animations/animation-trigger/support/support.js new file mode 100644 index 00000000000..f5aa18e82f1 --- /dev/null +++ b/tests/wpt/tests/scroll-animations/animation-trigger/support/support.js @@ -0,0 +1,86 @@ + +// Assert that the user agent under test supports AnimationTrigger. +// AnimationTrigger tests should do this sanity check before proceeding. +function assertAnimationTriggerSupport() { + assert_true(document.documentElement.style.animationTrigger !== undefined); +} + +const setScrollTop = (scroller, y) => { + const scrollend_promise = + waitForScrollEndFallbackToDelayWithoutScrollEvent(scroller); + scroller.scrollTop = y; + return scrollend_promise; +} + +function getRangeBoundariesForTest(trigger_start, trigger_end, + exit_start, exit_end, scroller) { + let rangeBoundaries = { + scroller: scroller, + offsetWithinTriggerRange: (trigger_start + trigger_end) / 2, + offsetAboveTriggerRange: trigger_start - 10, + offsetBelowTriggerRange: trigger_end + 10, + offsetAboveExitRange: exit_start - 10, + offsetBelowExitRange: exit_end + 10, + }; + + rangeBoundaries.enterTriggerRange = async () => { + return setScrollTop(rangeBoundaries.scroller, + rangeBoundaries.offsetWithinTriggerRange); + }; + rangeBoundaries.exitTriggerRangeAbove = async () => { + return setScrollTop(rangeBoundaries.scroller, + rangeBoundaries.offsetAboveTriggerRange); + }; + rangeBoundaries.exitTriggerRangeBelow = async () => { + return setScrollTop(rangeBoundaries.scroller, + rangeBoundaries.offsetBelowTriggerRange); + }; + rangeBoundaries.exitExitRangeAbove = async () => { + return setScrollTop(rangeBoundaries.scroller, + rangeBoundaries.offsetAboveExitRange); + }; + rangeBoundaries.exitExitRangeBelow = async () => { + return setScrollTop(rangeBoundaries.scroller, + rangeBoundaries.offsetBelowExitRange); + }; + + return rangeBoundaries; +} + +// Helper function for animation-trigger tests. Aims to perform a scroll and +// observe the animation events indicated by |events_of_interest| and +// |events_should_fire| +async function testAnimationTrigger(test, scroll_fn, target, + events_of_interest, events_should_fire) { + assertAnimationTriggerSupport(); + + let evt_promises = []; + for (let idx = 0; idx < events_of_interest.length; idx++) { + const evt = events_of_interest[idx]; + const animationevent_promise = new Promise((resolve) => { + const watcher_func = () => { + if (!events_should_fire[idx]) { + test.unreached_func(`received unexpected event: ${evt}.`)(); + } + resolve(); + } + + target.addEventListener(evt, watcher_func, + { once: true }); + + // If we are not expecting the event, just wait for 3 frames before + // continuing the test. + if (!events_should_fire[idx]) { + waitForAnimationFrames(3).then(() => { + target.removeEventListener(evt, watcher_func); + resolve(); + }); + } + }); + + evt_promises.push(animationevent_promise); + } + + await scroll_fn(); + await Promise.all(evt_promises); +} diff --git a/tests/wpt/tests/shadow-dom/focus/text-selection-with-delegatesFocus-text-control.html b/tests/wpt/tests/shadow-dom/focus/text-selection-with-delegatesFocus-text-control.html new file mode 100644 index 00000000000..6474729b8b4 --- /dev/null +++ b/tests/wpt/tests/shadow-dom/focus/text-selection-with-delegatesFocus-text-control.html @@ -0,0 +1,63 @@ +<!DOCTYPE html> +<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> + +<body> + <x-shadow id="xShadow"></x-shadow> +</body> + +<script> +'use strict'; + +/** + * command to select text in shadow-root + */ +function selectText(element, start, end) { + getSelection().empty(); + const actions = new test_driver.Actions(); + actions.pointerMove(start, 0, {origin: element}); + actions.pointerDown(); + actions.pointerMove(end, 0, {origin: element}); + actions.pointerUp(); + return actions.send(); +} + +/** + * command to type foo. + */ + function typeFoo() { + const actions = new test_driver.Actions(); + actions.keyDown("F"); + actions.keyUp("F"); + actions.keyDown("O"); + actions.keyUp("O"); + actions.keyDown("O"); + actions.keyUp("O"); + return actions.send(); +} + +promise_test(async () => { + const xShadow = document.getElementById('xShadow'); + const root = xShadow.attachShadow({ mode: 'open', delegatesFocus: true }); + const span = document.createElement('span'); + span.textContent = 'Example Text to Select '; + const br = document.createElement('br'); + const input = document.createElement('input'); + root.append(span, br, input); + + await selectText(xShadow, 0, 0); + assert_equals(document.activeElement, xShadow); + assert_equals(xShadow.shadowRoot.activeElement, input, "click on shadow host with delegatesFocus focuses the input element."); + + await typeFoo(); + assert_equals(input.value, 'FOO', "keyboard typing will update the input value."); + + await selectText(xShadow, 0, 50); + const s = getSelection(); + assert_greater_than(s.toString().length, 0, "drag text will update selection."); +}, 'shadow root has selectable text when focus is delegated. Selection goes to text control if it is the delegated focusable area.'); + +</script> diff --git a/tests/wpt/tests/speculation-rules/prerender/protocol-handler-register.https.html b/tests/wpt/tests/speculation-rules/prerender/protocol-handler-register.https.html new file mode 100644 index 00000000000..af2df0f12ab --- /dev/null +++ b/tests/wpt/tests/speculation-rules/prerender/protocol-handler-register.https.html @@ -0,0 +1,107 @@ +<!DOCTYPE html> +<meta name="timeout" content="long"> +<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="/common/utils.js"></script> +<script src="/common/dispatcher/dispatcher.js"></script> +<script src="../resources/utils.js"></script> +<script src="resources/utils.js"></script> +<script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script> + +<script> +function getNextWindowMessageFromFrame(frame) { + return new Promise(resolve => { + window.addEventListener('message', event => { + if (event.source === frame.contentWindow) { + resolve(event.data); + } + }); + }); +} + +promise_setup(async () => { + assertSpeculationRulesIsSupported() + await test_driver.set_rph_registration_mode('autoAccept'); + await test_driver.bless('handler registration'); +}); + +// The overall idea for this test is: +// 1. Register a protocol handler for a custom URI scheme to target 1 (initial). +// 2. Create a prerendered page that registers the same custom URI scheme to +// target 2 (modified). But the registration will defer until after activation. +// 3. Navigate an iframe to the custom URI scheme. It should go to target 1, +// because the deferred registration hasn't yet been applied. +// 4. Activate the prerendered page. This should run the deferred registration. +// 5. Navigate the iframe to the custom URI scheme again. It should go to +// target 2. +promise_test(async t => { + const customUrlScheme = 'web+wptrphtest'; + function getProtocolHandlerUrlTemplate(id) { + return new URL( + `resources/protocol-handler.html?id=${id}&s=%s`, location.href).href; + } + + const initialUrlTemplate = getProtocolHandlerUrlTemplate('initial'); + const modifiedUrlTemplate = getProtocolHandlerUrlTemplate('modified'); + + // To start we register the initial protocol handler. When there is nothing + // registered for a custom URI scheme, and we navigate to it, there's no + // good event to tell us that the navigation failed. So instead we + // have an initial handler so we can tell that the modified protocol handler + // hasn't been registered yet. + t.add_cleanup(() => { + navigator.unregisterProtocolHandler( + customUrlScheme, initialUrlTemplate); + }); + navigator.registerProtocolHandler(customUrlScheme, initialUrlTemplate); + + // Create a prerender page that attempts to register an invalid scheme. + const {exec, activate} = await create_prerendered_page(t); + + t.add_cleanup(() => { + navigator.unregisterProtocolHandler( + customUrlScheme, modifiedUrlTemplate); + }); + // First register protocol handler during prerender + const result = await exec( + (customUrlScheme, modifiedUrlTemplate) => { + try { + navigator.registerProtocolHandler( + customUrlScheme, modifiedUrlTemplate); + } catch (registerProtocolHandlerException) { + return 'registerProtocolHandler failed with \'' + + registerProtocolHandlerException.name + '\''; + } + return 'success'; + }, [customUrlScheme, modifiedUrlTemplate]); + + assert_equals(result, 'success', + 'registerProtocolHandler should succeed.'); + + // Next create the iframe that we will navigate to the custom URI scheme so + // we can validate that the prerenderer registration hasn't yet been applied. + const frame = await with_iframe('about:blank'); + + // Navigate to the custom URI scheme. Even though the prerendered page + // registered a handler, registration shouldn't happen until after activation. + // So this navigation should go to the initial handler. + const beforeActivationMessagePromise = getNextWindowMessageFromFrame(frame); + frame.src = `${customUrlScheme}:1`; + assert_equals((await beforeActivationMessagePromise).id, 'initial', + 'Until activation, the initial handler should be registered.'); + + // Activate the prerendered page. This should run the deferred registration. + await activate(); + + // Now we listen for messages and again navigate to the custom URI scheme + // and by now the prerenderer registration should have applied and we should + // get the modified handler's id. + const afterActivationMessagePromise = getNextWindowMessageFromFrame(frame); + frame.src = `${customUrlScheme}:2`; + assert_equals((await afterActivationMessagePromise).id, 'modified', + 'After activation, the modified handler should be registered.'); +}, 'prerendering page registerProtocolHandler call defers registration until activation.'); + +</script> diff --git a/tests/wpt/tests/speculation-rules/prerender/protocol-handler-unregister.https.html b/tests/wpt/tests/speculation-rules/prerender/protocol-handler-unregister.https.html new file mode 100644 index 00000000000..586ce433854 --- /dev/null +++ b/tests/wpt/tests/speculation-rules/prerender/protocol-handler-unregister.https.html @@ -0,0 +1,140 @@ +<!DOCTYPE html> +<meta name="timeout" content="long"> +<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="/common/utils.js"></script> +<script src="/common/dispatcher/dispatcher.js"></script> +<script src="../resources/utils.js"></script> +<script src="resources/utils.js"></script> +<script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script> + +<script> + +function getNextWindowMessageFromFrame(frame) { + return new Promise(resolve => { + window.addEventListener('message', event => { + if (event.source === frame.contentWindow) { + resolve(event.data); + } + }); + }); +} + +function getNextMessageFromServiceWorker(serviceWorker) { + return new Promise(resolve => { + serviceWorker.addEventListener('message', event => { + resolve(event.data); + }, {once: true}); + }); +} + +promise_setup(async () => { + assertSpeculationRulesIsSupported() + await test_driver.set_rph_registration_mode('autoAccept'); + await test_driver.bless('handler registration'); +}); + +// The overall idea for this test is: +// 1. Register a protocol handler for a custom URI scheme. +// 2. Create a prerendered page that unregisters the protocol handler. +// 3. Navigate an iframe to the custom URI scheme. It should navigate +// successfully. +// 4. Activate the prerendered page. This should run the deferred unregistration +// work. +// 5. Navigate the iframe to the custom URI scheme again. It should fail to +// navigate. +// To detect the navigation failure, we use a service worker to perform the +// navigation via client.navigate and report the result back to +// the test. This is because the service worker's client.navigate method +// actually reports if the navigation failed, unlike other mechanisms which +// tell us nothing in this case. +promise_test(async t => { + const customUrlScheme = 'web+wptrphtest'; + function getProtocolHandlerUrlTemplate(id) { + return new URL( + `resources/protocol-handler.html?id=${id}&s=%s`, location.href).href; + } + + const urlTemplate = getProtocolHandlerUrlTemplate('unregister'); + + t.add_cleanup(() => { + navigator.unregisterProtocolHandler( + customUrlScheme, urlTemplate); + }); + navigator.registerProtocolHandler(customUrlScheme, urlTemplate); + + const {exec, activate} = await create_prerendered_page(t); + + const result = await exec( + (customUrlScheme, urlTemplate) => { + try { + navigator.unregisterProtocolHandler( + customUrlScheme, urlTemplate); + } catch (registerProtocolHandlerException) { + return 'registerProtocolHandler failed with \'' + + registerProtocolHandlerException.name + '\''; + } + return 'success'; + }, [customUrlScheme, urlTemplate]); + assert_equals(result, 'success', 'unregisterProtocolHandler should succeed.'); + + const frame1 = await with_iframe('about:blank'); + + const frame1MessagePromise = getNextWindowMessageFromFrame(frame1); + frame1.src = `${customUrlScheme}:1`; + assert_equals((await frame1MessagePromise).id, 'unregister', + 'Until activation, the initial handler should be registered.'); + + frame1.remove(); + + // Activate the prerendered page. + await activate(); + + // At this point the deferred unregistration work has run during activation + // and the protocol handler is no longer registered. + // We use Service Worker client.navigate to detect the failed navigation since + // it is well supported and reliably reports error for unknown URL schemes. + const serviceWorkerScope = + 'resources/protocol-handler.html?service_worker_client'; + const frame2Url = serviceWorkerScope + '&id=communication'; + const frame3Url = serviceWorkerScope + '&id=nav_target'; + const serviceWorkerUrl = 'resources/protocol-handler-service-worker.js'; + const serviceWorkerRegistration = + await service_worker_unregister_and_register( + t, serviceWorkerUrl, serviceWorkerScope); + + t.add_cleanup(async () => { + await serviceWorkerRegistration.unregister(); + }); + + await wait_for_state(t, serviceWorkerRegistration.installing, 'activated'); + + // We use frame2 to communicate with the service worker. + const frame2 = await with_iframe(frame2Url); + + // Frame3 is used by the service worker to attempt navigation. + const frame3 = await with_iframe(frame3Url); + + const serviceWorkerMessagePromise = getNextMessageFromServiceWorker( + frame2.contentWindow.navigator.serviceWorker); + + // Post message via frame2 to the service worker to tell it to navigate frame3 + // to the custom URI. + frame2.contentWindow.navigator.serviceWorker.controller.postMessage( + {clientUrlMatch: new URL(frame3Url, location.href).href, + navigationUrl: `${customUrlScheme}:3`}); + + // The service worker will post message back the result of the navigation. + const navigationResult = await serviceWorkerMessagePromise; + + frame2.remove(); + frame3.remove(); + + assert_false(navigationResult.success, 'Navigation to unregistered URI should fail'); + assert_equals(navigationResult.message, 'navigate failure: TypeError', + 'unregisterProtocolHandler should have completed.'); +}, 'prerendering page unregisterProtocolHandler call defers registration until activation.'); + +</script>
\ No newline at end of file diff --git a/tests/wpt/tests/speculation-rules/prerender/protocol-handler-validation.https.html b/tests/wpt/tests/speculation-rules/prerender/protocol-handler-validation.https.html new file mode 100644 index 00000000000..613b9bfad08 --- /dev/null +++ b/tests/wpt/tests/speculation-rules/prerender/protocol-handler-validation.https.html @@ -0,0 +1,57 @@ +<!DOCTYPE html> +<title>prerendered page calls to registerProtocolHandler should validate input synchronously</title> +<meta name="timeout" content="long"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/utils.js"></script> +<script src="/common/dispatcher/dispatcher.js"></script> +<script src="../resources/utils.js"></script> +<script src="resources/utils.js"></script> + +<script> +// Create a prerender page that attempts to use either registerProtocolHandler +// or unregisterProtocolHandler with either an invalid scheme or an invalid +// URL template. Validation of invalid parameters for both should happen +// synchronously in prerendered pages. +async function registerProtocolHandlerTestHelper( + t, fn_name, scheme, url_template, expected_result) { + const {exec} = await create_prerendered_page(t); + + const result = await exec((fn_name, scheme, url_template) => { + try { + navigator[fn_name](scheme, url_template); + } catch (registerProtocolHandlerException) { + return `failed with '${registerProtocolHandlerException.name}'`; + } + return 'success'; + }, [fn_name, scheme, url_template]); + + assert_equals(result, expected_result); +} + +setup(() => assertSpeculationRulesIsSupported()); + +promise_test(async t => { + await registerProtocolHandlerTestHelper( + t, 'registerProtocolHandler', 'notallowed', 'https://example.com/?%s', + 'failed with \'SecurityError\''); +}, 'prerendering page registerProtocolHandler calls with invalid URI scheme should fail synchronously.'); + +promise_test(async t => { + await registerProtocolHandlerTestHelper( + t, 'registerProtocolHandler', 'news', 'https://example.com/?', + 'failed with \'SyntaxError\''); +}, 'prerendering page registerProtocolHandler calls with invalid URI template should fail synchronously.'); + +promise_test(async t => { + await registerProtocolHandlerTestHelper( + t, 'unregisterProtocolHandler', 'notallowed', 'https://example.com/?%s', + 'failed with \'SecurityError\''); +}, 'prerendering page unregisterProtocolHandler calls with invalid URI scheme should fail synchronously.'); + +promise_test(async t => { + await registerProtocolHandlerTestHelper( + t, 'unregisterProtocolHandler', 'news', 'https://example.com/?', + 'failed with \'SyntaxError\''); +}, 'prerendering page unregisterProtocolHandler calls with invalid URI template should fail synchronously.'); +</script> diff --git a/tests/wpt/tests/speculation-rules/prerender/resources/protocol-handler-service-worker.js b/tests/wpt/tests/speculation-rules/prerender/resources/protocol-handler-service-worker.js new file mode 100644 index 00000000000..cb6142db0e3 --- /dev/null +++ b/tests/wpt/tests/speculation-rules/prerender/resources/protocol-handler-service-worker.js @@ -0,0 +1,28 @@ +// This service worker script should be used by the +// protocol-handler-unregister.https.html test to detect unregistered URL +// schemes. +self.addEventListener('message', async eventInfo => { + let success = false; + let message = null; + + try { + const {clientUrlMatch, navigationUrl} = eventInfo.data; + const client = (await clients.matchAll()).find( + client => client.url === clientUrlMatch); + + if (client) { + try { + await client.navigate(navigationUrl); + success = true; + } catch (navigateException) { + message = `navigate failure: ${navigateException.name}`; + } + } else { + message = `no client found matching ${clientUrlMatch}`; + } + } catch (otherException) { + message = `other failure: ${otherException.name}`; + } + + eventInfo.source.postMessage({success, message}); +});
\ No newline at end of file diff --git a/tests/wpt/tests/speculation-rules/prerender/resources/protocol-handler.html b/tests/wpt/tests/speculation-rules/prerender/resources/protocol-handler.html new file mode 100644 index 00000000000..210b23aae21 --- /dev/null +++ b/tests/wpt/tests/speculation-rules/prerender/resources/protocol-handler.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<title>Prerendering custom protocol handler</title> +<script> + // This page should be used by the protocol-handler-*register.https.html + // tests as the handler for their test custom protocols. + + // Get URL parameters + const urlParams = new URLSearchParams(window.location.search); + const id = urlParams.get('id'); + const s = urlParams.get('s'); + // This page will be hosted in an iframe. Post message to parent window. + window.parent.postMessage({id: id, s: s}, '*'); +</script> diff --git a/tests/wpt/tests/speculation-rules/prerender/resources/shared-storage-worklet.js b/tests/wpt/tests/speculation-rules/prerender/resources/shared-storage-worklet.js new file mode 100644 index 00000000000..92a1a7325bb --- /dev/null +++ b/tests/wpt/tests/speculation-rules/prerender/resources/shared-storage-worklet.js @@ -0,0 +1,5 @@ +class ReadOperation { + async run() { + return await this.sharedStorage.get("prerender"); + } +} diff --git a/tests/wpt/tests/speculation-rules/prerender/resources/shared-storage.https.html b/tests/wpt/tests/speculation-rules/prerender/resources/shared-storage.https.html index 53edf109698..408168e4c4c 100644 --- a/tests/wpt/tests/speculation-rules/prerender/resources/shared-storage.https.html +++ b/tests/wpt/tests/speculation-rules/prerender/resources/shared-storage.https.html @@ -19,9 +19,20 @@ if (!isPrerendering) { loadInitiatorPage(); } else { const prerenderEventCollector = new PrerenderEventCollector(); - prerenderEventCollector.start( - window.sharedStorage.set('prerender', 'yes'), 'window.sharedStorage.set'); + + if (params.get('type') === 'worklet') { + async function register() { + return window.sharedStorage.worklet.addModule( + "shared-storage-worklet.js"); + } + prerenderEventCollector.start( + register(), 'window.sharedStorage.worklet.addModule'); + } else { + prerenderEventCollector.start( + window.sharedStorage.set('prerender', 'yes'), + 'window.sharedStorage.set'); } +} </script> diff --git a/tests/wpt/tests/speculation-rules/prerender/restrictions_shared_storage_worklet.https.html b/tests/wpt/tests/speculation-rules/prerender/restrictions_shared_storage_worklet.https.html new file mode 100644 index 00000000000..72a46c3137f --- /dev/null +++ b/tests/wpt/tests/speculation-rules/prerender/restrictions_shared_storage_worklet.https.html @@ -0,0 +1,58 @@ +<!DOCTYPE html> +<title>Worklet operations to Shared Storage API is deferred</title> +<meta name="timeout" content="long"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/utils.js"></script> +<script src="../resources/utils.js"></script> +<script src="resources/utils.js"></script> + +<body> +<script> +setup(() => assertSpeculationRulesIsSupported()); +promise_test(async t => { + const uid = token(); + const bc = new PrerenderChannel('test-channel', uid); + + const gotMessage = new Promise(resolve => { + bc.addEventListener('message', e => { + resolve(e.data); + }, { + once: true + }); + }); + + const url = + `resources/shared-storage.https.html?uid=${uid}&type=worklet`; + window.open(url, '_blank', 'noopener'); + + const result = await gotMessage; + const expected = [ + { + event: 'started waiting window.sharedStorage.worklet.addModule', + prerendering: true + }, + { + event: 'prerendering change', + prerendering: false + }, + { + event: 'finished waiting window.sharedStorage.worklet.addModule', + prerendering: false + } + ]; + assert_equals(result.length, expected.length); + for (let i = 0; i < result.length; i++) { + assert_equals(result[i].event, expected[i].event, + `event[${i}]`); + assert_equals(result[i].prerendering, expected[i].prerendering, + `prerendering[${i}]`); + } + bc.close(); + + // Send a close signal to PrerenderEventCollector on the prerendered page. + new PrerenderChannel('close', uid).postMessage(''); + }, + `add module for the Shared Storage API should be deferred until the + prerendered page is activated`); +</script> diff --git a/tests/wpt/tests/subresource-integrity/signatures/tentative/accept-signature.window.js b/tests/wpt/tests/subresource-integrity/signatures/tentative/accept-signature.window.js index efcbf0cdad6..97e817e328c 100644 --- a/tests/wpt/tests/subresource-integrity/signatures/tentative/accept-signature.window.js +++ b/tests/wpt/tests/subresource-integrity/signatures/tentative/accept-signature.window.js @@ -13,15 +13,29 @@ let test_cases = [ header: `sig0=("unencoded-digest";sf);keyid="${kValidKeys['rfc']}";tag="sri"`, }, { + integrity: `ed25519-${kValidKeys['rfc']} ed25519-${kValidKeys['rfc']}`, + header: `sig0=("unencoded-digest";sf);keyid="${kValidKeys['rfc']}";tag="sri"`, + }, + { integrity: `ed25519-${kValidKeys['arbitrary']} ed25519-${kValidKeys['rfc']}`, header: `sig0=("unencoded-digest";sf);keyid="${kValidKeys['arbitrary']}";tag="sri", ` + `sig1=("unencoded-digest";sf);keyid="${kValidKeys['rfc']}";tag="sri"`, }, { + integrity: `ed25519-${kValidKeys['rfc']} ed25519-${kValidKeys['arbitrary']}`, + header: `sig0=("unencoded-digest";sf);keyid="${kValidKeys['rfc']}";tag="sri", ` + + `sig1=("unencoded-digest";sf);keyid="${kValidKeys['arbitrary']}";tag="sri"`, + }, + { integrity: `ed25519-${kValidKeys['arbitrary']} malformed-thing ed25519-${kValidKeys['rfc']}`, header: `sig0=("unencoded-digest";sf);keyid="${kValidKeys['arbitrary']}";tag="sri", ` + `sig1=("unencoded-digest";sf);keyid="${kValidKeys['rfc']}";tag="sri"`, }, + { + integrity: `ed25519-${kValidKeys['rfc']} malformed-thing ed25519-${kValidKeys['arbitrary']}`, + header: `sig0=("unencoded-digest";sf);keyid="${kValidKeys['rfc']}";tag="sri", ` + + `sig1=("unencoded-digest";sf);keyid="${kValidKeys['arbitrary']}";tag="sri"`, + }, ]; let test_counter = 0; diff --git a/tests/wpt/tests/subresource-integrity/signatures/tentative/helper.js b/tests/wpt/tests/subresource-integrity/signatures/tentative/helper.js index e5e00ec7b53..458da38213a 100644 --- a/tests/wpt/tests/subresource-integrity/signatures/tentative/helper.js +++ b/tests/wpt/tests/subresource-integrity/signatures/tentative/helper.js @@ -112,7 +112,7 @@ function generate_fetch_test(request_data, options, expectation, description) { // in the header. if (options.integrity?.includes(`ed25519-${kInvalidKey}`)) { assert_equals(r.headers.get(kAcceptSignature), - `sig0=("unencoded-digest";sf);keyid="${kInvalidKey}";tag="sri", sig1=("unencoded-digest";sf);keyid="${kValidKeys['rfc']}";tag="sri"`, + `sig0=("unencoded-digest";sf);keyid="${kValidKeys['rfc']}";tag="sri", sig1=("unencoded-digest";sf);keyid="${kInvalidKey}";tag="sri"`, "`accept-signature` was set."); } else if (options.integrity?.includes(`ed25519-${kValidKeys['rfc']}`)) { assert_equals(r.headers.get(kAcceptSignature), diff --git a/tests/wpt/tests/svg/types/scripted/SVGGraphicsElement-padding.svg b/tests/wpt/tests/svg/types/scripted/SVGGraphicsElement-padding.svg new file mode 100644 index 00000000000..7bf47767a52 --- /dev/null +++ b/tests/wpt/tests/svg/types/scripted/SVGGraphicsElement-padding.svg @@ -0,0 +1,64 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg xmlns="http://www.w3.org/2000/svg" + xmlns:h="http://www.w3.org/1999/xhtml"> + <title>SVGGraphicsElement with padding</title> + <metadata> + <h:link rel="help" href="https://svgwg.org/svg2-draft/types.html#InterfaceSVGGraphicsElement"/> + </metadata> + <h:script src="/resources/testharness.js"/> + <h:script src="/resources/testharnessreport.js"/> + + <foreignObject width="100px" height="100px"> + <svg id="svg" width="100px" height="100px"> + <circle cx="50" cy="0" r="44" + fill="blue"></circle> + </svg> + </foreignObject> + + <script><![CDATA[ + test(function() { + let svg = document.getElementById("svg"); + svg.setAttribute("style", "padding-left: 12px; transform: rotate(180deg);"); + let ctm = svg.getScreenCTM(); + let pt = DOMPoint.fromPoint({x: 50, y: 50}); + let transformedPoint = pt.matrixTransform(ctm.inverse()); + svg.removeAttribute("style"); + assert_equals(transformedPoint.x, pt.x); + assert_equals(transformedPoint.y, pt.y); + }, 'getScreenCTM with padding-left and rotation'); + + test(function() { + let svg = document.getElementById("svg"); + svg.setAttribute("style", "padding-top: 12px; transform: rotate(180deg);"); + let ctm = svg.getScreenCTM(); + let pt = DOMPoint.fromPoint({x: 50, y: 50}); + let transformedPoint = pt.matrixTransform(ctm.inverse()); + svg.removeAttribute("style"); + assert_equals(transformedPoint.x, pt.x); + assert_equals(transformedPoint.y, pt.y); + }, 'getScreenCTM with padding-top and rotation'); + + test(function() { + let svg = document.getElementById("svg"); + svg.setAttribute("style", "padding-right: 12px; transform: rotate(180deg);"); + let ctm = svg.getScreenCTM(); + let pt = DOMPoint.fromPoint({x: 50, y: 50}); + let transformedPoint = pt.matrixTransform(ctm.inverse()); + svg.removeAttribute("style"); + assert_equals(transformedPoint.x, pt.x + 12); + assert_equals(transformedPoint.y, pt.y); + }, 'getScreenCTM with padding-right and rotation'); + + test(function() { + let svg = document.getElementById("svg"); + svg.setAttribute("style", "padding-left: 12px; transform: rotate(180deg); transform-box: content-box"); + let ctm = svg.getScreenCTM(); + let pt = DOMPoint.fromPoint({x: 50, y: 50}); + let transformedPoint = pt.matrixTransform(ctm.inverse()); + svg.removeAttribute("style"); + assert_equals(transformedPoint.x, pt.x + 12); + assert_equals(transformedPoint.y, pt.y); + }, 'getScreenCTM with padding-left, rotation and content-box'); + + ]]></script> +</svg> diff --git a/tests/wpt/tests/tools/ci/requirements_build.txt b/tests/wpt/tests/tools/ci/requirements_build.txt index e74e4e5302d..60c09170a98 100644 --- a/tests/wpt/tests/tools/ci/requirements_build.txt +++ b/tests/wpt/tests/tools/ci/requirements_build.txt @@ -1,5 +1,5 @@ cairocffi==1.7.0 fonttools==4.51.0 genshi==0.7.7 -jinja2==3.1.4 +jinja2==3.1.6 pyyaml==6.0.1 diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome.py b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome.py index 76bc652075e..e3ef73de6a0 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome.py @@ -158,6 +158,9 @@ def executor_kwargs(logger, test_type, test_environment, run_info_data, subsuite chrome_options["args"].append( "--ip-address-space-overrides=" + address_space_overrides_arg) + # Disable overlay scrollbar animations to prevent flaky wpt screenshots based on timing. + chrome_options["args"].append("--disable-features=ScrollbarAnimations") + # Always disable antialiasing on the Ahem font. blink_features = ['DisableAhemAntialias'] diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/actions.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/actions.py index 859ce8f4fa6..06d58e7e87b 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/actions.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/actions.py @@ -498,7 +498,8 @@ class UpdateVirtualPressureSourceAction: def __call__(self, payload): source_type = payload["source_type"] sample = payload["sample"] - return self.protocol.pressure.update_virtual_pressure_source(source_type, sample) + estimate = payload["estimate"] + return self.protocol.pressure.update_virtual_pressure_source(source_type, sample, estimate) class RemoveVirtualPressureSourceAction: name = "remove_virtual_pressure_source" @@ -511,6 +512,17 @@ class RemoveVirtualPressureSourceAction: source_type = payload["source_type"] return self.protocol.pressure.remove_virtual_pressure_source(source_type) +class SetProtectedAudienceKAnonymityAction: + name = "set_protected_audience_k_anonymity" + + def __init__(self, logger, protocol): + self.logger = logger + self.protocol = protocol + + def __call__(self, payload): + owner, name, hashes = payload["owner"], payload["name"], payload["hashes"] + return self.protocol.protected_audience.set_k_anonymity(owner, name, hashes) + actions = [ClickAction, DeleteAllCookiesAction, GetAllCookiesAction, @@ -550,4 +562,5 @@ actions = [ClickAction, RunBounceTrackingMitigationsAction, CreateVirtualPressureSourceAction, UpdateVirtualPressureSourceAction, - RemoveVirtualPressureSourceAction] + RemoveVirtualPressureSourceAction, + SetProtectedAudienceKAnonymityAction] diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executormarionette.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executormarionette.py index ebc4a4a5656..b4b5b2a3ea6 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executormarionette.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executormarionette.py @@ -721,7 +721,7 @@ class MarionetteVirtualPressureSourceProtocolPart(VirtualPressureSourceProtocolP def create_virtual_pressure_source(self, source_type, metadata): raise NotImplementedError("create_virtual_pressure_source not yet implemented") - def update_virtual_pressure_source(self, source_type, sample): + def update_virtual_pressure_source(self, source_type, sample, estimate): raise NotImplementedError("update_virtual_pressure_source not yet implemented") def remove_virtual_pressure_source(self, source_type): diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py index 95667480afe..bea6ab57ba8 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py @@ -45,6 +45,7 @@ from .protocol import (BaseProtocolPart, DevicePostureProtocolPart, StorageProtocolPart, VirtualPressureSourceProtocolPart, + ProtectedAudienceProtocolPart, merge_dicts) from typing import Any, List, Optional, Tuple @@ -684,13 +685,20 @@ class WebDriverVirtualPressureSourceProtocolPart(VirtualPressureSourceProtocolPa body.update(metadata) return self.webdriver.send_session_command("POST", "pressuresource", body) - def update_virtual_pressure_source(self, source_type, sample): - body = {"sample": sample} + def update_virtual_pressure_source(self, source_type, sample, estimate): + body = {"sample": sample, "estimate": estimate} return self.webdriver.send_session_command("POST", "pressuresource/%s" % source_type, body) def remove_virtual_pressure_source(self, source_type): return self.webdriver.send_session_command("DELETE", "pressuresource/%s" % source_type) +class WebDriverProtectedAudienceProtocolPart(ProtectedAudienceProtocolPart): + def setup(self): + self.webdriver = self.parent.webdriver + + def set_k_anonymity(self, owner, name, hashes): + body = {"owner": owner, "name": name, "hashes": hashes} + return self.webdriver.send_session_command("POST", "protected_audience/set_k_anonymity", body) class WebDriverProtocol(Protocol): enable_bidi = False @@ -715,7 +723,8 @@ class WebDriverProtocol(Protocol): WebDriverVirtualSensorPart, WebDriverDevicePostureProtocolPart, WebDriverStorageProtocolPart, - WebDriverVirtualPressureSourceProtocolPart] + WebDriverVirtualPressureSourceProtocolPart, + WebDriverProtectedAudienceProtocolPart] def __init__(self, executor, browser, capabilities, **kwargs): super().__init__(executor, browser) diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/protocol.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/protocol.py index 0940e87cdbd..53a7b437848 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/protocol.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/protocol.py @@ -1009,9 +1009,19 @@ class VirtualPressureSourceProtocolPart(ProtocolPart): pass @abstractmethod - def update_virtual_pressure_source(self, source_type, sample): + def update_virtual_pressure_source(self, source_type, sample, estimate): pass @abstractmethod def remove_virtual_pressure_source(self, source_type): pass + +class ProtectedAudienceProtocolPart(ProtocolPart): + """Protocol part for Protected Audience""" + __metaclass__ = ABCMeta + + name = "protected_audience" + + @abstractmethod + def set_k_anonymity(self, owner, name, hashes): + pass diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/testdriver-extra.js b/tests/wpt/tests/tools/wptrunner/wptrunner/testdriver-extra.js index 9ddbe2e8df5..71c1be2732f 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/testdriver-extra.js +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/testdriver-extra.js @@ -468,11 +468,17 @@ return create_context_action("create_virtual_pressure_source", context, {source_type, metadata}); }; - window.test_driver_internal.update_virtual_pressure_source = function(source_type, sample, context=null) { - return create_context_action("update_virtual_pressure_source", context, {source_type, sample}); + window.test_driver_internal.update_virtual_pressure_source = function(source_type, sample, estimate, context=null) { + return create_context_action("update_virtual_pressure_source", context, {source_type, sample, estimate}); }; window.test_driver_internal.remove_virtual_pressure_source = function(source_type, context=null) { return create_context_action("remove_virtual_pressure_source", context, {source_type}); }; + + window.test_driver_internal.set_protected_audience_k_anonymity = function( + owner, name, hashes, context=null) { + return create_context_action( + 'set_protected_audience_k_anonymity', context, {owner, name, hashes}); + } })(); diff --git a/tests/wpt/tests/trusted-types/should-sink-type-mismatch-violation-be-blocked-by-csp-001.html b/tests/wpt/tests/trusted-types/should-sink-type-mismatch-violation-be-blocked-by-csp-001.html index 5662c64ac4e..add14466e57 100644 --- a/tests/wpt/tests/trusted-types/should-sink-type-mismatch-violation-be-blocked-by-csp-001.html +++ b/tests/wpt/tests/trusted-types/should-sink-type-mismatch-violation-be-blocked-by-csp-001.html @@ -130,4 +130,24 @@ header(Content-Security-Policy-Report-Only,require-trusted-types-for 'script',Tr assert_true(results[0].exception instanceof TypeError); assert_equals(results[0].violatedPolicies.length, 1); }, `directive "require-trusted-types-for 'script' 'invalid'" (unknown sink group)`); + + promise_test(async t => { + let results = await trySendingPlainStringToTrustedTypeSink( + ["script"], + "header(Content-Security-Policy,require-trusted-types-for 'invalid' 'script',True)", + ); + assert_equals(results.length, 1); + assert_true(results[0].exception instanceof TypeError); + assert_equals(results[0].violatedPolicies.length, 1); + }, `directive "require-trusted-types-for 'invalid' 'script'" (unknown sink group)`); + + promise_test(async t => { + let results = await trySendingPlainStringToTrustedTypeSink( + ["script"], + "header(Content-Security-Policy,require-trusted-types-for 'invalid' 'script' 'also-invalid',True)", + ); + assert_equals(results.length, 1); + assert_true(results[0].exception instanceof TypeError); + assert_equals(results[0].violatedPolicies.length, 1); + }, `directive "require-trusted-types-for 'invalid' 'script' 'also-invalid" (unknown sink group)`); </script> diff --git a/tests/wpt/tests/trusted-types/should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker.html b/tests/wpt/tests/trusted-types/should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker.html new file mode 100644 index 00000000000..9a7b237f11a --- /dev/null +++ b/tests/wpt/tests/trusted-types/should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker.html @@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<meta name="timeout" content="long"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> + fetch_tests_from_worker(new Worker( + "support/should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker.js" + )); +</script> diff --git a/tests/wpt/tests/trusted-types/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker.html b/tests/wpt/tests/trusted-types/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker.html new file mode 100644 index 00000000000..7e928d2d719 --- /dev/null +++ b/tests/wpt/tests/trusted-types/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker.html @@ -0,0 +1,11 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<meta name="timeout" content="long"> +<link rel="help" href="https://w3c.github.io/trusted-types/dist/spec/#should-block-create-policy"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> + fetch_tests_from_worker(new Worker( + "support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker.js" + )); +</script> diff --git a/tests/wpt/tests/trusted-types/support/csp-violations.js b/tests/wpt/tests/trusted-types/support/csp-violations.js index 49649f45cd6..46c2ca1b30f 100644 --- a/tests/wpt/tests/trusted-types/support/csp-violations.js +++ b/tests/wpt/tests/trusted-types/support/csp-violations.js @@ -15,7 +15,7 @@ const cspDirectives = [ // the CSP directive connect-src 'none' and that fn is not itself triggering // a "connect-src" violation report. function trusted_type_violations_and_exception_for(fn) { - return new Promise((resolve, reject) => { + return new Promise(async (resolve, reject) => { // Listen for security policy violations. let result = { violations: [], exception: null }; let handler = e => { @@ -33,7 +33,7 @@ function trusted_type_violations_and_exception_for(fn) { // Run the specified function and record any exception. try { - fn(); + await fn(); } catch(e) { result.exception = e; } diff --git a/tests/wpt/tests/trusted-types/support/should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker.js b/tests/wpt/tests/trusted-types/support/should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker.js new file mode 100644 index 00000000000..dc3eb004c38 --- /dev/null +++ b/tests/wpt/tests/trusted-types/support/should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker.js @@ -0,0 +1,35 @@ +const testSetupPolicy = trustedTypes.createPolicy("testSetupPolicy", { + createScriptURL: s => s }); + +importScripts(testSetupPolicy.createScriptURL("/resources/testharness.js")); +importScripts(testSetupPolicy.createScriptURL("csp-violations.js")); + +// For CSP applying to this file, please refer to +// should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker.js.headers + +promise_test(async () => { + let {violations, exception} = await trusted_type_violations_and_exception_for(_ => setTimeout("unsafe")); + + // An exception is thrown for the violated enforced policies. + assert_true(exception instanceof TypeError, "TypeError is thrown"); + + // This violates all 'script' directives. + let sorted_violations = violations.map(v => { + return { policy: v.originalPolicy, disposition: v.disposition}; + }).sort(); + assert_equals(sorted_violations.length, 6); + assert_equals(sorted_violations[0].policy, "require-trusted-types-for 'script'"); + assert_equals(sorted_violations[0].disposition, "enforce"); + assert_equals(sorted_violations[1].policy, "require-trusted-types-for 'script' 'invalid'"); + assert_equals(sorted_violations[1].disposition, "enforce"); + assert_equals(sorted_violations[2].policy, "require-trusted-types-for 'invalid' 'script'"); + assert_equals(sorted_violations[2].disposition, "enforce"); + assert_equals(sorted_violations[3].policy, "require-trusted-types-for 'script'"); + assert_equals(sorted_violations[3].disposition, "report"); + assert_equals(sorted_violations[4].policy, "require-trusted-types-for 'script' 'invalid'"); + assert_equals(sorted_violations[4].disposition, "report"); + assert_equals(sorted_violations[5].policy, "require-trusted-types-for 'invalid' 'script'"); + assert_equals(sorted_violations[5].disposition, "report"); +}, "Checking reported violations for setTimeout('unsafe') from DedicatedWorker"); + +done(); diff --git a/tests/wpt/tests/trusted-types/support/should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker.js.headers b/tests/wpt/tests/trusted-types/support/should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker.js.headers new file mode 100644 index 00000000000..c17d57d19ae --- /dev/null +++ b/tests/wpt/tests/trusted-types/support/should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker.js.headers @@ -0,0 +1,7 @@ +Content-Security-Policy: connect-src 'none' +Content-Security-Policy: require-trusted-types-for 'script' +Content-Security-Policy-Report-Only: require-trusted-types-for 'script' +Content-Security-Policy: require-trusted-types-for 'script' 'invalid' +Content-Security-Policy-Report-Only: require-trusted-types-for 'script' 'invalid' +Content-Security-Policy: require-trusted-types-for 'invalid' 'script' +Content-Security-Policy-Report-Only: require-trusted-types-for 'invalid' 'script' diff --git a/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker.js b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker.js new file mode 100644 index 00000000000..c5c512d98a2 --- /dev/null +++ b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker.js @@ -0,0 +1,28 @@ +importScripts("/resources/testharness.js"); +importScripts("csp-violations.js"); + +// For CSP applying to this file, please refer to +// should-trusted-type-policy-creation-be-blocked-by-csp-004-worker.js.headers + +promise_test(async () => { + let {violations, exception} = await trusted_type_violations_and_exception_for(_ => trustedTypes.createPolicy("tt-policy-name")); + + // An exception is thrown for the violated enforced policies. + assert_true(exception instanceof TypeError, "TypeError is thrown"); + + // This violates other-policy-name and none directives. + let sorted_violations = violations.map(v => { + return { policy: v.originalPolicy, disposition: v.disposition}; + }).sort(); + assert_equals(sorted_violations.length, 4); + assert_equals(sorted_violations[0].policy, "trusted-types other-policy-name"); + assert_equals(sorted_violations[0].disposition, "enforce"); + assert_equals(sorted_violations[1].policy, "trusted-types none"); + assert_equals(sorted_violations[1].disposition, "enforce"); + assert_equals(sorted_violations[2].policy, "trusted-types other-policy-name"); + assert_equals(sorted_violations[2].disposition, "report"); + assert_equals(sorted_violations[3].policy, "trusted-types none"); + assert_equals(sorted_violations[3].disposition, "report"); +}, "Checking reported violations for createPolicy('tt-policy-name') from DedicatedWorker"); + +done(); diff --git a/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker.js.headers b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker.js.headers new file mode 100644 index 00000000000..c27bd116d8d --- /dev/null +++ b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker.js.headers @@ -0,0 +1,9 @@ +Content-Security-Policy: connect-src 'none' +Content-Security-Policy: trusted-types tt-policy-name +Content-Security-Policy-Report-Only: trusted-types tt-policy-name +Content-Security-Policy: trusted-types other-policy-name +Content-Security-Policy-Report-Only: trusted-types other-policy-name +Content-Security-Policy: trusted-types * +Content-Security-Policy-Report-Only: trusted-types * +Content-Security-Policy: trusted-types none +Content-Security-Policy-Report-Only: trusted-types none diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-create-policy-worker.js b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-create-policy-worker.js new file mode 100644 index 00000000000..6bb346e3195 --- /dev/null +++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-create-policy-worker.js @@ -0,0 +1,5 @@ +importScripts("/resources/testharness.js"); + +importScripts("trusted-types-reporting-check-report-create-policy.js"); + +done(); diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-create-policy-worker.js.sub.headers b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-create-policy-worker.js.sub.headers new file mode 100644 index 00000000000..58beda24183 --- /dev/null +++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-create-policy-worker.js.sub.headers @@ -0,0 +1,6 @@ +Expires: Mon, 26 Jul 1997 05:00:00 GMT +Cache-Control: no-store, no-cache, must-revalidate +Cache-Control: post-check=0, pre-check=0, false +Pragma: no-cache +Set-Cookie: trusted-types-reporting-check-report-DedicatedWorker-create-policy={{$id:uuid()}}; Path=/trusted-types/ +Content-Security-Policy-Report-Only: trusted-types one two; report-uri /reporting/resources/report.py?op=put&reportID={{$id}} diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-create-policy.js b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-create-policy.js new file mode 100644 index 00000000000..5d96829727b --- /dev/null +++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-create-policy.js @@ -0,0 +1,15 @@ +test(() => { + const p1 = trustedTypes.createPolicy("one", {}); // allowed policy name + assert_equals(p1.name, "one"); + + const p2 = trustedTypes.createPolicy("two", {}); // allowed policy name + assert_equals(p2.name, "two"); +}, "Creating policy works for policy in the allowlist."); + +test(() => { + const p3 = trustedTypes.createPolicy("three", {}); // forbidden policy name + assert_equals(p3.name, "three"); + + const p4 = trustedTypes.createPolicy("four", {}); // forbidden policy name + assert_equals(p4.name, "four"); +}, "Creating policy works for policy in the blocklist, since it's report-only."); diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-sink-mismatch-worker.js b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-sink-mismatch-worker.js new file mode 100644 index 00000000000..85910e2e926 --- /dev/null +++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-sink-mismatch-worker.js @@ -0,0 +1,7 @@ +const testSetupPolicy = trustedTypes.createPolicy("p", { createScriptURL: s => s }); + +importScripts(testSetupPolicy.createScriptURL("/resources/testharness.js")); + +importScripts(testSetupPolicy.createScriptURL("trusted-types-reporting-check-report-sink-mismatch.js")); + +done(); diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-sink-mismatch-worker.js.sub.headers b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-sink-mismatch-worker.js.sub.headers new file mode 100644 index 00000000000..5fcdf6ccbfc --- /dev/null +++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-sink-mismatch-worker.js.sub.headers @@ -0,0 +1,7 @@ +Expires: Mon, 26 Jul 1997 05:00:00 GMT +Cache-Control: no-store, no-cache, must-revalidate +Cache-Control: post-check=0, pre-check=0, false +Pragma: no-cache +Set-Cookie: trusted-types-reporting-check-report-DedicatedWorker-sink-mismatch={{$id:uuid()}}; Path=/trusted-types/ +Content-Security-Policy: script-src http: https: +Content-Security-Policy-Report-Only: require-trusted-types-for 'script'; report-uri /reporting/resources/report.py?op=put&reportID={{$id}} diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-sink-mismatch.js b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-sink-mismatch.js new file mode 100644 index 00000000000..96ad9c116b4 --- /dev/null +++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-sink-mismatch.js @@ -0,0 +1,13 @@ +test(() => { + setTimeout(";"); // violation reported + setTimeout(";;"); // another violation reported +}, "Passing a plain string to setTimeout works since it's report-only."); + +test(() => { + let p = trustedTypes.createPolicy("dummy", {createScript: x => x}); + setTimeout(p.createScript(";;;")); // no violation reported +}, "Passing a TrustedScript to setTimeout works."); + +test(_ => { + assert_throws_js(EvalError, _ => eval(";;;;")); // violation reported +}, "Passing a plain string to eval throws."); diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-DedicatedWorker-constructor-worker.js b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-DedicatedWorker-constructor-worker.js new file mode 100644 index 00000000000..e5b09eb3707 --- /dev/null +++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-DedicatedWorker-constructor-worker.js @@ -0,0 +1,11 @@ +const testSetupPolicy = trustedTypes.createPolicy("p", { createScriptURL: s => s }); + +importScripts(testSetupPolicy.createScriptURL("/resources/testharness.js")); +importScripts(testSetupPolicy.createScriptURL("helper.sub.js")); +importScripts(testSetupPolicy.createScriptURL("csp-violations.js")); + +importScripts(testSetupPolicy.createScriptURL( + "trusted-types-reporting-for-DedicatedWorker-constructor.js" +)); + +done(); diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-DedicatedWorker-constructor-worker.js.headers b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-DedicatedWorker-constructor-worker.js.headers new file mode 100644 index 00000000000..54d8b1d4c12 --- /dev/null +++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-DedicatedWorker-constructor-worker.js.headers @@ -0,0 +1,2 @@ +Content-Security-Policy: require-trusted-types-for 'script'; +Content-Security-Policy: connect-src 'none'
\ No newline at end of file diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-DedicatedWorker-constructor.js b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-DedicatedWorker-constructor.js new file mode 100644 index 00000000000..cb5ae4c8e2c --- /dev/null +++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-DedicatedWorker-constructor.js @@ -0,0 +1,16 @@ +const policy = trustedTypes.createPolicy("dummy", { createScriptURL: x => x }); +const input = `data:text/javascript,${';'.repeat(100)}`; + +promise_test(async t => { + await no_trusted_type_violation_for(_ => + new Worker(policy.createScriptURL(input)) + ); +}, "No violation reported for Worker constructor with TrustedScriptURL."); + +promise_test(async t => { + let violation = await trusted_type_violation_for(TypeError, _ => + new Worker(input) + ); + assert_equals(violation.blockedURI, "trusted-types-sink"); + assert_equals(violation.sample, `Worker constructor|${clipSampleIfNeeded(input)}`); +}, "Violation report for Worker constructor with plain string."); diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-ServiceWorkerContainer-register-worker.https.js b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-ServiceWorkerContainer-register-worker.https.js new file mode 100644 index 00000000000..cce29cb2f7b --- /dev/null +++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-ServiceWorkerContainer-register-worker.https.js @@ -0,0 +1,11 @@ +const testSetupPolicy = trustedTypes.createPolicy("p", { createScriptURL: s => s }); + +importScripts(testSetupPolicy.createScriptURL("/resources/testharness.js")); +importScripts(testSetupPolicy.createScriptURL("helper.sub.js")); +importScripts(testSetupPolicy.createScriptURL("csp-violations.js")); + +importScripts(testSetupPolicy.createScriptURL( + "trusted-types-reporting-for-ServiceWorkerContainer-register.https.js" +)); + +done(); diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-ServiceWorkerContainer-register-worker.https.js.headers b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-ServiceWorkerContainer-register-worker.https.js.headers new file mode 100644 index 00000000000..54d8b1d4c12 --- /dev/null +++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-ServiceWorkerContainer-register-worker.https.js.headers @@ -0,0 +1,2 @@ +Content-Security-Policy: require-trusted-types-for 'script'; +Content-Security-Policy: connect-src 'none'
\ No newline at end of file diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-ServiceWorkerContainer-register.https.js b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-ServiceWorkerContainer-register.https.js new file mode 100644 index 00000000000..f59799d4776 --- /dev/null +++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-ServiceWorkerContainer-register.https.js @@ -0,0 +1,27 @@ +const policy = trustedTypes.createPolicy("dummy", { createScriptURL: x => x }); +let worker_url = "worker.https.js"; +let scope = `scope1/`; + +if (getGlobalThisStr().includes("Window")) { + worker_url = `support/${worker_url}`; + scope = `support/${scope}`; +} + +promise_test(async t => { + await no_trusted_type_violation_for(async _ => { + let reg = await self.navigator.serviceWorker.getRegistration(scope); + if (reg) await reg.unregister(); + reg = await self.navigator.serviceWorker.register(policy.createScriptURL(worker_url), {scope}); + await new Promise(r => reg.addEventListener("updatefound", r)); + }); +}, "No violation reported for ServiceWorkerContainer register with TrustedScriptURL."); + +promise_test(async t => { + let violation = await trusted_type_violation_for(TypeError, async _ => { + let reg = await self.navigator.serviceWorker.getRegistration(scope); + if (reg) await reg.unregister(); + await self.navigator.serviceWorker.register(worker_url, {scope}); + }); + assert_equals(violation.blockedURI, "trusted-types-sink"); + assert_equals(violation.sample, `ServiceWorkerContainer register|${clipSampleIfNeeded(worker_url)}`); +}, "Violation report for ServiceWorkerContainer register with plain string."); diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-SharedWorker-constructor.js b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-SharedWorker-constructor.js new file mode 100644 index 00000000000..a65731a2f9c --- /dev/null +++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-SharedWorker-constructor.js @@ -0,0 +1,16 @@ +const policy = trustedTypes.createPolicy("dummy", { createScriptURL: x => x }); +const input = `data:text/javascript,${';'.repeat(100)}`; + +promise_test(async t => { + await no_trusted_type_violation_for(_ => + new SharedWorker(policy.createScriptURL(input)) + ); +}, "No violation reported for SharedWorker constructor with TrustedScriptURL."); + +promise_test(async t => { + let violation = await trusted_type_violation_for(TypeError, _ => + new SharedWorker(input) + ); + assert_equals(violation.blockedURI, "trusted-types-sink"); + assert_equals(violation.sample, `SharedWorker constructor|${clipSampleIfNeeded(input)}`); +}, "Violation report for SharedWorker constructor with plain string."); diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-eval-worker.js b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-eval-worker.js new file mode 100644 index 00000000000..2a4780dcbad --- /dev/null +++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-eval-worker.js @@ -0,0 +1,11 @@ +const testSetupPolicy = trustedTypes.createPolicy("p", { createScriptURL: s => s }); + +importScripts(testSetupPolicy.createScriptURL("/resources/testharness.js")); +importScripts(testSetupPolicy.createScriptURL("helper.sub.js")); +importScripts(testSetupPolicy.createScriptURL("csp-violations.js")); + +importScripts(testSetupPolicy.createScriptURL( + "trusted-types-reporting-for-eval.js" +)); + +done(); diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-eval-worker.js.headers b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-eval-worker.js.headers new file mode 100644 index 00000000000..54d8b1d4c12 --- /dev/null +++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-eval-worker.js.headers @@ -0,0 +1,2 @@ +Content-Security-Policy: require-trusted-types-for 'script'; +Content-Security-Policy: connect-src 'none'
\ No newline at end of file diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-eval.js b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-eval.js new file mode 100644 index 00000000000..0f8120a7a1f --- /dev/null +++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-eval.js @@ -0,0 +1,21 @@ +const policy = trustedTypes.createPolicy("dummy", { createScript: x => x }); + +promise_test(async t => { + let beacon = 'never_overwritten2'; + await no_trusted_type_violation_for(_ => + eval(policy.createScript('beacon="i ran"')) + ); + assert_equals(beacon, 'i ran'); +}, "No violation reported for eval with TrustedScript."); + +promise_test(async t => { + const input = 'beacon="should not run"'; + let beacon = 'never_overwritten'; + let violation = await trusted_type_violation_for(EvalError, _ => + eval(input) + ); + assert_true(violation.originalPolicy.includes("require-trusted-types-for 'script'")); + assert_equals(violation.blockedURI, "trusted-types-sink"); + assert_equals(violation.sample, `eval|${clipSampleIfNeeded(input)}`); + assert_equals(beacon, 'never_overwritten'); +}, "Violation report for eval with plain string.");
\ No newline at end of file diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-function-constructor-worker.js b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-function-constructor-worker.js new file mode 100644 index 00000000000..ce73b913689 --- /dev/null +++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-function-constructor-worker.js @@ -0,0 +1,11 @@ +const testSetupPolicy = trustedTypes.createPolicy("p", { createScriptURL: s => s }); + +importScripts(testSetupPolicy.createScriptURL("/resources/testharness.js")); +importScripts(testSetupPolicy.createScriptURL("helper.sub.js")); +importScripts(testSetupPolicy.createScriptURL("csp-violations.js")); + +importScripts(testSetupPolicy.createScriptURL( + "trusted-types-reporting-for-function-constructor.js" +)); + +done(); diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-function-constructor-worker.js.headers b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-function-constructor-worker.js.headers new file mode 100644 index 00000000000..54d8b1d4c12 --- /dev/null +++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-function-constructor-worker.js.headers @@ -0,0 +1,2 @@ +Content-Security-Policy: require-trusted-types-for 'script'; +Content-Security-Policy: connect-src 'none'
\ No newline at end of file diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-function-constructor.js b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-function-constructor.js new file mode 100644 index 00000000000..51d04b661f4 --- /dev/null +++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-function-constructor.js @@ -0,0 +1,29 @@ +const policy = trustedTypes.createPolicy("dummy", { createScript: x => x }); + +const AsyncFunction = async function() {}.constructor; +const GeneratorFunction = function*() {}.constructor; +const AsyncGeneratorFunction = async function*() {}.constructor; + +const input = `return${';'.repeat(100)}`; +[Function, AsyncFunction, GeneratorFunction, AsyncGeneratorFunction].forEach(functionConstructor => { + promise_test(async t => { + await no_trusted_type_violation_for(_ => + new functionConstructor(policy.createScript(input)) + ); + }, `No violation reported for ${functionConstructor.name} with TrustedScript.`); + + promise_test(async t => { + await no_trusted_type_violation_for(_ => + new functionConstructor(policy.createScript('a'), policy.createScript(input)) + ); + }, `No violation reported for ${functionConstructor.name} with multiple TrustedScript args.`); + + promise_test(async t => { + let violation = await trusted_type_violation_for(EvalError, _ => + new functionConstructor(input) + ); + assert_true(violation.originalPolicy.includes("require-trusted-types-for 'script'")); + assert_equals(violation.blockedURI, "trusted-types-sink"); + assert_equals(violation.sample, `Function|${clipSampleIfNeeded(`(\n) {\n${input}\n}`)}`); + }, `Violation report for ${functionConstructor.name} with plain string.`); +}); diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-importScripts.js b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-importScripts.js new file mode 100644 index 00000000000..c8de9f8d5fd --- /dev/null +++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-importScripts.js @@ -0,0 +1,24 @@ +const testSetupPolicy = trustedTypes.createPolicy("p", { createScriptURL: s => s }); + +importScripts(testSetupPolicy.createScriptURL("/resources/testharness.js")); +importScripts(testSetupPolicy.createScriptURL("helper.sub.js")); +importScripts(testSetupPolicy.createScriptURL("csp-violations.js")); + +const policy = trustedTypes.createPolicy("dummy", { createScriptURL: x => x }); +const input = `data:text/javascript,${`;`.repeat(100)}`; + +promise_test(async t => { + await no_trusted_type_violation_for(_ => + importScripts(policy.createScriptURL(input)) + ); +}, "No violation reported for importScripts with TrustedScriptURL."); + +promise_test(async t => { + let violation = await trusted_type_violation_for(TypeError, _ => + importScripts(input) + ); + assert_equals(violation.blockedURI, "trusted-types-sink"); + assert_equals(violation.sample, `WorkerGlobalScope importScripts|${clipSampleIfNeeded(input)}`); +}, "Violation report for importScripts with plain string."); + +done(); diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-importScripts.js.headers b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-importScripts.js.headers new file mode 100644 index 00000000000..54d8b1d4c12 --- /dev/null +++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-importScripts.js.headers @@ -0,0 +1,2 @@ +Content-Security-Policy: require-trusted-types-for 'script'; +Content-Security-Policy: connect-src 'none'
\ No newline at end of file diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-sandbox-no-allow-scripts.html b/tests/wpt/tests/trusted-types/support/trusted-types-sandbox-no-allow-scripts.html new file mode 100644 index 00000000000..11967a4d97f --- /dev/null +++ b/tests/wpt/tests/trusted-types/support/trusted-types-sandbox-no-allow-scripts.html @@ -0,0 +1,7 @@ +<!DOCTYPE html> +<!-- The CSP spec says a sandbox directive in a <meta> tag is ignored, so we set + it and other rules in the .headers file. Please refer to that file. --> +<p>Sandboxed frame without allow-scripts</p> +<script> + parent.postMessage("I can execute scripts", "*"); +</script> diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-sandbox-no-allow-scripts.html.headers b/tests/wpt/tests/trusted-types/support/trusted-types-sandbox-no-allow-scripts.html.headers new file mode 100644 index 00000000000..da0823c6bc5 --- /dev/null +++ b/tests/wpt/tests/trusted-types/support/trusted-types-sandbox-no-allow-scripts.html.headers @@ -0,0 +1,3 @@ +Content-Security-Policy: sandbox; +Content-Security-Policy: trusted-types AllowedPolicyName default; +Content-Security-Policy: require-trusted-types-for 'script'; diff --git a/tests/wpt/tests/trusted-types/trusted-types-eval-reporting-no-unsafe-eval.html b/tests/wpt/tests/trusted-types/trusted-types-eval-reporting-no-unsafe-eval.html index 69b5bf3c1d1..27bd4644496 100644 --- a/tests/wpt/tests/trusted-types/trusted-types-eval-reporting-no-unsafe-eval.html +++ b/tests/wpt/tests/trusted-types/trusted-types-eval-reporting-no-unsafe-eval.html @@ -3,24 +3,12 @@ <script nonce="123" src="/resources/testharness.js"></script> <script nonce="123"src="/resources/testharnessreport.js"></script> <script src="./support/csp-violations.js"></script> + <meta http-equiv="Content-Security-Policy" content="script-src http: https: 'nonce-123' 'report-sample'"> + <meta http-equiv="Content-Security-Policy" content="connect-src 'none'"> + <meta http-equiv="Content-Security-Policy" content="require-trusted-types-for 'script'"> </head> <body> <script nonce="123"> - // CSP insists the "trusted-types: ..." directives are deliverd as headers - // (rather than as "<meta http-equiv" tags). This test assumes the following - // headers are set in the .headers file: - // - // Content-Security-Policy: script-src 'unsafe-inline'; report-uri ... - // Content-Security-Policy: connect-src 'none' - // Content-Security-Policy: require-trusted-types-for 'script' - // - // The second rule is there so we can provoke a CSP violation report at will. - // The intent is that in order to test that a violation has *not* been thrown - // (and without resorting to abominations like timeouts), we force a *another* - // CSP violation (by violating the connect-src rule) and when that event is - // processed we can we sure that an earlier event - if it indeed occurred - - // must have already been processed. - // A sample policy we use to test trustedTypes.createPolicy behaviour. const id = x => x; const a_policy = { diff --git a/tests/wpt/tests/trusted-types/trusted-types-eval-reporting-no-unsafe-eval.html.headers b/tests/wpt/tests/trusted-types/trusted-types-eval-reporting-no-unsafe-eval.html.headers deleted file mode 100644 index 72cebc03552..00000000000 --- a/tests/wpt/tests/trusted-types/trusted-types-eval-reporting-no-unsafe-eval.html.headers +++ /dev/null @@ -1,3 +0,0 @@ -Content-Security-Policy: script-src http: https: 'nonce-123' 'report-sample' -Content-Security-Policy: connect-src 'none' -Content-Security-Policy: require-trusted-types-for 'script' diff --git a/tests/wpt/tests/trusted-types/trusted-types-eval-reporting-report-only.html b/tests/wpt/tests/trusted-types/trusted-types-eval-reporting-report-only.html index a9e14f09e4a..09b2f1c2585 100644 --- a/tests/wpt/tests/trusted-types/trusted-types-eval-reporting-report-only.html +++ b/tests/wpt/tests/trusted-types/trusted-types-eval-reporting-report-only.html @@ -3,23 +3,13 @@ <script nonce="123" src="/resources/testharness.js"></script> <script nonce="123" src="/resources/testharnessreport.js"></script> <script nonce="123" src="./support/csp-violations.js"></script> + <!-- Content-Security-Policy-Report-Only directives are not supported on meta + tags per https://www.w3.org/TR/CSP3/#cspro-header. This test sets at + least one such directive in a .headers file. Please refer to that file + for the complete set of CSP rules that apply to this test. --> </head> <body> <script nonce="123"> - // CSP insists the "trusted-types: ..." directives are delivered as headers - // (rather than as "<meta http-equiv" tags). This test assumes the following - // headers are set in the .headers file: - // - // Content-Security-Policy: script-src 'unsafe-inline' 'unsafe-eval'; report-uri ... - // Content-Security-Policy: connect-src 'none' - // Content-Security-Policy-Report-Only: require-trusted-types-for 'script' - // - // The last rule is there so we can provoke a CSP violation report at will. - // The intent is that in order to test that a violation has *not* been thrown - // (and without resorting to abominations like timeouts), we force a *another* - // CSP violation (by violating the img-src rule) and when that event is - // processed we can we sure that an earlier event - if it indeed occurred - - // must have already been processed. // A sample policy we use to test trustedTypes.createPolicy behaviour. const id = x => x; diff --git a/tests/wpt/tests/trusted-types/trusted-types-eval-reporting.html b/tests/wpt/tests/trusted-types/trusted-types-eval-reporting.html deleted file mode 100644 index d037c058d9b..00000000000 --- a/tests/wpt/tests/trusted-types/trusted-types-eval-reporting.html +++ /dev/null @@ -1,53 +0,0 @@ -<!DOCTYPE html> -<head> - <script nonce="123" src="/resources/testharness.js"></script> - <script nonce="123" src="/resources/testharnessreport.js"></script> - <script nonce="123" src="./support/csp-violations.js"></script> -</head> -<body> - <script nonce="123"> - // CSP insists the "trusted-types: ..." directives are delivered as headers - // (rather than as "<meta http-equiv" tags). This test assumes the following - // headers are set in the .headers file: - // - // Content-Security-Policy: script-src 'unsafe-inline' 'unsafe-eval'; report-uri ... - // Content-Security-Policy: connect-src 'none' - // Content-Security-Policy: require-trusted-types-for 'script' - // - // The last rule is there so we can provoke a CSP violation report at will. - // The intent is that in order to test that a violation has *not* been thrown - // (and without resorting to abominations like timeouts), we force a *another* - // CSP violation (by violating the img-src rule) and when that event is - // processed we can we sure that an earlier event - if it indeed occurred - - // must have already been processed. - - // A sample policy we use to test trustedTypes.createPolicy behaviour. - const id = x => x; - const a_policy = { - createHTML: id, - createScriptURL: id, - createScript: id, - }; - const scriptyPolicy = trustedTypes.createPolicy('allowEval', a_policy); - - promise_test(async t => { - const input = 'beacon="should not run"'; - let beacon = 'never_overwritten'; - let violation = await trusted_type_violation_for(EvalError, _ => - eval(input) - ); - assert_true(violation.originalPolicy.includes("require-trusted-types-for 'script'")); - assert_equals(violation.sample, `eval|${clipSampleIfNeeded(input)}`); - assert_equals(beacon, 'never_overwritten'); - }, "Trusted Type violation report: evaluating a string."); - - promise_test(async t => { - let beacon = 'never_overwritten2'; - await no_trusted_type_violation_for(_ => - eval(scriptyPolicy.createScript('beacon="i ran"')) - ); - assert_equals(beacon, 'i ran'); - }, "Trusted Type violation report: evaluating a Trusted Script."); - - </script> -</body> diff --git a/tests/wpt/tests/trusted-types/trusted-types-eval-reporting.html.headers b/tests/wpt/tests/trusted-types/trusted-types-eval-reporting.html.headers deleted file mode 100644 index 1e57f8bf585..00000000000 --- a/tests/wpt/tests/trusted-types/trusted-types-eval-reporting.html.headers +++ /dev/null @@ -1,4 +0,0 @@ -Content-Security-Policy: script-src http: https: 'nonce-123' 'unsafe-eval' -Content-Security-Policy: connect-src 'none' -Content-Security-Policy: require-trusted-types-for 'script' - diff --git a/tests/wpt/tests/trusted-types/trusted-types-report-only.html b/tests/wpt/tests/trusted-types/trusted-types-report-only.html index f4386f832f4..7b1a9c7e302 100644 --- a/tests/wpt/tests/trusted-types/trusted-types-report-only.html +++ b/tests/wpt/tests/trusted-types/trusted-types-report-only.html @@ -3,7 +3,11 @@ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/content-security-policy/support/testharness-helper.js"></script> -<script src="./support/csp-violations.js"></script> + <script src="./support/csp-violations.js"></script> + <!-- Content-Security-Policy-Report-Only directives are not supported on meta + tags per https://www.w3.org/TR/CSP3/#cspro-header. This test sets at + least one such directive in a .headers file. Please refer to that file + for the complete set of CSP rules that apply to this test. --> </head> <body> @@ -14,12 +18,6 @@ <script id="script2"></script> <script> - // CSP insists the "trusted-types: ..." directives are delivered as headers - // (rather than as "meta http-equiv" tags). This test assumes the following - // headers are set in the .headers file: - // - // Content-Security-Policy-Report-Only: trusted-types ...; report-uri ... - // A sample policy we use to test trustedTypes.createPolicy behaviour. const id = x => x; const policy = trustedTypes.createPolicy("two", { @@ -30,10 +28,10 @@ promise_test(async t => { let violation = await trusted_type_violation_without_exception_for(_ => - document.getElementById("script").src = "// #abc" + document.getElementById("script").src = "support/namespaces.js#abc" ); assert_true(violation.originalPolicy.includes("trusted-types two")); - assert_true(document.getElementById("script").src.endsWith("// #abc")); + assert_true(document.getElementById("script").src.endsWith("#abc")); }, "Trusted Type violation report-only: assign string to script url"); promise_test(async t => { diff --git a/tests/wpt/tests/trusted-types/trusted-types-report-only.html.headers b/tests/wpt/tests/trusted-types/trusted-types-report-only.html.headers index 602186027d0..096c0b40195 100644 --- a/tests/wpt/tests/trusted-types/trusted-types-report-only.html.headers +++ b/tests/wpt/tests/trusted-types/trusted-types-report-only.html.headers @@ -1,2 +1,2 @@ -Content-Security-Policy-Report-Only: trusted-types two; report-uri /content-security-policy/resources/dummy-report.php; require-trusted-types-for 'script'; +Content-Security-Policy-Report-Only: trusted-types two; require-trusted-types-for 'script'; Content-Security-Policy: connect-src 'none' diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-check-report-DedicatedWorker-create-policy.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-check-report-DedicatedWorker-create-policy.html new file mode 100644 index 00000000000..71576c4ecc1 --- /dev/null +++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-check-report-DedicatedWorker-create-policy.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<html> +<head> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <title>Check Trusted Type violation reports (DedicatedWorker, createPolicy)</title> + +<!-- We assume these HTTP headers are set on the request: + + Set-Cookie: trusted-types-reporting-check-report-DedicatedWorker-create-policy={{$id:uuid()}}; Path=/trusted-types/ + Content-Security-Policy-Report-Only: \ + trusted-types one two; \ + report-uri /reporting/resources/report.py?op=put&reportID={{$id}} +--> +</head> +<body> + <script> + // Make sure checkReport.sub.js tests are executed after the worker tests, + // otherwise the violation reports may not have been sent yet. + setup({explicit_done: true}); + fetch_tests_from_worker(new Worker( + "support/trusted-types-reporting-check-report-create-policy-worker.js" + )).then(() => { + let script = document.createElement("script"); + script.src='../content-security-policy/support/checkReport.sub.js?reportField=violated-directive&reportValue=trusted-types&testName=Test report-uri works with trusted-types violation.&reportCount=2'; + script.onload = done; + document.body.appendChild(script); + }); + </script> +</body> +</html> diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-check-report-DedicatedWorker-sink-mismatch.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-check-report-DedicatedWorker-sink-mismatch.html new file mode 100644 index 00000000000..72354a99eed --- /dev/null +++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-check-report-DedicatedWorker-sink-mismatch.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<html> +<head> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <title>Check Trusted Type violation reports (DedicatedWorker, sink mismatch)</title> + +<!-- We assume these HTTP headers are set on the request: + + Set-Cookie: trusted-types-reporting-check-report-DedicatedWorker-sink-mismatch={{$id:uuid()}}; Path=/trusted-types/ + Content-Security-Policy-Report-Only: \ + require-trusted-type-for 'script'; \ + report-uri /reporting/resources/report.py?op=put&reportID={{$id}} +--> +</head> +<body> + <script> + // Make sure checkReport.sub.js tests are executed after the worker tests, + // otherwise the violation reports may not have been sent yet. + setup({explicit_done: true}); + fetch_tests_from_worker(new Worker( + "support/trusted-types-reporting-check-report-sink-mismatch-worker.js" + )).then(() => { + let script = document.createElement("script"); + script.src='../content-security-policy/support/checkReport.sub.js?reportField=violated-directive&reportValue=require-trusted-types-for&testName=Test report-uri works with require-trusted-types-for violation.&reportCount=3'; + script.onload = done; + document.body.appendChild(script); + }); + </script> +</body> +</html> diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-check-report.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-check-report-Window-create-policy.html index ae5ac25052d..4c9506c5b43 100644 --- a/tests/wpt/tests/trusted-types/trusted-types-reporting-check-report.html +++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-check-report-Window-create-policy.html @@ -3,20 +3,18 @@ <head> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> - <title>Check Trusted Type violation reports</title> + <title>Check Trusted Type violation reports (Window, createPolicy)</title> <!-- We assume these HTTP headers are set on the request: - Set-Cookie: trusted-types-reporting-check-report={{$id:uuid()}}; Path=/trusted-types/ + Set-Cookie: trusted-types-reporting-check-report-Window-create-policy={{$id:uuid()}}; Path=/trusted-types/ Content-Security-Policy-Report-Only: \ trusted-types one two; \ report-uri /reporting/resources/report.py?op=put&reportID={{$id}} --> </head> <body> - <script> - trustedTypes.createPolicy("three", {}); - </script> - <script async defer src='../content-security-policy/support/checkReport.sub.js?reportField=violated-directive&reportValue=trusted-types'></script> + <script src="support/trusted-types-reporting-check-report-create-policy.js"></script> + <script async defer src='../content-security-policy/support/checkReport.sub.js?reportField=violated-directive&reportValue=trusted-types&testName=Test report-uri works with trusted-types violation.&reportCount=2'></script> </body> </html> diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-check-report.html.sub.headers b/tests/wpt/tests/trusted-types/trusted-types-reporting-check-report-Window-create-policy.html.sub.headers index c055bdc6563..4653c9d7031 100644 --- a/tests/wpt/tests/trusted-types/trusted-types-reporting-check-report.html.sub.headers +++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-check-report-Window-create-policy.html.sub.headers @@ -2,5 +2,5 @@ Expires: Mon, 26 Jul 1997 05:00:00 GMT Cache-Control: no-store, no-cache, must-revalidate Cache-Control: post-check=0, pre-check=0, false Pragma: no-cache -Set-Cookie: trusted-types-reporting-check-report={{$id:uuid()}}; Path=/trusted-types/ +Set-Cookie: trusted-types-reporting-check-report-Window-create-policy={{$id:uuid()}}; Path=/trusted-types/ Content-Security-Policy-Report-Only: trusted-types one two; report-uri /reporting/resources/report.py?op=put&reportID={{$id}} diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-check-report-Window-sink-mismatch.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-check-report-Window-sink-mismatch.html new file mode 100644 index 00000000000..ad855dfb2f1 --- /dev/null +++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-check-report-Window-sink-mismatch.html @@ -0,0 +1,20 @@ +<!DOCTYPE html> +<html> +<head> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <title>Check Trusted Type violation reports (DedicatedWorker, sink mismatch)</title> + +<!-- We assume these HTTP headers are set on the request: + + Set-Cookie: trusted-types-reporting-check-report-Window-sink-mismatch={{$id:uuid()}}; Path=/trusted-types/ + Content-Security-Policy-Report-Only: \ + require-trusted-type-for 'script'; \ + report-uri /reporting/resources/report.py?op=put&reportID={{$id}} +--> +</head> +<body> + <script nonce="123" src="support/trusted-types-reporting-check-report-sink-mismatch.js"></script> + <script async defer src='../content-security-policy/support/checkReport.sub.js?reportField=violated-directive&reportValue=require-trusted-types-for&testName=Test report-uri works with require-trusted-types-for violation.&reportCount=3'></script> +</body> +</html> diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-check-report-Window-sink-mismatch.html.sub.headers b/tests/wpt/tests/trusted-types/trusted-types-reporting-check-report-Window-sink-mismatch.html.sub.headers new file mode 100644 index 00000000000..62a0c13f0a3 --- /dev/null +++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-check-report-Window-sink-mismatch.html.sub.headers @@ -0,0 +1,7 @@ +Expires: Mon, 26 Jul 1997 05:00:00 GMT +Cache-Control: no-store, no-cache, must-revalidate +Cache-Control: post-check=0, pre-check=0, false +Pragma: no-cache +Set-Cookie: trusted-types-reporting-check-report-Window-sink-mismatch={{$id:uuid()}}; Path=/trusted-types/ +Content-Security-Policy: script-src http: https: 'nonce-123' +Content-Security-Policy-Report-Only: require-trusted-types-for 'script'; report-uri /reporting/resources/report.py?op=put&reportID={{$id}} diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-for-DedicatedWorker-DedicatedWorker-constructor.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-DedicatedWorker-DedicatedWorker-constructor.html new file mode 100644 index 00000000000..b70a074fc7f --- /dev/null +++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-DedicatedWorker-DedicatedWorker-constructor.html @@ -0,0 +1,9 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<body> +<script> + fetch_tests_from_worker(new Worker( + "support/trusted-types-reporting-for-DedicatedWorker-constructor-worker.js" + )); +</script> diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-for-DedicatedWorker-ServiceWorkerContainer-register.https.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-DedicatedWorker-ServiceWorkerContainer-register.https.html new file mode 100644 index 00000000000..9db187a2f91 --- /dev/null +++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-DedicatedWorker-ServiceWorkerContainer-register.https.html @@ -0,0 +1,9 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<body> +<script> + fetch_tests_from_worker(new Worker( + "support/trusted-types-reporting-for-ServiceWorkerContainer-register-worker.https.js" + )); +</script> diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-for-DedicatedWorker-eval.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-DedicatedWorker-eval.html new file mode 100644 index 00000000000..184bc8ad333 --- /dev/null +++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-DedicatedWorker-eval.html @@ -0,0 +1,9 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<body> +<script> + fetch_tests_from_worker(new Worker( + "support/trusted-types-reporting-for-eval-worker.js" + )); +</script> diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-for-DedicatedWorker-function-constructor.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-DedicatedWorker-function-constructor.html new file mode 100644 index 00000000000..26d4e54634a --- /dev/null +++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-DedicatedWorker-function-constructor.html @@ -0,0 +1,9 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<body> +<script> + fetch_tests_from_worker(new Worker( + "support/trusted-types-reporting-for-function-constructor-worker.js" + )); +</script> diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-for-DedicatedWorker-importScripts.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-DedicatedWorker-importScripts.html new file mode 100644 index 00000000000..5db284f715c --- /dev/null +++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-DedicatedWorker-importScripts.html @@ -0,0 +1,9 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<body> +<script> + fetch_tests_from_worker(new Worker( + "support/trusted-types-reporting-for-importScripts.js" + )); +</script> diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-for-ServiceWorker-ServiceWorkerContainer-register.https.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-ServiceWorker-ServiceWorkerContainer-register.https.html new file mode 100644 index 00000000000..ac853cd8f6e --- /dev/null +++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-ServiceWorker-ServiceWorkerContainer-register.https.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<body> +<script> + // Cargo-culted from code generated from "META: worker". + (async function() { + const scope = 'support/some/scope/for/this/test'; + let reg = await navigator.serviceWorker.getRegistration(scope); + if (reg) await reg.unregister(); + reg = await navigator.serviceWorker.register( + "support/trusted-types-reporting-for-ServiceWorkerContainer-register-worker.https.js", {scope}); + fetch_tests_from_worker(reg.installing); + })(); +</script> diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-for-ServiceWorker-eval.https.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-ServiceWorker-eval.https.html new file mode 100644 index 00000000000..2d0b6315fb9 --- /dev/null +++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-ServiceWorker-eval.https.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<body> +<script> + // Cargo-culted from code generated from "META: worker". + (async function() { + const scope = 'support/some/scope/for/this/test'; + let reg = await navigator.serviceWorker.getRegistration(scope); + if (reg) await reg.unregister(); + reg = await navigator.serviceWorker.register( + "support/trusted-types-reporting-for-eval-worker.js", {scope}); + fetch_tests_from_worker(reg.installing); + })(); +</script> diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-for-ServiceWorker-function-constructor.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-ServiceWorker-function-constructor.html new file mode 100644 index 00000000000..791663dfc79 --- /dev/null +++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-ServiceWorker-function-constructor.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<body> +<script> + // Cargo-culted from code generated from "META: worker". + (async function() { + const scope = 'support/some/scope/for/this/test'; + let reg = await navigator.serviceWorker.getRegistration(scope); + if (reg) await reg.unregister(); + reg = await navigator.serviceWorker.register( + "support/trusted-types-reporting-for-function-constructor-worker.js", {scope}); + fetch_tests_from_worker(reg.installing); + })(); +</script> diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-for-ServiceWorker-importScripts.https.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-ServiceWorker-importScripts.https.html new file mode 100644 index 00000000000..865409aca1b --- /dev/null +++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-ServiceWorker-importScripts.https.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<body> +<script> + // Cargo-culted from code generated from "META: worker". + (async function() { + const scope = 'support/some/scope/for/this/test'; + let reg = await navigator.serviceWorker.getRegistration(scope); + if (reg) await reg.unregister(); + reg = await navigator.serviceWorker.register("support/trusted-types-reporting-for-importScripts.js", {scope}); + fetch_tests_from_worker(reg.installing); + })(); +</script> diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-for-ServiceWorker-setTimeout-setInterval.https.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-ServiceWorker-setTimeout-setInterval.https.html new file mode 100644 index 00000000000..34b962df085 --- /dev/null +++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-ServiceWorker-setTimeout-setInterval.https.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<body> +<script> + // Cargo-culted from code generated from "META: worker". + (async function() { + const scope = 'support/some/scope/for/this/test'; + let reg = await navigator.serviceWorker.getRegistration(scope); + if (reg) await reg.unregister(); + reg = await navigator.serviceWorker.register("support/trusted-types-reporting-for-setTimeout-setInterval-worker.js", {scope}); + fetch_tests_from_worker(reg.installing); + })(); +</script> diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-for-SharedWorker-DedicatedWorker-constructor.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-SharedWorker-DedicatedWorker-constructor.html new file mode 100644 index 00000000000..3b382d8774a --- /dev/null +++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-SharedWorker-DedicatedWorker-constructor.html @@ -0,0 +1,9 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<body> +<script> + fetch_tests_from_worker(new SharedWorker( + "support/trusted-types-reporting-for-DedicatedWorker-constructor-worker.js" + )); +</script> diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-for-SharedWorker-ServiceWorkerContainer-register.https.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-SharedWorker-ServiceWorkerContainer-register.https.html new file mode 100644 index 00000000000..00e9a75dfb0 --- /dev/null +++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-SharedWorker-ServiceWorkerContainer-register.https.html @@ -0,0 +1,9 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<body> +<script> + fetch_tests_from_worker(new SharedWorker( + "support/trusted-types-reporting-for-ServiceWorkerContainer-register-worker.https.js" + )); +</script> diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-for-SharedWorker-eval.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-SharedWorker-eval.html new file mode 100644 index 00000000000..6ae0f60351f --- /dev/null +++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-SharedWorker-eval.html @@ -0,0 +1,9 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<body> +<script> + fetch_tests_from_worker(new SharedWorker( + "support/trusted-types-reporting-for-eval-worker.js" + )); +</script> diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-for-SharedWorker-function-constructor.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-SharedWorker-function-constructor.html new file mode 100644 index 00000000000..dc77be79640 --- /dev/null +++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-SharedWorker-function-constructor.html @@ -0,0 +1,9 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<body> +<script> + fetch_tests_from_worker(new SharedWorker( + "support/trusted-types-reporting-for-function-constructor-worker.js" + )); +</script> diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-for-SharedWorker-importScripts.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-SharedWorker-importScripts.html new file mode 100644 index 00000000000..fb01333dd46 --- /dev/null +++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-SharedWorker-importScripts.html @@ -0,0 +1,9 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<body> +<script> + fetch_tests_from_worker(new SharedWorker( + "support/trusted-types-reporting-for-importScripts.js" + )); +</script> diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-for-Window-DedicatedWorker-constructor.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-Window-DedicatedWorker-constructor.html new file mode 100644 index 00000000000..3d2a91d74ca --- /dev/null +++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-Window-DedicatedWorker-constructor.html @@ -0,0 +1,10 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/helper.sub.js"></script> +<script src="support/csp-violations.js"></script> + +<meta http-equiv="Content-Security-Policy" content="require-trusted-types-for 'script'; connect-src 'none';"> +<body> +<script src="support/trusted-types-reporting-for-DedicatedWorker-constructor.js"> +</script> diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-for-Window-ServiceWorkerContainer-register.https.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-Window-ServiceWorkerContainer-register.https.html new file mode 100644 index 00000000000..482b9c333e3 --- /dev/null +++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-Window-ServiceWorkerContainer-register.https.html @@ -0,0 +1,10 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/helper.sub.js"></script> +<script src="support/csp-violations.js"></script> + +<meta http-equiv="Content-Security-Policy" content="require-trusted-types-for 'script'; connect-src 'none';"> +<body> +<script src="support/trusted-types-reporting-for-ServiceWorkerContainer-register.https.js"> +</script> diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-for-Window-SharedWorker-constructor.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-Window-SharedWorker-constructor.html new file mode 100644 index 00000000000..a03dd21be97 --- /dev/null +++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-Window-SharedWorker-constructor.html @@ -0,0 +1,10 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/helper.sub.js"></script> +<script src="support/csp-violations.js"></script> + +<meta http-equiv="Content-Security-Policy" content="require-trusted-types-for 'script'; connect-src 'none';"> +<body> +<script src="support/trusted-types-reporting-for-SharedWorker-constructor.js"> +</script> diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-for-Window-eval.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-Window-eval.html new file mode 100644 index 00000000000..7f4772aed14 --- /dev/null +++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-Window-eval.html @@ -0,0 +1,10 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/helper.sub.js"></script> +<script src="support/csp-violations.js"></script> + +<meta http-equiv="Content-Security-Policy" content="require-trusted-types-for 'script'; connect-src 'none';"> +<body> +<script src="support/trusted-types-reporting-for-eval.js"> +</script> diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-for-Window-function-constructor.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-Window-function-constructor.html new file mode 100644 index 00000000000..9b9617a9b5d --- /dev/null +++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-Window-function-constructor.html @@ -0,0 +1,10 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/helper.sub.js"></script> +<script src="support/csp-violations.js"></script> + +<meta http-equiv="Content-Security-Policy" content="require-trusted-types-for 'script'; connect-src 'none';"> +<body> +<script src="support/trusted-types-reporting-for-function-constructor.js"> +</script> diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting.html b/tests/wpt/tests/trusted-types/trusted-types-reporting.html index 5e7930382ad..7432d3bded8 100644 --- a/tests/wpt/tests/trusted-types/trusted-types-reporting.html +++ b/tests/wpt/tests/trusted-types/trusted-types-reporting.html @@ -4,30 +4,18 @@ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="./support/csp-violations.js"></script> + <!-- Content-Security-Policy-Report-Only directives are not supported on meta + tags per https://www.w3.org/TR/CSP3/#cspro-header. This test sets at + least one such directive in a .headers file. It also sets a default-src + rule to allow all scripting except 'unsafe-eval', so we can also test + reporting of this case. Please refer to that file for the complete set of + CSP rules that apply to this test. --> </head> <body> <!-- Some elements for the tests to act on. --> <script id="customscript" is="custom-script" src="a"></script> <svg><script id="svgscript"></script></svg> <script> - // CSP insists the "trusted-types: ..." directives are delivered as headers - // (rather than as "<meta http-equiv" tags). This test assumes the following - // headers are set in the .headers file: - // - // Content-Security-Policy: trusted-types one - // Content-Security-Policy-Report-Only: trusted-types two; report-uri ... - // Content-Security-Policy: connect-src 'none' - // Content-Security-Policy: default-src * 'unsafe-inline' - // - // The third rule is there so we can provoke a CSP violation report at will. - // The intent is that in order to test that a violation has *not* been thrown - // (and without resorting to abominations like timeouts), we force a *another* - // CSP violation (by violating the connect-src rule) and when that event is - // processed we can we sure that an earlier event - if it indeed occurred - - // must have already been processed. - // - // The last rule allows all scripting except 'unsafe-eval', so we can also - // test reporting of this case. const url = "" + document.location; diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting.html.headers b/tests/wpt/tests/trusted-types/trusted-types-reporting.html.headers index 7076f4106f7..5809a919913 100644 --- a/tests/wpt/tests/trusted-types/trusted-types-reporting.html.headers +++ b/tests/wpt/tests/trusted-types/trusted-types-reporting.html.headers @@ -1,5 +1,5 @@ Content-Security-Policy: trusted-types one -Content-Security-Policy-Report-Only: trusted-types two; report-uri /content-security-policy/resources/dummy-report.php +Content-Security-Policy-Report-Only: trusted-types two; Content-Security-Policy: connect-src 'none' Content-Security-Policy: default-src * 'unsafe-inline' Content-Security-Policy: require-trusted-types-for 'script' diff --git a/tests/wpt/tests/trusted-types/trusted-types-sandbox-allow-scripts.html b/tests/wpt/tests/trusted-types/trusted-types-sandbox-allow-scripts.html new file mode 100644 index 00000000000..b89cb567102 --- /dev/null +++ b/tests/wpt/tests/trusted-types/trusted-types-sandbox-allow-scripts.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js" ></script> +<script src="/resources/testharnessreport.js"></script> +<!-- The CSP spec says a sandbox directive in a <meta> tag is ignored, so we set + it and other rules in the .headers file. Please refer to that file. --> +<link rel="help" href="https://github.com/w3c/trusted-types/issues/513"> +<script> + test(_ => { + assert_throws_js(TypeError, _ => { + window.trustedTypes.createPolicy("ForbiddenPolicyName", + { createHTML: x => x}); + }); + let p = window.trustedTypes.createPolicy("AllowedPolicyName", + { createHTML: x => `[${x}]`}); + assert_equals(p.name, "AllowedPolicyName"); + assert_equals(p.createHTML("Hello World!").toString(), "[Hello World!]"); + }, "window.trustedTypes.createPolicy() in a sandboxed page with allow-scripts."); + + test(_ => { + let div = document.createElement("div"); + assert_throws_js(TypeError, _ => div.innerHTML = "abcd"); + window.trustedTypes.createPolicy("default", + { createHTML: x => x.toUpperCase()}); + div.innerHTML = "abcd"; + assert_equals(div.innerHTML, "ABCD"); + }, "Default Trusted Types policy in a sandboxed page with allow-scripts."); +</script> diff --git a/tests/wpt/tests/trusted-types/trusted-types-sandbox-allow-scripts.html.headers b/tests/wpt/tests/trusted-types/trusted-types-sandbox-allow-scripts.html.headers new file mode 100644 index 00000000000..6bd66164613 --- /dev/null +++ b/tests/wpt/tests/trusted-types/trusted-types-sandbox-allow-scripts.html.headers @@ -0,0 +1,3 @@ +Content-Security-Policy: sandbox allow-scripts; +Content-Security-Policy: trusted-types AllowedPolicyName default; +Content-Security-Policy: require-trusted-types-for 'script'; diff --git a/tests/wpt/tests/trusted-types/trusted-types-sandbox-no-allow-scripts.html b/tests/wpt/tests/trusted-types/trusted-types-sandbox-no-allow-scripts.html new file mode 100644 index 00000000000..c4e4683934e --- /dev/null +++ b/tests/wpt/tests/trusted-types/trusted-types-sandbox-no-allow-scripts.html @@ -0,0 +1,18 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js" ></script> +<script src="/resources/testharnessreport.js"></script> +<link rel="help" href="https://github.com/w3c/trusted-types/issues/513"> +<script> + let scriptExecutedInSubFrame = false; + window.addEventListener("message", _ => { + scriptExecutedInSubFrame = true + }); +</script> +<iframe id="sandboxedFrame" + src="support/trusted-types-sandbox-no-allow-scripts.html"></iframe> +<script> + promise_test(async () => { + await new Promise(resolve => window.addEventListener("load", resolve)); + assert_equals(scriptExecutedInSubFrame, false); + }, "Trusted Types CSP directives don't affect the behavior of sandboxed page without allow-scripts."); +</script> diff --git a/tests/wpt/tests/urlpattern/resources/urlpatterntestdata.json b/tests/wpt/tests/urlpattern/resources/urlpatterntestdata.json index f92ab76b71d..75f1cf86945 100644 --- a/tests/wpt/tests/urlpattern/resources/urlpatterntestdata.json +++ b/tests/wpt/tests/urlpattern/resources/urlpatterntestdata.json @@ -1202,10 +1202,11 @@ { "pattern": [{ "protocol": "http", "port": "80 " }], "inputs": [{ "protocol": "http", "port": "80" }], - "exactly_empty_components": ["port"], - "expected_match": { - "protocol": { "input": "http", "groups": {} } - } + "expected_obj": { + "protocol": "http", + "port": "80" + }, + "expected_match": null }, { "pattern": [{ "protocol": "http", "port": "100000" }], @@ -1874,7 +1875,17 @@ { "pattern": [ "https://{sub.}?example{.com/}foo" ], "inputs": [ "https://example.com/foo" ], - "expected_obj": "error" + "exactly_empty_components": [ "port" ], + "expected_obj": { + "protocol": "https", + "hostname": "{sub.}?example.com", + "pathname": "*" + }, + "expected_match": { + "protocol": { "input": "https", "groups": {} }, + "hostname": { "input": "example.com", "groups": {} }, + "pathname": { "input": "/foo", "groups": { "0": "/foo" } } + } }, { "pattern": [ "{https://}example.com/foo" ], diff --git a/tests/wpt/tests/web-animations/animation-model/animation-types/property-list.js b/tests/wpt/tests/web-animations/animation-model/animation-types/property-list.js index f31ee8e4ccf..9cfd90d17f2 100644 --- a/tests/wpt/tests/web-animations/animation-model/animation-types/property-list.js +++ b/tests/wpt/tests/web-animations/animation-model/animation-types/property-list.js @@ -439,6 +439,12 @@ const gCSSProperties1 = { { type: 'discrete', options: [ [ 'auto', 'balance' ] ] } ] }, + 'column-wrap': { + // https://drafts.csswg.org/css-multicol-2/#cwr + types: [ + { type: 'discrete', options: [ [ 'nowrap', 'wrap' ] ] } + ] + }, 'column-rule-style': { // https://drafts.csswg.org/css-multicol/#propdef-column-rule-style types: [ @@ -460,6 +466,12 @@ const gCSSProperties1 = { { type: 'discrete', options: [ [ 'auto', '1px' ] ] } ] }, + 'column-height': { + // https://drafts.csswg.org/css-multicol-2/#ch + types: [ 'length', + { type: 'discrete', options: [ [ 'auto', '1px' ] ] } + ] + }, 'counter-increment': { // https://drafts.csswg.org/css-lists-3/#propdef-counter-increment types: [ diff --git a/tests/wpt/tests/web-animations/interfaces/Animation/style-change-events.html b/tests/wpt/tests/web-animations/interfaces/Animation/style-change-events.html index d1c1c96f7b0..c64400e869d 100644 --- a/tests/wpt/tests/web-animations/interfaces/Animation/style-change-events.html +++ b/tests/wpt/tests/web-animations/interfaces/Animation/style-change-events.html @@ -306,6 +306,13 @@ const tests = { ), }); }, + trigger: UsePropertyTest(animation => { + // Get the trigger property. + animation.trigger; + + // Set the trigger property. + animation.trigger = new AnimationTrigger(); + }) }; // Check that each enumerable property and the constructor follow the diff --git a/tests/wpt/tests/webcodecs/video-decoder-no-size-in-configure.https.any.js b/tests/wpt/tests/webcodecs/video-decoder-no-size-in-configure.https.any.js index 3481b465f9e..2ad7040e08b 100644 --- a/tests/wpt/tests/webcodecs/video-decoder-no-size-in-configure.https.any.js +++ b/tests/wpt/tests/webcodecs/video-decoder-no-size-in-configure.https.any.js @@ -72,6 +72,11 @@ promise_test(async t => { decoder.decode(encodedResult.chunk); await decoder.flush(); - assert_equals(decodedResult.codedWidth, encoderConfig.width, 'decoded frame width'); - assert_equals(decodedResult.codedHeight, encoderConfig.height, 'decoded frame height'); + // Note: Coded size may vary based on decoder requirements. + assert_equals( + decodedResult.visibleRect.width, encoderConfig.width, + 'decoded frame width'); + assert_equals( + decodedResult.visibleRect.height, encoderConfig.height, + 'decoded frame height'); }, 'Test configure() without setting width and height'); diff --git a/tests/wpt/tests/webcodecs/video-encoder-orientation.https.any.js b/tests/wpt/tests/webcodecs/video-encoder-orientation.https.any.js new file mode 100644 index 00000000000..de687f11498 --- /dev/null +++ b/tests/wpt/tests/webcodecs/video-encoder-orientation.https.any.js @@ -0,0 +1,107 @@ +// META: global=window,dedicatedworker +// META: script=/common/media.js +// META: script=/webcodecs/utils.js +// META: script=/webcodecs/video-encoder-utils.js + +const defaultConfig = { + codec: 'vp8', + width: 640, + height: 480 +}; + +promise_test(async t => { + let output_chunks = []; + let codecInit = getDefaultCodecInit(t); + let decoderConfig = null; + codecInit.output = (chunk, metadata) => { + assert_not_equals(metadata, null); + if (metadata.decoderConfig) + decoderConfig = metadata.decoderConfig; + output_chunks.push(chunk); + } + + let encoder = new VideoEncoder(codecInit); + let config = defaultConfig; + encoder.configure(config); + + let frame = createFrame(640, 480, 0, {rotation: 90, flip: true}); + encoder.encode(frame); + frame.close(); + await encoder.flush(); + encoder.close(); + assert_equals(output_chunks.length, 1); + assert_equals(decoderConfig.rotation, 90); + assert_equals(decoderConfig.flip, true); +}, 'Encode video frame with orientation'); + +promise_test(async t => { + let output_chunks = []; + let codecInit = getDefaultCodecInit(t); + let decoderConfig = null; + codecInit.output = (chunk, metadata) => { + assert_not_equals(metadata, null); + if (metadata.decoderConfig) + decoderConfig = metadata.decoderConfig; + output_chunks.push(chunk); + } + + let encoder = new VideoEncoder(codecInit); + let config = defaultConfig; + encoder.configure(config); + + let frame1 = createFrame(640, 480, 0, {rotation: 90, flip: true}); + let frame2 = createFrame(640, 480, 33333, {rotation: 90, flip: false}); + let frame3 = createFrame(640, 480, 66666, {rotation: 180, flip: true}); + let frame4 = createFrame(640, 480, 99999, {rotation: 90, flip: true}); + + encoder.encode(frame1); + assert_throws_dom('DataError', () => encoder.encode(frame2)); + assert_throws_dom('DataError', () => encoder.encode(frame3)); + encoder.encode(frame4); + + frame1.close(); + frame2.close(); + frame3.close(); + frame4.close(); + + await encoder.flush(); + encoder.close(); + assert_equals(output_chunks.length, 2); + assert_equals(decoderConfig.rotation, 90); + assert_equals(decoderConfig.flip, true); +}, 'Encode video frames with different orientation has non-fatal failures'); + +promise_test(async t => { + let output_chunks = []; + let codecInit = getDefaultCodecInit(t); + let decoderConfig = null; + codecInit.output = (chunk, metadata) => { + assert_not_equals(metadata, null); + if (metadata.decoderConfig) + decoderConfig = metadata.decoderConfig; + output_chunks.push(chunk); + } + + let encoder = new VideoEncoder(codecInit); + let config = defaultConfig; + encoder.configure(config); + + let frame = createFrame(640, 480, 0, {rotation: 90, flip: true}); + encoder.encode(frame); + frame.close(); + await encoder.flush(); + assert_equals(output_chunks.length, 1); + assert_equals(decoderConfig.rotation, 90); + assert_equals(decoderConfig.flip, true); + + encoder.configure(config); + frame = createFrame(640, 480, 0, {rotation: 270, flip: false}); + encoder.encode(frame); + frame.close(); + await encoder.flush(); + assert_equals(output_chunks.length, 2); + assert_equals(decoderConfig.rotation, 270); + assert_equals(decoderConfig.flip, false); + + encoder.close(); +}, 'Encode video frames with different orientations after reconfigure'); diff --git a/tests/wpt/tests/webcodecs/video-encoder-utils.js b/tests/wpt/tests/webcodecs/video-encoder-utils.js index 916f995156e..5c8d17e5bfe 100644 --- a/tests/wpt/tests/webcodecs/video-encoder-utils.js +++ b/tests/wpt/tests/webcodecs/video-encoder-utils.js @@ -81,13 +81,21 @@ function validateBlackDots(frame, count) { return true; } -function createFrame(width, height, ts = 0) { +function createFrame(width, height, ts = 0, additionalOptions = {}) { let duration = 33333; // 30fps let text = ts.toString(); let cnv = new OffscreenCanvas(width, height); var ctx = cnv.getContext('2d'); fourColorsFrame(ctx, width, height, text); - return new VideoFrame(cnv, { timestamp: ts, duration }); + + // Merge the default options with the provided additionalOptions + const videoFrameOptions = { + timestamp: ts, + duration, + ...additionalOptions, // Spread the additional options to merge them + }; + + return new VideoFrame(cnv, videoFrameOptions); } function createDottedFrame(width, height, dots, ts) { diff --git a/tests/wpt/tests/webnn/conformance_tests/constant-reshape-optimization.https.any.js b/tests/wpt/tests/webnn/conformance_tests/constant-reshape-optimization.https.any.js new file mode 100644 index 00000000000..eaa232b7413 --- /dev/null +++ b/tests/wpt/tests/webnn/conformance_tests/constant-reshape-optimization.https.any.js @@ -0,0 +1,96 @@ +// META: title=test constant reshape optimization +// META: global=window +// META: variant=?cpu +// META: variant=?gpu +// META: variant=?npu +// META: script=../resources/utils.js +// META: timeout=long + +'use strict'; + +const tests = [{ + 'name': 'reshape + reshape + reshape + instanceNormalization float32', + 'graph': { + 'inputs': { + 'originalInput': { + 'data': [ + -97.949951171875, 29.44037628173828, -73.92131042480469, + -38.11185836791992, 41.33772659301758, -59.77853012084961, + -74.66901397705078, -68.16508483886719, 35.82481384277344, + -6.948329448699951, 54.42462158203125, 47.53074645996094, + 66.93562316894531, 76.74034881591797, 5.6758809089660645, + 25.68659210205078, 37.37651062011719, 56.252689361572266, + -16.574905395507812, 42.949893951416016, 73.8739242553711, + -99.00035095214844, -33.11322784423828, -17.380685806274414 + ], + 'descriptor': {shape: [3, 8], dataType: 'float32'}, + 'constant': true + }, + 'originalScale': { + 'data': [-94.42772674560547, 66.69620513916016, -98.56572723388672], + 'descriptor': {shape: [1, 3, 1, 1], dataType: 'float32'}, + 'constant': true + }, + 'originalBias': { + 'data': [-33.048641204833984, 4.511423587799072, -37.93617248535156], + 'descriptor': {shape: [1, 3, 1, 1], dataType: 'float32'}, + 'constant': true + }, + }, + 'operators': [ + { + 'name': 'reshape', + 'arguments': [{'input': 'originalInput'}, {'newShape': [2, 3, 2, 2]}], + 'outputs': 'reshapedInput' + }, + { + 'name': 'reshape', + 'arguments': [{'input': 'originalScale'}, {'newShape': [3]}], + 'outputs': 'reshapedScale' + }, + { + 'name': 'reshape', + 'arguments': [{'input': 'originalBias'}, {'newShape': [3]}], + 'outputs': 'reshapedBias' + }, + { + 'name': 'instanceNormalization', + 'arguments': [ + {'input': 'reshapedInput'}, { + 'options': { + 'scale': 'reshapedScale', + 'bias': 'reshapedBias', + 'epsilon': 0.000001, + 'layout': 'nchw' + } + } + ], + 'outputs': 'instanceNormOutput' + } + ], + 'expectedOutputs': { + 'instanceNormOutput': { + 'data': [ + 70.77738189697266, -179.65554809570312, 23.540178298950195, + -46.8565788269043, 119.31526184082031, -22.847837448120117, + -43.782920837402344, -34.6388053894043, -50.821895599365234, + 126.01134490966797, -127.71744537353516, -99.2166976928711, + -108.09159851074219, -139.83889770507812, 90.26488494873047, + 25.471038818359375, 22.237276077270508, 67.60342407226562, + -107.4271011352539, 35.6320915222168, -186.15142822265625, + 90.01669311523438, -15.238543510437012, -40.37141418457031 + ], + 'descriptor': {shape: [2, 3, 2, 2], dataType: 'float32'} + } + } + } +}]; + +if (navigator.ml) { + tests.forEach((test) => { + webnn_conformance_test( + buildAndExecuteGraph, getInstanceNormPrecisionTolerance, test); + }); +} else { + test(() => assert_implements(navigator.ml, 'missing navigator.ml')); +} diff --git a/tests/wpt/tests/webnn/conformance_tests/instance_normalization.https.any.js b/tests/wpt/tests/webnn/conformance_tests/instance_normalization.https.any.js index 26e0cd0aa93..08d7d6ca337 100644 --- a/tests/wpt/tests/webnn/conformance_tests/instance_normalization.https.any.js +++ b/tests/wpt/tests/webnn/conformance_tests/instance_normalization.https.any.js @@ -21,16 +21,6 @@ // MLOperand instanceNormalization( // MLOperand input, optional MLInstanceNormalizationOptions options = {}); - -const getInstanceNormPrecisionTolerance = (graphResources) => { - // according to - // https://github.com/web-platform-tests/wpt/pull/43891#discussion_r1457026316 - const toleranceValueDict = {float32: 840, float16: 8400}; - const expectedDataType = - getExpectedDataTypeOfSingleOutput(graphResources.expectedOutputs); - return {metricType: 'ULP', value: toleranceValueDict[expectedDataType]}; -}; - const instanceNormTests = [ { 'name': 'instanceNormalization float32 4D tensor default options', diff --git a/tests/wpt/tests/webnn/conformance_tests/reshape.https.any.js b/tests/wpt/tests/webnn/conformance_tests/reshape.https.any.js index fe758193730..05b8ea21e67 100644 --- a/tests/wpt/tests/webnn/conformance_tests/reshape.https.any.js +++ b/tests/wpt/tests/webnn/conformance_tests/reshape.https.any.js @@ -57,6 +57,48 @@ const reshapeTests = [ } }, { + 'name': + 'reshape float32 constant tensor to a new shape (reorder all dimensions)', + 'graph': { + 'inputs': { + 'reshapeInput': { + 'data': [ + -30.0561466217041, 99.56941986083984, 88.04620361328125, + -91.87507629394531, -23.7972354888916, -91.28665161132812, + -63.15204620361328, 12.0669527053833, -96.1172866821289, + -44.77365493774414, -80.08650970458984, -64.43756866455078, + 27.64195442199707, -96.86306762695312, 83.6834716796875, + 50.599483489990234, -20.18765640258789, -1.3904608488082886, + -96.93603515625, 65.34143829345703, 34.835994720458984, + 62.01485824584961, -2.8698415756225586, 27.903749465942383 + ], + 'descriptor': {shape: [2, 3, 4], dataType: 'float32'}, + 'constant': true + } + }, + 'operators': [{ + 'name': 'reshape', + 'arguments': [{'input': 'reshapeInput'}, {'newShape': [4, 2, 3]}], + 'outputs': 'reshapeOutput' + }], + 'expectedOutputs': { + 'reshapeOutput': { + 'data': [ + -30.0561466217041, 99.56941986083984, 88.04620361328125, + -91.87507629394531, -23.7972354888916, -91.28665161132812, + -63.15204620361328, 12.0669527053833, -96.1172866821289, + -44.77365493774414, -80.08650970458984, -64.43756866455078, + 27.64195442199707, -96.86306762695312, 83.6834716796875, + 50.599483489990234, -20.18765640258789, -1.3904608488082886, + -96.93603515625, 65.34143829345703, 34.835994720458984, + 62.01485824584961, -2.8698415756225586, 27.903749465942383 + ], + 'descriptor': {shape: [4, 2, 3], dataType: 'float32'} + } + } + } + }, + { 'name': 'reshape float32 tensor to a new shape (reduce dimensions)', 'graph': { 'inputs': { diff --git a/tests/wpt/tests/webnn/conformance_tests/subgraph.https.any.js b/tests/wpt/tests/webnn/conformance_tests/subgraph.https.any.js index 9b21d6e4f94..a494a8b7a95 100644 --- a/tests/wpt/tests/webnn/conformance_tests/subgraph.https.any.js +++ b/tests/wpt/tests/webnn/conformance_tests/subgraph.https.any.js @@ -2523,6 +2523,137 @@ const subgraphTests = [ } } }, + { + 'name': 'quantized conv2d', + 'graph': { + 'inputs': { + 'input': { + 'data': [0.05605664849281311, 0.7114229798316956, 0.6529743671417236], + 'descriptor': {shape: [1, 1, 1, 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 + }, + 'filter': { + 'data': [2, 3, 4], + 'descriptor': {shape: [1, 1, 1, 3], dataType: 'int8'}, + 'constant': true + }, + 'filterScale': { + 'data': [0.023458752938762234], + 'descriptor': {shape: [1], dataType: 'float32'}, + 'constant': true + }, + 'filterZeroPoint': { + 'data': [0], + 'descriptor': {shape: [1], dataType: 'int8'}, + 'constant': true + }, + 'bias': { + 'data': [1], + 'descriptor': {shape: [1], dataType: 'int32'}, + 'constant': true + }, + 'biasScale': { + 'data': [0.000091995115004270], + 'descriptor': {shape: [1], dataType: 'float32'}, + 'constant': true + }, + 'biasZeroPoint': { + 'data': [0], + 'descriptor': {shape: [1], dataType: 'int32'}, + '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': 'dequantizeLinear', + 'arguments': [ + {'input': 'filter'}, + {'scale': 'filterScale', 'zeroPoint': 'filterZeroPoint'} + ], + 'outputs': 'dequantizedFilter' + }, + { + 'name': 'dequantizeLinear', + 'arguments': [ + {'input': 'bias'}, + {'scale': 'biasScale', 'zeroPoint': 'biasZeroPoint'} + ], + 'outputs': 'dequantizedBias' + }, + { + 'name': 'conv2d', + 'arguments': [ + {'input': 'dequantizedInput'}, {'filter': 'dequantizedFilter'}, { + 'options': { + 'inputLayout': 'nhwc', + 'bias': 'dequantizedBias', + 'filterLayout': 'ohwi' + } + } + ], + 'outputs': 'conv2dOutput' + }, + { + 'name': 'quantizeLinear', + 'arguments': [ + {'input': 'conv2dOutput'}, + {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} + ], + 'outputs': 'quantizedConv2dOutput' + }, + { + 'name': 'dequantizeLinear', + 'arguments': [ + {'input': 'quantizedConv2dOutput'}, + {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} + ], + 'outputs': 'output' + } + ], + 'expectedOutputs': { + 'output': { + 'data': [0.11372549831867218], + 'descriptor': {shape: [1, 1, 1, 1], dataType: 'float32'} + } + } + } + }, ]; if (navigator.ml) { diff --git a/tests/wpt/tests/webnn/resources/utils.js b/tests/wpt/tests/webnn/resources/utils.js index 7cecf29061f..70c97a8454c 100644 --- a/tests/wpt/tests/webnn/resources/utils.js +++ b/tests/wpt/tests/webnn/resources/utils.js @@ -975,6 +975,15 @@ const getConv2dPrecisionTolerance = return {metricType: 'ULP', value: toleranceValueDict[expectedDataType]}; }; +const getInstanceNormPrecisionTolerance = (graphResources) => { + // according to + // https://github.com/web-platform-tests/wpt/pull/43891#discussion_r1457026316 + const toleranceValueDict = {float32: 840, float16: 8400}; + const expectedDataType = + getExpectedDataTypeOfSingleOutput(graphResources.expectedOutputs); + return {metricType: 'ULP', value: toleranceValueDict[expectedDataType]}; +}; + const getExpectedDataTypeOfSingleOutput = (expectedOutput) => { const expectedDescriptor = expectedOutput[Object.keys(expectedOutput)[0]].descriptor; diff --git a/tests/wpt/tests/webrtc/RTCIceCandidate-constructor.html b/tests/wpt/tests/webrtc/RTCIceCandidate-constructor.html index b760c7b05a5..05c0849f7a0 100644 --- a/tests/wpt/tests/webrtc/RTCIceCandidate-constructor.html +++ b/tests/wpt/tests/webrtc/RTCIceCandidate-constructor.html @@ -151,12 +151,15 @@ assert_equals(candidate.usernameFragment, null, 'usernameFragment'); }, 'new RTCIceCandidate({ ... }) with invalid candidate string and sdpMid'); +["most", "all"].forEach(howMany => { test(t => { const candidate = new RTCIceCandidate({ candidate: candidateString, sdpMid: 'video', sdpMLineIndex: 1, - usernameFragment: 'test' + usernameFragment: 'test', + relayProtocol: 'udp', + url: 'stun:stun.example.org' }); assert_equals(candidate.candidate, candidateString, 'candidate'); @@ -175,14 +178,21 @@ assert_equals(candidate.tcpType, null, 'tcpType'); assert_equals(candidate.relatedAddress, null, 'relatedAddress'); assert_equals(candidate.relatedPort, null, 'relatedPort'); - }, 'new RTCIceCandidate({ ... }) with nondefault values for all fields'); + // The remaining fields are newer, so test them seperately + if (howMany != "most") { + assert_equals(candidate.relayProtocol, 'udp', 'relayProtocol'); + assert_equals(candidate.url, 'stun:stun.example.org', 'url'); + } + }, `new RTCIceCandidate({ ... }) with nondefault values for ${howMany} fields`); test(t => { const candidate = new RTCIceCandidate({ candidate: candidateString2, sdpMid: 'video', sdpMLineIndex: 1, - usernameFragment: 'user1' + usernameFragment: 'user1', + relayProtocol: 'tcp', + url: 'turn:turn.example.net' }); assert_equals(candidate.candidate, candidateString2, 'candidate'); @@ -201,7 +211,28 @@ assert_equals(candidate.tcpType, 'active', 'tcpType'); assert_equals(candidate.relatedAddress, 'www.example.com', 'relatedAddress'); assert_equals(candidate.relatedPort, 22222, 'relatedPort'); - }, 'new RTCIceCandidate({ ... }) with nondefault values for all fields, tcp candidate'); + // The remaining fields are newer, so test them seperately + if (howMany != "most") { + assert_equals(candidate.url, 'turn:turn.example.net', 'url'); + assert_equals(candidate.relayProtocol, 'tcp', 'relayProtocol'); + } + }, `new RTCIceCandidate({ ... }) with nondefault values for ${howMany} fields, tcp candidate`); +}); + + test(t => { + let candidate = new RTCIceCandidate(new RTCIceCandidate({ + sdpMid: 'video', + relayProtocol: 'tls', + url: 'turn:turn.example.net' + })); + + assert_equals(candidate.relayProtocol, 'tls', 'relayProtocol cloned'); + assert_equals(candidate.url, 'turn:turn.example.net', 'url cloned'); + + candidate = new RTCIceCandidate(JSON.parse(JSON.stringify(candidate))); + assert_equals(candidate.relayProtocol, null, 'relayProtocol not signaled'); + assert_equals(candidate.url, null, 'url not signaled'); + }, `new RTCIceCandidate({ relayProtocol, url }) cloned vs signaled`); test(t => { // sdpMid is not validated in RTCIceCandidate diff --git a/tests/wpt/tests/webrtc/RTCPeerConnection-addIceCandidate.html b/tests/wpt/tests/webrtc/RTCPeerConnection-addIceCandidate.html index 618ef7e33c6..4517554bc0b 100644 --- a/tests/wpt/tests/webrtc/RTCPeerConnection-addIceCandidate.html +++ b/tests/wpt/tests/webrtc/RTCPeerConnection-addIceCandidate.html @@ -641,4 +641,28 @@ a=rtcp-rsize usernameFragment: usernameFragment1 }))); }, 'Add candidate with sdpMid belonging to different usernameFragment should reject with OperationError'); + + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + await pc.setRemoteDescription(sessionDesc); + const recognized = []; + await pc.addIceCandidate({ + candidate: candidateStr1, + sdpMid: sdpMid1, + get relayProtocol() { + recognized.push("relayProtocol"); + return null; + }, + get url() { + recognized.push("url"); + return null; + }, + get usernameFragment() { + recognized.push("usernameFragment"); + return null; + }, + }); + assert_array_equals(recognized, ['usernameFragment']); + }, 'addIceCandidate should not recognize relayProtocol or url'); </script> diff --git a/tests/wpt/tests/webrtc/RTCRtpReceiver-getSynchronizationSources.https.html b/tests/wpt/tests/webrtc/RTCRtpReceiver-getSynchronizationSources.https.html index cb5336f3f35..de9ad184af0 100644 --- a/tests/wpt/tests/webrtc/RTCRtpReceiver-getSynchronizationSources.https.html +++ b/tests/wpt/tests/webrtc/RTCRtpReceiver-getSynchronizationSources.https.html @@ -100,14 +100,4 @@ promise_test(async t => { assert_less_than_equal(ssrc.audioLevel, 1); }, '[audio-only] RTCRtpSynchronizationSource.audioLevel is a number [0, 1]'); -// This test only passes if the implementation is sending the RFC 6464 extension -// header and the "vad" extension attribute is not "off", otherwise -// voiceActivityFlag is absent. TODO: Consider moving this test to an -// optional-to-implement subfolder? -promise_test(async t => { - const receiver = await initiateSingleTrackCallAndReturnReceiver(t, 'audio'); - const [ssrc] = await listenForSSRCs(t, receiver); - assert_equals(typeof ssrc.voiceActivityFlag, 'boolean'); -}, '[audio-only] RTCRtpSynchronizationSource.voiceActivityFlag is a boolean'); - </script> diff --git a/tests/wpt/tests/webrtc/protocol/h265-loopback.https.html b/tests/wpt/tests/webrtc/protocol/h265-loopback.https.html new file mode 100644 index 00000000000..c3a394ef8f4 --- /dev/null +++ b/tests/wpt/tests/webrtc/protocol/h265-loopback.https.html @@ -0,0 +1,76 @@ +<!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="../RTCPeerConnection-helper.js"></script> +<script> +'use strict'; + +async function pollGetStatsUntil(t, pc, condition, pollingMs = 100) { + while (true) { + const report = await pc.getStats(); + for (const stats of report.values()) { + if (condition(report, stats) == true) { + // Condition satisfied, stop polling. + return; + } + } + await new Promise(r => t.step_timeout(r, pollingMs)); + } +} + +function isRtpWithCodec(report, stats, mimeType) { + if (stats.type != 'outbound-rtp' && stats.type != 'inbound-rtp') { + return false; // Not an RTP stats object. + } + const codec = report.get(stats.codecId); + return codec && codec.mimeType == mimeType; +} + +promise_test(async t => { + const sendCodec = RTCRtpSender.getCapabilities('video').codecs.find( + codec => codec.mimeType == 'video/H265'); + const recvCodec = RTCRtpReceiver.getCapabilities('video').codecs.find( + codec => codec.mimeType == 'video/H265'); + assert_implements_optional( + sendCodec != undefined && recvCodec != undefined, + 'H265 not available for sending or receiving. Loopback requires both.'); + + const pc1 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close()); + const pc2 = new RTCPeerConnection(); + t.add_cleanup(() => pc2.close()); + pc1.onicecandidate = (e) => pc2.addIceCandidate(e.candidate); + pc2.onicecandidate = (e) => pc1.addIceCandidate(e.candidate); + + const stream = await getNoiseStream({video:{width:640, height:360}}); + const [track] = stream.getVideoTracks(); + t.add_cleanup(() => track.stop()); + + // Negotiate H265. + const transceiver = pc1.addTransceiver(track); + transceiver.setCodecPreferences([sendCodec]); + await pc1.setLocalDescription(); + await pc2.setRemoteDescription(pc1.localDescription); + await pc2.setLocalDescription(); + await pc1.setRemoteDescription(pc2.localDescription); + + // Wait for H265 frames to be encoded and sent. + await pollGetStatsUntil(t, pc1, (report, stats) => { + if (!isRtpWithCodec(report, stats, 'video/H265')) { + return false; + } + assert_equals(stats.type, 'outbound-rtp'); + return stats.framesEncoded > 0 && stats.framesSent > 0; + }); + // Wait for H265 frames to be received and decoded. + await pollGetStatsUntil(t, pc2, (report, stats) => { + if (!isRtpWithCodec(report, stats, 'video/H265')) { + return false; + } + assert_equals(stats.type, 'inbound-rtp'); + return stats.framesReceived > 0 && stats.framesDecoded > 0; + }); +}, `Negotiate H265 loopback and verify frames are flowing`); +</script> diff --git a/tests/wpt/tests/xhr/resources/redirect.py b/tests/wpt/tests/xhr/resources/redirect.py index 3839b635e02..e2786b45031 100644 --- a/tests/wpt/tests/xhr/resources/redirect.py +++ b/tests/wpt/tests/xhr/resources/redirect.py @@ -1,10 +1,15 @@ import time +from urllib.parse import parse_qs from wptserve.utils import isomorphic_encode def main(request, response): code = int(request.GET.first(b"code", 302)) location = request.GET.first(b"location", isomorphic_encode(request.url_parts.path + u"?followed")) + if location: + location = parse_qs(u"location=" + location.decode(u"UTF-8"))[u"location"][0] + if location.startswith(u"redirect.py"): + location += u"&code=" + str(code) if b"delay" in request.GET: delay = float(request.GET.first(b"delay")) diff --git a/tests/wpt/tests/xhr/send-redirect.htm b/tests/wpt/tests/xhr/send-redirect.htm index 7d73f0f64cc..de3899f5e5d 100644 --- a/tests/wpt/tests/xhr/send-redirect.htm +++ b/tests/wpt/tests/xhr/send-redirect.htm @@ -10,36 +10,73 @@ <div id="log"></div> <script> // https://fetch.spec.whatwg.org/#statuses - var redirect_codes = new Set([301, 302, 303, 307, 308]); - function redirect(code) { - var test = async_test(`${document.title} (${code} does ${redirect_codes.has(code)? "redirect": "not redirect"})`); - test.step(function() { - var client = new XMLHttpRequest(); - client.onreadystatechange = function() { - test.step(function() { - if(client.readyState == 4) { - if (redirect_codes.has(code)) { - assert_equals(client.getResponseHeader("x-request-method"), "GET"); - assert_equals(client.getResponseHeader("x-request-content-type"), "application/x-pony"); - assert_equals(client.status, 200); - } else { - assert_equals(client.getResponseHeader("x-request-method"), null); - assert_equals(client.getResponseHeader("x-request-content-type"), null); - assert_equals(client.status, code); + const redirect_codes = new Set([301, 302, 303, 307, 308]); + function maybeRedirect(code, method="GET", redirectLocation="content.py") { + async_test(t => { + const client = new XMLHttpRequest(); + client.onreadystatechange = t.step_func(() => { + if(client.readyState == 4) { + if (redirect_codes.has(code)) { + let expected_method = method; + let expected_content_type = "application/x-pony"; + if ((method == "POST" && (code == "301" || code == "302")) || + (code == "303" && method != "GET" && method != "HEAD")) { + expected_method = "GET"; + expected_content_type = "NO"; } - test.done(); + assert_equals(client.getResponseHeader("x-request-method"), expected_method); + assert_equals(client.getResponseHeader("x-request-content-type"), expected_content_type); + assert_equals(client.status, 200); + } else { + assert_equals(client.getResponseHeader("x-request-method"), null); + assert_equals(client.getResponseHeader("x-request-content-type"), null); + assert_equals(client.status, code); } - }) - } - client.open("GET", "resources/redirect.py?location=content.py&code=" + code); + t.done(); + } + }); + client.open(method, `resources/redirect.py?location=${redirectLocation}&code=${code}`); client.setRequestHeader("Content-Type", "application/x-pony"); client.send(null); - }) + }, `${document.title} (${code}, ${method}, ${redirectLocation})`); } - for (var number of [300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 350, 399]) { - redirect(number); - } + maybeRedirect(300); + maybeRedirect(301); + maybeRedirect(302); + maybeRedirect(303); + maybeRedirect(304); + maybeRedirect(305); + maybeRedirect(306); + maybeRedirect(307); + maybeRedirect(308); + maybeRedirect(309); + maybeRedirect(310); + maybeRedirect(350); + maybeRedirect(399); + maybeRedirect(301, "POST"); + maybeRedirect(302, "POST"); + maybeRedirect(303, "POST"); + maybeRedirect(307, "POST"); + maybeRedirect(301, "HEAD"); + maybeRedirect(302, "HEAD"); + maybeRedirect(303, "HEAD"); + maybeRedirect(307, "HEAD"); + + const redirectedLocation = encodeURIComponent("redirect.py?location=content.py"); + maybeRedirect(301, "GET", redirectedLocation); + maybeRedirect(302, "GET", redirectedLocation); + maybeRedirect(303, "GET", redirectedLocation); + maybeRedirect(307, "GET", redirectedLocation); + maybeRedirect(301, "POST", redirectedLocation); + maybeRedirect(302, "POST", redirectedLocation); + maybeRedirect(303, "POST", redirectedLocation); + maybeRedirect(307, "POST", redirectedLocation); + maybeRedirect(303, "CHICKEN", redirectedLocation); + maybeRedirect(301, "HEAD", redirectedLocation); + maybeRedirect(302, "HEAD", redirectedLocation); + maybeRedirect(303, "HEAD", redirectedLocation); + maybeRedirect(307, "HEAD", redirectedLocation); </script> </body> </html> diff --git a/tests/wpt/tests/xhr/setrequestheader-case-insensitive.htm b/tests/wpt/tests/xhr/setrequestheader-case-insensitive.htm index 1aed30d1c2a..ce10482cad8 100644 --- a/tests/wpt/tests/xhr/setrequestheader-case-insensitive.htm +++ b/tests/wpt/tests/xhr/setrequestheader-case-insensitive.htm @@ -9,26 +9,28 @@ <body> <div id="log"></div> <script> - test(function() { - var client = new XMLHttpRequest() - client.open("POST", "resources/inspect-headers.py?filter_value=t1, t2, t3", false) - client.setRequestHeader("x-test", "t1") - client.setRequestHeader("X-TEST", "t2") - client.setRequestHeader("X-teST", "t3") - client.send(null) - assert_equals(client.responseText, "x-test,") - }) + test(() => { + const client = new XMLHttpRequest(); + client.open("POST", "resources/inspect-headers.py?filter_value=t1, t2, t3", false); + client.setRequestHeader("x-test", "t1"); + client.setRequestHeader("X-TEST", "t2"); + client.setRequestHeader("X-teST", "t3"); + client.send(null); + assert_equals(client.responseText, "x-test,"); + }); test(() => { - const client = new XMLHttpRequest - client.open("GET", "resources/echo-headers.py", false) - client.setRequestHeader("THIS-IS-A-TEST", "1") - client.setRequestHeader("THIS-is-A-test", "2") - client.setRequestHeader("content-TYPE", "x/x") - client.send() - assert_regexp_match(client.responseText, /content-TYPE/) - assert_regexp_match(client.responseText, /THIS-IS-A-TEST: 1, 2/) - }) + const client = new XMLHttpRequest(); + client.open("GET", "resources/echo-headers.py", false); + client.setRequestHeader("THIS-IS-A-TEST", "1"); + client.setRequestHeader("THIS-is-A-test", "2"); + client.setRequestHeader("content-TYPE", "x/x"); + client.send(); + const contentTypeHeader = client.responseText.match(/content-TYPE/gi); + const thisIsATestHeader = client.responseText.match(/THIS-IS-A-TEST: 1, 2/gi); + assert_array_equals(contentTypeHeader, ["content-TYPE"]); + assert_array_equals(thisIsATestHeader, ["THIS-IS-A-TEST: 1, 2"]); + }); </script> </body> </html> diff --git a/tests/wpt/webgl/meta/conformance/textures/image_bitmap_from_video/tex-2d-rgba-rgba-unsigned_short_4_4_4_4.html.ini b/tests/wpt/webgl/meta/conformance/textures/image_bitmap_from_video/tex-2d-rgba-rgba-unsigned_short_4_4_4_4.html.ini index dc7b31a735f..3f8b4a2e97d 100644 --- a/tests/wpt/webgl/meta/conformance/textures/image_bitmap_from_video/tex-2d-rgba-rgba-unsigned_short_4_4_4_4.html.ini +++ b/tests/wpt/webgl/meta/conformance/textures/image_bitmap_from_video/tex-2d-rgba-rgba-unsigned_short_4_4_4_4.html.ini @@ -2,3 +2,9 @@ expected: TIMEOUT [Overall test] expected: NOTRUN + + [WebGL test #1] + expected: FAIL + + [WebGL test #3] + expected: FAIL |