Auto merge of #29367 - servo:wpt_update_16-02-2023, r=servo-wpt-sync

Sync WPT with upstream (16-02-2023)

Automated downstream sync of changes from upstream as of 16-02-2023
[no-wpt-sync]
r? @servo-wpt-sync
This commit is contained in:
bors-servo 2023-02-16 04:58:38 +01:00 committed by GitHub
commit 658cb986b4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
91 changed files with 1387 additions and 535 deletions

View file

@ -1,4 +0,0 @@
[url-charset.window.html]
expected: TIMEOUT
[Blob charset should override any auto-detected charset.]
expected: TIMEOUT

View file

@ -3783,6 +3783,20 @@
null,
{}
]
],
"root-element-display-none-crash.html": [
"fc55719c7e87bccb9d2862464b19e19112e02711",
[
null,
{}
]
],
"root-element-display-none-during-transition-crash.html": [
"19f4143aa6a4c6c8ec63206d1e94fab56f6181c6",
[
null,
{}
]
]
},
"css-writing-modes": {
@ -199144,6 +199158,35 @@
}
]
],
"clip-path-svg-text-css.html": [
"8a0d7111b0c3d86cf632e1d1c98c3fcf40d5b980",
[
null,
[
[
"/css/css-masking/clip-path/reference/clip-path-svg-text-css-ref.html",
"=="
]
],
{
"fuzzy": [
[
null,
[
[
0,
1
],
[
0,
200
]
]
]
]
}
]
],
"clip-path-svg-text-font-loading.html": [
"230c36ce6e731b8303b78471454e5c78408f81d5",
[
@ -276622,6 +276665,19 @@
{}
]
],
"new-content-from-root-display-none.html": [
"4d2ad28b17844f0b878a408cb8c04ff895aea06c",
[
null,
[
[
"/css/css-view-transitions/new-content-from-root-display-none-ref.html",
"=="
]
],
{}
]
],
"new-content-has-scrollbars.html": [
"4024952b13ac1953d9874ad08dfcd6bf08edeadd",
[
@ -320336,7 +320392,7 @@
]
},
"CODEOWNERS": [
"c1da5c0706ea4feb99127bf775b4e92a0f85c2f0",
"2372633782e226189279edc24e5c19e0fd313494",
[]
],
"CODE_OF_CONDUCT.md": [
@ -323397,12 +323453,12 @@
[]
],
"feature-policy.https.html.headers": [
"8e976388eccff54a054dbd681be6a293f2b584b5",
"11bbceff0acba6f14a04c10f2da30a2122c7b311",
[]
]
},
"feature-policy.sub.https.html.headers": [
"78bbb8c8729dcd7940f2e8b1a582b4d78e82f929",
"d968517a3ad9d279164dd6d9ca366ffbb6285c75",
[]
]
},
@ -323416,7 +323472,7 @@
[]
],
"cross-origin-iframe-redirect-with-fp-delegation.https.html.headers": [
"f3f85f9ebaaf7083dce29cd520d3ac3d10221895",
"28580b0a6fcbc5e88e55c528eee2039f569d09ee",
[]
],
"cross-origin-navigation-redirect.https.html.headers": [
@ -323424,7 +323480,7 @@
[]
],
"cross-origin-subresource-redirect-with-fp-delegation.https.html.headers": [
"ed4100978494d56419dc01e4cc2ccec3407bf452",
"28580b0a6fcbc5e88e55c528eee2039f569d09ee",
[]
],
"cross-origin-subresource-redirect.https.html.headers": [
@ -323497,7 +323553,7 @@
[]
],
"feature-policy-with-cross-origin-subresource.html.headers": [
"cb6b0cfd13c291312d53b1105aed3f44c4c8cac8",
"4738714fb493374d67789c87bbaa0d8cd99286e8",
[]
],
"http-equiv-accept-ch.html": [
@ -343683,11 +343739,11 @@
],
"support": {
"connect-src-allow.sub.js": [
"5812faf5fa6a03b27a1f430e04fd5cc53f8aa9b7",
"7f0ee1f837a0b99e5e75630c9c6b10e287ae4ffa",
[]
],
"connect-src-self-report-only.sub.js": [
"0287f110d4c51b0aa39d90fa2f7b6676b194d81d",
"c62467147602801d6172cd37073e58b4422cd8b4",
[]
],
"connect-src-self-report-only.sub.js.sub.headers": [
@ -343695,7 +343751,7 @@
[]
],
"connect-src-self.sub.js": [
"fd639c29cf8912e895c8df832f5e1dce5e183655",
"3c3ecc01c2d75188b6b778eeb4794a6cdf2837b9",
[]
],
"script-src-allow.sub.js": [
@ -382701,6 +382757,10 @@
"e31282c02fdbfd08bbe80acb245bb7b85c28bee9",
[]
],
"clip-path-svg-text-css-ref.html": [
"8cf2cd253a4ba7485ad1a578f0c647972b264eae",
[]
],
"clip-path-transform-mutated-001-ref.html": [
"f718ea6abfbab54333ba674ff0dcd320d8672bcd",
[]
@ -396635,6 +396695,10 @@
"94280ae3affc4350e4100d6bd390fb860ffe1a5a",
[]
],
"new-content-from-root-display-none-ref.html": [
"e936a779c743ae8e0b5542ee064846ddb0749553",
[]
],
"new-content-has-scrollbars-ref.html": [
"eddd7330144b538455e5fa4a3609299dcb3c63c8",
[]
@ -422253,6 +422317,10 @@
]
},
"user-activation": {
"META.yml": [
"e50fcfc84ff1f564f6fafb4dfe267df4ffbfb971",
[]
],
"resources": {
"child-message-event-api.html": [
"a0001633c22d19e44c1f48ddeffa07dde1fbc436",
@ -447098,6 +447166,10 @@
],
"tentative": {
"resources": {
"permissions-iframe.https.html": [
"c9907203322112ffb01a50b09541e891250c4f5e",
[]
],
"requestStorageAccessForOrigin-iframe.html": [
"43d16705c8515b48685420c8d14925af90afb62a",
[]
@ -449601,7 +449673,7 @@
[]
],
"videoFrame-serialization.crossAgentCluster.serviceworker.js": [
"218157c5e9a130a648495e5998a74d34bd996ade",
"9b963610befab36124cfb2e61239253ad343a219",
[]
],
"videoFrame-utils.js": [
@ -453552,8 +453624,8 @@
[]
]
},
"webxr_feature_policy.https.html.headers": [
"2c758962332e723453f31a6cb8d3dfc3ac292d44",
"webxr_permissions_policy.https.html.headers": [
"56b8c11a5bd4013b4e9133328155dbe0e8726ec9",
[]
]
},
@ -496912,7 +496984,7 @@
]
],
"font-feature-settings-computed.html": [
"89704ac5f477f32be76ad073b9814172e7f9bdf3",
"44b9d1c535a0add5530c34508c785b4a5ccad4b6",
[
null,
{}
@ -497360,7 +497432,7 @@
]
],
"font-variation-settings-computed.html": [
"521461657e8d4b4749042c102685c1491e67f3dd",
"8e72161193a27e4c342af96895bc0cc1f80922aa",
[
null,
{}
@ -557052,8 +557124,26 @@
]
},
"private-network-access": {
"fetch-from-treat-as-public.https.window.js": [
"90f7feb63419d7e3c03811679644f6ccc4abd2a7",
[
"fetch/private-network-access/fetch-from-treat-as-public.https.window.html",
{
"script_metadata": [
[
"script",
"/common/utils.js"
],
[
"script",
"resources/support.sub.js"
]
]
}
]
],
"fetch.https.window.js": [
"7a3cc20c4c573c9cda1f7f703c08d5902aa78bd0",
"dbc4f23f677c716ba439c508c42ee33f4b1b3233",
[
"fetch/private-network-access/fetch.https.window.html?include=baseline",
{
@ -557085,10 +557175,6 @@
[
"variant",
"?include=from-public"
],
[
"variant",
"?include=from-treat-as-public"
]
]
}
@ -557124,10 +557210,6 @@
[
"variant",
"?include=from-public"
],
[
"variant",
"?include=from-treat-as-public"
]
]
}
@ -557163,10 +557245,6 @@
[
"variant",
"?include=from-public"
],
[
"variant",
"?include=from-treat-as-public"
]
]
}
@ -557202,49 +557280,6 @@
[
"variant",
"?include=from-public"
],
[
"variant",
"?include=from-treat-as-public"
]
]
}
],
[
"fetch/private-network-access/fetch.https.window.html?include=from-treat-as-public",
{
"script_metadata": [
[
"script",
"/common/subset-tests-by-key.js"
],
[
"script",
"/common/utils.js"
],
[
"script",
"resources/support.sub.js"
],
[
"variant",
"?include=baseline"
],
[
"variant",
"?include=from-local"
],
[
"variant",
"?include=from-private"
],
[
"variant",
"?include=from-public"
],
[
"variant",
"?include=from-treat-as-public"
]
]
}
@ -557269,7 +557304,7 @@
]
],
"iframe.tentative.https.window.js": [
"5636270ea63e02fbdc1cf72c8b0d3e9f79e08317",
"48bd6420fd9c46a758f8f1f01bf9e2263c8760e1",
[
"fetch/private-network-access/iframe.tentative.https.window.html",
{
@ -557313,7 +557348,7 @@
]
],
"mixed-content-fetch.tentative.https.window.js": [
"fb9f6a7709af5a1ffa145d220dc3f3aa7500bb15",
"54485dc70474023683f2a9f4f4fba1f0df0032af",
[
"fetch/private-network-access/mixed-content-fetch.tentative.https.window.html",
{
@ -557475,7 +557510,7 @@
]
],
"shared-worker-fetch.https.window.js": [
"29e9f32c7e0b8102ba63435913bec49d29e1bce0",
"7066b359caa2ddb173a02a359d012456dd7a43a2",
[
"fetch/private-network-access/shared-worker-fetch.https.window.html",
{
@ -557511,7 +557546,7 @@
]
],
"shared-worker.https.window.js": [
"91d9186860e9966a44880fc35b92e95b440af1fd",
"ecb70c41245e82ab89f652d0de01c1d3b1f80890",
[
"fetch/private-network-access/shared-worker.https.window.html",
{
@ -557575,7 +557610,7 @@
]
],
"worker-fetch.https.window.js": [
"7ca0b4359c3708d284ef94a7068f3c2c0b7756f9",
"89e0c3cf1f35f0cf741957c3eb0bff38a4705d93",
[
"fetch/private-network-access/worker-fetch.https.window.html",
{
@ -557611,7 +557646,7 @@
]
],
"worker.https.window.js": [
"fd38f7cf70eb3909fe95fe68a43e74283be163e4",
"2d0dddd685cccf4d1ed4064db61ffcc1a3514f09",
[
"fetch/private-network-access/worker.https.window.html",
{
@ -557646,8 +557681,26 @@
}
]
],
"xhr-from-treat-as-public.https.window.js": [
"04fe5449d19e5baecbb1904140b315dc18206070",
[
"fetch/private-network-access/xhr-from-treat-as-public.https.window.html",
{
"script_metadata": [
[
"script",
"/common/utils.js"
],
[
"script",
"resources/support.sub.js"
]
]
}
]
],
"xhr.https.window.js": [
"ac811ee19aa4476626afafc2f3a2cd95d7b9e51a",
"4dc5da9912f1012bf72a9e689acfbc125d7c2923",
[
"fetch/private-network-access/xhr.https.window.html?include=from-local",
{
@ -557675,10 +557728,6 @@
[
"variant",
"?include=from-public"
],
[
"variant",
"?include=from-treat-as-public"
]
]
}
@ -557710,10 +557759,6 @@
[
"variant",
"?include=from-public"
],
[
"variant",
"?include=from-treat-as-public"
]
]
}
@ -557745,45 +557790,6 @@
[
"variant",
"?include=from-public"
],
[
"variant",
"?include=from-treat-as-public"
]
]
}
],
[
"fetch/private-network-access/xhr.https.window.html?include=from-treat-as-public",
{
"script_metadata": [
[
"script",
"/common/subset-tests-by-key.js"
],
[
"script",
"/common/utils.js"
],
[
"script",
"resources/support.sub.js"
],
[
"variant",
"?include=from-local"
],
[
"variant",
"?include=from-private"
],
[
"variant",
"?include=from-public"
],
[
"variant",
"?include=from-treat-as-public"
]
]
}
@ -567919,6 +567925,13 @@
}
]
],
"opener-string.window.js": [
"a39c584d20b27b6c3a33fe0bd6ed93827afb07f6",
[
"html/browsers/windows/opener-string.window.html",
{}
]
],
"post-message": {
"first-party-to-first-party-cross-partition.sub.html": [
"f91d9403ea0ce424f92960ded05254c32e995430",
@ -603832,7 +603845,7 @@
]
],
"popover-attribute-basic.html": [
"9b03c7bc1c65a14b2ad396713cf9203054231357",
"bc32c357d3a5503564282a4e3a7260fcd0ae6458",
[
null,
{
@ -648240,6 +648253,179 @@
}
]
],
"task-signal-any-abort.tentative.any.js": [
"4afcde901d10cb6402a11b2b738d7a911b944b0f",
[
"scheduler/task-signal-any-abort.tentative.any.html",
{
"script_metadata": [
[
"global",
"window,worker"
],
[
"script",
"../dom/abort/resources/abort-signal-any-tests.js"
]
]
}
],
[
"scheduler/task-signal-any-abort.tentative.any.serviceworker.html",
{
"script_metadata": [
[
"global",
"window,worker"
],
[
"script",
"../dom/abort/resources/abort-signal-any-tests.js"
]
]
}
],
[
"scheduler/task-signal-any-abort.tentative.any.sharedworker.html",
{
"script_metadata": [
[
"global",
"window,worker"
],
[
"script",
"../dom/abort/resources/abort-signal-any-tests.js"
]
]
}
],
[
"scheduler/task-signal-any-abort.tentative.any.worker.html",
{
"script_metadata": [
[
"global",
"window,worker"
],
[
"script",
"../dom/abort/resources/abort-signal-any-tests.js"
]
]
}
]
],
"task-signal-any-post-task-run-order.tentative.any.js": [
"889217b08109080bd319d4c290fff7c0cf701521",
[
"scheduler/task-signal-any-post-task-run-order.tentative.any.html",
{
"script_metadata": [
[
"title",
"Scheduler: Tasks Run in Priority Order"
],
[
"global",
"window,worker"
]
]
}
],
[
"scheduler/task-signal-any-post-task-run-order.tentative.any.serviceworker.html",
{
"script_metadata": [
[
"title",
"Scheduler: Tasks Run in Priority Order"
],
[
"global",
"window,worker"
]
]
}
],
[
"scheduler/task-signal-any-post-task-run-order.tentative.any.sharedworker.html",
{
"script_metadata": [
[
"title",
"Scheduler: Tasks Run in Priority Order"
],
[
"global",
"window,worker"
]
]
}
],
[
"scheduler/task-signal-any-post-task-run-order.tentative.any.worker.html",
{
"script_metadata": [
[
"title",
"Scheduler: Tasks Run in Priority Order"
],
[
"global",
"window,worker"
]
]
}
]
],
"task-signal-any-priority.tentative.any.js": [
"99a7dd67b0d4a355aa5397907b55466f72e98efd",
[
"scheduler/task-signal-any-priority.tentative.any.html",
{
"script_metadata": [
[
"global",
"window,worker"
]
]
}
],
[
"scheduler/task-signal-any-priority.tentative.any.serviceworker.html",
{
"script_metadata": [
[
"global",
"window,worker"
]
]
}
],
[
"scheduler/task-signal-any-priority.tentative.any.sharedworker.html",
{
"script_metadata": [
[
"global",
"window,worker"
]
]
}
],
[
"scheduler/task-signal-any-priority.tentative.any.worker.html",
{
"script_metadata": [
[
"global",
"window,worker"
]
]
}
]
],
"task-signal-onprioritychange.any.js": [
"7f59e1f1f84ca2761195f6426ec0a0a3a2bd38b1",
[
@ -659067,7 +659253,7 @@
]
],
"requestStorageAccess.sub.https.window.js": [
"a74866e56bccb7c317be56be4b9c60ce02fae187",
"d673ed306993334e6f2807f3a0ecf8758e8d87ea",
[
"storage-access-api/requestStorageAccess.sub.https.window.html",
{
@ -666578,6 +666764,28 @@
]
}
]
],
"top-level-storage-access-permission.sub.https.window.js": [
"466b6f3bbed03642248ce40367b0794d3b2e4eb3",
[
"top-level-storage-access-api/tentative/top-level-storage-access-permission.sub.https.window.html",
{
"script_metadata": [
[
"script",
"/storage-access-api/helpers.js"
],
[
"script",
"/resources/testdriver.js"
],
[
"script",
"/resources/testdriver-vendor.js"
]
]
}
]
]
}
},
@ -677097,7 +677305,7 @@
]
],
"partitioned-web-locks.tentative.https.html": [
"d2f22f196445ee944e3784b5c9c795f338ce9d1f",
"a426737f608e85ff4b1062a090d74648e5ad0933",
[
null,
{}
@ -683039,7 +683247,7 @@
]
],
"videoFrame-serialization.crossAgentCluster.https.html": [
"1266869783ded7ed6a96afb74416848081006b89",
"cb02ad4bcc3a23c33e091b887bc069fcfe6ed170",
[
null,
{}
@ -702608,8 +702816,8 @@
{}
]
],
"webxr_feature_policy.https.html": [
"b493ec73cce687832cfc0784a1a798d665eb10af",
"webxr_permissions_policy.https.html": [
"9146dd88f05aebd6ed991a95ede3652a669f1a35",
[
null,
{}

View file

@ -0,0 +1,3 @@
[block-in-inline-hittest-001.html]
[block-in-inline-hittest-001]
expected: FAIL

View file

@ -29,3 +29,8 @@
[Property font-variation-settings value '"AB@D" 0.5']
expected: FAIL
[Property font-variation-settings value '"wght" 100, "wdth" 200' values should be sorted alphabetically by tag.]
expected: FAIL
[Property font-variation-settings value '"wght" 100, "wdth" 200, "wght" 300, "wdth" 400' duplicate values should be removed, keeping the rightmost occurrence, and sorted alphabetically by tag.]
expected: FAIL

View file

@ -68,21 +68,12 @@
[Matching font-style: 'italic' should prefer 'oblique 20deg' over 'oblique 30deg 60deg']
expected: FAIL
[Matching font-style: 'oblique 10deg' should prefer 'oblique -50deg -20deg' over 'oblique -40deg -30deg']
expected: FAIL
[Matching font-stretch: '100%' should prefer '100%' over '110% 120%']
expected: FAIL
[Matching font-style: 'oblique 0deg' should prefer 'oblique 5deg' over 'oblique 15deg 20deg']
expected: FAIL
[Matching font-style: 'normal' should prefer 'oblique 10deg 40deg' over 'oblique 20deg 30deg']
expected: FAIL
[Matching font-weight: '501' should prefer '450 460' over '390 410']
expected: FAIL
[Matching font-weight: '399' should prefer '450 460' over '500 501']
expected: FAIL
@ -158,9 +149,6 @@
[Matching font-stretch: '90%' should prefer '110% 140%' over '120% 130%']
expected: FAIL
[Matching font-style: 'oblique -21deg' should prefer 'oblique -10deg' over 'italic']
expected: FAIL
[Matching font-style: 'oblique 21deg' should prefer 'oblique -50deg -20deg' over 'oblique -40deg -30deg']
expected: FAIL
@ -206,9 +194,6 @@
[Matching font-stretch: '110%' should prefer '105%' over '100%']
expected: FAIL
[Matching font-style: 'italic' should prefer 'oblique 40deg 50deg' over 'oblique 5deg 10deg']
expected: FAIL
[Matching font-style: 'italic' should prefer 'oblique 0deg' over 'oblique -60deg -30deg']
expected: FAIL
@ -319,3 +304,18 @@
[Matching font-style: 'italic' should prefer 'oblique 5deg' over 'normal']
expected: FAIL
[Matching font-weight: '400' should prefer '400' over '450 460']
expected: FAIL
[Matching font-weight: '399' should prefer '200 300' over '400']
expected: FAIL
[Matching font-stretch: '110%' should prefer '110% 120%' over '115% 116%']
expected: FAIL
[Matching font-style: 'oblique 21deg' should prefer 'oblique 10deg' over 'italic']
expected: FAIL
[Matching font-style: 'oblique 0deg' should prefer 'oblique 40deg 50deg' over 'italic']
expected: FAIL

View file

@ -1,6 +1,3 @@
[transform-scale-hittest.html]
[Hit test intersecting scaled box]
expected: FAIL
[Hit test within unscaled box]
expected: FAIL

View file

@ -53,129 +53,6 @@
[background-position length(px) / events]
expected: FAIL
[background-color color(rgba) / values]
expected: FAIL
[border-top-width length(pt) / values]
expected: FAIL
[border-top-width length(pc) / values]
expected: FAIL
[border-top-width length(px) / values]
expected: FAIL
[border-top-width length(em) / values]
expected: FAIL
[border-top-width length(ex) / values]
expected: FAIL
[border-top-width length(mm) / values]
expected: FAIL
[border-top-width length(cm) / values]
expected: FAIL
[border-top-width length(in) / values]
expected: FAIL
[border-right-width length(pt) / values]
expected: FAIL
[border-right-width length(pc) / values]
expected: FAIL
[border-right-width length(px) / values]
expected: FAIL
[border-right-width length(em) / values]
expected: FAIL
[border-right-width length(ex) / values]
expected: FAIL
[border-right-width length(mm) / values]
expected: FAIL
[border-right-width length(cm) / values]
expected: FAIL
[border-right-width length(in) / values]
expected: FAIL
[border-bottom-width length(pt) / values]
expected: FAIL
[border-bottom-width length(pc) / values]
expected: FAIL
[border-bottom-width length(px) / values]
expected: FAIL
[border-bottom-width length(em) / values]
expected: FAIL
[border-bottom-width length(ex) / values]
expected: FAIL
[border-bottom-width length(mm) / values]
expected: FAIL
[border-bottom-width length(cm) / values]
expected: FAIL
[border-bottom-width length(in) / values]
expected: FAIL
[border-left-width length(pt) / values]
expected: FAIL
[border-left-width length(pc) / values]
expected: FAIL
[border-left-width length(px) / values]
expected: FAIL
[border-left-width length(em) / values]
expected: FAIL
[border-left-width length(ex) / values]
expected: FAIL
[border-left-width length(mm) / values]
expected: FAIL
[border-left-width length(cm) / values]
expected: FAIL
[border-left-width length(in) / values]
expected: FAIL
[border-top-color color(rgba) / values]
expected: FAIL
[border-right-color color(rgba) / values]
expected: FAIL
[border-bottom-color color(rgba) / values]
expected: FAIL
[border-left-color color(rgba) / values]
expected: FAIL
[padding-bottom length(pt) / values]
expected: FAIL
[padding-bottom length(pc) / values]
expected: FAIL
[padding-bottom length(px) / values]
expected: FAIL
[padding-bottom length(em) / values]
expected: FAIL
[padding-bottom length(ex) / values]
expected: FAIL
@ -325,3 +202,153 @@
[margin-right length(mm) / values]
expected: FAIL
[color color(rgba) / values]
expected: FAIL
[font-size length(pt) / values]
expected: FAIL
[font-size length(pc) / values]
expected: FAIL
[font-size length(px) / values]
expected: FAIL
[font-size length(em) / values]
expected: FAIL
[font-size length(ex) / values]
expected: FAIL
[font-size length(mm) / values]
expected: FAIL
[font-size length(cm) / values]
expected: FAIL
[font-size length(in) / values]
expected: FAIL
[font-size percentage(%) / values]
expected: FAIL
[font-weight font-weight(keyword) / values]
expected: FAIL
[font-weight font-weight(numeric) / values]
expected: FAIL
[line-height number(integer) / values]
expected: FAIL
[line-height number(decimal) / values]
expected: FAIL
[line-height length(pt) / values]
expected: FAIL
[line-height length(pc) / values]
expected: FAIL
[line-height length(px) / values]
expected: FAIL
[line-height length(em) / values]
expected: FAIL
[line-height length(ex) / values]
expected: FAIL
[line-height length(mm) / values]
expected: FAIL
[line-height length(cm) / values]
expected: FAIL
[line-height length(in) / values]
expected: FAIL
[line-height percentage(%) / values]
expected: FAIL
[letter-spacing length(pt) / values]
expected: FAIL
[letter-spacing length(pc) / values]
expected: FAIL
[letter-spacing length(px) / values]
expected: FAIL
[letter-spacing length(em) / values]
expected: FAIL
[letter-spacing length(ex) / values]
expected: FAIL
[letter-spacing length(mm) / values]
expected: FAIL
[letter-spacing length(cm) / values]
expected: FAIL
[letter-spacing length(in) / values]
expected: FAIL
[word-spacing length(pt) / values]
expected: FAIL
[word-spacing length(pc) / values]
expected: FAIL
[word-spacing length(px) / values]
expected: FAIL
[word-spacing length(em) / values]
expected: FAIL
[word-spacing length(ex) / values]
expected: FAIL
[word-spacing length(mm) / values]
expected: FAIL
[word-spacing length(cm) / values]
expected: FAIL
[word-spacing length(in) / values]
expected: FAIL
[word-spacing percentage(%) / values]
expected: FAIL
[text-indent length(pt) / values]
expected: FAIL
[text-indent length(pc) / values]
expected: FAIL
[text-indent length(px) / values]
expected: FAIL
[text-indent length(em) / values]
expected: FAIL
[text-indent length(ex) / values]
expected: FAIL
[text-indent length(mm) / values]
expected: FAIL
[text-indent length(cm) / values]
expected: FAIL
[text-indent length(in) / values]
expected: FAIL
[text-indent percentage(%) / values]
expected: FAIL
[text-shadow shadow(shadow) / values]
expected: FAIL

View file

@ -1,3 +0,0 @@
[elementFromPoint-float-in-relative.html]
[elementFromPoint-float-in-relative]
expected: FAIL

View file

@ -14,17 +14,5 @@
[<li>Outside 3</li>]
expected: FAIL
[<li>Inside 1</li>]
expected: FAIL
[<li>Inside 2</li>]
expected: FAIL
[<li>Inside 3</li>]
expected: FAIL
[<li>Image Inside 1</li>]
expected: FAIL
[<li>Image Inside 2</li>]
expected: FAIL

View file

@ -1,3 +0,0 @@
[elementFromPoint-subpixel.html]
[Hit test top left corner of box]
expected: FAIL

View file

@ -18,8 +18,5 @@
[test some point of the element: bottom right corner]
expected: FAIL
[test the top of layer]
expected: FAIL
[test some point of the element: top left corner]
expected: FAIL

View file

@ -1,3 +0,0 @@
[elementsFromPoint-invalid-cases.html]
[The root element is the last element returned for otherwise empty queries within the viewport]
expected: FAIL

View file

@ -146,3 +146,6 @@
[list-style-image sec-fetch-site - HTTPS downgrade-upgrade]
expected: FAIL
[background-image sec-fetch-site - Not sent to non-trustworthy cross-site destination]
expected: TIMEOUT

View file

@ -0,0 +1,6 @@
[fetch-from-treat-as-public.https.window.html]
[treat-as-public-address to local: failed preflight.]
expected: FAIL
[treat-as-public-address to private: failed preflight.]
expected: FAIL

View file

@ -128,9 +128,6 @@
[https-treat-as-public to http-local: wrong targetAddressSpace "private".]
expected: FAIL
[https-treat-as-public to http-local: success.]
expected: FAIL
[https-treat-as-public to http-private: wrong targetAddressSpace "local".]
expected: FAIL

View file

@ -23,9 +23,6 @@
[treat-as-public to local: failed preflight.]
expected: FAIL
[treat-as-public to local: success.]
expected: FAIL
[treat-as-public to private: failed preflight.]
expected: FAIL

View file

@ -2,11 +2,5 @@
[treat-as-public to local: failed preflight.]
expected: FAIL
[treat-as-public to local: success.]
expected: FAIL
[treat-as-public to private: failed preflight.]
expected: FAIL
[treat-as-public to private: success.]
expected: FAIL

View file

@ -0,0 +1,6 @@
[xhr-from-treat-as-public.https.window.html]
[treat-as-public to local: failed preflight.]
expected: FAIL
[treat-as-public to private: failed preflight.]
expected: FAIL

View file

@ -1,12 +1,13 @@
[failure-check-sequence.https.html]
expected: TIMEOUT
[CSP check precedes COEP check - CSP header first]
expected: FAIL
expected: TIMEOUT
[COEP check precedes X-Frame-Options check]
expected: FAIL
expected: NOTRUN
[CSP check precedes COEP check - COEP header first]
expected: FAIL
expected: NOTRUN
[CSP check precedes X-Frame-Options check]
expected: FAIL

View file

@ -1,9 +1,10 @@
[iframe-src-aboutblank-navigate-immediately.html]
expected: TIMEOUT
[Navigating to a different document with window.open]
expected: FAIL
[Navigating to a different document with form submission]
expected: FAIL
expected: NOTRUN
[Navigating to a different document with link click]
expected: FAIL
expected: TIMEOUT

View file

@ -1,3 +0,0 @@
[navigation-unload-same-origin-fragment.html]
[Tests that a fragment navigation in the unload handler will not block the initial navigation]
expected: FAIL

View file

@ -0,0 +1,3 @@
[navigation-unload-same-origin.window.html]
[Same-origin navigation started from unload handler must be ignored]
expected: FAIL

View file

@ -1,4 +0,0 @@
[traverse-during-unload.html]
expected: TIMEOUT
[Traversing the history during unload]
expected: TIMEOUT

View file

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

View file

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

View file

@ -0,0 +1,3 @@
[creating_browsing_context_test_01.html]
[first argument: absolute url]
expected: FAIL

View file

@ -1,5 +1,5 @@
[embedded-opener-remove-frame.html]
expected: TIMEOUT
expected: CRASH
[opener and "removed" embedded documents]
expected: FAIL

View file

@ -1,2 +1,2 @@
[canvas.2d.disconnected.html]
expected: FAIL
expected: TIMEOUT

View file

@ -0,0 +1,3 @@
[imagesmoothing.html]
[Test that imageSmoothingEnabled = false (nearest-neighbor interpolation) works with stroke() and createPattern().]
expected: FAIL

View file

@ -4,16 +4,13 @@
expected: FAIL
[Element with tabindex should support autofocus]
expected: TIMEOUT
expected: FAIL
[Host element with delegatesFocus including no focusable descendants should be skipped]
expected: NOTRUN
expected: FAIL
[Area element should support autofocus]
expected: NOTRUN
expected: TIMEOUT
[Host element with delegatesFocus should support autofocus]
expected: NOTRUN
[Non-HTMLElement should not support autofocus]
expected: NOTRUN
expected: FAIL

View file

@ -1,6 +1,7 @@
[update-the-rendering.html]
expected: TIMEOUT
["Flush autofocus candidates" should be happen after the first animation frame callbacks, and before a resize event in the next iteration of window event loop.]
expected: TIMEOUT
["Flush autofocus candidates" should be happen before a scroll event and animation frame callbacks]
expected: FAIL
expected: TIMEOUT

View file

@ -1,4 +1,5 @@
[iframe_sandbox_popups_escaping-1.html]
type: testharness
expected: CRASH
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
expected: FAIL

View file

@ -1,5 +1,4 @@
[iframe_sandbox_popups_nonescaping-2.html]
type: testharness
expected: TIMEOUT
[Check that popups from a sandboxed iframe do not escape the sandbox]
expected: NOTRUN
expected: FAIL

View file

@ -17,9 +17,6 @@
[application/x-www-form-urlencoded: 0x00 in filename (normal form)]
expected: FAIL
[application/x-www-form-urlencoded: 0x00 in filename (formdata event)]
expected: FAIL
[application/x-www-form-urlencoded: \\n in name (normal form)]
expected: FAIL

View file

@ -1,3 +0,0 @@
[historical.html]
[<input name=isindex> should not be supported]
expected: FAIL

View file

@ -0,0 +1,12 @@
[select-event.html]
[textarea: selectionEnd disconnected node]
expected: FAIL
[input type text: selectionStart disconnected node]
expected: FAIL
[input type text: selectionStart event queue]
expected: FAIL
[input type text: setSelectionRange() event queue]
expected: FAIL

View file

@ -8,10 +8,10 @@
expected: FAIL
[Check that rel=noopener with target=_top does a normal load]
expected: NOTRUN
expected: FAIL
[Check that rel=noopener with target=_parent does a normal load]
expected: NOTRUN
expected: FAIL
[Check that rel=noopener with target=_self does a normal load]
expected: NOTRUN

View file

@ -1,4 +1,5 @@
[import-meta-url.html]
expected: ERROR
[import.meta.url at top-level module DedicatedWorker]
expected: FAIL

View file

@ -0,0 +1,3 @@
[DOMContentLoaded-defer.html]
[The end: DOMContentLoaded and defer scripts]
expected: FAIL

View file

@ -0,0 +1,3 @@
[module-tla-delayed.html]
[document.write in an imported module]
expected: FAIL

View file

@ -3,6 +3,3 @@
expected: TIMEOUT
[The incumbent settings object while executing the compiled callback via Web IDL's invoke must be that of the node document]
expected: TIMEOUT
[The entry settings object while executing the compiled callback via Web IDL's invoke must be that of the node document]
expected: FAIL

View file

@ -1,7 +1,6 @@
[promise-rejection-events.html]
expected: TIMEOUT
[delayed handling: delaying handling rejected promise created from createImageBitmap will cause both events to fire]
expected: TIMEOUT
expected: FAIL
[unhandledrejection: from createImageBitmap which is UA triggered]
expected: FAIL

View file

@ -94,10 +94,10 @@
expected: FAIL
[mime-type 16 : text/html;charset=\x0bgbk]
expected: FAIL
expected: TIMEOUT
[mime-type 17 : text/html;charset=\x0cgbk]
expected: TIMEOUT
expected: NOTRUN
[mime-type 18 : text/html;\x0bcharset=gbk]
expected: NOTRUN

View file

@ -265,10 +265,10 @@
expected: FAIL
[This test validates the response status of resources. 88]
expected: TIMEOUT
expected: FAIL
[This test validates the response status of resources. 89]
expected: NOTRUN
expected: TIMEOUT
[This test validates the response status of resources. 90]
expected: NOTRUN

View file

@ -0,0 +1,4 @@
[017.html]
expected: TIMEOUT
[origin of the script that invoked the method, about:blank]
expected: TIMEOUT

View file

@ -0,0 +1,4 @@
[018.html]
expected: TIMEOUT
[origin of the script that invoked the method, javascript:]
expected: TIMEOUT

View file

@ -0,0 +1,4 @@
[localstorage-about-blank-3P-iframe-opens-3P-window.partitioned.tentative.html]
expected: TIMEOUT
[StorageKey: test 3P about:blank window opened from a 3P iframe]
expected: TIMEOUT

View file

@ -1,4 +1,4 @@
[webxr_feature_policy.https.html]
[webxr_permissions_policy.https.html]
expected: ERROR
[Validate isSessionSupported behavior without xr-spatial-tracking policy]
expected: FAIL
@ -8,4 +8,3 @@
[Validate xr compatibility requests without xr-spatial-tracking policy]
expected: NOTRUN

View file

@ -1,2 +0,0 @@
[Worker-constructor.html]
expected: ERROR

View file

@ -1,5 +1,9 @@
# Prevent accidentially touching CSS subtree
/css/tools/apiclient/ @plinss @jgraham
/css/tools/apiclient/ @plinss @web-platform-tests/wpt-core-team
# Require review for changes that often need an RFC
/resources/testdriver* @web-platform-tests/wpt-core-team
/resources/testharness* @web-platform-tests/wpt-core-team
# Prevent accidentally touching tools/third_party
/tools/third_party/ @jgraham
/tools/third_party/ @web-platform-tests/wpt-core-team

View file

@ -1,2 +1,2 @@
Accept-CH: Sec-CH-DPR, DPR, Sec-CH-Device-Memory, Device-Memory
Feature-Policy: ch-dpr *; ch-device-memory *
Permissions-Policy: ch-dpr=*, ch-device-memory=*

View file

@ -1,2 +1,2 @@
Accept-CH: Sec-CH-DPR, DPR, Sec-CH-Device-Memory, Device-Memory
Feature-Policy: ch-dpr *;ch-device-memory *
Permissions-Policy: ch-dpr=*, ch-device-memory=*

View file

@ -1 +1 @@
Feature-Policy: ch-device-memory *;
Permissions-Policy: ch-device-memory=*

View file

@ -1 +1 @@
Feature-Policy: ch-device-memory *; ch-dpr 'none'; ch-viewport-width 'self'; ch-ua 'self'; ch-ua-mobile 'none'
Permissions-Policy: ch-device-memory=*, ch-dpr=(), ch-viewport-width=(self), ch-ua=(self), ch-ua-mobile=()

View file

@ -1 +1 @@
Feature-Policy: ch-device-memory *; ch-dpr 'none'; ch-viewport-width 'self'; ch-mobile; ch-prefers-color-scheme 'none'; ch-prefers-reduced-motion 'none'; ch-viewport-height 'none'
Permissions-Policy: ch-device-memory=*, ch-dpr=(), ch-viewport-width=(self), ch-mobile, ch-prefers-color-scheme=(), ch-prefers-reduced-motion=(), ch-viewport-height=()

View file

@ -68,4 +68,15 @@ promise_test(t => {
}, "Same-origin => cross-origin 'fetch()' in " + self.location.protocol +
" without CSP");
// WebSocket
promise_test(async function(t) {
let url = "wss://{{host}}:{{ports[wss][0]}}/echo";
assert_no_csp_event_for_url(t, url);
return new Promise(resolve => {
let ws = new WebSocket(url);
ws.onopen = resolve;
});
}, "WebSocket without CSP");
done();

View file

@ -77,9 +77,22 @@ promise_test(t => {
]);
}, "Same-origin => cross-origin 'fetch()'.");
let websocket_url = "wss://{{host}}:{{ports[wss][0]}}/echo";
// The WebSocket URL is not the same as 'self'
promise_test(t => {
return Promise.all([
waitUntilCSPEventForURL(t, websocket_url),
new Promise(resolve => {
let ws = new WebSocket(websocket_url);
ws.onopen = resolve;
})
]);
}, "WebSocket.");
let expected_blocked_urls = self.XMLHttpRequest
? [ fetch_cross_origin_url, xhr_cross_origin_url, redirect_url ]
: [ fetch_cross_origin_url, redirect_url ];
? [ fetch_cross_origin_url, xhr_cross_origin_url, redirect_url, websocket_url ]
: [ fetch_cross_origin_url, redirect_url, websocket_url ];
promise_test(async t => {
let report_url = `{{location[server]}}/reporting/resources/report.py?` +

View file

@ -88,9 +88,29 @@ promise_test(t => {
}, "Same-origin => cross-origin 'fetch()' in " + self.location.protocol +
" with {{GET[test-name]}}");
let websocket_url = "wss://{{host}}:{{ports[wss][0]}}/echo";
// The WebSocket URL is not the same as 'self'
promise_test(t => {
return Promise.all([
waitUntilCSPEventForURL(t, websocket_url),
new Promise((resolve, reject) => {
// Firefox throws in the constructor, Chrome triggers the error event.
try {
let ws = new WebSocket(websocket_url);
ws.onerror = resolve;
ws.onopen = reject; // unexpected
} catch (e) {
resolve();
}
})
]);
}, "WebSocket in " + self.location.protocol + " with {{GET[test-name]}}");
let expected_blocked_urls = self.XMLHttpRequest
? [ fetch_cross_origin_url, xhr_cross_origin_url, redirect_url ]
: [ fetch_cross_origin_url, redirect_url ];
? [ fetch_cross_origin_url, xhr_cross_origin_url, redirect_url, websocket_url ]
: [ fetch_cross_origin_url, redirect_url, websocket_url ];
promise_test(async t => {
let report_url = `{{location[server]}}/reporting/resources/report.py` +

View file

@ -20,13 +20,11 @@ test_computed_value('font-feature-settings', '"dlig"');
test_computed_value('font-feature-settings', '"smcp"');
test_computed_value('font-feature-settings', '"c2sc"');
test_computed_value('font-feature-settings', '"liga" 0');
test_computed_value('font-feature-settings', '"tnum", "hist"',
['"tnum", "hist"', '"hist", "tnum"']);
test_computed_value('font-feature-settings', '"tnum", "hist"', '"hist", "tnum"');
test_computed_value('font-feature-settings', '"PKRN"');
test_computed_value('font-feature-settings', '"dlig", "smcp", "dlig" 0',
['"smcp", "dlig" 0', '"dlig" 0, "smcp"']);
test_computed_value('font-feature-settings', '"dlig", "smcp", "dlig" 0', '"dlig" 0, "smcp"');
</script>
</body>
</html>

View file

@ -23,6 +23,12 @@ test_computed_value('font-variation-settings', '"wght" 700, "wght" 500', '"wght"
test_computed_value('font-variation-settings', '"wght" 700, "XHGT" 0.7',
['"wght" 700, "XHGT" 0.7', '"XHGT" 0.7, "wght" 700']);
test_computed_value('font-variation-settings', '"wght" 100, "wdth" 200', '"wdth" 200, "wght" 100',
"values should be sorted alphabetically by tag.");
test_computed_value('font-variation-settings', '"wght" 100, "wdth" 200, "wght" 300, "wdth" 400', '"wdth" 400, "wght" 300',
"duplicate values should be removed, keeping the rightmost occurrence, and sorted alphabetically by tag.");
test_computed_value('font-variation-settings', '"XHGT" calc(0.4 + 0.3)', '"XHGT" 0.7');
</script>
</body>

View file

@ -0,0 +1,24 @@
<!doctype html>
<link rel="help" href="https://drafts.fxtf.org/css-masking-1/#ClipPathElement">
<link rel="match" href="reference/clip-path-svg-text-css-ref.html">
<meta name="fuzzy" content="0-1;0-200">
<meta name="flags" content="ahem">
<link rel="stylesheet" href="/fonts/ahem.css" />
<style>
text {
font: 50px/1 Ahem;
text-shadow: grey 10px 10px;
fill: none;
stroke: red;
stroke-width: 10px;
}
</style>
<svg>
<defs>
<!-- clipPath works on raw geometry regardless of fill/stroke/shadow etc -->
<clipPath id="c">
<text x="30" y="50">Hello</text>
</clipPath>
</defs>
<rect width="200" height="100" fill="green" clip-path="url(#c)"/>
</svg>

View file

@ -0,0 +1,16 @@
<!doctype html>
<meta name="flags" content="ahem">
<link rel="stylesheet" href="/fonts/ahem.css" />
<style>
text {
font: 50px/1 Ahem;
}
</style>
<svg>
<defs>
<clipPath id="c">
<text x="30" y="50">Hello</text>
</clipPath>
</defs>
<rect width="200" height="100" fill="green" clip-path="url(#c)"/>
</svg>

View file

@ -0,0 +1,22 @@
<!DOCTYPE html>
<html>
<title>View transitions: capture starts with root being display none (ref)</title>
<link rel="help" href="https://github.com/WICG/view-transitions">
<link rel="author" href="mailto:vmpstr@chromium.org">
<style>
.tb { writing-mode: horizontal-tb; }
.lr { writing-mode: vertical-lr; }
.rl { writing-mode: vertical-rl; }
.shared {
margin: 2px;
width: 100px;
height: 50px;
background: green;
contain: paint;
border: 1px solid black;
}
</style>
<div class=tb><div id=one class=shared>T</div></div>
<div class=lr><div id=two class=shared>T</div></div>
<div class=rl><div id=three class=shared>T</div></div>

View file

@ -0,0 +1,49 @@
<!DOCTYPE html>
<html class=reftest-wait style="display: none">
<title>View transitions: capture starts with root being display none</title>
<link rel="help" href="https://github.com/WICG/view-transitions">
<link rel="author" href="mailto:vmpstr@chromium.org">
<link rel="match" href="new-content-from-root-display-none-ref.html">
<script src="/common/reftest-wait.js"></script>
<style>
.tb { writing-mode: horizontal-tb; }
.lr { writing-mode: vertical-lr; }
.rl { writing-mode: vertical-rl; }
.shared {
margin: 2px;
width: 100px;
height: 50px;
background: green;
contain: paint;
border: 1px solid black;
}
html::view-transition-group(root) { animation-duration: 500s; }
html::view-transition-new(root) {
animation: unset;
opacity: 1;
}
html::view-transition-old(root) {
animation: unset;
opacity: 0;
}
</style>
<div class=tb><div id=one class=shared>T</div></div>
<div class=lr><div id=two class=shared>T</div></div>
<div class=rl><div id=three class=shared>T</div></div>
<script>
failIfNot(document.startViewTransition, "Missing document.startViewTransition");
async function runTest() {
let transition = document.startViewTransition(() => {
document.documentElement.style = "";
});
transition.ready.then(() => requestAnimationFrame(takeScreenshot));
}
onload = () => requestAnimationFrame(() => requestAnimationFrame(runTest));
</script>

View file

@ -0,0 +1,23 @@
<!DOCTYPE html>
<html class=reftest-wait>
<title>View transitions: html display none</title>
<link rel="help" href="https://github.com/WICG/view-transitions">
<link rel="author" href="mailto:vmpstr@chromium.org">
<script src="/common/reftest-wait.js"></script>
<style>
html {
display: none;
}
</style>
<script>
failIfNot(document.startViewTransition, "Missing document.startViewTransition");
async function runTest() {
document.startViewTransition().finished.then(takeScreenshot, takeScreenshot);
}
onload = () => requestAnimationFrame(() => requestAnimationFrame(runTest));
</script>

View file

@ -0,0 +1,30 @@
<!DOCTYPE html>
<html class=reftest-wait>
<title>View transitions: entry animation from root display none</title>
<link rel="help" href="https://github.com/WICG/view-transitions">
<link rel="author" href="mailto:vmpstr@chromium.org">
<script src="/common/reftest-wait.js"></script>
<style>
.hidden {
display: none;
}
::view-transition-group(*) {
animation-duration: 500s
}
</style>
<script>
failIfNot(document.startViewTransition, "Missing document.startViewTransition");
async function runTest() {
transition = document.startViewTransition();
transition.ready.then(
requestAnimationFrame(() => {
document.documentElement.classList.toggle("hidden");
}));
transition.finished.then(takeScreenshot);
}
onload = () => requestAnimationFrame(() => requestAnimationFrame(runTest));
</script>

View file

@ -0,0 +1,68 @@
// META: script=/common/utils.js
// META: script=resources/support.sub.js
//
// Spec: https://wicg.github.io/private-network-access/#integration-fetch
//
// These tests verify that documents fetched from the `local` or `private`
// address space yet carrying the `treat-as-public-address` CSP directive are
// treated as if they had been fetched from the `public` address space.
promise_test(t => fetchTest(t, {
source: {
server: Server.HTTPS_LOCAL,
treatAsPublic: true,
},
target: { server: Server.HTTPS_LOCAL },
expected: FetchTestResult.FAILURE,
}), "treat-as-public-address to local: failed preflight.");
promise_test(t => fetchTest(t, {
source: {
server: Server.HTTPS_LOCAL,
treatAsPublic: true,
},
target: {
server: Server.HTTPS_LOCAL,
behavior: {
preflight: PreflightBehavior.optionalSuccess(token()),
// Interesting: no need for CORS headers on same-origin final response.
},
},
expected: FetchTestResult.SUCCESS,
}), "treat-as-public-address to local: success.");
promise_test(t => fetchTest(t, {
source: {
server: Server.HTTPS_LOCAL,
treatAsPublic: true,
},
target: { server: Server.HTTPS_PRIVATE },
expected: FetchTestResult.FAILURE,
}), "treat-as-public-address to private: failed preflight.");
promise_test(t => fetchTest(t, {
source: {
server: Server.HTTPS_LOCAL,
treatAsPublic: true,
},
target: {
server: Server.HTTPS_PRIVATE,
behavior: {
preflight: PreflightBehavior.optionalSuccess(token()),
response: ResponseBehavior.allowCrossOrigin(),
},
},
expected: FetchTestResult.SUCCESS,
}), "treat-as-public-address to private: success.");
promise_test(t => fetchTest(t, {
source: {
server: Server.HTTPS_LOCAL,
treatAsPublic: true,
},
target: {
server: Server.HTTPS_PUBLIC,
behavior: { response: ResponseBehavior.allowCrossOrigin() },
},
expected: FetchTestResult.SUCCESS,
}), "treat-as-public-address to public: no preflight required.");

View file

@ -5,7 +5,6 @@
// META: variant=?include=from-local
// META: variant=?include=from-private
// META: variant=?include=from-public
// META: variant=?include=from-treat-as-public
//
// Spec: https://wicg.github.io/private-network-access/#integration-fetch
//
@ -270,66 +269,3 @@ subsetTestByKey("from-public", promise_test, t => fetchTest(t, {
expected: FetchTestResult.SUCCESS,
}), "public to public: no preflight required.");
// These tests verify that documents fetched from the `local` address space yet
// carrying the `treat-as-public-address` CSP directive are treated as if they
// had been fetched from the `public` address space.
subsetTestByKey("from-treat-as-public", promise_test, t => fetchTest(t, {
source: {
server: Server.HTTPS_LOCAL,
treatAsPublic: true,
},
target: { server: Server.HTTPS_LOCAL },
expected: FetchTestResult.FAILURE,
}), "treat-as-public-address to local: failed preflight.");
subsetTestByKey("from-treat-as-public", promise_test, t => fetchTest(t, {
source: {
server: Server.HTTPS_LOCAL,
treatAsPublic: true,
},
target: {
server: Server.HTTPS_LOCAL,
behavior: {
preflight: PreflightBehavior.success(token()),
// Interesting: no need for CORS headers on same-origin final response.
},
},
expected: FetchTestResult.SUCCESS,
}), "treat-as-public-address to local: success.");
subsetTestByKey("from-treat-as-public", promise_test, t => fetchTest(t, {
source: {
server: Server.HTTPS_LOCAL,
treatAsPublic: true,
},
target: { server: Server.HTTPS_PRIVATE },
expected: FetchTestResult.FAILURE,
}), "treat-as-public-address to private: failed preflight.");
subsetTestByKey("from-treat-as-public", promise_test, t => fetchTest(t, {
source: {
server: Server.HTTPS_LOCAL,
treatAsPublic: true,
},
target: {
server: Server.HTTPS_PRIVATE,
behavior: {
preflight: PreflightBehavior.success(token()),
response: ResponseBehavior.allowCrossOrigin(),
},
},
expected: FetchTestResult.SUCCESS,
}), "treat-as-public-address to private: success.");
subsetTestByKey("from-treat-as-public", promise_test, t => fetchTest(t, {
source: {
server: Server.HTTPS_LOCAL,
treatAsPublic: true,
},
target: {
server: Server.HTTPS_PUBLIC,
behavior: { response: ResponseBehavior.allowCrossOrigin() },
},
expected: FetchTestResult.SUCCESS,
}), "treat-as-public-address to public: no preflight required.");

View file

@ -175,6 +175,18 @@ promise_test_parallel(t => iframeTest(t, {
expected: IframeTestResult.SUCCESS,
}), "treat-as-public-address to public: no preflight required.");
promise_test_parallel(t => iframeTest(t, {
source: {
server: Server.HTTPS_LOCAL,
treatAsPublic: true,
},
target: {
server: Server.HTTPS_PUBLIC,
behavior: { preflight: PreflightBehavior.optionalSuccess(token()) }
},
expected: IframeTestResult.SUCCESS,
}), "treat-as-public-address to local: optional preflight");
// The following tests verify that when a grandparent frame navigates its
// grandchild, the IP address space of the grandparent is compared against the
// IP address space of the response. Indeed, the navigation initiator in this

View file

@ -220,7 +220,7 @@ promise_test_parallel(t => fetchTest(t, {
target: {
server: Server.HTTP_LOCAL,
behavior: {
preflight: PreflightBehavior.success(token()),
preflight: PreflightBehavior.optionalSuccess(token()),
response: ResponseBehavior.allowCrossOrigin(),
},
},
@ -236,7 +236,7 @@ promise_test_parallel(t => fetchTest(t, {
target: {
server: Server.HTTP_LOCAL,
behavior: {
preflight: PreflightBehavior.success(token()),
preflight: PreflightBehavior.optionalSuccess(token()),
response: ResponseBehavior.allowCrossOrigin(),
},
},

View file

@ -106,7 +106,7 @@ promise_test(t => sharedWorkerFetchTest(t, {
},
target: {
server: Server.HTTPS_LOCAL,
behavior: { preflight: PreflightBehavior.success(token()) },
behavior: { preflight: PreflightBehavior.optionalSuccess(token()) },
},
expected: WorkerFetchTestResult.SUCCESS,
}), "treat-as-public to local: success.");

View file

@ -25,7 +25,7 @@ promise_test(t => sharedWorkerScriptTest(t, {
},
target: {
server: Server.HTTPS_LOCAL,
behavior: { preflight: PreflightBehavior.success(token()) },
behavior: { preflight: PreflightBehavior.optionalSuccess(token()) },
},
expected: WorkerScriptTestResult.SUCCESS,
}), "treat-as-public to local: success.");
@ -46,7 +46,7 @@ promise_test(t => sharedWorkerScriptTest(t, {
},
target: {
server: Server.HTTPS_PRIVATE,
behavior: { preflight: PreflightBehavior.success(token()) },
behavior: { preflight: PreflightBehavior.optionalSuccess(token()) },
},
expected: WorkerScriptTestResult.SUCCESS,
}), "treat-as-public to private: success.");

View file

@ -106,7 +106,7 @@ promise_test(t => workerFetchTest(t, {
},
target: {
server: Server.HTTPS_LOCAL,
behavior: { preflight: PreflightBehavior.success(token()) },
behavior: { preflight: PreflightBehavior.optionalSuccess(token()) },
},
expected: WorkerFetchTestResult.SUCCESS,
}), "treat-as-public to local: success.");

View file

@ -28,7 +28,7 @@ promise_test(t => workerScriptTest(t, {
},
target: {
server: Server.HTTPS_LOCAL,
behavior: { preflight: PreflightBehavior.success(token()) },
behavior: { preflight: PreflightBehavior.optionalSuccess(token()) },
},
expected: WorkerScriptTestResult.SUCCESS,
}), "treat-as-public to local: success.");
@ -49,7 +49,7 @@ promise_test(t => workerScriptTest(t, {
},
target: {
server: Server.HTTPS_PRIVATE,
behavior: { preflight: PreflightBehavior.success(token()) },
behavior: { preflight: PreflightBehavior.optionalSuccess(token()) },
},
expected: WorkerScriptTestResult.SUCCESS,
}), "treat-as-public to private: success.");

View file

@ -0,0 +1,74 @@
// META: script=/common/utils.js
// META: script=resources/support.sub.js
//
// Spec: https://wicg.github.io/private-network-access/#integration-fetch
//
// These tests verify that documents fetched from the `local` address space yet
// carrying the `treat-as-public-address` CSP directive are treated as if they
// had been fetched from the `public` address space.
promise_test(t => xhrTest(t, {
source: {
server: Server.HTTPS_LOCAL,
treatAsPublic: true,
},
target: {
server: Server.HTTPS_LOCAL,
behavior: { response: ResponseBehavior.allowCrossOrigin() },
},
expected: XhrTestResult.FAILURE,
}), "treat-as-public to local: failed preflight.");
promise_test(t => xhrTest(t, {
source: {
server: Server.HTTPS_LOCAL,
treatAsPublic: true,
},
target: {
server: Server.HTTPS_LOCAL,
behavior: {
preflight: PreflightBehavior.optionalSuccess(token()),
response: ResponseBehavior.allowCrossOrigin(),
},
},
expected: XhrTestResult.SUCCESS,
}), "treat-as-public to local: success.");
promise_test(t => xhrTest(t, {
source: {
server: Server.HTTPS_LOCAL,
treatAsPublic: true,
},
target: {
server: Server.HTTPS_PRIVATE,
behavior: { response: ResponseBehavior.allowCrossOrigin() },
},
expected: XhrTestResult.FAILURE,
}), "treat-as-public to private: failed preflight.");
promise_test(t => xhrTest(t, {
source: {
server: Server.HTTPS_LOCAL,
treatAsPublic: true,
},
target: {
server: Server.HTTPS_PRIVATE,
behavior: {
preflight: PreflightBehavior.optionalSuccess(token()),
response: ResponseBehavior.allowCrossOrigin(),
},
},
expected: XhrTestResult.SUCCESS,
}), "treat-as-public to private: success.");
promise_test(t => xhrTest(t, {
source: {
server: Server.HTTPS_LOCAL,
treatAsPublic: true,
},
target: {
server: Server.HTTPS_PUBLIC,
behavior: { response: ResponseBehavior.allowCrossOrigin() },
},
expected: XhrTestResult.SUCCESS,
}), "treat-as-public to public: no preflight required.");

View file

@ -4,7 +4,6 @@
// META: variant=?include=from-local
// META: variant=?include=from-private
// META: variant=?include=from-public
// META: variant=?include=from-treat-as-public
//
// Spec: https://wicg.github.io/private-network-access/#integration-fetch
//
@ -141,73 +140,3 @@ subsetTestByKey("from-public", promise_test, t => xhrTest(t, {
target: { server: Server.HTTPS_PUBLIC },
expected: XhrTestResult.SUCCESS,
}), "public to public: no preflight required.");
// These tests verify that documents fetched from the `local` address space yet
// carrying the `treat-as-public-address` CSP directive are treated as if they
// had been fetched from the `public` address space.
subsetTestByKey("from-treat-as-public", promise_test, t => xhrTest(t, {
source: {
server: Server.HTTPS_LOCAL,
treatAsPublic: true,
},
target: {
server: Server.HTTPS_LOCAL,
behavior: { response: ResponseBehavior.allowCrossOrigin() },
},
expected: XhrTestResult.FAILURE,
}), "treat-as-public to local: failed preflight.");
subsetTestByKey("from-treat-as-public", promise_test, t => xhrTest(t, {
source: {
server: Server.HTTPS_LOCAL,
treatAsPublic: true,
},
target: {
server: Server.HTTPS_LOCAL,
behavior: {
preflight: PreflightBehavior.success(token()),
response: ResponseBehavior.allowCrossOrigin(),
},
},
expected: XhrTestResult.SUCCESS,
}), "treat-as-public to local: success.");
subsetTestByKey("from-treat-as-public", promise_test, t => xhrTest(t, {
source: {
server: Server.HTTPS_LOCAL,
treatAsPublic: true,
},
target: {
server: Server.HTTPS_PRIVATE,
behavior: { response: ResponseBehavior.allowCrossOrigin() },
},
expected: XhrTestResult.FAILURE,
}), "treat-as-public to private: failed preflight.");
subsetTestByKey("from-treat-as-public", promise_test, t => xhrTest(t, {
source: {
server: Server.HTTPS_LOCAL,
treatAsPublic: true,
},
target: {
server: Server.HTTPS_PRIVATE,
behavior: {
preflight: PreflightBehavior.success(token()),
response: ResponseBehavior.allowCrossOrigin(),
},
},
expected: XhrTestResult.SUCCESS,
}), "treat-as-public to private: success.");
subsetTestByKey("from-treat-as-public", promise_test, t => xhrTest(t, {
source: {
server: Server.HTTPS_LOCAL,
treatAsPublic: true,
},
target: {
server: Server.HTTPS_PUBLIC,
behavior: { response: ResponseBehavior.allowCrossOrigin() },
},
expected: XhrTestResult.SUCCESS,
}), "treat-as-public to public: no preflight required.");

View file

@ -0,0 +1,14 @@
test(t => {
const popup = window.open();
t.add_cleanup(() => popup.close());
assert_equals(popup.opener, self, "The opener of the popup is me");
assert_equals(Object.getOwnPropertyDescriptor(popup, "opener").writable, undefined);
popup.opener = "blah";
assert_equals(popup.opener, "blah", "The popup's opener is now a string");
assert_equals(Object.getOwnPropertyDescriptor(popup, "opener").writable, true);
const openerGetter = Object.getOwnPropertyDescriptor(self, "opener").get;
const popupOpener = openerGetter.call(popup);
assert_equals(popupOpener, self, "The underlying opener of the popup is still me");
}, "Setting popup.opener to a string");

View file

@ -106,11 +106,11 @@ window.onload = () => {
// be invisible. Otherwise, it should be visible.
const expectVisible = !nonPopover.hasAttribute('popover');
assertPopoverVisibility(nonPopover, /*isPopover*/false, expectVisible, 'A non-popover should start out visible');
assert_throws_dom("NotSupportedError",() => nonPopover.showPopover(),'Calling showPopover on a non-popover should throw NotSupportedError');
assert_throws_dom("InvalidStateError",() => nonPopover.showPopover(),'Calling showPopover on a non-popover should throw InvalidStateError');
assertPopoverVisibility(nonPopover, /*isPopover*/false, expectVisible, 'Calling showPopover on a non-popover should leave it visible');
assert_throws_dom("NotSupportedError",() => nonPopover.hidePopover(),'Calling hidePopover on a non-popover should throw NotSupportedError');
assert_throws_dom("InvalidStateError",() => nonPopover.hidePopover(),'Calling hidePopover on a non-popover should throw InvalidStateError');
assertPopoverVisibility(nonPopover, /*isPopover*/false, expectVisible, 'Calling hidePopover on a non-popover should leave it visible');
assert_throws_dom("NotSupportedError",() => nonPopover.togglePopover(),'Calling togglePopover on a non-popover should throw NotSupportedError');
assert_throws_dom("InvalidStateError",() => nonPopover.togglePopover(),'Calling togglePopover on a non-popover should throw InvalidStateError');
assertPopoverVisibility(nonPopover, /*isPopover*/false, expectVisible, 'Calling togglePopover on a non-popover should leave it visible');
}

View file

@ -0,0 +1,3 @@
spec: https://html.spec.whatwg.org/multipage/interaction.html#tracking-user-activation
suggested_reviewers:
- marcoscaceres

View file

@ -0,0 +1,6 @@
// META: global=window,worker
// META: script=../dom/abort/resources/abort-signal-any-tests.js
abortSignalAnySignalOnlyTests(TaskSignal);
abortSignalAnyTests(TaskSignal, AbortController);
abortSignalAnyTests(TaskSignal, TaskController);

View file

@ -0,0 +1,73 @@
// META: title=Scheduler: Tasks Run in Priority Order
// META: global=window,worker
promise_test(async t => {
const runOrder = [];
const schedule = (id, signal) => scheduler.postTask(() => { runOrder.push(id); }, {signal});
const tasks = [];
tasks.push(schedule('B1', TaskSignal.any([], {priority: 'background'})));
tasks.push(schedule('B2', TaskSignal.any([], {priority: 'background'})));
tasks.push(schedule('UV1', TaskSignal.any([], {priority: 'user-visible'})));
tasks.push(schedule('UV2', TaskSignal.any([], {priority: 'user-visible'})));
tasks.push(schedule('UB1', TaskSignal.any([], {priority: 'user-blocking'})));
tasks.push(schedule('UB2', TaskSignal.any([], {priority: 'user-blocking'})));
await Promise.all(tasks);
assert_equals(runOrder.toString(),'UB1,UB2,UV1,UV2,B1,B2');
}, 'scheduler.postTask() tasks run in priority order with a fixed priority composite signal');
promise_test(async t => {
const runOrder = [];
const schedule = (id, priorityOrSignal) => {
if (priorityOrSignal instanceof TaskSignal) {
return scheduler.postTask(() => { runOrder.push(id); }, {signal: priorityOrSignal});
} else {
return scheduler.postTask(() => { runOrder.push(id); }, {priority: priorityOrSignal});
}
};
const controller = new TaskController({priority: 'user-blocking'});
const signal = TaskSignal.any([], {priority: controller.signal});
const tasks = [];
tasks.push(schedule('B1', signal));
tasks.push(schedule('B2', signal));
tasks.push(schedule('UV1', 'user-visible'));
tasks.push(schedule('UV2', 'user-visible'));
tasks.push(schedule('UB1', 'user-blocking'));
tasks.push(schedule('UB2', 'user-blocking'));
controller.setPriority('background');
await Promise.all(tasks);
assert_equals(runOrder.toString(),'UB1,UB2,UV1,UV2,B1,B2');
}, 'scheduler.postTask() tasks run in priority order with a dynamic priority composite signal');
promise_test(async t => {
const runOrder = [];
const schedule = (id, priorityOrSignal) => {
if (priorityOrSignal instanceof TaskSignal) {
return scheduler.postTask(() => { runOrder.push(id); }, {signal: priorityOrSignal});
} else {
return scheduler.postTask(() => { runOrder.push(id); }, {priority: priorityOrSignal});
}
};
const parentSignal = TaskSignal.any([], {priority: 'background'});
const signal = TaskSignal.any([], {priority: parentSignal});
const tasks = [];
tasks.push(schedule('B1', signal));
tasks.push(schedule('B2', signal));
tasks.push(schedule('UV1', 'user-visible'));
tasks.push(schedule('UV2', 'user-visible'));
tasks.push(schedule('UB1', 'user-blocking'));
tasks.push(schedule('UB2', 'user-blocking'));
await Promise.all(tasks);
assert_equals(runOrder.toString(),'UB1,UB2,UV1,UV2,B1,B2');
}, 'scheduler.postTask() tasks run in priority order with a composite signal whose source has fixed priority');

View file

@ -0,0 +1,186 @@
// META: global=window,worker
test((t) => {
const signal = TaskSignal.any([]);
assert_true(signal instanceof TaskSignal);
assert_equals(signal.priority, 'user-visible');
}, "TaskSignal.any() returns a user-visible TaskSignal when no priority is specified");
test((t) => {
let signal = TaskSignal.any([], {priority: 'user-blocking'});
assert_equals(signal.priority, 'user-blocking');
signal = TaskSignal.any([], {priority: 'user-visible'});
assert_equals(signal.priority, 'user-visible');
signal = TaskSignal.any([], {priority: 'background'});
assert_equals(signal.priority, 'background');
}, "TaskSignal.any() returns a signal with the correct priority when intialized with a string");
test((t) => {
let controller = new TaskController({priority: 'user-blocking'});
let signal = TaskSignal.any([], {priority: controller.signal});
assert_equals(signal.priority, 'user-blocking');
controller = new TaskController({priority: 'user-visible'});
signal = TaskSignal.any([], {priority: controller.signal});
assert_equals(signal.priority, 'user-visible');
controller = new TaskController({priority: 'background'});
signal = TaskSignal.any([], {priority: controller.signal});
assert_equals(signal.priority, 'background');
}, "TaskSignal.any() returns a signal with the correct priority when intialized with a TaskSignal");
test((t) => {
let controller = new TaskController({priority: 'user-blocking'});
let signal = TaskSignal.any([], {priority: controller.signal});
assert_equals(signal.priority, 'user-blocking');
controller.setPriority('user-visible');
assert_equals(signal.priority, 'user-visible');
controller.setPriority('background');
assert_equals(signal.priority, 'background');
controller.setPriority('user-blocking');
assert_equals(signal.priority, 'user-blocking');
}, "TaskSignal.any() returns a signal with dynamic priority");
test((t) => {
const controller = new TaskController();
const signal = TaskSignal.any([], {priority: controller.signal});
let eventFiredCount = 0;
signal.onprioritychange = t.step_func((e) => {
assert_equals(e.target, signal,
`The event target is the signal returned by TaskSignal.any()`);
++eventFiredCount;
});
controller.setPriority('background');
assert_equals(eventFiredCount, 1);
controller.setPriority('user-visible');
assert_equals(eventFiredCount, 2);
controller.setPriority('user-blocking');
assert_equals(eventFiredCount, 3);
}, "Priority change events fire for composite signals");
test((t) => {
const controller = new TaskController();
let signal = TaskSignal.any([], {priority: controller.signal});
signal = TaskSignal.any([], {priority: signal});
signal = TaskSignal.any([], {priority: signal});
signal = TaskSignal.any([], {priority: signal});
signal = TaskSignal.any([], {priority: signal});
assert_equals(signal.priority, 'user-visible');
let eventFiredCount = 0;
signal.onprioritychange = t.step_func((e) => {
assert_equals(e.target, signal,
"The event target is the signal returned by TaskSignal.any()");
++eventFiredCount;
});
controller.setPriority('background');
assert_equals(eventFiredCount, 1);
assert_equals(signal.priority, 'background');
controller.setPriority('user-visible');
assert_equals(eventFiredCount, 2);
assert_equals(signal.priority, 'user-visible');
controller.setPriority('user-blocking');
assert_equals(eventFiredCount, 3);
assert_equals(signal.priority, 'user-blocking');
}, "Priority change events fire for composite signals with intermediate sources");
test((t) => {
const controller = new TaskController();
const signals = [];
const results = [];
let id = 0;
for (let i = 0; i < 3; i++) {
const signal = TaskSignal.any([], {priority: controller.signal});
const eventId = id++;
signal.addEventListener('prioritychange', () => {
results.push(eventId);
});
signals.push(signal);
}
for (let i = 0; i < 3; i++) {
const signal = TaskSignal.any([], {priority: signals[i]});
const eventId = id++;
signal.addEventListener('prioritychange', () => {
results.push(eventId);
});
}
controller.setPriority('background');
assert_equals(results.toString(), '0,1,2,3,4,5')
controller.setPriority('user-blocking');
assert_equals(results.toString(), '0,1,2,3,4,5,0,1,2,3,4,5')
}, "Priority change propagates to multiple dependent signals in the right order");
test((t) => {
const controller = new TaskController();
const signal = TaskSignal.any([], {priority: controller.signal});
let fired = false;
signal.onabort = t.step_func(() => {
assert_unreached("The signal should not abort");
fired = true;
});
controller.abort();
assert_false(fired);
}, "TaskSignal.any() does not propagate abort when not given dependent abort signals");
test((t) => {
const taskController = new TaskController();
const abortController = new AbortController();
const signal = TaskSignal.any([abortController.signal], {priority: taskController.signal});
let priorityFireCount = 0;
signal.onprioritychange = t.step_func(() => {
++priorityFireCount;
});
let abortFired = false;
signal.onabort = t.step_func(() => {
abortFired = true;
});
taskController.setPriority('background');
assert_equals(signal.priority, 'background');
assert_equals(priorityFireCount, 1);
taskController.abort();
assert_false(abortFired, "The signal should use abortController for abort");
abortController.abort();
assert_true(abortFired);
taskController.setPriority('user-visible');
assert_equals(signal.priority, 'user-visible');
assert_equals(priorityFireCount, 2);
}, "TaskSignal.any() propagates abort and priority");
test((t) => {
const controller = new TaskController();
const signal = TaskSignal.any([AbortSignal.abort()], {priority: controller.signal});
let fired = false;
signal.onprioritychange = t.step_func(() => {
fired = true;
});
controller.setPriority('background');
assert_true(fired);
}, "TaskSignal.any() propagates priority after returning an aborted signal");

View file

@ -7,7 +7,10 @@
//
// testPrefix: Prefix each test case with an indicator so we know what context
// they are run in if they are used in multiple iframes.
const {testPrefix} = processQueryParams();
//
// topLevelDocument: Keep track of if we run these tests in a nested context, we
// don't want to recurse forever.
const {testPrefix, topLevelDocument} = processQueryParams();
if (window !== window.top) {
// WPT synthesizes a top-level HTML test for this JS file, and in that case we
@ -26,10 +29,15 @@ promise_setup(async () => {
{ name: 'storage-access' }, 'prompt');
});
promise_test(t => {
return promise_rejects_dom(t, "NotAllowedError", document.requestStorageAccess(),
promise_test(async t => {
if (topLevelDocument) {
await document.requestStorageAccess()
.catch(t.unreached_func("document.requestStorageAccess() call should resolve in top-level frame"));
} else {
return promise_rejects_dom(t, "NotAllowedError", document.requestStorageAccess(),
"document.requestStorageAccess() call without user gesture");
}, "[" + testPrefix + "] document.requestStorageAccess() should be rejected with a NotAllowedError by default with no user gesture");
}
}, "[" + testPrefix + "] document.requestStorageAccess() should resolve in top-level frame or otherwise reject with a NotAllowedError with no user gesture");
promise_test(
async () => {

View file

@ -0,0 +1,10 @@
<!doctype html>
<meta charset=utf-8>
<script src="/resources/testharness.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<!-- no testharnessreport.js -->
<script src="/storage-access-api/helpers.js"></script>
<div id=log></div>
<script src="/top-level-storage-access-api/top-level-storage-access-permission.sub.https.window.js"></script>

View file

@ -0,0 +1,22 @@
// META: script=/storage-access-api/helpers.js
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
'use strict';
(async function() {
promise_test(async t => {
return promise_rejects_js(
t, TypeError,
navigator.permissions.query({name: 'top-level-storage-access'}),
'top-level-storage-access query without origin');
}, 'Permission queries without an origin are rejected');
promise_test(async t => {
const permission = await navigator.permissions.query({
name: 'top-level-storage-access',
requestedOrigin: 'https://test.com'
});
assert_equals(permission.name, 'top-level-storage-access');
assert_equals(permission.state, 'prompt');
}, 'Permission default state can be queried');
})();

View file

@ -21,7 +21,7 @@ let next_lock_id = 1;
async function third_party_test(t) {
let target_url = HTTPS_ORIGIN + '/web-locks/resources/iframe.html';
target_url = new URL(
`./resources/partitioned-parent.html?target=${encodeURIComponent(target_url)}`,
`/web-locks/resources/partitioned-parent.html?target=${encodeURIComponent(target_url)}`,
HTTPS_NOTSAMESITE_ORIGIN + self.location.pathname);
navigator.locks.request('testLock', {mode: 'exclusive', ifAvailable: true},
@ -71,11 +71,11 @@ async function nested_iframe_test(t) {
let leaf_url = HTTPS_ORIGIN + '/web-locks/resources/iframe.html';
// Wrap the child iframe in its cross-origin parent (middle).
let middle_url = new URL(
`./resources/iframe-parent.html?target=${encodeURIComponent(leaf_url)}`,
`/web-locks/resources/iframe-parent.html?target=${encodeURIComponent(leaf_url)}`,
HTTPS_NOTSAMESITE_ORIGIN + self.location.pathname);
// Embed the parent iframe in the top-level site (top).
let top_url = new URL(
`./resources/partitioned-parent.html?target=${encodeURIComponent(middle_url)}`,
`/web-locks/resources/partitioned-parent.html?target=${encodeURIComponent(middle_url)}`,
HTTPS_ORIGIN + self.location.pathname);
// Request the weblock for the top-level site.

View file

@ -16,10 +16,29 @@
};
</script>
<script id='sharedWorkerCode' type='javascript/worker'>
const data = new Uint8Array([
1, 2, 3, 4, 5, 6, 7, 8,
9, 10, 11, 12, 13, 14, 15, 16,
]);
let received = new Map();
self.onconnect = function (event) {
const port = event.ports[0];
port.onmessage = function (e) {
if (e.data == 'create-frame') {
let frameOrError = null;
try {
frameOrError = new VideoFrame(data, {
timestamp: 0,
codedWidth: 2,
codedHeight: 2,
format: 'RGBA',
});
} catch (error) {
frameOrError = error
}
port.postMessage(frameOrError);
return;
}
if (e.data.hasOwnProperty('id')) {
port.postMessage(
received.get(e.data.id) ? 'RECEIVED' : 'NOT_RECEIVED');
@ -72,7 +91,7 @@ promise_test(async () => {
});
const worker = new SharedWorker(window.URL.createObjectURL(blob));
let frame = createVideoFrame(40);
worker.port.postMessage({frame: frame, transfer: false});
worker.port.postMessage(frame);
worker.port.postMessage({'id': 40});
const received = await new Promise(resolve => worker.port.onmessage = e => {
resolve(e.data);
@ -126,7 +145,7 @@ promise_test(async () => {
});
const worker = new SharedWorker(window.URL.createObjectURL(blob));
let frame = createVideoFrame(90);
worker.port.postMessage({frame: frame, transfer: true});
worker.port.postMessage(frame, [frame]);
worker.port.postMessage({'id': 90});
const received = await new Promise(resolve => worker.port.onmessage = e => {
resolve(e.data);
@ -147,6 +166,28 @@ promise_test(async () => {
assert_equals(received, 'NOT_RECEIVED');
}, 'Verify frames cannot be transferred to serviceworker');
promise_test(async () => {
const blob = new Blob([document.querySelector('#sharedWorkerCode').textContent], {
type: 'text/javascript',
});
const worker = new SharedWorker(window.URL.createObjectURL(blob));
worker.port.postMessage('create-frame');
const received = await new Promise(resolve => worker.port.onmessage = e => {
resolve(e.data);
});
assert_true(received instanceof ReferenceError);
}, 'Verify frames is unavailable in sharedworker');
promise_test(async () => {
navigator.serviceWorker.register('videoFrame-serialization.crossAgentCluster.serviceworker.js');
let registration = await navigator.serviceWorker.ready;
registration.active.postMessage('create-frame');
const received = await new Promise(resolve => navigator.serviceWorker.onmessage = (e) => {
resolve(e.data);
});
assert_true(received instanceof ReferenceError);
}, 'Verify frames is unavailable in serviceworker');
function appendIframe(src) {
const frame = document.createElement('iframe');
document.body.appendChild(frame);

View file

@ -1,5 +1,24 @@
const data = new Uint8Array([
1, 2, 3, 4, 5, 6, 7, 8,
9, 10, 11, 12, 13, 14, 15, 16,
]);
let received = new Map();
self.onmessage = (e) => {
if (e.data == 'create-frame') {
let frameOrError = null;
try {
frameOrError = new VideoFrame(data, {
timestamp: 0,
codedWidth: 2,
codedHeight: 2,
format: 'RGBA',
});
} catch (error) {
frameOrError = error
}
e.source.postMessage(frameOrError);
return;
}
if (e.data.hasOwnProperty('id')) {
e.source.postMessage(
received.get(e.data.id) ? 'RECEIVED' : 'NOT_RECEIVED');

View file

@ -1 +0,0 @@
Feature-Policy: xr-spatial-tracking 'none'

View file

@ -13,7 +13,7 @@ xr_promise_test(
return navigator.xr.isSessionSupported("inline").then((supported) => {
t.step(() => {
assert_true(supported,
"inline should always be supported, even without feature policy");
"inline should always be supported, even without permissions policy");
});
// It shouldn't matter that there's no device connected, the SecurityError
@ -42,11 +42,11 @@ xr_promise_test(
promise_rejects_dom(t, "NotSupportedError",
navigator.xr.requestSession("inline", { requiredFeatures: ["local"] }),
"Inline with features should reject without feature policy"),
"Inline with features should reject without permissions policy"),
promise_rejects_dom(t, "NotSupportedError",
navigator.xr.requestSession("immersive-vr"),
"Immersive-vr should reject without feature policy")
"Immersive-vr should reject without permissions policy")
]));
});
});
@ -87,11 +87,11 @@ xr_promise_test(
t.step(() => {
assert_false(gl.getContextAttributes().xrCompatible,
"xrCompatibility shouldn't be set when requested without feature policy");
"xrCompatibility shouldn't be set when requested without permissions policy");
});
return promise_rejects_dom(t, "SecurityError",
gl.makeXRCompatible(),
"makeXRCompatible should reject without feature policy");
"makeXRCompatible should reject without permissions policy");
});
</script>

View file

@ -0,0 +1 @@
Permissions-Policy: xr-spatial-tracking=()