Auto merge of #22764 - servo-wpt-sync:wpt_update_26-01-2019, r=jdm

Sync WPT with upstream (26-01-2019)

Automated downstream sync of changes from upstream as of 26-01-2019.
[no-wpt-sync]

<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/22764)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2019-01-26 22:58:40 -05:00 committed by GitHub
commit 5fd64d9436
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
109 changed files with 2053 additions and 708 deletions

View file

@ -14,6 +14,9 @@
[Revoke blob URL after creating Request, will fetch] [Revoke blob URL after creating Request, will fetch]
expected: FAIL expected: FAIL
[Revoke blob URL after calling fetch, fetch should succeed]
expected: FAIL
[url-with-fetch.any.html] [url-with-fetch.any.html]
[Untitled] [Untitled]
@ -34,3 +37,6 @@
[Revoke blob URL after creating Request, will fetch] [Revoke blob URL after creating Request, will fetch]
expected: FAIL expected: FAIL
[Revoke blob URL after calling fetch, fetch should succeed]
expected: FAIL

View file

@ -19377,30 +19377,6 @@
{} {}
] ]
], ],
"animation-worklet/worklet-animation-pause-immediately.https.html": [
[
"/animation-worklet/worklet-animation-pause-immediately.https.html",
[
[
"/animation-worklet/references/translated-box-ref.html",
"=="
]
],
{}
]
],
"animation-worklet/worklet-animation-pause-resume.https.html": [
[
"/animation-worklet/worklet-animation-pause-resume.https.html",
[
[
"/animation-worklet/references/translated-box-ref.html",
"=="
]
],
{}
]
],
"apng/animated-png-timeout.html": [ "apng/animated-png-timeout.html": [
[ [
"/apng/animated-png-timeout.html", "/apng/animated-png-timeout.html",
@ -202124,11 +202100,6 @@
{} {}
] ]
], ],
"animation-worklet/references/translated-box-ref.html": [
[
{}
]
],
"animation-worklet/resources/animator-iframe.html": [ "animation-worklet/resources/animator-iframe.html": [
[ [
{} {}
@ -289134,6 +289105,21 @@
{} {}
] ]
], ],
"fetch/stale-while-revalidate/stale-css.py": [
[
{}
]
],
"fetch/stale-while-revalidate/stale-image.py": [
[
{}
]
],
"fetch/stale-while-revalidate/stale-script.py": [
[
{}
]
],
"fonts/AD.woff": [ "fonts/AD.woff": [
[ [
{} {}
@ -289879,6 +289865,11 @@
{} {}
] ]
], ],
"fonts/noto/NotoNaskhArabic-regular.woff2": [
[
{}
]
],
"fonts/noto/NotoSansAdlam-hinted/LICENSE_OFL.txt": [ "fonts/noto/NotoSansAdlam-hinted/LICENSE_OFL.txt": [
[ [
{} {}
@ -307759,6 +307750,16 @@
{} {}
] ]
], ],
"resource-timing/resources/fake_responses_https.sub.html": [
[
{}
]
],
"resource-timing/resources/fake_responses_https_redirect.sub.html": [
[
{}
]
],
"resource-timing/resources/green_frame.htm": [ "resource-timing/resources/green_frame.htm": [
[ [
{} {}
@ -311604,6 +311605,11 @@
{} {}
] ]
], ],
"service-workers/service-worker/resources/get-resultingClientId-worker.js": [
[
{}
]
],
"service-workers/service-worker/resources/http-to-https-redirect-and-register-iframe.html": [ "service-workers/service-worker/resources/http-to-https-redirect-and-register-iframe.html": [
[ [
{} {}
@ -321044,16 +321050,6 @@
{} {}
] ]
], ],
"trusted-types/WorkerGlobalScope-importScripts.https.js": [
[
{}
]
],
"trusted-types/WorkerGlobalScope-importScripts.https.js.headers": [
[
{}
]
],
"trusted-types/support/helper.sub.js": [ "trusted-types/support/helper.sub.js": [
[ [
{} {}
@ -335489,12 +335485,6 @@
{} {}
] ]
], ],
"animation-worklet/worklet-animation-pause.https.html": [
[
"/animation-worklet/worklet-animation-pause.https.html",
{}
]
],
"animation-worklet/worklet-animation-with-fill-mode.https.html": [ "animation-worklet/worklet-animation-with-fill-mode.https.html": [
[ [
"/animation-worklet/worklet-animation-with-fill-mode.https.html", "/animation-worklet/worklet-animation-with-fill-mode.https.html",
@ -347547,6 +347537,18 @@
{} {}
] ]
], ],
"css/css-syntax/anb-parsing.html": [
[
"/css/css-syntax/anb-parsing.html",
{}
]
],
"css/css-syntax/anb-serialization.html": [
[
"/css/css-syntax/anb-serialization.html",
{}
]
],
"css/css-syntax/charset-is-not-a-rule.html": [ "css/css-syntax/charset-is-not-a-rule.html": [
[ [
"/css/css-syntax/charset-is-not-a-rule.html", "/css/css-syntax/charset-is-not-a-rule.html",
@ -347679,12 +347681,36 @@
{} {}
] ]
], ],
"css/css-syntax/inclusive-ranges.html": [
[
"/css/css-syntax/inclusive-ranges.html",
{}
]
],
"css/css-syntax/input-preprocessing.html": [
[
"/css/css-syntax/input-preprocessing.html",
{}
]
],
"css/css-syntax/unclosed-constructs.html": [
[
"/css/css-syntax/unclosed-constructs.html",
{}
]
],
"css/css-syntax/unicode-range-selector.html": [ "css/css-syntax/unicode-range-selector.html": [
[ [
"/css/css-syntax/unicode-range-selector.html", "/css/css-syntax/unicode-range-selector.html",
{} {}
] ]
], ],
"css/css-syntax/whitespace.html": [
[
"/css/css-syntax/whitespace.html",
{}
]
],
"css/css-tables/bounding-box-computation-1.html": [ "css/css-tables/bounding-box-computation-1.html": [
[ [
"/css/css-tables/bounding-box-computation-1.html", "/css/css-tables/bounding-box-computation-1.html",
@ -369319,6 +369345,30 @@
{} {}
] ]
], ],
"fetch/stale-while-revalidate/fetch.tentative.html": [
[
"/fetch/stale-while-revalidate/fetch.tentative.html",
{}
]
],
"fetch/stale-while-revalidate/stale-css.tentative.html": [
[
"/fetch/stale-while-revalidate/stale-css.tentative.html",
{}
]
],
"fetch/stale-while-revalidate/stale-image.tentative.html": [
[
"/fetch/stale-while-revalidate/stale-image.tentative.html",
{}
]
],
"fetch/stale-while-revalidate/stale-script.tentative.html": [
[
"/fetch/stale-while-revalidate/stale-script.tentative.html",
{}
]
],
"fullscreen/api/document-exit-fullscreen-active-document.html": [ "fullscreen/api/document-exit-fullscreen-active-document.html": [
[ [
"/fullscreen/api/document-exit-fullscreen-active-document.html", "/fullscreen/api/document-exit-fullscreen-active-document.html",
@ -409345,6 +409395,18 @@
{} {}
] ]
], ],
"resource-timing/resource_connection_reuse_mixed_content.html": [
[
"/resource-timing/resource_connection_reuse_mixed_content.html",
{}
]
],
"resource-timing/resource_connection_reuse_mixed_content_redirect.html": [
[
"/resource-timing/resource_connection_reuse_mixed_content_redirect.html",
{}
]
],
"resource-timing/resource_dedicated_worker.html": [ "resource-timing/resource_dedicated_worker.html": [
[ [
"/resource-timing/resource_dedicated_worker.html", "/resource-timing/resource_dedicated_worker.html",
@ -410397,6 +410459,12 @@
{} {}
] ]
], ],
"service-workers/service-worker/clients-get-resultingClientId.https.html": [
[
"/service-workers/service-worker/clients-get-resultingClientId.https.html",
{}
]
],
"service-workers/service-worker/clients-get.https.html": [ "service-workers/service-worker/clients-get.https.html": [
[ [
"/service-workers/service-worker/clients-get.https.html", "/service-workers/service-worker/clients-get.https.html",
@ -415199,12 +415267,6 @@
{} {}
] ]
], ],
"trusted-types/WorkerGlobalScope-importScripts.https.html": [
[
"/trusted-types/WorkerGlobalScope-importScripts.https.html",
{}
]
],
"trusted-types/block-string-assignment-to-DOMParser-parseFromString.tentative.html": [ "trusted-types/block-string-assignment-to-DOMParser-parseFromString.tentative.html": [
[ [
"/trusted-types/block-string-assignment-to-DOMParser-parseFromString.tentative.html", "/trusted-types/block-string-assignment-to-DOMParser-parseFromString.tentative.html",
@ -422263,6 +422325,12 @@
} }
] ]
], ],
"webstorage/defineProperty.window.js": [
[
"/webstorage/defineProperty.window.html",
{}
]
],
"webstorage/document-domain.html": [ "webstorage/document-domain.html": [
[ [
"/webstorage/document-domain.html", "/webstorage/document-domain.html",
@ -422403,6 +422471,12 @@
{} {}
] ]
], ],
"webstorage/set.window.js": [
[
"/webstorage/set.window.html",
{}
]
],
"webstorage/storage_builtins.html": [ "webstorage/storage_builtins.html": [
[ [
"/webstorage/storage_builtins.html", "/webstorage/storage_builtins.html",
@ -423205,18 +423279,6 @@
{} {}
] ]
], ],
"webxr/navigator_xr_requestDevice.https.html": [
[
"/webxr/navigator_xr_requestDevice.https.html",
{}
]
],
"webxr/navigator_xr_requestDevice_no_device.https.html": [
[
"/webxr/navigator_xr_requestDevice_no_device.https.html",
{}
]
],
"webxr/webGLCanvasContext_create_xrcompatible.https.html": [ "webxr/webGLCanvasContext_create_xrcompatible.https.html": [
[ [
"/webxr/webGLCanvasContext_create_xrcompatible.https.html", "/webxr/webGLCanvasContext_create_xrcompatible.https.html",
@ -423295,6 +423357,12 @@
{} {}
] ]
], ],
"webxr/xrSession_mode.https.html": [
[
"/webxr/xrSession_mode.https.html",
{}
]
],
"webxr/xrSession_prevent_multiple_exclusive.https.html": [ "webxr/xrSession_prevent_multiple_exclusive.https.html": [
[ [
"/webxr/xrSession_prevent_multiple_exclusive.https.html", "/webxr/xrSession_prevent_multiple_exclusive.https.html",
@ -455239,7 +455307,7 @@
"testharness" "testharness"
], ],
"animation-worklet/common.js": [ "animation-worklet/common.js": [
"15dff829774a49a1c17eacefebc7e5e34a422f9d", "eb114f24687289fcdd0515ead7dbbc074c7ccbba",
"support" "support"
], ],
"animation-worklet/current-time.https.html": [ "animation-worklet/current-time.https.html": [
@ -455250,10 +455318,6 @@
"e821a2fee8a3ace54e8e7092ab17c490a0ded914", "e821a2fee8a3ace54e8e7092ab17c490a0ded914",
"testharness" "testharness"
], ],
"animation-worklet/references/translated-box-ref.html": [
"c73f5a177bf70f3a71d981bc9f04b38c5afe9f1c",
"support"
],
"animation-worklet/resources/animator-iframe.html": [ "animation-worklet/resources/animator-iframe.html": [
"e30cc281fcdefd8d029e7bf0ea92a1a9cd7af7e7", "e30cc281fcdefd8d029e7bf0ea92a1a9cd7af7e7",
"support" "support"
@ -455262,18 +455326,6 @@
"5b20f03bfadb5790c79ddd51e1f3d89a9f948852", "5b20f03bfadb5790c79ddd51e1f3d89a9f948852",
"testharness" "testharness"
], ],
"animation-worklet/worklet-animation-pause-immediately.https.html": [
"f9dcf30bc908adb4e6b260dd00263e434a9b9ae4",
"reftest"
],
"animation-worklet/worklet-animation-pause-resume.https.html": [
"f26a93468c07de8e59a3826cb39c6bdf2618706f",
"reftest"
],
"animation-worklet/worklet-animation-pause.https.html": [
"4b7a9a0251da7c8179f68249578dc851b145c850",
"testharness"
],
"animation-worklet/worklet-animation-with-fill-mode.https.html": [ "animation-worklet/worklet-animation-with-fill-mode.https.html": [
"49fead8bd39c56c6335c0748b01be0181767bbec", "49fead8bd39c56c6335c0748b01be0181767bbec",
"testharness" "testharness"
@ -547163,7 +547215,7 @@
"reftest" "reftest"
], ],
"css/css-conditional/idlharness.html": [ "css/css-conditional/idlharness.html": [
"410466b25230b246c09cd12d1d13b8ef58786abf", "63cf750933737d3a221ccb48d2a667c110dd0bf9",
"testharness" "testharness"
], ],
"css/css-conditional/js/001.html": [ "css/css-conditional/js/001.html": [
@ -554635,7 +554687,7 @@
"testharness" "testharness"
], ],
"css/css-fonts/idlharness.html": [ "css/css-fonts/idlharness.html": [
"9209144c3e5132a284f79df13145b174af265e59", "ecc601bcf6a97a1722e3901d731f9f424d0a79e1",
"testharness" "testharness"
], ],
"css/css-fonts/language-specific-01.html": [ "css/css-fonts/language-specific-01.html": [
@ -568059,7 +568111,7 @@
"reftest" "reftest"
], ],
"css/css-paint-api/idlharness.html": [ "css/css-paint-api/idlharness.html": [
"bb4c9357f243d7572134834e5678b4cd4d1076b6", "c9675ab0412bb955d7a8653e7d28884a6953800b",
"testharness" "testharness"
], ],
"css/css-paint-api/invalid-image-constructor-error-ref.html": [ "css/css-paint-api/invalid-image-constructor-error-ref.html": [
@ -568987,7 +569039,7 @@
"support" "support"
], ],
"css/css-properties-values-api/idlharness.html": [ "css/css-properties-values-api/idlharness.html": [
"e57f0f00ca26cb6a9342b1b6f84259e2bb908790", "6f053757c3cef099f0cea41716a942dfa7e66100",
"testharness" "testharness"
], ],
"css/css-properties-values-api/property-cascade.html": [ "css/css-properties-values-api/property-cascade.html": [
@ -573674,6 +573726,14 @@
"17489e1bc2132f4c2acbc4ec901eccb8f7e4d365", "17489e1bc2132f4c2acbc4ec901eccb8f7e4d365",
"support" "support"
], ],
"css/css-syntax/anb-parsing.html": [
"7fcc06e2c7e8e1908badf6117a7b8c3f1576cf76",
"testharness"
],
"css/css-syntax/anb-serialization.html": [
"787700cebf39e5cc4fa0d5a2934a7e52bec6da32",
"testharness"
],
"css/css-syntax/charset-is-not-a-rule.html": [ "css/css-syntax/charset-is-not-a-rule.html": [
"81b2a04dc5a0dd2f3434150f7bfb6a6d3f1cfef3", "81b2a04dc5a0dd2f3434150f7bfb6a6d3f1cfef3",
"testharness" "testharness"
@ -573846,10 +573906,26 @@
"36faef9357746f4492d00a3fbb1e33ffd2021bb4", "36faef9357746f4492d00a3fbb1e33ffd2021bb4",
"testharness" "testharness"
], ],
"css/css-syntax/inclusive-ranges.html": [
"ac486bde569842417910cf75f33607f1d2e5de52",
"testharness"
],
"css/css-syntax/input-preprocessing.html": [
"9ef9a730820d85a015b51cb230aa09f397a78400",
"testharness"
],
"css/css-syntax/unclosed-constructs.html": [
"3d7940387c810572159bd55fcc79fc10626221dc",
"testharness"
],
"css/css-syntax/unicode-range-selector.html": [ "css/css-syntax/unicode-range-selector.html": [
"db09540bb08c47f62b4255be6ba72b289987d64c", "db09540bb08c47f62b4255be6ba72b289987d64c",
"testharness" "testharness"
], ],
"css/css-syntax/whitespace.html": [
"bc7aa7ebda518a42a32a154c3ed13f00be86429a",
"testharness"
],
"css/css-tables/META.yml": [ "css/css-tables/META.yml": [
"b5372064ac2721687998bb23a9a9b95226d74afd", "b5372064ac2721687998bb23a9a9b95226d74afd",
"support" "support"
@ -590355,15 +590431,15 @@
"support" "support"
], ],
"css/css-values/vh_not_refreshing_on_chrome.html": [ "css/css-values/vh_not_refreshing_on_chrome.html": [
"52a45a114c85bf96a175ca583d8a2b6f54b9ab6c", "1749986b62c75b3deca3d40f008cade9c105e697",
"reftest" "reftest"
], ],
"css/css-values/viewport-relative-lengths-scaled-viewport.html": [ "css/css-values/viewport-relative-lengths-scaled-viewport.html": [
"a901000394d35eed94237b3ce5acc74b1b0e7bc9", "dba2af8fa07b07d2ab7c6ca9f657b6e170cd9a41",
"testharness" "testharness"
], ],
"css/css-values/viewport-units-css2-001.html": [ "css/css-values/viewport-units-css2-001.html": [
"f0feb6d993537833569bd739e4d903b8e510881b", "c51237dd8a07546d31eef6f6f9b3c84b6ac2b65b",
"testharness" "testharness"
], ],
"css/css-variables/META.yml": [ "css/css-variables/META.yml": [
@ -617079,7 +617155,7 @@
"support" "support"
], ],
"feature-policy/reporting/xr-report-only.https.html": [ "feature-policy/reporting/xr-report-only.https.html": [
"b52bdbfaa47071b89702cfb51166f08b405a95de", "6844226f2bd2189e44c2e74396ba449ce1a49c10",
"testharness" "testharness"
], ],
"feature-policy/reporting/xr-report-only.https.html.headers": [ "feature-policy/reporting/xr-report-only.https.html.headers": [
@ -617087,7 +617163,7 @@
"support" "support"
], ],
"feature-policy/reporting/xr-reporting.https.html": [ "feature-policy/reporting/xr-reporting.https.html": [
"b737bb9a6047e79d0b35c6eedec39b6888b09eb0", "1982ea544c53bad508c422befe589e9e15dabcb6",
"testharness" "testharness"
], ],
"feature-policy/reporting/xr-reporting.https.html.headers": [ "feature-policy/reporting/xr-reporting.https.html.headers": [
@ -618614,6 +618690,34 @@
"20d307e9188405dcec011042487aa2c7354930bf", "20d307e9188405dcec011042487aa2c7354930bf",
"support" "support"
], ],
"fetch/stale-while-revalidate/fetch.tentative.html": [
"01a991ebfb1cb42288a01da37c76b09fa53f407c",
"testharness"
],
"fetch/stale-while-revalidate/stale-css.py": [
"6f3014db5246994383354b139e7900306297dd57",
"support"
],
"fetch/stale-while-revalidate/stale-css.tentative.html": [
"df03bd96243138cbaee076dc9b0a6cc3d15d9a16",
"testharness"
],
"fetch/stale-while-revalidate/stale-image.py": [
"42d0764eb91e7145cfe1638d90421ca7492379db",
"support"
],
"fetch/stale-while-revalidate/stale-image.tentative.html": [
"d8383acb319c2e0398bd83632377ac8cb219da49",
"testharness"
],
"fetch/stale-while-revalidate/stale-script.py": [
"c17528d8e6314e60407085ca778ba2ff70666985",
"support"
],
"fetch/stale-while-revalidate/stale-script.tentative.html": [
"2e04e3905780add84f3da805a238946256ebda87",
"testharness"
],
"fonts/AD.woff": [ "fonts/AD.woff": [
"3df8ea8efdabd11bc45fdcc6d4f3fec771be6650", "3df8ea8efdabd11bc45fdcc6d4f3fec771be6650",
"support" "support"
@ -619210,6 +619314,10 @@
"42cfff628b4680024908635e353bfe9bbf10d952", "42cfff628b4680024908635e353bfe9bbf10d952",
"support" "support"
], ],
"fonts/noto/NotoNaskhArabic-regular.woff2": [
"e24020d46a4c4a4f355941b23e8bad3b9b5003cb",
"support"
],
"fonts/noto/NotoSansAdlam-hinted/LICENSE_OFL.txt": [ "fonts/noto/NotoSansAdlam-hinted/LICENSE_OFL.txt": [
"d952d62c065f3f35fb83a173496e90b21525aef3", "d952d62c065f3f35fb83a173496e90b21525aef3",
"support" "support"
@ -639391,7 +639499,7 @@
"support" "support"
], ],
"interfaces/ambient-light.idl": [ "interfaces/ambient-light.idl": [
"e861cc561823f75d8bfc6526c7766e8716aac179", "4e44c082b0709989870e7ed52e14cc77bfb5d6f2",
"support" "support"
], ],
"interfaces/animation-worklet.idl": [ "interfaces/animation-worklet.idl": [
@ -639475,7 +639583,7 @@
"support" "support"
], ],
"interfaces/css-layout-api.idl": [ "interfaces/css-layout-api.idl": [
"5dc6db455e41f1ed5f3b01ab1d8f4f6b9554d469", "9440684a26ccdbddee0ba9b0f587a482fba42be5",
"support" "support"
], ],
"interfaces/css-masking.idl": [ "interfaces/css-masking.idl": [
@ -639563,7 +639671,7 @@
"support" "support"
], ],
"interfaces/generic-sensor.idl": [ "interfaces/generic-sensor.idl": [
"fd794cb15f3bb067fb9663e12eac5cc8d6946acc", "2e7aacbec176dbd7dfd0707de9d0cc5efb00123f",
"support" "support"
], ],
"interfaces/geolocation-API.idl": [ "interfaces/geolocation-API.idl": [
@ -639591,7 +639699,7 @@
"support" "support"
], ],
"interfaces/html.idl": [ "interfaces/html.idl": [
"d46d1452eadbd3a1a7bb5aadd3a346818492daf1", "46d0b852f095a65c0019a9f6dd518963b26a9ac6",
"support" "support"
], ],
"interfaces/image-capture.idl": [ "interfaces/image-capture.idl": [
@ -639691,7 +639799,7 @@
"support" "support"
], ],
"interfaces/payment-request.idl": [ "interfaces/payment-request.idl": [
"63a9ccccad4d57356760a65cadbdd3faec47bce4", "53922d315cfd3de149f88d18baeccc852bb3dca1",
"support" "support"
], ],
"interfaces/performance-timeline.idl": [ "interfaces/performance-timeline.idl": [
@ -639703,7 +639811,7 @@
"support" "support"
], ],
"interfaces/picture-in-picture.idl": [ "interfaces/picture-in-picture.idl": [
"2e89cfd89791f5f1009f27115f2d40d12a655893", "164ec02a9cf208e3c56da82a9629b3bb674f27f0",
"support" "support"
], ],
"interfaces/pointerevents-extension.idl": [ "interfaces/pointerevents-extension.idl": [
@ -639779,7 +639887,7 @@
"support" "support"
], ],
"interfaces/shape-detection-api.idl": [ "interfaces/shape-detection-api.idl": [
"66c58896c300c47206462171b3063baedfff87db", "72fce2001cad5a465440ef996150e38ddee609cf",
"support" "support"
], ],
"interfaces/speech-api.idl": [ "interfaces/speech-api.idl": [
@ -639823,7 +639931,7 @@
"support" "support"
], ],
"interfaces/wasm-js-api.idl": [ "interfaces/wasm-js-api.idl": [
"6de14fb8f0895a72b69f37b9dd8b72e2ab1604e0", "2bd2ecba828df359fc61b18cde10ff9f7e80c4de",
"support" "support"
], ],
"interfaces/wasm-web-api.idl": [ "interfaces/wasm-web-api.idl": [
@ -639875,7 +639983,7 @@
"support" "support"
], ],
"interfaces/webrtc-stats.idl": [ "interfaces/webrtc-stats.idl": [
"cf07738b8b45c808a80895356699a5e04967e25e", "c86097b697b56f105abedfcd700d496f9687a153",
"support" "support"
], ],
"interfaces/webrtc.idl": [ "interfaces/webrtc.idl": [
@ -652907,19 +653015,19 @@
"support" "support"
], ],
"preload/link-header-preload-nonce.html": [ "preload/link-header-preload-nonce.html": [
"2db6eef569f1576a3d405c7f86f6eed8be10c9e2", "51b2224864d5a47c9642ded613efcfc702eb0f9d",
"testharness" "testharness"
], ],
"preload/link-header-preload-nonce.html.headers": [ "preload/link-header-preload-nonce.html.headers": [
"a3c41d2386ac10576497e3080ff1e6d97dccf6b8", "a54b69378e9cc785ee02ec4a37694f90c366403b",
"support" "support"
], ],
"preload/link-header-preload-srcset.tentative.html": [ "preload/link-header-preload-srcset.tentative.html": [
"70d34e525c1feb541fefd277f1ae06a6a5888a08", "9eb8ac4e00d20b9eb48ffd3a981b33b7604246f8",
"testharness" "testharness"
], ],
"preload/link-header-preload-srcset.tentative.html.headers": [ "preload/link-header-preload-srcset.tentative.html.headers": [
"1e4e9b85cac9a70ef01c994631402a5d452cad98", "906de0c95aeb58e24d1b7e779f1ed99de40d7af1",
"support" "support"
], ],
"preload/link-header-preload.html": [ "preload/link-header-preload.html": [
@ -662647,11 +662755,19 @@
"testharness" "testharness"
], ],
"resource-timing/resource_connection_reuse.html": [ "resource-timing/resource_connection_reuse.html": [
"7a31a7e1ab31d4d1a83fb5e2911b8ed95f0f2d92", "f347a0b23e15e9134ba2bf37fdafa4cab5e8d809",
"testharness" "testharness"
], ],
"resource-timing/resource_connection_reuse.https.html": [ "resource-timing/resource_connection_reuse.https.html": [
"bc79a8519b20659085b6cda9e98685a0aaf33785", "86864090a2eea7e62f7f204ec7baf4eccc9f6771",
"testharness"
],
"resource-timing/resource_connection_reuse_mixed_content.html": [
"51c04ee604c963cb248ca6cb6b536ef9bf21ee12",
"testharness"
],
"resource-timing/resource_connection_reuse_mixed_content_redirect.html": [
"a46d14c9f159ad2839546ed4f595d7e8d7cf4ffa",
"testharness" "testharness"
], ],
"resource-timing/resource_dedicated_worker.html": [ "resource-timing/resource_dedicated_worker.html": [
@ -662767,7 +662883,15 @@
"support" "support"
], ],
"resource-timing/resources/fake_responses.py": [ "resource-timing/resources/fake_responses.py": [
"f71693818cb726573e4d1f282b8d61fe8a87df6b", "289c179317671ba4e87c06bb89e815c8c449fd19",
"support"
],
"resource-timing/resources/fake_responses_https.sub.html": [
"cf49fb914bebe0c18d8af19a1a1362ae64217eb5",
"support"
],
"resource-timing/resources/fake_responses_https_redirect.sub.html": [
"c55e037d1dc15c1247c1a0ad2396c1416b577800",
"support" "support"
], ],
"resource-timing/resources/green_frame.htm": [ "resource-timing/resources/green_frame.htm": [
@ -665782,6 +665906,10 @@
"1e4acfb286c6bcf2375fc762f9d60ea2d9f1cdc4", "1e4acfb286c6bcf2375fc762f9d60ea2d9f1cdc4",
"testharness" "testharness"
], ],
"service-workers/service-worker/clients-get-resultingClientId.https.html": [
"3419cf14b523db41af70c7896d4aaa497441fb9b",
"testharness"
],
"service-workers/service-worker/clients-get.https.html": [ "service-workers/service-worker/clients-get.https.html": [
"4cfbf595cadeeea5fc8a5089127c5687ec174f53", "4cfbf595cadeeea5fc8a5089127c5687ec174f53",
"testharness" "testharness"
@ -666938,6 +667066,10 @@
"7fc35f18914c1345e0f5ccab93305938180fe9eb", "7fc35f18914c1345e0f5ccab93305938180fe9eb",
"support" "support"
], ],
"service-workers/service-worker/resources/get-resultingClientId-worker.js": [
"f0e6c7becab6126496fefa3f40a5e788dc64775b",
"support"
],
"service-workers/service-worker/resources/http-to-https-redirect-and-register-iframe.html": [ "service-workers/service-worker/resources/http-to-https-redirect-and-register-iframe.html": [
"bcab35364dff6f4494d73adfa150d800efc6bf70", "bcab35364dff6f4494d73adfa150d800efc6bf70",
"support" "support"
@ -668551,7 +668683,7 @@
"support" "support"
], ],
"signed-exchange/resources/sxg-util.js": [ "signed-exchange/resources/sxg-util.js": [
"7d592ea21431802655ce3134d50718ef37394a42", "67439c8a6e4f111d0095519a77dc0e6ffd380e2c",
"support" "support"
], ],
"signed-exchange/resources/sxg-version1b2.sxg": [ "signed-exchange/resources/sxg-version1b2.sxg": [
@ -677955,7 +678087,7 @@
"support" "support"
], ],
"tools/tox.ini": [ "tools/tox.ini": [
"3b0c6d172bc02e8df5fed5a08cd354416eff50dd", "975056ea2c272bd70e117231f0d57928727f6bd1",
"support" "support"
], ],
"tools/webdriver/.gitignore": [ "tools/webdriver/.gitignore": [
@ -678023,7 +678155,7 @@
"support" "support"
], ],
"tools/wpt/run.py": [ "tools/wpt/run.py": [
"633d6b254db289f50b77e4c7f589b888caa2b566", "df34e591568617616211e0f549872fe94c7568d8",
"support" "support"
], ],
"tools/wpt/testfiles.py": [ "tools/wpt/testfiles.py": [
@ -678039,11 +678171,11 @@
"support" "support"
], ],
"tools/wpt/tests/test_run.py": [ "tools/wpt/tests/test_run.py": [
"aaff0fa5331498f898dc36fcf36186cebe989927", "cd70fef5e8bf48d73a0e3cc36f11d28088140139",
"support" "support"
], ],
"tools/wpt/tests/test_wpt.py": [ "tools/wpt/tests/test_wpt.py": [
"1ddac67a39a368e44b94150a502caa0e32f8044f", "75cedf75ee016d975e2896268571f8217e8e1859",
"support" "support"
], ],
"tools/wpt/tox.ini": [ "tools/wpt/tox.ini": [
@ -678059,11 +678191,11 @@
"support" "support"
], ],
"tools/wpt/virtualenv.py": [ "tools/wpt/virtualenv.py": [
"0ce7054ae2227a6dbc46e6215274d776e80494c7", "b27529da7a7e0c9a2e9dc92faac7200405a8a508",
"support" "support"
], ],
"tools/wpt/wpt.py": [ "tools/wpt/wpt.py": [
"55802461553abe63655a359393cfac2fbf174df1", "909d435b6485f7e78c996ef02960160b53a0851c",
"support" "support"
], ],
"tools/wptrunner/.gitignore": [ "tools/wptrunner/.gitignore": [
@ -679182,18 +679314,6 @@
"172d566e57fc635b551b5d355661db690869b220", "172d566e57fc635b551b5d355661db690869b220",
"testharness" "testharness"
], ],
"trusted-types/WorkerGlobalScope-importScripts.https.html": [
"30dea82077c59d8bd9b95985dd1383ea47733534",
"testharness"
],
"trusted-types/WorkerGlobalScope-importScripts.https.js": [
"4e491b9fe601b2dba1f1acafbbec9f502f2e6671",
"support"
],
"trusted-types/WorkerGlobalScope-importScripts.https.js.headers": [
"1bc33add09b4b34ce2cba21f488f8ed53345a27a",
"support"
],
"trusted-types/block-string-assignment-to-DOMParser-parseFromString.tentative.html": [ "trusted-types/block-string-assignment-to-DOMParser-parseFromString.tentative.html": [
"4446a58836695355efd0fbf3f9f5a0bd6c60c8a3", "4446a58836695355efd0fbf3f9f5a0bd6c60c8a3",
"testharness" "testharness"
@ -684059,7 +684179,7 @@
"support" "support"
], ],
"webdriver/tests/perform_actions/support/keys.py": [ "webdriver/tests/perform_actions/support/keys.py": [
"487381d5b29b7003b84b313e098d6045b04aa1b3", "68e37b34e0303c89d64654ddc9cf8bba5fc92f67",
"support" "support"
], ],
"webdriver/tests/perform_actions/support/mouse.py": [ "webdriver/tests/perform_actions/support/mouse.py": [
@ -684935,7 +685055,7 @@
"testharness" "testharness"
], ],
"webrtc/RTCIceCandidate-constructor.html": [ "webrtc/RTCIceCandidate-constructor.html": [
"9842593a83c5330e0ed19bedac9f6c9908362c41", "cad0464a3c045a000270127ce50f89798f9eca0b",
"testharness" "testharness"
], ],
"webrtc/RTCIceTransport-extension-helper.js": [ "webrtc/RTCIceTransport-extension-helper.js": [
@ -684943,7 +685063,7 @@
"support" "support"
], ],
"webrtc/RTCIceTransport-extension.https.html": [ "webrtc/RTCIceTransport-extension.https.html": [
"7803bde9b3aa61f6ac500d62c8a3aed79b1a1412", "e9e70379a483e1456259b521fc8094689aa15373",
"testharness" "testharness"
], ],
"webrtc/RTCIceTransport.html": [ "webrtc/RTCIceTransport.html": [
@ -686298,6 +686418,10 @@
"6b70aa5ac9d3d6a9d4a42013455d3992fbb5b9e9", "6b70aa5ac9d3d6a9d4a42013455d3992fbb5b9e9",
"support" "support"
], ],
"webstorage/defineProperty.window.js": [
"d8ab163df68332af6236c25335bb41e5c04fe33c",
"testharness"
],
"webstorage/document-domain.html": [ "webstorage/document-domain.html": [
"3232b0d508121222a6ff523b1aebd3540aad8f89", "3232b0d508121222a6ff523b1aebd3540aad8f89",
"testharness" "testharness"
@ -686458,6 +686582,10 @@
"bc134af32b1e5b5063add18db0c044ed85f37be4", "bc134af32b1e5b5063add18db0c044ed85f37be4",
"support" "support"
], ],
"webstorage/set.window.js": [
"479ad588910b907e6e9fe41d5080b744a22a54fe",
"testharness"
],
"webstorage/storage_builtins.html": [ "webstorage/storage_builtins.html": [
"2ae06d55b007cf35777665356fcd95ec48047420", "2ae06d55b007cf35777665356fcd95ec48047420",
"testharness" "testharness"
@ -689662,20 +689790,12 @@
"3e54e367787cb95dada398790fe23b10174df29f", "3e54e367787cb95dada398790fe23b10174df29f",
"testharness" "testharness"
], ],
"webxr/navigator_xr_requestDevice.https.html": [
"c51dd8db165a14514dcf364c760b8da6a81af0b0",
"testharness"
],
"webxr/navigator_xr_requestDevice_no_device.https.html": [
"3cd149bb0ce0df4b7006f4d99a83d2de09e0f282",
"testharness"
],
"webxr/resources/webxr_check.html": [ "webxr/resources/webxr_check.html": [
"2d8e5b387dc88588921ccfa49dd14db58009900c", "2d8e5b387dc88588921ccfa49dd14db58009900c",
"support" "support"
], ],
"webxr/resources/webxr_util.js": [ "webxr/resources/webxr_util.js": [
"10bdc12810c3b34d140e6f04b0068c28c9dc1873", "7344fa05f655cded22a3ba9b099a8726a0c4beb3",
"support" "support"
], ],
"webxr/webGLCanvasContext_create_xrcompatible.https.html": [ "webxr/webGLCanvasContext_create_xrcompatible.https.html": [
@ -689691,63 +689811,67 @@
"testharness" "testharness"
], ],
"webxr/xrDevice_requestSession_immersive.https.html": [ "webxr/xrDevice_requestSession_immersive.https.html": [
"e9e7b9bc131b12d68fa8a2886967a7395a5b0f99", "c5956e7f3d12745638092558abb0b41749fb16d6",
"testharness" "testharness"
], ],
"webxr/xrDevice_requestSession_immersive_no_gesture.https.html": [ "webxr/xrDevice_requestSession_immersive_no_gesture.https.html": [
"9f0f5f3d8ae0c4b7cb8794ad41cd1015cd942374", "c1b3286709d3a7d4dc45029253e3bbffb579e237",
"testharness" "testharness"
], ],
"webxr/xrDevice_requestSession_immersive_unsupported.https.html": [ "webxr/xrDevice_requestSession_immersive_unsupported.https.html": [
"e0d2688e997be1c765e3e146ff1eb0db212b976e", "60e9e6cc6e1c0fa990af396e42418bb16984a5e8",
"testharness" "testharness"
], ],
"webxr/xrDevice_requestSession_non_immersive_no_gesture.https.html": [ "webxr/xrDevice_requestSession_non_immersive_no_gesture.https.html": [
"1634dfe9cba3a6798652613c407ec21b5e3c4d8e", "6cf50f521c4836dede6f763b6e7f3e263e30f68e",
"testharness" "testharness"
], ],
"webxr/xrDevice_supportsSession_immersive.https.html": [ "webxr/xrDevice_supportsSession_immersive.https.html": [
"3ca5eb11c53baa319c5188f74c6a0651801e0183", "c0b47013f9d11ad292fdef2e51968c3a28c35f55",
"testharness" "testharness"
], ],
"webxr/xrDevice_supportsSession_immersive_unsupported.https.html": [ "webxr/xrDevice_supportsSession_immersive_unsupported.https.html": [
"0c1dd25869fcad3a442cde8e849365f0f326b3c9", "2b17b96b1bc11693c87b931a5debc0e4f1c2336c",
"testharness" "testharness"
], ],
"webxr/xrDevice_supportsSession_non_immersive.https.html": [ "webxr/xrDevice_supportsSession_non_immersive.https.html": [
"535b0bcbbc282ee5aaa7500cbd3a35ba21fed3d4", "69a35c2510983550993f630ea6f0a165c2e89369",
"testharness" "testharness"
], ],
"webxr/xrSession_cancelAnimationFrame.https.html": [ "webxr/xrSession_cancelAnimationFrame.https.html": [
"26c0e95605468634c9bc65bf959260e594998a2d", "9b08f93eead693c1c9aa6d7e2458988aa7dae442",
"testharness" "testharness"
], ],
"webxr/xrSession_cancelAnimationFrame_invalidhandle.https.html": [ "webxr/xrSession_cancelAnimationFrame_invalidhandle.https.html": [
"4f4b8dfe5ff47b4433f0de0d244b12dd434eaa0d", "bc9b625fb9ed2e9001da1ddaf0a01230631b084e",
"testharness" "testharness"
], ],
"webxr/xrSession_end.https.html": [ "webxr/xrSession_end.https.html": [
"69bbda85fda9f732a0d682cf57be53115eb73854", "2719bdd7dd1b4a73e8b2004f477beecf03d131bb",
"testharness"
],
"webxr/xrSession_mode.https.html": [
"4b54d9480211b3641997f78a61dfdc7058592ecd",
"testharness" "testharness"
], ],
"webxr/xrSession_prevent_multiple_exclusive.https.html": [ "webxr/xrSession_prevent_multiple_exclusive.https.html": [
"ff3eaef81dd19d945a8c7128c7b5e677ea450689", "c2e7f3bf444d38506f6a54c2cf9904c2927b2ad5",
"testharness" "testharness"
], ],
"webxr/xrSession_requestAnimationFrame_callback_calls.https.html": [ "webxr/xrSession_requestAnimationFrame_callback_calls.https.html": [
"48dc88779abcdd37a3778f860473569f7c55c6de", "268efcd596e03125e3f7b90fa7f08eba2ae716a8",
"testharness" "testharness"
], ],
"webxr/xrSession_requestAnimationFrame_data_valid.https.html": [ "webxr/xrSession_requestAnimationFrame_data_valid.https.html": [
"b5f4f180c1a911e7260310da34b32891443001c8", "f873a11588045d612cb16f2487a6efa14b555679",
"testharness" "testharness"
], ],
"webxr/xrSession_requestAnimationFrame_getViewerPose.https.html": [ "webxr/xrSession_requestAnimationFrame_getViewerPose.https.html": [
"17b5307f019dc7ec4696dbceef5eb3d5cd21d361", "ca6a71758c691e16aad512e68c83e2fd42a8efbb",
"testharness" "testharness"
], ],
"webxr/xrSession_requestReferenceSpace.https.html": [ "webxr/xrSession_requestReferenceSpace.https.html": [
"d97852c917bc8f42f4999e5b0d1c13a7fef364ab", "1eb49e0b875b1c686c9f5474c007af8c9d4790d0",
"testharness" "testharness"
], ],
"workers/META.yml": [ "workers/META.yml": [
@ -690943,7 +691067,7 @@
"testharness" "testharness"
], ],
"workers/semantics/run-a-worker/003.html": [ "workers/semantics/run-a-worker/003.html": [
"8c2f07ee7305a7a6d83e3c2cd8aaf4367fac35ab", "e96c176f20ab6aa6f01dc25184778abe9e861fd1",
"testharness" "testharness"
], ],
"workers/semantics/structured-clone/dedicated.html": [ "workers/semantics/structured-clone/dedicated.html": [

View file

@ -4,68 +4,115 @@
[CSSFontFaceRule interface: attribute style] [CSSFontFaceRule interface: attribute style]
expected: FAIL expected: FAIL
[CSSFontFeatureValuesRule interface: existence and properties of interface object] [CSSFontFeatureValuesRule interface: existence and properties of interface object]
expected: FAIL expected: FAIL
[CSSFontFeatureValuesRule interface object length] [CSSFontFeatureValuesRule interface object length]
expected: FAIL expected: FAIL
[CSSFontFeatureValuesRule interface object name] [CSSFontFeatureValuesRule interface object name]
expected: FAIL expected: FAIL
[CSSFontFeatureValuesRule interface: existence and properties of interface prototype object] [CSSFontFeatureValuesRule interface: existence and properties of interface prototype object]
expected: FAIL expected: FAIL
[CSSFontFeatureValuesRule interface: existence and properties of interface prototype object's "constructor" property] [CSSFontFeatureValuesRule interface: existence and properties of interface prototype object's "constructor" property]
expected: FAIL expected: FAIL
[CSSFontFeatureValuesRule interface: existence and properties of interface prototype object's @@unscopables property] [CSSFontFeatureValuesRule interface: existence and properties of interface prototype object's @@unscopables property]
expected: FAIL expected: FAIL
[CSSFontFeatureValuesRule interface: attribute fontFamily] [CSSFontFeatureValuesRule interface: attribute fontFamily]
expected: FAIL expected: FAIL
[CSSFontFeatureValuesRule interface: attribute annotation] [CSSFontFeatureValuesRule interface: attribute annotation]
expected: FAIL expected: FAIL
[CSSFontFeatureValuesRule interface: attribute ornaments] [CSSFontFeatureValuesRule interface: attribute ornaments]
expected: FAIL expected: FAIL
[CSSFontFeatureValuesRule interface: attribute stylistic] [CSSFontFeatureValuesRule interface: attribute stylistic]
expected: FAIL expected: FAIL
[CSSFontFeatureValuesRule interface: attribute swash] [CSSFontFeatureValuesRule interface: attribute swash]
expected: FAIL expected: FAIL
[CSSFontFeatureValuesRule interface: attribute characterVariant] [CSSFontFeatureValuesRule interface: attribute characterVariant]
expected: FAIL expected: FAIL
[CSSFontFeatureValuesRule interface: attribute styleset] [CSSFontFeatureValuesRule interface: attribute styleset]
expected: FAIL expected: FAIL
[CSSFontFeatureValuesMap interface: existence and properties of interface object] [CSSFontFeatureValuesMap interface: existence and properties of interface object]
expected: FAIL expected: FAIL
[CSSFontFeatureValuesMap interface object length] [CSSFontFeatureValuesMap interface object length]
expected: FAIL expected: FAIL
[CSSFontFeatureValuesMap interface object name] [CSSFontFeatureValuesMap interface object name]
expected: FAIL expected: FAIL
[CSSFontFeatureValuesMap interface: existence and properties of interface prototype object] [CSSFontFeatureValuesMap interface: existence and properties of interface prototype object]
expected: FAIL expected: FAIL
[CSSFontFeatureValuesMap interface: existence and properties of interface prototype object's "constructor" property] [CSSFontFeatureValuesMap interface: existence and properties of interface prototype object's "constructor" property]
expected: FAIL expected: FAIL
[CSSFontFeatureValuesMap interface: existence and properties of interface prototype object's @@unscopables property] [CSSFontFeatureValuesMap interface: existence and properties of interface prototype object's @@unscopables property]
expected: FAIL expected: FAIL
[CSSFontFeatureValuesMap interface: operation set(CSSOMString, \[object Object\],\[object Object\])]
[CSSFontFeatureValuesMap interface: operation set(CSSOMString, [object Object\],[object Object\])]
expected: FAIL expected: FAIL
[CSSFontPaletteValuesRule interface: existence and properties of interface object] [CSSFontPaletteValuesRule interface: existence and properties of interface object]
expected: FAIL expected: FAIL
[CSSFontPaletteValuesRule interface object length] [CSSFontPaletteValuesRule interface object length]
expected: FAIL expected: FAIL
[CSSFontPaletteValuesRule interface object name] [CSSFontPaletteValuesRule interface object name]
expected: FAIL expected: FAIL
[CSSFontPaletteValuesRule interface: existence and properties of interface prototype object] [CSSFontPaletteValuesRule interface: existence and properties of interface prototype object]
expected: FAIL expected: FAIL
[CSSFontPaletteValuesRule interface: existence and properties of interface prototype object's "constructor" property] [CSSFontPaletteValuesRule interface: existence and properties of interface prototype object's "constructor" property]
expected: FAIL expected: FAIL
[CSSFontPaletteValuesRule interface: existence and properties of interface prototype object's @@unscopables property] [CSSFontPaletteValuesRule interface: existence and properties of interface prototype object's @@unscopables property]
expected: FAIL expected: FAIL
[CSSFontPaletteValuesRule interface: attribute fontFamily] [CSSFontPaletteValuesRule interface: attribute fontFamily]
expected: FAIL expected: FAIL
[CSSFontPaletteValuesRule interface: attribute basePalette] [CSSFontPaletteValuesRule interface: attribute basePalette]
expected: FAIL expected: FAIL
[CSSRule interface: constant FONT_FEATURE_VALUES_RULE on interface object] [CSSRule interface: constant FONT_FEATURE_VALUES_RULE on interface object]
expected: FAIL expected: FAIL
[CSSRule interface: constant FONT_FEATURE_VALUES_RULE on interface prototype object] [CSSRule interface: constant FONT_FEATURE_VALUES_RULE on interface prototype object]
expected: FAIL expected: FAIL
[CSSRule interface: constant FONT_PALETTE_VALUES_RULE on interface object] [CSSRule interface: constant FONT_PALETTE_VALUES_RULE on interface object]
expected: FAIL expected: FAIL
[CSSRule interface: constant FONT_PALETTE_VALUES_RULE on interface prototype object] [CSSRule interface: constant FONT_PALETTE_VALUES_RULE on interface prototype object]
expected: FAIL expected: FAIL
[CSSFontFaceRule interface: cssFontFaceRule must inherit property "style" with the proper type]
expected: FAIL
[CSSRule interface: cssRule must inherit property "FONT_PALETTE_VALUES_RULE" with the proper type]
expected: FAIL
[CSSRule interface: cssFontFaceRule must inherit property "FONT_PALETTE_VALUES_RULE" with the proper type]
expected: FAIL
[CSSRule interface: cssFontFaceRule must inherit property "FONT_FEATURE_VALUES_RULE" with the proper type]
expected: FAIL
[CSSRule interface: cssRule must inherit property "FONT_FEATURE_VALUES_RULE" with the proper type]
expected: FAIL

View file

@ -1079,9 +1079,3 @@
[text-indent percentage(%) / values] [text-indent percentage(%) / values]
expected: FAIL expected: FAIL
[padding-left length(px) / values]
expected: FAIL
[padding-bottom length(ex) / values]
expected: FAIL

View file

@ -6,3 +6,6 @@
[Instant scrolling while doing history navigation.] [Instant scrolling while doing history navigation.]
expected: FAIL expected: FAIL
[Smooth scrolling while doing history navigation.]
expected: FAIL

View file

@ -32,7 +32,7 @@
[single-byte-decoder.html?XMLHttpRequest] [single-byte-decoder.html?XMLHttpRequest]
expected: CRASH expected: TIMEOUT
[ISO-8859-2: iso_8859-2:1987 (XMLHttpRequest)] [ISO-8859-2: iso_8859-2:1987 (XMLHttpRequest)]
expected: FAIL expected: FAIL
@ -55,7 +55,7 @@
expected: FAIL expected: FAIL
[windows-1252: iso_8859-1:1987 (XMLHttpRequest)] [windows-1252: iso_8859-1:1987 (XMLHttpRequest)]
expected: FAIL expected: TIMEOUT
[windows-1254: iso_8859-9:1989 (XMLHttpRequest)] [windows-1254: iso_8859-9:1989 (XMLHttpRequest)]
expected: TIMEOUT expected: TIMEOUT
@ -126,5 +126,41 @@
[x-mac-cyrillic: x-mac-cyrillic (XMLHttpRequest)] [x-mac-cyrillic: x-mac-cyrillic (XMLHttpRequest)]
expected: TIMEOUT expected: TIMEOUT
[windows-1253: x-cp1253 (XMLHttpRequest)]
expected: TIMEOUT
[windows-1252: iso_8859-1 (XMLHttpRequest)]
expected: TIMEOUT
[windows-1252: latin1 (XMLHttpRequest)]
expected: TIMEOUT
[windows-1255: x-cp1255 (XMLHttpRequest)]
expected: TIMEOUT
[windows-1253: windows-1253 (XMLHttpRequest)]
expected: TIMEOUT
[windows-1252: x-cp1252 (XMLHttpRequest)]
expected: TIMEOUT
[windows-1255: cp1255 (XMLHttpRequest)]
expected: TIMEOUT
[windows-1252: l1 (XMLHttpRequest)]
expected: TIMEOUT
[windows-1255: windows-1255 (XMLHttpRequest)]
expected: TIMEOUT
[windows-1252: windows-1252 (XMLHttpRequest)]
expected: TIMEOUT
[windows-1252: us-ascii (XMLHttpRequest)]
expected: TIMEOUT
[windows-1256: windows-1256 (XMLHttpRequest)]
expected: TIMEOUT
[single-byte-decoder.html?TextDecoder] [single-byte-decoder.html?TextDecoder]

View file

@ -312,3 +312,6 @@
[<iframe>: separate response Content-Type: text/plain */*;charset=gbk] [<iframe>: separate response Content-Type: text/plain */*;charset=gbk]
expected: FAIL expected: FAIL
[<iframe>: separate response Content-Type: text/plain;charset=gbk text/html]
expected: FAIL

View file

@ -0,0 +1,4 @@
[stale-css.tentative.html]
[Cache returns stale resource]
expected: FAIL

View file

@ -0,0 +1,5 @@
[stale-image.tentative.html]
expected: TIMEOUT
[Cache returns stale resource]
expected: TIMEOUT

View file

@ -0,0 +1,4 @@
[stale-script.tentative.html]
[Cache returns stale resource]
expected: FAIL

View file

@ -0,0 +1,4 @@
[navigation-unload-same-origin-fragment.html]
[Tests that a fragment navigation in the unload handler will not block the initial navigation]
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

@ -10970,3 +10970,30 @@
[OffscreenCanvasRenderingContext2D interface: attribute textBaseline] [OffscreenCanvasRenderingContext2D interface: attribute textBaseline]
expected: FAIL expected: FAIL
[External interface: existence and properties of interface prototype object's "constructor" property]
expected: FAIL
[External must be primary interface of window.external]
expected: FAIL
[External interface object name]
expected: FAIL
[External interface: operation AddSearchProvider()]
expected: FAIL
[External interface: operation IsSearchProviderInstalled()]
expected: FAIL
[External interface: existence and properties of interface prototype object]
expected: FAIL
[External interface: existence and properties of interface object]
expected: FAIL
[External interface object length]
expected: FAIL
[External interface: existence and properties of interface prototype object's @@unscopables property]
expected: FAIL

View file

@ -0,0 +1,7 @@
[toggleEvent.html]
[Calling open twice on 'details' fires only one toggle event]
expected: FAIL
[Setting open=true to opened 'details' element should not fire a toggle event at the 'details' element]
expected: FAIL

View file

@ -0,0 +1,5 @@
[promise-rejection-events.html]
expected: TIMEOUT
[rejectionhandled is dispatched from a queued task, and not immediately]
expected: TIMEOUT

View file

@ -0,0 +1,4 @@
[resource_connection_reuse_mixed_content.html]
[There should be 2 PerformanceEntries]
expected: FAIL

View file

@ -0,0 +1,4 @@
[resource_connection_reuse_mixed_content_redirect.html]
[There should be 2 PerformanceEntries]
expected: FAIL

View file

@ -101,6 +101,15 @@
[Module must be primary interface of mod] [Module must be primary interface of mod]
expected: FAIL expected: FAIL
[Module interface: calling customSections(Module, DOMString) on mod with too few arguments must throw TypeError]
expected: FAIL
[Module interface: operation customSections(Module, DOMString)]
expected: FAIL
[Module interface: mod must inherit property "customSections(Module, DOMString)" with the proper type]
expected: FAIL
[idlharness.any.html] [idlharness.any.html]
[Global interface: existence and properties of interface prototype object's "constructor" property] [Global interface: existence and properties of interface prototype object's "constructor" property]
@ -205,3 +214,12 @@
[Module must be primary interface of mod] [Module must be primary interface of mod]
expected: FAIL expected: FAIL
[Module interface: calling customSections(Module, DOMString) on mod with too few arguments must throw TypeError]
expected: FAIL
[Module interface: operation customSections(Module, DOMString)]
expected: FAIL
[Module interface: mod must inherit property "customSections(Module, DOMString)" with the proper type]
expected: FAIL

View file

@ -0,0 +1,7 @@
[set.window.html]
[Setting property for key x on localStorage with accessor property on prototype]
expected: FAIL
[Setting property for key x on sessionStorage with accessor property on prototype]
expected: FAIL

View file

@ -1,5 +1,4 @@
[import-in-moduleworker.html] [import-in-moduleworker.html]
expected: ERROR
[Base URL in module dedicated workers: import] [Base URL in module dedicated workers: import]
expected: FAIL expected: FAIL

View file

@ -1,5 +1,6 @@
[003.html] [003.html]
type: testharness type: testharness
expected: ERROR
[shared] [shared]
expected: FAIL expected: FAIL

View file

@ -0,0 +1,2 @@
[transition_calc_implicit.html]
expected: TIMEOUT

View file

@ -1,4 +0,0 @@
[paint_timing.html]
[Performance entries observer]
expected: FAIL

View file

@ -30,9 +30,3 @@ function waitForAsyncAnimationFrames(count) {
// AnimationWorklet. // AnimationWorklet.
return waitForAnimationFrames(count + 1); return waitForAnimationFrames(count + 1);
} }
async function waitForAnimationFrameWithCondition(condition) {
do {
await new Promise(window.requestAnimationFrame);
} while (!condition())
};

View file

@ -1,11 +0,0 @@
<!DOCTYPE html>
<style>
#box {
width: 100px;
height: 100px;
transform: translateY(100px);
background-color: green;
}
</style>
<div id="box"></div>

View file

@ -1,37 +0,0 @@
<!DOCTYPE html>
<html class="reftest-wait">
<title>Verify that calling pause immediately after playing works as expected</title>
<link rel="help" href="https://drafts.css-houdini.org/css-animationworklet/">
<link rel="match" href="references/translated-box-ref.html">
<script src="/common/reftest-wait.js"></script>
<script src="/web-animations/testcommon.js"></script>
<script src="common.js"></script>
<style>
#box {
width: 100px;
height: 100px;
background-color: green;
}
</style>
<div id="box"></div>
<script>
registerPassthroughAnimator().then(async _ => {
const box = document.getElementById('box');
const effect = new KeyframeEffect(box,
{ transform: ['translateY(100px)', 'translateY(200px)'] },
{ duration: 100, iterations: 1 }
);
const animation = new WorkletAnimation('passthrough', effect);
animation.play();
// Immediately pausing animation should freeze the current time at 0.
animation.pause();
// Wait at least one frame to ensure a paused animation actually freezes.
await waitForAsyncAnimationFrames(1);
takeScreenshot();
});
</script>
</html>

View file

@ -1,40 +0,0 @@
<!DOCTYPE html>
<html class="reftest-wait">
<title>Verify that calling pause immediately after playing works as expected</title>
<link rel="help" href="https://drafts.css-houdini.org/css-animationworklet/">
<link rel="match" href="references/translated-box-ref.html">
<script src="/common/reftest-wait.js"></script>
<script src="common.js"></script>
<style>
#box {
width: 100px;
height: 100px;
background-color: green;
}
</style>
<div id="box"></div>
<script>
registerPassthroughAnimator().then(async _ => {
const duration = 18; // a bit longer than a frame
const box = document.getElementById('box');
const effect = new KeyframeEffect(box,
{ transform: ['translateY(0px)', 'translateY(100px)'] },
{ duration: duration, iterations: 1, fill: 'forwards'}
);
const animation = new WorkletAnimation('passthrough', effect);
// Immediately pausing animation should freeze the current time at 0.
animation.pause();
// Playing should cause animation to resume.
animation.play();
// Wait until we ensure animation has reached completion.
await waitForAnimationFrameWithCondition( _ => {
return animation.currentTime >= duration;
});
takeScreenshot();
});
</script>
</html>

View file

@ -1,58 +0,0 @@
<!DOCTYPE html>
<title>Verify that currentTime and playState are correct when animation is paused</title>
<link rel="help" href="https://drafts.css-houdini.org/css-animationworklet/">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/web-animations/testcommon.js"></script>
<script src="common.js"></script>
<div id="box"></div>
<script>
setup(setupAndRegisterTests, {explicit_done: true});
function createAnimation() {
const box = document.getElementById('box');
const effect = new KeyframeEffect(box,
{ transform: ['translateY(100px)', 'translateY(200px)'] },
{ duration: 100, iterations: 1 }
);
return new WorkletAnimation('passthrough', effect);
}
async function setupAndRegisterTests() {
await registerPassthroughAnimator();
promise_test(async t => {
const animation = createAnimation();
animation.play();
// Immediately pausing animation should freeze the current time at 0.
animation.pause();
assert_equals(animation.currentTime, 0);
assert_equals(animation.playState, "paused");
// Wait some time to ensure a paused animation actually freezes.
await waitForNextFrame();
assert_equals(animation.currentTime, 0);
assert_equals(animation.playState, "paused");
}, 'pausing an animation freezes its current time');
promise_test(async t => {
const animation = createAnimation();
const startTime = document.timeline.currentTime;
animation.pause();
animation.play();
await waitForNextFrame();
const timelineTime = document.timeline.currentTime;
assert_equals(animation.playState, "running");
assert_greater_than(animation.currentTime, 0);
assert_times_equal(animation.currentTime, (timelineTime - startTime));
}, 'playing a paused animation should resume it');
done();
}
</script>

View file

@ -3,12 +3,22 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<title>css-conditional IDL tests</title> <title>CSS Conditional Rules IDL tests</title>
<link rel="help" href="https://drafts.csswg.org/css-conditional/"> <link rel="help" href="https://drafts.csswg.org/css-conditional/">
<script src="/resources/testharness.js"></script> <script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script> <script src="/resources/testharnessreport.js"></script>
<script src="/resources/WebIDLParser.js"></script> <script src="/resources/WebIDLParser.js"></script>
<script src="/resources/idlharness.js"></script> <script src="/resources/idlharness.js"></script>
<!-- used to provide objects -->
<style>
div { display: block; }
</style>
<style>
@media print { }
</style>
<style>
@supports (display: block) { }
</style>
</head> </head>
<body> <body>
@ -16,16 +26,20 @@
<script> <script>
'use strict'; 'use strict';
promise_test(async () => { idl_test(
const idl = await fetch('/interfaces/css-conditional.idl').then(r => r.text()); ['css-conditional'],
const cssom = await fetch('/interfaces/cssom.idl').then(r => r.text()); ['cssom', 'dom'],
const dom = await fetch('/interfaces/dom.idl').then(r => r.text()); idl_array => {
const idl_array = new IdlArray(); idl_array.add_objects({
idl_array.add_idls(idl); CSSRule: ['cssRule'],
idl_array.add_dependency_idls(cssom); CSSMediaRule: ['cssMediaRule'],
idl_array.add_dependency_idls(dom); CSSSupportsRule: ['cssSupportsRule'],
idl_array.test(); });
}, 'Test css-conditional IDL implementation'); self.cssRule = document.styleSheets[0].cssRules[0];
self.cssMediaRule = document.styleSheets[1].cssRules[0];
self.cssSupportsRule = document.styleSheets[2].cssRules[0];
}
);
</script> </script>
</body> </body>

View file

@ -1,19 +1,34 @@
<!doctype html> <!doctype html>
<title>css-fonts IDL tests</title> <title>CSS Fonts IDL tests</title>
<link rel="help" href="https://drafts.csswg.org/css-fonts-4/"> <link rel="help" href="https://drafts.csswg.org/css-fonts-4/">
<script src="/resources/testharness.js"></script> <script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script> <script src="/resources/testharnessreport.js"></script>
<script src="/resources/WebIDLParser.js"></script> <script src="/resources/WebIDLParser.js"></script>
<script src="/resources/idlharness.js"></script> <script src="/resources/idlharness.js"></script>
<style>
div { display: block; }
</style>
<style>
@font-face {
font-family: fwf;
src: url(support/fonts/FontWithFancyFeatures.otf);
}
</style>
<script> <script>
"use strict"; "use strict";
promise_test(async () => { idl_test(
const idl_array = new IdlArray(); ["css-fonts"],
const idl = await fetch("/interfaces/css-fonts.idl").then(r => r.text()); ["cssom"],
const cssom = await fetch("/interfaces/cssom.idl").then(r => r.text()); idl_array => {
idl_array.add_idls(idl); idl_array.add_objects({
idl_array.add_dependency_idls(cssom); CSSRule: ['cssRule'],
idl_array.test(); CSSFontFaceRule: ['cssFontFaceRule'],
}, "Test IDL implementation of css-fonts API"); });
self.cssRule = document.styleSheets[0].cssRules[0];
self.cssFontFaceRule = document.styleSheets[1].cssRules[0];
}
);
</script> </script>

View file

@ -8,19 +8,9 @@
<script> <script>
"use strict"; "use strict";
promise_test(async () => { idl_test(
const idl_array = new IdlArray(); ["css-paint-api"],
const idl = await fetch("/interfaces/css-paint-api.idl").then(r => r.text()); ["cssom", "html", "worklets"]
const cssom = await fetch("/interfaces/cssom.idl").then(r => r.text()); // No objects in Window global
const html = await fetch("/interfaces/html.idl").then(r => r.text()); );
idl_array.add_idls(idl);
idl_array.add_dependency_idls(cssom);
idl_array.add_dependency_idls(html);
idl_array.add_untested_idls(`
[Exposed=Worklet]
interface WorkletGlobalScope {
attribute Console console;
};`);
idl_array.test();
}, "Test IDL implementation of CSS Painting API");
</script> </script>

View file

@ -8,13 +8,9 @@
<script> <script>
"use strict"; "use strict";
promise_test(async () => { idl_test(
const idl = await fetch("/interfaces/css-properties-values-api.idl").then(r => r.text()); ["css-properties-values-api"],
const cssom = await fetch("/interfaces/cssom.idl").then(r => r.text()); ["cssom"]
// No objects
const idl_array = new IdlArray(); );
idl_array.add_idls(idl);
idl_array.add_dependency_idls(cssom);
idl_array.test();
}, "Test IDL implementation of CSS Properties Values API");
</script> </script>

View file

@ -0,0 +1,125 @@
<!doctype html>
<title>An+B Parsing</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<style>
foo { color: blue; }
</style>
<meta name="author" title="Tab Atkins-Bittner">
<link rel=help href="https://drafts.csswg.org/css-syntax/#the-anb-type">
<script>
function roundtripANB(str) {
const rule = document.styleSheets[0].cssRules[0];
rule.selectorText = "foo";
rule.selectorText = `:nth-child(${str})`;
// Check for parse error.
if(rule.selectorText == "foo") return "parse error";
return rule.selectorText.slice(11, -1);
}
function testANB(input, expected) {
test(()=>{
assert_equals(roundtripANB(input), expected);
}, `"${input}" becomes "${expected}"`);
}
/* Just going down all the syntax clauses one-by-one */
// odd | even |
testANB("odd", "2n+1");
testANB("even", "2n");
// <integer> |
testANB("1", "1");
testANB("+1", "1");
testANB("-1", "-1");
//
// <n-dimension> |
testANB("5n", "5n");
testANB("5N", "5n");
// '+'?† n |
testANB("+n", "n");
testANB("n", "n");
testANB("N", "n");
testANB("+ n", "parse error");
// -n |
testANB("-n", "-n");
testANB("-N", "-n");
//
// <ndashdigit-dimension> |
testANB("5n-5", "5n-5");
// '+'?† <ndashdigit-ident> |
testANB("+n-5", "n-5");
testANB("n-5", "n-5");
testANB("+ n-5", "parse error");
// <dashndashdigit-ident> |
testANB("-n-5", "-n-5");
//
// <n-dimension> <signed-integer> |
testANB("5n +5", "5n+5");
testANB("5n -5", "5n-5");
// '+'?† n <signed-integer> |
testANB("+n +5", "n+5");
testANB("n +5", "n+5");
testANB("+n -5", "n-5");
testANB("+ n +5", "parse error");
testANB("n 5", "parse error");
// -n <signed-integer> |
testANB("-n +5", "-n+5");
testANB("-n -5", "-n-5");
testANB("-n 5", "parse error");
//
// <ndash-dimension> <signless-integer> |
testANB("5n- 5", "5n-5");
testANB("5n- -5", "parse error");
testANB("5n- +5", "parse error");
testANB("-5n- 5", "-5n-5");
// '+'?† n- <signless-integer> |
testANB("+n- 5", "n-5");
testANB("n- 5", "n-5");
testANB("+ n- 5", "parse error");
testANB("n- +5", "parse error");
testANB("n- -5", "parse error");
// -n- <signless-integer> |
testANB("-n- 5", "-n-5");
testANB("-n- +5", "parse error");
testANB("-n- -5", "parse error");
//
// <n-dimension> ['+' | '-'] <signless-integer>
testANB("5n + 5", "5n+5");
testANB("5n - 5", "5n-5");
testANB("5n + +5", "parse error");
testANB("5n + -5", "parse error");
testANB("5n - +5", "parse error");
testANB("5n - -5", "parse error");
// '+'?† n ['+' | '-'] <signless-integer> |
testANB("+n + 5", "n+5");
testANB("n + 5", "n+5");
testANB("+ n + 5", "parse error");
testANB("+n - 5", "n-5");
testANB("+n + +5", "parse error");
testANB("+n + -5", "parse error");
testANB("+n - +5", "parse error");
testANB("+n - -5", "parse error");
// -n ['+' | '-'] <signless-integer>
testANB("-n + 5", "-n+5");
testANB("-n - 5", "-n-5");
testANB("-n + +5", "parse error");
testANB("-n + -5", "parse error");
testANB("-n - +5", "parse error");
testANB("-n - -5", "parse error");
/* Swapped ordering is invalid */
testANB("1 - n", "parse error");
testANB("0 - n", "parse error");
testANB("-1 + n", "parse error");
/* Odd space usage */
testANB("2 n + 2", "parse error");
testANB("- 2n", "parse error");
testANB("+ 2n", "parse error");
testANB("+2 n", "parse error");
</script>

View file

@ -0,0 +1,62 @@
<!doctype html>
<title>An+B Serialization</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<style>
foo { color: blue; }
</style>
<meta name="author" title="Tab Atkins-Bittner">
<link rel=help href="https://drafts.csswg.org/css-syntax/#serializing-anb">
<script>
function roundtripANB(str) {
const rule = document.styleSheets[0].cssRules[0];
rule.selectorText = "foo";
rule.selectorText = `:nth-child(${str})`;
// Check for parse error.
if(rule.selectorText == "foo") return "parse error";
return rule.selectorText.slice(11, -1);
}
function testANB(input, expected) {
test(()=>{
assert_equals(roundtripANB(input), expected);
}, `"${input}" becomes "${expected}"`);
}
/* A is 0, or omitted */
testANB("1", "1");
testANB("+1", "1");
testANB("-1", "-1");
testANB("0n + 0", "0");
testANB("0n + 1", "1");
testANB("0n - 1", "-1");
/* A is 1 */
testANB("1n", "n");
testANB("1n - 0", "n");
testANB("1n + 1", "n+1");
testANB("1n - 1", "n-1");
/* A is -1 */
testANB("-1n", "-n");
testANB("-1n - 0", "-n");
testANB("-1n + 1", "-n+1");
testANB("-1n - 1", "-n-1");
/* A is implied via + or - */
testANB("+n+1", "n+1");
testANB("-n-1", "-n-1");
/* B is 0 */
testANB("n + 0", "n");
testANB("n - 0", "n");
/* A & B both nonzero */
testANB("2n + 2", "2n+2");
testANB("-2n - 2", "-2n-2");
</script>

View file

@ -0,0 +1,60 @@
<!doctype html>
<title>Inclusive Ranges</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<style>
foo { z-index: 0; }
</style>
<meta name="author" title="Tab Atkins-Bittner">
<link rel=help href="https://drafts.csswg.org/css-syntax/#digit">
<link rel=help href="https://drafts.csswg.org/css-syntax/#non-printable-code-point">
<script>
function roundtripIdent(str) {
const rule = document.styleSheets[0].cssRules[0];
rule.selectorText = "original-ident";
rule.selectorText = str;
// Check for parse error.
if(rule.selectorText == "original-ident") return "parse error";
return rule.selectorText;
}
function roundtripInteger(str) {
const rule = document.styleSheets[0].cssRules[0];
rule.style.zIndex = "12345";
rule.style.zIndex = str;
// Check for parse error.
if(rule.style.zIndex == "12345") return "parse error";
return rule.style.zIndex;
}
function testInteger(input, expected) {
test(()=>{
assert_equals(roundtripInteger(input), expected);
}, `"${input}" becomes "${expected}"`);
}
function testIdent(input, expected) {
test(()=>{
assert_equals(roundtripIdent(input), expected);
}, `"${input}" becomes "${expected}"`);
}
/* Digits are the inclusive range 0-9 */
for(var i = 0; i <= 9; i++) {
testInteger(i+"", i+"");
}
/* Non-printables are the inclusive ranges 0-8, b, e-1f, or 7f */
// 0 never shows up due to preprocessing, so start at 1
for(var i = 1; i <= 8; i++) {
testIdent("foo"+String.fromCodePoint(i), "parse error");
}
testIdent("foo"+String.fromCodePoint(0xb), "parse error");
for(var i = 0xe; i <= 0x1f; i++) {
testIdent("foo"+String.fromCodePoint(i), "parse error");
}
testIdent("foo" + String.fromCodePoint(0x7f), "parse error");
</script>

View file

@ -0,0 +1,46 @@
<!doctype html>
<title>Input Preprocessing</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<style>
foo { color: blue; }
</style>
<meta name="author" title="Tab Atkins-Bittner">
<link rel=help href="https://drafts.csswg.org/css-syntax/#input-preprocessing">
<script>
function roundtripIdent(str) {
const rule = document.styleSheets[0].cssRules[0];
rule.selectorText = "original-ident";
rule.selectorText = str;
// Check for parse error.
if(rule.selectorText == "original-ident") return "parse error";
return rule.selectorText;
}
function testParsing(input, expected) {
test(()=>{
assert_equals(roundtripIdent(input), expected);
}, `"${input}" becomes "${expected}"`);
}
/* Can't figure out how to test the newline normalization... */
/* NULL becomes FFFD */
testParsing("foo\x00", "foo\ufffd");
testParsing("f\x00oo", "f\ufffdoo");
testParsing("\x00foo", "\ufffdfoo");
testParsing("\x00", "\ufffd");
testParsing("\x00\x00\x00", "\ufffd\ufffd\ufffd");
/* surrogates become FFFD */
testParsing("foo\ud800", "foo\ufffd");
testParsing("f\ud800oo", "f\ufffdoo");
testParsing("\ud800foo", "\ufffdfoo");
testParsing("\ud800", "\ufffd");
testParsing("\ud800\ud800\ud800", "\ufffd\ufffd\ufffd");
</script>

View file

@ -0,0 +1,36 @@
<!doctype html>
<title>Unclosed Constructs Are Valid</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<meta name="author" title="Tab Atkins-Bittner">
<link rel=help href="https://drafts.csswg.org/css-syntax/#rule-defs">
<!--
Tests that unclosed constructs are valid and match grammars,
because grammar-matching only sees the "block",
not the opening/closing characters themselves.
-->
<script>
function validSelector(str) {
try {
document.querySelector(str);
return true;
} catch(e) {
return false;
}
}
function shouldBeValid(str) {
test(()=>{
assert_true(validSelector(str));
}, `"${str}" is a valid selector`)
}
shouldBeValid("[foo]");
shouldBeValid("[foo");
shouldBeValid(":nth-child(1)");
shouldBeValid(":nth-child(1");
</script>

View file

@ -0,0 +1,62 @@
<!doctype html>
<title>CSS Whitespace</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<meta name="author" title="Tab Atkins-Bittner">
<link rel=help href="https://drafts.csswg.org/css-syntax/#whitespace">
<div class=a><b></b></div>
<div id=foo></div>
<!--
CSS's definition of "whitespace" matches HTML,
and includes only the five ASCII characters
U+0009, U+000A, U+000C, U+000D, and U+0020.
The rest of Unicode's whitespace characters,
many of which are recognized as whitespace by JS,
are not valid whitespace in CSS.
-->
<script>
function isWhitespace(codepoint) {
const char = String.fromCodePoint(codepoint);
const codepointName = "U+" + codepoint.toString(16).padStart(4, "0");
test(()=>{
const withSpace = document.querySelector(".a b");
const withChar = document.querySelector(`.a${char}b`);
assert_equals(withSpace, withChar);
}, `${codepointName} is CSS whitespace`);
}
function isNotWhitespace(codepoint) {
const char = String.fromCodePoint(codepoint);
const codepointName = "U+" + codepoint.toString(16).padStart(4, "0");
test(()=>{
const withSpace = document.querySelector(".a b");
document.querySelector("#foo").setAttribute("class", `.a${char}b`);
try {
var withChar = document.querySelector(`.a${char}b`);
} catch(e) {
assert_true(true, `${codepointName} isn't valid in a selector at all`);
return;
}
assert_not_equals(withSpace, withChar);
}, `${codepointName} is *not* CSS whitespace`);
}
// CSS Whitespace characters
var whitespace = [0x9, 0xa, 0xc, 0xd, 0x20];
// Unicode Whitespace characters not recognized by CSS
// https://en.wikipedia.org/wiki/Whitespace_character#Unicode
var notWhitespace = [0xb, 0x85, 0xa0, 0x1680, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200a, 0x2928, 0x2029, 0x202f, 0x205f, 0x3000, 0x180e, 0x200b, 0x200c, 0x200d, 0x2060, 0xfeff];
for(var codepoint of whitespace) {
isWhitespace(codepoint);
}
for(var codepoint of notWhitespace) {
isNotWhitespace(codepoint);
}
</script>

View file

@ -6,6 +6,7 @@
<link rel="author" title="Marc Bourlon" href="mailto:marc@bourlon.com"> <link rel="author" title="Marc Bourlon" href="mailto:marc@bourlon.com">
<link rel="help" href="http://www.w3.org/TR/css3-values/#viewport-relative-lengths"> <link rel="help" href="http://www.w3.org/TR/css3-values/#viewport-relative-lengths">
<link rel="match" href="reference/vh_not_refreshing_on_chrome-ref.html"> <link rel="match" href="reference/vh_not_refreshing_on_chrome-ref.html">
<meta charset="UTF-8">
<meta name="assert" content="vh-based dimension doesn't change when the element's other dimension doesn't change."> <meta name="assert" content="vh-based dimension doesn't change when the element's other dimension doesn't change.">
<!-- This test exhibits a bug for Chrome 19.0.1084.56 / Mac OS X 10.6.8 --> <!-- This test exhibits a bug for Chrome 19.0.1084.56 / Mac OS X 10.6.8 -->
<script src="/common/reftest-wait.js"></script> <script src="/common/reftest-wait.js"></script>

View file

@ -3,6 +3,7 @@
<!-- Submitted from TestTWF Paris --> <!-- Submitted from TestTWF Paris -->
<head> <head>
<title>CSS Values and Units Test: Viewport units in scaled viewport</title> <title>CSS Values and Units Test: Viewport units in scaled viewport</title>
<meta charset="UTF-8">
<meta name="assert" content="viewport relative units scale with viewport."> <meta name="assert" content="viewport relative units scale with viewport.">
<link rel="author" title="Emil A Eklund" href="mailto:eae@chromium.org"> <link rel="author" title="Emil A Eklund" href="mailto:eae@chromium.org">
<link rel="help" href="http://www.w3.org/TR/css3-values/#viewport-relative-lengths"> <link rel="help" href="http://www.w3.org/TR/css3-values/#viewport-relative-lengths">

View file

@ -2,6 +2,7 @@
<html> <html>
<head> <head>
<title>CSS Values and Units Test: Checks viewport units against CSS 2.1 properties and the CSSOM</title> <title>CSS Values and Units Test: Checks viewport units against CSS 2.1 properties and the CSSOM</title>
<meta charset="UTF-8">
<meta name="assert" content="Testing what happens when one applies and rereads viewport unit lengths to CSS 2.1 properties that accept length values" /> <meta name="assert" content="Testing what happens when one applies and rereads viewport unit lengths to CSS 2.1 properties that accept length values" />
<link rel="author" title="Christian Schaefer" href="mailto:schaepp@gmx.de"> <link rel="author" title="Christian Schaefer" href="mailto:schaepp@gmx.de">
<link rel="help" href="http://www.w3.org/TR/css3-values/#viewport-relative-lengths"> <link rel="help" href="http://www.w3.org/TR/css3-values/#viewport-relative-lengths">

View file

@ -23,11 +23,11 @@ promise_test(async t => {
{types: ['feature-policy-violation']}).observe(); {types: ['feature-policy-violation']}).observe();
}); });
try { try {
await navigator.xr.requestDevice(); await navigator.xr.supportsSessionMode('inline');
} catch (err) { } catch (err) {
// If no XR devices are available, requestDevice() will throw NotFoundError, // If no XR devices are available, supportsSessionMode() will reject with a
// but the report should be generated anyway. // NotSupportedError, but the report should be generated anyway.
assert_equals(err.name, 'NotFoundError'); assert_equals(err.name, 'NotSupportedError');
} }
check_report_format(await report); check_report_format(await report);
}, "XR report only mode"); }, "XR report only mode");

