Auto merge of #27576 - servo-wpt-sync:wpt_update_12-08-2020, r=servo-wpt-sync

Sync WPT with upstream (12-08-2020)

Automated downstream sync of changes from upstream as of 12-08-2020.
[no-wpt-sync]
r? @servo-wpt-sync
This commit is contained in:
bors-servo 2020-08-12 06:56:59 -04:00 committed by GitHub
commit 078b816959
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
92 changed files with 1446 additions and 287 deletions

View file

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

View file

@ -1,4 +0,0 @@
[hit-test-floats-004.html]
[Miss float below something else]
expected: FAIL

View file

@ -5,6 +5,9 @@
[[data-expected-height\] 7]
expected: FAIL
[[data-expected-height\] 4]
[[data-expected-height\] 1]
expected: FAIL
[[data-expected-height\] 2]
expected: FAIL

View file

@ -77,3 +77,6 @@
[After -> Active]
expected: FAIL
[Cancel the transition after it finishes]
expected: FAIL

View file

@ -1,4 +0,0 @@
[CaretPosition-001.html]
[Element at (400, 100)]
expected: FAIL

View file

@ -0,0 +1,4 @@
[elementFromPoint-001.html]
[CSSOM View - 5 - extensions to the Document interface]
expected: FAIL

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -171,6 +171,3 @@
[XHTML img usemap="#hash-id"]
expected: FAIL
[HTML (standards) IMG usemap="no-hash-name"]
expected: FAIL

View file

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

View file

@ -1,5 +1,4 @@
[iframe_sandbox_popups_escaping-3.html]
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-3.html]
expected: TIMEOUT
[Check that popups from a sandboxed iframe do not escape the sandbox]
expected: NOTRUN
expected: FAIL

View file

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

View file

@ -1,4 +1,5 @@
[realtimeanalyser-fft-scaling.html]
expected: TIMEOUT
[X 2048-point FFT peak position is not equal to 64. Got 0.]
expected: FAIL

View file

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

View file

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

View file

