mirror of
https://github.com/servo/servo.git
synced 2025-07-13 18:33:40 +01:00
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:
commit
5fd64d9436
109 changed files with 2053 additions and 708 deletions
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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": [
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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]
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
[stale-css.tentative.html]
|
||||||
|
[Cache returns stale resource]
|
||||||
|
expected: FAIL
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
[stale-image.tentative.html]
|
||||||
|
expected: TIMEOUT
|
||||||
|
[Cache returns stale resource]
|
||||||
|
expected: TIMEOUT
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
[stale-script.tentative.html]
|
||||||
|
[Cache returns stale resource]
|
||||||
|
expected: FAIL
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
[traverse_the_history_1.html]
|
||||||
|
[Multiple history traversals from the same task]
|
||||||
|
expected: FAIL
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
[traverse_the_history_5.html]
|
||||||
|
[Multiple history traversals, last would be aborted]
|
||||||
|
expected: FAIL
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
[promise-rejection-events.html]
|
||||||
|
expected: TIMEOUT
|
||||||
|
[rejectionhandled is dispatched from a queued task, and not immediately]
|
||||||
|
expected: TIMEOUT
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
[resource_connection_reuse_mixed_content.html]
|
||||||
|
[There should be 2 PerformanceEntries]
|
||||||
|
expected: FAIL
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
[resource_connection_reuse_mixed_content_redirect.html]
|
||||||
|
[There should be 2 PerformanceEntries]
|
||||||
|
expected: FAIL
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
7
tests/wpt/metadata/webstorage/set.window.js.ini
Normal file
7
tests/wpt/metadata/webstorage/set.window.js.ini
Normal 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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
[003.html]
|
[003.html]
|
||||||
type: testharness
|
type: testharness
|
||||||
|
expected: ERROR
|
||||||
[shared]
|
[shared]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
[transition_calc_implicit.html]
|
||||||
|
expected: TIMEOUT
|
|
@ -1,4 +0,0 @@
|
||||||
[paint_timing.html]
|
|
||||||
[Performance entries observer]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -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())
|
|
||||||
};
|
|
||||||
|
|
|
@ -1,11 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<style>
|
|
||||||
#box {
|
|
||||||
width: 100px;
|
|
||||||
height: 100px;
|
|
||||||
transform: translateY(100px);
|
|
||||||
background-color: green;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<div id="box"></div>
|
|
|
@ -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>
|
|
|
@ -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>
|
|
|
@ -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>
|
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
125
tests/wpt/web-platform-tests/css/css-syntax/anb-parsing.html
Normal file
125
tests/wpt/web-platform-tests/css/css-syntax/anb-parsing.html
Normal 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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
62
tests/wpt/web-platform-tests/css/css-syntax/whitespace.html
Normal file
62
tests/wpt/web-platform-tests/css/css-syntax/whitespace.html
Normal 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>
|
|
@ -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>
|
||||||
|
|
|
@ -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">
|
||||||
|
|
|
@ -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">
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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>
|
|
@ -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
|
|
@ -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>
|
|
@ -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)
|
|
@ -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>
|
|
@ -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
|
|
@ -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>
|
Binary file not shown.
|
@ -7,3 +7,7 @@
|
||||||
interface AmbientLightSensor : Sensor {
|
interface AmbientLightSensor : Sensor {
|
||||||
readonly attribute double? illuminance;
|
readonly attribute double? illuminance;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
dictionary AmbientLightReadingValues {
|
||||||
|
required double? illuminance;
|
||||||
|
};
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
};
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
};
|
};
|
||||||
|
|
|
@ -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)]
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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')
|
||||||
|
|
|
@ -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')
|
||||||
}
|
}
|
||||||
|
|
|
@ -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>
|
|
@ -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>
|
|
@ -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)):
|
||||||
|
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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));
|
||||||
|
});
|
|
@ -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();
|
||||||
|
|
|
@ -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}
|
||||||
|
|
|
@ -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"),
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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"]:
|
||||||
|
|
|
@ -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>
|
|
|
@ -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();
|
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
Content-Security-Policy: trusted-types *
|
|
|
@ -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,
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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');
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
});
|
||||||
|
});
|
102
tests/wpt/web-platform-tests/webstorage/set.window.js
Normal file
102
tests/wpt/web-platform-tests/webstorage/set.window.js
Normal 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");
|
||||||
|
});
|
||||||
|
});
|
|
@ -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>
|
|
|
@ -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>
|
|
|
@ -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');
|
||||||
|
|
|
@ -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>
|
|
@ -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>
|
||||||
|
|
|
@ -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' })
|
||||||
))
|
))
|
||||||
});
|
});
|
||||||
}));
|
}));
|
||||||
|
|
|
@ -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); });
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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')
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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
Loading…
Add table
Add a link
Reference in a new issue