View file

@ -22,7 +22,7 @@ promise_test(async (t) => {
new ReportingObserver((reports, observer) => resolve([reports, observer]), new ReportingObserver((reports, observer) => resolve([reports, observer]),
{types: ['feature-policy-violation']}).observe(); {types: ['feature-policy-violation']}).observe();
}); });
await promise_rejects(t, 'SecurityError', navigator.xr.requestDevice(), await promise_rejects(t, 'SecurityError', navigator.xr.supportsSessionMode('inline'),
"XR device access should not be allowed in this document."); "XR device access should not be allowed in this document.");
const [reports, observer] = await report; const [reports, observer] = await report;
check_report_format(reports, observer); check_report_format(reports, observer);

View file

@ -0,0 +1,17 @@
<!DOCTYPE html>
<!---
Tentative test against:
https://github.com/whatwg/fetch/pull/853
-->
<meta charset="utf-8">
<title>Tests Stale While Revalidate is not executed for fetch API</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
promise_test(async (test) => {
const response = await fetch(`stale-script.py`);
const response2 = await fetch(`stale-script.py`);
assert_not_equals(response.headers.get('Token'), response2.headers.get('Token'));
}, 'Second fetch does not return same response');
</script>

View file

@ -0,0 +1,20 @@
def main(request, response):
cookie = request.cookies.first("Count", None)
count = 0
if cookie != None:
count = int(cookie.value)
if request.GET.first("query", None) != None:
headers = [("Count", count)]
content = ""
return 200, headers, content
else:
count = count + 1
content = "body { background: rgb(0, 128, 0); }"
if count > 1:
content = "body { background: rgb(255, 0, 0); }"
headers = [("Content-Type", "text/css"),
("Set-Cookie", "Count={}".format(count)),
("Cache-Control", "private, max-age=0, stale-while-revalidate=10")]
return 200, headers, content