@ -24620,12 +24620,12 @@
},
"animation-worklet": {
"worklet-animation-cancel.https.html": [
"3a28c7515db455ba50ed50135c5a5bb8534ae580",
"3b664ecddba8fb805b035d759a3b3cb109329274",
[
null,
[
[
"/animation-worklet/worklet-animation-cancel-ref.html",
"/animation-worklet/references/not-translated-box-ref.html",
"=="
]
],
@ -24633,12 +24633,12 @@
]
],
"worklet-animation-get-timing-on-worklet-thread.https.html": [
"54d1c8bcc0c0a20d9af4e96ea240060ebd348982",
"4ba68d79e4de5544d36c826ad3b41613d9e3f289",
[
null,
[
[
"/animation-worklet/worklet-animation-get-timing-on-worklet-thread-ref.html",
"/animation-worklet/references/translated-box-ref.html",
"=="
]
],
@ -24646,12 +24646,12 @@
]
],
"worklet-animation-local-time-after-duration.https.html": [
"adc90f1d3f6befa906473dd1bfb500b605431d0a",
"21293bc09b17591cb5dd8c2bbe3b09e726b4b5f3",
[
null,
[
[
"/animation-worklet/worklet-animation-local-time-after-duration-ref.html",
"/animation-worklet/references/not-translated-box-ref.html",
"=="
]
],
@ -24659,18 +24659,33 @@
]
],
"worklet-animation-local-time-before-start.https.html": [
"addb16e7d1751280c8d4f3e0052b808ab807cd7e",
"a959b73c08d8c2a2a32fb5d6d3dbe8169b0c6512",
[
null,
[
[
"/animation-worklet/worklet-animation-local-time-before-start-ref.html",
"/animation-worklet/references/translated-box-ref.html",
"=="
]
],
{}
]
],
"worklet-animation-local-time-null-2.https.html": [
"9c499bac0ee51b7b41c9cf1ca5f917d096c9a756",
[
null,
[
[
"/animation-worklet/worklet-animation-local-time-null-2-ref.html",
"=="
]
],
{
"timeout": "long"
}
]
],
"worklet-animation-pause-immediately.https.html": [
"f9dcf30bc908adb4e6b260dd00263e434a9b9ae4",
[
@ -24698,12 +24713,12 @@
]
],
"worklet-animation-set-keyframes.https.html": [
"017408494602ff51aec483ccc6dd0dd2f82bba4e",
"d3d02898db294b82bedda67b82b286cae9aeff06",
[
null,
[
[
"/animation-worklet/worklet-animation-set-keyframes-ref.html",
"/animation-worklet/references/translated-box-ref.html",
"=="
]
],
@ -24711,12 +24726,12 @@
]
],
"worklet-animation-set-timing.https.html": [
"ac3f05f4234ac1036e388536c4237686b07e6037",
"6c5cd51300c5cbea15d094a5023d8b663fa759e6",
[
null,
[
[
"/animation-worklet/worklet-animation-set-timing-ref.html",
"/animation-worklet/references/translated-box-ref.html",
"=="
]
],
@ -147545,7 +147560,7 @@
]
],
"flex-and-intrinsic-sizes-002.html": [
"1f93d0e3d0e2b6bff13351e92c7ffaba7cb68553",
"6b2df4e572094d424833e3a342431b11d7f4dc4a",
[
null,
[
@ -167553,7 +167568,7 @@
]
],
"abspos-008.tentative.html": [
"c81e9fcf40547bf34c47ab11ca3fda307f5f77ed",
"429b14ac35feb710354b9133ba435dc7fd192808",
[
null,
[
@ -167865,7 +167880,111 @@
]
],
"block-aspect-ratio-020.tentative.html": [
"3cb076252b0a356774cd4f9257c8561973a5d5d0",
"b07e91faf9860ea4b07d233103233b42e9ffd9c8",
[
null,
[
[
"/css/reference/ref-filled-green-100px-square.xht",
"=="
]
],
{}
]
],
"block-aspect-ratio-021.tentative.html": [
"0e9c1b6b0a2697d9f1ee6309e4255859ecc7d1ad",
[
null,
[
[
"/css/reference/ref-filled-green-100px-square.xht",
"=="
]
],
{}
]
],
"block-aspect-ratio-022.tentative.html": [
"1ee8021a3bbb428d9f7234590072986bd3ec4318",
[
null,
[
[
"/css/reference/ref-filled-green-100px-square.xht",
"=="
]
],
{}
]
],
"block-aspect-ratio-023.tentative.html": [
"e38cfe0cb26e47eea9c6c8c32a692d045c692a13",
[
null,
[
[
"/css/reference/ref-filled-green-100px-square.xht",
"=="
]
],
{}
]
],
"block-aspect-ratio-024.tentative.html": [
"d6f6716b99d527d421e892d80a79f9a31e84ec45",
[
null,
[
[
"/css/reference/ref-filled-green-100px-square.xht",
"=="
]
],
{}
]
],
"block-aspect-ratio-025.tentative.html": [
"6ce673672372a84bbba40bc455d4fa744848852e",
[
null,
[
[
"/css/reference/ref-filled-green-100px-square.xht",
"=="
]
],
{}
]
],
"block-aspect-ratio-026.tentative.html": [
"0e0ce5efe3aa8b83f64e8deee46bafb2c7144c58",
[
null,
[
[
"/css/reference/ref-filled-green-100px-square.xht",
"=="
]
],
{}
]
],
"block-aspect-ratio-027.tentative.html": [
"532f558b39deff2788e58865cc2ae3777a6d4716",
[
null,
[
[
"/css/reference/ref-filled-green-100px-square.xht",
"=="
]
],
{}
]
],
"block-aspect-ratio-028.tentative.html": [
"ec49bd4d7af834c3fea345b34b0eb05ff58f9e4d",
[
null,
[
@ -168318,6 +168437,32 @@
],
{}
]
],
"replaced-element-013.tentative.html": [
"bcbf653d68af4c1f908a59ca6e66e5752a09c833",
[
null,
[
[
"/css/reference/ref-filled-green-100px-square.xht",
"=="
]
],
{}
]
],
"replaced-element-014.tentative.html": [
"4c1ad16ce8624295251b73d1a14f53b9c9905610",
[
null,
[
[
"/css/reference/ref-filled-green-100px-square.xht",
"=="
]
],
{}
]
]
},
"auto-scrollbar-inside-stf-abspos.html": [
@ -248506,7 +248651,7 @@
},
"support": {
".azure-pipelines.yml": [
"cbd7b33b5d421e8dda64adfd8e25383e82173a5b",
"fbdef35656e149a16e00a71964f4aad1d6be2196",
[]
],
".codecov.yml": [
@ -249589,8 +249734,12 @@
[]
],
"references": {
"not-translated-box-ref.html": [
"96acf1ad96c7c41e870429d55142269f4468bb97",
[]
],
"translated-box-ref.html": [
"c73f5a177bf70f3a71d981bc9f04b38c5afe9f1c",
"f1dde2e19b2ebad50dd29e693b2a81f7de2cc620",
[]
]
},
@ -249604,28 +249753,8 @@
[]
]
},
"worklet-animation-cancel-ref.html": [
"d44927374703ef2b38d3ed0c9570609b62baec65",
[]
],
"worklet-animation-get-timing-on-worklet-thread-ref.html": [
"aad07d5f6f26692dc47ce0219a78d3c1a50c608a",
[]
],
"worklet-animation-local-time-after-duration-ref.html": [
"96acf1ad96c7c41e870429d55142269f4468bb97",
[]
],
"worklet-animation-local-time-before-start-ref.html": [
"cda4ca4132cabcb13719f12248773026b0642df2",
[]
],
"worklet-animation-set-keyframes-ref.html": [
"26bf33fdb403877f2e3adf9b8bb3fca6bf8301bb",
[]
],
"worklet-animation-set-timing-ref.html": [
"8c354a8b06f815d4f8000895964b59c3f6c242e4",
"worklet-animation-local-time-null-2-ref.html": [
"3b7a2b9258d0c2a210aaa389fadc3787c0da93a5",
[]
],
"worklet-animation-start-delay-ref.html": [
@ -271102,6 +271231,10 @@
},
"sandbox": {
"support": {
"empty.html": [
"e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
[]
],
"post-origin-on-load-worker.js": [
"21ce5748ab8b1edbfd04c8f77a3fba54739a73d5",
[]
@ -271134,6 +271267,22 @@
"a7ea308208d81a9f9a2ec24004d5d1f72cf21f84",
[]
],
"sandboxed-service-worker.js": [
"d4971266f5cbc105f0381c8c40409050166b6564",
[]
],
"sandboxed-service-worker.js.headers": [
"1efcf8c226fac074c98d0a5a747856f532e5d84e",
[]
],
"sandboxed-shared-worker.js": [
"eb85eb41b4bd9efffd186dbd6be4004a2f707346",
[]
],
"sandboxed-shared-worker.js.headers": [
"1efcf8c226fac074c98d0a5a747856f532e5d84e",
[]
],
"unsandboxed-post-property-to-opener.html": [
"ebbb54d36d86fe3ee3696b7dc302de11cb4ac30c",
[]
@ -323236,7 +323385,7 @@
[]
],
"testharness-api.md": [
"72263dbd4ead3d0dc2340bcdc83064f9ea8dffa5",
"38997a2dcc945c3c569b1348313ba92dff5fec85",
[]
],
"testharness-tutorial.md": [
@ -330736,6 +330885,16 @@
"0db28208a6d9731570398b1d83f8bf1ba32a4dec",
[]
],
"access-reporting": {
"property-indexed-getter.https.html.headers": [
"64f4d5fedffd208b7174c7d8e0bce4e99ce1ac0f",
[]
],
"property-named-getter.https.html.headers": [
"64f4d5fedffd208b7174c7d8e0bce4e99ce1ac0f",
[]
]
},
"navigation-reporting": {
"report-only-four-reports.https.html.sub.headers": [
"5c886ad05386ec21dcc3722649a40653962d8519",
@ -340773,7 +340932,7 @@
[]
],
"performance-timeline.idl": [
"d3783858578c881b352e571deeb8cc4c9f0e6454",
"36107ddeea296df350a2f4da33fcc396d203eaae",
[]
],
"periodic-background-sync.idl": [
@ -350926,6 +351085,10 @@
"f495a0c554537f1161981e19c12c597ba41ef2b2",
[]
],
"com.apple.SafariTechnologyPreview.plist": [
"122080972c9f63410062ee8d33d0ed0286af8f11",
[]
],
"fyi_hook.yml": [
"f02f3cd8224e0b3eb4f478318f0437f5a475f4e5",
[]
@ -350955,7 +351118,7 @@
[]
],
"install_safari.yml": [
"d0660d152bbdfc89f308bfc048cd2221e9ea7524",
"6c1b562d411a2aeecc30d3fbc1aed6362f3526e5",
[]
],
"pip_install.yml": [
@ -359172,7 +359335,7 @@
[]
],
"urltestdata.json": [
"ded7107ff757d21fbc79939b92d0f709eba82764",
"bc79426526c1a5ea9a4c9d07fc9305b0409089f4",
[]
]
}
@ -377141,6 +377304,13 @@
{}
]
],
"worklet-animation-local-time-null-1.https.html": [
"7db0a9721f67c59d6f453e32f3e2a65e064ff215",
[
null,
{}
]
],
"worklet-animation-pause.https.html": [
"417db9e37a61193a99908648e4cbc3be4c2e9618",
[
@ -385573,6 +385743,20 @@
{}
]
],
"service-worker-sandbox.https.html": [
"8b7d72e0ef96d2fb309d7e8bddf0f37b5fcdee36",
[
null,
{}
]
],
"shared-worker-sandbox.html": [
"86b39b9ad4739ff0c07ffc2720142b68d7dd64e8",
[
null,
{}
]
],
"window-reuse-sandboxed.html": [
"a7a080daf72ee8ae97f5adf433f17c947892d4ce",
[
@ -407285,7 +407469,7 @@
]
],
"event-dispatch.tentative.html": [
"9e4946cf336ad0d78b3b87426d121a39ffb98037",
"5ed01cdd2588d1a5a5226a9abb46f60dd441ed13",
[
null,
{}
@ -458326,7 +458510,7 @@
"reporting": {
"access-reporting": {
"openee-accessed_openee-coop-ro.https.html": [
"1472afa63c1d61d54cb68b3f3d192778fd7381de",
"24943b03f39106596bef73612d7b286f02531ec2",
[
null,
{
@ -458335,7 +458519,7 @@
]
],
"openee-accessed_openee-coop.https.html": [
"64dd07b5701a640244330435f88172a1c2c60984",
"07ba21a0c742bab4606dd27a6d0fd5b492a7b449",
[
null,
{
@ -458362,7 +458546,7 @@
]
],
"opener-accessed_openee-coop-ro.https.html": [
"3e5180af6260a691e08ee649c87e68a6579e3c59",
"b8f9f22e7cbf4ca80fd152258b539b106b77dbb1",
[
null,
{
@ -458371,7 +458555,7 @@
]
],
"opener-accessed_openee-coop.https.html": [
"e39dcfcec6a8bd9a5011944873d76d6689f80b34",
"ffce48de49627c02807316309b541f748e943d6c",
[
null,
{
@ -458397,8 +458581,26 @@
}
]
],
"property-indexed-getter.https.html": [
"d2309e5fbd14c4dc987f8fde6ec02c41ca774819",
[
null,
{
"timeout": "long"
}
]
],
"property-named-getter.https.html": [
"2ab9093fcb58f1346854c443de41e3f8f2a00243",
[
null,
{
"timeout": "long"
}
]
],
"property.https.html": [
"625fc94117768b792a27c148f609ccccef61507b",
"6a22cb2076cbfcf042926ef7249d98139651de53",
[
null,
{
@ -477918,6 +478120,15 @@
{}
]
],
"input-timestamp.html": [
"02dde1ad5d740fb62c82994c05518cec4017dbaa",
[
null,
{
"testdriver": true
}
]
],
"local-shift-without-viewport-shift.html": [
"37729f1c13c298b5a2d95c46b7a4f199d8943022",
[
@ -487097,6 +487308,13 @@
"testdriver": true
}
]
],
"secure-payment-confirmation.https.html": [
"860876e2e9bb750a266b33472753444532fe9a6a",
[
null,
{}
]
]
},
"performance-timeline": {
@ -487925,7 +488143,7 @@
"pointerevents": {
"compat": {
"pointerevent_compat-mouse-events-when-removing-nodes.html": [
"88d03b7965efc241893b8fbfc4c8f2e2b0967bf5",
"6d13b0de354a140e472d42bd8b81b408fad52495",
[
null,
{

View file

@ -1,4 +0,0 @@
[hit-test-floats-004.html]
[Miss float below something else]
expected: FAIL

View file

@ -8,6 +8,9 @@
[[data-expected-height\] 3]
expected: FAIL
[[data-expected-height\] 4]
[[data-expected-height\] 1]
expected: FAIL
[[data-expected-height\] 2]
expected: FAIL

View file

@ -77,3 +77,6 @@
[After -> Active]
expected: FAIL
[Cancel the transition after it finishes]
expected: FAIL

View file

@ -1,4 +0,0 @@
[CaretPosition-001.html]
[Element at (400, 100)]
expected: FAIL

View file

@ -0,0 +1,4 @@
[elementFromPoint-001.html]
[CSSOM View - 5 - extensions to the Document interface]
expected: FAIL

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -172,6 +172,3 @@
[XHTML img usemap="http://example.org/#garbage-before-hash-id"]
expected: FAIL
[HTML (standards) IMG usemap="no-hash-name"]
expected: FAIL

View file

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

View file

@ -1,6 +1,5 @@
[iframe_sandbox_popups_escaping-3.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,6 +1,5 @@
[iframe_sandbox_popups_nonescaping-3.html]
type: testharness
expected: TIMEOUT
[Check that popups from a sandboxed iframe do not escape the sandbox]
expected: NOTRUN
expected: FAIL

View file

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

View file

@ -1,4 +1,5 @@
[realtimeanalyser-fft-scaling.html]
expected: TIMEOUT
[X 2048-point FFT peak position is not equal to 64. Got 0.]
expected: FAIL

View file

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

View file

@ -37,7 +37,7 @@ jobs:
displayName: 'affected tests: Safari Technology Preview'
condition: eq(variables['Build.Reason'], 'PullRequest')
pool:
vmImage: 'macOS-10.14'
vmImage: 'macOS-10.15'
steps:
- task: UsePythonVersion@0
inputs:
@ -54,7 +54,7 @@ jobs:
displayName: 'affected tests without changes: Safari Technology Preview'
condition: eq(variables['Build.Reason'], 'PullRequest')
pool:
vmImage: 'macOS-10.14'
vmImage: 'macOS-10.15'
steps:
- task: UsePythonVersion@0
inputs:
@ -91,7 +91,7 @@ jobs:
dependsOn: decision
condition: dependencies.decision.outputs['test_jobs.wptrunner_infrastructure']
pool:
vmImage: 'macOS-10.14'
vmImage: 'macOS-10.15'
steps:
- task: UsePythonVersion@0
inputs:
@ -120,7 +120,7 @@ jobs:
dependsOn: decision
condition: dependencies.decision.outputs['test_jobs.tools_unittest']
pool:
vmImage: 'macOS-10.14'
vmImage: 'macOS-10.15'
variables:
HYPOTHESIS_PROFILE: ci
steps:
@ -138,7 +138,7 @@ jobs:
dependsOn: decision
condition: dependencies.decision.outputs['test_jobs.tools_unittest']
pool:
vmImage: 'macOS-10.14'
vmImage: 'macOS-10.15'
steps:
- task: UsePythonVersion@0
inputs:
@ -154,7 +154,7 @@ jobs:
dependsOn: decision
condition: dependencies.decision.outputs['test_jobs.tools_unittest']
pool:
vmImage: 'macOS-10.14'
vmImage: 'macOS-10.15'
steps:
- task: UsePythonVersion@0
inputs:
@ -170,7 +170,7 @@ jobs:
dependsOn: decision
condition: dependencies.decision.outputs['test_jobs.wptrunner_unittest']
pool:
vmImage: 'macOS-10.14'
vmImage: 'macOS-10.15'
variables:
HYPOTHESIS_PROFILE: ci
steps:
@ -188,7 +188,7 @@ jobs:
dependsOn: decision
condition: dependencies.decision.outputs['test_jobs.wptrunner_unittest']
pool:
vmImage: 'macOS-10.14'
vmImage: 'macOS-10.15'
steps:
- task: UsePythonVersion@0
inputs:
@ -204,7 +204,7 @@ jobs:
dependsOn: decision
condition: dependencies.decision.outputs['test_jobs.wptrunner_unittest']
pool:
vmImage: 'macOS-10.14'
vmImage: 'macOS-10.15'
steps:
- task: UsePythonVersion@0
inputs:
@ -220,7 +220,7 @@ jobs:
dependsOn: decision
condition: dependencies.decision.outputs['test_jobs.wpt_integration']
pool:
vmImage: 'macOS-10.14'
vmImage: 'macOS-10.15'
variables:
HYPOTHESIS_PROFILE: ci
steps:
@ -242,7 +242,7 @@ jobs:
dependsOn: decision
condition: dependencies.decision.outputs['test_jobs.wpt_integration']
pool:
vmImage: 'macOS-10.14'
vmImage: 'macOS-10.15'
steps:
# full checkout required
- task: UsePythonVersion@0
@ -262,7 +262,7 @@ jobs:
dependsOn: decision
condition: dependencies.decision.outputs['test_jobs.wpt_integration']
pool:
vmImage: 'macOS-10.14'
vmImage: 'macOS-10.15'
steps:
# full checkout required
- task: UsePythonVersion@0
@ -595,7 +595,7 @@ jobs:
parallel: 5 # chosen to make runtime ~2h
timeoutInMinutes: 180
pool:
vmImage: 'macOS-10.14'
vmImage: 'macOS-10.15'
steps:
- task: UsePythonVersion@0
inputs:
@ -633,7 +633,7 @@ jobs:
parallel: 5 # chosen to make runtime ~2h
timeoutInMinutes: 180
pool:
vmImage: 'macOS-10.14'
vmImage: 'macOS-10.15'
steps:
- task: UsePythonVersion@0
inputs:

View file

@ -5,6 +5,7 @@
height: 100px;
transform: translateY(100px);
background-color: green;
will-change: transform;
}
</style>

View file

@ -1,11 +0,0 @@
<!DOCTYPE html>
<title>Reference for Canceling a playing WorkletAnimation should remove the effect</title>
<style>
#box {
width: 100px;
height: 100px;
background-color: blue;
}
</style>
<div id="box"></div>

View file

@ -2,7 +2,7 @@
<title>Canceling a playing WorkletAnimation should remove the effect</title>
<link rel="help" href="https://drafts.css-houdini.org/css-animationworklet/">
<meta name="assert" content="Canceling a playing animation should remove the effect">
<link rel="match" href="worklet-animation-cancel-ref.html">
<link rel="match" href="references/not-translated-box-ref.html">
<script src="/web-animations/testcommon.js"></script>
<script src="/common/reftest-wait.js"></script>
@ -12,7 +12,7 @@
#box {
width: 100px;
height: 100px;
background-color: blue;
background-color: green;
}
</style>

View file

@ -1,12 +0,0 @@
<!DOCTYPE html>
<title>Reference for Animation Worklet should have access to effect timing from within the worklet thread</title>
<style>
#box {
width: 100px;
height: 100px;
background-color: green;
transform: translateY(100px);
}
</style>
<div id="box"></div>

View file

@ -2,7 +2,7 @@
<title>Animation Worklet should have access to effect timing from within the worklet thread</title>
<link rel="help" href="https://drafts.css-houdini.org/css-animationworklet/">
<meta name="assert" content="Animation Worklet should have access to effect timing from within the worklet thread">
<link rel="match" href="worklet-animation-get-timing-on-worklet-thread-ref.html">
<link rel="match" href="references/translated-box-ref.html">
<script src="/web-animations/testcommon.js"></script>
<script src="/common/reftest-wait.js"></script>

View file

@ -2,7 +2,7 @@
<title>Animation Worklet local time set after duration</title>
<link rel="help" href="https://drafts.css-houdini.org/css-animationworklet/">
<meta name="assert" content="If an effect doesn't have fill-mode specified, setting its local time beyond its duration makes the animation inactive.">
<link rel="match" href="worklet-animation-local-time-after-duration-ref.html">
<link rel="match" href="references/not-translated-box-ref.html">
<script src="/web-animations/testcommon.js"></script>
<script src="/common/reftest-wait.js"></script>

View file

@ -1,13 +0,0 @@
<!DOCTYPE html>
<title>Reference for Animation Worklet local time set before start</title>
<style>
#box {
width: 100px;
height: 100px;
background-color: green;
will-change: transform;
transform: translateY(200px);
}
</style>
<div id="box"></div>

View file

@ -2,7 +2,7 @@
<title>Animation Worklet local time set before start</title>
<link rel="help" href="https://drafts.css-houdini.org/css-animationworklet/">
<meta name="assert" content="The local time should be trimmed by the duration, e.g. this is equivalent to effect.localTime = 0">
<link rel="match" href="worklet-animation-local-time-before-start-ref.html">
<link rel="match" href="references/translated-box-ref.html">
<script src="/web-animations/testcommon.js"></script>
<script src="/common/reftest-wait.js"></script>
@ -23,7 +23,7 @@
const box = document.getElementById('box');
const effect = new KeyframeEffect(box,
[
{ transform: 'translateY(200px)' },
{ transform: 'translateY(100px)' },
{ transform: 'translateY(0px)' }
], {
duration: 1000,

View file

@ -0,0 +1,163 @@
<!DOCTYPE html>
<title>Setting localTime to null means effect does not apply</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>
<style>
.box {
width: 100px;
height: 100px;
background-color: green;
display: inline-block;
}
</style>
<div>
<div class="box" id="target1"></div>
<div class="box" id="target2"></div>
<div class="box" id="target3"></div>
<div class="box" id="target4"></div>
</div>
<script>
promise_test(async t => {
await runInAnimationWorklet(`
registerAnimator("blank_animator", class {
animate(currentTime, effect) {
// Unset effect.localTime is equivalent to 'null'
}
});
`);
const target = document.getElementById('target1');
const animation = new WorkletAnimation('blank_animator',
new KeyframeEffect(target,
[
{ transform: 'translateY(100px)' },
{ transform: 'translateY(200px)' }
], {
duration: 1000,
}
)
);
animation.play();
await waitForAsyncAnimationFrames(1);
assert_equals(getComputedStyle(target).transform, "matrix(1, 0, 0, 1, 0, 0)");
}, "A worklet which never sets localTime has no effect.");
promise_test(async t => {
await runInAnimationWorklet(`
registerAnimator("null_animator", class {
animate(currentTime, effect) {
effect.localTime = null;
}
});
`);
const target = document.getElementById('target2');
const animation = new WorkletAnimation('null_animator',
new KeyframeEffect(target,
[
{ transform: 'translateY(100px)' },
{ transform: 'translateY(200px)' }
], {
duration: 1000,
}
)
);
animation.play();
await waitForAsyncAnimationFrames(1);
assert_equals(getComputedStyle(target).transform, "matrix(1, 0, 0, 1, 0, 0)");
}, "A worklet which sets localTime to null has no effect.");
promise_test(async t => {
await runInAnimationWorklet(`
registerAnimator("drop_animator", class {
animate(currentTime, effect) {
if (currentTime < 500)
effect.localTime = 500;
else if (currentTime < 1000)
effect.localTime = 0;
else
effect.localTime = null;
}
});
`);
const target = document.getElementById('target3');
const animation = new WorkletAnimation('drop_animator',
new KeyframeEffect(target,
[
{ transform: 'translateY(100px)' },
{ transform: 'translateY(200px)' }
], {
duration: 1000,
}
)
);
animation.play();
await waitForAsyncAnimationFrames(5);
assert_equals(getComputedStyle(target).transform, "matrix(1, 0, 0, 1, 0, 150)",
"The animation has an effect at first");
await waitForAnimationFrameWithCondition(() => animation.currentTime > 500);
await waitForAsyncAnimationFrames(1);
assert_equals(getComputedStyle(target).transform, "matrix(1, 0, 0, 1, 0, 100)",
"The effect correctly changes");
await waitForAnimationFrameWithCondition(() => animation.currentTime > 1000);
await waitForAsyncAnimationFrames(1);
assert_equals(getComputedStyle(target).transform, "matrix(1, 0, 0, 1, 0, 0)",
"The effect stops on nulling of localTime");
}, "A worklet which changes localTime to from a number to null has no effect on transform.");
promise_test(async t => {
await runInAnimationWorklet(`
registerAnimator("drop2_animator", class {
animate(currentTime, effect) {
if (currentTime < 500)
effect.localTime = 500;
else if (currentTime < 1000)
effect.localTime = 0;
else
effect.localTime = null;
}
});
`);
const target = document.getElementById('target4');
const animation = new WorkletAnimation('drop2_animator',
new KeyframeEffect(target,
[
{ backgroundColor: 'red' },
{ backgroundColor: 'blue' }
], {
duration: 1000,
}
)
);
animation.play();
await waitForAsyncAnimationFrames(5);
assert_equals(getComputedStyle(target).backgroundColor, "rgb(128, 0, 128)",
"The animation has an effect at first");
await waitForAnimationFrameWithCondition(() => animation.currentTime > 500);
await waitForAsyncAnimationFrames(1);
assert_equals(getComputedStyle(target).backgroundColor, "rgb(255, 0, 0)",
"The effect correctly changes");
await waitForAnimationFrameWithCondition(() => animation.currentTime > 1000);
await waitForAsyncAnimationFrames(1);
assert_equals(getComputedStyle(target).backgroundColor, "rgb(0, 128, 0)",
"The effect stops on nulling of localTime");
}, "A worklet which changes localTime to from a number to null has no effect on backgroundColor.");
</script>

View file

@ -0,0 +1,27 @@
<!DOCTYPE html>
<title>Setting localTime to null means effect does not apply (reftest)</title>
<link rel="help" href="https://drafts.css-houdini.org/css-animationworklet/">
<style>
.box {
width: 100px;
height: 100px;
background-color: green;
display: inline-block;
}
#control {
background-color: red;
transform: translateY(100px);
}
</style>
<div>
<div class="box" id="target1"></div>
<div class="box" id="target2"></div>
<div class="box" id="target3"></div>
<div class="box" id="target4"></div>
<div class="box" id="control"></div>
</div>
</script>

View file

@ -0,0 +1,110 @@
<!DOCTYPE html>
<html class="reftest-wait">
<title>Setting localTime to null means effect does not apply (reftest)</title>
<link rel="help" href="https://drafts.css-houdini.org/css-animationworklet/">
<link rel="match" href="worklet-animation-local-time-null-2-ref.html">
<meta name="timeout" content="long">
<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;
display: inline-block;
}
</style>
<div>
<div class="box" id="target1"></div>
<div class="box" id="target2"></div>
<div class="box" id="target3"></div>
<div class="box" id="target4"></div>
<div class="box" id="control"></div>
</div>
<script>
runInAnimationWorklet(`
registerAnimator("blank_animator", class {
animate(currentTime, effect) {
// Unset effect.localTime is equivalent to 'null'
}
});
registerAnimator("null_animator", class {
animate(currentTime, effect) {
effect.localTime = null;
}
});
registerAnimator("drop_animator", class {
animate(currentTime, effect) {
if (currentTime < 500)
effect.localTime = 500;
else if (currentTime < 1000)
effect.localTime = 0;
else
effect.localTime = null;
}
});
registerAnimator("add_animator", class {
animate(currentTime, effect) {
if (currentTime < 1000)
effect.localTime = 500;
else
effect.localTime = 0;
}
});
`).then(() => {
const start_animation = (animator, targetId, keyframes) => {
const animation = new WorkletAnimation(animator,
new KeyframeEffect(
document.getElementById(targetId),
keyframes,
{duration: 1000}
)
);
animation.play();
return animation;
};
start_animation('blank_animator','target1', [
{ transform: 'translateY(100px)' },
{ transform: 'translateY(200px)' }
]);
start_animation('null_animator','target2', [
{ transform: 'translateY(100px)' },
{ transform: 'translateY(200px)' }
]);
start_animation('drop_animator','target3', [
{ transform: 'translateY(100px)' },
{ transform: 'translateY(200px)' }
]);
start_animation('drop_animator','target4', [
{ backgroundColor: 'red' },
{ backgroundColor: 'blue' }
]);
// check that animation worklets are running to stop accidental pass
const control_anim = start_animation('add_animator','control', [
{ backgroundColor: 'red', transform: 'translateY(100px)' },
{ backgroundColor: 'blue', transform: 'translateY(200px)' }
]);
waitForAnimationFrameWithCondition(() => control_anim.currentTime > 1000)
// long timeout due to laggy compositor thread on debug build.
.then(() => waitForAsyncAnimationFrames(120))
.then(takeScreenshot);
});
</script>

View file

@ -1,12 +0,0 @@
<!DOCTYPE html>
<title>Reference for Worklet Animation sets keyframes</title>
<style>
#box {
width: 100px;
height: 100px;
transform: translateX(100px);
background-color: green;
}
</style>
<div id="box"></div>

View file

@ -2,7 +2,7 @@
<title>Worklet Animation sets keyframes</title>
<link rel="help" href="https://drafts.css-houdini.org/css-animationworklet/">
<meta name="assert" content="Can update the keyframes for an effect while the animation is running">
<link rel="match" href="worklet-animation-set-keyframes-ref.html">
<link rel="match" href="references/translated-box-ref.html">
<script src="/web-animations/testcommon.js"></script>
<script src="/common/reftest-wait.js"></script>
@ -21,13 +21,13 @@
<script>
registerConstantLocalTimeAnimator(500).then(()=>{
const keyframes_before = [
{ transform: 'translateY(0)' },
{ transform: 'translateY(200px)' }
];
const keyframes_after = [
{ transform: 'translateX(0)' },
{ transform: 'translateX(200px)' }
];
const keyframes_after = [
{ transform: 'translateY(0)' },
{ transform: 'translateY(200px)' }
];
const box = document.getElementById('box');
const effect = new KeyframeEffect(box, keyframes_before, {duration: 1000});

View file

@ -1,12 +0,0 @@
<!DOCTYPE html>
<title>Reference for Worklet Animation sets timing</title>
<style>
#box {
width: 100px;
height: 100px;
transform: translateX(50px);
background-color: green;
}
</style>
<div id="box"></div>

View file

@ -2,7 +2,7 @@
<title>Worklet Animation sets timing</title>
<link rel="help" href="https://drafts.css-houdini.org/css-animationworklet/">
<meta name="assert" content="Can update the timing for an effect while the animation is running">
<link rel="match" href="worklet-animation-set-timing-ref.html">
<link rel="match" href="references/translated-box-ref.html">
<script src="/web-animations/testcommon.js"></script>
<script src="/common/reftest-wait.js"></script>
@ -21,8 +21,8 @@
<script>
registerConstantLocalTimeAnimator(500).then(()=>{
const keyframes = [
{ transform: 'translateX(0)' },
{ transform: 'translateX(200px)' }
{ transform: 'translateY(0)' },
{ transform: 'translateY(400px)' }
];
const options_before = {
duration: 1000

View file

@ -0,0 +1,67 @@
<!DOCTYPE html>
<meta charset="utf-8">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script>
<body>
<script>
let frame = null;
let worker = null;
const scope = 'support/empty.html';
const script = 'support/sandboxed-service-worker.js';
// Currently, sandbox directives for workers are not specified
// https://github.com/w3c/webappsec-csp/issues/279
// and thus this test asserts that the origin of ServiceWorker is not sandboxed.
// Global setup: this must be the first promise_test.
promise_test(async (t) => {
const registration =
await service_worker_unregister_and_register(t, script, scope);
worker = registration.installing;
await wait_for_state(t, worker, 'activated');
frame = await with_iframe(scope);
// Global cleanup: the final promise_test.
promise_test(() => {
if (frame)
frame.remove();
return registration.unregister();
}, 'global cleanup');
}, 'global setup');
promise_test(async (t) => {
const r = await frame.contentWindow.fetch('/get-origin', {mode: 'cors'});
const j = await r.json();
assert_equals(j.origin, location.origin, 'Origin should not be sandboxed');
}, 'Origin of service worker');
promise_test(async (t) => {
const r = await frame.contentWindow.fetch('/get-origin',
{mode: 'same-origin'});
const j = await r.json();
assert_equals(j.origin, location.origin, 'Origin should not be opaque');
}, 'Response generated by service worker can be fetched as same-origin');
// Because the origin of service worker should be `location.origin`,
// fetches from service worker to `location.origin` should be successful.
for (const mode of ['same-origin', 'cors']) {
for (const hasACAOrigin of [true, false]) {
promise_test(async (t) => {
const final_url = new URL('/fetch/api/resources/', location);
final_url.pathname += hasACAOrigin ? 'cors-top.txt' : 'top.txt';
final_url.searchParams.set('hash', Math.random());
const url = new URL('/fetch', location);
url.searchParams.set('url', final_url);
url.searchParams.set('hash', Math.random());
const r = await frame.contentWindow.fetch(url, {mode});
const text = await r.text();
assert_equals(text, 'top');
}, 'Origin used in fetch on service worker (mode: ' +
mode +
(hasACAOrigin ? ', with ACAOrigin' : '') +
')');
}
}
</script>

View file

@ -0,0 +1,18 @@
<!DOCTYPE html>
<meta charset="utf-8">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<body>
<script>
// Currently, sandbox directives for workers are not specified
// https://github.com/w3c/webappsec-csp/issues/279
// and thus this test asserts that the origin of SharedWorker is not sandboxed.
async_test(t => {
const worker = new SharedWorker("support/sandboxed-shared-worker.js?" + Math.random());
worker.onerror = t.unreached_func("SharedWorker construction failed");
worker.port.onmessage = t.step_func_done(e => {
assert_equals(e.data, location.origin, "Origin should not be sandboxed");
});
}, "sandbox directive for SharedWorker");
</script>
</body>

View file

@ -0,0 +1,14 @@
self.addEventListener('fetch', function(event) {
const url = new URL(event.request.url);
if (url.pathname.indexOf('get-origin') != -1) {
event.respondWith(new Promise(function(resolve) {
resolve(new Response(JSON.stringify({
origin: self.origin
})));
}));
}
else if (url.pathname.indexOf('fetch') != -1) {
event.respondWith(fetch(url.searchParams.get('url'),
{mode: event.request.mode}));
}
});

View file

@ -0,0 +1 @@
Content-Security-Policy: sandbox allow-scripts

View file

@ -0,0 +1,3 @@
self.onconnect = e => {
e.ports[0].postMessage(self.origin);
};

View file

@ -0,0 +1 @@
Content-Security-Policy: sandbox allow-scripts

View file

@ -3,7 +3,7 @@
<link rel="author" title="Tab Atkins-Bittner" href="https://xanthir.com/contact/">
<link rel="help" href="https://drafts.csswg.org/css-grid/#min-size-auto">
<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
<meta name="assert" content="An item spanning >1 track, at least one of which is flexible, must have a zero automatic minimum size (and thus, not grow to accommodate its children)."
<meta name="assert" content="An item spanning >1 track, at least one of which is flexible, must have a zero automatic minimum size (and thus, not grow to accommodate its children).">
<style>
.grid { display: grid; grid-template-columns: repeat(12, 1fr); height: 100px; width: 100px; }
@ -13,6 +13,7 @@
.big-child { width: 500px; height: 100px; }
</style>
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
<div class="grid">
<div class="under"></div>

View file

@ -11,15 +11,15 @@
<div style="position: relative; height: 100px; position: relative;">
<div style="position: absolute; aspect-ratio: 1/1; max-height: 100%; background: green; color: green;">
<!-- max-size 200px, min-size: 20px -->
<div style="width: 20px; height: 10px; vertical-align: bottom;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom; display: inline-block;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom; display: inline-block;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom; display: inline-block;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom; display: inline-block;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom; display: inline-block;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom; display: inline-block;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom; display: inline-block;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom; display: inline-block;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom; display: inline-block;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom; display: inline-block;"></div>
</div>
</div>

View file

@ -11,15 +11,15 @@
<div style="height: 100px;">
<div style="aspect-ratio: 1/1; max-height: 100%; background: green;">
<!-- max-size 200px, min-size: 20px -->
<div style="width: 20px; height: 10px; vertical-align: bottom;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom; display: inline-block;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom; display: inline-block;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom; display: inline-block;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom; display: inline-block;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom; display: inline-block;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom; display: inline-block;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom; display: inline-block;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom; display: inline-block;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom; display: inline-block;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom; display: inline-block;"></div>
</div>
</div>

View file

@ -0,0 +1,14 @@
<!DOCTYPE html>
<title>CSS aspect-ratio: abspos div inline size with max-height</title>
<link rel="author" title="Google LLC" href="https://www.google.com/">
<link rel="help" href="https://drafts.csswg.org/css-sizing-4/#aspect-ratio">
<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/5257">
<link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
<meta name="assert" content="A max-height constraint should be transferred through the aspect-ratio to apply to the inline size">
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
<!-- Due to the transferred max-height, this should not be 200px wide -->
<div style="max-height: 100px; aspect-ratio: 1/1; width: max-content; background: green;">
<div style="width: 200px"></div>
</div>

View file

@ -0,0 +1,17 @@
<!DOCTYPE html>
<title>CSS aspect-ratio: abspos div inline size with max-height</title>
<link rel="author" title="Google LLC" href="https://www.google.com/">
<link rel="help" href="https://drafts.csswg.org/css-sizing-4/#aspect-ratio">
<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/5257">
<link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
<meta name="assert" content="A max-height constraint should be transferred through the aspect-ratio to apply to the inline size">
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
<!-- min-content width is 300px, clamped by max-width to 100px. The transferred min-width
would be 200px but should not override the explicit max-width, so the resulting div
should be 100px wide. This should then size the green div to a width of 100px. -->
<div style="min-height: 200px; max-width: 100px; aspect-ratio: 1/1;">
<div style="width: 300px;"></div>
<div style="height: 100px; background: green;"></div>
</div>

View file

@ -0,0 +1,17 @@
<!DOCTYPE html>
<title>CSS aspect-ratio: abspos div inline size with max-height</title>
<link rel="author" title="Google LLC" href="https://www.google.com/">
<link rel="help" href="https://drafts.csswg.org/css-sizing-4/#aspect-ratio">
<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/5257">
<link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
<meta name="assert" content="A max-height constraint should be transferred through the aspect-ratio to apply to the inline size">
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
<!-- min-content width is 50px, clamped by min-width to 100px. The transferred max-width
would be 40px but should not override the explicit min-width, so the resulting div
should be 100px wide. This should then size the green div to a width of 100px. -->
<div style="max-height: 40px; min-width: 100px; aspect-ratio: 1/1;">
<div style="width: 50px;"></div>
<div style="height: 100px; background: green;"></div>
</div>

View file

@ -0,0 +1,20 @@
<!DOCTYPE html>
<title>CSS aspect-ratio: abspos div inline size with max-height</title>
<link rel="author" title="Google LLC" href="https://www.google.com/">
<link rel="help" href="https://drafts.csswg.org/css-sizing-4/#aspect-ratio">
<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/5257">
<link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
<meta name="assert" content="A min-height constraint should be transferred through the aspect-ratio to apply to the inline size">
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
<div id="target" style="height: 0px; width: min-content; background: green;">
<div style="min-height: 100%; aspect-ratio: 1/1;">
<div style="width: 50px">
</div>
</div>
<script>
document.body.offsetTop;
document.getElementById("target").style.height = "100px";
</script>

View file

@ -0,0 +1,13 @@
<!DOCTYPE html>
<title>CSS aspect-ratio: abspos div inline size with max-height</title>
<link rel="author" title="Google LLC" href="https://www.google.com/">
<link rel="help" href="https://drafts.csswg.org/css-sizing-4/#aspect-ratio">
<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/5257">
<link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
<meta name="assert" content="A min-height constraint should be transferred through the aspect-ratio to apply to the inline size">
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
<!-- Even with a specified but indefinite height, we want to apply the
transferred min/max height to the inline size. -->
<div style="aspect-ratio: 1/1; height: 100%; min-height: 100px; background: green; float: left;"></div>

View file

@ -0,0 +1,25 @@
<!DOCTYPE html>
<title>CSS aspect-ratio: abspos div inline size with max-height</title>
<link rel="author" title="Google LLC" href="https://www.google.com/">
<link rel="help" href="https://drafts.csswg.org/css-sizing-4/#aspect-ratio">
<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/5257">
<link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
<meta name="assert" content="A max-height constraint should be transferred through the aspect-ratio to apply to the inline size">
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
<div style="height: 100px;">
<div style="aspect-ratio: 1/1; max-height: 100%; padding-bottom: 20px; background: green; box-sizing: border-box;">
<!-- max-size 200px, min-size: 20px -->
<div style="width: 20px; height: 10px; vertical-align: bottom; display: inline-block;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom; display: inline-block;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom; display: inline-block;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom; display: inline-block;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom; display: inline-block;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom; display: inline-block;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom; display: inline-block;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom; display: inline-block;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom; display: inline-block;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom; display: inline-block;"></div>
</div>
</div>

View file

@ -0,0 +1,25 @@
<!DOCTYPE html>
<title>CSS aspect-ratio: abspos div inline size with max-height</title>
<link rel="author" title="Google LLC" href="https://www.google.com/">
<link rel="help" href="https://drafts.csswg.org/css-sizing-4/#aspect-ratio">
<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/5257">
<link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
<meta name="assert" content="A max-height constraint should be transferred through the aspect-ratio to apply to the inline size">
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
<div style="height: 100px;">
<div style="aspect-ratio: 100/80; max-height: 80px; padding-bottom: 20px; background: green; box-sizing: content-box;">
<!-- max-size 200px, min-size: 20px -->
<div style="width: 20px; height: 10px; vertical-align: bottom; display: inline-block;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom; display: inline-block;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom; display: inline-block;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom; display: inline-block;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom; display: inline-block;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom; display: inline-block;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom; display: inline-block;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom; display: inline-block;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom; display: inline-block;"></div>
<div style="width: 20px; height: 10px; vertical-align: bottom; display: inline-block;"></div>
</div>
</div>

View file

@ -0,0 +1,20 @@
<!DOCTYPE html>
<title>CSS aspect-ratio: abspos div inline size with max-height</title>
<link rel="author" title="Google LLC" href="https://www.google.com/">
<link rel="help" href="https://drafts.csswg.org/css-sizing-4/#aspect-ratio">
<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/5257">
<link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
<meta name="assert" content="A min-height constraint should be transferred through the aspect-ratio to apply to the inline size">
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
<div id="target" style="height: 50px; width: min-content; background: green;">
<div style="height: 100%;">
<div style="min-height: 100%; aspect-ratio: 1/1;"></div>
</div>
</div>
<script>
document.body.offsetTop;
document.getElementById("target").style.height = "100px";
</script>

View file

@ -0,0 +1,12 @@
<!DOCTYPE html>
<title>CSS aspect-ratio: img</title>
<link rel="author" title="Google LLC" href="https://www.google.com/">
<link rel="help" href="https://drafts.csswg.org/css-sizing-4/#aspect-ratio">
<link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
<!-- Replaced elements should always use content-box sizing for the purpose of
aspect ratio. -->
<img src="support/20x50-green.png" style="aspect-ratio: 20/50; background: green; padding-right: 80px; padding-bottom: 50px; box-sizing: border-box;">

View file

@ -0,0 +1,12 @@
<!DOCTYPE html>
<title>CSS aspect-ratio: img</title>
<link rel="author" title="Google LLC" href="https://www.google.com/">
<link rel="help" href="https://drafts.csswg.org/css-sizing-4/#aspect-ratio">
<link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
<!-- Replaced elements should always use content-box sizing for the purpose of
aspect ratio. -->
<img src="support/20x50-green.png" style="aspect-ratio: 20/50; background: green; padding-right: 80px; padding-bottom: 50px; box-sizing: border-box; max-height: 100px;">

View file

@ -414,4 +414,22 @@ promise_test(async t => {
await waitForAnimationFrames(2);
}, 'Cancel the transition after clearing the target effect');
promise_test(async t => {
const { transition, watcher, div } = setupTransition(t, 'margin-left 100s');
// Seek to After phase.
transition.finish();
const events = await watcher.wait_for(
['transitionrun', 'transitionstart', 'transitionend'],
{
record: 'all',
}
);
transition.cancel();
// Then wait a couple of frames and check that no event was dispatched
await waitForAnimationFrames(2);
}, 'Cancel the transition after it finishes');
</script>

View file

@ -515,7 +515,7 @@ properties of the test harness (enumerated in the following section).
Both setup functions recognize the following properties:
`explicit_done` - Wait for an explicit call to done() before declaring all
tests complete (see below; implicitly true for single page tests)
tests complete (see below; always true for single page tests)
`output_document` - The document to which results should be logged. By default
this is the current document but could be an ancestor document in some cases

View file

@ -18,21 +18,21 @@ const coep_header = '|header(Cross-Origin-Embedder-Policy,require-corp)';
promise_test(async t => {
const report_token = token();
const executor_token = token();
const callback_token = token();
const openee_token = token();
const opener_token = token(); // The current test window.
const reportTo = reportToHeaders(report_token);
const openee_url = cross_origin + executor_path +
reportTo.header + reportTo.coopReportOnlySameOriginHeader + coep_header +
`&uuid=${executor_token}`;
`&uuid=${openee_token}`;
const openee = window.open(openee_url);
t.add_cleanup(() => send(executor_token, "window.close()"))
t.add_cleanup(() => send(openee_token, "window.close()"))
// 1. Make sure the new document to be loaded.
send(executor_token, `
send("${callback_token}", "Ready");
send(openee_token, `
send("${opener_token}", "Ready");
`);
let reply = await receive(callback_token);
let reply = await receive(opener_token);
assert_equals(reply, "Ready");
// 2. Try to access the openee. A report is sent, because of COOP-RO+COEP.

View file

@ -18,21 +18,21 @@ const coep_header = '|header(Cross-Origin-Embedder-Policy,require-corp)';
promise_test(async t => {
const report_token = token();
const executor_token = token();
const callback_token = token();
const openee_token = token();
const opener_token = token(); // The current test window.
const reportTo = reportToHeaders(report_token);
const openee_url = cross_origin + executor_path +
reportTo.header + reportTo.coopSameOriginHeader + coep_header +
`&uuid=${executor_token}`;
`&uuid=${openee_token}`;
const openee = window.open(openee_url);
t.add_cleanup(() => send(executor_token, "window.close()"))
t.add_cleanup(() => send(openee_token, "window.close()"))
// 1. Make sure the new document to be loaded.
send(executor_token, `
send("${callback_token}", "Ready");
send(openee_token, `
send("${opener_token}", "Ready");
`);
let reply = await receive(callback_token);
let reply = await receive(opener_token);
assert_equals(reply, "Ready");
// 2. Try to access the openee. This shouldn't work because of COOP+COEP.

View file

@ -18,18 +18,17 @@ const coep_header = '|header(Cross-Origin-Embedder-Policy,require-corp)';
promise_test(async t => {
const report_token = token();
const executor_token = token();
const callback_token = token();
const openee_token = token();
const reportTo = reportToHeaders(report_token);
const openee_url = cross_origin + executor_path +
reportTo.header + reportTo.coopReportOnlySameOriginHeader + coep_header +
`&uuid=${executor_token}`;
`&uuid=${openee_token}`;
const openee = window.open(openee_url);
t.add_cleanup(() => send(executor_token, "window.close()"))
t.add_cleanup(() => send(openee_token, "window.close()"))
// 1. Try to access the opener. A report is sent, because of COOP-RO+COEP.
send(executor_token, `
send(openee_token, `
tryAccess(opener);
`);

View file

@ -18,18 +18,17 @@ const coep_header = '|header(Cross-Origin-Embedder-Policy,require-corp)';
promise_test(async t => {
const report_token = token();
const executor_token = token();
const callback_token = token();
const openee_token = token();
const reportTo = reportToHeaders(report_token);
const openee_url = cross_origin + executor_path +
reportTo.header + reportTo.coopSameOriginHeader + coep_header +
`&uuid=${executor_token}`;
`&uuid=${openee_token}`;
const openee = window.open(openee_url);
t.add_cleanup(() => send(executor_token, "window.close()"));
t.add_cleanup(() => send(openee_token, "window.close()"));
// 1. Try to access the opener. A report is sent, because of COOP+COEP.
send(executor_token, `
send(openee_token, `
tryAccess(opener);
`);

View file

@ -0,0 +1,66 @@
<title> Check reports are sent for the indexed getter</title>
<meta name=timeout content=long>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src=/common/get-host-info.sub.js></script>
<script src="/common/utils.js"></script>
<script src="../resources/dispatcher.js"></script>
<script>
const directory = "/html/cross-origin-opener-policy/reporting";
const executor_path = directory + "/resources/executor.html?pipe=";
const coep_header = '|header(Cross-Origin-Embedder-Policy,require-corp)';
let origin = [
["cross-origin" , get_host_info().HTTPS_REMOTE_ORIGIN ] ,
["same-site" , get_host_info().HTTPS_ORIGIN ] ,
];
let testCase = [
//[operation , expectReport ] ,
[w => w[0] , true ], // Existing iframe.
[w => w[1] , false ], // Out of bounds (positive).
[w => w[-1] , false ], // Out of bounds (negative).
];
origin.forEach(([origin_name, origin]) => {
testCase.forEach(([op, expectReport]) => {
promise_test(async t => {
const opener_token = token();
const openee_token = token();
const openee_url = origin+ executor_path + `&uuid=${openee_token}`;
const openee = window.open(openee_url);
t.add_cleanup(() => send(openee_token, "window.close()"))
// 1. Create an iframe in the openee.
send(openee_token, `
let iframe = document.createElement("iframe");
document.body.appendChild(iframe);
send("${opener_token}", "openee loaded");
`);
let reply = await receive(opener_token);
assert_equals(reply, "openee loaded");
// 2. Try to access the openee.
let observer = new ReportingObserver(()=>{});
observer.observe();
try {op(openee)} catch(e) {}
let reports = observer.takeRecords();
observer.disconnect();
// 3. Check the received reports.
if (expectReport) {
assert_equals(reports.length, 1);
assert_equals(reports[0].type, "coop-access-violation");
assert_equals(reports[0].body.property, "indexed");
} else {
assert_equals(reports.length, 0);
}
}, `${origin_name} > ${op}`);
});
});
</script>

View file

@ -0,0 +1 @@
Cross-Origin-Opener-Policy-Report-Only: same-origin; report-to="none"

View file

@ -0,0 +1,72 @@
<title> Check reports are sent for the indexed getter</title>
<meta name=timeout content=long>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src=/common/get-host-info.sub.js></script>
<script src="/common/utils.js"></script>
<script src="../resources/dispatcher.js"></script>
<script>
const directory = "/html/cross-origin-opener-policy/reporting";
const executor_path = directory + "/resources/executor.html?pipe=";
let crossOrigin = ["cross-origin" , get_host_info().HTTPS_REMOTE_ORIGIN ];
let sameOrigin = ["same-site" , get_host_info().HTTPS_ORIGIN ];
let testCase = [
//[ operation , origin , expectReport ],
[ w => w["iframeName"] , sameOrigin , true ],
[ w => w["iframeName"] , crossOrigin , true ],
[ w => w["divID"] , sameOrigin , true ],
[ w => w["divID"] , crossOrigin , false ],
[ w => w["existingGlobal"] , sameOrigin , false ],
[ w => w["existingGlobal"] , crossOrigin , false ],
[ w => w["missingGlobal"] , sameOrigin , false ],
[ w => w["missingGlobal"] , crossOrigin , false ],
];
testCase.forEach(([op, [origin_name, origin], expectReport]) => {
promise_test(async t => {
const opener_token = token();
const openee_token = token();
const openee_url = origin + executor_path + `&uuid=${openee_token}`;
const openee = window.open(openee_url);
t.add_cleanup(() => send(openee_token, "window.close()"))
// 1. Make sure the new document to be loaded. Populate the document.
send(openee_token, `
let iframe = document.createElement("iframe");
iframe.name = "iframeName";
document.body.appendChild(iframe);
let div = document.createElement("div");
div.id = "divID";
document.body.appendChild(div);
window.existingGlobal = "test";
send("${opener_token}", "Ready");
`);
let reply = await receive(opener_token);
assert_equals(reply, "Ready");
// 2. Try to access the openee.
let observer = new ReportingObserver(()=>{});
observer.observe();
try {op(openee)} catch(e) {}
let reports = observer.takeRecords();
observer.disconnect();
// 3. Check the received reports.
if (expectReport) {
assert_equals(reports.length, 1);
assert_equals(reports[0].type, "coop-access-violation");
assert_equals(reports[0].body.property, "named");
} else {
assert_equals(reports.length, 0);
}
}, `${origin_name} > ${op}`);
});
</script>

View file

@ -0,0 +1 @@
Cross-Origin-Opener-Policy-Report-Only: same-origin; report-to="none"

View file

@ -22,11 +22,9 @@ let property= [
["closed" , w => w.closed ] ,
["focus" , w => w.focus() ] ,
["frames" , w => w.frames ] ,
["indexed" , w => w[0] ] ,
["length" , w => w.length ] ,
["location" , w => w.location ] ,
["location" , w => w.location = "#" ] ,
["named" , w => w["test"] ] ,
["opener" , w => w.opener ] ,
["opener" , w => w.opener = "" ] ,
["postMessage" , w => w.postMessage("") ] ,
@ -40,19 +38,19 @@ origin.forEach(([origin_name, origin]) => {
property.forEach(([property, op]) => {
promise_test(async t => {
const report_token = token();
const executor_token = token();
const callback_token = token();
const openee_token = token();
const opener_token = token(); // The current test window.
const reportTo = reportToHeaders(report_token);
const openee_url = origin+ executor_path +
reportTo.header + reportTo.coopReportOnlySameOriginHeader + coep_header +
`&uuid=${executor_token}`;
const openee_url = origin + executor_path + reportTo.header +
reportTo.coopReportOnlySameOriginHeader + coep_header +
`&uuid=${openee_token}`;
const openee = window.open(openee_url);
t.add_cleanup(() => send(executor_token, "window.close()"))
t.add_cleanup(() => send(openee_token, "window.close()"))
// 1. Make sure the new document to be loaded.
send(executor_token, `send("${callback_token}", "Ready");`);
let reply = await receive(callback_token);
send(openee_token, `send("${opener_token}", "Ready");`);
let reply = await receive(opener_token);
assert_equals(reply, "Ready");
// 2. Try to access the openee. This shouldn't work because of COOP+COEP.

View file

@ -20,7 +20,8 @@ interface PerformanceEntry {
};
callback PerformanceObserverCallback = void (PerformanceObserverEntryList entries,
PerformanceObserver observer);
PerformanceObserver observer,
optional boolean hasDroppedEntry = false);
[Exposed=(Window,Worker)]
interface PerformanceObserver {
constructor(PerformanceObserverCallback callback);

View file

@ -0,0 +1,71 @@
<!DOCTYPE HTML>
<meta charset=utf-8>
<title>Layout Instability: observe timestamp after user input</title>
<body>
<style>
#myDiv {
position: relative;
width: 300px;
height: 100px;
}
/* Disable the button's focus ring, which otherwise expands its visual rect by
* 1px on all sides, triggering a layout shift event.
*/
#button {
outline: none;
}
</style>
<div id='myDiv'></div>
<button id='button'>Generate a 'click' event</button>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src=/resources/testdriver.js></script>
<script src=/resources/testdriver-vendor.js></script>
<script src=resources/util.js></script>
<script src=/event-timing/resources/event-timing-test-utils.js></script>
<script>
let timeAfterClick;
promise_test(async t => {
assert_implements(window.LayoutShift, 'Layout Instability is not supported.');
// Wait for the initial render to complete.
await waitForAnimationFrames(2);
const startTime = performance.now();
return new Promise(resolve => {
const observer = new PerformanceObserver(
t.step_func(entryList => {
const endTime = performance.now();
assert_equals(entryList.getEntries().length, 1);
const entry = entryList.getEntries()[0];
assert_equals(entry.entryType, "layout-shift");
assert_equals(entry.name, "");
assert_greater_than_equal(entry.startTime, startTime);
assert_less_than_equal(entry.startTime, endTime);
assert_equals(entry.duration, 0.0);
// The layout shift value should be:
// 300 * (100 + 60) * (60 / maxDimension) / viewport size.
assert_equals(entry.value, computeExpectedScore(300 * (100 + 60), 60));
// We should see that there was a click input entry.
assert_equals(entry.hadRecentInput, false);
assert_greater_than_equal(timeAfterClick, entry.lastInputTime);
resolve();
})
);
observer.observe({ entryTypes: ['layout-shift'] });
// User input event
clickAndBlockMain('button').then(() => {
// 500ms delay
step_timeout(function() {
timeAfterClick = performance.now();
// Modify the position of the div.
document.getElementById('myDiv').style = "top: 60px";
}, 500);
});
});
}, 'Layout shift right after user input is observable via PerformanceObserver.');
</script>
</body>

View file

@ -0,0 +1,177 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>Test for 'secure-payment-confirmation' payment method</title>
<link rel="help" href="https://github.com/rsolomakhin/secure-payment-confirmation">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
'use strict';
const details = {total:
{label: 'Total', amount: {value: '0.01', currency: 'USD'}}};
test(() => {
new PaymentRequest([{
supportedMethods: 'secure-payment-confirmation',
data: {
// All valid parameters.
action: 'authenticate',
instrumentId: 'x',
networkData: Uint8Array.from('x', c => c.charCodeAt(0)),
timeout: 60000,
fallbackUrl: 'https://fallback.example/url'
},
}], details);
}, 'Valid payment method data does not throw exceptions.');
test(() => {
new PaymentRequest([{
supportedMethods: 'secure-payment-confirmation',
data: {
// Omitted action field.
instrumentId: 'x',
networkData: Uint8Array.from('x', c => c.charCodeAt(0)),
timeout: 60000,
fallbackUrl: 'https://fallback.example/url'
},
}], details);
}, 'The action field is optional.');
test(() => {
new PaymentRequest([{
supportedMethods: 'secure-payment-confirmation',
data: {
action: 'authenticate',
instrumentId: 'x',
networkData: Uint8Array.from('x', c => c.charCodeAt(0)),
// Omitted timeout field.
fallbackUrl: 'https://fallback.example/url'
},
}], details);
}, 'The timeout field is optional.');
test(() => {
assert_throws_js(TypeError, () => {
new PaymentRequest([{
supportedMethods: 'secure-payment-confirmation',
data: {
// Invalid action parameter.
action: 'authorize',
instrumentId: 'x',
networkData: Uint8Array.from('x', c => c.charCodeAt(0)),
timeout: 60000,
fallbackUrl: 'https://fallback.example/url'
},
}], details);
});
}, 'Invalid action parameter throws an exception.');
test(() => {
assert_throws_js(TypeError, () => {
new PaymentRequest([{
supportedMethods: 'secure-payment-confirmation',
data: {
action: 'authenticate',
// Omitted instrumentId field.
networkData: Uint8Array.from('x', c => c.charCodeAt(0)),
timeout: 60000,
fallbackUrl: 'https://fallback.example/url'
},
}], details);
});
}, 'The instrumentId field is required.');
test(() => {
assert_throws_js(TypeError, () => {
new PaymentRequest([{
supportedMethods: 'secure-payment-confirmation',
data: {
action: 'authenticate',
instrumentId: 'x',
// Omitted instrumentId field.
timeout: 60000,
fallbackUrl: 'https://fallback.example/url'
},
}], details);
});
}, 'The networkData field is required.');
test(() => {
assert_throws_js(TypeError, () => {
new PaymentRequest([{
supportedMethods: 'secure-payment-confirmation',
data: {
action: 'authenticate',
instrumentId: 'x',
networkData: Uint8Array.from('x', c => c.charCodeAt(0)),
timeout: 60000,
// Omitted fallbackUrl field.
},
}], details);
});
}, 'The fallbackUrl field is required.');
test(() => {
assert_throws_js(RangeError, () => {
new PaymentRequest([{
supportedMethods: 'secure-payment-confirmation',
data: {
action: 'authenticate',
// Empty instrumentId field.
instrumentId: '',
networkData: Uint8Array.from('x', c => c.charCodeAt(0)),
timeout: 60000,
fallbackUrl: 'https://fallback.example/url'
},
}], details);
});
}, 'Empty instrumentId field throws exception.');
test(() => {
assert_throws_js(TypeError, () => {
new PaymentRequest([{
supportedMethods: 'secure-payment-confirmation',
data: {
action: 'authenticate',
instrumentId: 'x',
// Null networkData field.
networkData: null,
timeout: 60000,
fallbackUrl: 'https://fallback.example/url'
},
}], details);
});
}, 'Null networkData field throws exception.');
test(() => {
assert_throws_js(TypeError, () => {
new PaymentRequest([{
supportedMethods: 'secure-payment-confirmation',
data: {
action: 'authenticate',
instrumentId: 'x',
// Empty networkData field.
networkData: [],
timeout: 60000,
fallbackUrl: 'https://fallback.example/url'
},
}], details);
});
}, 'Empty networkData field throws exception.');
test(() => {
assert_throws_js(RangeError, () => {
new PaymentRequest([{
supportedMethods: 'secure-payment-confirmation',
data: {
action: 'authenticate',
instrumentId: 'x',
networkData: Uint8Array.from('x', c => c.charCodeAt(0)),
// Timeout longer than 1 hour.
timeout: 1000 * 60 * 60 + 1,
fallbackUrl: 'https://fallback.example/url'
},
}], details);
});
}, 'Timeout longer than 1 hour throws exception.');
</script>

View file

@ -5,12 +5,17 @@
<script src="/resources/testdriver-vendor.js"></script>
<script src="/resources/testdriver-actions.js"></script>
<script type="text/javascript" src="../pointerevent_support.js"></script>
<!-- There are significant differences in how browsers fire pointer events and
compat mouse events when elements are removed from the dom.
There is a discussion about the order of pointer events and mouse compat events
for this scenario in the pointer event working group (See link below)-->
<link rel="help" href="https://github.com/w3c/pointerevents/issues/285">
<style>
div.box {
margin: 5px;
padding: 20px;
float: left;
background-color:green;
}
#grey {
width: 50px;
@ -22,12 +27,14 @@ div.box {
<div id="grey" class="box" style="background-color:grey">
</div>
<button id="done">Done</button>
<div id="console"></div>
<script>
var receivedEvents = [];
var done_clicked = false;
var eventList = ["mousedown", "mouseup", "mousemove",
"pointerdown", "pointerup", "pointermove"];
@ -62,6 +69,9 @@ function createGreenBoxAndAddListeners() {
});
}
var done_button = document.getElementById("done");
done_button.addEventListener("click",()=>done_clicked=true);
function performActions() {
var rect = document.getElementById("green").getBoundingClientRect();
var x1 = Math.ceil(rect.left + 5);
@ -73,13 +83,13 @@ function performActions() {
.pointerDown()
.pointerUp()
.send()
.then( () => resolveWhen( () => receivedEvents.length == 6 ) );
.then(()=> test_driver.click(done_button));
}
function testScenario(targetEvent, expectedEvents, description) {
promise_test(async () => {
removeNodeEvent = targetEvent;
receivedEvents = [];
removeNodeEvent = targetEvent;
createGreenBoxAndAddListeners();
await performActions();

View file

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>AllowRemoteAutomation</key>
<true/>
</dict>
</plist>

View file

@ -9,7 +9,10 @@ steps:
- ${{ if eq(parameters.channel, 'preview') }}:
- script: |
HOMEBREW_NO_AUTO_UPDATE=1 brew cask install tools/ci/azure/safari-technology-preview.rb
sudo "/Applications/Safari Technology Preview.app/Contents/MacOS/safaridriver" --enable
# Workaround for `sudo safardriver --enable` not working on Catalina:
# https://github.com/web-platform-tests/wpt/issues/21751
mkdir -p ~/Library/WebDriver/
cp tools/ci/azure/com.apple.SafariTechnologyPreview.plist ~/Library/WebDriver/
defaults write com.apple.SafariTechnologyPreview WebKitJavaScriptCanOpenWindowsAutomatically 1
defaults write com.apple.SafariTechnologyPreview ExperimentalServerTimingEnabled 1
displayName: 'Install Safari Technology Preview'

View file

@ -6986,5 +6986,51 @@
"pathname": "/",
"search": "",
"hash": "#link"
},
"UTF-8 percent-encode of C0 control percent-encode set and supersets",
{
"input": "non-special:cannot-be-a-base-url-\u0000\u0001\u001F\u001E\u007E\u007F\u0080",
"base": "about:blank",
"hash": "",
"host": "",
"hostname": "",
"href": "non-special:cannot-be-a-base-url-%00%01%1F%1E~%7F%C2%80",
"origin": "null",
"password": "",
"pathname": "cannot-be-a-base-url-%00%01%1F%1E~%7F%C2%80",
"port": "",
"protocol": "non-special:",
"search": "",
"username": ""
},
{
"input": "https://www.example.com/path{\u007Fpath.html?query'\u007F=query#fragment<\u007Ffragment",
"base": "about:blank",
"hash": "#fragment%3C%7Ffragment",
"host": "www.example.com",
"hostname": "www.example.com",
"href": "https://www.example.com/path%7B%7Fpath.html?query%27%7F=query#fragment%3C%7Ffragment",
"origin": "https://www.example.com",
"password": "",
"pathname": "/path%7B%7Fpath.html",
"port": "",
"protocol": "https:",
"search": "?query%27%7F=query",
"username": ""
},
{
"input": "https://user:pass[\u007F@foo/bar",
"base": "http://example.org",
"hash": "",
"host": "foo",
"hostname": "foo",
"href": "https://user:pass%5B%7F@foo/bar",
"origin": "https://foo",
"password": "pass%5B%7F",
"pathname": "/bar",
"port": "",
"protocol": "https:",
"search": "",
"username": "user"
}
]