diff options
57 files changed, 1419 insertions, 490 deletions
diff --git a/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini b/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini index dd4ffcf4345..76b398963ae 100644 --- a/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini +++ b/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini @@ -1,4 +1,5 @@ [url-in-tags-revoke.window.html] + expected: TIMEOUT [Fetching a blob URL immediately before revoking it works in an iframe.] expected: FAIL @@ -14,3 +15,6 @@ [Opening a blob URL in a new window by clicking an <a> tag works immediately before revoking the URL.] expected: FAIL + [Fetching a blob URL immediately before revoking it works in <script> tags.] + expected: TIMEOUT + diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json index 819e9f8f8f4..f4d36982ea4 100644 --- a/tests/wpt/metadata/MANIFEST.json +++ b/tests/wpt/metadata/MANIFEST.json @@ -1225,51 +1225,51 @@ {} ] ], - "clipboard-apis/async-write-blobtext-read-blobtext-manual.https.html": [ + "clipboard-apis/async-write-image-read-image-manual.https.html": [ [ - "clipboard-apis/async-write-blobtext-read-blobtext-manual.https.html", + "clipboard-apis/async-write-image-read-image-manual.https.html", {} ] ], - "clipboard-apis/async-write-blobtext-read-text-manual.https.html": [ + "clipboard-apis/events/copy-event-manual.html": [ [ - "clipboard-apis/async-write-blobtext-read-text-manual.https.html", + "clipboard-apis/events/copy-event-manual.html", {} ] ], - "clipboard-apis/async-write-image-read-image-manual.https.html": [ + "clipboard-apis/events/cut-event-manual.html": [ [ - "clipboard-apis/async-write-image-read-image-manual.https.html", + "clipboard-apis/events/cut-event-manual.html", {} ] ], - "clipboard-apis/async-write-text-read-blobtext-manual.https.html": [ + "clipboard-apis/events/paste-event-manual.html": [ [ - "clipboard-apis/async-write-text-read-blobtext-manual.https.html", + "clipboard-apis/events/paste-event-manual.html", {} ] ], - "clipboard-apis/async-write-text-read-text-manual.https.html": [ + "clipboard-apis/text-write-read/async-write-read-manual.https.html": [ [ - "clipboard-apis/async-write-text-read-text-manual.https.html", + "clipboard-apis/text-write-read/async-write-read-manual.https.html", {} ] ], - "clipboard-apis/copy-event-manual.html": [ + "clipboard-apis/text-write-read/async-write-readText-manual.https.html": [ [ - "clipboard-apis/copy-event-manual.html", + "clipboard-apis/text-write-read/async-write-readText-manual.https.html", {} ] ], - "clipboard-apis/cut-event-manual.html": [ + "clipboard-apis/text-write-read/async-writeText-read-manual.https.html": [ [ - "clipboard-apis/cut-event-manual.html", + "clipboard-apis/text-write-read/async-writeText-read-manual.https.html", {} ] ], - "clipboard-apis/paste-event-manual.html": [ + "clipboard-apis/text-write-read/async-writeText-readText-manual.https.html": [ [ - "clipboard-apis/paste-event-manual.html", + "clipboard-apis/text-write-read/async-writeText-readText-manual.https.html", {} ] ], @@ -173091,9 +173091,9 @@ {} ] ], - "css/cssom-view/offsetTopLeftInline.html": [ + "css/cssom-view/offsetTopLeft-inline.html": [ [ - "css/cssom-view/offsetTopLeftInline.html", + "css/cssom-view/offsetTopLeft-inline.html", [ [ "/css/reference/nothing.html", @@ -295752,6 +295752,11 @@ {} ] ], + "html/browsers/the-window-object/support/BarProp-target.html": [ + [ + {} + ] + ], "html/browsers/the-window-object/support/closed.html": [ [ {} @@ -304587,6 +304592,11 @@ {} ] ], + "html/user-activation/resources/child-five.html": [ + [ + {} + ] + ], "html/user-activation/resources/child-four.html": [ [ {} @@ -309097,11 +309107,6 @@ {} ] ], - "portals/resources/portal-create-orphaned.html": [ - [ - {} - ] - ], "portals/resources/portal-cross-origin.sub.html": [ [ {} @@ -313397,6 +313402,11 @@ {} ] ], + "resources/test/tests/unit/unpaired-surrogates.html": [ + [ + {} + ] + ], "resources/test/tox.ini": [ [ {} @@ -365836,9 +365846,27 @@ {} ] ], - "css/cssom-view/offsetTopLeftEmptyInline.html": [ + "css/cssom-view/offsetTopLeft-empty-inline-offset.html": [ + [ + "css/cssom-view/offsetTopLeft-empty-inline-offset.html", + {} + ] + ], + "css/cssom-view/offsetTopLeft-empty-inline.html": [ + [ + "css/cssom-view/offsetTopLeft-empty-inline.html", + {} + ] + ], + "css/cssom-view/offsetTopLeft-leading-space-inline.html": [ + [ + "css/cssom-view/offsetTopLeft-leading-space-inline.html", + {} + ] + ], + "css/cssom-view/offsetTopLeft-trailing-space-inline.html": [ [ - "css/cssom-view/offsetTopLeftEmptyInline.html", + "css/cssom-view/offsetTopLeft-trailing-space-inline.html", {} ] ], @@ -386979,6 +387007,12 @@ {} ] ], + "html/browsers/the-window-object/noopener-noreferrer-BarProp.window.js": [ + [ + "html/browsers/the-window-object/noopener-noreferrer-BarProp.window.html", + {} + ] + ], "html/browsers/the-window-object/security-window/window-security.https.html": [ [ "html/browsers/the-window-object/security-window/window-security.https.html", @@ -397600,6 +397634,14 @@ } ] ], + "html/user-activation/activation-transfer-cross-origin-with-click-two-child-frames.sub.tentative.html": [ + [ + "html/user-activation/activation-transfer-cross-origin-with-click-two-child-frames.sub.tentative.html", + { + "testdriver": true + } + ] + ], "html/user-activation/activation-transfer-cross-origin-with-click.sub.tentative.html": [ [ "html/user-activation/activation-transfer-cross-origin-with-click.sub.tentative.html", @@ -416530,21 +416572,21 @@ {} ] ], - "portals/portals-activate-twice.html": [ + "portals/portals-activate-resolution.html": [ [ - "portals/portals-activate-twice.html", + "portals/portals-activate-resolution.html", {} ] ], - "portals/portals-adopt-predecessor.html": [ + "portals/portals-activate-twice.html": [ [ - "portals/portals-adopt-predecessor.html", + "portals/portals-activate-twice.html", {} ] ], - "portals/portals-create-orphaned.html": [ + "portals/portals-adopt-predecessor.html": [ [ - "portals/portals-create-orphaned.html", + "portals/portals-adopt-predecessor.html", {} ] ], @@ -486005,26 +486047,10 @@ "b5f0f3d9dc13d2b67264b3a61b9f0f8be0cd6ecd", "manual" ], - "clipboard-apis/async-write-blobtext-read-blobtext-manual.https.html": [ - "b374333ca944a5a675f71678f1f30f1216a100d1", - "manual" - ], - "clipboard-apis/async-write-blobtext-read-text-manual.https.html": [ - "2d78b2f186e3c761549b578555f3ac6c15145221", - "manual" - ], "clipboard-apis/async-write-image-read-image-manual.https.html": [ "351e74bd74568b4c221cd60c145c2681e1dc6ed5", "manual" ], - "clipboard-apis/async-write-text-read-blobtext-manual.https.html": [ - "4f9fe25bca588d47d4d4d045a8fa3afe0cd44314", - "manual" - ], - "clipboard-apis/async-write-text-read-text-manual.https.html": [ - "48e5adb51d249b0846398a5a742c430809972e87", - "manual" - ], "clipboard-apis/clipboard-events-synthetic.html": [ "fa40d8c20038c5a9c2cc09fe7dcfb1568de58be2", "testharness" @@ -486033,15 +486059,15 @@ "9218ee299e2b66a3bd7e70b6ac58c6cb26fdfaac", "testharness" ], - "clipboard-apis/copy-event-manual.html": [ + "clipboard-apis/events/copy-event-manual.html": [ "6f687af196fa198cda7d83f468945f9f69330568", "manual" ], - "clipboard-apis/cut-event-manual.html": [ + "clipboard-apis/events/cut-event-manual.html": [ "c5593171754cfa2bd684e1ff3a8a724283456cbd", "manual" ], - "clipboard-apis/paste-event-manual.html": [ + "clipboard-apis/events/paste-event-manual.html": [ "19e6b95c5f32a0eb7dbccb0f5bd538e9dbb1360e", "manual" ], @@ -486049,6 +486075,22 @@ "6e555e3b197ce2f448f59d61e1488a0175490145", "support" ], + "clipboard-apis/text-write-read/async-write-read-manual.https.html": [ + "b374333ca944a5a675f71678f1f30f1216a100d1", + "manual" + ], + "clipboard-apis/text-write-read/async-write-readText-manual.https.html": [ + "2d78b2f186e3c761549b578555f3ac6c15145221", + "manual" + ], + "clipboard-apis/text-write-read/async-writeText-read-manual.https.html": [ + "4f9fe25bca588d47d4d4d045a8fa3afe0cd44314", + "manual" + ], + "clipboard-apis/text-write-read/async-writeText-readText-manual.https.html": [ + "48e5adb51d249b0846398a5a742c430809972e87", + "manual" + ], "common/META.yml": [ "958883a1b07e7db13249153fc85c69d2a40363a3", "support" @@ -486150,7 +486192,7 @@ "support" ], "common/get-host-info.sub.js": [ - "595a539f1953db41ff828abfc383c030ba58baac", + "3a61167b7d55bca75b511cbff6be581ea3b725b1", "support" ], "common/get-host-info.sub.js.headers": [ @@ -486206,7 +486248,7 @@ "support" ], "common/security-features/resources/common.js": [ - "b18097b1ec2e252a59ec075d0f2c158798e38d08", + "936b39e50ed57fdf9293333658fe8966c130712b", "support" ], "common/security-features/subresource/__init__.py": [ @@ -600030,7 +600072,7 @@ "testharness" ], "css/css-scroll-snap/scroll-snap-stop-always.html": [ - "62446f54632f943eacf7e2bcd4bd1d98d346e97c", + "7d2a228688fc2011662b659803cc615dac14f350", "testharness" ], "css/css-scroll-snap/scroll-snap-type-proximity.html": [ @@ -600038,7 +600080,7 @@ "testharness" ], "css/css-scroll-snap/scrollTo-scrollBy-snaps.html": [ - "3e022f0a12147fc29dbf45905e36c74e5d221f0a", + "fba38cb703ba2d70a0fb83e69ae816942a1fbea5", "testharness" ], "css/css-scroll-snap/snap-at-user-scroll-end-manual.html": [ @@ -626745,18 +626787,30 @@ "c88b616986511b3220449c03421e827be0d2e534", "testharness" ], - "css/cssom-view/offsetTopLeftEmptyInline.html": [ + "css/cssom-view/offsetTopLeft-empty-inline-offset.html": [ "85abbb7c01cc95f46aeffb166fc8cd34669c85aa", "testharness" ], - "css/cssom-view/offsetTopLeftInScrollableParent.html": [ - "8f4433795424a00a896278173747aa9e192e181d", + "css/cssom-view/offsetTopLeft-empty-inline.html": [ + "d553cb150d9c43312e60d7bd591fbfe8cd6d5093", "testharness" ], - "css/cssom-view/offsetTopLeftInline.html": [ + "css/cssom-view/offsetTopLeft-inline.html": [ "772cc34f05bffc5b8445cd23ba13d9357269b84b", "reftest" ], + "css/cssom-view/offsetTopLeft-leading-space-inline.html": [ + "a121cdf86a124ceabe8fb4601f0512ca14c100f9", + "testharness" + ], + "css/cssom-view/offsetTopLeft-trailing-space-inline.html": [ + "3e50b78b9a264edb3f8bff3a7d71bfe6ed6060fa", + "testharness" + ], + "css/cssom-view/offsetTopLeftInScrollableParent.html": [ + "8f4433795424a00a896278173747aa9e192e181d", + "testharness" + ], "css/cssom-view/resources/elementsFromPoint.js": [ "ba986ef3f568d4971eb4e84c4faaeae6e276b975", "support" @@ -652045,6 +652099,10 @@ "760bd418db8a8f59694b79d38e36287b9f2bb625", "testharness" ], + "html/browsers/the-window-object/noopener-noreferrer-BarProp.window.js": [ + "a75a0346501a80ceef91d25ed250a2957f42cfb9", + "testharness" + ], "html/browsers/the-window-object/security-window/window-security.https.html": [ "1fb0ed7c1e62da55b890c6434bee6e46637e0209", "testharness" @@ -652053,6 +652111,10 @@ "1b0fa1211a701253b61d1eced344faa8763ad6ef", "testharness" ], + "html/browsers/the-window-object/support/BarProp-target.html": [ + "9921e7a5773db8eef8d90f5956dbade3284609e6", + "support" + ], "html/browsers/the-window-object/support/closed.html": [ "3b70598e34d0e9b46a8ba2150a1589fecfb90ea8", "support" @@ -662518,7 +662580,7 @@ "testharness" ], "html/semantics/embedded-content/the-img-element/relevant-mutations.html": [ - "0ce7a01078f793a2c6483319102ada6a33935534", + "76fdb641dffa96ce4340de2391450103e1d2bfbc", "testharness" ], "html/semantics/embedded-content/the-img-element/resources/cat.jpg": [ @@ -667453,6 +667515,10 @@ "998bac3694c6f81e099c1c9eab41c704adcf10f9", "manual" ], + "html/user-activation/activation-transfer-cross-origin-with-click-two-child-frames.sub.tentative.html": [ + "edaad261478561c15550488df56f5e82da02e9bd", + "testharness" + ], "html/user-activation/activation-transfer-cross-origin-with-click.sub.tentative.html": [ "e7d98c3b194a03da025ab5b08b5d2c47007222c4", "testharness" @@ -667473,8 +667539,12 @@ "8e2b1d07014e8bd754d943e11672fff0719bbb74", "testharness" ], + "html/user-activation/resources/child-five.html": [ + "9260a300a1bdd1561dbae8ae99e8be7a74bce337", + "support" + ], "html/user-activation/resources/child-four.html": [ - "d312803411960cc8b079d159ac3659f6de4e0d83", + "4811edb7ef0bf125d9256c6bb7c1bc863729b077", "support" ], "html/user-activation/resources/child-one.html": [ @@ -672930,7 +673000,7 @@ "testharness" ], "mixed-content/generic/mixed-content-test-case.js": [ - "e7b0baaaafa357bef3b3d90fa4c14ae669ccbd91", + "6837258c62294e6e2826bac733cbb2451f9edc12", "support" ], "mixed-content/generic/sanity-checker.js": [ @@ -683542,7 +683612,7 @@ "support" ], "portals/portal-activate-data.html": [ - "0d8ec33cae787ddd0ed22284ed0a955e312d505d", + "d35282666d824b2d44d8f4b7e29e3cb549b04cec", "testharness" ], "portals/portal-activate-event-constructor.html": [ @@ -683565,16 +683635,16 @@ "6eebca9f9d982ffd38a96bb72ff0173bcfb07903", "testharness" ], + "portals/portals-activate-resolution.html": [ + "9fb99e42b05feb9b952a2c794d586d47ffffc98c", + "testharness" + ], "portals/portals-activate-twice.html": [ "074d3f4c7ae424d1cba5c07a6728ab5671522529", "testharness" ], "portals/portals-adopt-predecessor.html": [ - "99c44f0bfc3c841cd61e6f3f8f7cdfc2a2d8595e", - "testharness" - ], - "portals/portals-create-orphaned.html": [ - "903186ff6c69b12f888286cd8dbca8cbfa0568dc", + "27e4052a67ecf42c2296850c5d0619f3e5596292", "testharness" ], "portals/portals-cross-origin-load.sub.html": [ @@ -683633,10 +683703,6 @@ "dc161c0e0b82da493aba1cb8fbefb4262b203a48", "support" ], - "portals/resources/portal-create-orphaned.html": [ - "89b927f649b9db28fdbbb1ed8d023c33203595ce", - "support" - ], "portals/resources/portal-cross-origin.sub.html": [ "145ab5a2d21295f615d3ecd5d36f9e3034a4202a", "support" @@ -683694,11 +683760,11 @@ "support" ], "portals/resources/portals-adopt-predecessor-portal.html": [ - "96de3b7e4a403f533f56e057105aca1de6b41109", + "14d1018b906e82897466af556bc97b567bf58934", "support" ], "portals/resources/portals-adopt-predecessor.html": [ - "b92ad8a17c19cd7cb159880156a25ec5b71371eb", + "287ba2c35727a1fce7ee4e72fa80fef92f747581", "support" ], "portals/resources/portals-nested-1.html": [ @@ -684498,7 +684564,7 @@ "support" ], "referrer-policy/generic/referrer-policy-test-case.js": [ - "6d570f1dc0fdb4d2973a8b8534897859ea2ab843", + "8bdbd3961b9d3a851951f111f803c3f82b9f81ce", "support" ], "referrer-policy/generic/sandboxed-iframe-with-opaque-origin.html": [ @@ -684506,7 +684572,7 @@ "testharness" ], "referrer-policy/generic/sanity-checker.js": [ - "5c01c36f35821d7df2300670b200eb9e1d701307", + "e296ce93b965b788ea79f2f2b6cff45d5dce55f0", "support" ], "referrer-policy/generic/subresource-test/area-navigate.html": [ @@ -694313,6 +694379,10 @@ "8472ba9c9ed3f0baed605813fad1717769875759", "support" ], + "resources/test/tests/unit/unpaired-surrogates.html": [ + "1b162fe71d283d63dbdaac5b3be887f5cd80d53f", + "support" + ], "resources/test/tox.ini": [ "d0c5186f15692153fe0d09ba727e4350f1de2ef7", "support" @@ -694350,7 +694420,7 @@ "support" ], "resources/testharness.js": [ - "d40817c7d4197ccc2469f646207b82d8a0af4c84", + "cb341db2050ee201a7646e1db22634682b05bc97", "support" ], "resources/testharness.js.headers": [ @@ -709538,7 +709608,7 @@ "support" ], "tools/wpt/utils.py": [ - "f98687feb5178b2f4f82f45951c4a4295407c74c", + "2d427713e4e824845b6d7871b61cd6f11ec251f6", "support" ], "tools/wpt/virtualenv.py": [ @@ -716406,7 +716476,7 @@ "support" ], "webrtc-quic/RTCQuicTransport.https.html": [ - "82427e67cb4ab231f91d6e7d04bd25f79e5f94fa", + "12c2371f8e214becabb7a8a221a875d61d002ff2", "testharness" ], "webrtc-stats/META.yml": [ @@ -724570,7 +724640,7 @@ "testharness" ], "xhr/send-redirect-post-upload.htm": [ - "5c1c6387adb78a363fb7225ca39b93b71af79b17", + "b1db8ec2ac942e09c56c721f620d4cf5d54be55c", "testharness" ], "xhr/send-redirect-to-cors.htm": [ diff --git a/tests/wpt/metadata/css/css-fonts/variations/at-font-face-font-matching.html.ini b/tests/wpt/metadata/css/css-fonts/variations/at-font-face-font-matching.html.ini index bf30dc76bd0..37f7f11182a 100644 --- a/tests/wpt/metadata/css/css-fonts/variations/at-font-face-font-matching.html.ini +++ b/tests/wpt/metadata/css/css-fonts/variations/at-font-face-font-matching.html.ini @@ -11,9 +11,6 @@ [Matching font-weight: '400' should prefer '350 399' over '351 398'] expected: FAIL - [Matching font-weight: '400' should prefer '351 398' over '501 550'] - expected: FAIL - [Matching font-weight: '400' should prefer '501 550' over '502 560'] expected: FAIL @@ -23,9 +20,6 @@ [Matching font-weight: '430' should prefer '400 425' over '350 399'] expected: FAIL - [Matching font-weight: '430' should prefer '350 399' over '340 398'] - expected: FAIL - [Matching font-weight: '430' should prefer '340 398' over '501 550'] expected: FAIL @@ -77,9 +71,6 @@ [Matching font-style: 'oblique 0deg' should prefer 'oblique 0deg' over 'oblique 5deg'] expected: FAIL - [Matching font-style: 'oblique 0deg' should prefer 'oblique 30deg 60deg' over 'oblique 40deg 50deg'] - expected: FAIL - [Matching font-style: 'oblique 0deg' should prefer 'oblique -50deg -20deg' over 'oblique -40deg -30deg'] expected: FAIL @@ -89,9 +80,6 @@ [Matching font-style: 'oblique -10deg' should prefer 'oblique -20deg -15deg' over 'oblique -60deg -30deg'] expected: FAIL - [Matching font-style: 'oblique -10deg' should prefer 'italic' over 'oblique 0deg 10deg'] - expected: FAIL - [Matching font-style: 'oblique -10deg' should prefer 'oblique 0deg 10deg' over 'oblique 40deg 50deg'] expected: FAIL @@ -161,9 +149,6 @@ [Matching font-weight: '500' should prefer '450 460' over '400'] expected: FAIL - [Matching font-style: 'oblique -20deg' should prefer 'oblique -20deg' over 'oblique -60deg -40deg'] - expected: FAIL - [Matching font-style: 'oblique 10deg' should prefer 'oblique 10deg' over 'oblique 5deg'] expected: FAIL @@ -188,9 +173,6 @@ [Matching font-stretch: '110%' should prefer '110% 120%' over '115% 116%'] expected: FAIL - [Matching font-stretch: '110%' should prefer '105%' over '100%'] - expected: FAIL - [Matching font-style: 'oblique 20deg' should prefer 'oblique -50deg -20deg' over 'oblique -40deg -30deg'] expected: FAIL @@ -206,9 +188,6 @@ [Matching font-style: 'oblique -21deg' should prefer 'oblique 30deg 60deg' over 'oblique 40deg 50deg'] expected: FAIL - [Matching font-weight: '430' should prefer '500' over '400 425'] - expected: FAIL - [Matching font-style: 'oblique 20deg' should prefer 'oblique 10deg' over 'italic'] expected: FAIL @@ -257,9 +236,6 @@ [Matching font-style: 'normal' should prefer 'oblique 10deg 40deg' over 'oblique 20deg 30deg'] expected: FAIL - [Matching font-stretch: '100%' should prefer '110% 120%' over '115% 116%'] - expected: FAIL - [Matching font-weight: '501' should prefer '450 460' over '390 410'] expected: FAIL diff --git a/tests/wpt/metadata/css/cssom-view/offsetTopLeft-empty-inline-offset.html.ini b/tests/wpt/metadata/css/cssom-view/offsetTopLeft-empty-inline-offset.html.ini new file mode 100644 index 00000000000..f17ce6e2943 --- /dev/null +++ b/tests/wpt/metadata/css/cssom-view/offsetTopLeft-empty-inline-offset.html.ini @@ -0,0 +1,19 @@ +[offsetTopLeft-empty-inline-offset.html] + [offsetTop/Left of empty inline elements should work as if they were not empty: 2] + expected: FAIL + + [offsetTop/Left of empty inline elements should work as if they were not empty: 3] + expected: FAIL + + [offsetTop/Left of empty inline elements should work as if they were not empty: 0] + expected: FAIL + + [offsetTop/Left of empty inline elements should work as if they were not empty: 1] + expected: FAIL + + [offsetTop/Left of empty inline elements should work as if they were not empty: 4] + expected: FAIL + + [offsetTop/Left of empty inline elements should work as if they were not empty: 5] + expected: FAIL + diff --git a/tests/wpt/metadata/css/cssom-view/offsetTopLeft-empty-inline.html.ini b/tests/wpt/metadata/css/cssom-view/offsetTopLeft-empty-inline.html.ini new file mode 100644 index 00000000000..8808037f366 --- /dev/null +++ b/tests/wpt/metadata/css/cssom-view/offsetTopLeft-empty-inline.html.ini @@ -0,0 +1,10 @@ +[offsetTopLeft-empty-inline.html] + [offsetTop/Left of empty inline elements should work as if they were not empty: 2] + expected: FAIL + + [offsetTop/Left of empty inline elements should work as if they were not empty: 0] + expected: FAIL + + [offsetTop/Left of empty inline elements should work as if they were not empty: 1] + expected: FAIL + diff --git a/tests/wpt/metadata/css/cssom-view/offsetTopLeft-inline.html.ini b/tests/wpt/metadata/css/cssom-view/offsetTopLeft-inline.html.ini new file mode 100644 index 00000000000..285fcace1b1 --- /dev/null +++ b/tests/wpt/metadata/css/cssom-view/offsetTopLeft-inline.html.ini @@ -0,0 +1,2 @@ +[offsetTopLeft-inline.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/cssom-view/offsetTopLeft-leading-space-inline.html.ini b/tests/wpt/metadata/css/cssom-view/offsetTopLeft-leading-space-inline.html.ini new file mode 100644 index 00000000000..1a7d06d0904 --- /dev/null +++ b/tests/wpt/metadata/css/cssom-view/offsetTopLeft-leading-space-inline.html.ini @@ -0,0 +1,10 @@ +[offsetTopLeft-leading-space-inline.html] + [offsetTop/Left of empty inline elements should work as if they were not empty: 2] + expected: FAIL + + [offsetTop/Left of empty inline elements should work as if they were not empty: 0] + expected: FAIL + + [offsetTop/Left of empty inline elements should work as if they were not empty: 1] + expected: FAIL + diff --git a/tests/wpt/metadata/css/cssom-view/offsetTopLeft-trailing-space-inline.html.ini b/tests/wpt/metadata/css/cssom-view/offsetTopLeft-trailing-space-inline.html.ini new file mode 100644 index 00000000000..973fe923c6a --- /dev/null +++ b/tests/wpt/metadata/css/cssom-view/offsetTopLeft-trailing-space-inline.html.ini @@ -0,0 +1,10 @@ +[offsetTopLeft-trailing-space-inline.html] + [offsetTop/Left of empty inline elements should work as if they were not empty: 2] + expected: FAIL + + [offsetTop/Left of empty inline elements should work as if they were not empty: 0] + expected: FAIL + + [offsetTop/Left of empty inline elements should work as if they were not empty: 1] + expected: FAIL + diff --git a/tests/wpt/metadata/encoding/encodeInto.any.js.ini b/tests/wpt/metadata/encoding/encodeInto.any.js.ini index 00c9ca32479..498ba1579cc 100644 --- a/tests/wpt/metadata/encoding/encodeInto.any.js.ini +++ b/tests/wpt/metadata/encoding/encodeInto.any.js.ini @@ -221,6 +221,96 @@ [encodeInto() with 𝌆 and destination length 4, offset 4, filler 128] expected: FAIL + [encodeInto() with 𝌆A and destination length 3, offset 4, filler 128] + expected: FAIL + + [encodeInto() with AU+df06 and destination length 4, offset 4, filler 0] + expected: FAIL + + [encodeInto() with ¥¥ and destination length 4, offset 4, filler 128] + expected: FAIL + + [encodeInto() with U+d834AU+df06A¥Hi and destination length 10, offset 4, filler 0] + expected: FAIL + + [encodeInto() with AU+df06 and destination length 4, offset 0, filler random] + expected: FAIL + + [encodeInto() with AU+df06 and destination length 4, offset 4, filler 128] + expected: FAIL + + [encodeInto() with 𝌆A and destination length 3, offset 4, filler 0] + expected: FAIL + + [encodeInto() with ¥¥ and destination length 4, offset 4, filler random] + expected: FAIL + + [encodeInto() with 𝌆 and destination length 4, offset 0, filler 128] + expected: FAIL + + [encodeInto() with 𝌆A and destination length 3, offset 0, filler random] + expected: FAIL + + [encodeInto() with ¥¥ and destination length 4, offset 0, filler random] + expected: FAIL + + [encodeInto() with 𝌆 and destination length 4, offset 4, filler random] + expected: FAIL + + [encodeInto() with U+d834AU+df06A¥Hi and destination length 10, offset 0, filler random] + expected: FAIL + + [encodeInto() with AU+df06 and destination length 4, offset 0, filler 0] + expected: FAIL + + [encodeInto() with 𝌆A and destination length 3, offset 0, filler 0] + expected: FAIL + + [encodeInto() with ¥¥ and destination length 4, offset 4, filler 0] + expected: FAIL + + [encodeInto() with 𝌆 and destination length 4, offset 0, filler random] + expected: FAIL + + [encodeInto() with U+d834AU+df06A¥Hi and destination length 10, offset 0, filler 0] + expected: FAIL + + [encodeInto() with ¥¥ and destination length 4, offset 0, filler 128] + expected: FAIL + + [encodeInto() with AU+df06 and destination length 4, offset 4, filler random] + expected: FAIL + + [encodeInto() with 𝌆 and destination length 4, offset 0, filler 0] + expected: FAIL + + [encodeInto() with U+d834AU+df06A¥Hi and destination length 10, offset 0, filler 128] + expected: FAIL + + [encodeInto() with U+d834AU+df06A¥Hi and destination length 10, offset 4, filler 128] + expected: FAIL + + [encodeInto() with ¥¥ and destination length 4, offset 0, filler 0] + expected: FAIL + + [encodeInto() with U+d834AU+df06A¥Hi and destination length 10, offset 4, filler random] + expected: FAIL + + [encodeInto() with AU+df06 and destination length 4, offset 0, filler 128] + expected: FAIL + + [encodeInto() with 𝌆A and destination length 3, offset 0, filler 128] + expected: FAIL + + [encodeInto() with 𝌆 and destination length 4, offset 4, filler 0] + expected: FAIL + + [encodeInto() with 𝌆A and destination length 3, offset 4, filler random] + expected: FAIL + + [encodeInto() with 𝌆 and destination length 4, offset 4, filler 128] + expected: FAIL + [encodeInto.any.worker.html] [encodeInto() with 𝌆A and destination length 3, offset 4, filler 128] @@ -445,3 +535,93 @@ [encodeInto() with 𝌆 and destination length 4, offset 4, filler 128] expected: FAIL + [encodeInto() with 𝌆A and destination length 3, offset 4, filler 128] + expected: FAIL + + [encodeInto() with AU+df06 and destination length 4, offset 4, filler 0] + expected: FAIL + + [encodeInto() with ¥¥ and destination length 4, offset 4, filler 128] + expected: FAIL + + [encodeInto() with U+d834AU+df06A¥Hi and destination length 10, offset 4, filler 0] + expected: FAIL + + [encodeInto() with AU+df06 and destination length 4, offset 0, filler random] + expected: FAIL + + [encodeInto() with AU+df06 and destination length 4, offset 4, filler 128] + expected: FAIL + + [encodeInto() with 𝌆A and destination length 3, offset 4, filler 0] + expected: FAIL + + [encodeInto() with ¥¥ and destination length 4, offset 4, filler random] + expected: FAIL + + [encodeInto() with 𝌆 and destination length 4, offset 0, filler 128] + expected: FAIL + + [encodeInto() with 𝌆A and destination length 3, offset 0, filler random] + expected: FAIL + + [encodeInto() with ¥¥ and destination length 4, offset 0, filler random] + expected: FAIL + + [encodeInto() with 𝌆 and destination length 4, offset 4, filler random] + expected: FAIL + + [encodeInto() with U+d834AU+df06A¥Hi and destination length 10, offset 0, filler random] + expected: FAIL + + [encodeInto() with AU+df06 and destination length 4, offset 0, filler 0] + expected: FAIL + + [encodeInto() with 𝌆A and destination length 3, offset 0, filler 0] + expected: FAIL + + [encodeInto() with ¥¥ and destination length 4, offset 4, filler 0] + expected: FAIL + + [encodeInto() with 𝌆 and destination length 4, offset 0, filler random] + expected: FAIL + + [encodeInto() with U+d834AU+df06A¥Hi and destination length 10, offset 0, filler 0] + expected: FAIL + + [encodeInto() with ¥¥ and destination length 4, offset 0, filler 128] + expected: FAIL + + [encodeInto() with AU+df06 and destination length 4, offset 4, filler random] + expected: FAIL + + [encodeInto() with 𝌆 and destination length 4, offset 0, filler 0] + expected: FAIL + + [encodeInto() with U+d834AU+df06A¥Hi and destination length 10, offset 0, filler 128] + expected: FAIL + + [encodeInto() with U+d834AU+df06A¥Hi and destination length 10, offset 4, filler 128] + expected: FAIL + + [encodeInto() with ¥¥ and destination length 4, offset 0, filler 0] + expected: FAIL + + [encodeInto() with U+d834AU+df06A¥Hi and destination length 10, offset 4, filler random] + expected: FAIL + + [encodeInto() with AU+df06 and destination length 4, offset 0, filler 128] + expected: FAIL + + [encodeInto() with 𝌆A and destination length 3, offset 0, filler 128] + expected: FAIL + + [encodeInto() with 𝌆 and destination length 4, offset 4, filler 0] + expected: FAIL + + [encodeInto() with 𝌆A and destination length 3, offset 4, filler random] + expected: FAIL + + [encodeInto() with 𝌆 and destination length 4, offset 4, filler 128] + expected: FAIL + diff --git a/tests/wpt/metadata/encoding/single-byte-decoder.html.ini b/tests/wpt/metadata/encoding/single-byte-decoder.html.ini index 21e70fcda1c..d146040e0c1 100644 --- a/tests/wpt/metadata/encoding/single-byte-decoder.html.ini +++ b/tests/wpt/metadata/encoding/single-byte-decoder.html.ini @@ -32,7 +32,7 @@ [single-byte-decoder.html?XMLHttpRequest] - expected: TIMEOUT + expected: CRASH [ISO-8859-2: iso_8859-2:1987 (XMLHttpRequest)] expected: FAIL diff --git a/tests/wpt/metadata/fetch/api/redirect/redirect-mode.any.js.ini b/tests/wpt/metadata/fetch/api/redirect/redirect-mode.any.js.ini index e0987eb6cc2..b6eadc3b5cd 100644 --- a/tests/wpt/metadata/fetch/api/redirect/redirect-mode.any.js.ini +++ b/tests/wpt/metadata/fetch/api/redirect/redirect-mode.any.js.ini @@ -1,5 +1,4 @@ [redirect-mode.any.worker.html] - expected: ERROR [same-origin redirect 301 in manual redirect and cors mode] expected: FAIL diff --git a/tests/wpt/metadata/fetch/content-type/response.window.js.ini b/tests/wpt/metadata/fetch/content-type/response.window.js.ini index 2781b3e391c..18f786d4963 100644 --- a/tests/wpt/metadata/fetch/content-type/response.window.js.ini +++ b/tests/wpt/metadata/fetch/content-type/response.window.js.ini @@ -312,12 +312,3 @@ [<iframe>: separate response Content-Type: text/plain */*;charset=gbk] expected: FAIL - [<iframe>: combined response Content-Type: text/html;" text/plain] - expected: FAIL - - [<iframe>: separate response Content-Type: text/html;" \\" text/plain] - expected: FAIL - - [<iframe>: combined response Content-Type: text/html;x=" text/plain] - expected: FAIL - diff --git a/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini b/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini index a639f15230c..87c807a49ff 100644 --- a/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini +++ b/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini @@ -11,6 +11,3 @@ [X-Content-Type-Options%3A%20nosniff%0C] expected: FAIL - [Content-Type-Options%3A%20nosniff] - expected: FAIL - diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini deleted file mode 100644 index 51f8272a6de..00000000000 --- a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[traverse_the_history_3.html] - [Multiple history traversals, last would be aborted] - expected: FAIL - diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini deleted file mode 100644 index dc2e45516de..00000000000 --- a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[traverse_the_history_5.html] - [Multiple history traversals, last would be aborted] - expected: FAIL - diff --git a/tests/wpt/metadata/html/browsers/the-window-object/noopener-noreferrer-BarProp.window.js.ini b/tests/wpt/metadata/html/browsers/the-window-object/noopener-noreferrer-BarProp.window.js.ini new file mode 100644 index 00000000000..3f8f524a7f9 --- /dev/null +++ b/tests/wpt/metadata/html/browsers/the-window-object/noopener-noreferrer-BarProp.window.js.ini @@ -0,0 +1,10 @@ +[noopener-noreferrer-BarProp.window.html] + [window.open() with noopener should have all bars visible] + expected: FAIL + + [All bars visible] + expected: FAIL + + [window.open() with noreferrer should have all bars visible] + expected: FAIL + diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/script-onerror-insertion-point-2.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/script-onerror-insertion-point-2.html.ini new file mode 100644 index 00000000000..178680e5d14 --- /dev/null +++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/script-onerror-insertion-point-2.html.ini @@ -0,0 +1,2 @@ +[script-onerror-insertion-point-2.html] + expected: TIMEOUT diff --git a/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini index a56bad443a2..66bd350083b 100644 --- a/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini +++ b/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini @@ -1,5 +1,4 @@ [realtimeanalyser-fft-scaling.html] - expected: TIMEOUT [X 2048-point FFT peak position is not equal to 64. Got 0.] expected: FAIL diff --git a/tests/wpt/metadata/webstorage/storage_setitem.html.ini b/tests/wpt/metadata/webstorage/storage_setitem.html.ini index 0f95dbcbb45..7601588891e 100644 --- a/tests/wpt/metadata/webstorage/storage_setitem.html.ini +++ b/tests/wpt/metadata/webstorage/storage_setitem.html.ini @@ -24,3 +24,39 @@ expected: FAIL bug: https://github.com/servo/servo/issues/6564 + [localStorage[\] = "U+dc00"] + expected: FAIL + + [localStorage[\] = "U+d800"] + expected: FAIL + + [localStorage[\] = "aU+df4d"] + expected: FAIL + + [sessionStorage[\] = "U+dbff"] + expected: FAIL + + [localStorage[\] = "U+d83ca"] + expected: FAIL + + [localStorage[\] = "U+dfff"] + expected: FAIL + + [sessionStorage[\] = "aU+df4d"] + expected: FAIL + + [sessionStorage[\] = "U+dfff"] + expected: FAIL + + [localStorage[\] = "U+dbff"] + expected: FAIL + + [sessionStorage[\] = "U+d800"] + expected: FAIL + + [sessionStorage[\] = "U+dc00"] + expected: FAIL + + [sessionStorage[\] = "U+d83ca"] + expected: FAIL + diff --git a/tests/wpt/web-platform-tests/clipboard-apis/copy-event-manual.html b/tests/wpt/web-platform-tests/clipboard-apis/events/copy-event-manual.html index 6f687af196f..6f687af196f 100644 --- a/tests/wpt/web-platform-tests/clipboard-apis/copy-event-manual.html +++ b/tests/wpt/web-platform-tests/clipboard-apis/events/copy-event-manual.html diff --git a/tests/wpt/web-platform-tests/clipboard-apis/cut-event-manual.html b/tests/wpt/web-platform-tests/clipboard-apis/events/cut-event-manual.html index c5593171754..c5593171754 100644 --- a/tests/wpt/web-platform-tests/clipboard-apis/cut-event-manual.html +++ b/tests/wpt/web-platform-tests/clipboard-apis/events/cut-event-manual.html diff --git a/tests/wpt/web-platform-tests/clipboard-apis/paste-event-manual.html b/tests/wpt/web-platform-tests/clipboard-apis/events/paste-event-manual.html index 19e6b95c5f3..19e6b95c5f3 100644 --- a/tests/wpt/web-platform-tests/clipboard-apis/paste-event-manual.html +++ b/tests/wpt/web-platform-tests/clipboard-apis/events/paste-event-manual.html diff --git a/tests/wpt/web-platform-tests/clipboard-apis/async-write-blobtext-read-blobtext-manual.https.html b/tests/wpt/web-platform-tests/clipboard-apis/text-write-read/async-write-read-manual.https.html index b374333ca94..b374333ca94 100644 --- a/tests/wpt/web-platform-tests/clipboard-apis/async-write-blobtext-read-blobtext-manual.https.html +++ b/tests/wpt/web-platform-tests/clipboard-apis/text-write-read/async-write-read-manual.https.html diff --git a/tests/wpt/web-platform-tests/clipboard-apis/async-write-blobtext-read-text-manual.https.html b/tests/wpt/web-platform-tests/clipboard-apis/text-write-read/async-write-readText-manual.https.html index 2d78b2f186e..2d78b2f186e 100644 --- a/tests/wpt/web-platform-tests/clipboard-apis/async-write-blobtext-read-text-manual.https.html +++ b/tests/wpt/web-platform-tests/clipboard-apis/text-write-read/async-write-readText-manual.https.html diff --git a/tests/wpt/web-platform-tests/clipboard-apis/async-write-text-read-blobtext-manual.https.html b/tests/wpt/web-platform-tests/clipboard-apis/text-write-read/async-writeText-read-manual.https.html index 4f9fe25bca5..4f9fe25bca5 100644 --- a/tests/wpt/web-platform-tests/clipboard-apis/async-write-text-read-blobtext-manual.https.html +++ b/tests/wpt/web-platform-tests/clipboard-apis/text-write-read/async-writeText-read-manual.https.html diff --git a/tests/wpt/web-platform-tests/clipboard-apis/async-write-text-read-text-manual.https.html b/tests/wpt/web-platform-tests/clipboard-apis/text-write-read/async-writeText-readText-manual.https.html index 48e5adb51d2..48e5adb51d2 100644 --- a/tests/wpt/web-platform-tests/clipboard-apis/async-write-text-read-text-manual.https.html +++ b/tests/wpt/web-platform-tests/clipboard-apis/text-write-read/async-writeText-readText-manual.https.html diff --git a/tests/wpt/web-platform-tests/common/get-host-info.sub.js b/tests/wpt/web-platform-tests/common/get-host-info.sub.js index 595a539f195..3a61167b7d5 100644 --- a/tests/wpt/web-platform-tests/common/get-host-info.sub.js +++ b/tests/wpt/web-platform-tests/common/get-host-info.sub.js @@ -3,7 +3,7 @@ function get_host_info() { var HTTP_PORT = '{{ports[http][0]}}'; var HTTP_PORT2 = '{{ports[http][1]}}'; var HTTPS_PORT = '{{ports[https][0]}}'; - var PROTOCOL = window.location.protocol; + var PROTOCOL = self.location.protocol; var IS_HTTPS = (PROTOCOL == "https:"); var HTTP_PORT_ELIDED = HTTP_PORT == "80" ? "" : (":" + HTTP_PORT); var HTTP_PORT2_ELIDED = HTTP_PORT2 == "80" ? "" : (":" + HTTP_PORT2); diff --git a/tests/wpt/web-platform-tests/common/security-features/resources/common.js b/tests/wpt/web-platform-tests/common/security-features/resources/common.js index b18097b1ec2..936b39e50ed 100644 --- a/tests/wpt/web-platform-tests/common/security-features/resources/common.js +++ b/tests/wpt/web-platform-tests/common/security-features/resources/common.js @@ -745,6 +745,136 @@ function requestViaWebSocket(url) { }); } +// Subresource paths and invokers. +const subresourceMap = { + "a-tag": { + path: "/common/security-features/subresource/document.py", + invoker: requestViaAnchor, + }, + "area-tag": { + path: "/common/security-features/subresource/document.py", + invoker: requestViaArea, + }, + "audio-tag": { + path: "/common/security-features/subresource/audio.py", + invoker: requestViaAudio, + }, + "beacon-request": { + path: "/common/security-features/subresource/empty.py", + invoker: requestViaSendBeacon, + }, + "fetch-request": { + path: "/common/security-features/subresource/xhr.py", + invoker: requestViaFetch, + }, + "form-tag": { + path: "/common/security-features/subresource/empty.py", + invoker: requestViaForm, + }, + "iframe-tag": { + path: "/common/security-features/subresource/document.py", + invoker: requestViaIframe, + }, + "img-tag": { + path: "/common/security-features/subresource/image.py", + invoker: requestViaImage, + invokerForReferrerPolicy: requestViaImageForReferrerPolicy, + }, + "link-css-tag": { + path: "/common/security-features/subresource/empty.py", + invoker: requestViaLinkStylesheet, + }, + "link-prefetch-tag": { + path: "/common/security-features/subresource/empty.py", + invoker: requestViaLinkPrefetch, + }, + "object-tag": { + path: "/common/security-features/subresource/empty.py", + invoker: requestViaObject, + }, + "picture-tag": { + path: "/common/security-features/subresource/image.py", + invoker: requestViaPicture, + }, + "script-tag": { + path: "/common/security-features/subresource/script.py", + invoker: requestViaScript, + }, + "video-tag": { + path: "/common/security-features/subresource/video.py", + invoker: requestViaVideo, + }, + "xhr-request": { + path: "/common/security-features/subresource/xhr.py", + invoker: requestViaXhr, + }, + + "worker-request": { + path: "/common/security-features/subresource/worker.py", + invoker: url => requestViaDedicatedWorker(url), + }, + // TODO: Merge "module-worker" and "module-worker-top-level". + "module-worker": { + path: "/common/security-features/subresource/worker.py", + invoker: url => requestViaDedicatedWorker(url, {type: "module"}), + }, + "module-worker-top-level": { + path: "/common/security-features/subresource/worker.py", + invoker: url => requestViaDedicatedWorker(url, {type: "module"}), + }, + "module-data-worker-import": { + path: "/common/security-features/subresource/worker.py", + invoker: url => + requestViaDedicatedWorker(workerUrlThatImports(url), {type: "module"}), + }, + "classic-data-worker-fetch": { + path: "/common/security-features/subresource/empty.py", + invoker: url => + requestViaDedicatedWorker(dedicatedWorkerUrlThatFetches(url), {}), + }, + "shared-worker": { + path: "/common/security-features/subresource/shared-worker.py", + invoker: requestViaSharedWorker, + }, + + "websocket-request": { + path: "/stash_responder", + invoker: requestViaWebSocket, + }, +}; +for (const workletType of ['animation', 'audio', 'layout', 'paint']) { + subresourceMap[`worklet-${workletType}-top-level`] = { + path: "/common/security-features/subresource/worker.py", + invoker: url => requestViaWorklet(workletType, url) + }; + subresourceMap[`worklet-${workletType}-data-import`] = { + path: "/common/security-features/subresource/worker.py", + invoker: url => + requestViaWorklet(workletType, workerUrlThatImports(url)) + }; +} + +function getRequestURLs(subresourceType, originType, redirectionType) { + const key = guid(); + const value = guid(); + + // We use the same stash path for both HTTP/S and WS/S stash requests. + const stashPath = encodeURIComponent("/mixed-content"); + + const stashEndpoint = "/common/security-features/subresource/xhr.py?key=" + + key + "&path=" + stashPath; + return { + testUrl: + getSubresourceOrigin(originType) + + subresourceMap[subresourceType].path + + "?redirection=" + encodeURIComponent(redirectionType) + + "&action=purge&key=" + key + + "&path=" + stashPath, + announceUrl: stashEndpoint + "&action=put&value=" + value, + assertUrl: stashEndpoint + "&action=take", + }; +} + // SanityChecker does nothing in release mode. See sanity-checker.js for debug // mode. function SanityChecker() {} diff --git a/tests/wpt/web-platform-tests/css/css-scroll-snap/scroll-snap-stop-always.html b/tests/wpt/web-platform-tests/css/css-scroll-snap/scroll-snap-stop-always.html index 62446f54632..7d2a228688f 100644 --- a/tests/wpt/web-platform-tests/css/css-scroll-snap/scroll-snap-stop-always.html +++ b/tests/wpt/web-platform-tests/css/css-scroll-snap/scroll-snap-stop-always.html @@ -68,4 +68,29 @@ test(() => { assert_equals(scroller.scrollTop, 0); }, "A scroll with intended end position should always choose the closest snap " + "position regardless of the scroll-snap-stop value.") + +// Tests for programmatic scrolls beyond the scroller bounds. + +test(() => { + scroller.scrollTo(0, 0); + assert_equals(scroller.scrollLeft, 0); + assert_equals(scroller.scrollTop, 0); + + scroller.scrollBy(100000, 0); + assert_equals(scroller.scrollLeft, 100); + assert_equals(scroller.scrollTop, 0); +}, "A scroll outside bounds in the snapping axis with intended direction and " + + "end position should not pass a snap area with scroll-snap-stop: always.") + +test(() => { + scroller.scrollTo(0, 0); + assert_equals(scroller.scrollLeft, 0); + assert_equals(scroller.scrollTop, 0); + + scroller.scrollBy(300, -10); + assert_equals(scroller.scrollLeft, 100); + assert_equals(scroller.scrollTop, 0); +}, "A scroll outside bounds in the non-snapping axis with intended direction " + + "and end position should not pass a snap area with scroll-snap-stop: always.") + </script> diff --git a/tests/wpt/web-platform-tests/css/css-scroll-snap/scrollTo-scrollBy-snaps.html b/tests/wpt/web-platform-tests/css/css-scroll-snap/scrollTo-scrollBy-snaps.html index 3e022f0a121..fba38cb703b 100644 --- a/tests/wpt/web-platform-tests/css/css-scroll-snap/scrollTo-scrollBy-snaps.html +++ b/tests/wpt/web-platform-tests/css/css-scroll-snap/scrollTo-scrollBy-snaps.html @@ -74,7 +74,9 @@ var viewport = document.scrollingElement; [ [{left: 800}, 1000, 0], [{top: 900}, 0, 1000], - [{left: 900, top: 800}, 1000, 1000] + [{left: 900, top: 800}, 1000, 1000], + [{left: 800, top: -100}, 1000, 0], /* outside bounds on y axis */ + [{left: 10000, top: -100}, 1000, 0] /* outside bounds on both axes */ ].forEach(([input, expectedX, expectedY]) => { test(() => { divScroller.scrollTo(0, 0); diff --git a/tests/wpt/web-platform-tests/css/cssom-view/offsetTopLeftEmptyInline.html b/tests/wpt/web-platform-tests/css/cssom-view/offsetTopLeft-empty-inline-offset.html index 85abbb7c01c..85abbb7c01c 100644 --- a/tests/wpt/web-platform-tests/css/cssom-view/offsetTopLeftEmptyInline.html +++ b/tests/wpt/web-platform-tests/css/cssom-view/offsetTopLeft-empty-inline-offset.html diff --git a/tests/wpt/web-platform-tests/css/cssom-view/offsetTopLeft-empty-inline.html b/tests/wpt/web-platform-tests/css/cssom-view/offsetTopLeft-empty-inline.html new file mode 100644 index 00000000000..d553cb150d9 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/cssom-view/offsetTopLeft-empty-inline.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/cssom-view-1/#extensions-to-the-htmlelement-interface"> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<style> + .container { + position: relative; + width: 8em; + height: 7em; + padding: 1em; + } +</style> +<div class="container" style="writing-mode:horizontal-tb;"> + <br><span class="target"></span><span>ref</span> +</div> +<div class="container" style="writing-mode:vertical-lr;"> + <br><span class="target"></span><span>ref</span> +</div> +<div class="container" style="writing-mode:vertical-rl;"> + <br><span class="target"></span><span>ref</span> +</div> +<script> +var i = 0; +document.querySelectorAll('span.target').forEach((target) => { + var ref = target.nextSibling; + test(() => { + assert_equals(target.offsetLeft, ref.offsetLeft, 'offsetLeft'); + assert_equals(target.offsetTop, ref.offsetTop, 'offsetTop'); + }, 'offsetTop/Left of empty inline elements should work as if they were not empty: ' + i); + i++; +}); +</script> diff --git a/tests/wpt/web-platform-tests/css/cssom-view/offsetTopLeftInline.html b/tests/wpt/web-platform-tests/css/cssom-view/offsetTopLeft-inline.html index 772cc34f05b..772cc34f05b 100644 --- a/tests/wpt/web-platform-tests/css/cssom-view/offsetTopLeftInline.html +++ b/tests/wpt/web-platform-tests/css/cssom-view/offsetTopLeft-inline.html diff --git a/tests/wpt/web-platform-tests/css/cssom-view/offsetTopLeft-leading-space-inline.html b/tests/wpt/web-platform-tests/css/cssom-view/offsetTopLeft-leading-space-inline.html new file mode 100644 index 00000000000..a121cdf86a1 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/cssom-view/offsetTopLeft-leading-space-inline.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/cssom-view-1/#extensions-to-the-htmlelement-interface"> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<style> + .container { + position: relative; + width: 8em; + height: 7em; + padding: 1em; + } +</style> +<div class="container" style="writing-mode:horizontal-tb;"> + <br><span class="target"> </span><span>ref</span> +</div> +<div class="container" style="writing-mode:vertical-lr;"> + <br><span class="target"> </span><span>ref</span> +</div> +<div class="container" style="writing-mode:vertical-rl;"> + <br><span class="target"> </span><span>ref</span> +</div> +<script> +var i = 0; +document.querySelectorAll('span.target').forEach((target) => { + var ref = target.nextSibling; + test(() => { + assert_equals(target.offsetLeft, ref.offsetLeft, 'offsetLeft'); + assert_equals(target.offsetTop, ref.offsetTop, 'offsetTop'); + }, 'offsetTop/Left of empty inline elements should work as if they were not empty: ' + i); + i++; +}); +</script> diff --git a/tests/wpt/web-platform-tests/css/cssom-view/offsetTopLeft-trailing-space-inline.html b/tests/wpt/web-platform-tests/css/cssom-view/offsetTopLeft-trailing-space-inline.html new file mode 100644 index 00000000000..3e50b78b9a2 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/cssom-view/offsetTopLeft-trailing-space-inline.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/cssom-view-1/#extensions-to-the-htmlelement-interface"> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<style> + .container { + position: relative; + width: 8em; + height: 7em; + padding: 1em; + } +</style> +<div class="container" style="writing-mode:horizontal-tb;"> + <br><span>ref</span><span class="target"> </span> +</div> +<div class="container" style="writing-mode:vertical-lr;"> + <br><span>ref</span><span class="target"> </span> +</div> +<div class="container" style="writing-mode:vertical-rl;"> + <br><span>ref</span><span class="target"> </span> +</div> +<script> +var i = 0; +document.querySelectorAll('span.target').forEach((target) => { + var ref = target.previousSibling; + test(() => { + assert_equals(target.offsetLeft, + ref.offsetLeft + (i ? 0 : ref.offsetWidth), + 'offsetLeft'); + assert_equals(target.offsetTop, + ref.offsetTop + (i ? ref.offsetHeight : 0), + 'offsetTop'); + }, 'offsetTop/Left of empty inline elements should work as if they were not empty: ' + i); + i++; +}); +</script> diff --git a/tests/wpt/web-platform-tests/html/browsers/the-window-object/noopener-noreferrer-BarProp.window.js b/tests/wpt/web-platform-tests/html/browsers/the-window-object/noopener-noreferrer-BarProp.window.js new file mode 100644 index 00000000000..a75a0346501 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/browsers/the-window-object/noopener-noreferrer-BarProp.window.js @@ -0,0 +1,23 @@ +const barProps = ["locationbar", "menubar", "personalbar", "scrollbars", "statusbar", "toolbar"]; + +test(() => { + for(const prop of barProps) { + assert_true(window[prop].visible); + } +}, "All bars visible"); + +["noopener", "noreferrer"].forEach(openerStyle => { + async_test(t => { + const channelName = "5454" + openerStyle + "34324"; + const channel = new BroadcastChannel(channelName); + window.open("support/BarProp-target.html?" + channelName, "", openerStyle); + channel.onmessage = t.step_func_done(e => { + // Send message first so if asserts throw the popup is still closed + channel.postMessage(null); + + for(const prop of barProps) { + assert_true(e.data[prop]); + } + }); + }, `window.open() with ${openerStyle} should have all bars visible`); +}); diff --git a/tests/wpt/web-platform-tests/html/browsers/the-window-object/support/BarProp-target.html b/tests/wpt/web-platform-tests/html/browsers/the-window-object/support/BarProp-target.html new file mode 100644 index 00000000000..9921e7a5773 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/browsers/the-window-object/support/BarProp-target.html @@ -0,0 +1,17 @@ +<!DOCTYPE html> +<script> + const barProps = ["locationbar", "menubar", "personalbar", "scrollbars", "statusbar", "toolbar"]; + const barPropsObj = {}; + const channelName = location.search.substr(1); + const channel = new BroadcastChannel(channelName); + for (const prop of barProps) { + barPropsObj[prop] = window[prop].visible; + } + channel.postMessage(barPropsObj); + + // Because messages are not delivered synchronously and because closing a + // browsing context prompts the eventual clearing of all task sources, this + // document should not be closed until the opener document has confirmed + // receipt. + channel.onmessage = () => { window.close() }; +</script> diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/relevant-mutations.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/relevant-mutations.html index 0ce7a01078f..76fdb641dff 100644 --- a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/relevant-mutations.html +++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/relevant-mutations.html @@ -21,16 +21,27 @@ <img src="/images/green-2x2.png" data-desc="src set to same value"> -<img data-desc="crossorigin absent to empty"> -<img data-desc="crossorigin absent to anonymous"> -<img data-desc="crossorigin absent to use-credentials"> -<img crossorigin data-desc="crossorigin empty to absent"> -<img crossorigin data-desc="crossorigin empty to use-credentials"> -<img crossorigin=anonymous data-desc="crossorigin anonymous to absent"> -<img crossorigin=anonymous data-desc="crossorigin anonymous to use-credentials"> -<img crossorigin=use-credentials data-desc="crossorigin use-credentials to absent"> -<img crossorigin=use-credentials data-desc="crossorigin use-credentials to empty"> -<img crossorigin=use-credentials data-desc="crossorigin use-credentials to anonymous"> +<img data-desc="crossorigin absent to empty, src absent"> +<img data-desc="crossorigin absent to anonymous, src absent"> +<img data-desc="crossorigin absent to use-credentials, src absent"> +<img crossorigin data-desc="crossorigin empty to absent, src absent"> +<img crossorigin data-desc="crossorigin empty to use-credentials, src absent"> +<img crossorigin=anonymous data-desc="crossorigin anonymous to absent, src absent"> +<img crossorigin=anonymous data-desc="crossorigin anonymous to use-credentials, src absent"> +<img crossorigin=use-credentials data-desc="crossorigin use-credentials to absent, src absent"> +<img crossorigin=use-credentials data-desc="crossorigin use-credentials to empty, src absent"> +<img crossorigin=use-credentials data-desc="crossorigin use-credentials to anonymous, src absent"> + +<img src="/images/green-2x2.png" data-desc="crossorigin absent to empty, src already set"> +<img src="/images/green-2x2.png" data-desc="crossorigin absent to anonymous, src already set"> +<img src="/images/green-2x2.png" data-desc="crossorigin absent to use-credentials, src already set"> +<img src="/images/green-2x2.png" crossorigin data-desc="crossorigin empty to absent, src already set"> +<img src="/images/green-2x2.png" crossorigin data-desc="crossorigin empty to use-credentials, src already set"> +<img src="/images/green-2x2.png" crossorigin=anonymous data-desc="crossorigin anonymous to absent, src already set"> +<img src="/images/green-2x2.png" crossorigin=anonymous data-desc="crossorigin anonymous to use-credentials, src already set"> +<img src="/images/green-2x2.png" crossorigin=use-credentials data-desc="crossorigin use-credentials to absent, src already set"> +<img src="/images/green-2x2.png" crossorigin=use-credentials data-desc="crossorigin use-credentials to empty, src already set"> +<img src="/images/green-2x2.png" crossorigin=use-credentials data-desc="crossorigin use-credentials to anonymous, src already set"> <img src="/images/green-2x2.png" data-desc="inserted into picture"><picture></picture> @@ -165,46 +176,92 @@ onload = function() { img.src = '/images/green-2x2.png'; }, 'load'); - t('crossorigin absent to empty', function(img) { + // When src is absent, changing the crossorigin attribute state MUST NOT + // generate events. + + t('crossorigin absent to empty, src absent', function(img) { img.crossOrigin = ''; }, 'timeout'); - t('crossorigin absent to anonymous', function(img) { + t('crossorigin absent to anonymous, src absent', function(img) { img.crossOrigin = 'anonymous'; }, 'timeout'); - t('crossorigin absent to use-credentials', function(img) { + t('crossorigin absent to use-credentials, src absent', function(img) { img.crossOrigin = 'use-credentials'; }, 'timeout'); - t('crossorigin empty to absent', function(img) { + t('crossorigin empty to absent, src absent', function(img) { img.removeAttribute('crossorigin'); }, 'timeout'); - t('crossorigin empty to use-credentials', function(img) { + t('crossorigin empty to use-credentials, src absent', function(img) { img.crossOrigin = 'use-credentials'; }, 'timeout'); - t('crossorigin anonymous to absent', function(img) { + t('crossorigin anonymous to absent, src absent', function(img) { img.removeAttribute('crossorigin'); }, 'timeout'); - t('crossorigin anonymous to use-credentials', function(img) { + t('crossorigin anonymous to use-credentials, src absent', function(img) { img.crossOrigin = 'use-credentials'; }, 'timeout'); - t('crossorigin use-credentials to absent', function(img) { + t('crossorigin use-credentials to absent, src absent', function(img) { img.removeAttribute('crossorigin'); }, 'timeout'); - t('crossorigin use-credentials to empty', function(img) { + t('crossorigin use-credentials to empty, src absent', function(img) { img.crossOrigin = ''; }, 'timeout'); - t('crossorigin use-credentials to anonymous', function(img) { + t('crossorigin use-credentials to anonymous, src absent', function(img) { img.crossOrigin = 'anonymous'; }, 'timeout'); + // When src is set, changing the crossorigin attribute state MUST generate + // events. + + t('crossorigin absent to empty, src already set', function(img) { + img.crossOrigin = ''; + }, 'load'); + + t('crossorigin absent to anonymous, src already set', function(img) { + img.crossOrigin = 'anonymous'; + }, 'load'); + + t('crossorigin absent to use-credentials, src already set', function(img) { + img.crossOrigin = 'use-credentials'; + }, 'load'); + + t('crossorigin empty to absent, src already set', function(img) { + img.removeAttribute('crossorigin'); + }, 'load'); + + t('crossorigin empty to use-credentials, src already set', function(img) { + img.crossOrigin = 'use-credentials'; + }, 'load'); + + t('crossorigin anonymous to absent, src already set', function(img) { + img.removeAttribute('crossorigin'); + }, 'load'); + + t('crossorigin anonymous to use-credentials, src already set', function(img) { + img.crossOrigin = 'use-credentials'; + }, 'load'); + + t('crossorigin use-credentials to absent, src already set', function(img) { + img.removeAttribute('crossorigin'); + }, 'load'); + + t('crossorigin use-credentials to empty, src already set', function(img) { + img.crossOrigin = ''; + }, 'load'); + + t('crossorigin use-credentials to anonymous, src already set', function(img) { + img.crossOrigin = 'anonymous'; + }, 'load'); + t('inserted into picture', function(img) { img.nextSibling.appendChild(img); }, 'load'); diff --git a/tests/wpt/web-platform-tests/html/user-activation/activation-transfer-cross-origin-with-click-two-child-frames.sub.tentative.html b/tests/wpt/web-platform-tests/html/user-activation/activation-transfer-cross-origin-with-click-two-child-frames.sub.tentative.html new file mode 100644 index 00000000000..edaad261478 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/user-activation/activation-transfer-cross-origin-with-click-two-child-frames.sub.tentative.html @@ -0,0 +1,90 @@ +<!DOCTYPE html> +<!-- + Tentative due to: + https://github.com/whatwg/html/issues/4364 + +--> +<html> +<head> +<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> +</head> +<body> + <h1>User activation can be transferred to a cross-origin child frame + via a postMessage option.</h1> + <ol id="instructions"> + <li>Click this instruction text. + </ol> + <iframe id="child1" width="200" height="200"></iframe> + <iframe id="child2" width="200" height="200"></iframe> + <script> + async_test(function(t) { + var child1 = document.getElementById("child1"); + var child2 = document.getElementById("child2"); + var is_child_four_loaded = false; + var is_child_five_loaded = false; + assert_false(navigator.userActivation.isActive); + assert_false(navigator.userActivation.hasBeenActive); + + function tryClickInstructions() { + if (is_child_four_loaded && is_child_five_loaded) + test_driver.click(document.getElementById('instructions')); + } + + window.addEventListener("message", t.step_func(event => { + var msg = JSON.parse(event.data); + if (msg.type == 'child-four-loaded') { + // state should be false after load + assert_false(msg.isActive); + assert_false(msg.hasBeenActive); + + // click in parent document after both child frames load + is_child_four_loaded = true; + tryClickInstructions(); + } else if (msg.type == 'child-four-report') { + assert_true(msg.isActive); + assert_true(msg.hasBeenActive); + + // check sender's activation state again + assert_false(navigator.userActivation.isActive); + assert_false(navigator.userActivation.hasBeenActive); + + child2.contentWindow.postMessage('report', '*'); + } else if (msg.type == 'child-five-loaded') { + // state should be false after load + assert_false(msg.isActive); + assert_false(msg.hasBeenActive); + + // click in parent document after both child frames load + is_child_five_loaded = true; + tryClickInstructions(); + } else if (msg.type == 'child-five-report') { + assert_false(msg.isActive); + assert_false(msg.hasBeenActive); + + // check sender's activation state again + assert_false(navigator.userActivation.isActive); + assert_false(navigator.userActivation.hasBeenActive); + t.done(); + } + })); + window.addEventListener("click", t.step_func(event => { + assert_true(navigator.userActivation.isActive); + assert_true(navigator.userActivation.hasBeenActive); + + // transfer user activation to the child frame + child1.contentWindow.postMessage("transfer_user_activation", + {targetOrigin: "*", transferUserActivation: true}); + + // sender's activation state is updated synchronously + assert_false(navigator.userActivation.isActive); + assert_false(navigator.userActivation.hasBeenActive); + })); + child1.src = "http://{{domains[www]}}:{{ports[http][0]}}/html/user-activation/resources/child-four.html"; + child2.src = "http://{{domains[www1]}}:{{ports[http][0]}}/html/user-activation/resources/child-five.html"; + }, "Cross-origin user activation transfer through postMessages"); + </script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/html/user-activation/resources/child-five.html b/tests/wpt/web-platform-tests/html/user-activation/resources/child-five.html new file mode 100644 index 00000000000..9260a300a1b --- /dev/null +++ b/tests/wpt/web-platform-tests/html/user-activation/resources/child-five.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<body style="background: red;"> +<script> + window.parent.postMessage(JSON.stringify({"type": "child-five-loaded", "isActive": navigator.userActivation.isActive, + "hasBeenActive": navigator.userActivation.hasBeenActive}), "*"); + + window.addEventListener("message", event => { + if (event.source === window.parent && event.data == "report") { + window.parent.postMessage(JSON.stringify({"type": "child-five-report", "isActive": navigator.userActivation.isActive, + "hasBeenActive": navigator.userActivation.hasBeenActive}), "*"); + } + }); + +</script> +</body> diff --git a/tests/wpt/web-platform-tests/html/user-activation/resources/child-four.html b/tests/wpt/web-platform-tests/html/user-activation/resources/child-four.html index d3128034119..4811edb7ef0 100644 --- a/tests/wpt/web-platform-tests/html/user-activation/resources/child-four.html +++ b/tests/wpt/web-platform-tests/html/user-activation/resources/child-four.html @@ -1,6 +1,6 @@ <!DOCTYPE html> <body style="background: lightgrey;"> - <script> +<script> window.parent.postMessage(JSON.stringify({"type": "child-four-loaded", "isActive": navigator.userActivation.isActive, "hasBeenActive": navigator.userActivation.hasBeenActive}), "*"); diff --git a/tests/wpt/web-platform-tests/mixed-content/generic/mixed-content-test-case.js b/tests/wpt/web-platform-tests/mixed-content/generic/mixed-content-test-case.js index e7b0baaaafa..6837258c622 100644 --- a/tests/wpt/web-platform-tests/mixed-content/generic/mixed-content-test-case.js +++ b/tests/wpt/web-platform-tests/mixed-content/generic/mixed-content-test-case.js @@ -3,6 +3,39 @@ * @author burnik@google.com (Kristijan Burnik) */ +// TODO: This function is currently placed and duplicated at: +// - mixed-content/generic/mixed-content-test-case.js +// - referrer-policy/generic/referrer-policy-test-case.js +// but should be moved to /common/security-features/resources/common.js. +function getSubresourceOrigin(originType) { + const httpProtocol = "http"; + const httpsProtocol = "https"; + const wsProtocol = "ws"; + const wssProtocol = "wss"; + + const sameOriginHost = "{{host}}"; + const crossOriginHost = "{{domains[www1]}}"; + + // These values can evaluate to either empty strings or a ":port" string. + const httpPort = getNormalizedPort(parseInt("{{ports[http][0]}}", 10)); + const httpsPort = getNormalizedPort(parseInt("{{ports[https][0]}}", 10)); + const wsPort = getNormalizedPort(parseInt("{{ports[ws][0]}}", 10)); + const wssPort = getNormalizedPort(parseInt("{{ports[wss][0]}}", 10)); + + const originMap = { + "same-https": httpsProtocol + "://" + sameOriginHost + httpsPort, + "same-http": httpProtocol + "://" + sameOriginHost + httpPort, + "cross-https": httpsProtocol + "://" + crossOriginHost + httpsPort, + "cross-http": httpProtocol + "://" + crossOriginHost + httpPort, + "same-wss": wssProtocol + "://" + sameOriginHost + wssPort, + "same-ws": wsProtocol + "://" + sameOriginHost + wsPort, + "cross-wss": wssProtocol + "://" + crossOriginHost + wssPort, + "cross-ws": wsProtocol + "://" + crossOriginHost + wsPort, + }; + + return originMap[originType]; +} + /** * MixedContentTestCase exercises all the tests for checking browser behavior * when resources regarded as mixed-content are requested. A single run covers @@ -16,155 +49,43 @@ * @return {object} Object wrapping the start method used to run the test. */ function MixedContentTestCase(scenario, description, sanityChecker) { - const subresourcePath = { - "a-tag": "/common/security-features/subresource/document.py", - "area-tag": "/common/security-features/subresource/document.py", - "beacon-request": "/common/security-features/subresource/empty.py", - "fetch-request": "/common/security-features/subresource/xhr.py", - "form-tag": "/common/security-features/subresource/empty.py", - "iframe-tag": "/common/security-features/subresource/document.py", - "img-tag": "/common/security-features/subresource/image.py", - "picture-tag": "/common/security-features/subresource/image.py", - "script-tag": "/common/security-features/subresource/script.py", - - "worker-request": "/common/security-features/subresource/worker.py", - "module-worker-top-level": "/common/security-features/subresource/worker.py", - "module-data-worker-import": "/common/security-features/subresource/worker.py", - - "object-tag": "/common/security-features/subresource/empty.py", - - "link-css-tag": "/common/security-features/subresource/empty.py", - "link-prefetch-tag": "/common/security-features/subresource/empty.py", - "classic-data-worker-fetch": "/common/security-features/subresource/empty.py", - - "xhr-request": "/common/security-features/subresource/xhr.py", - - "audio-tag": "/common/security-features/subresource/audio.py", - "video-tag": "/common/security-features/subresource/video.py", - - "websocket-request": "/stash_responder" - }; - - // Mapping all the resource requesting methods to the scenario. - var resourceMap = { - "a-tag": requestViaAnchor, - "area-tag": requestViaArea, - "beacon-request": requestViaSendBeacon, - "fetch-request": requestViaFetch, - "form-tag": requestViaForm, - "iframe-tag": requestViaIframe, - "img-tag": requestViaImage, - "script-tag": requestViaScript, - "worker-request": - url => requestViaDedicatedWorker(url), - "module-worker-top-level": - url => requestViaDedicatedWorker(url, {type: "module"}), - "module-data-worker-import": - url => requestViaDedicatedWorker(workerUrlThatImports(url), {type: "module"}), - "classic-data-worker-fetch": - url => requestViaDedicatedWorker(dedicatedWorkerUrlThatFetches(url), {}), - "xhr-request": requestViaXhr, - "audio-tag": requestViaAudio, - "video-tag": requestViaVideo, - "picture-tag": requestViaPicture, - "object-tag": requestViaObject, - "link-css-tag": requestViaLinkStylesheet, - "link-prefetch-tag": requestViaLinkPrefetch, - "websocket-request": requestViaWebSocket + sanityChecker.checkScenario(scenario, subresourceMap); + const originTypeConversion = { + "same-host-https": "same-https", + "same-host-http": "same-http", + "cross-origin-https": "cross-https", + "cross-origin-http": "cross-http", + "same-host-wss": "same-wss", + "same-host-ws": "same-ws", + "cross-origin-wss": "cross-wss", + "cross-origin-ws": "cross-ws", }; - - for (const workletType of ['animation', 'audio', 'layout', 'paint']) { - resourceMap[`worklet-${workletType}-top-level`] = - url => requestViaWorklet(workletType, url); - subresourcePath[`worklet-${workletType}-top-level`] = - "/common/security-features/subresource/worker.py"; - - resourceMap[`worklet-${workletType}-data-import`] = - url => requestViaWorklet(workletType, workerUrlThatImports(url)); - subresourcePath[`worklet-${workletType}-data-import`] = - "/common/security-features/subresource/worker.py"; - } - - var httpProtocol = "http"; - var httpsProtocol = "https"; - var wsProtocol = "ws"; - var wssProtocol = "wss"; - - var sameOriginHost = location.hostname; - var crossOriginHost = "{{domains[www1]}}"; - - // These values can evaluate to either empty strings or a ":port" string. - var httpPort = getNormalizedPort(parseInt("{{ports[http][0]}}", 10)); - var httpsPort = getNormalizedPort(parseInt("{{ports[https][0]}}", 10)); - var wsPort = getNormalizedPort(parseInt("{{ports[ws][0]}}", 10)); - var wssPort = getNormalizedPort(parseInt("{{ports[wss][0]}}", 10)); - - const resourcePath = subresourcePath[scenario.subresource]; - - // Map all endpoints to scenario for use in the test. - var endpoint = { - "same-origin": - location.origin + resourcePath, - "same-host-https": - httpsProtocol + "://" + sameOriginHost + httpsPort + resourcePath, - "same-host-http": - httpProtocol + "://" + sameOriginHost + httpPort + resourcePath, - "cross-origin-https": - httpsProtocol + "://" + crossOriginHost + httpsPort + resourcePath, - "cross-origin-http": - httpProtocol + "://" + crossOriginHost + httpPort + resourcePath, - "same-host-wss": - wssProtocol + "://" + sameOriginHost + wssPort + resourcePath, - "same-host-ws": - wsProtocol + "://" + sameOriginHost + wsPort + resourcePath, - "cross-origin-wss": - wssProtocol + "://" + crossOriginHost + wssPort + resourcePath, - "cross-origin-ws": - wsProtocol + "://" + crossOriginHost + wsPort + resourcePath + const urls = getRequestURLs(scenario.subresource, + originTypeConversion[scenario.origin], + scenario.redirection); + const invoker = subresourceMap[scenario.subresource].invoker; + const checkResult = _ => { + // Send request to check if the key has been torn down. + return xhrRequest(urls.assertUrl) + .then(assertResult => { + // Now check if the value has been torn down. If it's still there, + // we have blocked the request to mixed-content. + assert_equals(assertResult.status, scenario.expectation, + "The resource request should be '" + scenario.expectation + "'."); + }); }; - sanityChecker.checkScenario(scenario, resourceMap); - - var mixed_content_test = async_test(description); - function runTest() { - sanityChecker.setFailTimeout(mixed_content_test); - - var key = guid(); - var value = guid(); - // We use the same path for both HTTP/S and WS/S stash requests. - var stash_path = encodeURIComponent("/mixed-content"); - const stashEndpoint = "/common/security-features/subresource/xhr.py?key=" + - key + "&path=" + stash_path; - const announceResourceRequestUrl = stashEndpoint + "&action=put&value=" + - value; - const assertResourceRequestUrl = stashEndpoint + "&action=take"; - const resourceRequestUrl = endpoint[scenario.origin] + "?redirection=" + - scenario.redirection + "&action=purge&key=" + key + - "&path=" + stash_path; - - xhrRequest(announceResourceRequestUrl) - .then(mixed_content_test.step_func(_ => { + promise_test(() => { + return xhrRequest(urls.announceUrl) // Send out the real resource request. // This should tear down the key if it's not blocked. - return resourceMap[scenario.subresource](resourceRequestUrl); - })) - .then(mixed_content_test.step_func(_ => { - // Send request to check if the key has been torn down. - return xhrRequest(assertResourceRequestUrl); - })) - .catch(mixed_content_test.step_func(e => { - // When requestResource fails, we also check the key state. - return xhrRequest(assertResourceRequestUrl); - })) - .then(mixed_content_test.step_func_done(response => { - // Now check if the value has been torn down. If it's still there, - // we have blocked the request to mixed-content. - assert_equals(response.status, scenario.expectation, - "The resource request should be '" + scenario.expectation + "'."); - })); - + .then(_ => invoker(urls.testUrl)) + // We check the key state, regardless of whether the main request + // succeeded or failed. + .then(checkResult, checkResult); + }, description); } // runTest - return {start: mixed_content_test.step_func(runTest) }; + return {start: runTest}; } // MixedContentTestCase diff --git a/tests/wpt/web-platform-tests/portals/portal-activate-data.html b/tests/wpt/web-platform-tests/portals/portal-activate-data.html index 0d8ec33cae7..d35282666d8 100644 --- a/tests/wpt/web-platform-tests/portals/portal-activate-data.html +++ b/tests/wpt/web-platform-tests/portals/portal-activate-data.html @@ -19,8 +19,9 @@ async function openPortalAndActivate(logic, activateOptions) { portal.src = new URL('resources/portal-activate-data-portal.html?logic=' + encodeURIComponent(logic), location.href); w.document.body.appendChild(portal); assert_equals((await nextMessage(bc)).data, 'ready'); + let replyPromise = nextMessage(bc); await portal.activate(activateOptions); - return (await nextMessage(bc)).data; + return (await replyPromise).data; } finally { w.close(); bc.close(); diff --git a/tests/wpt/web-platform-tests/portals/portals-activate-resolution.html b/tests/wpt/web-platform-tests/portals/portals-activate-resolution.html new file mode 100644 index 00000000000..9fb99e42b05 --- /dev/null +++ b/tests/wpt/web-platform-tests/portals/portals-activate-resolution.html @@ -0,0 +1,21 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> + promise_test(async () => { + var win = window.open(); + var portal = win.document.createElement("portal"); + portal.src = new URL("resources/simple-portal.html", location.href) + + await new Promise((resolve, reject) => { + var bc = new BroadcastChannel("simple-portal"); + bc.onmessage = () => { + bc.close(); + resolve(); + } + win.document.body.appendChild(portal); + }); + + return portal.activate(); + }); +</script> diff --git a/tests/wpt/web-platform-tests/portals/portals-adopt-predecessor.html b/tests/wpt/web-platform-tests/portals/portals-adopt-predecessor.html index 99c44f0bfc3..27e4052a67e 100644 --- a/tests/wpt/web-platform-tests/portals/portals-adopt-predecessor.html +++ b/tests/wpt/web-platform-tests/portals/portals-adopt-predecessor.html @@ -10,7 +10,6 @@ assert_equals(e.data, "passed"); bc.close(); }); - var portalUrl = encodeURIComponent(`portal-activate-event-portal.html?test=${test}`); window.open(`resources/portals-adopt-predecessor.html?test=${test}`); }, "Tests that a portal can adopt its predecessor."); @@ -21,7 +20,6 @@ assert_equals(e.data, "passed"); bc.close(); }); - var portalUrl = encodeURIComponent(`portal-activate-event-portal.html?test=${test}`); window.open(`resources/portals-adopt-predecessor.html?test=${test}`); }, "Tests that trying to adopt the predecessor twice will throw an exception."); </script> diff --git a/tests/wpt/web-platform-tests/portals/portals-create-orphaned.html b/tests/wpt/web-platform-tests/portals/portals-create-orphaned.html deleted file mode 100644 index 903186ff6c6..00000000000 --- a/tests/wpt/web-platform-tests/portals/portals-create-orphaned.html +++ /dev/null @@ -1,19 +0,0 @@ -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<body> - <script> - promise_test(async () => { - let waitForMessage = new Promise((resolve, reject) => { - var bc = new BroadcastChannel("portals-create-orphaned"); - bc.onmessage = e => { - bc.close(); - resolve(e.data); - } - }); - window.open("resources/portal-create-orphaned.html"); - let message = await waitForMessage; - assert_equals(message, "portal loaded"); - }, "creating a portal from an orphaned portal should succeed"); - </script> -</body> diff --git a/tests/wpt/web-platform-tests/portals/resources/portal-create-orphaned.html b/tests/wpt/web-platform-tests/portals/resources/portal-create-orphaned.html deleted file mode 100644 index 89b927f649b..00000000000 --- a/tests/wpt/web-platform-tests/portals/resources/portal-create-orphaned.html +++ /dev/null @@ -1,28 +0,0 @@ -<!DOCTYPE html> -<body> - <script> - var portal = document.createElement("portal"); - portal.src = "simple-portal.html"; - let waitForMessage = new Promise((resolve, reject) => { - var bc_portal = new BroadcastChannel("simple-portal"); - bc_portal.onmessage = e => { - bc_portal.close(); - portal.activate(); - var portal2 = document.createElement("portal"); - portal2.src = "simple-portal.html"; - document.body.appendChild(portal2); - var bc2 = new BroadcastChannel("simple-portal"); - bc2.onmessage = e => { - bc2.close(); - resolve("portal loaded"); - } - } - }); - document.body.appendChild(portal); - waitForMessage.then(message => { - var bc = new BroadcastChannel("portals-create-orphaned"); - bc.postMessage(message); - bc.close(); - }); - </script> -</body> diff --git a/tests/wpt/web-platform-tests/portals/resources/portals-adopt-predecessor-portal.html b/tests/wpt/web-platform-tests/portals/resources/portals-adopt-predecessor-portal.html index 96de3b7e4a4..14d1018b906 100644 --- a/tests/wpt/web-platform-tests/portals/resources/portals-adopt-predecessor-portal.html +++ b/tests/wpt/web-platform-tests/portals/resources/portals-adopt-predecessor-portal.html @@ -2,7 +2,6 @@ <script> var searchParams = new URL(location).searchParams; var test = searchParams.get("test"); - var bc = new BroadcastChannel(`portal-${test}`); window.onportalactivate = function(e) { var portal = e.adoptPredecessor(); @@ -10,19 +9,19 @@ if (test == "adopt-once") { if (portal instanceof HTMLPortalElement) { - bc.postMessage("passed"); - bc.close(); + portal.postMessage("adopted", "*"); } } if (test == "adopt-twice") { try { - portal = e.adoptPredecessor(); + e.adoptPredecessor(); } catch(e) { - bc.postMessage("passed"); - bc.close(); + portal.postMessage("passed", "*"); } } } + var bc = new BroadcastChannel(`portal-${test}`); bc.postMessage("loaded"); + bc.close(); </script> diff --git a/tests/wpt/web-platform-tests/portals/resources/portals-adopt-predecessor.html b/tests/wpt/web-platform-tests/portals/resources/portals-adopt-predecessor.html index b92ad8a17c1..287ba2c3572 100644 --- a/tests/wpt/web-platform-tests/portals/resources/portals-adopt-predecessor.html +++ b/tests/wpt/web-platform-tests/portals/resources/portals-adopt-predecessor.html @@ -5,18 +5,15 @@ var searchParams = new URL(location).searchParams; var test = searchParams.get("test"); var bc = new BroadcastChannel(`portal-${test}`); - bc.onmessage = function(e) { - switch (e.data) { - case "loaded": - document.querySelector("portal").activate(); - break; - - case "passed": - bc.close(); + bc.onmessage = e => { + bc.close(); + document.querySelector("portal").activate().then(() => { + window.portalHost.addEventListener("message", () => { var bc_test = new BroadcastChannel(`test-${test}`); bc_test.postMessage("passed"); bc_test.close(); - } + }); + }); } var portal = document.createElement("portal"); diff --git a/tests/wpt/web-platform-tests/referrer-policy/generic/referrer-policy-test-case.js b/tests/wpt/web-platform-tests/referrer-policy/generic/referrer-policy-test-case.js index 6d570f1dc0f..8bdbd3961b9 100644 --- a/tests/wpt/web-platform-tests/referrer-policy/generic/referrer-policy-test-case.js +++ b/tests/wpt/web-platform-tests/referrer-policy/generic/referrer-policy-test-case.js @@ -1,3 +1,36 @@ +// TODO: This function is currently placed and duplicated at: +// - mixed-content/generic/mixed-content-test-case.js +// - referrer-policy/generic/referrer-policy-test-case.js +// but should be moved to /common/security-features/resources/common.js. +function getSubresourceOrigin(originType) { + const httpProtocol = "http"; + const httpsProtocol = "https"; + const wsProtocol = "ws"; + const wssProtocol = "wss"; + + const sameOriginHost = "{{host}}"; + const crossOriginHost = "{{domains[www1]}}"; + + // These values can evaluate to either empty strings or a ":port" string. + const httpPort = getNormalizedPort(parseInt("{{ports[http][0]}}", 10)); + const httpsPort = getNormalizedPort(parseInt("{{ports[https][0]}}", 10)); + const wsPort = getNormalizedPort(parseInt("{{ports[ws][0]}}", 10)); + const wssPort = getNormalizedPort(parseInt("{{ports[wss][0]}}", 10)); + + const originMap = { + "same-https": httpsProtocol + "://" + sameOriginHost + httpsPort, + "same-http": httpProtocol + "://" + sameOriginHost + httpPort, + "cross-https": httpsProtocol + "://" + crossOriginHost + httpsPort, + "cross-http": httpProtocol + "://" + crossOriginHost + httpPort, + "same-wss": wssProtocol + "://" + sameOriginHost + wssPort, + "same-ws": wsProtocol + "://" + sameOriginHost + wsPort, + "cross-wss": wssProtocol + "://" + crossOriginHost + wssPort, + "cross-ws": wsProtocol + "://" + crossOriginHost + wsPort, + }; + + return originMap[originType]; +} + // NOTE: This method only strips the fragment and is not in accordance to the // recommended draft specification: // https://w3c.github.io/webappsec/specs/referrer-policy/#null @@ -7,14 +40,6 @@ function stripUrlForUseAsReferrer(url) { return url.replace(/#.*$/, ""); } -function normalizePort(targetPort) { - var defaultPorts = [80, 443]; - var isDefaultPortForProtocol = (defaultPorts.indexOf(targetPort) >= 0); - - return (targetPort == "" || isDefaultPortForProtocol) ? - "" : ":" + targetPort; -} - function ReferrerPolicyTestCase(scenario, testDescription, sanityChecker) { // Pass and skip rest of the test if browser does not support fetch. if (scenario.subresource == "fetch-request" && !window.fetch) { @@ -30,120 +55,65 @@ function ReferrerPolicyTestCase(scenario, testDescription, sanityChecker) { // This check is A NOOP in release. sanityChecker.checkScenario(scenario); - var subresourceInvoker = { - "a-tag": requestViaAnchor, - "area-tag": requestViaArea, - "fetch-request": requestViaFetch, - "iframe-tag": requestViaIframe, - "img-tag": requestViaImageForReferrerPolicy, - "script-tag": requestViaScript, - "worker-request": url => requestViaDedicatedWorker(url, {}), - "module-worker": url => requestViaDedicatedWorker(url, {type: "module"}), - "shared-worker": requestViaSharedWorker, - "xhr-request": requestViaXhr - }; - - const subresourcePath = { - "a-tag": "/common/security-features/subresource/document.py", - "area-tag": "/common/security-features/subresource/document.py", - "fetch-request": "/common/security-features/subresource/xhr.py", - "iframe-tag": "/common/security-features/subresource/document.py", - "img-tag": "/common/security-features/subresource/image.py", - "script-tag": "/common/security-features/subresource/script.py", - "worker-request": "/common/security-features/subresource/worker.py", - "module-worker": "/common/security-features/subresource/worker.py", - "shared-worker": "/common/security-features/subresource/shared-worker.py", - "xhr-request": "/common/security-features/subresource/xhr.py" + const originTypeConversion = { + "same-origin-http": "same-http", + "same-origin-https": "same-https", + "cross-origin-http": "cross-http", + "cross-origin-https": "cross-https" }; - - var referrerUrlResolver = { - "omitted": function() { - return undefined; - }, - "origin": function() { - return self.origin + "/"; - }, - "stripped-referrer": function() { - return stripUrlForUseAsReferrer(location.toString()); - } - }; - - var t = { - _scenario: scenario, - _testDescription: testDescription, - _constructSubresourceUrl: function() { - // TODO(kristijanburnik): We should assert that these two domains are - // different. E.g. If someone runs the tets over www, this would fail. - var domainForOrigin = { - "cross-origin":"{{domains[www1]}}", - "same-origin": location.hostname - }; - - // Values obtained and replaced by the wptserve pipeline: - // http://wptserve.readthedocs.org/en/latest/pipes.html#built-in-pipes - var portForProtocol = { - "http": parseInt("{{ports[http][0]}}"), - "https": parseInt("{{ports[https][0]}}") + const urls = getRequestURLs( + scenario.subresource, + originTypeConversion[scenario.origin + '-' + scenario.target_protocol], + scenario.redirection); + const invoker = + subresourceMap[scenario.subresource].invokerForReferrerPolicy || + subresourceMap[scenario.subresource].invoker; + const checkResult = result => { + const referrerUrlResolver = { + "omitted": function() { + return undefined; + }, + "origin": function() { + return self.origin + "/"; + }, + "stripped-referrer": function() { + return stripUrlForUseAsReferrer(location.toString()); } + }; + const expectedReferrerUrl = + referrerUrlResolver[scenario.referrer_url](); + + // Check if the result is in valid format. NOOP in release. + sanityChecker.checkSubresourceResult(scenario, urls.testUrl, result); + + // Check the reported URL. + assert_equals(result.referrer, + expectedReferrerUrl, + "Reported Referrer URL is '" + + scenario.referrer_url + "'."); + assert_equals(result.headers.referer, + expectedReferrerUrl, + "Reported Referrer URL from HTTP header is '" + + expectedReferrerUrl + "'"); + }; - var targetPort = portForProtocol[t._scenario.target_protocol]; - - return t._scenario.target_protocol + "://" + - domainForOrigin[t._scenario.origin] + - normalizePort(targetPort) + - subresourcePath[t._scenario.subresource] + - "?redirection=" + t._scenario["redirection"] + - "&cache_destroyer=" + (new Date()).getTime(); - }, - - _constructExpectedReferrerUrl: function() { - return referrerUrlResolver[t._scenario.referrer_url](); - }, - - // Returns a promise. - _invokeSubresource: function(resourceRequestUrl) { - var invoker = subresourceInvoker[t._scenario.subresource]; + function runTest() { + promise_test(_ => { // Depending on the delivery method, extend the subresource element with // these attributes. var elementAttributesForDeliveryMethod = { - "attr-referrer": {referrerPolicy: t._scenario.referrer_policy}, + "attr-referrer": {referrerPolicy: scenario.referrer_policy}, "rel-noreferrer": {rel: "noreferrer"} }; - - var delivery_method = t._scenario.delivery_method; - - if (delivery_method in elementAttributesForDeliveryMethod) { - return invoker(resourceRequestUrl, - elementAttributesForDeliveryMethod[delivery_method], - t._scenario.referrer_policy); - } else { - return invoker(resourceRequestUrl, {}, t._scenario.referrer_policy); + var deliveryMethod = scenario.delivery_method; + let elementAttributes = {}; + if (deliveryMethod in elementAttributesForDeliveryMethod) { + elementAttributes = elementAttributesForDeliveryMethod[deliveryMethod]; } - }, - - start: function() { - promise_test(test => { - const resourceRequestUrl = t._constructSubresourceUrl(); - const expectedReferrerUrl = t._constructExpectedReferrerUrl(); - return t._invokeSubresource(resourceRequestUrl) - .then(result => { - // Check if the result is in valid format. NOOP in release. - sanityChecker.checkSubresourceResult( - test, t._scenario, resourceRequestUrl, result); - - // Check the reported URL. - assert_equals(result.referrer, - expectedReferrerUrl, - "Reported Referrer URL is '" + - t._scenario.referrer_url + "'."); - assert_equals(result.headers.referer, - expectedReferrerUrl, - "Reported Referrer URL from HTTP header is '" + - expectedReferrerUrl + "'"); - }); - }, t._testDescription); - } + return invoker(urls.testUrl, elementAttributes, scenario.referrer_policy) + .then(checkResult); + }, testDescription); } - return t; + return {start: runTest}; } diff --git a/tests/wpt/web-platform-tests/referrer-policy/generic/sanity-checker.js b/tests/wpt/web-platform-tests/referrer-policy/generic/sanity-checker.js index 5c01c36f358..e296ce93b96 100644 --- a/tests/wpt/web-platform-tests/referrer-policy/generic/sanity-checker.js +++ b/tests/wpt/web-platform-tests/referrer-policy/generic/sanity-checker.js @@ -28,22 +28,19 @@ SanityChecker.prototype.checkScenario = function(scenario) { }, "[ReferrerPolicyTestCase] The test scenario is valid."); } -SanityChecker.prototype.checkSubresourceResult = function(test, - scenario, +SanityChecker.prototype.checkSubresourceResult = function(scenario, subresourceUrl, result) { - test.step(function() { - assert_equals(Object.keys(result).length, 3); - assert_own_property(result, "location"); - assert_own_property(result, "referrer"); - assert_own_property(result, "headers"); - - // Skip location check for scripts. - if (scenario.subresource == "script-tag") - return; - - // Sanity check: location of sub-resource matches reported location. - assert_equals(result.location, subresourceUrl, - "Subresource reported location."); - }, "Running a valid test scenario."); + assert_equals(Object.keys(result).length, 3); + assert_own_property(result, "location"); + assert_own_property(result, "referrer"); + assert_own_property(result, "headers"); + + // Skip location check for scripts. + if (scenario.subresource == "script-tag") + return; + + // Sanity check: location of sub-resource matches reported location. + assert_equals(result.location, subresourceUrl, + "Subresource reported location."); }; diff --git a/tests/wpt/web-platform-tests/resources/test/tests/unit/unpaired-surrogates.html b/tests/wpt/web-platform-tests/resources/test/tests/unit/unpaired-surrogates.html new file mode 100644 index 00000000000..1b162fe71d2 --- /dev/null +++ b/tests/wpt/web-platform-tests/resources/test/tests/unit/unpaired-surrogates.html @@ -0,0 +1,138 @@ +<!DOCTYPE HTML> +<html> +<head> + <meta charset="utf-8"> + <script src="/resources/testharness.js"></script> + <title>Restrictions on return value from `test`</title> +</head> +<body> +<script> +function makeTest(...bodies) { + const closeScript = '<' + '/script>'; + let src = ` +<!DOCTYPE HTML> +<html> +<head> +<title>Document title</title> +<script src="/resources/testharness.js?${Math.random()}">${closeScript} +</head> + +<body> +<div id="log"></div>`; + bodies.forEach((body) => { + src += '<script>(' + body + ')();' + closeScript; + }); + + const iframe = document.createElement('iframe'); + + document.body.appendChild(iframe); + iframe.contentDocument.write(src); + + return new Promise((resolve) => { + window.addEventListener('message', function onMessage(e) { + if (e.source !== iframe.contentWindow) { + return; + } + if (!e.data || e.data.type !=='complete') { + return; + } + window.removeEventListener('message', onMessage); + resolve(e.data); + }); + + iframe.contentDocument.close(); + }).then(({ tests, status }) => { + const summary = { + harness: { + status: getEnumProp(status, status.status), + message: status.message + }, + tests: {} + }; + + tests.forEach((test) => { + summary.tests[test.name] = getEnumProp(test, test.status); + }); + + return summary; + }); +} + +function getEnumProp(object, value) { + for (let property in object) { + if (!/^[A-Z]+$/.test(property)) { + continue; + } + + if (object[property] === value) { + return property; + } + } +} + +promise_test(() => { + return makeTest( + () => { + test(() => {}, 'before'); + test(() => {}, 'U+d7ff is not modified: \ud7ff'); + test(() => {}, 'U+e000 is not modified: \ue000'); + test(() => {}, 'after'); + } + ).then(({harness, tests}) => { + assert_equals(harness.status, 'OK'); + assert_equals(harness.message, null); + assert_equals(tests.before, 'PASS'); + assert_equals(tests['U+d7ff is not modified: \ud7ff'], 'PASS'); + assert_equals(tests['U+e000 is not modified: \ue000'], 'PASS'); + assert_equals(tests.after, 'PASS'); + }); +}, 'sub-test names which include valid code units'); + +promise_test(() => { + return makeTest( + () => { + test(() => {}, 'before'); + test(() => {}, 'U+d800U+dfff is not modified: \ud800\udfff'); + test(() => {}, 'U+dbffU+dc00 is not modified: \udbff\udc00'); + test(() => {}, 'after'); + } + ).then(({harness, tests}) => { + assert_equals(harness.status, 'OK'); + assert_equals(harness.message, null); + assert_equals(tests.before, 'PASS'); + assert_equals(tests['U+d800U+dfff is not modified: \ud800\udfff'], 'PASS'); + assert_equals(tests['U+dbffU+dc00 is not modified: \udbff\udc00'], 'PASS'); + assert_equals(tests.after, 'PASS'); + }); +}, 'sub-test names which include paired surrogates'); + +promise_test(() => { + return makeTest( + () => { + test(() => {}, 'before'); + test(() => {}, 'U+d800 must be sanitized: \ud800'); + test(() => {}, 'U+d800U+d801 must be sanitized: \ud800\ud801'); + test(() => {}, 'U+dfff must be sanitized: \udfff'); + test(() => {}, 'U+dc00U+d800U+dc00U+d800 must be sanitized: \udc00\ud800\udc00\ud800'); + test(() => {}, 'after'); + } + ).then(({harness, tests}) => { + assert_equals(harness.status, 'OK'); + assert_equals(harness.message, null); + assert_equals(tests.before, 'PASS'); + assert_equals(tests['U+d800 must be sanitized: U+d800'], 'PASS'); + assert_equals(tests['U+dfff must be sanitized: U+dfff'], 'PASS'); + assert_equals( + tests['U+d800U+d801 must be sanitized: U+d800U+d801'], + 'PASS' + ); + assert_equals( + tests['U+dc00U+d800U+dc00U+d800 must be sanitized: U+dc00\ud800\udc00U+d800'], + 'PASS' + ); + assert_equals(tests.after, 'PASS'); + }); +}, 'sub-test names which include unpaired surrogates'); +</script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/resources/testharness.js b/tests/wpt/web-platform-tests/resources/testharness.js index d40817c7d41..cb341db2050 100644 --- a/tests/wpt/web-platform-tests/resources/testharness.js +++ b/tests/wpt/web-platform-tests/resources/testharness.js @@ -2383,6 +2383,42 @@ policies and contribution forms [3]. return duplicates; }; + function code_unit_str(char) { + return 'U+' + char.charCodeAt(0).toString(16); + } + + function sanitize_unpaired_surrogates(str) { + return str.replace(/([\ud800-\udbff])(?![\udc00-\udfff])/g, + function(_, unpaired) + { + return code_unit_str(unpaired); + }) + // This replacement is intentionally implemented without an + // ES2018 negative lookbehind assertion to support runtimes + // which do not yet implement that language feature. + .replace(/(^|[^\ud800-\udbff])([\udc00-\udfff])/g, + function(_, previous, unpaired) { + if (/[\udc00-\udfff]/.test(previous)) { + previous = code_unit_str(previous); + } + + return previous + code_unit_str(unpaired); + }); + } + + function sanitize_all_unpaired_surrogates(tests) { + forEach (tests, + function (test) + { + var sanitized = sanitize_unpaired_surrogates(test.name); + + if (test.name !== sanitized) { + test.name = sanitized; + delete test._structured_clone; + } + }); + } + Tests.prototype.notify_complete = function() { var this_obj = this; var duplicates; @@ -2390,6 +2426,11 @@ policies and contribution forms [3]. if (this.status.status === null) { duplicates = this.find_duplicates(); + // Some transports adhere to UTF-8's restriction on unpaired + // surrogates. Sanitize the titles so that the results can be + // consistently sent via all transports. + sanitize_all_unpaired_surrogates(this.tests); + // Test names are presumed to be unique within test files--this // allows consumers to use them for identification purposes. // Duplicated names violate this expectation and should therefore diff --git a/tests/wpt/web-platform-tests/tools/wpt/utils.py b/tests/wpt/web-platform-tests/tools/wpt/utils.py index f98687feb51..2d427713e4e 100644 --- a/tests/wpt/web-platform-tests/tools/wpt/utils.py +++ b/tests/wpt/web-platform-tests/tools/wpt/utils.py @@ -6,7 +6,7 @@ import zipfile from io import BytesIO try: - from typing import Any + from typing import Any, Callable except ImportError: pass @@ -17,10 +17,11 @@ class Kwargs(dict): def set_if_none(self, name, # type: str value, # type: Any - err_fn=None, # type: (Kwargs, str) -> Any + err_fn=None, # type: Callable[[Kwargs, str], Any] desc=None, # type: str - extra_cond=None # type: (Kwargs) -> bool + extra_cond=None # type: Callable[[Kwargs], Any] ): + # type: (...) -> Any if desc is None: desc = name diff --git a/tests/wpt/web-platform-tests/webrtc-quic/RTCQuicTransport.https.html b/tests/wpt/web-platform-tests/webrtc-quic/RTCQuicTransport.https.html index 82427e67cb4..12c2371f8e2 100644 --- a/tests/wpt/web-platform-tests/webrtc-quic/RTCQuicTransport.https.html +++ b/tests/wpt/web-platform-tests/webrtc-quic/RTCQuicTransport.https.html @@ -261,8 +261,123 @@ promise_test(async t => { localQuicTransport.transport.stop(); const promise = localQuicTransport.getStats(); promise_rejects(t, 'InvalidStateError', promise); -}, 'getStats() promises immediately rejected if called after' + +}, 'getStats() promises immediately rejected if called after ' + `'closed' state.`); +test(t => { + const quicTransport = makeStandaloneQuicTransport(t); + assert_throws('InvalidStateError', + () => quicTransport.sendDatagram(new Uint8Array([1]))); +}, `sendDatagram() throws InvalidStateError if called before 'connected'.`); + +test(t => { + const quicTransport = makeStandaloneQuicTransport(t); + quicTransport.stop(); + assert_equals(quicTransport.state, 'closed'); + assert_throws('InvalidStateError', + () => quicTransport.sendDatagram(new Uint8Array([1]))); +}, `sendDatagram() throws InvalidStateError if called when 'closed'.`); + +test(t => { + const quicTransport = makeStandaloneQuicTransport(t); + assert_equals(quicTransport.maxDatagramLength, null); +}, 'maxDatagramLength 0 before connected.'); + +promise_test(async t => { + const [ localQuicTransport, remoteQuicTransport ] = + await makeTwoConnectedQuicTransports(t); + assert_greater_than(localQuicTransport.maxDatagramLength, 0); +}, 'maxDatagramLength larger than 0 after connected.'); + +promise_test(async t => { + const [ localQuicTransport, remoteQuicTransport ] = + await makeTwoConnectedQuicTransports(t); + const bigData = new Uint8Array(localQuicTransport.maxDatagramLength + 1); + assert_throws('InvalidStateError', + () => localQuicTransport.sendDatagram(bigData)); +}, 'sendDatagram() throws InvalidStateError if called with data larger ' + + 'than maxDatagramLength()'); + +promise_test(async t => { + const [ localQuicTransport, remoteQuicTransport ] = + await makeTwoConnectedQuicTransports(t); + const datagram = new Uint8Array([42]); + await localQuicTransport.readyToSendDatagram(); + localQuicTransport.sendDatagram(datagram); + const receiveDatagrams = await remoteQuicTransport.receiveDatagrams(); + assert_equals(receiveDatagrams.length, 1); + const receiveDatagram = new Uint8Array(receiveDatagrams[0]); + assert_array_equals(receiveDatagram, datagram); +}, 'sendDatagram() sends a datagram to remote side'); + +promise_test(async t => { + const [ localQuicTransport, remoteQuicTransport ] = + await makeTwoConnectedQuicTransports(t); + const datagram = new Uint8Array([42]); + const datagram2 = new Uint8Array([43]); + await localQuicTransport.readyToSendDatagram(); + localQuicTransport.sendDatagram(datagram); + const receiveDatagrams = await remoteQuicTransport.receiveDatagrams(); + assert_equals(receiveDatagrams.length, 1); + const receiveDatagram = new Uint8Array(receiveDatagrams[0]); + assert_array_equals(receiveDatagram, datagram); + await localQuicTransport.readyToSendDatagram(); + localQuicTransport.sendDatagram(datagram2); + const receiveDatagrams2 = await remoteQuicTransport.receiveDatagrams(); + assert_equals(receiveDatagrams2.length, 1); + const receiveDatagram2 = new Uint8Array(receiveDatagrams2[0]); + assert_array_equals(receiveDatagram2, datagram2); +}, 'sendDatagram() sends a multiple datagrams to remote side'); + +test(t => { + const quicTransport = makeStandaloneQuicTransport(t); + const promise = quicTransport.readyToSendDatagram(); + promise_rejects(t, 'InvalidStateError', promise); +}, 'readyToSendDatagram() promise immediately rejected if called before ' + + 'connecting'); + +promise_test(async t => { + const [ localQuicTransport, remoteQuicTransport ] = + await makeTwoConnectedQuicTransports(t); + localQuicTransport.stop(); + const promise = localQuicTransport.readyToSendDatagram(); + promise_rejects(t, 'InvalidStateError', promise); +}, 'readyToSendDatagram() promise immediately rejected if called after ' + + `'closed' state.`); + +test(t => { + const quicTransport = makeStandaloneQuicTransport(t); + const promise = quicTransport.receiveDatagrams(); + promise_rejects(t, 'InvalidStateError', promise); +}, 'receiveDatagrams() promise immediately rejected if called before ' + + 'connecting.'); + +promise_test(async t => { + const [ localQuicTransport, remoteQuicTransport ] = + await makeTwoConnectedQuicTransports(t); + localQuicTransport.stop(); + const promise = localQuicTransport.receiveDatagrams(); + promise_rejects(t, 'InvalidStateError', promise); +}, 'receiveDatagrams() promise immediately rejected if called after ' + + `'closed' state.`); + +promise_test(async t => { + const [ localQuicTransport, remoteQuicTransport ] = + await makeTwoConnectedQuicTransports(t); + const promise = localQuicTransport.receiveDatagrams(); + localQuicTransport.stop(); + promise_rejects(t, 'InvalidStateError', promise); +}, 'receiveDatagrams() promise rejected with InvalidStateError if stop() ' + + 'is called before being fulfilled.'); + +promise_test(async t => { + const [ localQuicTransport, remoteQuicTransport ] = + await makeTwoConnectedQuicTransports(t); + const promise = localQuicTransport.receiveDatagrams(); + localQuicTransport.transport.stop(); + promise_rejects(t, 'InvalidStateError', promise); +}, 'receiveDatagrams() promises rejected with InvalidStateError if ' + + 'RTCIceTransport calls stop() before being fulfilled.'); + </script> diff --git a/tests/wpt/web-platform-tests/xhr/send-redirect-post-upload.htm b/tests/wpt/web-platform-tests/xhr/send-redirect-post-upload.htm index 5c1c6387adb..b1db8ec2ac9 100644 --- a/tests/wpt/web-platform-tests/xhr/send-redirect-post-upload.htm +++ b/tests/wpt/web-platform-tests/xhr/send-redirect-post-upload.htm @@ -91,6 +91,14 @@ if(xhr.readyState >= xhr.HEADERS_RECEIVED) { assert_equals(xhr.status, 200, "JS never gets to see the 30x status code"); } + + // The UA may fire multiple "readystatechange" events while in + // the "loading" state. + // https://xhr.spec.whatwg.org/#the-send()-method + if (xhr.readyState === 3 && actual[actual.length - 1] === "xhr onreadystatechange 3") { + return; + } + actual.push("xhr onreadystatechange " + xhr.readyState); }); xhr.onload = test.step_func(function(e) diff --git a/tests/wpt/webgl/meta/conformance/textures/misc/texture-upload-size.html.ini b/tests/wpt/webgl/meta/conformance/textures/misc/texture-upload-size.html.ini index 772b6425f61..9f39841e3e8 100644 --- a/tests/wpt/webgl/meta/conformance/textures/misc/texture-upload-size.html.ini +++ b/tests/wpt/webgl/meta/conformance/textures/misc/texture-upload-size.html.ini @@ -35,3 +35,6 @@ [WebGL test #124: could not create image (SVG)] expected: FAIL + [WebGL test #132: could not create image (SVG)] + expected: FAIL + |