View file

@ -0,0 +1,47 @@
<!DOCTYPE html>
<!---
Tentative test against:
https://github.com/whatwg/fetch/pull/853
-->
<meta charset="utf-8">
<title>Tests Stale While Revalidate works for css</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<body>
<script>
async_test(t => {
window.onload = t.step_func(() => {
step_timeout(() => {
assert_equals(window.getComputedStyle(document.body).getPropertyValue('background-color'), "rgb(0, 128, 0)");
var link2 = document.createElement("link");
link2.onload = t.step_func(() => {
assert_equals(window.getComputedStyle(document.body).getPropertyValue('background-color'), "rgb(0, 128, 0)");
var checkResult = () => {
// We poll because we don't know when the revalidation will occur.
fetch("stale-css.py?query").then(t.step_func((response) => {
var count = response.headers.get("Count");
if (count == '2') {
t.done();
} else {
t.step_timeout(checkResult, 25);
}
}));
};
t.step_timeout(checkResult, 25);
});
link2.rel = "stylesheet";
link2.type = "text/css";
link2.href = "stale-css.py";
document.body.appendChild(link2);
}, 0);
});
}, 'Cache returns stale resource');
var link = document.createElement("link");
link.rel = "stylesheet";
link.type = "text/css";
link.href = "stale-css.py";
document.body.appendChild(link);
</script>
</body>

