mirror of
https://github.com/servo/servo.git
synced 2025-07-14 10:53:42 +01:00
Update web-platform-tests to revision e3cf1284464a4a3e46fd15e4138f8e32c6cecdd8
This commit is contained in:
parent
b20333a324
commit
c5c325d8bb
57 changed files with 1422 additions and 493 deletions
|
@ -1,4 +1,5 @@
|
||||||
[url-in-tags-revoke.window.html]
|
[url-in-tags-revoke.window.html]
|
||||||
|
expected: TIMEOUT
|
||||||
[Fetching a blob URL immediately before revoking it works in an iframe.]
|
[Fetching a blob URL immediately before revoking it works in an iframe.]
|
||||||
expected: FAIL
|
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.]
|
[Opening a blob URL in a new window by clicking an <a> tag works immediately before revoking the URL.]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
[Fetching a blob URL immediately before revoking it works in <script> tags.]
|
||||||
|
expected: TIMEOUT
|
||||||
|
|
||||||
|
|
|
@ -1225,51 +1225,51 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"clipboard-apis/async-write-blobtext-read-blobtext-manual.https.html": [
|
|
||||||
[
|
|
||||||
"clipboard-apis/async-write-blobtext-read-blobtext-manual.https.html",
|
|
||||||
{}
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"clipboard-apis/async-write-blobtext-read-text-manual.https.html": [
|
|
||||||
[
|
|
||||||
"clipboard-apis/async-write-blobtext-read-text-manual.https.html",
|
|
||||||
{}
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"clipboard-apis/async-write-image-read-image-manual.https.html": [
|
"clipboard-apis/async-write-image-read-image-manual.https.html": [
|
||||||
[
|
[
|
||||||
"clipboard-apis/async-write-image-read-image-manual.https.html",
|
"clipboard-apis/async-write-image-read-image-manual.https.html",
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"clipboard-apis/async-write-text-read-blobtext-manual.https.html": [
|
"clipboard-apis/events/copy-event-manual.html": [
|
||||||
[
|
[
|
||||||
"clipboard-apis/async-write-text-read-blobtext-manual.https.html",
|
"clipboard-apis/events/copy-event-manual.html",
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"clipboard-apis/async-write-text-read-text-manual.https.html": [
|
"clipboard-apis/events/cut-event-manual.html": [
|
||||||
[
|
[
|
||||||
"clipboard-apis/async-write-text-read-text-manual.https.html",
|
"clipboard-apis/events/cut-event-manual.html",
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"clipboard-apis/copy-event-manual.html": [
|
"clipboard-apis/events/paste-event-manual.html": [
|
||||||
[
|
[
|
||||||
"clipboard-apis/copy-event-manual.html",
|
"clipboard-apis/events/paste-event-manual.html",
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"clipboard-apis/cut-event-manual.html": [
|
"clipboard-apis/text-write-read/async-write-read-manual.https.html": [
|
||||||
[
|
[
|
||||||
"clipboard-apis/cut-event-manual.html",
|
"clipboard-apis/text-write-read/async-write-read-manual.https.html",
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"clipboard-apis/paste-event-manual.html": [
|
"clipboard-apis/text-write-read/async-write-readText-manual.https.html": [
|
||||||
[
|
[
|
||||||
"clipboard-apis/paste-event-manual.html",
|
"clipboard-apis/text-write-read/async-write-readText-manual.https.html",
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"clipboard-apis/text-write-read/async-writeText-read-manual.https.html": [
|
||||||
|
[
|
||||||
|
"clipboard-apis/text-write-read/async-writeText-read-manual.https.html",
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"clipboard-apis/text-write-read/async-writeText-readText-manual.https.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",
|
"/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": [
|
"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": [
|
"html/user-activation/resources/child-four.html": [
|
||||||
[
|
[
|
||||||
{}
|
{}
|
||||||
|
@ -309097,11 +309107,6 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"portals/resources/portal-create-orphaned.html": [
|
|
||||||
[
|
|
||||||
{}
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"portals/resources/portal-cross-origin.sub.html": [
|
"portals/resources/portal-cross-origin.sub.html": [
|
||||||
[
|
[
|
||||||
{}
|
{}
|
||||||
|
@ -313397,6 +313402,11 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"resources/test/tests/unit/unpaired-surrogates.html": [
|
||||||
|
[
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"resources/test/tox.ini": [
|
"resources/test/tox.ini": [
|
||||||
[
|
[
|
||||||
{}
|
{}
|
||||||
|
@ -365836,9 +365846,27 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"css/cssom-view/offsetTopLeftEmptyInline.html": [
|
"css/cssom-view/offsetTopLeft-empty-inline-offset.html": [
|
||||||
[
|
[
|
||||||
"css/cssom-view/offsetTopLeftEmptyInline.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/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": [
|
||||||
[
|
[
|
||||||
"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": [
|
||||||
[
|
[
|
||||||
"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,6 +416572,12 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"portals/portals-activate-resolution.html": [
|
||||||
|
[
|
||||||
|
"portals/portals-activate-resolution.html",
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"portals/portals-activate-twice.html": [
|
"portals/portals-activate-twice.html": [
|
||||||
[
|
[
|
||||||
"portals/portals-activate-twice.html",
|
"portals/portals-activate-twice.html",
|
||||||
|
@ -416542,12 +416590,6 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"portals/portals-create-orphaned.html": [
|
|
||||||
[
|
|
||||||
"portals/portals-create-orphaned.html",
|
|
||||||
{}
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"portals/portals-cross-origin-load.sub.html": [
|
"portals/portals-cross-origin-load.sub.html": [
|
||||||
[
|
[
|
||||||
"portals/portals-cross-origin-load.sub.html",
|
"portals/portals-cross-origin-load.sub.html",
|
||||||
|
@ -486005,26 +486047,10 @@
|
||||||
"b5f0f3d9dc13d2b67264b3a61b9f0f8be0cd6ecd",
|
"b5f0f3d9dc13d2b67264b3a61b9f0f8be0cd6ecd",
|
||||||
"manual"
|
"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": [
|
"clipboard-apis/async-write-image-read-image-manual.https.html": [
|
||||||
"351e74bd74568b4c221cd60c145c2681e1dc6ed5",
|
"351e74bd74568b4c221cd60c145c2681e1dc6ed5",
|
||||||
"manual"
|
"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": [
|
"clipboard-apis/clipboard-events-synthetic.html": [
|
||||||
"fa40d8c20038c5a9c2cc09fe7dcfb1568de58be2",
|
"fa40d8c20038c5a9c2cc09fe7dcfb1568de58be2",
|
||||||
"testharness"
|
"testharness"
|
||||||
|
@ -486033,15 +486059,15 @@
|
||||||
"9218ee299e2b66a3bd7e70b6ac58c6cb26fdfaac",
|
"9218ee299e2b66a3bd7e70b6ac58c6cb26fdfaac",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"clipboard-apis/copy-event-manual.html": [
|
"clipboard-apis/events/copy-event-manual.html": [
|
||||||
"6f687af196fa198cda7d83f468945f9f69330568",
|
"6f687af196fa198cda7d83f468945f9f69330568",
|
||||||
"manual"
|
"manual"
|
||||||
],
|
],
|
||||||
"clipboard-apis/cut-event-manual.html": [
|
"clipboard-apis/events/cut-event-manual.html": [
|
||||||
"c5593171754cfa2bd684e1ff3a8a724283456cbd",
|
"c5593171754cfa2bd684e1ff3a8a724283456cbd",
|
||||||
"manual"
|
"manual"
|
||||||
],
|
],
|
||||||
"clipboard-apis/paste-event-manual.html": [
|
"clipboard-apis/events/paste-event-manual.html": [
|
||||||
"19e6b95c5f32a0eb7dbccb0f5bd538e9dbb1360e",
|
"19e6b95c5f32a0eb7dbccb0f5bd538e9dbb1360e",
|
||||||
"manual"
|
"manual"
|
||||||
],
|
],
|
||||||
|
@ -486049,6 +486075,22 @@
|
||||||
"6e555e3b197ce2f448f59d61e1488a0175490145",
|
"6e555e3b197ce2f448f59d61e1488a0175490145",
|
||||||
"support"
|
"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": [
|
"common/META.yml": [
|
||||||
"958883a1b07e7db13249153fc85c69d2a40363a3",
|
"958883a1b07e7db13249153fc85c69d2a40363a3",
|
||||||
"support"
|
"support"
|
||||||
|
@ -486150,7 +486192,7 @@
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"common/get-host-info.sub.js": [
|
"common/get-host-info.sub.js": [
|
||||||
"595a539f1953db41ff828abfc383c030ba58baac",
|
"3a61167b7d55bca75b511cbff6be581ea3b725b1",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"common/get-host-info.sub.js.headers": [
|
"common/get-host-info.sub.js.headers": [
|
||||||
|
@ -486206,7 +486248,7 @@
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"common/security-features/resources/common.js": [
|
"common/security-features/resources/common.js": [
|
||||||
"b18097b1ec2e252a59ec075d0f2c158798e38d08",
|
"936b39e50ed57fdf9293333658fe8966c130712b",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"common/security-features/subresource/__init__.py": [
|
"common/security-features/subresource/__init__.py": [
|
||||||
|
@ -600030,7 +600072,7 @@
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"css/css-scroll-snap/scroll-snap-stop-always.html": [
|
"css/css-scroll-snap/scroll-snap-stop-always.html": [
|
||||||
"62446f54632f943eacf7e2bcd4bd1d98d346e97c",
|
"7d2a228688fc2011662b659803cc615dac14f350",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"css/css-scroll-snap/scroll-snap-type-proximity.html": [
|
"css/css-scroll-snap/scroll-snap-type-proximity.html": [
|
||||||
|
@ -600038,7 +600080,7 @@
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"css/css-scroll-snap/scrollTo-scrollBy-snaps.html": [
|
"css/css-scroll-snap/scrollTo-scrollBy-snaps.html": [
|
||||||
"3e022f0a12147fc29dbf45905e36c74e5d221f0a",
|
"fba38cb703ba2d70a0fb83e69ae816942a1fbea5",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"css/css-scroll-snap/snap-at-user-scroll-end-manual.html": [
|
"css/css-scroll-snap/snap-at-user-scroll-end-manual.html": [
|
||||||
|
@ -626745,18 +626787,30 @@
|
||||||
"c88b616986511b3220449c03421e827be0d2e534",
|
"c88b616986511b3220449c03421e827be0d2e534",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"css/cssom-view/offsetTopLeftEmptyInline.html": [
|
"css/cssom-view/offsetTopLeft-empty-inline-offset.html": [
|
||||||
"85abbb7c01cc95f46aeffb166fc8cd34669c85aa",
|
"85abbb7c01cc95f46aeffb166fc8cd34669c85aa",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
|
"css/cssom-view/offsetTopLeft-empty-inline.html": [
|
||||||
|
"d553cb150d9c43312e60d7bd591fbfe8cd6d5093",
|
||||||
|
"testharness"
|
||||||
|
],
|
||||||
|
"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": [
|
"css/cssom-view/offsetTopLeftInScrollableParent.html": [
|
||||||
"8f4433795424a00a896278173747aa9e192e181d",
|
"8f4433795424a00a896278173747aa9e192e181d",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"css/cssom-view/offsetTopLeftInline.html": [
|
|
||||||
"772cc34f05bffc5b8445cd23ba13d9357269b84b",
|
|
||||||
"reftest"
|
|
||||||
],
|
|
||||||
"css/cssom-view/resources/elementsFromPoint.js": [
|
"css/cssom-view/resources/elementsFromPoint.js": [
|
||||||
"ba986ef3f568d4971eb4e84c4faaeae6e276b975",
|
"ba986ef3f568d4971eb4e84c4faaeae6e276b975",
|
||||||
"support"
|
"support"
|
||||||
|
@ -652045,6 +652099,10 @@
|
||||||
"760bd418db8a8f59694b79d38e36287b9f2bb625",
|
"760bd418db8a8f59694b79d38e36287b9f2bb625",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
|
"html/browsers/the-window-object/noopener-noreferrer-BarProp.window.js": [
|
||||||
|
"a75a0346501a80ceef91d25ed250a2957f42cfb9",
|
||||||
|
"testharness"
|
||||||
|
],
|
||||||
"html/browsers/the-window-object/security-window/window-security.https.html": [
|
"html/browsers/the-window-object/security-window/window-security.https.html": [
|
||||||
"1fb0ed7c1e62da55b890c6434bee6e46637e0209",
|
"1fb0ed7c1e62da55b890c6434bee6e46637e0209",
|
||||||
"testharness"
|
"testharness"
|
||||||
|
@ -652053,6 +652111,10 @@
|
||||||
"1b0fa1211a701253b61d1eced344faa8763ad6ef",
|
"1b0fa1211a701253b61d1eced344faa8763ad6ef",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
|
"html/browsers/the-window-object/support/BarProp-target.html": [
|
||||||
|
"9921e7a5773db8eef8d90f5956dbade3284609e6",
|
||||||
|
"support"
|
||||||
|
],
|
||||||
"html/browsers/the-window-object/support/closed.html": [
|
"html/browsers/the-window-object/support/closed.html": [
|
||||||
"3b70598e34d0e9b46a8ba2150a1589fecfb90ea8",
|
"3b70598e34d0e9b46a8ba2150a1589fecfb90ea8",
|
||||||
"support"
|
"support"
|
||||||
|
@ -662518,7 +662580,7 @@
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"html/semantics/embedded-content/the-img-element/relevant-mutations.html": [
|
"html/semantics/embedded-content/the-img-element/relevant-mutations.html": [
|
||||||
"0ce7a01078f793a2c6483319102ada6a33935534",
|
"76fdb641dffa96ce4340de2391450103e1d2bfbc",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"html/semantics/embedded-content/the-img-element/resources/cat.jpg": [
|
"html/semantics/embedded-content/the-img-element/resources/cat.jpg": [
|
||||||
|
@ -667453,6 +667515,10 @@
|
||||||
"998bac3694c6f81e099c1c9eab41c704adcf10f9",
|
"998bac3694c6f81e099c1c9eab41c704adcf10f9",
|
||||||
"manual"
|
"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": [
|
"html/user-activation/activation-transfer-cross-origin-with-click.sub.tentative.html": [
|
||||||
"e7d98c3b194a03da025ab5b08b5d2c47007222c4",
|
"e7d98c3b194a03da025ab5b08b5d2c47007222c4",
|
||||||
"testharness"
|
"testharness"
|
||||||
|
@ -667473,8 +667539,12 @@
|
||||||
"8e2b1d07014e8bd754d943e11672fff0719bbb74",
|
"8e2b1d07014e8bd754d943e11672fff0719bbb74",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
|
"html/user-activation/resources/child-five.html": [
|
||||||
|
"9260a300a1bdd1561dbae8ae99e8be7a74bce337",
|
||||||
|
"support"
|
||||||
|
],
|
||||||
"html/user-activation/resources/child-four.html": [
|
"html/user-activation/resources/child-four.html": [
|
||||||
"d312803411960cc8b079d159ac3659f6de4e0d83",
|
"4811edb7ef0bf125d9256c6bb7c1bc863729b077",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"html/user-activation/resources/child-one.html": [
|
"html/user-activation/resources/child-one.html": [
|
||||||
|
@ -672930,7 +673000,7 @@
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"mixed-content/generic/mixed-content-test-case.js": [
|
"mixed-content/generic/mixed-content-test-case.js": [
|
||||||
"e7b0baaaafa357bef3b3d90fa4c14ae669ccbd91",
|
"6837258c62294e6e2826bac733cbb2451f9edc12",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"mixed-content/generic/sanity-checker.js": [
|
"mixed-content/generic/sanity-checker.js": [
|
||||||
|
@ -683542,7 +683612,7 @@
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"portals/portal-activate-data.html": [
|
"portals/portal-activate-data.html": [
|
||||||
"0d8ec33cae787ddd0ed22284ed0a955e312d505d",
|
"d35282666d824b2d44d8f4b7e29e3cb549b04cec",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"portals/portal-activate-event-constructor.html": [
|
"portals/portal-activate-event-constructor.html": [
|
||||||
|
@ -683565,16 +683635,16 @@
|
||||||
"6eebca9f9d982ffd38a96bb72ff0173bcfb07903",
|
"6eebca9f9d982ffd38a96bb72ff0173bcfb07903",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
|
"portals/portals-activate-resolution.html": [
|
||||||
|
"9fb99e42b05feb9b952a2c794d586d47ffffc98c",
|
||||||
|
"testharness"
|
||||||
|
],
|
||||||
"portals/portals-activate-twice.html": [
|
"portals/portals-activate-twice.html": [
|
||||||
"074d3f4c7ae424d1cba5c07a6728ab5671522529",
|
"074d3f4c7ae424d1cba5c07a6728ab5671522529",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"portals/portals-adopt-predecessor.html": [
|
"portals/portals-adopt-predecessor.html": [
|
||||||
"99c44f0bfc3c841cd61e6f3f8f7cdfc2a2d8595e",
|
"27e4052a67ecf42c2296850c5d0619f3e5596292",
|
||||||
"testharness"
|
|
||||||
],
|
|
||||||
"portals/portals-create-orphaned.html": [
|
|
||||||
"903186ff6c69b12f888286cd8dbca8cbfa0568dc",
|
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"portals/portals-cross-origin-load.sub.html": [
|
"portals/portals-cross-origin-load.sub.html": [
|
||||||
|
@ -683633,10 +683703,6 @@
|
||||||
"dc161c0e0b82da493aba1cb8fbefb4262b203a48",
|
"dc161c0e0b82da493aba1cb8fbefb4262b203a48",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"portals/resources/portal-create-orphaned.html": [
|
|
||||||
"89b927f649b9db28fdbbb1ed8d023c33203595ce",
|
|
||||||
"support"
|
|
||||||
],
|
|
||||||
"portals/resources/portal-cross-origin.sub.html": [
|
"portals/resources/portal-cross-origin.sub.html": [
|
||||||
"145ab5a2d21295f615d3ecd5d36f9e3034a4202a",
|
"145ab5a2d21295f615d3ecd5d36f9e3034a4202a",
|
||||||
"support"
|
"support"
|
||||||
|
@ -683694,11 +683760,11 @@
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"portals/resources/portals-adopt-predecessor-portal.html": [
|
"portals/resources/portals-adopt-predecessor-portal.html": [
|
||||||
"96de3b7e4a403f533f56e057105aca1de6b41109",
|
"14d1018b906e82897466af556bc97b567bf58934",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"portals/resources/portals-adopt-predecessor.html": [
|
"portals/resources/portals-adopt-predecessor.html": [
|
||||||
"b92ad8a17c19cd7cb159880156a25ec5b71371eb",
|
"287ba2c35727a1fce7ee4e72fa80fef92f747581",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"portals/resources/portals-nested-1.html": [
|
"portals/resources/portals-nested-1.html": [
|
||||||
|
@ -684498,7 +684564,7 @@
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"referrer-policy/generic/referrer-policy-test-case.js": [
|
"referrer-policy/generic/referrer-policy-test-case.js": [
|
||||||
"6d570f1dc0fdb4d2973a8b8534897859ea2ab843",
|
"8bdbd3961b9d3a851951f111f803c3f82b9f81ce",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"referrer-policy/generic/sandboxed-iframe-with-opaque-origin.html": [
|
"referrer-policy/generic/sandboxed-iframe-with-opaque-origin.html": [
|
||||||
|
@ -684506,7 +684572,7 @@
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"referrer-policy/generic/sanity-checker.js": [
|
"referrer-policy/generic/sanity-checker.js": [
|
||||||
"5c01c36f35821d7df2300670b200eb9e1d701307",
|
"e296ce93b965b788ea79f2f2b6cff45d5dce55f0",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"referrer-policy/generic/subresource-test/area-navigate.html": [
|
"referrer-policy/generic/subresource-test/area-navigate.html": [
|
||||||
|
@ -694313,6 +694379,10 @@
|
||||||
"8472ba9c9ed3f0baed605813fad1717769875759",
|
"8472ba9c9ed3f0baed605813fad1717769875759",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
|
"resources/test/tests/unit/unpaired-surrogates.html": [
|
||||||
|
"1b162fe71d283d63dbdaac5b3be887f5cd80d53f",
|
||||||
|
"support"
|
||||||
|
],
|
||||||
"resources/test/tox.ini": [
|
"resources/test/tox.ini": [
|
||||||
"d0c5186f15692153fe0d09ba727e4350f1de2ef7",
|
"d0c5186f15692153fe0d09ba727e4350f1de2ef7",
|
||||||
"support"
|
"support"
|
||||||
|
@ -694350,7 +694420,7 @@
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"resources/testharness.js": [
|
"resources/testharness.js": [
|
||||||
"d40817c7d4197ccc2469f646207b82d8a0af4c84",
|
"cb341db2050ee201a7646e1db22634682b05bc97",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"resources/testharness.js.headers": [
|
"resources/testharness.js.headers": [
|
||||||
|
@ -709538,7 +709608,7 @@
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"tools/wpt/utils.py": [
|
"tools/wpt/utils.py": [
|
||||||
"f98687feb5178b2f4f82f45951c4a4295407c74c",
|
"2d427713e4e824845b6d7871b61cd6f11ec251f6",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"tools/wpt/virtualenv.py": [
|
"tools/wpt/virtualenv.py": [
|
||||||
|
@ -716406,7 +716476,7 @@
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"webrtc-quic/RTCQuicTransport.https.html": [
|
"webrtc-quic/RTCQuicTransport.https.html": [
|
||||||
"82427e67cb4ab231f91d6e7d04bd25f79e5f94fa",
|
"12c2371f8e214becabb7a8a221a875d61d002ff2",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"webrtc-stats/META.yml": [
|
"webrtc-stats/META.yml": [
|
||||||
|
@ -724570,7 +724640,7 @@
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"xhr/send-redirect-post-upload.htm": [
|
"xhr/send-redirect-post-upload.htm": [
|
||||||
"5c1c6387adb78a363fb7225ca39b93b71af79b17",
|
"b1db8ec2ac942e09c56c721f620d4cf5d54be55c",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"xhr/send-redirect-to-cors.htm": [
|
"xhr/send-redirect-to-cors.htm": [
|
||||||
|
|
|
@ -11,9 +11,6 @@
|
||||||
[Matching font-weight: '400' should prefer '350 399' over '351 398']
|
[Matching font-weight: '400' should prefer '350 399' over '351 398']
|
||||||
expected: FAIL
|
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']
|
[Matching font-weight: '400' should prefer '501 550' over '502 560']
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
@ -23,9 +20,6 @@
|
||||||
[Matching font-weight: '430' should prefer '400 425' over '350 399']
|
[Matching font-weight: '430' should prefer '400 425' over '350 399']
|
||||||
expected: FAIL
|
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']
|
[Matching font-weight: '430' should prefer '340 398' over '501 550']
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
@ -77,9 +71,6 @@
|
||||||
[Matching font-style: 'oblique 0deg' should prefer 'oblique 0deg' over 'oblique 5deg']
|
[Matching font-style: 'oblique 0deg' should prefer 'oblique 0deg' over 'oblique 5deg']
|
||||||
expected: FAIL
|
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']
|
[Matching font-style: 'oblique 0deg' should prefer 'oblique -50deg -20deg' over 'oblique -40deg -30deg']
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
@ -89,9 +80,6 @@
|
||||||
[Matching font-style: 'oblique -10deg' should prefer 'oblique -20deg -15deg' over 'oblique -60deg -30deg']
|
[Matching font-style: 'oblique -10deg' should prefer 'oblique -20deg -15deg' over 'oblique -60deg -30deg']
|
||||||
expected: FAIL
|
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']
|
[Matching font-style: 'oblique -10deg' should prefer 'oblique 0deg 10deg' over 'oblique 40deg 50deg']
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
@ -161,9 +149,6 @@
|
||||||
[Matching font-weight: '500' should prefer '450 460' over '400']
|
[Matching font-weight: '500' should prefer '450 460' over '400']
|
||||||
expected: FAIL
|
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']
|
[Matching font-style: 'oblique 10deg' should prefer 'oblique 10deg' over 'oblique 5deg']
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
@ -188,9 +173,6 @@
|
||||||
[Matching font-stretch: '110%' should prefer '110% 120%' over '115% 116%']
|
[Matching font-stretch: '110%' should prefer '110% 120%' over '115% 116%']
|
||||||
expected: FAIL
|
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']
|
[Matching font-style: 'oblique 20deg' should prefer 'oblique -50deg -20deg' over 'oblique -40deg -30deg']
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
@ -206,9 +188,6 @@
|
||||||
[Matching font-style: 'oblique -21deg' should prefer 'oblique 30deg 60deg' over 'oblique 40deg 50deg']
|
[Matching font-style: 'oblique -21deg' should prefer 'oblique 30deg 60deg' over 'oblique 40deg 50deg']
|
||||||
expected: FAIL
|
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']
|
[Matching font-style: 'oblique 20deg' should prefer 'oblique 10deg' over 'italic']
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
@ -257,9 +236,6 @@
|
||||||
[Matching font-style: 'normal' should prefer 'oblique 10deg 40deg' over 'oblique 20deg 30deg']
|
[Matching font-style: 'normal' should prefer 'oblique 10deg 40deg' over 'oblique 20deg 30deg']
|
||||||
expected: FAIL
|
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']
|
[Matching font-weight: '501' should prefer '450 460' over '390 410']
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
[offsetTopLeft-inline.html]
|
||||||
|
expected: FAIL
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -221,6 +221,96 @@
|
||||||
[encodeInto() with 𝌆 and destination length 4, offset 4, filler 128]
|
[encodeInto() with 𝌆 and destination length 4, offset 4, filler 128]
|
||||||
expected: FAIL
|
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.any.worker.html]
|
||||||
[encodeInto() with 𝌆A and destination length 3, offset 4, filler 128]
|
[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]
|
[encodeInto() with 𝌆 and destination length 4, offset 4, filler 128]
|
||||||
expected: FAIL
|
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
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
|
|
||||||
|
|
||||||
[single-byte-decoder.html?XMLHttpRequest]
|
[single-byte-decoder.html?XMLHttpRequest]
|
||||||
expected: TIMEOUT
|
expected: CRASH
|
||||||
[ISO-8859-2: iso_8859-2:1987 (XMLHttpRequest)]
|
[ISO-8859-2: iso_8859-2:1987 (XMLHttpRequest)]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
[redirect-mode.any.worker.html]
|
[redirect-mode.any.worker.html]
|
||||||
expected: ERROR
|
|
||||||
[same-origin redirect 301 in manual redirect and cors mode]
|
[same-origin redirect 301 in manual redirect and cors mode]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -312,12 +312,3 @@
|
||||||
[<iframe>: separate response Content-Type: text/plain */*;charset=gbk]
|
[<iframe>: separate response Content-Type: text/plain */*;charset=gbk]
|
||||||
expected: FAIL
|
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
|
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,3 @@
|
||||||
[X-Content-Type-Options%3A%20nosniff%0C]
|
[X-Content-Type-Options%3A%20nosniff%0C]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[Content-Type-Options%3A%20nosniff]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
[traverse_the_history_3.html]
|
|
||||||
[Multiple history traversals, last would be aborted]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
[traverse_the_history_5.html]
|
|
||||||
[Multiple history traversals, last would be aborted]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
[script-onerror-insertion-point-2.html]
|
||||||
|
expected: TIMEOUT
|
|
@ -1,5 +1,4 @@
|
||||||
[realtimeanalyser-fft-scaling.html]
|
[realtimeanalyser-fft-scaling.html]
|
||||||
expected: TIMEOUT
|
|
||||||
[X 2048-point FFT peak position is not equal to 64. Got 0.]
|
[X 2048-point FFT peak position is not equal to 64. Got 0.]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -24,3 +24,39 @@
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
bug: https://github.com/servo/servo/issues/6564
|
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
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ function get_host_info() {
|
||||||
var HTTP_PORT = '{{ports[http][0]}}';
|
var HTTP_PORT = '{{ports[http][0]}}';
|
||||||
var HTTP_PORT2 = '{{ports[http][1]}}';
|
var HTTP_PORT2 = '{{ports[http][1]}}';
|
||||||
var HTTPS_PORT = '{{ports[https][0]}}';
|
var HTTPS_PORT = '{{ports[https][0]}}';
|
||||||
var PROTOCOL = window.location.protocol;
|
var PROTOCOL = self.location.protocol;
|
||||||
var IS_HTTPS = (PROTOCOL == "https:");
|
var IS_HTTPS = (PROTOCOL == "https:");
|
||||||
var HTTP_PORT_ELIDED = HTTP_PORT == "80" ? "" : (":" + HTTP_PORT);
|
var HTTP_PORT_ELIDED = HTTP_PORT == "80" ? "" : (":" + HTTP_PORT);
|
||||||
var HTTP_PORT2_ELIDED = HTTP_PORT2 == "80" ? "" : (":" + HTTP_PORT2);
|
var HTTP_PORT2_ELIDED = HTTP_PORT2 == "80" ? "" : (":" + HTTP_PORT2);
|
||||||
|
|
|
@ -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
|
// SanityChecker does nothing in release mode. See sanity-checker.js for debug
|
||||||
// mode.
|
// mode.
|
||||||
function SanityChecker() {}
|
function SanityChecker() {}
|
||||||
|
|
|
@ -68,4 +68,29 @@ test(() => {
|
||||||
assert_equals(scroller.scrollTop, 0);
|
assert_equals(scroller.scrollTop, 0);
|
||||||
}, "A scroll with intended end position should always choose the closest snap " +
|
}, "A scroll with intended end position should always choose the closest snap " +
|
||||||
"position regardless of the scroll-snap-stop value.")
|
"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>
|
</script>
|
||||||
|
|
|
@ -74,7 +74,9 @@ var viewport = document.scrollingElement;
|
||||||
[
|
[
|
||||||
[{left: 800}, 1000, 0],
|
[{left: 800}, 1000, 0],
|
||||||
[{top: 900}, 0, 1000],
|
[{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]) => {
|
].forEach(([input, expectedX, expectedY]) => {
|
||||||
test(() => {
|
test(() => {
|
||||||
divScroller.scrollTo(0, 0);
|
divScroller.scrollTo(0, 0);
|
||||||
|
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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`);
|
||||||
|
});
|
|
@ -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>
|
|
@ -21,16 +21,27 @@
|
||||||
|
|
||||||
<img src="/images/green-2x2.png" data-desc="src set to same value">
|
<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 empty, src absent">
|
||||||
<img data-desc="crossorigin absent to anonymous">
|
<img data-desc="crossorigin absent to anonymous, src absent">
|
||||||
<img data-desc="crossorigin absent to use-credentials">
|
<img data-desc="crossorigin absent to use-credentials, src absent">
|
||||||
<img crossorigin data-desc="crossorigin empty to absent">
|
<img crossorigin data-desc="crossorigin empty to absent, src absent">
|
||||||
<img crossorigin data-desc="crossorigin empty to use-credentials">
|
<img crossorigin data-desc="crossorigin empty to use-credentials, src absent">
|
||||||
<img crossorigin=anonymous data-desc="crossorigin anonymous to absent">
|
<img crossorigin=anonymous data-desc="crossorigin anonymous to absent, src absent">
|
||||||
<img crossorigin=anonymous data-desc="crossorigin anonymous to use-credentials">
|
<img crossorigin=anonymous data-desc="crossorigin anonymous to use-credentials, src absent">
|
||||||
<img crossorigin=use-credentials data-desc="crossorigin use-credentials to 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">
|
<img crossorigin=use-credentials data-desc="crossorigin use-credentials to empty, src absent">
|
||||||
<img crossorigin=use-credentials data-desc="crossorigin use-credentials to anonymous">
|
<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>
|
<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';
|
img.src = '/images/green-2x2.png';
|
||||||
}, 'load');
|
}, '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 = '';
|
img.crossOrigin = '';
|
||||||
}, 'timeout');
|
}, 'timeout');
|
||||||
|
|
||||||
t('crossorigin absent to anonymous', function(img) {
|
t('crossorigin absent to anonymous, src absent', function(img) {
|
||||||
img.crossOrigin = 'anonymous';
|
img.crossOrigin = 'anonymous';
|
||||||
}, 'timeout');
|
}, 'timeout');
|
||||||
|
|
||||||
t('crossorigin absent to use-credentials', function(img) {
|
t('crossorigin absent to use-credentials, src absent', function(img) {
|
||||||
img.crossOrigin = 'use-credentials';
|
img.crossOrigin = 'use-credentials';
|
||||||
}, 'timeout');
|
}, 'timeout');
|
||||||
|
|
||||||
t('crossorigin empty to absent', function(img) {
|
t('crossorigin empty to absent, src absent', function(img) {
|
||||||
img.removeAttribute('crossorigin');
|
img.removeAttribute('crossorigin');
|
||||||
}, 'timeout');
|
}, 'timeout');
|
||||||
|
|
||||||
t('crossorigin empty to use-credentials', function(img) {
|
t('crossorigin empty to use-credentials, src absent', function(img) {
|
||||||
img.crossOrigin = 'use-credentials';
|
img.crossOrigin = 'use-credentials';
|
||||||
}, 'timeout');
|
}, 'timeout');
|
||||||
|
|
||||||
t('crossorigin anonymous to absent', function(img) {
|
t('crossorigin anonymous to absent, src absent', function(img) {
|
||||||
img.removeAttribute('crossorigin');
|
img.removeAttribute('crossorigin');
|
||||||
}, 'timeout');
|
}, 'timeout');
|
||||||
|
|
||||||
t('crossorigin anonymous to use-credentials', function(img) {
|
t('crossorigin anonymous to use-credentials, src absent', function(img) {
|
||||||
img.crossOrigin = 'use-credentials';
|
img.crossOrigin = 'use-credentials';
|
||||||
}, 'timeout');
|
}, 'timeout');
|
||||||
|
|
||||||
t('crossorigin use-credentials to absent', function(img) {
|
t('crossorigin use-credentials to absent, src absent', function(img) {
|
||||||
img.removeAttribute('crossorigin');
|
img.removeAttribute('crossorigin');
|
||||||
}, 'timeout');
|
}, 'timeout');
|
||||||
|
|
||||||
t('crossorigin use-credentials to empty', function(img) {
|
t('crossorigin use-credentials to empty, src absent', function(img) {
|
||||||
img.crossOrigin = '';
|
img.crossOrigin = '';
|
||||||
}, 'timeout');
|
}, 'timeout');
|
||||||
|
|
||||||
t('crossorigin use-credentials to anonymous', function(img) {
|
t('crossorigin use-credentials to anonymous, src absent', function(img) {
|
||||||
img.crossOrigin = 'anonymous';
|
img.crossOrigin = 'anonymous';
|
||||||
}, 'timeout');
|
}, '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) {
|
t('inserted into picture', function(img) {
|
||||||
img.nextSibling.appendChild(img);
|
img.nextSibling.appendChild(img);
|
||||||
}, 'load');
|
}, 'load');
|
||||||
|
|
|
@ -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>
|
|
@ -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>
|
|
@ -1,6 +1,6 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<body style="background: lightgrey;">
|
<body style="background: lightgrey;">
|
||||||
<script>
|
<script>
|
||||||
window.parent.postMessage(JSON.stringify({"type": "child-four-loaded", "isActive": navigator.userActivation.isActive,
|
window.parent.postMessage(JSON.stringify({"type": "child-four-loaded", "isActive": navigator.userActivation.isActive,
|
||||||
"hasBeenActive": navigator.userActivation.hasBeenActive}), "*");
|
"hasBeenActive": navigator.userActivation.hasBeenActive}), "*");
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,39 @@
|
||||||
* @author burnik@google.com (Kristijan Burnik)
|
* @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
|
* MixedContentTestCase exercises all the tests for checking browser behavior
|
||||||
* when resources regarded as mixed-content are requested. A single run covers
|
* 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.
|
* @return {object} Object wrapping the start method used to run the test.
|
||||||
*/
|
*/
|
||||||
function MixedContentTestCase(scenario, description, sanityChecker) {
|
function MixedContentTestCase(scenario, description, sanityChecker) {
|
||||||
const subresourcePath = {
|
sanityChecker.checkScenario(scenario, subresourceMap);
|
||||||
"a-tag": "/common/security-features/subresource/document.py",
|
const originTypeConversion = {
|
||||||
"area-tag": "/common/security-features/subresource/document.py",
|
"same-host-https": "same-https",
|
||||||
"beacon-request": "/common/security-features/subresource/empty.py",
|
"same-host-http": "same-http",
|
||||||
"fetch-request": "/common/security-features/subresource/xhr.py",
|
"cross-origin-https": "cross-https",
|
||||||
"form-tag": "/common/security-features/subresource/empty.py",
|
"cross-origin-http": "cross-http",
|
||||||
"iframe-tag": "/common/security-features/subresource/document.py",
|
"same-host-wss": "same-wss",
|
||||||
"img-tag": "/common/security-features/subresource/image.py",
|
"same-host-ws": "same-ws",
|
||||||
"picture-tag": "/common/security-features/subresource/image.py",
|
"cross-origin-wss": "cross-wss",
|
||||||
"script-tag": "/common/security-features/subresource/script.py",
|
"cross-origin-ws": "cross-ws",
|
||||||
|
|
||||||
"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"
|
|
||||||
};
|
};
|
||||||
|
const urls = getRequestURLs(scenario.subresource,
|
||||||
// Mapping all the resource requesting methods to the scenario.
|
originTypeConversion[scenario.origin],
|
||||||
var resourceMap = {
|
scenario.redirection);
|
||||||
"a-tag": requestViaAnchor,
|
const invoker = subresourceMap[scenario.subresource].invoker;
|
||||||
"area-tag": requestViaArea,
|
const checkResult = _ => {
|
||||||
"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
|
|
||||||
};
|
|
||||||
|
|
||||||
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
|
|
||||||
};
|
|
||||||
|
|
||||||
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(_ => {
|
|
||||||
// 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.
|
// Send request to check if the key has been torn down.
|
||||||
return xhrRequest(assertResourceRequestUrl);
|
return xhrRequest(urls.assertUrl)
|
||||||
}))
|
.then(assertResult => {
|
||||||
.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,
|
// Now check if the value has been torn down. If it's still there,
|
||||||
// we have blocked the request to mixed-content.
|
// we have blocked the request to mixed-content.
|
||||||
assert_equals(response.status, scenario.expectation,
|
assert_equals(assertResult.status, scenario.expectation,
|
||||||
"The resource request should be '" + scenario.expectation + "'.");
|
"The resource request should be '" + scenario.expectation + "'.");
|
||||||
}));
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
function runTest() {
|
||||||
|
promise_test(() => {
|
||||||
|
return xhrRequest(urls.announceUrl)
|
||||||
|
// Send out the real resource request.
|
||||||
|
// This should tear down the key if it's not blocked.
|
||||||
|
.then(_ => invoker(urls.testUrl))
|
||||||
|
// We check the key state, regardless of whether the main request
|
||||||
|
// succeeded or failed.
|
||||||
|
.then(checkResult, checkResult);
|
||||||
|
}, description);
|
||||||
} // runTest
|
} // runTest
|
||||||
|
|
||||||
return {start: mixed_content_test.step_func(runTest) };
|
return {start: runTest};
|
||||||
} // MixedContentTestCase
|
} // MixedContentTestCase
|
||||||
|
|
|
@ -19,8 +19,9 @@ async function openPortalAndActivate(logic, activateOptions) {
|
||||||
portal.src = new URL('resources/portal-activate-data-portal.html?logic=' + encodeURIComponent(logic), location.href);
|
portal.src = new URL('resources/portal-activate-data-portal.html?logic=' + encodeURIComponent(logic), location.href);
|
||||||
w.document.body.appendChild(portal);
|
w.document.body.appendChild(portal);
|
||||||
assert_equals((await nextMessage(bc)).data, 'ready');
|
assert_equals((await nextMessage(bc)).data, 'ready');
|
||||||
|
let replyPromise = nextMessage(bc);
|
||||||
await portal.activate(activateOptions);
|
await portal.activate(activateOptions);
|
||||||
return (await nextMessage(bc)).data;
|
return (await replyPromise).data;
|
||||||
} finally {
|
} finally {
|
||||||
w.close();
|
w.close();
|
||||||
bc.close();
|
bc.close();
|
||||||
|
|
|
@ -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>
|
|
@ -10,7 +10,6 @@
|
||||||
assert_equals(e.data, "passed");
|
assert_equals(e.data, "passed");
|
||||||
bc.close();
|
bc.close();
|
||||||
});
|
});
|
||||||
var portalUrl = encodeURIComponent(`portal-activate-event-portal.html?test=${test}`);
|
|
||||||
window.open(`resources/portals-adopt-predecessor.html?test=${test}`);
|
window.open(`resources/portals-adopt-predecessor.html?test=${test}`);
|
||||||
}, "Tests that a portal can adopt its predecessor.");
|
}, "Tests that a portal can adopt its predecessor.");
|
||||||
|
|
||||||
|
@ -21,7 +20,6 @@
|
||||||
assert_equals(e.data, "passed");
|
assert_equals(e.data, "passed");
|
||||||
bc.close();
|
bc.close();
|
||||||
});
|
});
|
||||||
var portalUrl = encodeURIComponent(`portal-activate-event-portal.html?test=${test}`);
|
|
||||||
window.open(`resources/portals-adopt-predecessor.html?test=${test}`);
|
window.open(`resources/portals-adopt-predecessor.html?test=${test}`);
|
||||||
}, "Tests that trying to adopt the predecessor twice will throw an exception.");
|
}, "Tests that trying to adopt the predecessor twice will throw an exception.");
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -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>
|
|
|
@ -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>
|
|
|
@ -2,7 +2,6 @@
|
||||||
<script>
|
<script>
|
||||||
var searchParams = new URL(location).searchParams;
|
var searchParams = new URL(location).searchParams;
|
||||||
var test = searchParams.get("test");
|
var test = searchParams.get("test");
|
||||||
var bc = new BroadcastChannel(`portal-${test}`);
|
|
||||||
|
|
||||||
window.onportalactivate = function(e) {
|
window.onportalactivate = function(e) {
|
||||||
var portal = e.adoptPredecessor();
|
var portal = e.adoptPredecessor();
|
||||||
|
@ -10,19 +9,19 @@
|
||||||
|
|
||||||
if (test == "adopt-once") {
|
if (test == "adopt-once") {
|
||||||
if (portal instanceof HTMLPortalElement) {
|
if (portal instanceof HTMLPortalElement) {
|
||||||
bc.postMessage("passed");
|
portal.postMessage("adopted", "*");
|
||||||
bc.close();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (test == "adopt-twice") {
|
if (test == "adopt-twice") {
|
||||||
try {
|
try {
|
||||||
portal = e.adoptPredecessor();
|
e.adoptPredecessor();
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
bc.postMessage("passed");
|
portal.postMessage("passed", "*");
|
||||||
bc.close();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var bc = new BroadcastChannel(`portal-${test}`);
|
||||||
bc.postMessage("loaded");
|
bc.postMessage("loaded");
|
||||||
|
bc.close();
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -5,18 +5,15 @@
|
||||||
var searchParams = new URL(location).searchParams;
|
var searchParams = new URL(location).searchParams;
|
||||||
var test = searchParams.get("test");
|
var test = searchParams.get("test");
|
||||||
var bc = new BroadcastChannel(`portal-${test}`);
|
var bc = new BroadcastChannel(`portal-${test}`);
|
||||||
bc.onmessage = function(e) {
|
bc.onmessage = e => {
|
||||||
switch (e.data) {
|
|
||||||
case "loaded":
|
|
||||||
document.querySelector("portal").activate();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "passed":
|
|
||||||
bc.close();
|
bc.close();
|
||||||
|
document.querySelector("portal").activate().then(() => {
|
||||||
|
window.portalHost.addEventListener("message", () => {
|
||||||
var bc_test = new BroadcastChannel(`test-${test}`);
|
var bc_test = new BroadcastChannel(`test-${test}`);
|
||||||
bc_test.postMessage("passed");
|
bc_test.postMessage("passed");
|
||||||
bc_test.close();
|
bc_test.close();
|
||||||
}
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
var portal = document.createElement("portal");
|
var portal = document.createElement("portal");
|
||||||
|
|
|
@ -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
|
// NOTE: This method only strips the fragment and is not in accordance to the
|
||||||
// recommended draft specification:
|
// recommended draft specification:
|
||||||
// https://w3c.github.io/webappsec/specs/referrer-policy/#null
|
// https://w3c.github.io/webappsec/specs/referrer-policy/#null
|
||||||
|
@ -7,14 +40,6 @@ function stripUrlForUseAsReferrer(url) {
|
||||||
return url.replace(/#.*$/, "");
|
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) {
|
function ReferrerPolicyTestCase(scenario, testDescription, sanityChecker) {
|
||||||
// Pass and skip rest of the test if browser does not support fetch.
|
// Pass and skip rest of the test if browser does not support fetch.
|
||||||
if (scenario.subresource == "fetch-request" && !window.fetch) {
|
if (scenario.subresource == "fetch-request" && !window.fetch) {
|
||||||
|
@ -30,33 +55,21 @@ function ReferrerPolicyTestCase(scenario, testDescription, sanityChecker) {
|
||||||
// This check is A NOOP in release.
|
// This check is A NOOP in release.
|
||||||
sanityChecker.checkScenario(scenario);
|
sanityChecker.checkScenario(scenario);
|
||||||
|
|
||||||
var subresourceInvoker = {
|
const originTypeConversion = {
|
||||||
"a-tag": requestViaAnchor,
|
"same-origin-http": "same-http",
|
||||||
"area-tag": requestViaArea,
|
"same-origin-https": "same-https",
|
||||||
"fetch-request": requestViaFetch,
|
"cross-origin-http": "cross-http",
|
||||||
"iframe-tag": requestViaIframe,
|
"cross-origin-https": "cross-https"
|
||||||
"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 urls = getRequestURLs(
|
||||||
const subresourcePath = {
|
scenario.subresource,
|
||||||
"a-tag": "/common/security-features/subresource/document.py",
|
originTypeConversion[scenario.origin + '-' + scenario.target_protocol],
|
||||||
"area-tag": "/common/security-features/subresource/document.py",
|
scenario.redirection);
|
||||||
"fetch-request": "/common/security-features/subresource/xhr.py",
|
const invoker =
|
||||||
"iframe-tag": "/common/security-features/subresource/document.py",
|
subresourceMap[scenario.subresource].invokerForReferrerPolicy ||
|
||||||
"img-tag": "/common/security-features/subresource/image.py",
|
subresourceMap[scenario.subresource].invoker;
|
||||||
"script-tag": "/common/security-features/subresource/script.py",
|
const checkResult = result => {
|
||||||
"worker-request": "/common/security-features/subresource/worker.py",
|
const referrerUrlResolver = {
|
||||||
"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"
|
|
||||||
};
|
|
||||||
|
|
||||||
var referrerUrlResolver = {
|
|
||||||
"omitted": function() {
|
"omitted": function() {
|
||||||
return undefined;
|
return undefined;
|
||||||
},
|
},
|
||||||
|
@ -67,83 +80,40 @@ function ReferrerPolicyTestCase(scenario, testDescription, sanityChecker) {
|
||||||
return stripUrlForUseAsReferrer(location.toString());
|
return stripUrlForUseAsReferrer(location.toString());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
const expectedReferrerUrl =
|
||||||
|
referrerUrlResolver[scenario.referrer_url]();
|
||||||
|
|
||||||
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]}}")
|
|
||||||
}
|
|
||||||
|
|
||||||
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];
|
|
||||||
// Depending on the delivery method, extend the subresource element with
|
|
||||||
// these attributes.
|
|
||||||
var elementAttributesForDeliveryMethod = {
|
|
||||||
"attr-referrer": {referrerPolicy: t._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);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
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.
|
// Check if the result is in valid format. NOOP in release.
|
||||||
sanityChecker.checkSubresourceResult(
|
sanityChecker.checkSubresourceResult(scenario, urls.testUrl, result);
|
||||||
test, t._scenario, resourceRequestUrl, result);
|
|
||||||
|
|
||||||
// Check the reported URL.
|
// Check the reported URL.
|
||||||
assert_equals(result.referrer,
|
assert_equals(result.referrer,
|
||||||
expectedReferrerUrl,
|
expectedReferrerUrl,
|
||||||
"Reported Referrer URL is '" +
|
"Reported Referrer URL is '" +
|
||||||
t._scenario.referrer_url + "'.");
|
scenario.referrer_url + "'.");
|
||||||
assert_equals(result.headers.referer,
|
assert_equals(result.headers.referer,
|
||||||
expectedReferrerUrl,
|
expectedReferrerUrl,
|
||||||
"Reported Referrer URL from HTTP header is '" +
|
"Reported Referrer URL from HTTP header is '" +
|
||||||
expectedReferrerUrl + "'");
|
expectedReferrerUrl + "'");
|
||||||
});
|
};
|
||||||
}, t._testDescription);
|
|
||||||
|
function runTest() {
|
||||||
|
promise_test(_ => {
|
||||||
|
// Depending on the delivery method, extend the subresource element with
|
||||||
|
// these attributes.
|
||||||
|
var elementAttributesForDeliveryMethod = {
|
||||||
|
"attr-referrer": {referrerPolicy: scenario.referrer_policy},
|
||||||
|
"rel-noreferrer": {rel: "noreferrer"}
|
||||||
|
};
|
||||||
|
var deliveryMethod = scenario.delivery_method;
|
||||||
|
let elementAttributes = {};
|
||||||
|
if (deliveryMethod in elementAttributesForDeliveryMethod) {
|
||||||
|
elementAttributes = elementAttributesForDeliveryMethod[deliveryMethod];
|
||||||
}
|
}
|
||||||
|
return invoker(urls.testUrl, elementAttributes, scenario.referrer_policy)
|
||||||
|
.then(checkResult);
|
||||||
|
}, testDescription);
|
||||||
}
|
}
|
||||||
|
|
||||||
return t;
|
return {start: runTest};
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,11 +28,9 @@ SanityChecker.prototype.checkScenario = function(scenario) {
|
||||||
}, "[ReferrerPolicyTestCase] The test scenario is valid.");
|
}, "[ReferrerPolicyTestCase] The test scenario is valid.");
|
||||||
}
|
}
|
||||||
|
|
||||||
SanityChecker.prototype.checkSubresourceResult = function(test,
|
SanityChecker.prototype.checkSubresourceResult = function(scenario,
|
||||||
scenario,
|
|
||||||
subresourceUrl,
|
subresourceUrl,
|
||||||
result) {
|
result) {
|
||||||
test.step(function() {
|
|
||||||
assert_equals(Object.keys(result).length, 3);
|
assert_equals(Object.keys(result).length, 3);
|
||||||
assert_own_property(result, "location");
|
assert_own_property(result, "location");
|
||||||
assert_own_property(result, "referrer");
|
assert_own_property(result, "referrer");
|
||||||
|
@ -45,5 +43,4 @@ SanityChecker.prototype.checkSubresourceResult = function(test,
|
||||||
// Sanity check: location of sub-resource matches reported location.
|
// Sanity check: location of sub-resource matches reported location.
|
||||||
assert_equals(result.location, subresourceUrl,
|
assert_equals(result.location, subresourceUrl,
|
||||||
"Subresource reported location.");
|
"Subresource reported location.");
|
||||||
}, "Running a valid test scenario.");
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -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>
|
|
@ -2383,6 +2383,42 @@ policies and contribution forms [3].
|
||||||
return duplicates;
|
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() {
|
Tests.prototype.notify_complete = function() {
|
||||||
var this_obj = this;
|
var this_obj = this;
|
||||||
var duplicates;
|
var duplicates;
|
||||||
|
@ -2390,6 +2426,11 @@ policies and contribution forms [3].
|
||||||
if (this.status.status === null) {
|
if (this.status.status === null) {
|
||||||
duplicates = this.find_duplicates();
|
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
|
// Test names are presumed to be unique within test files--this
|
||||||
// allows consumers to use them for identification purposes.
|
// allows consumers to use them for identification purposes.
|
||||||
// Duplicated names violate this expectation and should therefore
|
// Duplicated names violate this expectation and should therefore
|
||||||
|
|
|
@ -6,7 +6,7 @@ import zipfile
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from typing import Any
|
from typing import Any, Callable
|
||||||
except ImportError:
|
except ImportError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -17,10 +17,11 @@ class Kwargs(dict):
|
||||||
def set_if_none(self,
|
def set_if_none(self,
|
||||||
name, # type: str
|
name, # type: str
|
||||||
value, # type: Any
|
value, # type: Any
|
||||||
err_fn=None, # type: (Kwargs, str) -> Any
|
err_fn=None, # type: Callable[[Kwargs, str], Any]
|
||||||
desc=None, # type: str
|
desc=None, # type: str
|
||||||
extra_cond=None # type: (Kwargs) -> bool
|
extra_cond=None # type: Callable[[Kwargs], Any]
|
||||||
):
|
):
|
||||||
|
# type: (...) -> Any
|
||||||
if desc is None:
|
if desc is None:
|
||||||
desc = name
|
desc = name
|
||||||
|
|
||||||
|
|
|
@ -261,8 +261,123 @@ promise_test(async t => {
|
||||||
localQuicTransport.transport.stop();
|
localQuicTransport.transport.stop();
|
||||||
const promise = localQuicTransport.getStats();
|
const promise = localQuicTransport.getStats();
|
||||||
promise_rejects(t, 'InvalidStateError', promise);
|
promise_rejects(t, 'InvalidStateError', promise);
|
||||||
}, 'getStats() promises immediately rejected if called after' +
|
}, 'getStats() promises immediately rejected if called after ' +
|
||||||
`'closed' state.`);
|
`'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>
|
</script>
|
||||||
|
|
||||||
|
|
|
@ -91,6 +91,14 @@
|
||||||
if(xhr.readyState >= xhr.HEADERS_RECEIVED) {
|
if(xhr.readyState >= xhr.HEADERS_RECEIVED) {
|
||||||
assert_equals(xhr.status, 200, "JS never gets to see the 30x status code");
|
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);
|
actual.push("xhr onreadystatechange " + xhr.readyState);
|
||||||
});
|
});
|
||||||
xhr.onload = test.step_func(function(e)
|
xhr.onload = test.step_func(function(e)
|
||||||
|
|
|
@ -35,3 +35,6 @@
|
||||||
[WebGL test #124: could not create image (SVG)]
|
[WebGL test #124: could not create image (SVG)]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
[WebGL test #132: could not create image (SVG)]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue