aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWPT Sync Bot <josh+wptsync@joshmatthews.net>2019-04-18 21:48:35 -0400
committerWPT Sync Bot <josh+wptsync@joshmatthews.net>2019-04-19 00:12:29 -0400
commitc5c325d8bbe79bcc6ae071e94224ac653ce73a8f (patch)
tree02ff2f764b41e464557b7660a595cddf9ae9b5f8
parentb20333a324e95f424cf413322002820dc3f173fe (diff)
downloadservo-c5c325d8bbe79bcc6ae071e94224ac653ce73a8f.tar.gz
servo-c5c325d8bbe79bcc6ae071e94224ac653ce73a8f.zip
Update web-platform-tests to revision e3cf1284464a4a3e46fd15e4138f8e32c6cecdd8
-rw-r--r--tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini4
-rw-r--r--tests/wpt/metadata/MANIFEST.json228
-rw-r--r--tests/wpt/metadata/css/css-fonts/variations/at-font-face-font-matching.html.ini24
-rw-r--r--tests/wpt/metadata/css/cssom-view/offsetTopLeft-empty-inline-offset.html.ini19
-rw-r--r--tests/wpt/metadata/css/cssom-view/offsetTopLeft-empty-inline.html.ini10
-rw-r--r--tests/wpt/metadata/css/cssom-view/offsetTopLeft-inline.html.ini2
-rw-r--r--tests/wpt/metadata/css/cssom-view/offsetTopLeft-leading-space-inline.html.ini10
-rw-r--r--tests/wpt/metadata/css/cssom-view/offsetTopLeft-trailing-space-inline.html.ini10
-rw-r--r--tests/wpt/metadata/encoding/encodeInto.any.js.ini180
-rw-r--r--tests/wpt/metadata/encoding/single-byte-decoder.html.ini2
-rw-r--r--tests/wpt/metadata/fetch/api/redirect/redirect-mode.any.js.ini1
-rw-r--r--tests/wpt/metadata/fetch/content-type/response.window.js.ini9
-rw-r--r--tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini3
-rw-r--r--tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini4
-rw-r--r--tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini4
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/noopener-noreferrer-BarProp.window.js.ini10
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/script-onerror-insertion-point-2.html.ini2
-rw-r--r--tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini1
-rw-r--r--tests/wpt/metadata/webstorage/storage_setitem.html.ini36
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/events/copy-event-manual.html (renamed from tests/wpt/web-platform-tests/clipboard-apis/copy-event-manual.html)0
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/events/cut-event-manual.html (renamed from tests/wpt/web-platform-tests/clipboard-apis/cut-event-manual.html)0
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/events/paste-event-manual.html (renamed from tests/wpt/web-platform-tests/clipboard-apis/paste-event-manual.html)0
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/text-write-read/async-write-read-manual.https.html (renamed from tests/wpt/web-platform-tests/clipboard-apis/async-write-blobtext-read-blobtext-manual.https.html)0
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/text-write-read/async-write-readText-manual.https.html (renamed from tests/wpt/web-platform-tests/clipboard-apis/async-write-blobtext-read-text-manual.https.html)0
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/text-write-read/async-writeText-read-manual.https.html (renamed from tests/wpt/web-platform-tests/clipboard-apis/async-write-text-read-blobtext-manual.https.html)0
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/text-write-read/async-writeText-readText-manual.https.html (renamed from tests/wpt/web-platform-tests/clipboard-apis/async-write-text-read-text-manual.https.html)0
-rw-r--r--tests/wpt/web-platform-tests/common/get-host-info.sub.js2
-rw-r--r--tests/wpt/web-platform-tests/common/security-features/resources/common.js130
-rw-r--r--tests/wpt/web-platform-tests/css/css-scroll-snap/scroll-snap-stop-always.html25
-rw-r--r--tests/wpt/web-platform-tests/css/css-scroll-snap/scrollTo-scrollBy-snaps.html4
-rw-r--r--tests/wpt/web-platform-tests/css/cssom-view/offsetTopLeft-empty-inline-offset.html (renamed from tests/wpt/web-platform-tests/css/cssom-view/offsetTopLeftEmptyInline.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/cssom-view/offsetTopLeft-empty-inline.html32
-rw-r--r--tests/wpt/web-platform-tests/css/cssom-view/offsetTopLeft-inline.html (renamed from tests/wpt/web-platform-tests/css/cssom-view/offsetTopLeftInline.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/cssom-view/offsetTopLeft-leading-space-inline.html32
-rw-r--r--tests/wpt/web-platform-tests/css/cssom-view/offsetTopLeft-trailing-space-inline.html36
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/the-window-object/noopener-noreferrer-BarProp.window.js23
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/the-window-object/support/BarProp-target.html17
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/relevant-mutations.html97
-rw-r--r--tests/wpt/web-platform-tests/html/user-activation/activation-transfer-cross-origin-with-click-two-child-frames.sub.tentative.html90
-rw-r--r--tests/wpt/web-platform-tests/html/user-activation/resources/child-five.html15
-rw-r--r--tests/wpt/web-platform-tests/html/user-activation/resources/child-four.html2
-rw-r--r--tests/wpt/web-platform-tests/mixed-content/generic/mixed-content-test-case.js207
-rw-r--r--tests/wpt/web-platform-tests/portals/portal-activate-data.html3
-rw-r--r--tests/wpt/web-platform-tests/portals/portals-activate-resolution.html21
-rw-r--r--tests/wpt/web-platform-tests/portals/portals-adopt-predecessor.html2
-rw-r--r--tests/wpt/web-platform-tests/portals/portals-create-orphaned.html19
-rw-r--r--tests/wpt/web-platform-tests/portals/resources/portal-create-orphaned.html28
-rw-r--r--tests/wpt/web-platform-tests/portals/resources/portals-adopt-predecessor-portal.html11
-rw-r--r--tests/wpt/web-platform-tests/portals/resources/portals-adopt-predecessor.html15
-rw-r--r--tests/wpt/web-platform-tests/referrer-policy/generic/referrer-policy-test-case.js196
-rw-r--r--tests/wpt/web-platform-tests/referrer-policy/generic/sanity-checker.js29
-rw-r--r--tests/wpt/web-platform-tests/resources/test/tests/unit/unpaired-surrogates.html138
-rw-r--r--tests/wpt/web-platform-tests/resources/testharness.js41
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/utils.py7
-rw-r--r--tests/wpt/web-platform-tests/webrtc-quic/RTCQuicTransport.https.html117
-rw-r--r--tests/wpt/web-platform-tests/xhr/send-redirect-post-upload.htm8
-rw-r--r--tests/wpt/webgl/meta/conformance/textures/misc/texture-upload-size.html.ini3
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
+