View file

@ -0,0 +1,30 @@
import os.path
def main(request, response):
cookie = request.cookies.first("Count", None)
count = 0
if cookie != None:
count = int(cookie.value)
if request.GET.first("query", None) != None:
headers = [("Count", count)]
content = ""
return 200, headers, content
else:
count = count + 1
filename = "green-16x16.png"
if cookie > 1:
filename = "green-256x256.png"
path = os.path.join(os.path.dirname(__file__), "../../images", filename)
body = open(path, "rb").read()
response.add_required_headers = False
response.writer.write_status(200)
response.writer.write_header("content-length", len(body))
response.writer.write_header("Cache-Control", "private, max-age=0, stale-while-revalidate=10")
response.writer.write_header("content-type", "image/png")
response.writer.write_header("Set-Cookie", "Count={}".format(count))
response.writer.end_headers()
response.writer.write(body)

View file

@ -0,0 +1,51 @@
<!DOCTYPE html>
<!---
Tentative test against:
https://github.com/whatwg/fetch/pull/853
-->
<meta charset="utf-8">
<title>Tests Stale While Revalidate works for images</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<body>
<!--
Use a child document to load the second stale image into because
an image loaded into the same document will skip cache-control headers.
See: https://html.spec.whatwg.org/#the-list-of-available-images
-->
<iframe id="child" srcdoc=""></iframe>
<script>
async_test(t => {
window.onload = t.step_func(() => {
step_timeout(() => {
assert_equals(document.getElementById("firstimage").width, 16, "Width is 16");
var childDocument = document.getElementById('child').contentDocument;
var img2 = childDocument.createElement("img");
img2.onload = t.step_func(() => {
assert_equals(img2.width, 16, "image dimension");
var checkResult = () => {
// We poll because we don't know when the revalidation will occur.
fetch("stale-image.py?query").then(t.step_func((response) => {
var count = response.headers.get("Count");
if (count == '2') {
t.done();
} else {
t.step_timeout(checkResult, 25);
}
}));
};
t.step_timeout(checkResult, 25);
});
img2.src = "stale-image.py";
childDocument.body.appendChild(img2);
}, 0);
});
}, 'Cache returns stale resource');
var img = document.createElement("img");
img.src = "stale-image.py";
img.id = "firstimage";
document.body.appendChild(img);
</script>
</body>

