mirror of
https://github.com/servo/servo.git
synced 2025-08-07 06:25:32 +01:00
Update web-platform-tests to revision d21eaee14bab28a8bd57727d41330d0bef170a92
This commit is contained in:
parent
310a1346da
commit
775b941c48
65 changed files with 445 additions and 115 deletions
|
@ -4,7 +4,7 @@
|
||||||
expected: TIMEOUT
|
expected: TIMEOUT
|
||||||
|
|
||||||
[Opening a blob URL in a new window immediately before revoking it works.]
|
[Opening a blob URL in a new window immediately before revoking it works.]
|
||||||
expected: FAIL
|
expected: TIMEOUT
|
||||||
|
|
||||||
[Fetching a blob URL immediately before revoking it works in an iframe.]
|
[Fetching a blob URL immediately before revoking it works in an iframe.]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
[hit-test-floats-004.html]
|
|
||||||
[Miss float below something else]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
[hit-test-floats-005.html]
|
|
||||||
[Miss clipped float]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -5,9 +5,6 @@
|
||||||
[[data-expected-height\] 7]
|
[[data-expected-height\] 7]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[[data-expected-height\] 1]
|
[[data-expected-height\] 4]
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[[data-expected-height\] 2]
|
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -2,3 +2,6 @@
|
||||||
[Hit test intersecting scaled box]
|
[Hit test intersecting scaled box]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
[Hit test within unscaled box]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -1,2 +0,0 @@
|
||||||
[no-transition-from-ua-to-blocking-stylesheet.html]
|
|
||||||
expected: FAIL
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
[CaretPosition-001.html]
|
||||||
|
[Element at (400, 100)]
|
||||||
|
expected: FAIL
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
[elementFromPoint-001.html]
|
|
||||||
[CSSOM View - 5 - extensions to the Document interface]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -17,3 +17,6 @@
|
||||||
[test the top of layer]
|
[test the top of layer]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
[test some point of the element: top left corner]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,3 @@
|
||||||
[elementsFromPoint on the root document for points in iframe elements]
|
[elementsFromPoint on the root document for points in iframe elements]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[elementsFromPoint on inner documents]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
[elementsFromPoint-invalid-cases.html]
|
||||||
|
[The root element is the last element returned for otherwise empty queries within the viewport]
|
||||||
|
expected: FAIL
|
||||||
|
|
|
@ -1,2 +0,0 @@
|
||||||
[matchMedia-display-none-iframe.html]
|
|
||||||
expected: ERROR
|
|
|
@ -309,18 +309,24 @@
|
||||||
[Response: combined response Content-Type: text/html;" \\" text/plain ";charset=GBK]
|
[Response: combined response Content-Type: text/html;" \\" text/plain ";charset=GBK]
|
||||||
expected: NOTRUN
|
expected: NOTRUN
|
||||||
|
|
||||||
[<iframe>: separate response Content-Type: text/html;x=" text/plain]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[<iframe>: separate response Content-Type: text/html */*;charset=gbk]
|
[<iframe>: separate response Content-Type: text/html */*;charset=gbk]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[<iframe>: combined response Content-Type: */* text/html]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[<iframe>: separate response Content-Type: text/html;" text/plain]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[<iframe>: combined response Content-Type: text/html;x=" text/plain]
|
[<iframe>: combined response Content-Type: text/html;x=" text/plain]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
[<iframe>: combined response Content-Type: text/html;" text/plain]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[<iframe>: combined response Content-Type: text/html;charset=gbk text/plain text/html]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[<iframe>: separate 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
|
||||||
|
|
||||||
|
|
|
@ -56,3 +56,6 @@
|
||||||
[separate text/javascript x/x]
|
[separate text/javascript x/x]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
[separate text/javascript ]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,6 @@
|
||||||
[X-Content-Type-Options%3A%20nosniff%2C%2C%40%23%24%23%25%25%26%5E%26%5E*()()11!]
|
[X-Content-Type-Options%3A%20nosniff%2C%2C%40%23%24%23%25%25%26%5E%26%5E*()()11!]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[X-Content-Type-Options%3A%20%2Cnosniff]
|
[X-Content-Type-Options%3A%0D%0AX-Content-Type-Options%3A%20nosniff]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
[traverse_the_history_4.html]
|
[traverse_the_history_3.html]
|
||||||
[Multiple history traversals, last would be aborted]
|
[Multiple history traversals, last would be aborted]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
[creating_browsing_context_test_01.html]
|
[creating_browsing_context_test_01.html]
|
||||||
|
expected: TIMEOUT
|
||||||
[first argument: absolute url]
|
[first argument: absolute url]
|
||||||
expected: FAIL
|
expected: TIMEOUT
|
||||||
|
|
||||||
|
|
|
@ -1,16 +1,17 @@
|
||||||
[supported-elements.html]
|
[supported-elements.html]
|
||||||
|
expected: TIMEOUT
|
||||||
[Contenteditable element should support autofocus]
|
[Contenteditable element should support autofocus]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[Host element with delegatesFocus including no focusable descendants should be skipped]
|
[Host element with delegatesFocus including no focusable descendants should be skipped]
|
||||||
expected: FAIL
|
expected: NOTRUN
|
||||||
|
|
||||||
[Element with tabindex should support autofocus]
|
[Element with tabindex should support autofocus]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[Area element should support autofocus]
|
[Area element should support autofocus]
|
||||||
expected: FAIL
|
expected: NOTRUN
|
||||||
|
|
||||||
[Host element with delegatesFocus should support autofocus]
|
[Host element with delegatesFocus should support autofocus]
|
||||||
expected: FAIL
|
expected: TIMEOUT
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
[iframe_sandbox_popups_escaping-2.html]
|
[iframe_sandbox_popups_escaping-2.html]
|
||||||
expected: TIMEOUT
|
expected: CRASH
|
||||||
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
|
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
|
||||||
expected: TIMEOUT
|
expected: TIMEOUT
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
[iframe_sandbox_popups_escaping-3.html]
|
[iframe_sandbox_popups_escaping-3.html]
|
||||||
expected: TIMEOUT
|
|
||||||
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
|
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
|
||||||
expected: TIMEOUT
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
[iframe_sandbox_popups_nonescaping-1.html]
|
[iframe_sandbox_popups_nonescaping-1.html]
|
||||||
expected: TIMEOUT
|
expected: CRASH
|
||||||
[Check that popups from a sandboxed iframe do not escape the sandbox]
|
[Check that popups from a sandboxed iframe do not escape the sandbox]
|
||||||
expected: NOTRUN
|
expected: NOTRUN
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
[iframe_sandbox_popups_nonescaping-2.html]
|
[iframe_sandbox_popups_nonescaping-2.html]
|
||||||
|
expected: CRASH
|
||||||
[Check that popups from a sandboxed iframe do not escape the sandbox]
|
[Check that popups from a sandboxed iframe do not escape the sandbox]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
[form-double-submit-3.html]
|
||||||
|
[<button> should have the same double-submit protection as <input type=submit>]
|
||||||
|
expected: FAIL
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
[form-double-submit.html]
|
|
||||||
[default submit action should supersede onclick submit()]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
[script-onerror-insertion-point-2.html]
|
||||||
|
expected: TIMEOUT
|
|
@ -0,0 +1,4 @@
|
||||||
|
[module-delayed.html]
|
||||||
|
[async document.write in a module]
|
||||||
|
expected: FAIL
|
||||||
|
|
|
@ -311,3 +311,6 @@
|
||||||
[X Stitched sine-wave buffers at sample rate 43800 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.0038986,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[28696\]\t3.8782949092491264e+16\t9.3139332532882690e-1\t3.8782949092491264e+16\t4.1639711213089280e+16\t3.8985999999999999e-3\n\t[28697\]\t7.0477002859115601e-1\t9.0675884485244751e-1\t2.0198881626129150e-1\t2.2275913536212616e-1\t3.8985999999999999e-3\n\tMax AbsError of 3.8782949092491264e+16 at index of 28696.\n\tMax RelError of 4.1639711213089280e+16 at index of 28696.\n]
|
[X Stitched sine-wave buffers at sample rate 43800 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.0038986,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[28696\]\t3.8782949092491264e+16\t9.3139332532882690e-1\t3.8782949092491264e+16\t4.1639711213089280e+16\t3.8985999999999999e-3\n\t[28697\]\t7.0477002859115601e-1\t9.0675884485244751e-1\t2.0198881626129150e-1\t2.2275913536212616e-1\t3.8985999999999999e-3\n\tMax AbsError of 3.8782949092491264e+16 at index of 28696.\n\tMax RelError of 4.1639711213089280e+16 at index of 28696.\n]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
[X Stitched sine-wave buffers at sample rate 43800 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.0038986,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[28696\]\t-7.5334283148184919e-18\t9.3139332532882690e-1\t9.3139332532882690e-1\t1.0000000000000000e+0\t3.8985999999999999e-3\n\t[28697\]\t7.0477002859115601e-1\t9.0675884485244751e-1\t2.0198881626129150e-1\t2.2275913536212616e-1\t3.8985999999999999e-3\n\tMax AbsError of 9.3139332532882690e-1 at index of 28696.\n\tMax RelError of 1.0000000000000000e+0 at index of 28696.\n]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
[import-in-moduleworker.html]
|
[import-in-moduleworker.html]
|
||||||
|
expected: ERROR
|
||||||
[Base URL in module dedicated workers: import]
|
[Base URL in module dedicated workers: import]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[Opening a blob URL in a new window immediately before revoking it works.]
|
[Opening a blob URL in a new window immediately before revoking it works.]
|
||||||
expected: FAIL
|
expected: TIMEOUT
|
||||||
|
|
||||||
[Opening a blob URL in a noopener about:blank window immediately before revoking it works.]
|
[Opening a blob URL in a noopener about:blank window immediately before revoking it works.]
|
||||||
expected: TIMEOUT
|
expected: TIMEOUT
|
||||||
|
|
|
@ -149949,6 +149949,19 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"grid-auto-margin-and-replaced-item-001.html": [
|
||||||
|
"f6c0afb6ae3cb654367001439c1569b13e2f33e2",
|
||||||
|
[
|
||||||
|
null,
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"/css/css-grid/grid-items/grid-auto-margin-and-replaced-item-001-ref.html",
|
||||||
|
"=="
|
||||||
|
]
|
||||||
|
],
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"grid-img-item-percent-max-height-001.html": [
|
"grid-img-item-percent-max-height-001.html": [
|
||||||
"d0d6d04dc7b882ebe1addaca94a4c38231973803",
|
"d0d6d04dc7b882ebe1addaca94a4c38231973803",
|
||||||
[
|
[
|
||||||
|
@ -311749,6 +311762,10 @@
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"grid-items": {
|
"grid-items": {
|
||||||
|
"grid-auto-margin-and-replaced-item-001-ref.html": [
|
||||||
|
"3e08fdfbde27d0aa36dcabd2b7ea240116538b69",
|
||||||
|
[]
|
||||||
|
],
|
||||||
"grid-item-margins-and-writing-modes-001-ref.html": [
|
"grid-item-margins-and-writing-modes-001-ref.html": [
|
||||||
"86553ef6f4077f3c6bc348496e513d7960d7b79f",
|
"86553ef6f4077f3c6bc348496e513d7960d7b79f",
|
||||||
[]
|
[]
|
||||||
|
@ -370512,7 +370529,7 @@
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"helpers.js": [
|
"helpers.js": [
|
||||||
"620feebd2999ac71fe06d73e7b0cda4ec5d855fe",
|
"6d6d438ab81da54e5389061d162ff7051728d30c",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"resources": {
|
"resources": {
|
||||||
|
@ -454885,7 +454902,7 @@
|
||||||
},
|
},
|
||||||
"hr-time": {
|
"hr-time": {
|
||||||
"basic.any.js": [
|
"basic.any.js": [
|
||||||
"364dd81a3448188bd76f6ff410807bfcca93177d",
|
"4cd6e42dfc2274ac04ab46fb2f12d30ca150865b",
|
||||||
[
|
[
|
||||||
"hr-time/basic.any.html",
|
"hr-time/basic.any.html",
|
||||||
{}
|
{}
|
||||||
|
@ -544784,6 +544801,16 @@
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"createcredential-resident-key.https.html": [
|
||||||
|
"d64ec14c00d38e49eaa91142b55f47c2e336670d",
|
||||||
|
[
|
||||||
|
null,
|
||||||
|
{
|
||||||
|
"testdriver": true,
|
||||||
|
"timeout": "long"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
],
|
||||||
"createcredential-timeout.https.html": [
|
"createcredential-timeout.https.html": [
|
||||||
"fc35a6e72f0a76a4ff410df71b346109cc215681",
|
"fc35a6e72f0a76a4ff410df71b346109cc215681",
|
||||||
[
|
[
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
[hit-test-floats-004.html]
|
|
||||||
[Miss float below something else]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
[hit-test-floats-005.html]
|
|
||||||
[Miss clipped float]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -8,9 +8,6 @@
|
||||||
[[data-expected-height\] 3]
|
[[data-expected-height\] 3]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[[data-expected-height\] 1]
|
[[data-expected-height\] 4]
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[[data-expected-height\] 2]
|
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -2,3 +2,6 @@
|
||||||
[Hit test intersecting scaled box]
|
[Hit test intersecting scaled box]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
[Hit test within unscaled box]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -1,2 +0,0 @@
|
||||||
[no-transition-from-ua-to-blocking-stylesheet.html]
|
|
||||||
expected: FAIL
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
[CaretPosition-001.html]
|
||||||
|
[Element at (400, 100)]
|
||||||
|
expected: FAIL
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
[elementFromPoint-001.html]
|
|
||||||
[CSSOM View - 5 - extensions to the Document interface]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -21,3 +21,6 @@
|
||||||
[test the top of layer]
|
[test the top of layer]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
[test some point of the element: top left corner]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,3 @@
|
||||||
[elementsFromPoint on the root document for points in iframe elements]
|
[elementsFromPoint on the root document for points in iframe elements]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[elementsFromPoint on inner documents]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
[elementsFromPoint-invalid-cases.html]
|
||||||
|
[The root element is the last element returned for otherwise empty queries within the viewport]
|
||||||
|
expected: FAIL
|
||||||
|
|
|
@ -1,2 +0,0 @@
|
||||||
[matchMedia-display-none-iframe.html]
|
|
||||||
expected: ERROR
|
|
|
@ -309,18 +309,24 @@
|
||||||
[fetch(): separate response Content-Type: text/plain ]
|
[fetch(): separate response Content-Type: text/plain ]
|
||||||
expected: NOTRUN
|
expected: NOTRUN
|
||||||
|
|
||||||
[<iframe>: separate response Content-Type: text/html;x=" text/plain]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[<iframe>: separate response Content-Type: text/html */*;charset=gbk]
|
[<iframe>: separate response Content-Type: text/html */*;charset=gbk]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[<iframe>: combined response Content-Type: */* text/html]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[<iframe>: separate response Content-Type: text/html;" text/plain]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[<iframe>: combined response Content-Type: text/html;x=" text/plain]
|
[<iframe>: combined response Content-Type: text/html;x=" text/plain]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
[<iframe>: combined response Content-Type: text/html;" text/plain]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[<iframe>: combined response Content-Type: text/html;charset=gbk text/plain text/html]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[<iframe>: separate 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
|
||||||
|
|
||||||
|
|
|
@ -56,3 +56,6 @@
|
||||||
[separate text/javascript x/x]
|
[separate text/javascript x/x]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
[separate text/javascript ]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,6 @@
|
||||||
[X-Content-Type-Options%3A%20nosniff%2C%2C%40%23%24%23%25%25%26%5E%26%5E*()()11!]
|
[X-Content-Type-Options%3A%20nosniff%2C%2C%40%23%24%23%25%25%26%5E%26%5E*()()11!]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[X-Content-Type-Options%3A%20%2Cnosniff]
|
[X-Content-Type-Options%3A%0D%0AX-Content-Type-Options%3A%20nosniff]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
[traverse_the_history_4.html]
|
[traverse_the_history_3.html]
|
||||||
[Multiple history traversals, last would be aborted]
|
[Multiple history traversals, last would be aborted]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
[creating_browsing_context_test_01.html]
|
[creating_browsing_context_test_01.html]
|
||||||
|
expected: TIMEOUT
|
||||||
[first argument: absolute url]
|
[first argument: absolute url]
|
||||||
expected: FAIL
|
expected: TIMEOUT
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
[supported-elements.html]
|
[supported-elements.html]
|
||||||
|
expected: TIMEOUT
|
||||||
[Contenteditable element should support autofocus]
|
[Contenteditable element should support autofocus]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
@ -6,11 +7,11 @@
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[Host element with delegatesFocus including no focusable descendants should be skipped]
|
[Host element with delegatesFocus including no focusable descendants should be skipped]
|
||||||
expected: FAIL
|
expected: NOTRUN
|
||||||
|
|
||||||
[Area element should support autofocus]
|
[Area element should support autofocus]
|
||||||
expected: FAIL
|
expected: NOTRUN
|
||||||
|
|
||||||
[Host element with delegatesFocus should support autofocus]
|
[Host element with delegatesFocus should support autofocus]
|
||||||
expected: FAIL
|
expected: TIMEOUT
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
[iframe_sandbox_popups_escaping-2.html]
|
[iframe_sandbox_popups_escaping-2.html]
|
||||||
expected: TIMEOUT
|
expected: CRASH
|
||||||
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
|
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
|
||||||
expected: TIMEOUT
|
expected: TIMEOUT
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
[iframe_sandbox_popups_escaping-3.html]
|
[iframe_sandbox_popups_escaping-3.html]
|
||||||
type: testharness
|
type: testharness
|
||||||
expected: TIMEOUT
|
|
||||||
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
|
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
|
||||||
expected: TIMEOUT
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[iframe_sandbox_popups_nonescaping-1.html]
|
[iframe_sandbox_popups_nonescaping-1.html]
|
||||||
type: testharness
|
type: testharness
|
||||||
expected: TIMEOUT
|
expected: CRASH
|
||||||
[Check that popups from a sandboxed iframe do not escape the sandbox]
|
[Check that popups from a sandboxed iframe do not escape the sandbox]
|
||||||
expected: NOTRUN
|
expected: NOTRUN
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
[iframe_sandbox_popups_nonescaping-2.html]
|
[iframe_sandbox_popups_nonescaping-2.html]
|
||||||
type: testharness
|
type: testharness
|
||||||
|
expected: CRASH
|
||||||
[Check that popups from a sandboxed iframe do not escape the sandbox]
|
[Check that popups from a sandboxed iframe do not escape the sandbox]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
[form-double-submit-3.html]
|
||||||
|
[<button> should have the same double-submit protection as <input type=submit>]
|
||||||
|
expected: FAIL
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
[form-double-submit.html]
|
|
||||||
[default submit action should supersede onclick submit()]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
[script-onerror-insertion-point-2.html]
|
||||||
|
expected: TIMEOUT
|
|
@ -0,0 +1,4 @@
|
||||||
|
[module-delayed.html]
|
||||||
|
[async document.write in a module]
|
||||||
|
expected: FAIL
|
||||||
|
|
|
@ -539,3 +539,6 @@
|
||||||
[X Stitched sine-wave buffers at sample rate 43800 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.0038986,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[28696\]\t3.8782949092491264e+16\t9.3139332532882690e-1\t3.8782949092491264e+16\t4.1639711213089280e+16\t3.8985999999999999e-3\n\t[28697\]\t7.0477002859115601e-1\t9.0675884485244751e-1\t2.0198881626129150e-1\t2.2275913536212616e-1\t3.8985999999999999e-3\n\tMax AbsError of 3.8782949092491264e+16 at index of 28696.\n\tMax RelError of 4.1639711213089280e+16 at index of 28696.\n]
|
[X Stitched sine-wave buffers at sample rate 43800 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.0038986,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[28696\]\t3.8782949092491264e+16\t9.3139332532882690e-1\t3.8782949092491264e+16\t4.1639711213089280e+16\t3.8985999999999999e-3\n\t[28697\]\t7.0477002859115601e-1\t9.0675884485244751e-1\t2.0198881626129150e-1\t2.2275913536212616e-1\t3.8985999999999999e-3\n\tMax AbsError of 3.8782949092491264e+16 at index of 28696.\n\tMax RelError of 4.1639711213089280e+16 at index of 28696.\n]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
[X Stitched sine-wave buffers at sample rate 43800 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.0038986,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[28696\]\t-7.5334283148184919e-18\t9.3139332532882690e-1\t9.3139332532882690e-1\t1.0000000000000000e+0\t3.8985999999999999e-3\n\t[28697\]\t7.0477002859115601e-1\t9.0675884485244751e-1\t2.0198881626129150e-1\t2.2275913536212616e-1\t3.8985999999999999e-3\n\tMax AbsError of 9.3139332532882690e-1 at index of 28696.\n\tMax RelError of 1.0000000000000000e+0 at index of 28696.\n]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
[import-in-moduleworker.html]
|
[import-in-moduleworker.html]
|
||||||
|
expected: ERROR
|
||||||
[Base URL in module dedicated workers: import]
|
[Base URL in module dedicated workers: import]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>Reference: 100x100 green square image in the middle</title>
|
||||||
|
<link rel="author" title="Hyunjune Kim" href="mailto:hyunjune.kim@samsung.com">
|
||||||
|
<style>
|
||||||
|
img {
|
||||||
|
display: block;
|
||||||
|
margin: auto;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
|
||||||
|
<div>
|
||||||
|
<img src="./support/100x100-green.png">
|
||||||
|
</div>
|
|
@ -0,0 +1,47 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>CSS Grid Layout Test: Margin auto and replaced grid item</title>
|
||||||
|
<link rel="author" title="Hyunjune Kim" href="mailto:hyunjune.kim@samsung.com">
|
||||||
|
<link rel="help" href="https://www.w3.org/TR/css-grid-1/#alignment">
|
||||||
|
<meta name="assert" content="Checks width of the nested grid container applied 'margin:auto' with a replaced item which has a property called max-height.">
|
||||||
|
<link rel="match" href="grid-auto-margin-and-replaced-item-001-ref.html">
|
||||||
|
<style>
|
||||||
|
#reference-overlapped-red {
|
||||||
|
position: absolute;
|
||||||
|
background-color: red;
|
||||||
|
width: 100px;
|
||||||
|
height: 100px;
|
||||||
|
left:0;
|
||||||
|
right:0;
|
||||||
|
margin: auto;
|
||||||
|
z-index: -1;
|
||||||
|
}
|
||||||
|
.grid {
|
||||||
|
display: grid;
|
||||||
|
}
|
||||||
|
.nested-grid {
|
||||||
|
display: grid;
|
||||||
|
margin: auto;
|
||||||
|
}
|
||||||
|
img {
|
||||||
|
max-height: 100%;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<body onload="loadImage()">
|
||||||
|
|
||||||
|
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
|
||||||
|
|
||||||
|
<div class="grid">
|
||||||
|
<div id="reference-overlapped-red"></div>
|
||||||
|
<div class="nested-grid">
|
||||||
|
<img id="replaced">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
function loadImage() {
|
||||||
|
var replaced = document.getElementById("replaced");
|
||||||
|
replaced.src = "./support/100x100-green.png";
|
||||||
|
}
|
||||||
|
</script>
|
|
@ -26,3 +26,12 @@ async_test(function() {
|
||||||
this.done();
|
this.done();
|
||||||
}, 2000);
|
}, 2000);
|
||||||
}, 'High resolution time has approximately the right relative magnitude');
|
}, 'High resolution time has approximately the right relative magnitude');
|
||||||
|
|
||||||
|
test(function() {
|
||||||
|
var didHandle = false;
|
||||||
|
self.performance.addEventListener("testEvent", function() {
|
||||||
|
didHandle = true;
|
||||||
|
}, { once: true} );
|
||||||
|
self.performance.dispatchEvent(new Event("testEvent"));
|
||||||
|
assert_true(didHandle, "Performance extends EventTarget, so event dispatching should work.");
|
||||||
|
}, "Performance interface extends EventTarget.");
|
||||||
|
|
|
@ -0,0 +1,178 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>navigator.credentials.create() test with residentKey and credProps</title>
|
||||||
|
<meta name="timeout" content="long">
|
||||||
|
<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=helpers.js></script>
|
||||||
|
<script>
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
const credPropsTests = [
|
||||||
|
{
|
||||||
|
name: "U2F",
|
||||||
|
authenticatorArgs: {
|
||||||
|
protocol: "ctap1/u2f",
|
||||||
|
},
|
||||||
|
expected: {
|
||||||
|
discouraged: {
|
||||||
|
success: true,
|
||||||
|
hasRk: true,
|
||||||
|
rk: false,
|
||||||
|
},
|
||||||
|
preferred: {
|
||||||
|
success: true,
|
||||||
|
hasRk: true,
|
||||||
|
rk: false,
|
||||||
|
},
|
||||||
|
required: {
|
||||||
|
success: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "CTAP 2.0 without resident key support",
|
||||||
|
authenticatorArgs: {
|
||||||
|
protocol: "ctap2",
|
||||||
|
hasResidentKey: false,
|
||||||
|
hasUserVerification: true,
|
||||||
|
isUserVerified: true,
|
||||||
|
},
|
||||||
|
expected: {
|
||||||
|
discouraged: {
|
||||||
|
success: true,
|
||||||
|
hasRk: true,
|
||||||
|
rk: false,
|
||||||
|
},
|
||||||
|
preferred: {
|
||||||
|
success: true,
|
||||||
|
hasRk: true,
|
||||||
|
rk: false,
|
||||||
|
},
|
||||||
|
required: {
|
||||||
|
success: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "CTAP 2.0 with resident key support",
|
||||||
|
authenticatorArgs: {
|
||||||
|
protocol: "ctap2",
|
||||||
|
hasResidentKey: true,
|
||||||
|
hasUserVerification: true,
|
||||||
|
isUserVerified: true,
|
||||||
|
},
|
||||||
|
expected: {
|
||||||
|
discouraged: {
|
||||||
|
success: true,
|
||||||
|
// CTAP2.0 authenticators may treat all credentials as discoverable,
|
||||||
|
// thus Chrome omits 'rk' in this case.
|
||||||
|
hasRk: false,
|
||||||
|
},
|
||||||
|
preferred: {
|
||||||
|
success: true,
|
||||||
|
hasRk: true,
|
||||||
|
rk: true,
|
||||||
|
},
|
||||||
|
required: {
|
||||||
|
success: true,
|
||||||
|
hasRk: true,
|
||||||
|
rk: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "CTAP 2.1 without resident key support",
|
||||||
|
authenticatorArgs: {
|
||||||
|
protocol: "ctap2_1",
|
||||||
|
hasResidentKey: false,
|
||||||
|
hasUserVerification: true,
|
||||||
|
isUserVerified: true,
|
||||||
|
},
|
||||||
|
expected: {
|
||||||
|
discouraged: {
|
||||||
|
success: true,
|
||||||
|
hasRk: true,
|
||||||
|
rk: false,
|
||||||
|
},
|
||||||
|
preferred: {
|
||||||
|
success: true,
|
||||||
|
hasRk: true,
|
||||||
|
rk: false,
|
||||||
|
},
|
||||||
|
required: {
|
||||||
|
success: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "CTAP 2.1 with resident key support",
|
||||||
|
authenticatorArgs: {
|
||||||
|
protocol: "ctap2_1",
|
||||||
|
hasResidentKey: true,
|
||||||
|
hasUserVerification: true,
|
||||||
|
isUserVerified: true,
|
||||||
|
},
|
||||||
|
expected: {
|
||||||
|
discouraged: {
|
||||||
|
success: true,
|
||||||
|
hasRk: true,
|
||||||
|
rk: false,
|
||||||
|
},
|
||||||
|
preferred: {
|
||||||
|
success: true,
|
||||||
|
hasRk: true,
|
||||||
|
rk: true,
|
||||||
|
},
|
||||||
|
required: {
|
||||||
|
success: true,
|
||||||
|
hasRk: true,
|
||||||
|
rk: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
for (const fixture of credPropsTests) {
|
||||||
|
for (const rkRequirement of ["discouraged", "preferred", "required"]) {
|
||||||
|
virtualAuthenticatorPromiseTest(async t => {
|
||||||
|
const promise = createCredential({
|
||||||
|
options: {
|
||||||
|
publicKey: {
|
||||||
|
authenticatorSelection: {
|
||||||
|
residentKey: rkRequirement,
|
||||||
|
},
|
||||||
|
extensions: {
|
||||||
|
credProps: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
assert_true(rkRequirement in fixture.expected);
|
||||||
|
const expected = fixture.expected[rkRequirement];
|
||||||
|
assert_true('success' in expected);
|
||||||
|
if (!expected.success) {
|
||||||
|
return promise_rejects_dom(t, "NotAllowedError", promise);
|
||||||
|
}
|
||||||
|
|
||||||
|
const cred = await promise;
|
||||||
|
assert_true('credProps' in cred.getClientExtensionResults());
|
||||||
|
const credProps = cred.getClientExtensionResults().credProps;
|
||||||
|
assert_equals('rk' in credProps, expected.hasRk, "hasRk");
|
||||||
|
if (expected.hasRk) {
|
||||||
|
assert_equals(credProps.rk, expected.rk, "rk");
|
||||||
|
}
|
||||||
|
}, fixture.authenticatorArgs, fixture.name
|
||||||
|
+ ": navigator.credentials.create() with credProps extension, rk="
|
||||||
|
+ rkRequirement);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body></body>
|
||||||
|
</html>
|
|
@ -550,31 +550,57 @@ function validateAuthenticatorAssertionResponse(assert) {
|
||||||
// TODO: parseAuthenticatorData() and make sure flags are correct
|
// TODO: parseAuthenticatorData() and make sure flags are correct
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function defaultAuthenticatorArgs() {
|
||||||
|
return {
|
||||||
|
protocol: 'ctap1/u2f',
|
||||||
|
transport: 'usb',
|
||||||
|
hasResidentKey: false,
|
||||||
|
hasUserVerification: false,
|
||||||
|
isUserVerified: false,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
function standardSetup(cb, options = {}) {
|
function standardSetup(cb, options = {}) {
|
||||||
// Setup an automated testing environment if available.
|
// Setup an automated testing environment if available.
|
||||||
let authenticatorArgs = {
|
let authenticatorArgs = Object.assign(defaultAuthenticatorArgs(), options);
|
||||||
protocol: "ctap1/u2f",
|
window.test_driver.add_virtual_authenticator(authenticatorArgs)
|
||||||
transport: "usb",
|
.then(authenticator => {
|
||||||
hasResidentKey: false,
|
|
||||||
hasUserVerification: false,
|
|
||||||
isUserVerified: false,
|
|
||||||
};
|
|
||||||
extendObject(authenticatorArgs, options);
|
|
||||||
window.test_driver.add_virtual_authenticator(authenticatorArgs).then(authenticator => {
|
|
||||||
cb();
|
cb();
|
||||||
// XXX add a subtest to clean up the virtual authenticator since
|
// XXX add a subtest to clean up the virtual authenticator since
|
||||||
// testharness does not support waiting for promises on cleanup.
|
// testharness does not support waiting for promises on cleanup.
|
||||||
promise_test(() => window.test_driver.remove_virtual_authenticator(authenticator),
|
promise_test(
|
||||||
"Clean up the test environment");
|
() =>
|
||||||
}).catch(error => {
|
window.test_driver.remove_virtual_authenticator(authenticator),
|
||||||
if (error !== "error: Action add_virtual_authenticator not implemented") {
|
'Clean up the test environment');
|
||||||
throw error;
|
})
|
||||||
|
.catch(error => {
|
||||||
|
if (error !==
|
||||||
|
'error: Action add_virtual_authenticator not implemented') {
|
||||||
|
throw error;
|
||||||
}
|
}
|
||||||
// The protocol is not available. Continue manually.
|
// The protocol is not available. Continue manually.
|
||||||
cb();
|
cb();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/* JSHINT */
|
// virtualAuthenticatorPromiseTest runs |testCb| in a promise_test with a
|
||||||
/* globals promise_rejects_dom, promise_rejects_js, assert_class_string, assert_equals, assert_idl_attribute, assert_readonly, promise_test */
|
// virtual authenticator set up before and destroyed after the test, if the
|
||||||
/* exported standardSetup, CreateCredentialsTest, GetCredentialsTest */
|
// virtual testing API is available. In manual tests, setup and teardown is
|
||||||
|
// skipped.
|
||||||
|
function virtualAuthenticatorPromiseTest(
|
||||||
|
testCb, options = {}, name = 'Virtual Authenticator Test') {
|
||||||
|
let authenticatorArgs = Object.assign(defaultAuthenticatorArgs(), options);
|
||||||
|
promise_test(async t => {
|
||||||
|
try {
|
||||||
|
let authenticator =
|
||||||
|
await window.test_driver.add_virtual_authenticator(authenticatorArgs);
|
||||||
|
t.add_cleanup(
|
||||||
|
() => window.test_driver.remove_virtual_authenticator(authenticator));
|
||||||
|
} catch (error) {
|
||||||
|
if (error !== 'error: Action add_virtual_authenticator not implemented') {
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return testCb(t);
|
||||||
|
}, name);
|
||||||
|
}
|
||||||
|
|
|
@ -248,3 +248,6 @@
|
||||||
[WebGL test #44: attachment 7 should be 0,255,0,255\nat (4, 0) expected: 0,255,0,255 was 255,45,0,0]
|
[WebGL test #44: attachment 7 should be 0,255,0,255\nat (4, 0) expected: 0,255,0,255 was 255,45,0,0]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
[WebGL test #44: attachment 7 should be 0,255,0,255\nat (4, 0) expected: 0,255,0,255 was 255,3,0,0]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue