Update web-platform-tests to revision 9a4d479ed1347eb9184abc70d628a6da2297657a

This commit is contained in:
WPT Sync Bot 2019-07-17 10:25:43 +00:00
parent b6cc0f60a9
commit effeb278b6
120 changed files with 3731 additions and 298 deletions

View file

@ -1,4 +1,5 @@
[url-in-tags-revoke.window.html]
expected: TIMEOUT
[Fetching a blob URL immediately before revoking it works in an iframe.]
expected: FAIL
@ -14,3 +15,6 @@
[Opening a blob URL in a new window by clicking an <a> tag works immediately before revoking the URL.]
expected: FAIL
[Fetching a blob URL immediately before revoking it works in <script> tags.]
expected: TIMEOUT

View file

@ -203889,6 +203889,18 @@
{}
]
],
"std-toast/ref-tests/toast-slotting.html": [
[
"std-toast/ref-tests/toast-slotting.html",
[
[
"/std-toast/ref-tests/toast-slotting-expected.html",
"=="
]
],
{}
]
],
"svg/coordinate-systems/abspos.html": [
[
"svg/coordinate-systems/abspos.html",
@ -271385,6 +271397,9 @@
"html/semantics/text-level-semantics/the-a-element/resources/a-download-click.html": [
[]
],
"html/semantics/text-level-semantics/the-a-element/resources/a-download-redirect-to-javascript.html": [
[]
],
"html/semantics/text-level-semantics/the-b-element/b-usage-notref.html": [
[]
],
@ -272702,6 +272717,15 @@
"kv-storage/helpers/kvs-tests.js": [
[]
],
"kv-storage/secure-context/README.md": [
[]
],
"kv-storage/secure-context/resources/dummy-module.js": [
[]
],
"kv-storage/secure-context/resources/test-side-effects.js": [
[]
],
"layout-instability/resources/slow-image.py": [
[]
],
@ -273995,6 +274019,15 @@
"navigation-timing/resources/performance_attribute_sender.html": [
[]
],
"navigation-timing/resources/secure-connection-interim.html": [
[]
],
"navigation-timing/resources/secure-connection-interim.html.headers": [
[]
],
"navigation-timing/resources/secure-connection-test.html": [
[]
],
"navigation-timing/resources/webperftestharness.js": [
[]
],
@ -278966,6 +278999,9 @@
"std-toast/META.yml": [
[]
],
"std-toast/ref-tests/toast-slotting-expected.html": [
[]
],
"std-toast/resources/helpers.js": [
[]
],
@ -286634,9 +286670,6 @@
"webxr/resources/webxr_util.js": [
[]
],
"webxr/resources/xr-test-asserts.js": [
[]
],
"workers/META.yml": [
[]
],
@ -309136,6 +309169,42 @@
{}
]
],
"css/css-align/parsing/place-content-invalid.html": [
[
"css/css-align/parsing/place-content-invalid.html",
{}
]
],
"css/css-align/parsing/place-content-valid.html": [
[
"css/css-align/parsing/place-content-valid.html",
{}
]
],
"css/css-align/parsing/place-items-invalid.html": [
[
"css/css-align/parsing/place-items-invalid.html",
{}
]
],
"css/css-align/parsing/place-items-valid.html": [
[
"css/css-align/parsing/place-items-valid.html",
{}
]
],
"css/css-align/parsing/place-self-invalid.html": [
[
"css/css-align/parsing/place-self-invalid.html",
{}
]
],
"css/css-align/parsing/place-self-valid.html": [
[
"css/css-align/parsing/place-self-valid.html",
{}
]
],
"css/css-align/self-alignment/parse-align-self-001.html": [
[
"css/css-align/self-alignment/parse-align-self-001.html",
@ -329391,6 +329460,12 @@
{}
]
],
"element-timing/image-src-change.html": [
[
"element-timing/image-src-change.html",
{}
]
],
"element-timing/image-with-css-scale.html": [
[
"element-timing/image-with-css-scale.html",
@ -338884,6 +338959,14 @@
}
]
],
"event-timing/buffered-flag.html": [
[
"event-timing/buffered-flag.html",
{
"testdriver": true
}
]
],
"event-timing/crossiframe.html": [
[
"event-timing/crossiframe.html",
@ -343072,6 +343155,12 @@
{}
]
],
"fetch/sec-metadata/fetch.tentative.sub.html": [
[
"fetch/sec-metadata/fetch.tentative.sub.html",
{}
]
],
"fetch/sec-metadata/font.tentative.https.sub.html": [
[
"fetch/sec-metadata/font.tentative.https.sub.html",
@ -354988,6 +355077,12 @@
{}
]
],
"html/semantics/text-level-semantics/the-a-element/a-download-click-redirect-to-javascript.html": [
[
"html/semantics/text-level-semantics/the-a-element/a-download-click-redirect-to-javascript.html",
{}
]
],
"html/semantics/text-level-semantics/the-a-element/a-download-click.html": [
[
"html/semantics/text-level-semantics/the-a-element/a-download-click.html",
@ -359503,21 +359598,33 @@
}
]
],
"kv-storage/non-secure-context-dynamic-import.html": [
"kv-storage/secure-context/dynamic-import.html": [
[
"kv-storage/non-secure-context-dynamic-import.html",
"kv-storage/secure-context/dynamic-import.html",
{}
]
],
"kv-storage/non-secure-context-import-statement.html": [
"kv-storage/secure-context/import-maps.html": [
[
"kv-storage/non-secure-context-import-statement.html",
"kv-storage/secure-context/import-maps.html",
{}
]
],
"kv-storage/non-secure-context-script-element.html": [
"kv-storage/secure-context/import-statement.html": [
[
"kv-storage/non-secure-context-script-element.html",
"kv-storage/secure-context/import-statement.html",
{}
]
],
"kv-storage/secure-context/script-element.html": [
[
"kv-storage/secure-context/script-element.html",
{}
]
],
"kv-storage/secure-context/side-effects.html": [
[
"kv-storage/secure-context/side-effects.html",
{}
]
],
@ -359551,6 +359658,12 @@
{}
]
],
"largest-contentful-paint/image-src-change.html": [
[
"largest-contentful-paint/image-src-change.html",
{}
]
],
"largest-contentful-paint/observe-image.html": [
[
"largest-contentful-paint/observe-image.html",
@ -359569,6 +359682,12 @@
{}
]
],
"layout-instability/buffered-flag.html": [
[
"layout-instability/buffered-flag.html",
{}
]
],
"layout-instability/observe-layout-shift.html": [
[
"layout-instability/observe-layout-shift.html",
@ -360181,6 +360300,30 @@
{}
]
],
"media-source/mediasource-changetype-play-implicit.html": [
[
"media-source/mediasource-changetype-play-implicit.html",
{
"timeout": "long"
}
]
],
"media-source/mediasource-changetype-play-negative.html": [
[
"media-source/mediasource-changetype-play-negative.html",
{
"timeout": "long"
}
]
],
"media-source/mediasource-changetype-play-without-codecs-parameter.html": [
[
"media-source/mediasource-changetype-play-without-codecs-parameter.html",
{
"timeout": "long"
}
]
],
"media-source/mediasource-changetype-play.html": [
[
"media-source/mediasource-changetype-play.html",
@ -363801,9 +363944,9 @@
}
]
],
"native-file-system/FileSystemBaseHandle-remove.tentative.window.js": [
"native-file-system/FileSystemBaseHandle-remove.tentative.https.window.js": [
[
"native-file-system/FileSystemBaseHandle-remove.tentative.window.html",
"native-file-system/FileSystemBaseHandle-remove.tentative.https.window.html",
{
"script_metadata": [
[
@ -363814,9 +363957,9 @@
}
]
],
"native-file-system/FileSystemDirectoryHandle-getDirectory.tentative.window.js": [
"native-file-system/FileSystemDirectoryHandle-getDirectory.tentative.https.window.js": [
[
"native-file-system/FileSystemDirectoryHandle-getDirectory.tentative.window.html",
"native-file-system/FileSystemDirectoryHandle-getDirectory.tentative.https.window.html",
{
"script_metadata": [
[
@ -363827,9 +363970,9 @@
}
]
],
"native-file-system/FileSystemDirectoryHandle-getFile.tentative.window.js": [
"native-file-system/FileSystemDirectoryHandle-getFile.tentative.https.window.js": [
[
"native-file-system/FileSystemDirectoryHandle-getFile.tentative.window.html",
"native-file-system/FileSystemDirectoryHandle-getFile.tentative.https.window.html",
{
"script_metadata": [
[
@ -363840,9 +363983,9 @@
}
]
],
"native-file-system/FileSystemWriter.tentative.window.js": [
"native-file-system/FileSystemWriter.tentative.https.window.js": [
[
"native-file-system/FileSystemWriter.tentative.window.html",
"native-file-system/FileSystemWriter.tentative.https.window.html",
{
"script_metadata": [
[
@ -363853,9 +363996,9 @@
}
]
],
"native-file-system/NativeFileSystemWritableFileStream.tentative.window.js": [
"native-file-system/NativeFileSystemWritableFileStream.tentative.https.window.js": [
[
"native-file-system/NativeFileSystemWritableFileStream.tentative.window.html",
"native-file-system/NativeFileSystemWritableFileStream.tentative.https.window.html",
{
"script_metadata": [
[
@ -364003,6 +364146,12 @@
{}
]
],
"navigation-timing/secure-connection-start-reuse.https.html": [
[
"navigation-timing/secure-connection-start-reuse.https.html",
{}
]
],
"navigation-timing/secure_connection_start_non_zero.https.html": [
[
"navigation-timing/secure_connection_start_non_zero.https.html",
@ -390517,6 +390666,12 @@
{}
]
],
"std-toast/styles.html": [
[
"std-toast/styles.html",
{}
]
],
"storage/estimate-indexeddb.https.any.js": [
[
"storage/estimate-indexeddb.https.any.html",
@ -409917,12 +410072,48 @@
{}
]
],
"webxr/events_input_source_recreation.https.html": [
[
"webxr/events_input_source_recreation.https.html",
{}
]
],
"webxr/events_input_sources_change.https.html": [
[
"webxr/events_input_sources_change.https.html",
{}
]
],
"webxr/events_referenceSpace_reset.https.html": [
[
"webxr/events_referenceSpace_reset.https.html",
{}
]
],
"webxr/events_session_select.https.html": [
[
"webxr/events_session_select.https.html",
{}
]
],
"webxr/events_session_select_subframe.https.html": [
[
"webxr/events_session_select_subframe.https.html",
{}
]
],
"webxr/getInputPose_handedness.https.html": [
[
"webxr/getInputPose_handedness.https.html",
{}
]
],
"webxr/getInputPose_pointer.https.html": [
[
"webxr/getInputPose_pointer.https.html",
{}
]
],
"webxr/idlharness.https.window.js": [
[
"webxr/idlharness.https.window.html",
@ -410036,6 +410227,24 @@
{}
]
],
"webxr/xrInputSource_add_remove.https.html": [
[
"webxr/xrInputSource_add_remove.https.html",
{}
]
],
"webxr/xrInputSource_gamepad_disconnect.https.html": [
[
"webxr/xrInputSource_gamepad_disconnect.https.html",
{}
]
],
"webxr/xrInputSource_gamepad_input_registered.https.html": [
[
"webxr/xrInputSource_gamepad_input_registered.https.html",
{}
]
],
"webxr/xrRay_constructor.https.html": [
[
"webxr/xrRay_constructor.https.html",
@ -410048,6 +410257,18 @@
{}
]
],
"webxr/xrReferenceSpace_originOffset.https.html": [
[
"webxr/xrReferenceSpace_originOffset.https.html",
{}
]
],
"webxr/xrReferenceSpace_originOffsetBounded.https.html": [
[
"webxr/xrReferenceSpace_originOffsetBounded.https.html",
{}
]
],
"webxr/xrRigidTransform_constructor.https.html": [
[
"webxr/xrRigidTransform_constructor.https.html",
@ -410084,6 +410305,12 @@
{}
]
],
"webxr/xrSession_input_events_end.https.html": [
[
"webxr/xrSession_input_events_end.https.html",
{}
]
],
"webxr/xrSession_prevent_multiple_exclusive.https.html": [
[
"webxr/xrSession_prevent_multiple_exclusive.https.html",
@ -530845,6 +531072,30 @@
"1ee23af200f6300bc3a86f0a1b843c875c8c92a9",
"testharness"
],
"css/css-align/parsing/place-content-invalid.html": [
"3fcd9a8dbed1b488ed16a40945fcb1e48c4fe6b8",
"testharness"
],
"css/css-align/parsing/place-content-valid.html": [
"a83aa4cec86db72adb691c8ad1bb061bb793267e",
"testharness"
],
"css/css-align/parsing/place-items-invalid.html": [
"9468d30e2e745ddc576b4bee18923d6943286222",
"testharness"
],
"css/css-align/parsing/place-items-valid.html": [
"72179bf2db0dcc7b76c8e0bbe5fe42ee8d81f9f3",
"testharness"
],
"css/css-align/parsing/place-self-invalid.html": [
"8a7a2ab187f9a34593d46da69d5d29ff62a7d716",
"testharness"
],
"css/css-align/parsing/place-self-valid.html": [
"36a8bd5026eab2870307c223028b499c02c92099",
"testharness"
],
"css/css-align/reference/baseline-of-scrollable-1-ref.html": [
"422660aff6b6b486ce3288469b4769e1497b071e",
"support"
@ -609514,7 +609765,7 @@
"testharness"
],
"element-timing/cross-origin-element.sub.html": [
"40a97056c2bfba92485f627117f61cd56a563d0b",
"eef69a1d423a96cc8acd6b00a35e0c344ce7b7da",
"testharness"
],
"element-timing/cross-origin-iframe-element.sub.html": [
@ -609530,7 +609781,7 @@
"testharness"
],
"element-timing/image-TAO.sub.html": [
"83a7a5ca0a21e9b4fd32192b019b6a15603748c8",
"032ae6b12198b76107ab3dfcc2ab3b7f92b13c00",
"testharness"
],
"element-timing/image-carousel.html": [
@ -609557,6 +609808,10 @@
"7441405d7475b4a300962dc21dd9b50d52250c38",
"testharness"
],
"element-timing/image-src-change.html": [
"89b8e1d3f74750d25ca997a6f258162c5d1f113e",
"testharness"
],
"element-timing/image-with-css-scale.html": [
"5c15daabe13dda37ce58a9c056cb2884cf1bb584",
"testharness"
@ -609630,7 +609885,7 @@
"support"
],
"element-timing/resources/element-timing-helpers.js": [
"6c0aec80960ebab60979986434272a96ecc6c674",
"f98f9b21134e334e46510bb419a12291d23817bc",
"support"
],
"element-timing/resources/iframe-with-square-sends-entry.html": [
@ -611805,6 +612060,10 @@
"c30c01aa96bb9bc835bb1ce93bff86f5e99789d7",
"testharness"
],
"event-timing/buffered-flag.html": [
"8b56ad7f44d6b2849d300338b45dd104059c3520",
"testharness"
],
"event-timing/crossiframe.html": [
"c1a27a5d021e210d7604f6a7dfab436c8547f03c",
"testharness"
@ -614341,6 +614600,10 @@
"bffb4275df8e99c9d06d4fa4ef518e3b1efba747",
"testharness"
],
"fetch/sec-metadata/fetch.tentative.sub.html": [
"0c5caa76a2328148c9cced21bb5c27f07bd36bde",
"testharness"
],
"fetch/sec-metadata/font.tentative.https.sub.html": [
"60163ee714686fc1c3f5f9b7011ce03cf3028e6b",
"testharness"
@ -614354,7 +614617,7 @@
"testharness"
],
"fetch/sec-metadata/iframe.tentative.sub.html": [
"eab2d3f5886ed178781e092b90bfd52eaa194bc5",
"2bc2581fceed3e3339c67dc4d5ee69e46636394f",
"testharness"
],
"fetch/sec-metadata/img.tentative.https.sub.html": [
@ -614386,7 +614649,7 @@
"testharness"
],
"fetch/sec-metadata/redirect/multiple-redirect-https-downgrade-upgrade.tentative.sub.html": [
"3f8726dc69e7ddf57b3d66cd0866caab0c58760c",
"cede6712264e44ed885f8f6399ab74c2dd03a3f2",
"testharness"
],
"fetch/sec-metadata/redirect/multiple-redirect-same-site.tentative.https.sub.html": [
@ -614394,7 +614657,7 @@
"testharness"
],
"fetch/sec-metadata/redirect/redirect-http-upgrade.tentative.sub.html": [
"fe55cda7e6b0f108465477570288ccfc73b5af93",
"4f173d9808ac550b443ecb9ed2a00c0b9a402b47",
"testharness"
],
"fetch/sec-metadata/redirect/redirect-https-downgrade.tentative.sub.html": [
@ -633001,6 +633264,10 @@
"3c8adc0b97e0d236bf1667226714726d5d931c82",
"testharness"
],
"html/semantics/text-level-semantics/the-a-element/a-download-click-redirect-to-javascript.html": [
"09f63b6f4d3c775d5a351178b2d6dbd1546dbdcb",
"testharness"
],
"html/semantics/text-level-semantics/the-a-element/a-download-click.html": [
"22d329f245275b464fef83aa68f8688b810954dd",
"testharness"
@ -633025,6 +633292,10 @@
"7d36c21d1e4ca80f94fe05372f685cf55ba3d776",
"support"
],
"html/semantics/text-level-semantics/the-a-element/resources/a-download-redirect-to-javascript.html": [
"4ff8b61e3be97fc49b842b4b98f53ae4accd9089",
"support"
],
"html/semantics/text-level-semantics/the-b-element/b-usage-notref.html": [
"3d3c46a281f13a8361aeef472a826834d6a0a89b",
"support"
@ -636670,7 +636941,7 @@
"support"
],
"interfaces/speech-api.idl": [
"ba86d5065b7a4d941b53e5aabf133fed54b16ff4",
"8a32b457a997e651c8389c0b8da4c756ddf9f571",
"support"
],
"interfaces/storage.idl": [
@ -637217,16 +637488,36 @@
"3535d2fb93993af74d752c80626d5f10c0d24a60",
"testharness"
],
"kv-storage/non-secure-context-dynamic-import.html": [
"6ccbf84ba1dc6acd4931da279c887635b7f8a771",
"kv-storage/secure-context/README.md": [
"9b3539995bfa656860ce6cb9b51b287e4afcfb30",
"support"
],
"kv-storage/secure-context/dynamic-import.html": [
"38e1bb79c47ecf0886f231f8f40c1aac36d8a063",
"testharness"
],
"kv-storage/non-secure-context-import-statement.html": [
"fda02aadf14fcb9be859c091df3a2ac1d2c56994",
"kv-storage/secure-context/import-maps.html": [
"64301f03032c0efe047297b21389ccf778949a76",
"testharness"
],
"kv-storage/non-secure-context-script-element.html": [
"66802b1254eda87e1a966d6f835676ecba942cbe",
"kv-storage/secure-context/import-statement.html": [
"db01152a4e155e27dcdbc264a4291d0245c115d4",
"testharness"
],
"kv-storage/secure-context/resources/dummy-module.js": [
"27fb98860ea352b1df491031487ccc0bbb9bdf42",
"support"
],
"kv-storage/secure-context/resources/test-side-effects.js": [
"39780a92fff17fdf64d8b43c025304b59b1fe2b7",
"support"
],
"kv-storage/secure-context/script-element.html": [
"b8170549ab558bbef98a357074b1ec6281a385a7",
"testharness"
],
"kv-storage/secure-context/side-effects.html": [
"f4c4b691d30db83342aaa5fc3a181d4dc98b4f1d",
"testharness"
],
"kv-storage/storage-smoke-test.https.html": [
@ -637242,21 +637533,29 @@
"testharness"
],
"largest-contentful-paint/cross-origin-image.sub.html": [
"fd4844d16b3a3b150ad98747184e4c3bb25c2f81",
"6e86f13b9ccccf5cecd1ca4bd02b6d0cd2007845",
"testharness"
],
"largest-contentful-paint/image-src-change.html": [
"3e083625bdc1812a2c344b8eefaaa10d3b31e623",
"testharness"
],
"largest-contentful-paint/observe-image.html": [
"a1ecbceb503a31c99ff070ff06146014f8c3fdf9",
"4d56cc2d8386e41e220097836755d1936185b41c",
"testharness"
],
"largest-contentful-paint/observe-text.html": [
"58897907365d3156e838ca9e0a65db289ea4cfec",
"7dbfbe52f3dadf01524025a80fdcce4b64a60e19",
"testharness"
],
"layout-instability/buffer-layout-shift.html": [
"216cafd45de0785b27a0ca7fa009352de7887e23",
"testharness"
],
"layout-instability/buffered-flag.html": [
"6a8c937e5ff17ee54c87facf1e247839a5142707",
"testharness"
],
"layout-instability/observe-layout-shift.html": [
"a522b49034e58c7aafd98eacae12353bc3476d06",
"testharness"
@ -638349,12 +638648,24 @@
"38cd1717eb23be2d6ef9dde3959aa79b48621193",
"testharness"
],
"media-source/mediasource-changetype-play-implicit.html": [
"c186361e791b303e958c93171ba58a260e20d5fa",
"testharness"
],
"media-source/mediasource-changetype-play-negative.html": [
"f74e12945ac1a4a5865f0f10cc66a522301400f7",
"testharness"
],
"media-source/mediasource-changetype-play-without-codecs-parameter.html": [
"f802b155f724357905d1a92f6ed1e1155b45f1b8",
"testharness"
],
"media-source/mediasource-changetype-play.html": [
"210f66e1a28dfda173ab3baa5836afe59ecd54ca",
"26a67c32704de1ab4f9a60aebbadf7d8f25c2601",
"testharness"
],
"media-source/mediasource-changetype-util.js": [
"3dd1c4738766155d2ab079fe5b6a7970ebdb71db",
"28e92893657b956d84bff1cf0c87c000f272063d",
"support"
],
"media-source/mediasource-changetype.html": [
@ -638546,7 +638857,7 @@
"testharness"
],
"media-source/mediasource-util.js": [
"bb701e705245828143b8b8be45ebec2cffaf9c11",
"6b11210052d774fb6222602a0e7cfc3f0f2eea58",
"support"
],
"media-source/mp3/sound_5.mp3": [
@ -641909,23 +642220,23 @@
"0d9137dc6fb91b1499d922e01d6ad96049f5757b",
"testharness"
],
"native-file-system/FileSystemBaseHandle-remove.tentative.window.js": [
"native-file-system/FileSystemBaseHandle-remove.tentative.https.window.js": [
"a4eb2871104f924347f9ec8791a6381313a54483",
"testharness"
],
"native-file-system/FileSystemDirectoryHandle-getDirectory.tentative.window.js": [
"native-file-system/FileSystemDirectoryHandle-getDirectory.tentative.https.window.js": [
"2064fc46f05f5e30c14f77c14c5751b411d1c5e0",
"testharness"
],
"native-file-system/FileSystemDirectoryHandle-getFile.tentative.window.js": [
"native-file-system/FileSystemDirectoryHandle-getFile.tentative.https.window.js": [
"473cad4c9c36660584c07d7b53dfc68c7f734cb4",
"testharness"
],
"native-file-system/FileSystemWriter.tentative.window.js": [
"native-file-system/FileSystemWriter.tentative.https.window.js": [
"f2c2fc82866b83953e2783f8dc56ceaa0803b097",
"testharness"
],
"native-file-system/NativeFileSystemWritableFileStream.tentative.window.js": [
"native-file-system/NativeFileSystemWritableFileStream.tentative.https.window.js": [
"1dbcb2b136220954c777b2cc3b0197039cf730be",
"testharness"
],
@ -642057,10 +642368,26 @@
"99f544690d331f8c172a3f54bd589a89eaa35716",
"support"
],
"navigation-timing/resources/secure-connection-interim.html": [
"e40b00bedbd59b8e2f8adf10a55fe06a04022987",
"support"
],
"navigation-timing/resources/secure-connection-interim.html.headers": [
"b70fbaf3b020a892e9aec31f6afd2e6a3d0fd4e6",
"support"
],
"navigation-timing/resources/secure-connection-test.html": [
"63a80e062bfad190cf036fccb976b53fe472d342",
"support"
],
"navigation-timing/resources/webperftestharness.js": [
"3efb52783f1e5dcb0d42aad11aec2a9e47257d33",
"support"
],
"navigation-timing/secure-connection-start-reuse.https.html": [
"f52a259ecd425c212d89eb114981d4f12e80f305",
"testharness"
],
"navigation-timing/secure_connection_start_non_zero.https.html": [
"e95468ef9122822bf8e443e356df0fd7cc8bd4cd",
"testharness"
@ -660830,7 +661157,7 @@
"support"
],
"resources/chromium/webxr-test.js": [
"88227cbf12326838d416470cdd9757052d66020d",
"16a859a8ef36727cbbaf5ea55329593c27d6f972",
"support"
],
"resources/chromium/webxr-test.js.headers": [
@ -666182,7 +666509,7 @@
"manual"
],
"speech-api/historical.html": [
"2fb0ccd4b905b4503f0affa4c8c7be3141871fe3",
"207d3e016ed1fec05d9a1256f40088c61bb05c83",
"testharness"
],
"speech-api/idlharness.window.js": [
@ -666221,14 +666548,26 @@
"6d4a462d3a9417a501c6ad434b25896a03e162db",
"testharness"
],
"std-toast/ref-tests/toast-slotting-expected.html": [
"b4b365c7a9dfa25363acfb3123b1c019c3ca08d0",
"support"
],
"std-toast/ref-tests/toast-slotting.html": [
"4d6f5038f2d6ffa80ebdfa12798c8c4202b39670",
"reftest"
],
"std-toast/resources/helpers.js": [
"52d740c144af59f1b32cbc8bdab555da9fa72227",
"256f0c880408c3343d36392f8b4cf64d9bbbfbe6",
"support"
],
"std-toast/show-toast.html": [
"50cdc2c06ddbf34b16119f9c42e3a7cbaf5ec258",
"testharness"
],
"std-toast/styles.html": [
"98e6723c3c8b16fd71d388ad3947627194c76436",
"testharness"
],
"storage/META.yml": [
"2aad1fb513710e839ad86c923bf208dae604d3d2",
"support"
@ -666330,7 +666669,7 @@
"testharness"
],
"streams/piping/abort.any.js": [
"5064533d4defdf22a6a04b4a3f47beceee417f58",
"65c458aa2941ff64677ec976e05de5be264dda60",
"testharness"
],
"streams/piping/close-propagation-backward.any.js": [
@ -676026,7 +676365,7 @@
"support"
],
"tools/wptrunner/wptrunner/browsers/chrome_android.py": [
"3c277a567d7f06f39dfc02cb18d5229c7570a131",
"31ae7995b4010a6fcef0c585eed1128815837fcb",
"support"
],
"tools/wptrunner/wptrunner/browsers/edge.py": [
@ -678874,7 +679213,7 @@
"support"
],
"wake-lock/wakelock-abortsignal.https.any.js": [
"7961674fea6e42f2a6a2b34b23be486e4685ccea",
"671852f3c946716cf6cfb6dac6249a30bec1f701",
"testharness"
],
"wake-lock/wakelock-active-document.https.window.js": [
@ -679994,7 +680333,7 @@
"support"
],
"webaudio/resources/audit.js": [
"f3ce71911ac02d971157e31462b1c8d34f83f756",
"1876c0fc77174d861d3847f874dbad26c737d430",
"support"
],
"webaudio/resources/biquad-filters.js": [
@ -687569,10 +687908,34 @@
"520afec2000721d04aae9ed89bca49297fa31d4b",
"support"
],
"webxr/events_input_source_recreation.https.html": [
"ab78d9d8fda41b821e26976351a2a77a123b524b",
"testharness"
],
"webxr/events_input_sources_change.https.html": [
"bc2b2a95e40b0d700e8d18c9dc953b84ec9fbcde",
"testharness"
],
"webxr/events_referenceSpace_reset.https.html": [
"f15ffc52a8845b7e2cdd6ddb4a9b7f06c1c3e5e0",
"testharness"
],
"webxr/events_session_select.https.html": [
"b74d5ea02dbefa51311d592fbf26019f06790ec2",
"testharness"
],
"webxr/events_session_select_subframe.https.html": [
"0e2c23424c0893b6a563c2aa2fbd999e50b1cfef",
"testharness"
],
"webxr/getInputPose_handedness.https.html": [
"5a310c6dd77274631d0ef9e751c6f195def9c3d3",
"testharness"
],
"webxr/getInputPose_pointer.https.html": [
"c8545999080892701858b425d8141ae0d3b3c469",
"testharness"
],
"webxr/idlharness.https.window.js": [
"3e54e367787cb95dada398790fe23b10174df29f",
"testharness"
@ -687586,19 +687949,15 @@
"support"
],
"webxr/resources/webxr_test_asserts.js": [
"2253ffc2d39d268142711fca7f81dda3fc6a318c",
"36524211d01980283124c0e2c7fcefd67a7b8b04",
"support"
],
"webxr/resources/webxr_test_constants.js": [
"fd6d0fb184237e0092f499950e2562dddda695d7",
"a0b0e278a87401702aabf1fd375f3100f20dd7d7",
"support"
],
"webxr/resources/webxr_util.js": [
"54a91c85c86a311b382c293c3e53fa92c0182b81",
"support"
],
"webxr/resources/xr-test-asserts.js": [
"2253ffc2d39d268142711fca7f81dda3fc6a318c",
"3a6a6c96fe0c419c1ff7ed7c5ab347cbc6978c13",
"support"
],
"webxr/webGLCanvasContext_create_xrcompatible.https.html": [
@ -687618,7 +687977,7 @@
"testharness"
],
"webxr/xrBoundedReferenceSpace_updates.https.html": [
"e2920b176567774984e115b2998e89edf95362e6",
"2f84d6453672adfaa066a8c199b47333bdebb5d1",
"testharness"
],
"webxr/xrDevice_disconnect_ends.https.html": [
@ -687658,13 +688017,25 @@
"testharness"
],
"webxr/xrFrame_getPose.https.html": [
"313cd11c32005abdfa4686bc857e514ee4a29f75",
"8795a0a9737f673384bf208aa0043b1be04864fd",
"testharness"
],
"webxr/xrFrame_lifetime.https.html": [
"c7af792c7bb45155c1a24e177ed3be05875872d6",
"testharness"
],
"webxr/xrInputSource_add_remove.https.html": [
"4c50670c70ec87754a777cc0bcfe8272e794ca07",
"testharness"
],
"webxr/xrInputSource_gamepad_disconnect.https.html": [
"a43bdaae0f924b6c89144e59aa43896349e2b0a0",
"testharness"
],
"webxr/xrInputSource_gamepad_input_registered.https.html": [
"f3e0c75a128781e275aaadbfcb46ebe81ae64cac",
"testharness"
],
"webxr/xrRay_constructor.https.html": [
"b955db4509c2f60facee570e6011a1441297e3dd",
"testharness"
@ -687673,6 +688044,14 @@
"83a1050d6b169d28ad6b9d4417f06895e53bcfc6",
"testharness"
],
"webxr/xrReferenceSpace_originOffset.https.html": [
"b4e1c8e5c97cfaf8cc09ae718118c40986010ef1",
"testharness"
],
"webxr/xrReferenceSpace_originOffsetBounded.https.html": [
"f76c3c430e084709a73f6b419fba659667cd53a5",
"testharness"
],
"webxr/xrRigidTransform_constructor.https.html": [
"6a54fff808d93ac4423364b9c8b9d528a7e520c0",
"testharness"
@ -687697,6 +688076,10 @@
"b91a5b977cab3d2fbb5c4989246f45b0c9b2024b",
"testharness"
],
"webxr/xrSession_input_events_end.https.html": [
"37e020605a7e88320c42e054f867f611955c5713",
"testharness"
],
"webxr/xrSession_prevent_multiple_exclusive.https.html": [
"cd140703784961911586f8b63cebd52b356facd5",
"testharness"
@ -687710,7 +688093,7 @@
"testharness"
],
"webxr/xrSession_requestAnimationFrame_getViewerPose.https.html": [
"f8587796a229ec7f0aa5ab4fcde573737c2e7eca",
"bdb5edda566704c4d1434b328d3adbe46d3501ba",
"testharness"
],
"webxr/xrSession_requestReferenceSpace.https.html": [
@ -687722,15 +688105,15 @@
"testharness"
],
"webxr/xrStationaryReferenceSpace_floorlevel_updates.https.html": [
"06a256698165e5bc592256a4ce24ddce12de74f8",
"aa3c1b85c5d8ef550b9a835d384c67f602e290e9",
"testharness"
],
"webxr/xrView_eyes.https.html": [
"4ff22ff618d96d53c7a9e8cc573608bb0ea7919e",
"956edba98365d90eb180ad3c9697dae098bd25db",
"testharness"
],
"webxr/xrWebGLLayer_viewports.https.html": [
"247e3b779d6105f4a9e57fd39c5dcf06ca737950",
"9553a445e43153b716d55c7f2be606dd548b808e",
"testharness"
],
"workers/META.yml": [

View file

@ -0,0 +1,70 @@
[place-content-valid.html]
[e.style['place-content'\] = "stretch" should set the property value]
expected: FAIL
[e.style['place-content'\] = "baseline" should set the property value]
expected: FAIL
[e.style['place-content'\] = "first baseline stretch" should set the property value]
expected: FAIL
[e.style['place-content'\] = "unsafe end unsafe end" should set the property value]
expected: FAIL
[e.style['place-content'\] = "space-between" should set the property value]
expected: FAIL
[e.style['place-content'\] = "center" should set the property value]
expected: FAIL
[e.style['place-content'\] = "safe flex-start" should set the property value]
expected: FAIL
[e.style['place-content'\] = "baseline space-around" should set the property value]
expected: FAIL
[e.style['place-content'\] = "normal normal" should set the property value]
expected: FAIL
[e.style['place-content'\] = "flex-start flex-start" should set the property value]
expected: FAIL
[e.style['place-content'\] = "normal stretch" should set the property value]
expected: FAIL
[e.style['place-content'\] = "center normal" should set the property value]
expected: FAIL
[e.style['place-content'\] = "normal right" should set the property value]
expected: FAIL
[e.style['place-content'\] = "space-around" should set the property value]
expected: FAIL
[e.style['place-content'\] = "space-evenly" should set the property value]
expected: FAIL
[e.style['place-content'\] = "end" should set the property value]
expected: FAIL
[e.style['place-content'\] = "baseline stretch" should set the property value]
expected: FAIL
[e.style['place-content'\] = "first baseline start" should set the property value]
expected: FAIL
[e.style['place-content'\] = "last baseline flex-start" should set the property value]
expected: FAIL
[e.style['place-content'\] = "baseline unsafe left" should set the property value]
expected: FAIL
[e.style['place-content'\] = "first baseline" should set the property value]
expected: FAIL
[e.style['place-content'\] = "space-evenly unsafe end" should set the property value]
expected: FAIL
[e.style['place-content'\] = "last baseline" should set the property value]
expected: FAIL

View file

@ -0,0 +1,55 @@
[place-items-valid.html]
[e.style['place-items'\] = "stretch stretch" should set the property value]
expected: FAIL
[e.style['place-items'\] = "baseline unsafe left" should set the property value]
expected: FAIL
[e.style['place-items'\] = "self-start" should set the property value]
expected: FAIL
[e.style['place-items'\] = "last baseline last baseline" should set the property value]
expected: FAIL
[e.style['place-items'\] = "stretch baseline" should set the property value]
expected: FAIL
[e.style['place-items'\] = "center" should set the property value]
expected: FAIL
[e.style['place-items'\] = "safe self-end" should set the property value]
expected: FAIL
[e.style['place-items'\] = "flex-end legacy" should set the property value]
expected: FAIL
[e.style['place-items'\] = "first baseline" should set the property value]
expected: FAIL
[e.style['place-items'\] = "normal" should set the property value]
expected: FAIL
[e.style['place-items'\] = "first baseline right legacy" should set the property value]
expected: FAIL
[e.style['place-items'\] = "last baseline center" should set the property value]
expected: FAIL
[e.style['place-items'\] = "end end" should set the property value]
expected: FAIL
[e.style['place-items'\] = "normal right" should set the property value]
expected: FAIL
[e.style['place-items'\] = "stretch legacy left" should set the property value]
expected: FAIL
[e.style['place-items'\] = "flex-end" should set the property value]
expected: FAIL
[e.style['place-items'\] = "safe self-end normal" should set the property value]
expected: FAIL
[e.style['place-items'\] = "unsafe center unsafe center" should set the property value]
expected: FAIL

View file

@ -0,0 +1,49 @@
[place-self-valid.html]
[e.style['place-self'\] = "center center" should set the property value]
expected: FAIL
[e.style['place-self'\] = "self-start" should set the property value]
expected: FAIL
[e.style['place-self'\] = "unsafe center" should set the property value]
expected: FAIL
[e.style['place-self'\] = "auto last baseline" should set the property value]
expected: FAIL
[e.style['place-self'\] = "normal right" should set the property value]
expected: FAIL
[e.style['place-self'\] = "baseline flex-end" should set the property value]
expected: FAIL
[e.style['place-self'\] = "flex-end" should set the property value]
expected: FAIL
[e.style['place-self'\] = "auto auto" should set the property value]
expected: FAIL
[e.style['place-self'\] = "start" should set the property value]
expected: FAIL
[e.style['place-self'\] = "baseline unsafe left" should set the property value]
expected: FAIL
[e.style['place-self'\] = "last baseline last baseline" should set the property value]
expected: FAIL
[e.style['place-self'\] = "first baseline" should set the property value]
expected: FAIL
[e.style['place-self'\] = "normal" should set the property value]
expected: FAIL
[e.style['place-self'\] = "unsafe center stretch" should set the property value]
expected: FAIL
[e.style['place-self'\] = "safe self-end safe self-end" should set the property value]
expected: FAIL
[e.style['place-self'\] = "stretch" should set the property value]
expected: FAIL

View file

@ -1,2 +0,0 @@
[matchMedia-display-none-iframe.html]
expected: ERROR

View file

@ -312,12 +312,6 @@
[<iframe>: separate response Content-Type: */* text/html]
expected: FAIL
[<iframe>: separate response Content-Type: text/html */*;charset=gbk]
expected: FAIL
[<iframe>: separate response Content-Type: text/plain */*;charset=gbk]
expected: FAIL
[<iframe>: separate response Content-Type: text/html;x=" text/plain]
expected: FAIL
@ -327,12 +321,15 @@
[<iframe>: combined response Content-Type: text/html;" \\" text/plain]
expected: FAIL
[<iframe>: combined response Content-Type: text/html */*]
expected: FAIL
[<iframe>: combined response Content-Type: text/html */*;charset=gbk]
expected: FAIL
[<iframe>: separate response Content-Type: text/html;" \\" text/plain]
expected: FAIL
[<iframe>: combined response Content-Type: */* text/html]
expected: FAIL
[<iframe>: combined response Content-Type: text/html;charset=gbk text/plain text/html]
expected: FAIL
[<iframe>: separate response Content-Type: text/plain */*]
expected: FAIL

View file

@ -56,12 +56,3 @@
[separate text/javascript x/x]
expected: FAIL
[separate text/javascript;charset=windows-1252 error text/javascript]
expected: FAIL
[separate text/javascript error]
expected: FAIL
[separate text/javascript ]
expected: FAIL

View file

@ -11,6 +11,6 @@
[X-Content-Type-Options%3A%20nosniff%0C]
expected: FAIL
[X-Content-Type-Options%3A%20%40%23%24%23%25%25%26%5E%26%5E*()()11!%2Cnosniff]
[Content-Type-Options%3A%20nosniff]
expected: FAIL

View file

@ -0,0 +1,4 @@
[fetch.tentative.sub.html]
[http->https fetch (cross-scheme => cross-site)]
expected: FAIL

View file

@ -0,0 +1,4 @@
[iframe.tentative.sub.html]
[Secure, cross-site (cross-scheme, same-host) iframe]
expected: FAIL

View file

@ -0,0 +1,4 @@
[traverse_the_history_1.html]
[Multiple history traversals from the same task]
expected: FAIL

View file

@ -0,0 +1,4 @@
[traverse_the_history_5.html]
[Multiple history traversals, last would be aborted]
expected: FAIL

View file

@ -1,5 +1,24 @@
[open-features-negative-innerwidth-innerheight.html]
type: testharness
expected: TIMEOUT
[HTML: window.open `features`: negative values for legacy `innerwidth`, `innerheight`]
expected: FAIL
[features "innerheight=-404.5" should NOT set "height=404"]
expected: TIMEOUT
[features "innerwidth=-404.5" should NOT set "width=404"]
expected: TIMEOUT
[features "innerwidth=-404" should NOT set "width=404"]
expected: TIMEOUT
[features "innerheight=-404e1" should NOT set "height=404"]
expected: TIMEOUT
[features "innerheight=-404" should NOT set "height=404"]
expected: TIMEOUT
[features "innerwidth=-404e1" should NOT set "width=404"]
expected: TIMEOUT

View file

@ -1,5 +1,24 @@
[open-features-negative-screenx-screeny.html]
type: testharness
expected: TIMEOUT
[HTML: window.open `features`: negative values for legacy `screenx`, `screeny`]
expected: FAIL
[features "screenx=-204" should NOT set "left=204"]
expected: TIMEOUT
[features "screeny=-204" should NOT set "top=204"]
expected: TIMEOUT
[features "screeny=-204.5" should NOT set "top=204"]
expected: TIMEOUT
[features "screeny=-0" should NOT set "top=204"]
expected: TIMEOUT
[features "screenx=-0" should NOT set "left=204"]
expected: TIMEOUT
[features "screenx=-204.5" should NOT set "left=204"]
expected: TIMEOUT

View file

@ -1,5 +1,24 @@
[open-features-negative-top-left.html]
type: testharness
expected: TIMEOUT
[HTML: window.open `features`: negative values for `top`, `left`]
expected: FAIL
[features "top=-204" should NOT set "top=204"]
expected: TIMEOUT
[features "top=-204.5" should NOT set "top=204"]
expected: TIMEOUT
[features "left=-204" should NOT set "left=204"]
expected: TIMEOUT
[features "top=-0" should NOT set "top=204"]
expected: TIMEOUT
[features "left=-204.5" should NOT set "left=204"]
expected: TIMEOUT
[features "left=-0" should NOT set "left=204"]
expected: TIMEOUT

View file

@ -1,5 +1,24 @@
[open-features-negative-width-height.html]
type: testharness
expected: TIMEOUT
[HTML: window.open `features`: negative values for `width`, `height`]
expected: FAIL
[features "height=-404" should NOT set "height=404"]
expected: TIMEOUT
[features "height=-404e1" should NOT set "height=404"]
expected: TIMEOUT
[features "height=-404.5" should NOT set "height=404"]
expected: TIMEOUT
[features "width=-404" should NOT set "width=404"]
expected: TIMEOUT
[features "width=-404e1" should NOT set "width=404"]
expected: TIMEOUT
[features "width=-404.5" should NOT set "width=404"]
expected: TIMEOUT

View file

@ -1,32 +1,48 @@
[open-features-non-integer-height.html]
type: testharness
expected: TIMEOUT
[HTML: window.open `features`: non-integer values for feature `height`]
expected: FAIL
[features "height=405*3" should set "height=405"]
expected: FAIL
expected: TIMEOUT
[features "height=405.32" should set "height=405"]
expected: FAIL
expected: TIMEOUT
[features "height=405e1" should set "height=405"]
expected: FAIL
expected: TIMEOUT
[features "height=405/5" should set "height=405"]
expected: FAIL
expected: TIMEOUT
[features "height=405^4" should set "height=405"]
expected: FAIL
expected: TIMEOUT
[features "height=405.5" should set "height=405"]
expected: FAIL
expected: TIMEOUT
[features "height=405e-1" should set "height=405"]
expected: FAIL
expected: TIMEOUT
[features "height=405 " should set "height=405"]
expected: FAIL
expected: TIMEOUT
[features "height=405LLl" should set "height=405"]
expected: FAIL
expected: TIMEOUT
[features "height=/404" should NOT set "height=404"]
expected: TIMEOUT
[top=0,left=0,width=401,: absence of feature "height" should be treated same as "height=0"]
expected: TIMEOUT
[top=0,left=0: absence of feature "height" should be treated same as "height=0"]
expected: TIMEOUT
[features "height=_404" should NOT set "height=404"]
expected: TIMEOUT
[features "height=L404" should NOT set "height=404"]
expected: TIMEOUT

View file

@ -1,32 +1,42 @@
[open-features-non-integer-innerheight.html]
type: testharness
expected: TIMEOUT
[HTML: window.open `features`: non-integer values for legacy feature `innerheight`]
expected: FAIL
[features "innerheight=405e-1" should set "height=405"]
expected: FAIL
expected: TIMEOUT
[features "innerheight=405LLl" should set "height=405"]
expected: FAIL
expected: TIMEOUT
[features "innerheight=405^4" should set "height=405"]
expected: FAIL
expected: TIMEOUT
[features "innerheight=405e1" should set "height=405"]
expected: FAIL
expected: TIMEOUT
[features "innerheight=405 " should set "height=405"]
expected: FAIL
expected: TIMEOUT
[features "innerheight=405/5" should set "height=405"]
expected: FAIL
expected: TIMEOUT
[features "innerheight=405.32" should set "height=405"]
expected: FAIL
expected: TIMEOUT
[features "innerheight=405.5" should set "height=405"]
expected: FAIL
expected: TIMEOUT
[features "innerheight=405*3" should set "height=405"]
expected: FAIL
expected: TIMEOUT
[features "innerheight=_404" should NOT set "height=404"]
expected: TIMEOUT
[features "innerheight=L404" should NOT set "height=404"]
expected: TIMEOUT
[features "innerheight=/404" should NOT set "height=404"]
expected: TIMEOUT

View file

@ -1,32 +1,42 @@
[open-features-non-integer-innerwidth.html]
type: testharness
expected: TIMEOUT
[HTML: window.open `features`: non-integer values for legacy feature `innerwidth`]
expected: FAIL
[features "innerwidth=405e-1" should set "width=405"]
expected: FAIL
expected: TIMEOUT
[features "innerwidth=405*3" should set "width=405"]
expected: FAIL
expected: TIMEOUT
[features "innerwidth=405.5" should set "width=405"]
expected: FAIL
expected: TIMEOUT
[features "innerwidth=405e1" should set "width=405"]
expected: FAIL
expected: TIMEOUT
[features "innerwidth=405.32" should set "width=405"]
expected: FAIL
expected: TIMEOUT
[features "innerwidth=405 " should set "width=405"]
expected: FAIL
expected: TIMEOUT
[features "innerwidth=405LLl" should set "width=405"]
expected: FAIL
expected: TIMEOUT
[features "innerwidth=405/5" should set "width=405"]
expected: FAIL
expected: TIMEOUT
[features "innerwidth=405^4" should set "width=405"]
expected: FAIL
expected: TIMEOUT
[features "innerwidth=/404" should NOT set "width=404"]
expected: TIMEOUT
[features "innerwidth=_404" should NOT set "width=404"]
expected: TIMEOUT
[features "innerwidth=L404" should NOT set "width=404"]
expected: TIMEOUT

View file

@ -1,32 +1,42 @@
[open-features-non-integer-left.html]
type: testharness
expected: TIMEOUT
[HTML: window.open `features`: non-integer values for feature `left`]
expected: FAIL
[features "left=105e1" should set "left=105"]
expected: FAIL
expected: TIMEOUT
[features "left=105 " should set "left=105"]
expected: FAIL
expected: TIMEOUT
[features "left=105/5" should set "left=105"]
expected: FAIL
expected: TIMEOUT
[features "left=105e-1" should set "left=105"]
expected: FAIL
expected: TIMEOUT
[features "left=105^4" should set "left=105"]
expected: FAIL
expected: TIMEOUT
[features "left=105LLl" should set "left=105"]
expected: FAIL
expected: TIMEOUT
[features "left=105.32" should set "left=105"]
expected: FAIL
expected: TIMEOUT
[features "left=105*3" should set "left=105"]
expected: FAIL
expected: TIMEOUT
[features "left=105.5" should set "left=105"]
expected: FAIL
expected: TIMEOUT
[features "left=L104" should NOT set "left=104"]
expected: TIMEOUT
[features "left=/104" should NOT set "left=104"]
expected: TIMEOUT
[features "left=_104" should NOT set "left=104"]
expected: TIMEOUT

View file

@ -1,32 +1,42 @@
[open-features-non-integer-screenx.html]
type: testharness
expected: TIMEOUT
[HTML: window.open `features`: non-integer values for legacy feature `screenx`]
expected: FAIL
[features "screenx=105.5" should set "left=105"]
expected: FAIL
expected: TIMEOUT
[features "screenx=105e1" should set "left=105"]
expected: FAIL
expected: TIMEOUT
[features "screenx=105 " should set "left=105"]
expected: FAIL
expected: TIMEOUT
[features "screenx=105*3" should set "left=105"]
expected: FAIL
expected: TIMEOUT
[features "screenx=105e-1" should set "left=105"]
expected: FAIL
expected: TIMEOUT
[features "screenx=105^4" should set "left=105"]
expected: FAIL
expected: TIMEOUT
[features "screenx=105LLl" should set "left=105"]
expected: FAIL
expected: TIMEOUT
[features "screenx=105/5" should set "left=105"]
expected: FAIL
expected: TIMEOUT
[features "screenx=105.32" should set "left=105"]
expected: FAIL
expected: TIMEOUT
[features "screenx=_104" should NOT set "left=104"]
expected: TIMEOUT
[features "screenx=L104" should NOT set "left=104"]
expected: TIMEOUT
[features "screenx=/104" should NOT set "left=104"]
expected: TIMEOUT

View file

@ -1,32 +1,42 @@
[open-features-non-integer-screeny.html]
type: testharness
expected: TIMEOUT
[HTML: window.open `features`: non-integer values for legacy feature `screeny`]
expected: FAIL
[features "screeny=405^4" should set "height=405"]
expected: FAIL
expected: TIMEOUT
[features "screeny=405e-1" should set "height=405"]
expected: FAIL
expected: TIMEOUT
[features "screeny=405LLl" should set "height=405"]
expected: FAIL
expected: TIMEOUT
[features "screeny=405e1" should set "height=405"]
expected: FAIL
expected: TIMEOUT
[features "screeny=405 " should set "height=405"]
expected: FAIL
expected: TIMEOUT
[features "screeny=405/5" should set "height=405"]
expected: FAIL
expected: TIMEOUT
[features "screeny=405*3" should set "height=405"]
expected: FAIL
expected: TIMEOUT
[features "screeny=405.32" should set "height=405"]
expected: FAIL
expected: TIMEOUT
[features "screeny=405.5" should set "height=405"]
expected: FAIL
expected: TIMEOUT
[features "screeny=_404" should NOT set "height=404"]
expected: TIMEOUT
[features "screeny=L404" should NOT set "height=404"]
expected: TIMEOUT
[features "screeny=/404" should NOT set "height=404"]
expected: TIMEOUT

View file

@ -1,32 +1,42 @@
[open-features-non-integer-top.html]
type: testharness
expected: TIMEOUT
[HTML: window.open `features`: non-integer values for feature `top`]
expected: FAIL
[features "top=105/5" should set "top=105"]
expected: FAIL
expected: TIMEOUT
[features "top=105*3" should set "top=105"]
expected: FAIL
expected: TIMEOUT
[features "top=105LLl" should set "top=105"]
expected: FAIL
expected: TIMEOUT
[features "top=105e-1" should set "top=105"]
expected: FAIL
expected: TIMEOUT
[features "top=105.32" should set "top=105"]
expected: FAIL
expected: TIMEOUT
[features "top=105e1" should set "top=105"]
expected: FAIL
expected: TIMEOUT
[features "top=105 " should set "top=105"]
expected: FAIL
expected: TIMEOUT
[features "top=105^4" should set "top=105"]
expected: FAIL
expected: TIMEOUT
[features "top=105.5" should set "top=105"]
expected: FAIL
expected: TIMEOUT
[features "top=/104" should NOT set "top=104"]
expected: TIMEOUT
[features "top=_104" should NOT set "top=104"]
expected: TIMEOUT
[features "top=L104" should NOT set "top=104"]
expected: TIMEOUT

View file

@ -1,32 +1,48 @@
[open-features-non-integer-width.html]
type: testharness
expected: TIMEOUT
[HTML: window.open `features`: non-integer values for feature `width`]
expected: FAIL
[features "width=405^4" should set "width=405"]
expected: FAIL
expected: TIMEOUT
[features "width=405.5" should set "width=405"]
expected: FAIL
expected: TIMEOUT
[features "width=405e1" should set "width=405"]
expected: FAIL
expected: TIMEOUT
[features "width=405 " should set "width=405"]
expected: FAIL
expected: TIMEOUT
[features "width=405.32" should set "width=405"]
expected: FAIL
expected: TIMEOUT
[features "width=405LLl" should set "width=405"]
expected: FAIL
expected: TIMEOUT
[features "width=405*3" should set "width=405"]
expected: FAIL
expected: TIMEOUT
[features "width=405e-1" should set "width=405"]
expected: FAIL
expected: TIMEOUT
[features "width=405/5" should set "width=405"]
expected: FAIL
expected: TIMEOUT
[top=0,left=0: absence of feature "width" should be treated same as "width=0"]
expected: TIMEOUT
[features "width=_404" should NOT set "width=404"]
expected: TIMEOUT
[top=0,left=0,height=401,: absence of feature "width" should be treated same as "width=0"]
expected: TIMEOUT
[features "width=/404" should NOT set "width=404"]
expected: TIMEOUT
[features "width=L404" should NOT set "width=404"]
expected: TIMEOUT

View file

@ -0,0 +1,4 @@
[a-download-click-redirect-to-javascript.html]
[Do not navigate or execute JS when redirecting a download to 'javascript:..']
expected: FAIL

View file

@ -1,4 +1,5 @@
[promise-rejection-events.html]
expected: TIMEOUT
[delayed handling: delaying handling rejected promise created from createImageBitmap will cause both events to fire]
expected: FAIL
@ -8,3 +9,6 @@
[no unhandledrejection/rejectionhandled: rejection handler attached synchronously to a promise created from createImageBitmap]
expected: FAIL
[rejectionhandled is dispatched from a queued task, and not immediately]
expected: TIMEOUT

View file

@ -0,0 +1,5 @@
[secure-connection-start-reuse.https.html]
expected: TIMEOUT
[Test that secureConnectionStart value is as expected when reused]
expected: NOTRUN

View file

@ -104,3 +104,9 @@
[X Stitched sine-wave buffers at sample rate 43800 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.0038986,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[30\]\t9.4836157560348511e-1\t9.5236867666244507e-1\t4.0071010589599609e-3\t4.2075103446311962e-3\t3.8985999999999999e-3\n\t[31\]\t9.2646563053131104e-1\t9.3139332532882690e-1\t4.9276947975158691e-3\t5.2906700783754857e-3\t3.8985999999999999e-3\n\t[32\]\t9.0087991952896118e-1\t9.0675884485244751e-1\t5.8789253234863281e-3\t6.4834496590358351e-3\t3.8985999999999999e-3\n\t[33\]\t8.7170630693435669e-1\t8.7856203317642212e-1\t6.8557262420654297e-3\t7.8033490899654511e-3\t3.8985999999999999e-3\n\t[34\]\t8.3906102180480957e-1\t8.4691369533538818e-1\t7.8526735305786133e-3\t9.2721059699818163e-3\t3.8985999999999999e-3\n\t...and 31037 more errors.\n\tMax AbsError of 9.8276454210281372e-1 at index of 39267.\n\t[39267\]\t2.5962776047338700e-21\t-9.8276454210281372e-1\t9.8276454210281372e-1\t1.0000000000000000e+0\t3.8985999999999999e-3\n\tMax RelError of 3.3137802965303198e+0 at index of 1253.\n\t[1253\]\t-4.3022233992815018e-2\t-9.9732093513011932e-3\t3.3049024641513824e-2\t3.3137802965303198e+0\t3.8985999999999999e-3\n]
expected: FAIL
[X Stitched sine-wave buffers at sample rate 43800 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.0038986,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[30\]\t9.4836157560348511e-1\t9.5236867666244507e-1\t4.0071010589599609e-3\t4.2075103446311962e-3\t3.8985999999999999e-3\n\t[31\]\t9.2646563053131104e-1\t9.3139332532882690e-1\t4.9276947975158691e-3\t5.2906700783754857e-3\t3.8985999999999999e-3\n\t[32\]\t9.0087991952896118e-1\t9.0675884485244751e-1\t5.8789253234863281e-3\t6.4834496590358351e-3\t3.8985999999999999e-3\n\t[33\]\t8.7170630693435669e-1\t8.7856203317642212e-1\t6.8557262420654297e-3\t7.8033490899654511e-3\t3.8985999999999999e-3\n\t[34\]\t8.3906102180480957e-1\t8.4691369533538818e-1\t7.8526735305786133e-3\t9.2721059699818163e-3\t3.8985999999999999e-3\n\t...and 31037 more errors.\n\tMax AbsError of 1.0236728132501504e+16 at index of 20238.\n\t[20238\]\t-1.0236728132501504e+16\t-4.7574958205223083e-1\t1.0236728132501504e+16\t2.1517051235953900e+16\t3.8985999999999999e-3\n\tMax RelError of 2.1517051235953900e+16 at index of 20238.\n\t[20238\]\t-1.0236728132501504e+16\t-4.7574958205223083e-1\t1.0236728132501504e+16\t2.1517051235953900e+16\t3.8985999999999999e-3\n]
expected: FAIL
[X SNR (-276.77847420751567 dB) is not greater than or equal to 65.737. Got -276.77847420751567.]
expected: FAIL

View file

@ -0,0 +1,4 @@
[events_input_source_recreation.https.html]
[Input sources are re-created when handedness or target ray mode changes]
expected: FAIL

View file

@ -0,0 +1,4 @@
[events_input_sources_change.https.html]
[Transient input sources fire events in the right order]
expected: FAIL

View file

@ -0,0 +1,4 @@
[events_session_select.https.html]
[XRInputSources primary input presses properly fires off the right events]
expected: FAIL

View file

@ -0,0 +1,4 @@
[events_session_select_subframe.https.html]
[Ensures that an XRInputSources primary input being pressed and released in the space of a single frame properly fires off the right events]
expected: FAIL

View file

@ -0,0 +1,4 @@
[getInputPose_handedness.https.html]
[XRInputSources properly communicate their handedness]
expected: FAIL

View file

@ -0,0 +1,4 @@
[getInputPose_pointer.https.html]
[XRInputSources with a target ray mode of 'tracked-pointer' properly communicate their poses]
expected: FAIL

View file

@ -0,0 +1,4 @@
[xrInputSource_add_remove.https.html]
[XRInputSources can be properly added and removed from the session]
expected: FAIL

View file

@ -0,0 +1,4 @@
[xrInputSource_gamepad_disconnect.https.html]
[WebXR InputSource's gamepad gets disconnected when the input source is removed]
expected: FAIL

View file

@ -0,0 +1,4 @@
[xrInputSource_gamepad_input_registered.https.html]
[WebXR InputSource's gamepad properly registers input]
expected: FAIL

View file

@ -0,0 +1,4 @@
[xrReferenceSpace_originOffset.https.html]
[Updating XRReferenceSpace origin offset updates view and input matrices.]
expected: FAIL

View file

@ -0,0 +1,4 @@
[xrReferenceSpace_originOffsetBounded.https.html]
[Updating XRBoundedReferenceSpace origin offset updates view, input matrices, and bounds geometry.]
expected: FAIL

View file

@ -0,0 +1,4 @@
[xrSession_input_events_end.https.html]
[Calling end during an input callback stops processing at the right time]
expected: FAIL

View file

@ -0,0 +1,30 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>CSS Box Alignment Level 3: parsing place-content with invalid values</title>
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-place-content">
<meta name="assert" content="place-content supports only the grammar '<align-content> <justify-content>?'.">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/css/support/parsing-testcommon.js"></script>
</head>
<body>
<script>
test_invalid_value("place-content", "auto");
test_invalid_value("place-content", "self-end unsafe");
test_invalid_value("place-content", "self-start");
test_invalid_value("place-content", "left");
test_invalid_value("place-content", "unsafe right");
test_invalid_value("place-content", "left normal");
test_invalid_value("place-content", "unsafe right stretch");
test_invalid_value("place-content", "normal flex-start baseline");
test_invalid_value("place-content", "first baseline first baseline");
test_invalid_value("place-content", "baseline safe");
</script>
</body>
</html>

View file

@ -0,0 +1,46 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>CSS Box Alignment Level 3: parsing place-content with valid values</title>
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-place-content">
<meta name="assert" content="place-content supports the full grammar '<align-content> <justify-content>?'.">
<meta name="assert" content="<baseline-position> and <baseline-position> start are equivalent.">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/css/support/parsing-testcommon.js"></script>
</head>
<body>
<script>
test_valid_value("place-content", "normal normal", "normal");
test_valid_value("place-content", "first baseline", "baseline start");
test_valid_value("place-content", "baseline", "baseline start");
test_valid_value("place-content", "first baseline start", "baseline start");
test_valid_value("place-content", "last baseline", "last baseline start");
test_valid_value("place-content", "first baseline stretch", "baseline stretch");
test_valid_value("place-content", "last baseline flex-start");
test_valid_value("place-content", "baseline stretch");
test_valid_value("place-content", "space-between");
test_valid_value("place-content", "space-around");
test_valid_value("place-content", "space-evenly");
test_valid_value("place-content", "stretch");
test_valid_value("place-content", "center");
test_valid_value("place-content", "end");
test_valid_value("place-content", "flex-start flex-start", "flex-start");
test_valid_value("place-content", "unsafe end unsafe end", "unsafe end");
test_valid_value("place-content", "safe flex-start");
test_valid_value("place-content", "normal stretch");
test_valid_value("place-content", "baseline space-around");
test_valid_value("place-content", "space-evenly unsafe end");
test_valid_value("place-content", "center normal");
test_valid_value("place-content", "normal right");
test_valid_value("place-content", "baseline unsafe left");
</script>
</body>
</html>

View file

@ -0,0 +1,36 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>CSS Box Alignment Level 3: parsing place-items with invalid values</title>
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-place-items">
<meta name="assert" content="place-items supports only the grammar '<align-items> <justify-items>?'.">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/css/support/parsing-testcommon.js"></script>
</head>
<body>
<script>
test_invalid_value("place-items", "auto");
test_invalid_value("place-items", "space-around");
test_invalid_value("place-items", "space-between");
test_invalid_value("place-items", "space-evenly");
test_invalid_value("place-items", "left");
test_invalid_value("place-items", "unsafe right");
test_invalid_value("place-items", "left baseline");
test_invalid_value("place-items", "unsafe right flex-end");
test_invalid_value("place-items", "legacy center");
test_invalid_value("place-items", "legacy left");
test_invalid_value("place-items", "legacy");
test_invalid_value("place-items", "legacy right flex-start");
test_invalid_value("place-items", "legacy normal");
test_invalid_value("place-items", "normal flex-start baseline");
test_invalid_value("place-items", "baseline safe");
</script>
</body>
</html>

View file

@ -0,0 +1,39 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>CSS Box Alignment Level 3: parsing place-items with valid values</title>
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-place-items">
<meta name="assert" content="place-items supports the full grammar '<align-items> <justify-items>?'.">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/css/support/parsing-testcommon.js"></script>
</head>
<body>
<script>
test_valid_value("place-items", "normal");
test_valid_value("place-items", "stretch stretch", "stretch");
test_valid_value("place-items", "first baseline", "baseline");
test_valid_value("place-items", "last baseline last baseline", "last baseline");
test_valid_value("place-items", "center");
test_valid_value("place-items", "end end", "end");
test_valid_value("place-items", "self-start");
test_valid_value("place-items", "flex-end");
test_valid_value("place-items", "unsafe center unsafe center", "unsafe center");
test_valid_value("place-items", "safe self-end");
test_valid_value("place-items", "stretch baseline");
test_valid_value("place-items", "last baseline center");
test_valid_value("place-items", "safe self-end normal");
test_valid_value("place-items", "normal right");
test_valid_value("place-items", "baseline unsafe left");
test_valid_value("place-items", "flex-end legacy");
test_valid_value("place-items", "stretch legacy left");
test_valid_value("place-items", "first baseline right legacy", "baseline legacy right");
</script>
</body>
</html>

View file

@ -0,0 +1,28 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>CSS Box Alignment Level 3: parsing place-self with invalid values</title>
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-place-self">
<meta name="assert" content="place-self supports only the grammar '<align-self> <justify-self>?'.">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/css/support/parsing-testcommon.js"></script>
</head>
<body>
<script>
test_invalid_value("place-self", "space-around");
test_invalid_value("place-self", "space-between");
test_invalid_value("place-self", "space-evenly");
test_invalid_value("place-self", "right");
test_invalid_value("place-self", "unsafe left");
test_invalid_value("place-self", "right start");
test_invalid_value("place-self", "unsafe left stretch");
test_invalid_value("place-self", "normal flex-start baseline");
test_invalid_value("place-self", "baseline safe");
</script>
</body>
</html>

View file

@ -0,0 +1,36 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>CSS Box Alignment Level 3: parsing place-self with valid values</title>
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-place-self">
<meta name="assert" content="place-self supports the full grammar '<align-self> <justify-self>?'.">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/css/support/parsing-testcommon.js"></script>
</head>
<body>
<script>
test_valid_value("place-self", "auto auto", "auto");
test_valid_value("place-self", "normal");
test_valid_value("place-self", "stretch");
test_valid_value("place-self", "first baseline", "baseline");
test_valid_value("place-self", "last baseline last baseline", "last baseline");
test_valid_value("place-self", "center center", "center");
test_valid_value("place-self", "start");
test_valid_value("place-self", "self-start");
test_valid_value("place-self", "flex-end");
test_valid_value("place-self", "unsafe center");
test_valid_value("place-self", "safe self-end safe self-end", "safe self-end");
test_valid_value("place-self", "auto last baseline");
test_valid_value("place-self", "baseline flex-end");
test_valid_value("place-self", "unsafe center stretch");
test_valid_value("place-self", "normal right");
test_valid_value("place-self", "baseline unsafe left");
</script>
</body>
</html>

View file

@ -1,6 +1,6 @@
<!DOCTYPE HTML>
<meta charset=utf-8>
<title>Element Timing: observe cross-origin images but without startTime</title>
<title>Element Timing: observe cross-origin images but without renderTime</title>
<body>
<style>
body {
@ -23,8 +23,8 @@ body {
assert_equals(entryList.getEntries().length, 1);
const entry = entryList.getEntries()[0];
checkElement(entry, pathname, 'my_image', 'the_id', 0, img);
assert_equals(entry.startTime, 0,
'The startTime of a cross-origin image should be 0.');
assert_equals(entry.renderTime, 0,
'The renderTime of a cross-origin image should be 0.');
checkRect(entry, [0, 100, 0, 100]);
checkNaturalSize(entry, 100, 100);
})

View file

@ -39,7 +39,7 @@
if (valid_tao.includes(tao)) {
checkElement(entry, remote_img + tao, tao, 'id_' + tao, beforeRender, img);
} else if (invalid_tao.includes(tao)) {
assert_equals(entry.startTime, 0, 'Entry with tao=' + tao + ' must have a startTime of 0');
assert_equals(entry.renderTime, 0, 'Entry with tao=' + tao + ' must have a renderTime of 0');
checkElement(entry, remote_img + tao, tao, 'id_' + tao, 0, img);
}
else {
@ -51,6 +51,6 @@
});
})
).observe({type: 'element', buffered: true});
}, 'Cross-origin elements with valid TAO have correct startTime, with invalid TAO have startTime set to 0.');
}, 'Cross-origin elements with valid TAO have correct renderTime, with invalid TAO have renderTime set to 0.');
</script>
</body>

View file

@ -0,0 +1,48 @@
<!DOCTYPE HTML>
<meta charset=utf-8>
<title>Element Timing: src change triggers new entry</title>
<body>
<style>
body {
margin: 0;
}
</style>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/element-timing-helpers.js"></script>
<img src='resources/square100.png' elementtiming='my_image' id='my_id'/>
<script>
async_test(function (t) {
if (!window.PerformanceElementTiming) {
assert_unreached("PerformanceElementTiming is not implemented");
}
let beforeRender = performance.now();
const img = document.getElementById('my_id');
let firstCallback = true;
const observer = new PerformanceObserver(
t.step_func(entryList => {
assert_equals(entryList.getEntries().length, 1);
const entry = entryList.getEntries()[0];
if (firstCallback) {
const pathname = window.location.origin + '/element-timing/resources/square100.png';
checkElement(entry, pathname, 'my_image', 'my_id', beforeRender, img);
checkRect(entry, [0, 100, 0, 100]);
checkNaturalSize(entry, 100, 100);
// Set the src to trigger another entry.
img.src = '/images/black-rectangle.png';
beforeRender = performance.now();
firstCallback = false;
return;
}
const pathname = window.location.origin + '/images/black-rectangle.png';
checkElement(entry, pathname, 'my_image', 'my_id', beforeRender, img);
checkRect(entry, [0, 100, 0, 50]);
checkNaturalSize(entry, 100, 50);
t.done();
}));
observer.observe({type: 'element', buffered: true});
}, 'Element Timing: changing src causes a new entry to be dispatched.');
</script>
</body>

View file

@ -4,16 +4,17 @@ function checkElementInternal(entry, expectedUrl, expectedIdentifier, expectedID
assert_equals(entry.entryType, 'element');
assert_equals(entry.url, expectedUrl);
assert_equals(entry.identifier, expectedIdentifier);
assert_equals(entry.startTime, 0);
assert_equals(entry.duration, 0);
assert_equals(entry.id, expectedID);
assert_greater_than_equal(entry.startTime, beforeRender);
assert_greater_than_equal(performance.now(), entry.startTime);
assert_greater_than_equal(entry.renderTime, beforeRender);
assert_greater_than_equal(performance.now(), entry.renderTime);
if (expectedElement !== null)
assert_equals(entry.element, expectedElement);
}
// Checks that this is an ElementTiming entry with url |expectedUrl|. It also
// does a very basic check on |startTime|: after |beforeRender| and before now().
// does a very basic check on |renderTime|: after |beforeRender| and before now().
function checkElement(entry, expectedUrl, expectedIdentifier, expectedID, beforeRender,
expectedElement) {
checkElementInternal(entry, expectedUrl, expectedIdentifier, expectedID, beforeRender,

View file

@ -0,0 +1,45 @@
<!DOCTYPE html>
<html>
<meta charset=utf-8 />
<title>Event Timing: PerformanceObserver sees entries with buffered flag</title>
<button id='button'>Generate a 'click' event</button>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src=/resources/testdriver.js></script>
<script src=/resources/testdriver-vendor.js></script>
<script src=resources/event-timing-test-utils.js></script>
<script>
let firstInputSeen = false;
let eventSeen = false;
async_test(t => {
const validateEntry = t.step_func(entry => {
if (entry.entryType === 'first-input')
firstInputSeen = true;
else if (entry.entryType === 'event')
eventSeen = true;
else
assert_unreached('Should only observe Event Timing entries!');
});
// First observer creates second in callback to ensure the entry has been dispatched by the time
// the second observer begins observing.
new PerformanceObserver((list, obs) => {
list.getEntries().forEach(validateEntry);
if (!firstInputSeen || !eventSeen)
return;
obs.disconnect();
firstInputSeen = false;
eventSeen = false;
// Second observer requires 'buffered: true' to see entries.
const bufferedObserver = new PerformanceObserver(entryList => {
entryList.getEntries().forEach(validateEntry);
if (firstInputSeen && eventSeen)
t.done();
});
bufferedObserver.observe({type: "event", buffered: true});
bufferedObserver.observe({type: 'first-input', buffered: true});
}).observe({entryTypes: ['event', 'first-input']});
clickAndBlockMain('button');
}, "PerformanceObserver with buffered flag sees previous Event Timing entries");
</script>
</html>

View file

@ -0,0 +1,37 @@
<!DOCTYPE html>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src=/fetch/sec-metadata/resources/helper.js></script>
<script>
// http -> https should see `Sec-Fetch-Site: cross-site`.
// This is a regression test for
// https://github.com/w3c/webappsec-fetch-metadata/issues/34
promise_test(t => {
assert_equals(location.protocol, "http:");
return fetch("https://{{host}}:{{ports[https][0]}}/fetch/sec-metadata/resources/echo-as-json.py")
.then(r => r.json())
.then(j => {
assert_header_equals(j, {
"dest": "empty",
"site": "cross-site",
"user": "",
"mode": "cors",
});
});
}, "http->https fetch (cross-scheme => cross-site)");
// http -> http should see no `Sec-Fetch-Site`.
promise_test(t => {
assert_equals(location.protocol, "http:");
return fetch("resources/echo-as-json.py")
.then(r => r.json())
.then(j => {
assert_header_equals(j, {
"dest": "",
"site": "",
"user": "",
"mode": "",
});
});
}, "http->http fetch (non-trustworthy destination => no sec-metadata)");
</script>

View file

@ -60,4 +60,23 @@
document.body.appendChild(i);
}, "Non-secure cross-site iframe => No headers.");
async_test(t => {
let i = document.createElement('iframe');
i.src = "https://{{host}}:{{ports[https][0]}}/fetch/sec-metadata/resources/post-to-owner.py";
window.addEventListener('message', t.step_func(e => {
if (e.source != i.contentWindow)
return;
assert_header_equals(e.data, {
"dest": "nested-document",
"site": "cross-site",
"user": "",
"mode": "nested-navigate",
});
t.done();
}));
document.body.appendChild(i);
}, "Secure, cross-site (cross-scheme, same-host) iframe");
</script>

View file

@ -19,7 +19,7 @@
<div id="fontTest">Downgraded then upgraded font</div>
<script>
let nonce = token();
let expected = { "dest": "", "site": "same-site", "user": "", "mode": "" };
let expected = { "dest": "", "site": "cross-site", "user": "", "mode": "" };
// Validate various scenarios handle a request that redirects from https => http
// correctly and avoids disclosure of any Sec- headers.
@ -52,7 +52,7 @@
// Note that we're using `undefined` here, as opposed to "" elsewhere because of the way
// that `image.py` encodes data.
"dest": undefined,
"site": "same-site",
"site": "cross-site",
"user": undefined,
"mode": undefined,
});

View file

@ -19,7 +19,7 @@
<div id="fontTest">Upgraded font</div>
<script>
let nonce = token();
let expected = { "dest": "", "site": "same-site", "user": "", "mode": "" };
let expected = { "dest": "", "site": "cross-site", "user": "", "mode": "" };
// Validate various scenarios handle a request that redirects from http => https correctly and add the proper Sec- headers.
RunCommonRedirectTests("Http upgrade", upgradeRedirectTo, expected);
@ -51,7 +51,7 @@
// Note that we're using `undefined` here, as opposed to "" elsewhere because of the way
// that `image.py` encodes data.
"dest": undefined,
"site": "same-site",
"site": "cross-site",
"user": undefined,
"mode": undefined,
});

View file

@ -0,0 +1,29 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>Clicking on an &lt;a> element with a download attribute and href that redirects to 'javascript:' should not navigate or execute</title>
<link rel="help" href="https://html.spec.whatwg.org/multipage/#the-a-element:activation-behaviour">
<link rel="help" href="https://html.spec.whatwg.org/multipage/links.html#attr-hyperlink-download">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<body>
<script>
"use strict";
async_test(t => {
const errorFrame = document.createElement("iframe");
errorFrame.addEventListener("load", t.step_func(function () {
assert_false(errorFrame.contentWindow.executed);
errorFrame.contentWindow.addEventListener(
"beforeunload", t.unreached_func("Page should not navigate."));
errorFrame.contentDocument.querySelector("#error-url").click();
t.step_timeout(_ => {
assert_false(errorFrame.contentWindow.executed, "Redirecting to javascript: was suppressed.");
t.done();
}, 1000);
}));
errorFrame.src = "resources/a-download-redirect-to-javascript.html";
document.body.appendChild(errorFrame);
}, "Do not navigate or execute JS when redirecting a download to 'javascript:..'");
</script>
</body>

View file

@ -0,0 +1,5 @@
<!doctype html>
<script>
window.executed = false;
</script>
<a id="error-url" href="/common/redirect.py?location=javascript:window.executed=true" download="html.html">Click me</a>

View file

@ -11,7 +11,6 @@ interface SpeechRecognition : EventTarget {
attribute boolean continuous;
attribute boolean interimResults;
attribute unsigned long maxAlternatives;
attribute DOMString serviceURI;
// methods to drive the speech interaction
void start();

View file

@ -1,25 +0,0 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>KV Storage: should not work in non-secure contexts when included via a script element</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
"use strict";
setup({ allow_uncaught_exception: true });
test(() => {
assert_false(self.isSecureContext, "This test must run in a non-secure context");
}, "Prerequisite check");
async_test(t => {
self.addEventListener("error", t.step_func_done(errorEvent => {
assert_equals(errorEvent.error.constructor, DOMException, "Must trigger a DOMException");
assert_equals(errorEvent.error.name, "SecurityError",
"The DOMException must be a \"SecurityError\"");
}, { once: true }));
});
</script>
<script type="module" src="std:kv-storage"></script>

View file

@ -0,0 +1,5 @@
# KV Storage `[SecureContext]` tests
These tests ensure that KV Storage follows the rules for `[SecureContext]` modules. (As of the time of this writing, they are only proposed rules, in [heycam/webidl#675](https://github.com/heycam/webidl/pull/675).)
Eventually these should probably be generalized and tested as part of `idlharness.js`.

View file

@ -13,6 +13,6 @@ test(() => {
}, "Prerequisite check");
promise_test(t => {
return promise_rejects(t, "SecurityError", import("std:kv-storage"));
return promise_rejects(t, new TypeError(), import("std:kv-storage"));
});
</script>

View file

@ -0,0 +1,31 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>KV Storage: in non-secure contexts, import map mappings should fall back</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
"use strict";
test(() => {
assert_false(self.isSecureContext, "This test must run in a non-secure context");
}, "Prerequisite check");
</script>
<script type="importmap">
{
"imports": {
"std:kv-storage": [
"std:kv-storage",
"./resources/dummy-module.js"
]
}
}
</script>
<script type="module">
promise_test(async () => {
const result = await import("std:kv-storage");
assert_equals(namespaceObj.myExport, "not the real KV storage");
});
</script>

View file

@ -15,9 +15,7 @@ test(() => {
async_test(t => {
window.addEventListener("error", t.step_func_done(errorEvent => {
assert_equals(errorEvent.error.constructor, DOMException, "Must trigger a DOMException");
assert_equals(errorEvent.error.name, "SecurityError",
"The DOMException must be a \"SecurityError\"");
assert_equals(errorEvent.error.constructor, TypeError, "Must trigger a TypeError");
}, { once: true }));
});
</script>

View file

@ -0,0 +1 @@
export const myExport = "not the real KV storage";

View file

@ -0,0 +1 @@
window.sideEffectsHappened = true;

View file

@ -0,0 +1,21 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>KV Storage: should not work in non-secure contexts when included via a script element</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
"use strict";
test(() => {
assert_false(self.isSecureContext, "This test must run in a non-secure context");
}, "Prerequisite check");
window.t = async_test("Check the events");
</script>
<script type="module"
src="std:kv-storage"
onload="t.step(() => { assert_unreached('load event fired'); })"
onerror="t.done()">
</script>

View file

@ -0,0 +1,28 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>KV Storage: should fail in non-secure contexts in the fetching phase, not evaluation phase</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
"use strict";
setup({ allow_uncaught_exception: true });
window.sideEffectsHappened = false;
test(() => {
assert_false(self.isSecureContext, "This test must run in a non-secure context");
}, "Prerequisite check");
</script>
<script type="module">
import "./resources/test-side-effects.js";
import "std:kv-storage";
</script>
<script type="module">
test(() => {
assert_false(window.sideEffectsHappened, "The side effects module didn't evaluate either");
});
</script>

View file

@ -1,6 +1,6 @@
<!DOCTYPE HTML>
<meta charset=utf-8>
<title>Largest Contentful Paint: observe cross-origin images but without startTime.</title>
<title>Largest Contentful Paint: observe cross-origin images but without renderTime.</title>
<body>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
@ -14,7 +14,8 @@
assert_equals(entryList.getEntries().length, 1);
const entry = entryList.getEntries()[0];
assert_equals(entry.entryType, 'largest-contentful-paint');
assert_equals(entry.startTime, 0, 'The startTime value should be 0 for a cross origin image.');
assert_equals(entry.renderTime, 0, 'The renderTime value should be 0 for a cross origin image.');
assert_equals(entry.startTime, 0);
assert_equals(entry.duration, 0);
// blue.png is 133 x 106.
assert_equals(entry.size, 14098);
@ -27,7 +28,7 @@
})
);
observer.observe({type: 'largest-contentful-paint', buffered: true});
}, 'Cross-origin image is observable, with startTime equal to 0.');
}, 'Cross-origin image is observable, with renderTime equal to 0.');
</script>
<img src='http://{{domains[www]}}:{{ports[http][1]}}/images/blue.png' id='image_id'/>

View file

@ -0,0 +1,50 @@
<!DOCTYPE HTML>
<meta charset=utf-8>
<title>Largest Contentful Paint: src change triggers new entry.</title>
<body>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<img src='/images/blue.png' id='image_id'/>
<script>
async_test(function (t) {
if (!window.LargestContentfulPaint) {
assert_unreached("LargestContentfulPaint is not implemented");
}
let beforeRender = performance.now();
let firstCallback = true;
const observer = new PerformanceObserver(
t.step_func_done(function(entryList) {
assert_equals(entryList.getEntries().length, 1);
const entry = entryList.getEntries()[0];
assert_equals(entry.entryType, 'largest-contentful-paint');
assert_greater_than_equal(entry.renderTime, beforeRender,
'The rendering timestamp should occur after script starts running.');
assert_greater_than_equal(performance.now(), entry.renderTime,
'The rendering timestamp should occur before the entry is dispatched to the observer.');
assert_equals(entry.startTime, 0);
assert_equals(entry.duration, 0);
if (firstCallback) {
// blue.png is 133 x 106.
assert_equals(entry.size, 14098);
assert_equals(entry.id, 'image_id');
const pathname = window.location.origin + '/images/blue.png';
assert_equals(entry.url, pathname);
// Set the src to trigger another entry.
const img = document.getElementById('image_id');
img.src = '/images/black-rectangle.png';
beforeRender = performance.now();
firstCallback =false;
return;
}
// black-rectangle.png is 100 x 50.
assert_equals(entry.size, 5000);
assert_equals(entry.id, 'image_id');
const pathname = window.location.origin + '/images/black-rectangle.png';
assert_equals(entry.url, pathname);
})
);
observer.observe({type: 'largest-contentful-paint', buffered: true});
}, 'Largest Contentful Paint: changing src causes a new entry to be dispatched.');
</script>
</body>

View file

@ -15,10 +15,11 @@
assert_equals(entryList.getEntries().length, 1);
const entry = entryList.getEntries()[0];
assert_equals(entry.entryType, 'largest-contentful-paint');
assert_greater_than_equal(entry.startTime, beforeRender,
assert_greater_than_equal(entry.renderTime, beforeRender,
'The rendering timestamp should occur after script starts running.');
assert_greater_than_equal(performance.now(), entry.startTime,
assert_greater_than_equal(performance.now(), entry.renderTime,
'The rendering timestamp should occur before the entry is dispatched to the observer.');
assert_equals(entry.startTime, 0);
assert_equals(entry.duration, 0);
// blue.png is 133 x 106.
assert_equals(entry.size, 14098);

View file

@ -20,8 +20,9 @@ p {
assert_equals(entryList.getEntries().length, 1);
const entry = entryList.getEntries()[0];
assert_equals(entry.entryType, 'largest-contentful-paint');
assert_greater_than_equal(entry.startTime, beforeRender);
assert_greater_than_equal(performance.now(), entry.startTime);
assert_greater_than_equal(entry.renderTime, beforeRender);
assert_greater_than_equal(performance.now(), entry.renderTime);
assert_equals(entry.startTime, 0);
assert_equals(entry.duration, 0);
// Some lower bound: height of at least 12 px.
// Width of at least 100 px.

View file

@ -0,0 +1,32 @@
<!DOCTYPE HTML>
<meta charset=utf-8>
<title>Layout Instability: PerformanceObserver sees entries with buffered flag</title>
<body>
<style>
#myDiv { position: relative; width: 300px; height: 100px; }
</style>
<div id='myDiv'></div>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
async_test(t => {
const startTime = performance.now();
// First observer creates second in callback to ensure the entry has been dispatched by the time
// the second observer begins observing.
new PerformanceObserver(() => {
const endTime = performance.now();
// Second observer requires 'buffered: true' to see entries.
new PerformanceObserver(t.step_func_done(list => {
assert_equals(list.getEntries().length, 1);
const entry = list.getEntries()[0];
assert_equals(entry.entryType, "layout-shift");
assert_greater_than_equal(entry.startTime, startTime)
assert_less_than_equal(entry.startTime, endTime)
assert_equals(entry.duration, 0.0);
})).observe({'type': 'layout-shift', buffered: true});
}).observe({type: 'layout-shift'});
// Modify the position of the div to cause a layout-shift entry.
document.getElementById('myDiv').style = "top: 60px";
}, 'PerformanceObserver with buffered flag sees previous layout-shift entry.');
</script>
</body>

View file

@ -0,0 +1,89 @@
<!DOCTYPE html>
<!-- Copyright © 2019 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
<html>
<head>
<title>Exercise implicit changeType for supported test types, using mime types WITH and WITHOUT codecs for addSourceBuffer.</title>
<meta name="timeout" content="long">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="mediasource-util.js"></script>
<script src="mediasource-changetype-util.js"></script>
</head>
<body>
<div id="log"></div>
<script>
// Helper that generates implicit codec switching tests for a pair of media
// types, with full codecs in the original addSourceBuffer calls, and
// separately without full codecs parameters in the original addSourceBuffer
// calls.
function generateTestsForMediaPair(type1, type2) {
// Implicit changeType across bytestream formats is not expected to be
// supported, so skip those tests' generation.
if (type1.mime_subtype != type2.mime_subtype)
return;
assert_equals(type1.is_video, type2.is_video,
"Types must both be audio or both be video");
test_description_prefix = "Test " + (type1.is_video ? "video" : "audio") +
"-only implicit changeType for " + type1.type + " <-> " + type2.type;
mediaSourceChangeTypeTest(
type1, type2,
test_description_prefix,
{ implicit_changetype: true } );
// Skip test generation if the relaxed types are already fully specified and
// tested, above.
if (type1.type == type1.relaxed_type &&
type2.type == type2.relaxed_type) {
return;
}
mediaSourceChangeTypeTest(
type1, type2,
test_description_prefix +
" (using types without codecs parameters for addSourceBuffer)",
{ use_relaxed_mime_types: true, implicit_changetype: true } );
}
function generateImplicitChangeTypeTests(audio_types, video_types) {
async_test((test) => {
// Require at least 1 pair of different audio-only or video-only test media
// files sharing same bytestream format.
assert_true(audio_types.length > 1 || video_types.length > 1,
"Browser doesn't support enough test media");
// Count the number of unique bytestream formats used in each of audio_types
// and video_types.
let audio_formats = new Set(Array.from(audio_types, t => t.mime_subtype));
let video_formats = new Set(Array.from(video_types, t => t.mime_subtype));
assert_true(audio_types.length > audio_formats.size ||
video_types.length > video_formats.size,
"Browser doesn't support at least 2 audio-only or 2 video-only test " +
"media with same bytestream format");
test.done();
}, "Check if browser supports enough test media types and pairs of " +
"audio-only or video-only media with same bytestream format");
// Generate audio-only tests
for (let audio1 of audio_types) {
for (let audio2 of audio_types) {
generateTestsForMediaPair(audio1, audio2);
}
}
// Generate video-only tests
for (let video1 of video_types) {
for (let video2 of video_types) {
generateTestsForMediaPair(video1, video2);
}
}
}
findSupportedChangeTypeTestTypes(generateImplicitChangeTypeTests);
</script>
</body>
</html>

View file

@ -0,0 +1,122 @@
<!DOCTYPE html>
<!-- Copyright © 2019 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
<html>
<head>
<title>Exercise scenarios expected to fail for changeType for supported test types, using mime types WITH and WITHOUT codecs.</title>
<meta name="timeout" content="long">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="mediasource-util.js"></script>
<script src="mediasource-changetype-util.js"></script>
</head>
<body>
<div id="log"></div>
<script>
function generateNegativeChangeTypeTests(audio_types, video_types) {
async_test((test) => {
assert_true(audio_types.length > 0 && video_types.length > 0,
"Browser doesn't support at least one audio and one video test media for audio<->video changeType negative tests");
let audio_formats = new Set(Array.from(audio_types, t => t.mime_subtype));
let video_formats = new Set(Array.from(video_types, t => t.mime_subtype));
let has_intersected_av_format = false;
for (let elem of audio_formats) {
if (video_formats.has(elem))
has_intersected_av_format = true;
}
assert_true(has_intersected_av_format,
"Browser doesn't support at least 1 audio-only and 1 video-only test media with same bytestream formats");
test.done();
}, "Check if browser supports enough test media types across audio and video for changeType negative tests");
// Generate audio<->video changeType tests that should not succeed in
// reaching successful end of playback because the class of media (audio or
// video) must remain the same across either an implicit or explicit
// changeType.
for (let audio_type of audio_types) {
for (let video_type of video_types) {
// For implicit changeType negative tests, only pairs of test media files
// using the same bytestream format are used, because it is not
// guaranteed that all implementations can be expected to reliably detect
// an implicit switch of bytestream format (for example, MP3 parsers
// might skip invalid input bytes without issuing error.)
let do_implicit_changetype = (audio_type.mime_subtype ==
video_type.mime_subtype);
mediaSourceChangeTypeTest(
audio_type, video_type,
"Negative test audio<->video changeType for " +
audio_type.type + " <-> " + video_type.type,
{ negative_test: true } );
mediaSourceChangeTypeTest(
video_type, audio_type,
"Negative test video<->audio changeType for " +
video_type.type + " <-> " + audio_type.type,
{ negative_test: true } );
if (do_implicit_changetype) {
mediaSourceChangeTypeTest(
audio_type, video_type,
"Negative test audio<->video implicit changeType for " +
audio_type.type + " <-> " + video_type.type,
{ implicit_changetype: true, negative_test: true } );
mediaSourceChangeTypeTest(
video_type, audio_type,
"Negative test video<->audio implicit changeType for " +
video_type.type + " <-> " + audio_type.type,
{ implicit_changetype: true, negative_test: true } );
}
// Skip tests where the relaxed type is already fully specified and
// tested, above.
if (audio_type.type == audio_type.relaxed_type &&
video_type.type == video_type.relaxed_type) {
continue;
}
mediaSourceChangeTypeTest(
audio_type, video_type,
"Negative test audio<->video changeType for " +
audio_type.type + " <-> " + video_type.type +
" (using types without codecs parameters)",
{ use_relaxed_mime_types: true, negative_test: true } );
mediaSourceChangeTypeTest(
video_type, audio_type,
"Negative test video<->audio changeType for " +
video_type.type + " <-> " + audio_type.type +
" (using types without codecs parameters)",
{ use_relaxed_mime_types: true, negative_test: true } );
if (do_implicit_changetype) {
mediaSourceChangeTypeTest(
audio_type, video_type,
"Negative test audio<->video implicit changeType for " +
audio_type.type + " <-> " + video_type.type +
" (without codecs parameters for addSourceBuffer)",
{ use_relaxed_mime_types: true,
implicit_changetype: true,
negative_test: true
} );
mediaSourceChangeTypeTest(
video_type, audio_type,
"Negative test video<->audio implicit changeType for " +
video_type.type + " <-> " + audio_type.type +
" (without codecs parameters for addSourceBuffer)",
{ use_relaxed_mime_types: true,
implicit_changetype: true,
negative_test: true
} );
}
}
}
}
findSupportedChangeTypeTestTypes(generateNegativeChangeTypeTests);
</script>
</body>
</html>

View file

@ -0,0 +1,52 @@
<!DOCTYPE html>
<!-- Copyright © 2019 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
<html>
<head>
<title>Exercise changeType for supported test types, using mime types WITHOUT codecs for addSourceBuffer and changeType.</title>
<meta name="timeout" content="long">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="mediasource-util.js"></script>
<script src="mediasource-changetype-util.js"></script>
</head>
<body>
<div id="log"></div>
<script>
function generateChangeTypeTests(audio_types, video_types) {
async_test((test) => {
assert_true(audio_types.length > 1, "Browser doesn't support at least 2 types of audio test media");
assert_true(video_types.length > 1, "Browser doesn't support at least 2 types of video test media");
test.done();
}, "Check if browser supports enough test media types");
// Generate audio-only changeType tests
for (let audio1 of audio_types) {
for (let audio2 of audio_types) {
mediaSourceChangeTypeTest(
audio1, audio2,
"Test audio-only changeType for " +
audio1.type + " <-> " + audio2.type +
" (using types without codecs parameters)",
{ use_relaxed_mime_types: true } );
}
}
// Generate video-only changeType tests
for (let video1 of video_types) {
for (let video2 of video_types) {
mediaSourceChangeTypeTest(
video1, video2,
"Test video-only changeType for " +
video1.type + " <-> " + video2.type +
" (using types without codecs parameters)",
{ use_relaxed_mime_types: true });
}
}
}
findSupportedChangeTypeTestTypes(generateChangeTypeTests);
</script>
</body>
</html>

View file

@ -2,7 +2,7 @@
<!-- Copyright © 2018 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
<html>
<head>
<title>Exercise changeType for supported test types.</title>
<title>Exercise changeType for supported test types, using mime types WITH codecs (if applicable) for addSourceBuffer and changeType.</title>
<meta name="timeout" content="long">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
@ -23,14 +23,20 @@ function generateChangeTypeTests(audio_types, video_types) {
// Generate audio-only changeType tests
for (let audio1 of audio_types) {
for (let audio2 of audio_types) {
mediaSourceChangeTypeTest(audio1, audio2, "Test audio-only changeType for " + audio1.type + " <-> " + audio2.type);
mediaSourceChangeTypeTest(
audio1, audio2,
"Test audio-only changeType for " +
audio1.type + " <-> " + audio2.type);
}
}
// Generate video-only changeType tests
for (let video1 of video_types) {
for (let video2 of video_types) {
mediaSourceChangeTypeTest(video1, video2, "Test video-only changeType for " + video1.type + " <-> " + video2.type);
mediaSourceChangeTypeTest(
video1, video2,
"Test video-only changeType for " +
video1.type + " <-> " + video2.type);
}
}
}

View file

@ -1,9 +1,38 @@
// Copyright © 2018 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang).
function findSupportedChangeTypeTestTypes(cb) {
// Changetype test media metadata.
// type: fully specified mime type (and codecs substring if the bytestream
// format does not forbid codecs parameter). This is required for use with
// isTypeSupported, and if supported, should work with both addSourceBuffer
// and changeType (unless implementation has restrictions).
//
// relaxed_type: possibly ambiguous mime type/subtype without any codecs
// substring. This is the same as type minus any codecs substring.
//
// mime_subtype: the subtype of the mime type in type and relaxed_type. Across
// types registered in the bytestream format registry
// (https://www.w3.org/TR/mse-byte-stream-format-registry/), this is
// currently sufficient to describe uniquely which test media share the same
// bytestream format for use in implicit changeType testing.
//
// is_video: All test media currently is single track. This describes whether
// or not the track is video.
//
// url: Relative location of the test media file.
//
// The next two items enable more reliable test media splicing test logic that
// prevents buffered range gaps at the splice points.
// start_time: Some test media begins at a time later than 0.0 seconds. This
// is the start time of the media.
// keyframe_interval: Some test media contains out-of-order PTS versus DTS
// coded frames. In those cases, a constant keyframe_interval is needed to
// prevent severely truncating out-of-order GOPs at splice points.
let CHANGE_TYPE_MEDIA_LIST = [
{
type: 'video/webm; codecs="vp8"',
relaxed_type: 'video/webm',
mime_subtype: 'webm',
is_video: true,
url: 'webm/test-v-128k-320x240-24fps-8kfr.webm',
start_time: 0.0
@ -12,6 +41,8 @@ function findSupportedChangeTypeTestTypes(cb) {
},
{
type: 'video/webm; codecs="vp9"',
relaxed_type: 'video/webm',
mime_subtype: 'webm',
is_video: true,
url: 'webm/test-vp9.webm',
start_time: 0.0
@ -20,6 +51,8 @@ function findSupportedChangeTypeTestTypes(cb) {
},
{
type: 'video/mp4; codecs="avc1.4D4001"',
relaxed_type: 'video/mp4',
mime_subtype: 'mp4',
is_video: true,
url: 'mp4/test-v-128k-320x240-24fps-8kfr.mp4',
start_time: 0.083333,
@ -27,6 +60,8 @@ function findSupportedChangeTypeTestTypes(cb) {
},
{
type: 'audio/webm; codecs="vorbis"',
relaxed_type: 'audio/webm',
mime_subtype: 'webm',
is_video: false,
url: 'webm/test-a-128k-44100Hz-1ch.webm',
start_time: 0.0
@ -36,6 +71,8 @@ function findSupportedChangeTypeTestTypes(cb) {
},
{
type: 'audio/mp4; codecs="mp4a.40.2"',
relaxed_type: 'audio/mp4',
mime_subtype: 'mp4',
is_video: false,
url: 'mp4/test-a-128k-44100Hz-1ch.mp4',
start_time: 0.0
@ -45,6 +82,8 @@ function findSupportedChangeTypeTestTypes(cb) {
},
{
type: 'audio/mpeg',
relaxed_type: 'audio/mpeg',
mime_subtype: 'mpeg',
is_video: false,
url: 'mp3/sound_5.mp3',
start_time: 0.0
@ -77,21 +116,26 @@ function appendBuffer(test, sourceBuffer, data) {
sourceBuffer.appendBuffer(data);
}
function trimBuffered(test, mediaElement, sourceBuffer, minimumPreviousDuration, newDuration) {
function trimBuffered(test, mediaElement, sourceBuffer, minimumPreviousDuration, newDuration, skip_duration_prechecks) {
if (!skip_duration_prechecks) {
assert_less_than(newDuration, minimumPreviousDuration);
assert_less_than(minimumPreviousDuration, mediaElement.duration);
}
test.expectEvent(sourceBuffer, "update");
test.expectEvent(sourceBuffer, "updateend");
sourceBuffer.remove(newDuration, Infinity);
}
function trimDuration(test, mediaElement, mediaSource, newDuration) {
function trimDuration(test, mediaElement, mediaSource, newDuration, skip_duration_prechecks) {
if (!skip_duration_prechecks) {
assert_less_than(newDuration, mediaElement.duration);
}
test.expectEvent(mediaElement, "durationchange");
mediaSource.duration = newDuration;
}
function runChangeTypeTest(test, mediaElement, mediaSource, metadataA, dataA, metadataB, dataB) {
function runChangeTypeTest(test, mediaElement, mediaSource, metadataA, typeA, dataA, metadataB, typeB, dataB,
implicit_changetype, negative_test) {
// Some streams, like the MP4 video stream, contain presentation times for
// frames out of order versus their decode times. If we overlap-append the
// latter part of such a stream's GOP presentation interval, a significant
@ -104,6 +148,14 @@ function runChangeTypeTest(test, mediaElement, mediaSource, metadataA, dataA, me
// splice-overlapping such GOP sequences that aren't SAP-Type-1.
// TODO(wolenetz): https://github.com/w3c/media-source/issues/160 could
// greatly simplify this problem by allowing us play through these small gaps.
//
// typeA and typeB may be underspecified for use with isTypeSupported, but
// this helper does not use isTypeSupported. typeA and typeB must work (even
// if missing codec specific substrings) with addSourceBuffer (just typeA) and
// changeType (both typeA and typeB).
//
// See also mediaSourceChangeTypeTest's options argument for the meanings of
// implicit_changetype and negative_test.
function findSafeOffset(targetTime, overlappedMediaMetadata, overlappedStartTime, overlappingMediaMetadata) {
assert_greater_than_equal(targetTime, overlappedStartTime);
@ -130,8 +182,18 @@ function runChangeTypeTest(test, mediaElement, mediaSource, metadataA, dataA, me
return { "offset": offset, "adjustedTime": adjustedTime };
}
let sourceBuffer = mediaSource.addSourceBuffer(metadataA.type);
// Note, none of the current negative changeType tests should fail the initial addSourceBuffer.
let sourceBuffer = mediaSource.addSourceBuffer(typeA);
// Add error event listeners to sourceBuffer. The caller of this helper may
// also have installed error event listeners on mediaElement.
if (negative_test) {
sourceBuffer.addEventListener("error", test.step_func_done());
} else {
sourceBuffer.addEventListener("error", test.unreached_func("Unexpected event 'error'"));
}
// In either negative test or not, the first appendBuffer should succeed.
appendBuffer(test, sourceBuffer, dataA);
let lastStart = metadataA["start_time"];
if (lastStart == null) {
@ -144,7 +206,14 @@ function runChangeTypeTest(test, mediaElement, mediaSource, metadataA, dataA, me
test.waitForExpectedEvents(() => {
let safeOffset = findSafeOffset(0.5, metadataA, lastStart, metadataB);
lastStart = safeOffset["adjustedTime"];
sourceBuffer.changeType(metadataB.type);
if (!implicit_changetype) {
try { sourceBuffer.changeType(typeB); } catch(err) {
if (negative_test)
test.done();
else
throw err;
}
}
sourceBuffer.timestampOffset = safeOffset["offset"];
appendBuffer(test, sourceBuffer, dataB);
});
@ -155,7 +224,14 @@ function runChangeTypeTest(test, mediaElement, mediaSource, metadataA, dataA, me
assert_less_than(lastStart, 1.0);
let safeOffset = findSafeOffset(1.0, metadataB, lastStart, metadataB);
lastStart = safeOffset["adjustedTime"];
sourceBuffer.changeType(metadataB.type);
if (!implicit_changetype) {
try { sourceBuffer.changeType(typeB); } catch(err) {
if (negative_test)
test.done();
else
throw err;
}
}
sourceBuffer.timestampOffset = safeOffset["offset"];
appendBuffer(test, sourceBuffer, dataB);
});
@ -167,7 +243,14 @@ function runChangeTypeTest(test, mediaElement, mediaSource, metadataA, dataA, me
let safeOffset = findSafeOffset(1.5, metadataB, lastStart, metadataA);
// Retain the previous lastStart because the next block will append data
// which begins between that start time and this block's start time.
sourceBuffer.changeType(metadataA.type);
if (!implicit_changetype) {
try { sourceBuffer.changeType(typeA); } catch(err) {
if (negative_test)
test.done();
else
throw err;
}
}
sourceBuffer.timestampOffset = safeOffset["offset"];
appendBuffer(test, sourceBuffer, dataA);
});
@ -179,18 +262,27 @@ function runChangeTypeTest(test, mediaElement, mediaSource, metadataA, dataA, me
// Our next append will begin by overlapping some of metadataB, then some of
// metadataA.
let safeOffset = findSafeOffset(1.3, metadataB, lastStart, metadataA);
sourceBuffer.changeType(metadataA.type);
if (!implicit_changetype) {
try { sourceBuffer.changeType(typeA); } catch(err) {
if (negative_test)
test.done();
else
throw err;
}
}
sourceBuffer.timestampOffset = safeOffset["offset"];
appendBuffer(test, sourceBuffer, dataA);
});
// Trim duration to 2 seconds, then play through to end.
test.waitForExpectedEvents(() => {
trimBuffered(test, mediaElement, sourceBuffer, 2.1, 2);
// If negative testing, then skip fragile assertions.
trimBuffered(test, mediaElement, sourceBuffer, 2.1, 2, negative_test);
});
test.waitForExpectedEvents(() => {
trimDuration(test, mediaElement, mediaSource, 2);
// If negative testing, then skip fragile assertions.
trimDuration(test, mediaElement, mediaSource, 2, negative_test);
});
test.waitForExpectedEvents(() => {
@ -203,17 +295,56 @@ function runChangeTypeTest(test, mediaElement, mediaSource, metadataA, dataA, me
});
test.waitForExpectedEvents(() => {
if (negative_test)
assert_unreached("Received 'ended' while negative testing.");
else
test.done();
});
}
function mediaSourceChangeTypeTest(metadataA, metadataB, description) {
// options.use_relaxed_mime_types : boolean (defaults to false).
// If true, the initial addSourceBuffer and any changeType calls will use the
// relaxed_type in metadataA and metadataB instead of the full type in the
// metadata.
// options.implicit_changetype : boolean (defaults to false).
// If true, no changeType calls will be used. Instead, the test media files
// are expected to begin with an initialization segment and end at a segment
// boundary (no abort() call is issued by this test to reset the
// SourceBuffer's parser).
// options.negative_test : boolean (defaults to false).
// If true, the test is expected to hit error amongst one of the following
// areas: addSourceBuffer, appendBuffer (synchronous or asynchronous error),
// changeType, playback to end of buffered media. If 'ended' is received
// without error otherwise already occurring, then fail the test. Otherwise,
// pass the test on receipt of error. Continue to consider timeouts as test
// failures.
function mediaSourceChangeTypeTest(metadataA, metadataB, description, options = {}) {
mediasource_test((test, mediaElement, mediaSource) => {
let typeA = metadataA.type;
let typeB = metadataB.type;
if (options.hasOwnProperty("use_relaxed_mime_types") &&
options.use_relaxed_mime_types === true) {
typeA = metadataA.relaxed_type;
typeB = metadataB.relaxed_type;
}
let implicit_changetype = options.hasOwnProperty("implicit_changetype") &&
options.implicit_changetype === true;
let negative_test = options.hasOwnProperty("negative_test") &&
options.negative_test === true;
mediaElement.pause();
mediaElement.addEventListener('error', test.unreached_func("Unexpected event 'error'"));
if (negative_test) {
mediaElement.addEventListener("error", test.step_func_done());
} else {
mediaElement.addEventListener("error",
test.unreached_func("Unexpected event 'error'"));
}
MediaSourceUtil.loadBinaryData(test, metadataA.url, (dataA) => {
MediaSourceUtil.loadBinaryData(test, metadataB.url, (dataB) => {
runChangeTypeTest(test, mediaElement, mediaSource, metadataA, dataA, metadataB, dataB);
runChangeTypeTest(
test, mediaElement, mediaSource,
metadataA, typeA, dataA, metadataB, typeB, dataB,
implicit_changetype, negative_test);
});
});
}, description);

View file

@ -323,7 +323,9 @@
test.done = function()
{
if (test.status == test.PASS) {
test.step(function() {
assert_false(test.eventExpectations_.expectingEvents(), "No pending event expectations.");
});
}
oldTestDone();
};

View file

@ -0,0 +1,8 @@
<!doctype html>
<script>
window.addEventListener("message", e => {
window.top.postMessage(e.data, "*");
});
</script>
<iframe src="secure-connection-test.html">

View file

@ -0,0 +1,3 @@
Connection: Keep-Alive
Content-Length: 170

View file

@ -0,0 +1,13 @@
<!doctype html>
<script>
const entries = performance.getEntriesByType("navigation");
if (!entries) {
window.top.postMessage("FAIL - not supported", "*");
}
const entry = entries[0];
if (entry.secureConnectionStart != entry.fetchStart) {
window.top.postMessage("FAIL - unexpected secureConnectionStart value of " +
entry.secureConnectionStart + " does not equal " + entry.fetchStart, "*");
}
window.top.postMessage("PASS", "*");
</script>

View file

@ -0,0 +1,15 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Navigation Timing secureconnectionstart reuse</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
const t = async_test("Test that secureConnectionStart value is as expected when reused");
window.addEventListener("message", t.step_func_done(e => {
assert_equals(e.data, "PASS");
}));
</script>
<iframe src="resources/secure-connection-interim.html">

View file

@ -580,7 +580,9 @@ class MockXRInputSource {
this.setGripOrigin(fakeInputSourceInit.gripOrigin);
}
this.gamepad_ = null;
// This properly handles if supportedButtons were not specified.
this.setSupportedButtons(fakeInputSourceInit.supportedButtons);
this.emulated_position_ = false;
this.desc_dirty_ = true;
}
@ -633,6 +635,10 @@ class MockXRInputSource {
startSelection() {
this.primary_input_pressed_ = true;
if (this.gamepad_) {
this.gamepad_.buttons[0].pressed = true;
this.gamepad_.buttons[0].touched = true;
}
}
endSelection() {
@ -642,12 +648,89 @@ class MockXRInputSource {
this.primary_input_pressed_ = false;
this.primary_input_clicked_ = true;
if (this.gamepad_) {
this.gamepad_.buttons[0].pressed = false;
this.gamepad_.buttons[0].touched = false;
}
}
simulateSelect() {
this.primary_input_clicked_ = true;
}
setSupportedButtons(supportedButtons) {
this.gamepad_ = null;
this.supported_buttons_ = [];
// If there are no supported buttons, we can stop now.
if (supportedButtons == null || supportedButtons.length < 1) {
return;
}
let supported_button_map = {};
this.gamepad_ = this.getEmptyGamepad();
for (let i = 0; i < supportedButtons.length; i++) {
let buttonType = supportedButtons[i].buttonType;
this.supported_buttons_.push(buttonType);
supported_button_map[buttonType] = supportedButtons[i];
}
// Let's start by building the button state in order of priority:
// Primary button is index 0.
this.gamepad_.buttons.push({
pressed: this.primary_input_pressed_,
touched: this.primary_input_pressed_,
value: this.primary_input_pressed_ ? 1.0 : 0.0
});
// Now add the rest of our buttons
this.addGamepadButton(supported_button_map['grip']);
this.addGamepadButton(supported_button_map['touchpad']);
this.addGamepadButton(supported_button_map['thumbstick']);
this.addGamepadButton(supported_button_map['optional-button']);
this.addGamepadButton(supported_button_map['optional-thumbstick']);
// Finally, back-fill placeholder buttons/axes
for (let i = 0; i < this.gamepad_.buttons.length; i++) {
if (this.gamepad_.buttons[i] == null) {
this.gamepad_.buttons[i] = {
pressed: false,
touched: false,
value: 0
}
}
}
for (let i=0; i < this.gamepad_.axes.length; i++) {
if (this.gamepad_.axes[i] == null) {
this.gamepad_.axes[i] = 0;
}
}
}
updateButtonState(buttonState) {
if (this.supported_buttons_.indexOf(buttonState.buttonType) == -1) {
throw new Error("Tried to update state on an unsupported button");
}
let buttonIndex = this.getButtonIndex(buttonState.buttonType);
let axesStartIndex = this.getAxesStartIndex(buttonState.buttonType);
if (buttonIndex == -1) {
throw new Error("Unknown Button Type!");
}
this.gamepad_.buttons[buttonIndex].pressed = buttonState.pressed;
this.gamepad_.buttons[buttonIndex].touched = buttonState.touched;
this.gamepad_.buttons[buttonIndex].value = buttonState.pressedValue;
if (axesStartIndex != -1) {
this.gamepad_.axes[axesStartIndex] = buttonState.xValue == null ? 0.0 : buttonState.xValue;
this.gamepad_.axes[axesStartIndex + 1] = buttonState.yValue == null ? 0.0 : buttonState.yValue;
}
}
// Helpers for Mojom
getInputSourceState() {
let input_state = new device.mojom.XRInputSourceState();
@ -696,6 +779,89 @@ class MockXRInputSource {
return input_state;
}
getEmptyGamepad() {
// Mojo complains if some of the properties on Gamepad are null, so set
// everything to reasonable defaults that tests can override.
let gamepad = new device.mojom.Gamepad();
gamepad.connected = true;
gamepad.id = "";
gamepad.timestamp = 0;
gamepad.axes = [];
gamepad.buttons = [];
gamepad.mapping = "xr-standard";
gamepad.display_id = 0;
switch (this.handedness_) {
case 'left':
gamepad.hand = device.mojom.GamepadHand.GamepadHandLeft;
break;
case 'right':
gamepad.hand = device.mojom.GamepadHand.GamepadHandRight;
break;
default:
gamepad.hand = device.mojom.GamepadHand.GamepadHandNone;
break;
}
return gamepad;
}
addGamepadButton(buttonState) {
if (buttonState == null) {
return;
}
let buttonIndex = this.getButtonIndex(buttonState.buttonType);
let axesStartIndex = this.getAxesStartIndex(buttonState.buttonType);
if (buttonIndex == -1) {
throw new Error("Unknown Button Type!");
}
this.gamepad_.buttons[buttonIndex] = {
pressed: buttonState.pressed,
touched: buttonState.touched,
value: buttonState.pressedValue
};
// Add x/y value if supported.
if (axesStartIndex != -1) {
this.gamepad_.axes[axesStartIndex] = (buttonState.xValue == null ? 0.0 : buttonSate.xValue);
this.gamepad_.axes[axesStartIndex + 1] = (buttonState.yValue == null ? 0.0 : buttonSate.yValue);
}
}
// General Helper methods
getButtonIndex(buttonType) {
switch (buttonType) {
case 'grip':
return 1;
case 'touchpad':
return 2;
case 'thumbstick':
return 3;
case 'optional-button':
return 4;
case 'optional-thumbstick':
return 5;
default:
return -1;
}
}
getAxesStartIndex(buttonType) {
switch (buttonType) {
case 'touchpad':
return 0;
case 'thumbstick':
return 2;
case 'optional-thumbstick':
return 4;
default:
return -1;
}
}
}
// Mojo helper classes

View file

@ -12,8 +12,31 @@
"webkitSpeechRecognitionError",
"webkitSpeechRecognitionEvent",
].forEach(name => {
test(function() {
test(() => {
assert_false(name in window);
}, name + " interface should not exist");
}, `${name} interface should not exist`);
});
test(() => {
if (!window.SpeechRecognition) {
// TODO(foolip): use `t.skip()` after
// https://github.com/web-platform-tests/rfcs/pull/16 is done.
return;
}
assert_false("serviceURI" in SpeechRecognition.prototype);
}, "SpeechRecognition's serviceURI attribute should not exist");
[
"interpretation",
"emma",
].forEach(name => {
test(() => {
if (!window.SpeechRecognitionEvent) {
// TODO(foolip): use `t.skip()` after
// https://github.com/web-platform-tests/rfcs/pull/16 is done.
return;
}
assert_false(name in SpeechRecognitionEvent.prototype);
}, `SpeechRecognitionEvent's ${name} attribute should not exist`);
});
</script>

View file

@ -0,0 +1,8 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>Toast: slotting test reference</title>
<script type="module">
import 'std:elements/toast';
</script>
<p>Pass if the toast is displayed with the action button last.</p>
<std-toast open>First. Second. <button>Last.</button></std-toast>

View file

@ -0,0 +1,11 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>Toast: slotting test</title>
<link rel="help" href="https://github.com/jackbsteinberg/std-toast">
<meta name="assert" content="Toast slots action button behind any text">
<link rel="match" href="toast-slotting-expected.html">
<script type="module">
import 'std:elements/toast';
</script>
<p>Pass if the toast is displayed with the action button last.</p>
<std-toast open>First. <button slot="action">Last.</button> Second. </std-toast>

View file

@ -2,10 +2,10 @@ import { showToast, StdToastElement } from 'std:elements/toast';
// helper functions to keep tests from bleeding into each other
const runTest = (testFn, name, toast) => {
const runTest = (testFn, name, toast, action) => {
try {
test(() => {
testFn(toast);
testFn(toast, action);
}, name);
} finally {
toast.remove();
@ -41,6 +41,17 @@ export const testShowToast = (testFn, name) => {
runTest(testFn, name, toast);
};
export const testActionToast = (testFn, name) => {
const toast = new StdToastElement('Message', {});
const action = document.createElement('button');
action.setAttribute('slot', 'action');
action.textContent = 'action';
toast.appendChild(action);
document.querySelector('main').appendChild(toast);
runTest(testFn, name, toast, action);
};
export const assertToastShown = (toast) => {
assert_not_equals(window.getComputedStyle(toast).display, 'none');
assert_true(toast.hasAttribute('open'));
@ -59,6 +70,20 @@ export const assertActionButtonOnToast = (action, toast) => {
assert_equals(action, toast.querySelector('button'));
};
export const assertComputedStyleMapsEqual = (element1, element2) => {
assert_greater_than(element1.computedStyleMap().size, 0);
for (const [styleProperty, baseStyleValues] of element1.computedStyleMap()) {
const refStyleValues = element2.computedStyleMap().getAll(styleProperty);
assert_equals(baseStyleValues.length, refStyleValues.length, `${styleProperty} length`);
for (let i = 0; i < baseStyleValues.length; ++i) {
const baseStyleValue = baseStyleValues[i];
const refStyleValue = refStyleValues[i];
assert_equals(baseStyleValue.toString(), refStyleValue.toString(), `diff at value ${styleProperty}`);
}
}
}
export class EventCollector {
events = [];

View file

@ -0,0 +1,64 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>Toast: style tests</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<main>
</main>
<script type="module">
import { testToastElement, assertComputedStyleMapsEqual } from './resources/helpers.js';
testToastElement((toast) => {
toast.open = true;
const mockToast = document.createElement('span');
mockToast.id = 'mock-toast-open';
mockToast.textContent = 'Message';
const mockStyler = document.createElement('style');
mockStyler.textContent = `
#mock-toast-open {
position: fixed;
bottom: 1em;
right: 1em;
border: solid;
padding: 1em;
background: white;
color: black;
z-index: 1;
}`;
document.querySelector('main').appendChild(mockStyler);
document.querySelector('main').appendChild(mockToast);
assertComputedStyleMapsEqual(toast, mockToast);
}, 'the computed style map of an open unstyled toast is the same as a span given toast defaults');
testToastElement((toast) => {
const mockToast = document.createElement('span');
mockToast.id = 'mock-toast-hidden';
mockToast.textContent = 'Message';
const mockStyler = document.createElement('style');
mockStyler.textContent = `
#mock-toast-hidden {
position: fixed;
bottom: 1em;
right: 1em;
border: solid;
padding: 1em;
background: white;
color: black;
z-index: 1;
display: none;
}`;
document.querySelector('main').appendChild(mockStyler);
document.querySelector('main').appendChild(mockToast);
assertComputedStyleMapsEqual(toast, mockToast);
}, 'the computed style map of a closed unstyled toast is the same as a span given toast defaults');
</script>

View file

@ -100,6 +100,21 @@ promise_test(t => {
});
}, 'preventAbort should prevent aborting the readable');
promise_test(t => {
const rs = recordingReadableStream(errorOnPull, hwm0);
const ws = recordingWritableStream();
const abortController = new AbortController();
const signal = abortController.signal;
abortController.abort();
return promise_rejects(t, 'AbortError', rs.pipeTo(ws, { signal, preventCancel: true, preventAbort: true }),
'pipeTo should reject')
.then(() => {
assert_equals(rs.events.length, 0, 'cancel should not be called');
assert_equals(ws.events.length, 0, 'writable should not have been aborted');
return ws.getWriter().ready;
});
}, 'preventCancel and preventAbort should prevent canceling the readable and aborting the readable');
promise_test(t => {
const rs = new ReadableStream({
start(controller) {

View file

@ -48,18 +48,18 @@ def executor_kwargs(test_type, server_config, cache_manager, run_info_data,
**kwargs)
executor_kwargs["close_after_done"] = True
capabilities = dict(DesiredCapabilities.CHROME.items())
capabilities["chromeOptions"] = {}
# required to start on mobile
capabilities["chromeOptions"]["androidPackage"] = "com.google.android.apps.chrome"
capabilities["goog:chromeOptions"] = {}
# TODO(chrome): browser_channel should be properly supported.
package_name = "com.android.chrome" # stable channel
# Required to start on mobile
capabilities["goog:chromeOptions"]["androidPackage"] = package_name
for (kwarg, capability) in [("binary", "binary"), ("binary_args", "args")]:
if kwargs[kwarg] is not None:
capabilities["chromeOptions"][capability] = kwargs[kwarg]
capabilities["goog:chromeOptions"][capability] = kwargs[kwarg]
if test_type == "testharness":
capabilities["useAutomationExtension"] = False
capabilities["excludeSwitches"] = ["enable-automation"]
if test_type == "wdspec":
capabilities["chromeOptions"]["w3c"] = True
executor_kwargs["capabilities"] = capabilities
return executor_kwargs
@ -86,15 +86,17 @@ class ChromeAndroidBrowser(Browser):
self.server = ChromeDriverServer(self.logger,
binary=webdriver_binary,
args=webdriver_args)
self.setup_adb_reverse()
def _adb_run(self, args):
self.logger.info('adb ' + ' '.join(args))
subprocess.check_call(['adb'] + args)
def setup(self):
def setup_adb_reverse(self):
self._adb_run(['wait-for-device'])
self._adb_run(['forward', '--remove-all'])
self._adb_run(['reverse', '--remove-all'])
# "adb reverse" forwards network connection from device to host.
for port in _wptserve_ports:
self._adb_run(['reverse', 'tcp:%d' % port, 'tcp:%d' % port])

View file

@ -14,7 +14,7 @@ promise_test(async t => {
];
for (let signal of invalidSignals) {
await promise_rejects(t, new TypeError(), WakeLock.request('screen', { signal: signal }));
await promise_rejects(t, new TypeError(), WakeLock.request('system', { signal: signal }));
}
}, "'TypeError' is thrown when the signal option is not an AbortSignal");
@ -24,7 +24,7 @@ promise_test(t => {
abortController.abort();
assert_true(abortSignal.aborted);
return promise_rejects(t, "AbortError", WakeLock.request('screen', { signal: abortSignal }));
return promise_rejects(t, "AbortError", WakeLock.request('system', { signal: abortSignal }));
}, "A WakeLock request with an AbortSignal whose abort flag is set always aborts");
promise_test(async t => {
@ -33,8 +33,8 @@ promise_test(async t => {
abortController.abort();
assert_true(abortSignal.aborted);
const lock1 = WakeLock.request('screen', { signal: abortSignal });
const lock2 = WakeLock.request('screen', { signal: abortSignal });
const lock1 = WakeLock.request('system', { signal: abortSignal });
const lock2 = WakeLock.request('system', { signal: abortSignal });
const lock3 = WakeLock.request('system', { signal: abortSignal });
await promise_rejects(t, "AbortError", lock1);

View file

@ -788,21 +788,31 @@ window.Audit = (function() {
}
// Compare against the expected sequence.
let failMessage =
'${actual} expected to have the value sequence of ${expected} but ' +
'got ';
if (this._expected.length === indexedActual.length) {
for (let j = 0; j < this._expected.length; j++) {
if (this._expected[j] !== indexedActual[j].value) {
firstErrorIndex = indexedActual[j].index;
passed = false;
failMessage += this._actual[firstErrorIndex] + ' at index ' +
firstErrorIndex + '.';
break;
}
}
} else {
passed = false;
let indexedValues = indexedActual.map(x => x.value);
failMessage += `${indexedActual.length} values, [${
indexedValues}], instead of ${this._expected.length}.`;
}
return this._assert(
passed,
'${actual} contains all the expected values in the correct order: ' +
'${expected}.',
'${actual} expected to have the value sequence of ${expected} but ' +
'got ' + this._actual[firstErrorIndex] + ' at index ' +
firstErrorIndex + '.');
failMessage);
}
/**

View file

@ -0,0 +1,117 @@
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/webxr_util.js"></script>
<script src="resources/webxr_test_constants.js"></script>
<canvas id="webgl-canvas"></canvas>
<script>
let testName = "Input sources are re-created when handedness or target ray mode changes";
let watcherDone = new Event("watcherdone");
let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE;
let testFunction = function(session, fakeDeviceController, t) {
let eventWatcher = new EventWatcher(t, session, ["watcherdone"]);
let eventPromise = eventWatcher.wait_for(["watcherdone"]);
let inputChangeEvents = 0;
let cached_input_source = null;
function onInputSourcesChange(event) {
t.step(() => {
inputChangeEvents++;
assert_equals(event.session, session);
if (inputChangeEvents == 1) {
// The first change event should be adding our controller.
validateAdded(event.added, 1);
validateRemoved(event.removed, 0);
cached_input_source = getInputSources()[0];
assert_not_equals(cached_input_source, null);
assert_equals(cached_input_source.handedness, "none");
assert_equals(cached_input_source.targetRayMode, "gaze");
} else if (inputChangeEvents == 2) {
// The second event should be replacing the controller with one that has
// the updated target ray mode.
validateInputSourceChange(event, "none", "tracked-pointer");
cached_input_source = getInputSources()[0];
} else if (inputChangeEvents == 3) {
// The third event should be replacing the controller with one that has
// the updated handedness.
validateInputSourceChange(event, "left", "tracked-pointer");
session.dispatchEvent(watcherDone);
}
});
}
function validateInputSourceChange(event, expected_hand, expected_mode) {
validateAdded(event.added, 1);
validateRemoved(event.removed, 1);
assert_true(event.removed.includes(cached_input_source));
assert_false(event.added.includes(cached_input_source));
let source = event.added[0];
assert_equals(source.handedness, expected_hand);
assert_equals(source.targetRayMode, expected_mode);
}
function validateAdded(added, length) {
t.step(() => {
assert_not_equals(added, null);
assert_equals(added.length, length,
"Added length matches expectations");
let currentSources = getInputSources();
added.forEach((source) => {
assert_true(currentSources.includes(source),
"Every element in added should be in the input source list");
});
});
}
function validateRemoved(removed, length) {
t.step(() => {
assert_not_equals(removed, null);
assert_equals(removed.length, length,
"Removed length matches expectations");
let currentSources = getInputSources();
removed.forEach((source) => {
assert_false(currentSources.includes(source),
"No element in removed should be in the input source list");
});
});
}
function getInputSources() {
return Array.from(session.inputSources.values());
}
session.addEventListener('inputsourceschange', onInputSourcesChange, false);
// Create a gaze based input source with no handedness that we can change
// to validate SameObject properties.
let input_source = fakeDeviceController.simulateInputSourceConnection({
handedness: "none",
targetRayMode: "gaze",
pointerOrigin: VALID_POINTER_TRANSFORM,
profiles: []
});
// Make our input source change after one frame, and wait an additional
// frame for that change to propogate.
// Two changes made in total.
session.requestAnimationFrame((time, xrFrame) => {
input_source.setTargetRayMode("tracked-pointer");
session.requestAnimationFrame((time, xrFrame) => {
input_source.setHandedness("left");
session.requestAnimationFrame((time, xrFrame) => {});
});
});
return eventPromise;
};
xr_session_promise_test(
testName, testFunction, fakeDeviceInitParams, 'immersive-vr');
</script>

View file

@ -0,0 +1,96 @@
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/webxr_util.js"></script>
<script src="resources/webxr_test_constants.js"></script>
<canvas id="webgl-canvas"></canvas>
<script>
let testName = "Transient input sources fire events in the right order";
let watcherDone = new Event("watcherdone");
let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE;
let testFunction = function(session, fakeDeviceController, t) {
let eventWatcher = new EventWatcher(
t, session, ["inputsourceschange", "selectstart", "select", "selectend", "watcherdone"]);
let eventPromise = eventWatcher.wait_for(
["inputsourceschange", "selectstart", "select", "selectend", "inputsourceschange", "watcherdone"]);
let inputChangeEvents = 0;
let cached_input_source = null;
function onInputSourcesChange(event) {
t.step(() => {
inputChangeEvents++;
assert_equals(event.session, session);
// The first change event should be adding our controller.
if (inputChangeEvents === 1) {
validateAdded(event.added, 1);
validateRemoved(event.removed, 0);
cached_input_source = session.inputSources[0];
assert_not_equals(cached_input_source, null);
} else if (inputChangeEvents === 2) {
// The second event should be removing our controller.
validateAdded(event.added, 0);
validateRemoved(event.removed, 1);
assert_true(event.removed.includes(cached_input_source));
session.dispatchEvent(watcherDone);
}
});
}
function validateAdded(added, length) {
t.step(() => {
assert_not_equals(added, null);
assert_equals(added.length, length,
"Added length matches expectations");
let currentSources = Array.from(session.inputSources.values());
added.forEach((source) => {
assert_true(currentSources.includes(source),
"Every element in added should be in the input source list");
});
});
}
function validateRemoved(removed, length) {
t.step(() => {
assert_not_equals(removed, null);
assert_equals(removed.length, length,
"Removed length matches expectations");
let currentSources = Array.from(session.inputSources.values());
removed.forEach((source) => {
assert_false(currentSources.includes(source),
"No element in removed should be in the input source list");
});
});
}
session.addEventListener('inputsourceschange', onInputSourcesChange, false);
// Create our input source and immediately toggle the primary input so that
// it appears as already needing to send a click event when it appears.
let input_source = fakeDeviceController.simulateInputSourceConnection({
handedness: "right",
targetRayMode: "tracked-pointer",
pointerOrigin: VALID_POINTER_TRANSFORM,
profiles: [],
selectionClicked: true
});
// Make our input source disappear after one frame, and wait an additional
// frame for that disappearance to propogate.
session.requestAnimationFrame((time, xrFrame) => {
input_source.disconnect();
session.requestAnimationFrame((time, xrFrame) => {});
});
return eventPromise;
};
xr_session_promise_test(
testName, testFunction, fakeDeviceInitParams, 'immersive-vr');
</script>

Some files were not shown because too many files have changed in this diff Show more