View file

@ -0,0 +1,25 @@
import random, string, datetime
def token():
letters = string.ascii_lowercase
return ''.join(random.choice(letters) for i in range(20))
def main(request, response):
cookie = request.cookies.first("Count", None)
count = 0
if cookie != None:
count = int(cookie.value)
if request.GET.first("query", None) != None:
headers = [("Count", count)]
content = ""
return 200, headers, content
else:
count = count + 1
unique_id = token()
headers = [("Content-Type", "text/javascript"),
("Cache-Control", "private, max-age=0, stale-while-revalidate=10"),
("Set-Cookie", "Count={}".format(count)),
("Token", unique_id)]
content = "report('{}')".format(unique_id)
return 200, headers, content

View file

@ -0,0 +1,55 @@
<!DOCTYPE html>
<!---
Tentative test against:
https://github.com/whatwg/fetch/pull/853
-->
<meta charset="utf-8">
<title>Tests Stale While Revalidate works for scripts</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<body>
<script>
var last_modified;
var last_modified_count = 0;
// The script will call report via a uniquely generated ID on the subresource.
// If it is a cache hit the ID will be the same and the test will pass.
function report(mod) {
if (!last_modified) {
last_modified = mod;
last_modified_count = 1;
} else if (last_modified == mod) {
last_modified_count++;
}
}
async_test(t => {
window.onload = t.step_func(() => {
step_timeout(() => {
var script = document.createElement("script");
script.src = "stale-script.py";
document.body.appendChild(script);
script.onload = t.step_func(() => {
assert_equals(last_modified_count, 2, "last modified");
var checkResult = () => {
// We poll because we don't know when the revalidation will occur.
fetch("stale-script.py?query").then(t.step_func((response) => {
var count = response.headers.get("Count");
if (count == '2') {
t.done();
} else {
t.step_timeout(checkResult, 25);
}
}));
};
t.step_timeout(checkResult, 25);
});
}, 0);
});
}, 'Cache returns stale resource');
var script = document.createElement("script");
script.src = "stale-script.py";
document.body.appendChild(script);
</script>
</body>

View file

@ -7,3 +7,7 @@
interface AmbientLightSensor : Sensor { interface AmbientLightSensor : Sensor {
readonly attribute double? illuminance; readonly attribute double? illuminance;
}; };
dictionary AmbientLightReadingValues {
required double? illuminance;
};

View file

@ -20,22 +20,22 @@ dictionary LayoutOptions {
[Exposed=LayoutWorklet] [Exposed=LayoutWorklet]
enum ChildDisplayType { enum ChildDisplayType {
"block", "block", // default - "blockifies" the child boxes.
"normal", "normal",
}; };
[Exposed=LayoutWorklet] [Exposed=LayoutWorklet]
enum LayoutSizingMode { enum LayoutSizingMode {
"block-like", "block-like", // default - Sizing behaves like block containers.
"manual", "manual", // Sizing is specified by the web developer.
}; };
[Exposed=LayoutWorklet] [Exposed=LayoutWorklet]
interface LayoutChild { interface LayoutChild {
readonly attribute StylePropertyMapReadOnly styleMap; readonly attribute StylePropertyMapReadOnly styleMap;
IntrinsicSizesRequest intrinsicSizes(); Promise<IntrinsicSizes> intrinsicSizes();
LayoutFragmentRequest layoutNextFragment(LayoutConstraints constraints, ChildBreakToken breakToken); Promise<LayoutFragment> layoutNextFragment(LayoutConstraintsOptions constraints, ChildBreakToken breakToken);
}; };
[Exposed=LayoutWorklet] [Exposed=LayoutWorklet]
@ -57,7 +57,7 @@ interface IntrinsicSizes {
readonly attribute double maxContentSize; readonly attribute double maxContentSize;
}; };
[Constructor(optional LayoutConstraintsOptions options),Exposed=LayoutWorklet] [Exposed=LayoutWorklet]
interface LayoutConstraints { interface LayoutConstraints {
readonly attribute double availableInlineSize; readonly attribute double availableInlineSize;
readonly attribute double availableBlockSize; readonly attribute double availableBlockSize;
@ -74,9 +74,11 @@ interface LayoutConstraints {
readonly attribute any data; readonly attribute any data;
}; };
enum BlockFragmentationType { "none", "page", "column", "region" };
dictionary LayoutConstraintsOptions { dictionary LayoutConstraintsOptions {
double availableInlineSize = 0; double availableInlineSize;
double availableBlockSize = 0; double availableBlockSize;
double fixedInlineSize; double fixedInlineSize;
double fixedBlockSize; double fixedBlockSize;
@ -90,8 +92,6 @@ dictionary LayoutConstraintsOptions {
any data; any data;
}; };
enum BlockFragmentationType { "none", "page", "column", "region" };
[Exposed=LayoutWorklet] [Exposed=LayoutWorklet]
interface ChildBreakToken { interface ChildBreakToken {
readonly attribute BreakType breakType; readonly attribute BreakType breakType;
@ -112,7 +112,7 @@ dictionary BreakTokenOptions {
enum BreakType { "none", "line", "column", "page", "region" }; enum BreakType { "none", "line", "column", "page", "region" };
[Exposed=LayoutWorklet] [Exposed=LayoutWorklet]
interface LayoutEdgeSizes { interface LayoutEdges {
readonly attribute double inlineStart; readonly attribute double inlineStart;
readonly attribute double inlineEnd; readonly attribute double inlineEnd;
@ -124,26 +124,6 @@ interface LayoutEdgeSizes {
readonly attribute double block; readonly attribute double block;
}; };
[Exposed=LayoutWorklet]
interface LayoutEdges {
readonly attribute LayoutEdgeSizes border;
readonly attribute LayoutEdgeSizes scrollbar;
readonly attribute LayoutEdgeSizes padding;
readonly attribute LayoutEdgeSizes all;
};
[Exposed=LayoutWorklet]
interface IntrinsicSizesRequest {
};
[Exposed=LayoutWorklet]
interface LayoutFragmentRequest {
};
typedef (IntrinsicSizesRequest or LayoutFragmentRequest)
LayoutFragmentRequestOrIntrinsicSizesRequest;
// This is the final return value from the author defined layout() method. // This is the final return value from the author defined layout() method.
dictionary FragmentResultOptions { dictionary FragmentResultOptions {
double inlineSize = 0; double inlineSize = 0;
@ -154,6 +134,12 @@ dictionary FragmentResultOptions {
BreakTokenOptions breakToken = null; BreakTokenOptions breakToken = null;
}; };
[Constructor(FragmentResultOptions)]
interface FragmentResult {
readonly attribute double inlineSize;
readonly attribute double blockSize;
};
dictionary IntrinsicSizesResultOptions { dictionary IntrinsicSizesResultOptions {
double maxContentSize; double maxContentSize;
double minContentSize; double minContentSize;

View file

@ -28,3 +28,93 @@ interface SensorErrorEvent : Event {
dictionary SensorErrorEventInit : EventInit { dictionary SensorErrorEventInit : EventInit {
required DOMException error; required DOMException error;
}; };
dictionary MockSensorConfiguration {
required MockSensorType mockSensorType;
boolean connected = true;
double? maxSamplingFrequency;
double? minSamplingFrequency;
};
dictionary MockSensor {
double maxSamplingFrequency;
double minSamplingFrequency;
double requestedSamplingFrequency;
};
enum MockSensorType {
"ambient-light",
"accelerometer",
"linear-acceleration",
"gravity",
"gyroscope",
"magnetometer",
"uncalibrated-magnetometer",
"absolute-orientation",
"relative-orientation",
"geolocation",
"proximity",
};
dictionary MockSensorReadingValues {
};
dictionary AmbientLightReadingValues {
required double? illuminance;
};
dictionary AccelerometerReadingValues {
required double? x;
required double? y;
required double? z;
};
dictionary LinearAccelerationReadingValues : AccelerometerReadingValues {
};
dictionary GravityReadingValues : AccelerometerReadingValues {
};
dictionary GyroscopeReadingValues {
required double? x;
required double? y;
required double? z;
};
dictionary MagnetometerReadingValues {
required double? x;
required double? y;
required double? z;
};
dictionary UncalibratedMagnetometerReadingValues {
required double? x;
required double? y;
required double? z;
required double? xBias;
required double? yBias;
required double? zBias;
};
dictionary AbsoluteOrientationReadingValues {
required FrozenArray<double>? quaternion;
};
dictionary RelativeOrientationReadingValues : AbsoluteOrientationReadingValues {
};
dictionary GeolocationReadingValues {
required double? latitude;
required double? longitude;
required double? altitude;
required double? accuracy;
required double? altitudeAccuracy;
required double? heading;
required double? speed;
};
dictionary ProximityReadingValues {
required double? distance;
required double? max;
required boolean? near;
};

View file

@ -3,8 +3,6 @@
// (https://github.com/tidoust/reffy-reports) // (https://github.com/tidoust/reffy-reports)
// Source: HTML Standard (https://html.spec.whatwg.org/) // Source: HTML Standard (https://html.spec.whatwg.org/)
// Example interface manually removed here, see https://github.com/tidoust/reffy/issues/129.
[Exposed=Window, [Exposed=Window,
LegacyUnenumerableNamedProperties] LegacyUnenumerableNamedProperties]
interface HTMLAllCollection { interface HTMLAllCollection {
@ -1524,6 +1522,7 @@ interface Window : EventTarget {
void postMessage(any message, optional WindowPostMessageOptions options); void postMessage(any message, optional WindowPostMessageOptions options);
}; };
Window includes GlobalEventHandlers; Window includes GlobalEventHandlers;
Window includes WindowEventHandlers;
dictionary WindowPostMessageOptions : PostMessageOptions { dictionary WindowPostMessageOptions : PostMessageOptions {
USVString targetOrigin = "/"; USVString targetOrigin = "/";
@ -1817,7 +1816,7 @@ interface mixin NavigatorID {
[Exposed=Window] readonly attribute DOMString vendorSub; // constant "" [Exposed=Window] readonly attribute DOMString vendorSub; // constant ""
}; };
partial interface NavigatorID { partial interface mixin NavigatorID {
[Exposed=Window] boolean taintEnabled(); // constant false [Exposed=Window] boolean taintEnabled(); // constant false
[Exposed=Window] readonly attribute DOMString oscpu; [Exposed=Window] readonly attribute DOMString oscpu;
}; };
@ -2450,8 +2449,7 @@ partial interface Window {
[Replaceable, SameObject] readonly attribute External external; [Replaceable, SameObject] readonly attribute External external;
}; };
[Exposed=Window, [Exposed=Window]
NoInterfaceObject]
interface External { interface External {
void AddSearchProvider(); void AddSearchProvider();
void IsSearchProviderInstalled(); void IsSearchProviderInstalled();

View file

@ -92,7 +92,6 @@ interface PaymentAddress {
readonly attribute DOMString postalCode; readonly attribute DOMString postalCode;
readonly attribute DOMString recipient; readonly attribute DOMString recipient;
readonly attribute DOMString region; readonly attribute DOMString region;
readonly attribute DOMString regionCode;
readonly attribute DOMString sortingCode; readonly attribute DOMString sortingCode;
readonly attribute FrozenArray<DOMString> addressLine; readonly attribute FrozenArray<DOMString> addressLine;
}; };
@ -101,7 +100,6 @@ dictionary AddressInit {
DOMString country; DOMString country;
sequence<DOMString> addressLine; sequence<DOMString> addressLine;
DOMString region; DOMString region;
DOMString regionCode;
DOMString city; DOMString city;
DOMString dependentLocality; DOMString dependentLocality;
DOMString postalCode; DOMString postalCode;
@ -121,7 +119,6 @@ dictionary AddressErrors {
DOMString postalCode; DOMString postalCode;
DOMString recipient; DOMString recipient;
DOMString region; DOMString region;
DOMString regionCode;
DOMString sortingCode; DOMString sortingCode;
}; };

View file

@ -9,6 +9,7 @@ partial interface HTMLVideoElement {
attribute EventHandler onenterpictureinpicture; attribute EventHandler onenterpictureinpicture;
attribute EventHandler onleavepictureinpicture; attribute EventHandler onleavepictureinpicture;
[CEReactions] attribute boolean autoPictureInPicture;
[CEReactions] attribute boolean disablePictureInPicture; [CEReactions] attribute boolean disablePictureInPicture;
}; };

View file

@ -34,7 +34,7 @@ enum LandmarkType {
[Exposed=(Window,Worker), [Exposed=(Window,Worker),
Constructor(optional BarcodeDetectorOptions barcodeDetectorOptions)] Constructor(optional BarcodeDetectorOptions barcodeDetectorOptions)]
interface BarcodeDetector { interface BarcodeDetector {
readonly attribute FrozenArray<BarcodeFormat> supportedFormats; static Promise<sequence<BarcodeFormat>> getSupportedFormats();
Promise<sequence<DetectedBarcode>> detect(ImageBitmapSource image); Promise<sequence<DetectedBarcode>> detect(ImageBitmapSource image);
}; };

View file

@ -43,7 +43,7 @@ dictionary ModuleImportDescriptor {
interface Module { interface Module {
static sequence<ModuleExportDescriptor> exports(Module moduleObject); static sequence<ModuleExportDescriptor> exports(Module moduleObject);
static sequence<ModuleImportDescriptor> imports(Module moduleObject); static sequence<ModuleImportDescriptor> imports(Module moduleObject);
static sequence<ArrayBuffer> customSections(Module moduleObject, USVString sectionName); static sequence<ArrayBuffer> customSections(Module moduleObject, DOMString sectionName);
}; };
[LegacyNamespace=WebAssembly, Constructor(Module module, optional object importObject), Exposed=(Window,Worker,Worklet)] [LegacyNamespace=WebAssembly, Constructor(Module module, optional object importObject), Exposed=(Window,Worker,Worklet)]

View file

@ -3,12 +3,6 @@
// (https://github.com/tidoust/reffy-reports) // (https://github.com/tidoust/reffy-reports)
// Source: Identifiers for WebRTC's Statistics API (https://w3c.github.io/webrtc-stats/) // Source: Identifiers for WebRTC's Statistics API (https://w3c.github.io/webrtc-stats/)
dictionary RTCStats {
DOMHighResTimeStamp timestamp;
RTCStatsType type;
DOMString id;
};
enum RTCStatsType { enum RTCStatsType {
"codec", "codec",
"inbound-rtp", "inbound-rtp",
@ -314,7 +308,7 @@ partial dictionary RTCIceCandidatePairStats {
unsigned long long priority; unsigned long long priority;
}; };
partial dictionary RTCRTPStreamStats { partial dictionary RTCRtpStreamStats {
DOMString mediaType; DOMString mediaType;
double averageRTCPInterval; double averageRTCPInterval;
}; };

View file

@ -9,8 +9,8 @@
<script nonce="abc"> <script nonce="abc">
window.addEventListener('load', t.step_func(function() { window.addEventListener('load', t.step_func(function() {
verifyPreloadAndRTSupport(); verifyPreloadAndRTSupport();
verifyNumberOfDownloads("resources/dummy.js?without-nonce", 0); verifyNumberOfDownloads("resources/dummy.js?from-header&without-nonce", 0);
verifyNumberOfDownloads("resources/dummy.js?with-nonce", 1); verifyNumberOfDownloads("resources/dummy.js?from-header&with-nonce", 1);
t.done(); t.done();
})); }));
</script> </script>

View file

@ -1,3 +1,3 @@
Content-Security-Policy: script-src 'nonce-abc' Content-Security-Policy: script-src 'nonce-abc'
Link: </preload/resources/dummy.js?without-nonce>;rel=preload;as=script Link: </preload/resources/dummy.js?from-header&without-nonce>;rel=preload;as=script
Link: </preload/resources/dummy.js?with-nonce>;rel=preload;as=script;nonce=abc Link: </preload/resources/dummy.js?from-header&with-nonce>;rel=preload;as=script;nonce=abc

View file

@ -11,16 +11,16 @@
<script> <script>
window.addEventListener("load", t.step_func(function() { window.addEventListener("load", t.step_func(function() {
verifyPreloadAndRTSupport(); verifyPreloadAndRTSupport();
verifyNumberOfDownloads('resources/square.png?1x', 1); verifyNumberOfDownloads('resources/square.png?from-header&1x', 1);
verifyNumberOfDownloads('resources/square.png?2x', 0); verifyNumberOfDownloads('resources/square.png?from-header&2x', 0);
verifyNumberOfDownloads('resources/square.png?3x', 0); verifyNumberOfDownloads('resources/square.png?from-header&3x', 0);
verifyNumberOfDownloads('resources/square.png?base', 0); verifyNumberOfDownloads('resources/square.png?from-header&base', 0);
verifyNumberOfDownloads('resources/square.png?200', 0); verifyNumberOfDownloads('resources/square.png?from-header&200', 0);
verifyNumberOfDownloads('resources/square.png?400', 1); verifyNumberOfDownloads('resources/square.png?from-header&400', 1);
verifyNumberOfDownloads('resources/square.png?800', 0); verifyNumberOfDownloads('resources/square.png?from-header&800', 0);
verifyNumberOfDownloads('resources/square.png?150', 0); verifyNumberOfDownloads('resources/square.png?from-header&150', 0);
verifyNumberOfDownloads('resources/square.png?300', 1); verifyNumberOfDownloads('resources/square.png?from-header&300', 1);
verifyNumberOfDownloads('resources/square.png?600', 0); verifyNumberOfDownloads('resources/square.png?from-header&600', 0);
t.done(); t.done();
})); }));
</script> </script>

View file

@ -1,3 +1,3 @@
Link: <resources/square.png?1x>; rel=preload; as=image; imagesrcset="resources/square.png?2x 2x, resources/square.png?3x 3x" Link: <resources/square.png?from-header&1x>; rel=preload; as=image; imagesrcset="resources/square.png?from-header&2x 2x, resources/square.png?from-header&3x 3x"
Link: <resources/square.png?base>; rel=preload; as=image; imagesrcset="resources/square.png?200 200w, resources/square.png?400 400w, resources/square.png?800 800w"; imagesizes=400px Link: <resources/square.png?from-header&base>; rel=preload; as=image; imagesrcset="resources/square.png?from-header&200 200w, resources/square.png?from-header&400 400w, resources/square.png?from-header&800 800w"; imagesizes=400px
Link: <resources/square.png?base>; rel=preload; as=image; imagesrcset="resources/square.png?150 150w, resources/square.png?300 300w, resources/square.png?600 600w"; imagesizes="(min-width: 300px) 300px, 150px" Link: <resources/square.png?from-header&base>; rel=preload; as=image; imagesrcset="resources/square.png?from-header&150 150w, resources/square.png?from-header&300 300w, resources/square.png?from-header&600 600w"; imagesizes="(min-width: 300px) 300px, 150px"

View file

@ -41,7 +41,7 @@ function onload_test() {
test_equals(entry.fetchStart, entry.connectStart, 'connectStart and fetchStart should be the same'); test_equals(entry.fetchStart, entry.connectStart, 'connectStart and fetchStart should be the same');
test_equals(entry.fetchStart, entry.connectEnd, 'connectEnd and fetchStart should be the same'); test_equals(entry.fetchStart, entry.connectEnd, 'connectEnd and fetchStart should be the same');
if(!window.isSecureConnection) { if(!window.isSecureConnection) {
test_equals(entry.secureConnectionStart, 0, 'secureConnectStart should be zero'); test_equals(entry.secureConnectionStart, 0, 'secureConnectionStart should be zero');
} }
test_equals(entry.fetchStart, entry.domainLookupStart, 'domainLookupStart and fetchStart should be the same') test_equals(entry.fetchStart, entry.domainLookupStart, 'domainLookupStart and fetchStart should be the same')
test_equals(entry.fetchStart, entry.domainLookupEnd, 'domainLookupEnd and fetchStart should be the same') test_equals(entry.fetchStart, entry.domainLookupEnd, 'domainLookupEnd and fetchStart should be the same')

View file

@ -40,7 +40,7 @@ function onload_test() {
const entry = entries[1]; const entry = entries[1];
test_equals(entry.fetchStart, entry.connectStart, 'connectStart and fetchStart should be the same'); test_equals(entry.fetchStart, entry.connectStart, 'connectStart and fetchStart should be the same');
test_equals(entry.fetchStart, entry.connectEnd, 'connectEnd and fetchStart should be the same'); test_equals(entry.fetchStart, entry.connectEnd, 'connectEnd and fetchStart should be the same');
test_equals(entry.fetchStart, entry.secureConnectionStart, 'secureConnectStart and fetchStart should be the same'); test_equals(entry.fetchStart, entry.secureConnectionStart, 'secureConnectionStart and fetchStart should be the same');
test_equals(entry.fetchStart, entry.domainLookupStart, 'domainLookupStart and fetchStart should be the same') test_equals(entry.fetchStart, entry.domainLookupStart, 'domainLookupStart and fetchStart should be the same')
test_equals(entry.fetchStart, entry.domainLookupEnd, 'domainLookupEnd and fetchStart should be the same') test_equals(entry.fetchStart, entry.domainLookupEnd, 'domainLookupEnd and fetchStart should be the same')
} }

View file

@ -0,0 +1,55 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Resource Timing connection reuse</title>
<link rel="author" title="Google" href="http://www.google.com/" />
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/webperftestharness.js"></script>
<script src="resources/webperftestharnessextension.js"></script>
<script>
setup({explicit_done: true});
let iframe;
let d;
let body;
// Explicitly test the namespace before we start testing.
test_namespace('getEntriesByType');
function setup_iframe() {
iframe = document.getElementById('frameContext');
d = iframe.contentWindow.document;
iframe.addEventListener('load', onload_test, false);
}
function onload_test() {
const entries = iframe.contentWindow.performance.getEntriesByType('resource');
// When a persistent connection is used, follow-on resources should be included as PerformanceResourceTiming objects.
test_equals(entries.length, 2, 'There should be 2 PerformanceEntries');
if (entries.length >= 2) {
// When a persistent connection is used, for the resource that reuses the socket, connectStart and connectEnd should have the same value as fetchStart.
const entry = entries[1];
test_equals(entry.fetchStart, entry.connectStart, 'connectStart and fetchStart should be the same');
test_equals(entry.fetchStart, entry.connectEnd, 'connectEnd and fetchStart should be the same');
// secureConnectionStart is the same as fetchStart since the subresource is fetched over https
test_equals(entry.fetchStart, entry.secureConnectionStart, 'secureConnectionStart and fetchStart should be the same');
test_equals(entry.fetchStart, entry.domainLookupStart, 'domainLookupStart and fetchStart should be the same')
test_equals(entry.fetchStart, entry.domainLookupEnd, 'domainLookupEnd and fetchStart should be the same')
}
done();
}
window.setup_iframe = setup_iframe;
</script>
</head>
<body>
<h1>Description</h1>
<p>This test validates that connectStart and connectEnd are the same when a connection is reused (e.g. when a persistent connection is used).</p>
<div id="log"></div>
<iframe id="frameContext" src="resources/fake_responses_https.sub.html"></iframe>
</body>
</html>

View file

@ -0,0 +1,55 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Resource Timing connection reuse</title>
<link rel="author" title="Google" href="http://www.google.com/" />
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/webperftestharness.js"></script>
<script src="resources/webperftestharnessextension.js"></script>
<script>
setup({explicit_done: true});
let iframe;
let d;
let body;
// Explicitly test the namespace before we start testing.
test_namespace('getEntriesByType');
function setup_iframe() {
iframe = document.getElementById('frameContext');
d = iframe.contentWindow.document;
iframe.addEventListener('load', onload_test, false);
}
function onload_test() {
const entries = iframe.contentWindow.performance.getEntriesByType('resource');
// When a persistent connection is used, follow-on resources should be included as PerformanceResourceTiming objects.
test_equals(entries.length, 2, 'There should be 2 PerformanceEntries');
if (entries.length >= 2) {
// When a persistent connection is used, for the resource that reuses the socket, connectStart and connectEnd should have the same value as fetchStart.
const entry = entries[1];
test_equals(entry.fetchStart, entry.connectStart, 'connectStart and fetchStart should be the same');
test_equals(entry.fetchStart, entry.connectEnd, 'connectEnd and fetchStart should be the same');
// secureConnectionStart is the same as fetchStart since the subresource is eventually redirected to https.
test_equals(entry.fetchStart, entry.secureConnectionStart, 'secureConnectionStart and fetchStart should be the same');
test_equals(entry.fetchStart, entry.domainLookupStart, 'domainLookupStart and fetchStart should be the same')
test_equals(entry.fetchStart, entry.domainLookupEnd, 'domainLookupEnd and fetchStart should be the same')
}
done();
}
window.setup_iframe = setup_iframe;
</script>
</head>
<body>
<h1>Description</h1>
<p>This test validates that connectStart and connectEnd are the same when a connection is reused (e.g. when a persistent connection is used).</p>
<div id="log"></div>
<iframe id="frameContext" src="resources/fake_responses_https_redirect.sub.html"></iframe>
</body>
</html>

View file

@ -2,13 +2,20 @@
def main(request, response): def main(request, response):
tag = request.GET.first("tag", None) tag = request.GET.first("tag", None)
redirect = request.GET.first("redirect", None)
match = request.headers.get("If-None-Match", None) match = request.headers.get("If-None-Match", None)
date = request.GET.first("date", "") date = request.GET.first("date", "")
modified = request.headers.get("If-Modified-Since", None) modified = request.headers.get("If-Modified-Since", None)
response.headers.set("Access-Control-Allow-Origin", "*");
response.headers.set("Timing-Allow-Origin", "*");
if tag: if tag:
response.headers.set("ETag", '"%s"' % tag) response.headers.set("ETag", '"%s"' % tag)
elif date: elif date:
response.headers.set("Last-Modified", date) response.headers.set("Last-Modified", date)
if redirect:
response.headers.set("Location", redirect)
response.status = (302, "Moved")
return ""
if ((match is not None and match == tag) or if ((match is not None and match == tag) or
(modified is not None and modified == date)): (modified is not None and modified == date)):

View file

@ -0,0 +1,18 @@
<body>
<script>
function request() {
var client = new XMLHttpRequest,
baseurl = "https://{{hosts[][www]}}:{{ports[https][0]}}{{location[pathname]}}",
url = new URL("fake_responses.py", baseurl).href;
client.open("GET", url, false)
client.send(null)
client.open("GET", url, false)
client.send(null)
}
if(window.parent.setup_iframe) {
window.parent.setup_iframe();
request();
}
</script>
</body>

View file

@ -0,0 +1,20 @@
<body>
<script>
function request() {
var client = new XMLHttpRequest,
baseurl = "http://{{hosts[][www]}}:{{ports[http][0]}}{{location[pathname]}}",
subresource = "fake_responses.py",
redirecturl = new URL(subresource, "https://{{hosts[][www]}}:{{ports[https][0]}}{{location[pathname]}}").href,
url = new URL(subresource + "?redirect=" + redirecturl, baseurl).href;
client.open("GET", url, false)
client.send(null)
client.open("GET", url, false)
client.send(null)
}
if(window.parent.setup_iframe) {
window.parent.setup_iframe();
request();
}
</script>
</body>

View file

@ -0,0 +1,177 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>Test clients.get(resultingClientId)</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/get-host-info.sub.js"></script>
<script src="resources/test-helpers.sub.js"></script>
<script>
const scope = "resources/";
let worker;
// Setup. Keep this as the first promise_test.
promise_test(async (t) => {
const registration = await service_worker_unregister_and_register(
t, 'resources/get-resultingClientId-worker.js',
scope);
worker = registration.installing;
await wait_for_state(t, worker, 'activated');
}, 'global setup');
// Sends |command| to the worker and returns a promise that resolves to its
// response. There should only be one inflight command at a time.
async function sendCommand(command) {
const saw_message = new Promise((resolve) => {
navigator.serviceWorker.onmessage = (event) => {
resolve(event.data);
};
});
worker.postMessage(command);
return saw_message;
}
// Wrapper for 'startTest' command. Tells the worker a test is starting,
// so it resets state and keeps itself alive until 'finishTest'.
async function startTest(t) {
const result = await sendCommand({command: 'startTest'});
assert_equals(result, 'ok', 'startTest');
t.add_cleanup(async () => {
return finishTest();
});
}
// Wrapper for 'finishTest' command.
async function finishTest() {
const result = await sendCommand({command: 'finishTest'});
assert_equals(result, 'ok', 'finishTest');
}
// Wrapper for 'getResultingClient' command. Tells the worker to return
// clients.get(event.resultingClientId) for the navigation that occurs
// during this test.
//
// The return value describes how clients.get() settled. It also includes
// |queriedId| which is the id passed to clients.get() (the resultingClientId
// in this case).
//
// Example value:
// {
// queriedId: 'abc',
// promiseState: fulfilled,
// promiseValue: client,
// client: {
// id: 'abc',
// url: '//example.com/client'
// }
// }
async function getResultingClient() {
return sendCommand({command: 'getResultingClient'});
}
// Wrapper for 'getClient' command. Tells the worker to return
// clients.get(|id|). The return value is as in the getResultingClient()
// documentation.
async function getClient(id) {
return sendCommand({command: 'getClient', id: id});
}
// Navigates to |url|. Returns the result of clients.get() on the
// resultingClientId.
async function navigateAndGetResultingClient(t, url) {
const resultPromise = getResultingClient();
const frame = await with_iframe(url);
t.add_cleanup(() => {
frame.remove();
});
const result = await resultPromise;
const resultingClientId = result.queriedId;
// First test clients.get(event.resultingClientId) inside the fetch event. The
// behavior of this is subtle due to the use of iframes and about:blank
// replacement. The spec probably requires that it resolve to the original
// about:blank client, and that later that client should be discarded after
// load if the load was to another origin. Implementations might differ. For
// now, this test just asserts that the promise resolves. See
// https://github.com/w3c/ServiceWorker/issues/1385.
assert_equals(result.promiseState, 'fulfilled',
'get(event.resultingClientId) in the fetch event should fulfill');
// Test clients.get() on the previous resultingClientId again. By this
// time the load finished, so it's more straightforward how this promise
// should settle. Return the result of this promise.
return await getClient(resultingClientId);
}
// Test get(resultingClientId) in the basic same-origin case.
promise_test(async (t) => {
await startTest(t);
const url = new URL('resources/empty.html', window.location);
const result = await navigateAndGetResultingClient(t, url);
assert_equals(result.promiseState, 'fulfilled', 'promiseState');
assert_equals(result.promiseValue, 'client', 'promiseValue');
assert_equals(result.client.url, url.href, 'client.url',);
assert_equals(result.client.id, result.queriedId, 'client.id');
}, 'get(resultingClientId) for same-origin document');
// Test get(resultingClientId) when the response redirects to another origin.
promise_test(async (t) => {
await startTest(t);
// Navigate to a URL that redirects to another origin.
const base_url = new URL('.', window.location);
const host_info = get_host_info();
const other_origin_url = new URL(base_url.pathname + 'resources/empty.html',
host_info['HTTPS_REMOTE_ORIGIN']);
const url = new URL('resources/empty.html', window.location);
const pipe = `status(302)|header(Location, ${other_origin_url})`;
url.searchParams.set('pipe', pipe);
// The original reserved client should have been discarded on cross-origin
// redirect.
const result = await navigateAndGetResultingClient(t, url);
assert_equals(result.promiseState, 'fulfilled', 'promiseState');
assert_equals(result.promiseValue, 'undefinedValue', 'promiseValue');
}, 'get(resultingClientId) on cross-origin redirect');
// Test get(resultingClientId) when the document is sandboxed to a unique
// origin using a CSP HTTP response header.
promise_test(async (t) => {
await startTest(t);
// Navigate to a URL that has CSP sandboxing set in the HTTP response header.
const url = new URL('resources/empty.html', window.location);
const pipe = 'header(Content-Security-Policy, sandbox)';
url.searchParams.set('pipe', pipe);
// The original reserved client should have been discarded upon loading
// the sandboxed document.
const result = await navigateAndGetResultingClient(t, url);
assert_equals(result.promiseState, 'fulfilled', 'promiseState');
assert_equals(result.promiseValue, 'undefinedValue', 'promiseValue');
}, 'get(resultingClientId) for document sandboxed by CSP header');
// Test get(resultingClientId) when the document is sandboxed with
// allow-same-origin.
promise_test(async (t) => {
await startTest(t);
// Navigate to a URL that has CSP sandboxing set in the HTTP response header.
const url = new URL('resources/empty.html', window.location);
const pipe = 'header(Content-Security-Policy, sandbox allow-same-origin)';
url.searchParams.set('pipe', pipe);
// The client should be the original reserved client, as it's same-origin.
const result = await navigateAndGetResultingClient(t, url);
assert_equals(result.promiseState, 'fulfilled', 'promiseState');
assert_equals(result.promiseValue, 'client', 'promiseValue');
assert_equals(result.client.url, url.href, 'client.url',);
assert_equals(result.client.id, result.queriedId, 'client.id');
}, 'get(resultingClientId) for document sandboxed by CSP header with allow-same-origin');
// Cleanup. Keep this as the last promise_test.
promise_test(async (t) => {
return service_worker_unregister(t, scope);
}, 'global cleanup');
</script>

View file

@ -0,0 +1,107 @@
// This worker expects a fetch event for a navigation and messages back the
// result of clients.get(event.resultingClientId).
// Resolves when the test finishes.
let testFinishPromise;
let resolveTestFinishPromise;
let rejectTestFinishPromise;
// Resolves to clients.get(event.resultingClientId) from the fetch event.
let getPromise;
let resolveGetPromise;
let rejectGetPromise;
let resultingClientId;
function startTest() {
testFinishPromise = new Promise((resolve, reject) => {
resolveTestFinishPromise = resolve;
rejectTestFinishPromise = reject;
});
getPromise = new Promise((resolve, reject) => {
resolveGetPromise = resolve;
rejectGetPromise = reject;
});
}
async function describeGetPromiseResult(promise) {
const result = {};
await promise.then(
(client) => {
result.promiseState = 'fulfilled';
if (client === undefined) {
result.promiseValue = 'undefinedValue';
} else if (client instanceof Client) {
result.promiseValue = 'client';
result.client = {
id: client.id,
url: client.url
};
} else {
result.promiseValue = 'unknown';
}
},
(error) => {
result.promiseState = 'rejected';
});
return result;
}
async function handleGetResultingClient(event) {
// Note that this message can arrive before |resultingClientId| is populated.
const result = await describeGetPromiseResult(getPromise);
// |resultingClientId| must be populated by now.
result.queriedId = resultingClientId;
event.source.postMessage(result);
};
async function handleGetClient(event) {
const id = event.data.id;
const result = await describeGetPromiseResult(self.clients.get(id));
result.queriedId = id;
event.source.postMessage(result);
};
self.addEventListener('message', (event) => {
if (event.data.command == 'startTest') {
startTest();
event.waitUntil(testFinishPromise);
event.source.postMessage('ok');
return;
}
if (event.data.command == 'finishTest') {
resolveTestFinishPromise();
event.source.postMessage('ok');
return;
}
if (event.data.command == 'getResultingClient') {
event.waitUntil(handleGetResultingClient(event));
return;
}
if (event.data.command == 'getClient') {
event.waitUntil(handleGetClient(event));
return;
}
});
async function handleFetch(event) {
try {
resultingClientId = event.resultingClientId;
const client = await self.clients.get(resultingClientId);
resolveGetPromise(client);
} catch (error) {
rejectGetPromise(error);
}
}
self.addEventListener('fetch', (event) => {
if (event.request.mode != 'navigate')
return;
event.waitUntil(handleFetch(event));
});

View file

@ -1,10 +1,10 @@
// Opens |url| in an iframe, establish a message channel with it, and waits for // Opens |url| in an iframe, establish a message channel with it, and waits for
// a message from the frame content. Returns a promise that resolves with the // a message from the frame content. Returns a promise that resolves with the
// data of the message, or rejects on 2000ms timeout. // data of the message, or rejects on 3000ms timeout.
function openSXGInIframeAndWaitForMessage(test_object, url, referrerPolicy) { function openSXGInIframeAndWaitForMessage(test_object, url, referrerPolicy) {
return new Promise(async (resolve, reject) => { return new Promise(async (resolve, reject) => {
// We can't catch the network error on iframe. So we use the timer. // We can't catch the network error on iframe. So we use the timer.
test_object.step_timeout(() => reject('timeout'), 2000); test_object.step_timeout(() => reject('timeout'), 3000);
const frame = await withIframe(url, 'sxg_iframe', referrerPolicy); const frame = await withIframe(url, 'sxg_iframe', referrerPolicy);
const channel = new MessageChannel(); const channel = new MessageChannel();

View file

@ -15,9 +15,9 @@ passenv =
HYPOTHESIS_PROFILE HYPOTHESIS_PROFILE
[testenv:py27-flake8] [testenv:py27-flake8]
deps = -r requirements_flake8.txt deps = -rrequirements_flake8.txt
commands = flake8 --append-config=py27-flake8.ini {posargs} commands = flake8 --append-config={toxinidir}/py27-flake8.ini {posargs}
[testenv:py36-flake8] [testenv:py36-flake8]
deps = -r requirements_flake8.txt deps = -rrequirements_flake8.txt
commands = flake8 --append-config=py36-flake8.ini {posargs} commands = flake8 --append-config={toxinidir}/py36-flake8.ini {posargs}

View file

@ -171,6 +171,7 @@ class BrowserSetup(object):
return self.browser.install(venv.path, channel) return self.browser.install(venv.path, channel)
def install_requirements(self): def install_requirements(self):
if not self.venv.skip_virtualenv_setup:
self.venv.install_requirements(os.path.join(wpt_root, "tools", "wptrunner", self.browser.requirements)) self.venv.install_requirements(os.path.join(wpt_root, "tools", "wptrunner", self.browser.requirements))
def setup(self, kwargs): def setup(self, kwargs):
@ -563,6 +564,7 @@ def setup_wptrunner(venv, prompt=True, install_browser=False, **kwargs):
wptrunner_path = os.path.join(wpt_root, "tools", "wptrunner") wptrunner_path = os.path.join(wpt_root, "tools", "wptrunner")
if not venv.skip_virtualenv_setup:
venv.install_requirements(os.path.join(wptrunner_path, "requirements.txt")) venv.install_requirements(os.path.join(wptrunner_path, "requirements.txt"))
kwargs['browser_version'] = setup_cls.browser.version(binary=kwargs.get("binary"), kwargs['browser_version'] = setup_cls.browser.version(binary=kwargs.get("binary"),

View file

@ -17,6 +17,7 @@ def venv():
class Virtualenv(virtualenv.Virtualenv): class Virtualenv(virtualenv.Virtualenv):
def __init__(self): def __init__(self):
self.path = tempfile.mkdtemp() self.path = tempfile.mkdtemp()
self.skip_virtualenv_setup = False
def create(self): def create(self):
return return

View file

@ -357,7 +357,7 @@ def test_tests_affected_idlharness(capsys, manifest_dir):
wpt.main(argv=["tests-affected", "--metadata", manifest_dir, "%s~..%s" % (commit, commit)]) wpt.main(argv=["tests-affected", "--metadata", manifest_dir, "%s~..%s" % (commit, commit)])
assert excinfo.value.code == 0 assert excinfo.value.code == 0
out, err = capsys.readouterr() out, err = capsys.readouterr()
assert "webrtc/idlharness.https.window.js\n" == out assert "webrtc-stats/idlharness.window.js\nwebrtc/idlharness.https.window.js\n" == out
@pytest.mark.slow # this updates the manifest @pytest.mark.slow # this updates the manifest

View file

@ -9,8 +9,10 @@ from tools.wpt.utils import call
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class Virtualenv(object): class Virtualenv(object):
def __init__(self, path): def __init__(self, path, skip_virtualenv_setup):
self.path = path self.path = path
self.skip_virtualenv_setup = skip_virtualenv_setup
if not skip_virtualenv_setup:
self.virtualenv = find_executable("virtualenv") self.virtualenv = find_executable("virtualenv")
if not self.virtualenv: if not self.virtualenv:
raise ValueError("virtualenv must be installed and on the PATH") raise ValueError("virtualenv must be installed and on the PATH")

View file

@ -43,6 +43,9 @@ def load_commands():
def parse_args(argv, commands): def parse_args(argv, commands):
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument("--venv", action="store", help="Path to an existing virtualenv to use") parser.add_argument("--venv", action="store", help="Path to an existing virtualenv to use")
parser.add_argument("--skip-venv-setup", action="store_true",
dest="skip_venv_setup",
help="Whether to use the virtualenv as-is. Must set --venv as well")
parser.add_argument("--debug", action="store_true", help="Run the debugger in case of an exception") parser.add_argument("--debug", action="store_true", help="Run the debugger in case of an exception")
subparsers = parser.add_subparsers(dest="command") subparsers = parser.add_subparsers(dest="command")
for command, props in iteritems(commands): for command, props in iteritems(commands):
@ -77,10 +80,14 @@ def import_command(prog, command, props):
return script, parser return script, parser
def setup_virtualenv(path, props): def setup_virtualenv(path, skip_venv_setup, props):
if skip_venv_setup and path is None:
raise ValueError("Must set --venv when --skip-venv-setup is used")
should_skip_setup = path is not None and skip_venv_setup
if path is None: if path is None:
path = os.path.join(wpt_root, "_venv") path = os.path.join(wpt_root, "_venv")
venv = virtualenv.Virtualenv(path) venv = virtualenv.Virtualenv(path, should_skip_setup)
if not should_skip_setup:
venv.start() venv.start()
for name in props["install"]: for name in props["install"]:
venv.install(name) venv.install(name)
@ -105,7 +112,7 @@ def main(prog=None, argv=None):
props = commands[command] props = commands[command]
venv = None venv = None
if props["virtualenv"]: if props["virtualenv"]:
venv = setup_virtualenv(main_args.venv, props) venv = setup_virtualenv(main_args.venv, main_args.skip_venv_setup, props)
script, parser = import_command(prog, command, props) script, parser = import_command(prog, command, props)
if parser: if parser:
if props["parse_known"]: if props["parse_known"]:

View file

@ -1,42 +0,0 @@
<!doctype html>
<html>
<head>
<meta http-equiv="Content-Security-Policy" content="trusted-types *">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
</head>
<body>
<div id=log></div>
<script>
// To test workers, we need to importScripts source files in the workers.
// Since the point of this test is to test blocking of importScripts, we need
// to set up one policy that will blindly pass through URLs for use in the test
// setup, and then have additional policies for the actual test cases.
//
// For the same reason we cannot use the otherwise preferred 'META: workers'
// tag, since the test setup that uses would be blocked as soon trusted types
// enforcement is enabled.
const test_setup_policy = TrustedTypes.createPolicy("hurrayanythinggoes", {
createScriptURL: x => new URL(x, location.href)
});
const test_url =
test_setup_policy.createScriptURL("WorkerGlobalScope-importScripts.https.js");
fetch_tests_from_worker(new Worker(test_url));
fetch_tests_from_worker(new SharedWorker(test_url));
// Cargo-culted from code generated from "META: worker".
if ('serviceWorker' in navigator) {
(async function() {
const scope = 'some/scope/for/this/test';
let reg = await navigator.serviceWorker.getRegistration(scope);
if (reg) await reg.unregister();
reg = await navigator.serviceWorker.register(test_url, {scope});
fetch_tests_from_worker(reg.installing);
})();
}
</script>
</body>

View file

@ -1,70 +0,0 @@
let test_setup_policy = TrustedTypes.createPolicy("hurrayanythinggoes", {
createScriptURL: x => new URL(x, location.href)
});
importScripts(test_setup_policy.createScriptURL("/resources/testharness.js"));
// Determine worker type (for better logging)
let worker_type = "unknown";
if (this.DedicatedWorkerGlobalScope !== undefined) {
worker_type = "dedicated worker";
} else if (this.SharedWorkerGlobalScope !== undefined) {
worker_type = "shared worker";
} else if (this.ServiceWorkerGlobalScope !== undefined) {
worker_type = "service worker";
}
const test_policy = TrustedTypes.createPolicy('xxx', {
createScriptURL: url => new URL(url.replace("play", "work"), this.location.href) });
test(t => {
self.result = "Fail";
let trusted_url = test_policy.createScriptURL(new URL("support/player.js", location.href));
assert_true(TrustedTypes.isScriptURL(trusted_url));
importScripts(trusted_url); // support/worker.js modifies self.result.
assert_equals(self.result, "Pass");
}, "importScripts with TrustedScriptURL works in " + worker_type);
test(t => {
let untrusted_url = "support/player.js";
assert_throws(new TypeError(),
function() { importScripts(untrusted_url) },
"importScripts(untrusted_url)");
}, "importScripts with untrusted URLs throws in " + worker_type);
test(t => {
assert_throws(new TypeError(),
function() { importScripts(null) },
"importScripts(null)");
}, "null is not a trusted script URL throws in " + worker_type);
test(t => {
self.result = "Fail";
let trusted_url = test_policy.createScriptURL(
new URL("support/player.js?variant1", location.href));
let trusted_url2 = test_policy.createScriptURL(
new URL("support/player.js?variant2", location.href));
importScripts(trusted_url, trusted_url2);
assert_equals(self.result, "Pass");
}, "importScripts with two URLs, both trusted, in " + worker_type);
test(t => {
let untrusted_url = "support/player.js?variant1";
let untrusted_url2 = "support/player.js?variant2";
assert_throws(new TypeError(),
function() { importScripts(untrusted_url, untrusted_url2) },
"importScripts(untrusted_url, untrusted_url2)");
}, "importScripts with two URLs, both strings, in " + worker_type);
test(t => {
let untrusted_url = "support/player.js";
let trusted_url = test_policy.createScriptURL(
new URL(untrusted_url, location.href));
assert_throws(new TypeError(),
function() { importScripts(untrusted_url, trusted_url) },
"importScripts(untrusted_url, trusted_url)");
}, "importScripts with two URLs, one trusted, in " + worker_type);
done();

View file

@ -1 +0,0 @@
Content-Security-Policy: trusted-types *

View file

@ -109,7 +109,7 @@ ALL_KEYS = getmembers(Keys, lambda x: type(x) == unicode)
ALL_EVENTS = { ALL_EVENTS = {
"ADD": { "ADD": {
"code": "", "code": "NumpadAdd",
"ctrl": False, "ctrl": False,
"key": "+", "key": "+",
"location": 3, "location": 3,
@ -496,7 +496,7 @@ ALL_EVENTS = {
"value": u"\ue023", "value": u"\ue023",
}, },
"PAGE_DOWN": { "PAGE_DOWN": {
"code": "", "code": "PageDown",
"ctrl": False, "ctrl": False,
"key": "PageDown", "key": "PageDown",
"location": 0, "location": 0,
@ -505,7 +505,7 @@ ALL_EVENTS = {
"value": u"\ue00f", "value": u"\ue00f",
}, },
"PAGE_UP": { "PAGE_UP": {
"code": "", "code": "PageUp",
"ctrl": False, "ctrl": False,
"key": "PageUp", "key": "PageUp",
"location": 0, "location": 0,
@ -676,7 +676,7 @@ ALL_EVENTS = {
"value": u"\ue018", "value": u"\ue018",
}, },
"SEPARATOR": { "SEPARATOR": {
"code": "NumpadSubtract", "code": "NumpadComma",
"ctrl": False, "ctrl": False,
"key": ",", "key": ",",
"location": 3, "location": 3,
@ -703,7 +703,7 @@ ALL_EVENTS = {
"value": u"\ue00d", "value": u"\ue00d",
}, },
"SUBTRACT": { "SUBTRACT": {
"code": "", "code": "NumpadSubtract",
"ctrl": False, "ctrl": False,
"key": "-", "key": "-",
"location": 3, "location": 3,

View file

@ -74,19 +74,19 @@
test(t => { test(t => {
const candidate = new RTCIceCandidate({ sdpMid: 'audio' }); const candidate = new RTCIceCandidate({ sdpMid: 'audio' });
assert_equals(candidate.candidate, ''); assert_equals(candidate.candidate, '', 'candidate');
assert_equals(candidate.sdpMid, 'audio'); assert_equals(candidate.sdpMid, 'audio', 'sdpMid');
assert_equals(candidate.sdpMLineIndex, null); assert_equals(candidate.sdpMLineIndex, null, 'sdpMLineIndex');
assert_equals(candidate.usernameFragment, null); assert_equals(candidate.usernameFragment, null, 'usernameFragment');
}, `new RTCIceCandidate({ sdpMid: 'audio' })`); }, `new RTCIceCandidate({ sdpMid: 'audio' })`);
test(t => { test(t => {
const candidate = new RTCIceCandidate({ sdpMLineIndex: 0 }); const candidate = new RTCIceCandidate({ sdpMLineIndex: 0 });
assert_equals(candidate.candidate, ''); assert_equals(candidate.candidate, '', 'candidate');
assert_equals(candidate.sdpMid, null); assert_equals(candidate.sdpMid, null, 'sdpMid');
assert_equals(candidate.sdpMLineIndex, 0); assert_equals(candidate.sdpMLineIndex, 0, 'sdpMLineIndex');
assert_equals(candidate.usernameFragment, null); assert_equals(candidate.usernameFragment, null, 'usernameFragment');
}, 'new RTCIceCandidate({ sdpMLineIndex: 0 })'); }, 'new RTCIceCandidate({ sdpMLineIndex: 0 })');
test(t => { test(t => {
@ -95,10 +95,10 @@
sdpMLineIndex: 0 sdpMLineIndex: 0
}); });
assert_equals(candidate.candidate, ''); assert_equals(candidate.candidate, '', 'candidate');
assert_equals(candidate.sdpMid, 'audio'); assert_equals(candidate.sdpMid, 'audio', 'sdpMid');
assert_equals(candidate.sdpMLineIndex, 0); assert_equals(candidate.sdpMLineIndex, 0, 'sdpMLineIndex');
assert_equals(candidate.usernameFragment, null); assert_equals(candidate.usernameFragment, null, 'usernameFragment');
}, `new RTCIceCandidate({ sdpMid: 'audio', sdpMLineIndex: 0 })`); }, `new RTCIceCandidate({ sdpMid: 'audio', sdpMLineIndex: 0 })`);
test(t => { test(t => {
@ -107,10 +107,10 @@
sdpMid: 'audio' sdpMid: 'audio'
}); });
assert_equals(candidate.candidate, ''); assert_equals(candidate.candidate, '', 'candidate');
assert_equals(candidate.sdpMid, 'audio'); assert_equals(candidate.sdpMid, 'audio', 'sdpMid');
assert_equals(candidate.sdpMLineIndex, null); assert_equals(candidate.sdpMLineIndex, null, 'sdpMLineIndex');
assert_equals(candidate.usernameFragment, null); assert_equals(candidate.usernameFragment, null, 'usernameFragment');
}, `new RTCIceCandidate({ candidate: '', sdpMid: 'audio' }`); }, `new RTCIceCandidate({ candidate: '', sdpMid: 'audio' }`);
test(t => { test(t => {
@ -119,10 +119,10 @@
sdpMLineIndex: 0 sdpMLineIndex: 0
}); });
assert_equals(candidate.candidate, ''); assert_equals(candidate.candidate, '', 'candidate');
assert_equals(candidate.sdpMid, null); assert_equals(candidate.sdpMid, null, 'sdpMid', 'sdpMid');
assert_equals(candidate.sdpMLineIndex, 0); assert_equals(candidate.sdpMLineIndex, 0, 'sdpMLineIndex');
assert_equals(candidate.usernameFragment, null); assert_equals(candidate.usernameFragment, null, 'usernameFragment');
}, `new RTCIceCandidate({ candidate: '', sdpMLineIndex: 0 }`); }, `new RTCIceCandidate({ candidate: '', sdpMLineIndex: 0 }`);
test(t => { test(t => {
@ -131,10 +131,10 @@
sdpMid: 'audio' sdpMid: 'audio'
}); });
assert_equals(candidate.candidate, candidateString); assert_equals(candidate.candidate, candidateString, 'candidate');
assert_equals(candidate.sdpMid, 'audio'); assert_equals(candidate.sdpMid, 'audio', 'sdpMid');
assert_equals(candidate.sdpMLineIndex, null); assert_equals(candidate.sdpMLineIndex, null, 'sdpMLineIndex');
assert_equals(candidate.usernameFragment, null); assert_equals(candidate.usernameFragment, null, 'usernameFragment');
}, 'new RTCIceCandidate({ ... }) with valid candidate string and sdpMid'); }, 'new RTCIceCandidate({ ... }) with valid candidate string and sdpMid');
test(t =>{ test(t =>{
@ -144,10 +144,10 @@
sdpMid: 'audio' sdpMid: 'audio'
}); });
assert_equals(candidate.candidate, arbitraryString); assert_equals(candidate.candidate, arbitraryString, 'candidate');
assert_equals(candidate.sdpMid, 'audio'); assert_equals(candidate.sdpMid, 'audio', 'sdpMid');
assert_equals(candidate.sdpMLineIndex, null); assert_equals(candidate.sdpMLineIndex, null, 'sdpMLineIndex');
assert_equals(candidate.usernameFragment, null); assert_equals(candidate.usernameFragment, null, 'usernameFragment');
}, 'new RTCIceCandidate({ ... }) with invalid candidate string and sdpMid'); }, 'new RTCIceCandidate({ ... }) with invalid candidate string and sdpMid');
test(t => { test(t => {
@ -158,10 +158,10 @@
usernameFragment: 'test' usernameFragment: 'test'
}); });
assert_equals(candidate.candidate, candidateString); assert_equals(candidate.candidate, candidateString, 'candidate');
assert_equals(candidate.sdpMid, 'video'); assert_equals(candidate.sdpMid, 'video', 'sdpMid');
assert_equals(candidate.sdpMLineIndex, 1); assert_equals(candidate.sdpMLineIndex, 1, 'sdpMLineIndex');
assert_equals(candidate.usernameFragment, 'test'); assert_equals(candidate.usernameFragment, 'test', 'usernameFragment');
}, 'new RTCIceCandidate({ ... }) with non default value for all fields'); }, 'new RTCIceCandidate({ ... }) with non default value for all fields');
@ -171,10 +171,10 @@
sdpMid: arbitraryString sdpMid: arbitraryString
}); });
assert_equals(candidate.candidate, ''); assert_equals(candidate.candidate, '', 'candidate');
assert_equals(candidate.sdpMid, arbitraryString); assert_equals(candidate.sdpMid, arbitraryString, 'sdpMid');
assert_equals(candidate.sdpMLineIndex, null); assert_equals(candidate.sdpMLineIndex, null, 'sdpMLineIndex');
assert_equals(candidate.usernameFragment, null); assert_equals(candidate.usernameFragment, null, 'usernameFragment');
}, 'new RTCIceCandidate({ ... }) with invalid sdpMid'); }, 'new RTCIceCandidate({ ... }) with invalid sdpMid');
@ -187,10 +187,10 @@
sdpMLineIndex: 65535 sdpMLineIndex: 65535
}); });
assert_equals(candidate.candidate, ''); assert_equals(candidate.candidate, '', 'candidate');
assert_equals(candidate.sdpMid, null); assert_equals(candidate.sdpMid, null, 'sdpMid');
assert_equals(candidate.sdpMLineIndex, 65535); assert_equals(candidate.sdpMLineIndex, 65535, 'sdpMLineIndex');
assert_equals(candidate.usernameFragment, null); assert_equals(candidate.usernameFragment, null, 'usernameFragment');
}, 'new RTCIceCandidate({ ... }) with invalid sdpMLineIndex'); }, 'new RTCIceCandidate({ ... }) with invalid sdpMLineIndex');
</script> </script>

View file

@ -177,6 +177,7 @@ test(t => {
const candidate1 = new RTCIceCandidate({ const candidate1 = new RTCIceCandidate({
candidate: 'candidate:1 1 udp 2113929471 203.0.113.100 10100 typ host', candidate: 'candidate:1 1 udp 2113929471 203.0.113.100 10100 typ host',
sdpMid: '',
}); });
test(() => { test(() => {
@ -191,7 +192,7 @@ test(() => {
const iceTransport = new RTCIceTransport(); const iceTransport = new RTCIceTransport();
assert_throws('OperationError', assert_throws('OperationError',
() => iceTransport.addRemoteCandidate( () => iceTransport.addRemoteCandidate(
new RTCIceCandidate({ candidate: 'invalid' }))); new RTCIceCandidate({ candidate: 'invalid', sdpMid: '' })));
assert_array_equals(iceTransport.getRemoteCandidates(), []); assert_array_equals(iceTransport.getRemoteCandidates(), []);
}, 'addRemoteCandidate() throws on invalid candidate'); }, 'addRemoteCandidate() throws on invalid candidate');

View file

@ -0,0 +1,57 @@
["localStorage", "sessionStorage"].forEach(function(name) {
[9, "x"].forEach(function(key) {
test(function() {
var desc = {
value: "value",
};
var storage = window[name];
storage.clear();
assert_equals(storage[key], undefined);
assert_equals(storage.getItem(key), null);
assert_equals(Object.defineProperty(storage, key, desc), storage);
assert_equals(storage[key], "value");
assert_equals(storage.getItem(key), "value");
}, "Defining data property for key " + key + " on " + name);
test(function() {
var desc1 = {
value: "value",
};
var desc2 = {
value: "new value",
};
var storage = window[name];
storage.clear();
assert_equals(storage[key], undefined);
assert_equals(storage.getItem(key), null);
assert_equals(Object.defineProperty(storage, key, desc1), storage);
assert_equals(storage[key], "value");
assert_equals(storage.getItem(key), "value");
assert_equals(Object.defineProperty(storage, key, desc2), storage);
assert_equals(storage[key], "new value");
assert_equals(storage.getItem(key), "new value");
}, "Defining data property for key " + key + " on " + name + " twice");
test(function() {
var desc = {
value: {
toString: function() { return "value"; }
},
};
var storage = window[name];
storage.clear();
assert_equals(storage[key], undefined);
assert_equals(storage.getItem(key), null);
assert_equals(Object.defineProperty(storage, key, desc), storage);
assert_equals(storage[key], "value");
assert_equals(storage.getItem(key), "value");
}, "Defining data property with toString for key " + key + " on " + name);
});
});

View file

@ -0,0 +1,102 @@
["localStorage", "sessionStorage"].forEach(function(name) {
[9, "x"].forEach(function(key) {
test(function() {
var value = "value";
var storage = window[name];
storage.clear();
assert_equals(storage[key], undefined);
assert_equals(storage.getItem(key), null);
assert_equals(storage[key] = value, value);
assert_equals(storage[key], "value");
assert_equals(storage.getItem(key), "value");
}, "Setting property for key " + key + " on " + name);
test(function() {
var value = {
toString: function() { return "value"; }
};
var storage = window[name];
storage.clear();
assert_equals(storage[key], undefined);
assert_equals(storage.getItem(key), null);
assert_equals(storage[key] = value, value);
assert_equals(storage[key], "value");
assert_equals(storage.getItem(key), "value");
}, "Setting property with toString for key " + key + " on " + name);
test(function() {
Storage.prototype[key] = "proto";
this.add_cleanup(function() { delete Storage.prototype[key]; });
var value = "value";
var storage = window[name];
storage.clear();
assert_equals(storage[key], "proto");
assert_equals(storage.getItem(key), null);
assert_equals(storage[key] = value, value);
// Hidden because no [OverrideBuiltins].
assert_equals(storage[key], "proto");
assert_equals(Object.getOwnPropertyDescriptor(storage, key), undefined);
assert_equals(storage.getItem(key), "value");
}, "Setting property for key " + key + " on " + name + " with data property on prototype");
test(function() {
Storage.prototype[key] = "proto";
this.add_cleanup(function() { delete Storage.prototype[key]; });
var value = "value";
var storage = window[name];
storage.clear();
storage.setItem(key, "existing");
// Hidden because no [OverrideBuiltins].
assert_equals(storage[key], "proto");
assert_equals(Object.getOwnPropertyDescriptor(storage, key), undefined);
assert_equals(storage.getItem(key), "existing");
assert_equals(storage[key] = value, value);
assert_equals(storage[key], "proto");
assert_equals(Object.getOwnPropertyDescriptor(storage, key), undefined);
assert_equals(storage.getItem(key), "value");
}, "Setting property for key " + key + " on " + name + " with data property on prototype and existing item");
test(function() {
var calledSetter = [];
Object.defineProperty(Storage.prototype, key, {
"get": function() { return "proto getter"; },
"set": function(v) { calledSetter.push(v); },
configurable: true,
});
this.add_cleanup(function() { delete Storage.prototype[key]; });
var value = "value";
var storage = window[name];
storage.clear();
assert_equals(storage[key], "proto getter");
assert_equals(storage.getItem(key), null);
assert_equals(storage[key] = value, value);
// Property is hidden because no [OverrideBuiltins].
if (typeof key === "number") {
// P is an array index: call through to OrdinarySetWithOwnDescriptor()
assert_array_equals(calledSetter, [value]);
assert_equals(storage[key], "proto getter");
assert_equals(storage.getItem(key), null);
} else {
// P is not an array index: early return in [[Set]] step 2.
// https://github.com/heycam/webidl/issues/630
assert_equals(storage[key], "proto getter");
assert_equals(Object.getOwnPropertyDescriptor(storage, key), undefined);
assert_equals(storage.getItem(key), "value");
}
}, "Setting property for key " + key + " on " + name + " with accessor property on prototype");
});
});

View file

@ -1,19 +0,0 @@
<!DOCTYPE html>
<body>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src="resources/webxr_util.js"></script>
<script>
xr_promise_test("navigator.xr.requestDevice returns a device", (t) => {
return XRTest.simulateDeviceConnection({ supportsImmersive: true })
.then( (controller) => { return navigator.xr.requestDevice() })
.then( (device) => {
t.step(() => {
assert_true(device != null);
assert_true(device instanceof XRDevice);
});
});
});
</script>
</body>

View file

@ -1,12 +0,0 @@
<!DOCTYPE html>
<body>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src="resources/webxr_util.js"></script>
<script>
promise_test( (t) => {
return promise_rejects(t, 'NotFoundError', navigator.xr.requestDevice());
}, "navigator.xr.requestDevice properly rejects when there are 0 devices");
</script>
</body>

View file

@ -26,7 +26,6 @@ function xr_promise_test(name, func, properties) {
// Requires a webglCanvas on the page. // Requires a webglCanvas on the page.
function xr_session_promise_test( function xr_session_promise_test(
name, func, fakeDeviceInit, sessionOptions, properties) { name, func, fakeDeviceInit, sessionOptions, properties) {
let testDevice;
let testDeviceController; let testDeviceController;
let testSession; let testSession;
@ -44,16 +43,12 @@ function xr_session_promise_test(
XRTest.simulateDeviceConnection(fakeDeviceInit) XRTest.simulateDeviceConnection(fakeDeviceInit)
.then((controller) => { .then((controller) => {
testDeviceController = controller; testDeviceController = controller;
return navigator.xr.requestDevice();
})
.then((device) => {
testDevice = device;
return gl.makeXRCompatible(); return gl.makeXRCompatible();
}) })
.then(() => new Promise((resolve, reject) => { .then(() => new Promise((resolve, reject) => {
// Perform the session request in a user gesture. // Perform the session request in a user gesture.
XRTest.simulateUserActivation(() => { XRTest.simulateUserActivation(() => {
testDevice.requestSession(sessionOptions) navigator.xr.requestSession(sessionOptions)
.then((session) => { .then((session) => {
testSession = session; testSession = session;
// Session must have a baseLayer or frame requests // Session must have a baseLayer or frame requests
@ -74,7 +69,7 @@ function xr_session_promise_test(
.then(() => { .then(() => {
// Cleanup system state. // Cleanup system state.
testSession.end().catch(() => {}); testSession.end().catch(() => {});
XRTest.simulateDeviceDisconnection(testDevice); XRTest.simulateDeviceDisconnection();
}), }),
properties); properties);
} }
@ -97,7 +92,6 @@ function getOutputContext() {
// that API object. // that API object.
function forEachWebxrObject(callback) { function forEachWebxrObject(callback) {
callback(window.navigator.xr, 'navigator.xr'); callback(window.navigator.xr, 'navigator.xr');
callback(window.XRDevice, 'XRDevice');
callback(window.XRSession, 'XRSession'); callback(window.XRSession, 'XRSession');
callback(window.XRSessionCreationOptions, 'XRSessionCreationOptions'); callback(window.XRSessionCreationOptions, 'XRSessionCreationOptions');
callback(window.XRFrameRequestCallback, 'XRFrameRequestCallback'); callback(window.XRFrameRequestCallback, 'XRFrameRequestCallback');

View file

@ -9,6 +9,6 @@
"Tests requestSession resolves when supported", "Tests requestSession resolves when supported",
(session) => { (session) => {
assert_not_equals(session, null); assert_not_equals(session, null);
}, { supportsImmersive:true }, { immersive: true }); }, { supportsImmersive:true }, { mode: 'immersive-vr' });
</script> </script>
</body> </body>

View file

@ -8,9 +8,8 @@
"Requesting immersive session outside of a user gesture rejects", "Requesting immersive session outside of a user gesture rejects",
(t) => { (t) => {
return XRTest.simulateDeviceConnection({ supportsImmersive:true }) return XRTest.simulateDeviceConnection({ supportsImmersive:true })
.then( (controller) => { return navigator.xr.requestDevice() }) .then( (controller) => promise_rejects(
.then( (device) => promise_rejects( t, 'SecurityError', navigator.xr.requestSession({ mode: 'immersive-vr' })));
t, 'SecurityError', device.requestSession({ immersive: true })));
}); });
</script> </script>
</body> </body>

View file

@ -8,13 +8,12 @@
"Requesting an immersive session when unsupported rejects", "Requesting an immersive session when unsupported rejects",
(t) => { (t) => {
return XRTest.simulateDeviceConnection({ supportsImmersive:false }) return XRTest.simulateDeviceConnection({ supportsImmersive:false })
.then( (controller) => { return navigator.xr.requestDevice() }) .then( (controller) => new Promise((resolve) => {
.then( (magicWindowOnlyDevice) => new Promise((resolve) => {
XRTest.simulateUserActivation( () => { XRTest.simulateUserActivation( () => {
resolve(promise_rejects( resolve(promise_rejects(
t, t,
"NotSupportedError", "NotSupportedError",
magicWindowOnlyDevice.requestSession({ immersive: true }) navigator.xr.requestSession({ mode: 'immersive-vr' })
)) ))
}); });
})); }));

View file

@ -8,9 +8,8 @@
"Requesting non-immersive session outside of a user gesture succeeds", "Requesting non-immersive session outside of a user gesture succeeds",
(t) => { (t) => {
return XRTest.simulateDeviceConnection({ supportsImmersive:false }) return XRTest.simulateDeviceConnection({ supportsImmersive:false })
.then( (controller) => { return navigator.xr.requestDevice(); }) .then( (controller) => navigator.xr.requestSession({
.then( (device) => device.requestSession({ mode: 'inline',
immersive: false,
outputContext: getOutputContext() outputContext: getOutputContext()
})) }))
.then( (session) => { assert_not_equals(session, null); }); .then( (session) => { assert_not_equals(session, null); });

View file

@ -5,11 +5,10 @@
<script src="resources/webxr_util.js"></script> <script src="resources/webxr_util.js"></script>
<script> <script>
xr_promise_test( xr_promise_test(
"supportsSession resolves when immersive options supported", "supportsSessionMode resolves when immersive options supported",
() => { () => {
return XRTest.simulateDeviceConnection({ supportsImmersive:true }) return XRTest.simulateDeviceConnection({ supportsImmersive:true })
.then( (controller) => { return navigator.xr.requestDevice() }) .then( (controller) => navigator.xr.supportsSessionMode('immersive-vr'));
.then( (device) => device.supportsSession({ immersive: true }));
}); });
</script> </script>
</body> </body>

View file

@ -5,15 +5,14 @@
<script src="resources/webxr_util.js"></script> <script src="resources/webxr_util.js"></script>
<script> <script>
xr_promise_test( xr_promise_test(
"supportsSession rejects when options not supported", "supportsSessionMode rejects when options not supported",
(t) => { (t) => {
return XRTest.simulateDeviceConnection({ supportsImmersive:false }) return XRTest.simulateDeviceConnection({ supportsImmersive:false })
.then( (controller) => { return navigator.xr.requestDevice() }) .then( (controller) => {
.then( (device) => {
return promise_rejects( return promise_rejects(
t, t,
"NotSupportedError", "NotSupportedError",
device.supportsSession({ immersive: true }) navigator.xr.supportsSessionMode('immersive-vr')
); );
}); });
}); });

View file

@ -5,18 +5,12 @@
<script src="resources/webxr_util.js"></script> <script src="resources/webxr_util.js"></script>
<script> <script>
xr_promise_test( xr_promise_test(
"supportsSession resolves when non-immersive options supported", "supportsSessionMode resolves when inline options supported",
(t) => { (t) => {
return XRTest.simulateDeviceConnection({ supportsImmersive:true }) return XRTest.simulateDeviceConnection({ supportsImmersive:true })
.then( (controller) => { return navigator.xr.requestDevice() }) .then( (controller) => {
.then( (device) => { // Inline sessions should be supported.
// Non-immersive sessions without a outputContext should not be supported. return navigator.xr.supportsSessionMode('inline');
promise_rejects(t, 'NotSupportedError', device.supportsSession());
// Non-immersive sessions with an outputContext should be supported.
return device.supportsSession({
outputContext: getOutputContext()
});
}); });
}); });
</script> </script>

View file

@ -13,7 +13,7 @@
let fakeDeviceInitParams = { supportsImmersive:true }; let fakeDeviceInitParams = { supportsImmersive:true };
let immersiveSessionOptions = { immersive: true }; let immersiveSessionOptions = { mode: 'immersive-vr' };
let nonImmersiveSessionOptions = { outputContext: getOutputContext() }; let nonImmersiveSessionOptions = { outputContext: getOutputContext() };
let testFunction = (session) => new Promise((resolve, reject) => { let testFunction = (session) => new Promise((resolve, reject) => {

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