mirror of
https://github.com/servo/servo.git
synced 2025-08-05 05:30:08 +01:00
Auto merge of #28118 - servo-wpt-sync:wpt_update_30-01-2021, r=servo-wpt-sync
Sync WPT with upstream (30-01-2021) Automated downstream sync of changes from upstream as of 30-01-2021. [no-wpt-sync] r? @servo-wpt-sync
This commit is contained in:
commit
a955ff280d
86 changed files with 735 additions and 451 deletions
|
@ -0,0 +1,4 @@
|
|||
[hit-test-floats-002.html]
|
||||
[Hit test float]
|
||||
expected: FAIL
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
[hit-test-floats-003.html]
|
||||
[Miss float below something else]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
[hit-test-floats-005.html]
|
||||
[Miss clipped float]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
[CaretPosition-001.html]
|
||||
[Element at (400, 100)]
|
||||
expected: FAIL
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
[elementsFromPoint-invalid-cases.html]
|
||||
[The root element is the last element returned for otherwise empty queries within the viewport]
|
||||
expected: FAIL
|
||||
|
|
@ -452,3 +452,9 @@
|
|||
[CSS namespace: typeof is "object"]
|
||||
expected: FAIL
|
||||
|
||||
[CSS namespace: has no name property]
|
||||
expected: FAIL
|
||||
|
||||
[CSS namespace: has no length property]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -309,27 +309,21 @@
|
|||
[Response: combined response Content-Type: text/html;" \\" text/plain ";charset=GBK]
|
||||
expected: NOTRUN
|
||||
|
||||
[<iframe>: separate response Content-Type: text/html */*]
|
||||
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 */*;charset=gbk]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: separate response Content-Type: text/plain */*]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: separate response Content-Type: text/html;x=" text/plain]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: separate response Content-Type: text/html;" \\" text/plain]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: separate response Content-Type: text/plain */*;charset=gbk]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: combined response Content-Type: text/html;" text/plain]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: combined response Content-Type: text/html */*]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: combined response Content-Type: text/html;" \\" text/plain]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: combined response Content-Type: text/html;x=" text/plain]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -56,6 +56,3 @@
|
|||
[separate text/javascript x/x]
|
||||
expected: FAIL
|
||||
|
||||
[separate text/javascript ]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -5,15 +5,3 @@
|
|||
[Test javascript URL string return values in direct and indirect (target) frame contexts. 9]
|
||||
expected: FAIL
|
||||
|
||||
[Test javascript URL string return values in direct and indirect (target) frame contexts. 7]
|
||||
expected: FAIL
|
||||
|
||||
[Test javascript URL string return values in direct and indirect (target) frame contexts. 6]
|
||||
expected: FAIL
|
||||
|
||||
[Test javascript URL string return values in direct and indirect (target) frame contexts. 5]
|
||||
expected: FAIL
|
||||
|
||||
[Test javascript URL string return values in direct and indirect (target) frame contexts. 8]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
[traverse_the_history_1.html]
|
||||
[Multiple history traversals from the same task]
|
||||
expected: FAIL
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
[traverse_the_history_4.html]
|
||||
[Multiple history traversals, last would be aborted]
|
||||
expected: FAIL
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
[traverse_the_history_5.html]
|
||||
[Multiple history traversals, last would be aborted]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
[cross-origin-objects-on-new-window.html]
|
||||
expected: TIMEOUT
|
|
@ -1,4 +1,5 @@
|
|||
[embedded-opener-remove-frame.html]
|
||||
expected: CRASH
|
||||
[opener of discarded nested browsing context]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
[2d.transformation.setTransform.3d.html]
|
||||
[setTransform() with 4x4 matrix keeps all parameters]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
[marquee-events-historical.html]
|
||||
[Event handler IDL attributes must not be implemented]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
[iframe_sandbox_popups_nonescaping-1.html]
|
||||
expected: TIMEOUT
|
||||
expected: CRASH
|
||||
[Check that popups from a sandboxed iframe do not escape the sandbox]
|
||||
expected: NOTRUN
|
||||
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
[iframe_sandbox_popups_nonescaping-3.html]
|
||||
expected: CRASH
|
||||
[Check that popups from a sandboxed iframe do not escape the sandbox]
|
||||
expected: NOTRUN
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
[form-double-submit-2.html]
|
||||
[preventDefault should allow onclick submit() to succeed]
|
||||
expected: FAIL
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
[form-double-submit-3.html]
|
||||
[<button> should have the same double-submit protection as <input type=submit>]
|
||||
expected: FAIL
|
||||
|
|
@ -1,40 +1,13 @@
|
|||
[select-event.html]
|
||||
[textarea: selectionDirection a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type search: setRangeText() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[textarea: setSelectionRange() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type url: setSelectionRange() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type search: setSelectionRange() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type tel: selectionDirection a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type search: selectionDirection a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type text: selectionStart out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type tel: select() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type url: selectionStart a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type text: setSelectionRange() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type text: selectionDirection a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[textarea: setSelectionRange out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
|
@ -44,21 +17,12 @@
|
|||
[input type tel: setRangeText() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type url: selectionEnd out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type url: selectionEnd a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type search: setSelectionRange out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type text: setSelectionRange out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type url: select() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type password: setRangeText() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
|
@ -71,12 +35,36 @@
|
|||
[input type url: setRangeText() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[textarea: selectionEnd out of range a second time (must not fire select)]
|
||||
[textarea: selectionEnd a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type tel: selectionStart a second time (must not fire select)]
|
||||
[input type password: select() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type search: selectionStart a second time (must not fire select)]
|
||||
[input type password: selectionStart a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type url: selectionStart out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type tel: selectionStart out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type text: selectionEnd out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type search: selectionEnd a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type search: selectionEnd out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type text: selectionStart a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type password: selectionDirection a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type url: setSelectionRange out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
[DOMContentLoaded-defer.html]
|
||||
[The end: DOMContentLoaded and defer scripts]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
[tasks.window.html]
|
||||
[document.open() and tasks (canvas.toBlob())]
|
||||
expected: FAIL
|
||||
|
||||
[tasks without document.open() (canvas.toBlob())]
|
||||
expected: FAIL
|
||||
|
|
@ -3,3 +3,6 @@
|
|||
[The incumbent settings object while executing the compiled callback via Web IDL's invoke must be that of the node document]
|
||||
expected: TIMEOUT
|
||||
|
||||
[The entry settings object while executing the compiled callback via Web IDL's invoke must be that of the node document]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
[TAO-null-opaque-origin.html]
|
||||
expected: ERROR
|
|
@ -1,7 +1,6 @@
|
|||
[entry.html]
|
||||
expected: TIMEOUT
|
||||
[Start function]
|
||||
expected: TIMEOUT
|
||||
expected: FAIL
|
||||
|
||||
[Sanity check: this all works as expected synchronously]
|
||||
expected: FAIL
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
[realtimeanalyser-fft-scaling.html]
|
||||
expected: TIMEOUT
|
||||
[X 2048-point FFT peak position is not equal to 64. Got 0.]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
[audiocontext-not-fully-active.html]
|
||||
expected: TIMEOUT
|
||||
[frame in navigated remote-site frame]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,5 +0,0 @@
|
|||
[017.html]
|
||||
expected: TIMEOUT
|
||||
[origin of the script that invoked the method, about:blank]
|
||||
expected: TIMEOUT
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[017.html]
|
||||
expected: TIMEOUT
|
||||
[origin of the script that invoked the method, about:blank]
|
||||
expected: TIMEOUT
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
[Worker-constructor.html]
|
||||
expected: ERROR
|
|
@ -22182,13 +22182,6 @@
|
|||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"single-touch-manual.html": [
|
||||
"1b47a64c157ac64f5760ebc0ad2fd114773cdea3",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
]
|
||||
},
|
||||
"uievents": {
|
||||
|
@ -173949,6 +173942,19 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"first-letter-digraph.html": [
|
||||
"b9bc10016d71a6b74803278c227787bdee6cda48",
|
||||
[
|
||||
null,
|
||||
[
|
||||
[
|
||||
"/css/css-pseudo/reference/first-letter-digraph-ref.html",
|
||||
"=="
|
||||
]
|
||||
],
|
||||
{}
|
||||
]
|
||||
],
|
||||
"first-letter-exclude-block-child-marker.html": [
|
||||
"ecd0fd5b4622d9257658fc1e50ce43221da5bdfb",
|
||||
[
|
||||
|
@ -319176,6 +319182,10 @@
|
|||
"17d69f306d77411f2ef0a7dab682b119c5b59e50",
|
||||
[]
|
||||
],
|
||||
"first-letter-digraph-ref.html": [
|
||||
"7dbefc9dbdbd32ea8b05a8d3ec87f24e7d4edcc1",
|
||||
[]
|
||||
],
|
||||
"first-line-with-inline-block-ref.html": [
|
||||
"31717d4171bad4c98b272e4ce70ee6578780b10b",
|
||||
[]
|
||||
|
@ -342539,7 +342549,7 @@
|
|||
[]
|
||||
],
|
||||
"transformations.yaml": [
|
||||
"eca6b16b089b322792c0c0cab5ff48febe9ffcd8",
|
||||
"ffb1e85ec041d5516d133a04edfa597710ff57ef",
|
||||
[]
|
||||
],
|
||||
"video.yaml": [
|
||||
|
@ -358778,7 +358788,7 @@
|
|||
[]
|
||||
],
|
||||
"TAOResponse.py": [
|
||||
"908b68861ae8262a18e083b026d14591d1e0206e",
|
||||
"c25ccc03cb36a3d24409a4b3e6364d38f3a49305",
|
||||
[]
|
||||
],
|
||||
"all_resource_types.htm": [
|
||||
|
@ -359191,7 +359201,7 @@
|
|||
]
|
||||
},
|
||||
"idlharness.js": [
|
||||
"994a0d82ef444bf4566dc27a81487e70d9e284ea",
|
||||
"5a97b273f2bed196d6ddd85c5596decff1bf87ae",
|
||||
[]
|
||||
],
|
||||
"idlharness.js.headers": [
|
||||
|
@ -359328,11 +359338,11 @@
|
|||
},
|
||||
"IdlNamespace": {
|
||||
"test_attribute.html": [
|
||||
"ca5edf4723d5b5c2055c2f024d951e98124c8cd9",
|
||||
"9a08dd400c1d2a29e60e3af626fe883347218503",
|
||||
[]
|
||||
],
|
||||
"test_operation.html": [
|
||||
"60d7d47c9eea64a81d539afa6fd3acd72581c00b",
|
||||
"814e8428c36245142bed162103f4b90644e24bcc",
|
||||
[]
|
||||
],
|
||||
"test_partial_namespace.html": [
|
||||
|
@ -412214,6 +412224,20 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"grid-auto-repeat-min-size-003.html": [
|
||||
"ffaaab33aef998f35a543392b2f3fa99e473b9ed",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"grid-auto-repeat-min-size-004.html": [
|
||||
"8d2eda79023adab581e70dd4ef3bdd80ccca9e12",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"grid-change-auto-repeat-tracks.html": [
|
||||
"c2d17ec615f0f092e54c0c4792ca4a03bc1cfe8a",
|
||||
[
|
||||
|
@ -429326,7 +429350,7 @@
|
|||
]
|
||||
],
|
||||
"DOMMatrix2DInit-validate-fixup.html": [
|
||||
"480d67a481d30965a734cdf76c60646a464823b8",
|
||||
"a7257aa2882cf1d88fa4a15314efe071b30a8f4e",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -469434,6 +469458,13 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"2d.transformation.setTransform.3d.html": [
|
||||
"bcafbd15990880b00a5e93f07dba4b07108edbf6",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"2d.transformation.setTransform.multiple.html": [
|
||||
"7e90537113eea070fa5213554e101870aa6f5541",
|
||||
[
|
||||
|
@ -484502,8 +484533,8 @@
|
|||
]
|
||||
},
|
||||
"the-marquee-element-0": {
|
||||
"marquee-events.html": [
|
||||
"0d20c5102f17148ff3e5d1115e9a3fcfc7770bb3",
|
||||
"marquee-events-historical.html": [
|
||||
"5780b90f04869ce4d14be864bda6ec93a2902ab5",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -498710,7 +498741,7 @@
|
|||
]
|
||||
],
|
||||
"tasks.window.js": [
|
||||
"1588f2f889227f68acba9fb1f02494ba0f80a4bd",
|
||||
"887adcb7393ee3bf3acfcba1a6a7d820f0ebb6ff",
|
||||
[
|
||||
"html/webappapis/dynamic-markup-insertion/opening-the-input-stream/tasks.window.html",
|
||||
{}
|
||||
|
@ -502767,6 +502798,13 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"opacity-nonzero-to-zero.html": [
|
||||
"a5f3d213a2dd6d2f7639440dadd55dcc724f0075",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"opacity-zero-layout-and-visible.html": [
|
||||
"af81ff2a625908a2686e6987e1a86409ff7eba07",
|
||||
[
|
||||
|
@ -502913,6 +502951,13 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"transform-above-perspective-dynamic.html": [
|
||||
"fea65ca56ad6bbca11c5eece6fa7a059668ecb31",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"transform-change.html": [
|
||||
"fd9657a71455629f856e53b8fa20aec1a3008e73",
|
||||
[
|
||||
|
@ -502947,6 +502992,13 @@
|
|||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"visible-to-hidden.html": [
|
||||
"e30231f7fe8e7af505a88d97ccad0b2e35ef3e90",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
]
|
||||
},
|
||||
"lifecycle": {
|
||||
|
@ -527705,8 +527757,8 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"TAO-null-opaque-origin.sub.html": [
|
||||
"0a457637c5165481bf7a3bd1cbf023e9c07be751",
|
||||
"TAO-null-opaque-origin.html": [
|
||||
"6548a7b9ad437407eaded2c6efc4974dec242ecd",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -528738,6 +528790,20 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"isExtended.tentative.https.window.js": [
|
||||
"3c814ae3d91d519500f7b44ab8fe4faa8a861d88",
|
||||
[
|
||||
"screen_enumeration/isExtended.tentative.https.window.html",
|
||||
{
|
||||
"script_metadata": [
|
||||
[
|
||||
"global",
|
||||
"window"
|
||||
]
|
||||
]
|
||||
}
|
||||
]
|
||||
],
|
||||
"isMultiScreen.tentative.https.window.js": [
|
||||
"ac32dd05169e0a9cebeab0ff05a32fe36167362e",
|
||||
[
|
||||
|
@ -542866,6 +542932,15 @@
|
|||
}
|
||||
]
|
||||
],
|
||||
"single-touch.html": [
|
||||
"a067bc13801928caf1bfc873a80208db4b9b0bbd",
|
||||
[
|
||||
null,
|
||||
{
|
||||
"testdriver": true
|
||||
}
|
||||
]
|
||||
],
|
||||
"touch-globaleventhandler-interface.html": [
|
||||
"cb640444fa0b752c90d10fc73d32892facfb7dcf",
|
||||
[
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
[hit-test-floats-002.html]
|
||||
[Hit test float]
|
||||
expected: FAIL
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
[hit-test-floats-003.html]
|
||||
[Miss float below something else]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
[hit-test-floats-005.html]
|
||||
[Miss clipped float]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
[CaretPosition-001.html]
|
||||
[Element at (400, 100)]
|
||||
expected: FAIL
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
[elementsFromPoint-invalid-cases.html]
|
||||
[The root element is the last element returned for otherwise empty queries within the viewport]
|
||||
expected: FAIL
|
||||
|
|
@ -497,3 +497,9 @@
|
|||
[CSS namespace: typeof is "object"]
|
||||
expected: FAIL
|
||||
|
||||
[CSS namespace: has no name property]
|
||||
expected: FAIL
|
||||
|
||||
[CSS namespace: has no length property]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -309,27 +309,21 @@
|
|||
[fetch(): separate response Content-Type: text/plain ]
|
||||
expected: NOTRUN
|
||||
|
||||
[<iframe>: separate response Content-Type: text/html */*]
|
||||
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 */*;charset=gbk]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: separate response Content-Type: text/plain */*]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: separate response Content-Type: text/html;x=" text/plain]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: separate response Content-Type: text/html;" \\" text/plain]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: separate response Content-Type: text/plain */*;charset=gbk]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: combined response Content-Type: text/html;" text/plain]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: combined response Content-Type: text/html */*]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: combined response Content-Type: text/html;" \\" text/plain]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: combined response Content-Type: text/html;x=" text/plain]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -56,6 +56,3 @@
|
|||
[separate text/javascript x/x]
|
||||
expected: FAIL
|
||||
|
||||
[separate text/javascript ]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -5,15 +5,3 @@
|
|||
[Test javascript URL string return values in direct and indirect (target) frame contexts. 9]
|
||||
expected: FAIL
|
||||
|
||||
[Test javascript URL string return values in direct and indirect (target) frame contexts. 7]
|
||||
expected: FAIL
|
||||
|
||||
[Test javascript URL string return values in direct and indirect (target) frame contexts. 6]
|
||||
expected: FAIL
|
||||
|
||||
[Test javascript URL string return values in direct and indirect (target) frame contexts. 5]
|
||||
expected: FAIL
|
||||
|
||||
[Test javascript URL string return values in direct and indirect (target) frame contexts. 8]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
[traverse_the_history_1.html]
|
||||
[Multiple history traversals from the same task]
|
||||
expected: FAIL
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
[traverse_the_history_4.html]
|
||||
[Multiple history traversals, last would be aborted]
|
||||
expected: FAIL
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
[traverse_the_history_5.html]
|
||||
[Multiple history traversals, last would be aborted]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
[cross-origin-objects-on-new-window.html]
|
||||
expected: TIMEOUT
|
|
@ -1,4 +1,5 @@
|
|||
[embedded-opener-remove-frame.html]
|
||||
expected: CRASH
|
||||
[opener and "removed" embedded documents]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
[2d.transformation.setTransform.3d.html]
|
||||
[setTransform() with 4x4 matrix keeps all parameters]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
[marquee-events-historical.html]
|
||||
[Event handler IDL attributes must not be implemented]
|
||||
expected: FAIL
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
[marquee-events.html]
|
||||
type: testharness
|
||||
expected: TIMEOUT
|
||||
[marquee_events_start]
|
||||
expected: NOTRUN
|
||||
|
||||
[marquee_events_finish]
|
||||
expected: NOTRUN
|
||||
|
||||
[marquee_events_bounce]
|
||||
expected: NOTRUN
|
||||
|
||||
[marquee_events_bounce2]
|
||||
expected: NOTRUN
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
[iframe_sandbox_popups_nonescaping-1.html]
|
||||
type: testharness
|
||||
expected: TIMEOUT
|
||||
expected: CRASH
|
||||
[Check that popups from a sandboxed iframe do not escape the sandbox]
|
||||
expected: NOTRUN
|
||||
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
[iframe_sandbox_popups_nonescaping-3.html]
|
||||
expected: CRASH
|
||||
[Check that popups from a sandboxed iframe do not escape the sandbox]
|
||||
expected: NOTRUN
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
[form-double-submit-2.html]
|
||||
[preventDefault should allow onclick submit() to succeed]
|
||||
expected: FAIL
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
[form-double-submit-3.html]
|
||||
[<button> should have the same double-submit protection as <input type=submit>]
|
||||
expected: FAIL
|
||||
|
|
@ -1,40 +1,13 @@
|
|||
[select-event.html]
|
||||
[textarea: selectionDirection a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type search: setRangeText() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[textarea: setSelectionRange() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type url: setSelectionRange() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type search: setSelectionRange() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type tel: selectionDirection a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type search: selectionDirection a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type text: selectionStart out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type tel: select() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type url: selectionStart a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type text: setSelectionRange() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type text: selectionDirection a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[textarea: setSelectionRange out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
|
@ -44,21 +17,12 @@
|
|||
[input type tel: setRangeText() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type url: selectionEnd out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type url: selectionEnd a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type search: setSelectionRange out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type text: setSelectionRange out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type url: select() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type password: setRangeText() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
|
@ -71,12 +35,36 @@
|
|||
[input type url: setRangeText() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[textarea: selectionEnd out of range a second time (must not fire select)]
|
||||
[textarea: selectionEnd a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type tel: selectionStart a second time (must not fire select)]
|
||||
[input type password: select() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type search: selectionStart a second time (must not fire select)]
|
||||
[input type password: selectionStart a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type url: selectionStart out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type tel: selectionStart out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type text: selectionEnd out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type search: selectionEnd a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type search: selectionEnd out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type text: selectionStart a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type password: selectionDirection a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type url: setSelectionRange out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
[DOMContentLoaded-defer.html]
|
||||
[The end: DOMContentLoaded and defer scripts]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +1,4 @@
|
|||
[tasks.window.html]
|
||||
expected: TIMEOUT
|
||||
[document.open() and tasks (canvas.toBlob())]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -4,3 +4,6 @@
|
|||
[The incumbent settings object while executing the compiled callback via Web IDL's invoke must be that of the node document]
|
||||
expected: TIMEOUT
|
||||
|
||||
[The entry settings object while executing the compiled callback via Web IDL's invoke must be that of the node document]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
[TAO-null-opaque-origin.html]
|
||||
expected: ERROR
|
|
@ -1,5 +0,0 @@
|
|||
[TAO-null-opaque-origin.sub.html]
|
||||
expected: TIMEOUT
|
||||
[Test null TAO value with opaque origins]
|
||||
expected: NOTRUN
|
||||
|
|
@ -1,7 +1,6 @@
|
|||
[entry.html]
|
||||
expected: TIMEOUT
|
||||
[Start function]
|
||||
expected: TIMEOUT
|
||||
expected: FAIL
|
||||
|
||||
[Sanity check: this all works as expected synchronously]
|
||||
expected: FAIL
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
[realtimeanalyser-fft-scaling.html]
|
||||
expected: TIMEOUT
|
||||
[X 2048-point FFT peak position is not equal to 64. Got 0.]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
[audiocontext-not-fully-active.html]
|
||||
expected: TIMEOUT
|
||||
[frame in navigated remote-site frame]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,5 +0,0 @@
|
|||
[017.html]
|
||||
expected: TIMEOUT
|
||||
[origin of the script that invoked the method, about:blank]
|
||||
expected: TIMEOUT
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[017.html]
|
||||
expected: TIMEOUT
|
||||
[origin of the script that invoked the method, about:blank]
|
||||
expected: TIMEOUT
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
[Worker-constructor.html]
|
||||
expected: ERROR
|
|
@ -0,0 +1,44 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>CSS Grid Layout Test: Auto repeat tracks and percentage min sizes with percentage track sizes</title>
|
||||
<link rel="author" title="Jacques Newman" href="mailto:janewman@microsoft.com">
|
||||
<link rel="help" href="https://drafts.csswg.org/css-grid-1/#auto-repeat">
|
||||
<meta name="assert"
|
||||
content="This test checks that auto repeat tracks can use percentage track
|
||||
size when only a min size is available to compute the number of tracks.">
|
||||
<link rel="stylesheet" href="/css/support/grid.css">
|
||||
<style>
|
||||
.grid {
|
||||
position: relative;
|
||||
display: inline-grid;
|
||||
grid-template-columns: repeat(auto-fill, 25%);
|
||||
grid-auto-rows: 100px;
|
||||
min-width: 50%;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.wrapper {
|
||||
width: 600px;
|
||||
}
|
||||
|
||||
#cell {
|
||||
background: lime;
|
||||
}
|
||||
</style>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/resources/check-layout-th.js"></script>
|
||||
|
||||
<body onload="checkLayout('.grid');">
|
||||
|
||||
<div id="log"></div>
|
||||
|
||||
<div class="wrapper">
|
||||
<div class="grid" data-expected-width="300" data-expected-height="200">
|
||||
<div id="cell" data-expected-width="75">Cell 1</div>
|
||||
<div id="cell" data-expected-width="75">Cell 2</div>
|
||||
<div id="cell" data-expected-width="75">Cell 3</div>
|
||||
<div id="cell" data-expected-width="75">Cell 4</div>
|
||||
<div id="cell" data-expected-width="75">Cell 5</div>
|
||||
</div>
|
||||
</div>
|
|
@ -0,0 +1,42 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>CSS Grid Layout Test: Auto repeat tracks and percentage min sizes with percentage track sizes</title>
|
||||
<link rel="author" title="Jacques Newman" href="mailto:janewman@microsoft.com">
|
||||
<link rel="help" href="https://drafts.csswg.org/css-grid-1/#auto-repeat">
|
||||
<meta name="assert"
|
||||
content="This test checks that auto repeat tracks can use percentage track
|
||||
size when only a min size is available to compute the number of tracks.">
|
||||
<link rel="stylesheet" href="/css/support/grid.css">
|
||||
<style>
|
||||
.grid {
|
||||
position: relative;
|
||||
display: inline-grid;
|
||||
grid-template-rows: repeat(auto-fill, 20%);
|
||||
grid-auto-columns: 100px;
|
||||
min-height: 50%;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.wrapper {
|
||||
height: 1000px;
|
||||
}
|
||||
|
||||
#cell {
|
||||
background-color: lime;
|
||||
}
|
||||
</style>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/resources/check-layout-th.js"></script>
|
||||
|
||||
<body onload="checkLayout('.grid');">
|
||||
<div id="log"></div>
|
||||
<div class="wrapper">
|
||||
<div class="grid" data-expected-width="100" data-expected-height="500">
|
||||
<div id="cell" data-expected-width="100" data-expected-height="100">Cell 1</div>
|
||||
<div id="cell" data-expected-width="100" data-expected-height="100">Cell 2</div>
|
||||
<div id="cell" data-expected-width="100" data-expected-height="100">Cell 3</div>
|
||||
<div id="cell" data-expected-width="100" data-expected-height="100">Cell 4</div>
|
||||
<div id="cell" data-expected-width="100" data-expected-height="100">Cell 5</div>
|
||||
</div>
|
||||
</div>
|
|
@ -0,0 +1,43 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CSS Test: ::first-letter digraph recognition</title>
|
||||
<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com">
|
||||
<link rel="match" href="reference/first-letter-digraph-ref.html">
|
||||
<link rel="help" href="https://drafts.csswg.org/selectors-3/#first-letter">
|
||||
<meta name="assert" content="Test checks that ::first-letter respects the Dutch 'ij' digraph.">
|
||||
<style>
|
||||
div {
|
||||
font-size: 32px;
|
||||
}
|
||||
div p {
|
||||
margin: 0;
|
||||
color: lightgray;
|
||||
}
|
||||
div p::first-letter {
|
||||
color: green;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<p>Test passes if both "I" and "J" are green in these examples:</p>
|
||||
<div lang="nl">
|
||||
<p>IJsselmeer</p>
|
||||
<p>ijsselmeer</p>
|
||||
<p>“IJsselmeer”</p>
|
||||
<p>Ijsselmeer</p> <!-- mixed case within the digraph is unlikely in practice -->
|
||||
</div>
|
||||
<div lang="en">
|
||||
<p lang="nl-NL">IJsselmeer</p> <!-- lang tag with country code should also work -->
|
||||
<p lang="nl-SR">IJsselmeer</p>
|
||||
</div>
|
||||
<p>But only "I" should be green in these examples:</p>
|
||||
<div lang="en">
|
||||
<p>IJsselmeer</p>
|
||||
<p>ijsselmeer</p>
|
||||
<p>“IJsselmeer”</p>
|
||||
<p>Ijsselmeer</p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,40 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CSS Reference: ::first-letter digraph recognition</title>
|
||||
<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com">
|
||||
<style>
|
||||
div {
|
||||
font-size: 32px;
|
||||
}
|
||||
div p {
|
||||
margin: 0;
|
||||
color: lightgray;
|
||||
}
|
||||
div p span {
|
||||
color: green;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<p>Test passes if both "I" and "J" are green in these examples:</p>
|
||||
<div lang="nl">
|
||||
<p><span>IJ</span>sselmeer</p>
|
||||
<p><span>ij</span>sselmeer</p>
|
||||
<p><span>“IJ</span>sselmeer”</p>
|
||||
<p><span>Ij</span>sselmeer</p>
|
||||
</div>
|
||||
<div lang="en">
|
||||
<p lang="nl-NL"><span>IJ</span>sselmeer</p>
|
||||
<p lang="nl-SR"><span>IJ</span>sselmeer</p>
|
||||
</div>
|
||||
<p>But only "I" should be green in these examples:</p>
|
||||
<div lang="en">
|
||||
<p><span>I</span>Jsselmeer</p>
|
||||
<p><span>i</span>jsselmeer</p>
|
||||
<p><span>“I</span>Jsselmeer”</p>
|
||||
<p><span>I</span>jsselmeer</p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
|
@ -74,20 +74,6 @@ test(() => {
|
|||
}, `addPath (Sanity check without second parameter)`);
|
||||
|
||||
[
|
||||
// Input dict that would throw if ignore3D was false
|
||||
[{m13: 1, is2D: true}, matrix2D({})],
|
||||
[{m14: 1, is2D: true}, matrix2D({})],
|
||||
[{m23: 1, is2D: true}, matrix2D({})],
|
||||
[{m24: 1, is2D: true}, matrix2D({})],
|
||||
[{m31: 1, is2D: true}, matrix2D({})],
|
||||
[{m32: 1, is2D: true}, matrix2D({})],
|
||||
[{m33: 0, is2D: true}, matrix2D({})],
|
||||
[{m33: -0, is2D: true}, matrix2D({})],
|
||||
[{m33: -1, is2D: true}, matrix2D({})],
|
||||
[{m34: 1, is2D: true}, matrix2D({})],
|
||||
[{m43: 1, is2D: true}, matrix2D({})],
|
||||
[{m44: 0, is2D: true}, matrix2D({})],
|
||||
|
||||
// Input dict that are 2D
|
||||
[{}, matrix2D({})],
|
||||
[{is2D: undefined}, matrix2D({})],
|
||||
|
@ -142,32 +128,6 @@ test(() => {
|
|||
[{m43: -0, is2D: true}, matrix2D({})],
|
||||
[{m44: 1, is2D: true}, matrix2D({})],
|
||||
[{is2D: true}, matrix2D({})],
|
||||
|
||||
// Input dict that are 3D, but 3D members are ignored
|
||||
[{m13: 1, is2D: false}, matrix2D({})],
|
||||
[{m14: 1, is2D: false}, matrix2D({})],
|
||||
[{m23: 1, is2D: false}, matrix2D({})],
|
||||
[{m24: 1, is2D: false}, matrix2D({})],
|
||||
[{m31: 1, is2D: false}, matrix2D({})],
|
||||
[{m32: 1, is2D: false}, matrix2D({})],
|
||||
[{m33: 0, is2D: false}, matrix2D({})],
|
||||
[{m33: -0, is2D: false}, matrix2D({})],
|
||||
[{m33: -1, is2D: false}, matrix2D({})],
|
||||
[{m34: 1, is2D: false}, matrix2D({})],
|
||||
[{m43: 1, is2D: false}, matrix2D({})],
|
||||
[{m44: 0, is2D: false}, matrix2D({})],
|
||||
[{m13: 1}, matrix2D({})],
|
||||
[{m14: 1}, matrix2D({})],
|
||||
[{m23: 1}, matrix2D({})],
|
||||
[{m24: 1}, matrix2D({})],
|
||||
[{m31: 1}, matrix2D({})],
|
||||
[{m32: 1}, matrix2D({})],
|
||||
[{m33: 0}, matrix2D({})],
|
||||
[{m34: 1}, matrix2D({})],
|
||||
[{m43: 1}, matrix2D({})],
|
||||
[{m44: 0}, matrix2D({})],
|
||||
[{is2D: false}, matrix2D({})],
|
||||
[{is2D: null}, matrix2D({})],
|
||||
].forEach(([dict, expected]) => {
|
||||
test(() => {
|
||||
ctx.resetTransform();
|
||||
|
|
|
@ -0,0 +1,30 @@
|
|||
<!DOCTYPE html>
|
||||
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
|
||||
<title>Canvas test: 2d.transformation.setTransform.3d</title>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/html/canvas/resources/canvas-tests.js"></script>
|
||||
<link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css">
|
||||
<body class="show_output">
|
||||
|
||||
<h1>2d.transformation.setTransform.3d</h1>
|
||||
<p class="desc">setTransform() with 4x4 matrix keeps all parameters</p>
|
||||
|
||||
|
||||
<p class="output">Actual output:</p>
|
||||
<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
|
||||
|
||||
<ul id="d"></ul>
|
||||
<script>
|
||||
var t = async_test("setTransform() with 4x4 matrix keeps all parameters");
|
||||
_addTest(function(canvas, ctx) {
|
||||
|
||||
const transform = new DOMMatrix([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]);
|
||||
ctx.setTransform(transform);
|
||||
const canvasTransform = ctx.getTransform();
|
||||
_assert(transform.toLocaleString() == canvasTransform.toLocaleString(), "transform.toLocaleString() == canvasTransform.toLocaleString()");
|
||||
|
||||
|
||||
});
|
||||
</script>
|
||||
|
|
@ -334,7 +334,6 @@
|
|||
@assert pixel 50,25 == 0,255,0,255;
|
||||
expected: green
|
||||
|
||||
|
||||
- name: 2d.transformation.setTransform.skewed
|
||||
testing:
|
||||
- 2d.transformation.setTransform
|
||||
|
@ -402,4 +401,14 @@
|
|||
@assert pixel 50,25 == 0,255,0,255;
|
||||
expected: green
|
||||
|
||||
- name: 2d.transformation.setTransform.3d
|
||||
desc: setTransform() with 4x4 matrix keeps all parameters
|
||||
testing:
|
||||
- 2d.transformation.setTransform.3d
|
||||
code: |
|
||||
const transform = new DOMMatrix([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]);
|
||||
ctx.setTransform(transform);
|
||||
const canvasTransform = ctx.getTransform();
|
||||
@assert transform.toLocaleString() == canvasTransform.toLocaleString();
|
||||
|
||||
|
||||
|
|
|
@ -0,0 +1,32 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>Marquee events must not be implemented</title>
|
||||
<link rel="help" href="https://html.spec.whatwg.org/multipage/multipage/obsolete.html#the-marquee-element">
|
||||
<link rel="help" href="https://github.com/whatwg/html/pull/6343">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
|
||||
<div id="log"></div>
|
||||
<marquee width="1" behavior="alternate"> </marquee>
|
||||
<marquee width="1"> </marquee>
|
||||
<marquee width="1" loop="2" behavior="alternate"> </marquee>
|
||||
<marquee width="1" loop="2"> </marquee>
|
||||
|
||||
<script>
|
||||
test(() => {
|
||||
assert_false("onstart" in HTMLMarqueeElement.prototype, "onstart");
|
||||
assert_false("onfinish" in HTMLMarqueeElement.prototype, "onfinish");
|
||||
assert_false("onbounce" in HTMLMarqueeElement.prototype, "onbounce");
|
||||
}, "Event handler IDL attributes must not be implemented");
|
||||
|
||||
// Because we use width="1" they will bounce and finish really fast
|
||||
async_test(t => {
|
||||
for (const m of document.querySelectorAll("marquee")) {
|
||||
m.addEventListener("start", t.unreached_func(`start: ${m.outerHTML}`));
|
||||
m.addEventListener("finish", t.unreached_func(`finish: ${m.outerHTML}`));
|
||||
m.addEventListener("bounce", t.unreached_func(`bounce: ${m.outerHTML}`));
|
||||
}
|
||||
|
||||
t.step_timeout(() => t.done(), 100);
|
||||
}, "No events must be fired, at least during the first 100 ms");
|
||||
</script>
|
|
@ -1,71 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>HTML Test: marquee-events</title>
|
||||
<link rel="author" title="Intel" href="http://www.intel.com/">
|
||||
<link rel="help" href="https://html.spec.whatwg.org/multipage/multipage/obsolete.html#the-marquee-element">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<div id="log"></div>
|
||||
<marquee id="test1" loop="2" width="1" behavior="alternate"> </marquee>
|
||||
<marquee id="test2" loop="2" width="1"> </marquee>
|
||||
<script>
|
||||
var mq;
|
||||
var t_start = async_test("marquee_events_start");
|
||||
var t_finish = async_test("marquee_events_finish");
|
||||
var t_bounce = async_test("marquee_events_bounce");
|
||||
var t_bounce2 = async_test("marquee_events_bounce2");
|
||||
var timeStamp = [];
|
||||
var bounced = false;
|
||||
|
||||
setup(function() {
|
||||
mq = document.getElementById("test1");
|
||||
mq2 = document.getElementById("test2");
|
||||
});
|
||||
|
||||
mq.addEventListener("start", function(evt) {
|
||||
t_start.step(function() {
|
||||
timeStamp.push(evt.timeStamp);
|
||||
assert_true(evt.isTrusted, "The onstart event is created by UA, it must be trusted.");
|
||||
assert_equals(timeStamp.length, 1, "The onstart event should be fired firstly.");
|
||||
assert_false(evt.bubbles, "The bubbles property of onstart event should be false.");
|
||||
assert_false(evt.cancelable, "The cancelable property of onstart event should be false.");
|
||||
assert_true(evt instanceof Event, "The onstart event must be the instance of Event interface.");
|
||||
});
|
||||
t_start.done();
|
||||
});
|
||||
|
||||
mq.addEventListener("finish", function(evt) {
|
||||
t_finish.step(function() {
|
||||
timeStamp.push(evt.timeStamp);
|
||||
assert_true(evt.isTrusted, "The onfinish event is created by UA, it must be trusted.");
|
||||
assert_equals(timeStamp.length, 3, "The onfinish event should be fired lastly.");
|
||||
assert_false(evt.bubbles, "The bubbles property of onfinish event should be false.");
|
||||
assert_false(evt.cancelable, "The cancelable property of onfinish event should be false.");
|
||||
assert_true(evt instanceof Event, "The onfinish event must be the instance of Event interface.");
|
||||
});
|
||||
t_finish.done();
|
||||
});
|
||||
|
||||
mq.addEventListener("bounce", function(evt) {
|
||||
t_bounce.step(function() {
|
||||
timeStamp.push(evt.timeStamp);
|
||||
assert_true(evt.isTrusted, "The onbounce event is created by UA, it must be trusted.");
|
||||
assert_equals(timeStamp.length, 2, "The onbounce event should be fired secondly.");
|
||||
assert_false(evt.bubbles, "The bubbles property of onbounce event should be false.");
|
||||
assert_false(evt.cancelable, "The cancelable property of onbounce event should be false.");
|
||||
assert_true(evt instanceof Event, "The onbounce event must be the instance of Event interface.");
|
||||
});
|
||||
t_bounce.done();
|
||||
});
|
||||
|
||||
mq2.addEventListener("bounce", function(evt) {
|
||||
bounced = true;
|
||||
});
|
||||
|
||||
mq2.addEventListener("finish", function(evt) {
|
||||
t_bounce2.step(function () {
|
||||
assert_false(bounced, "The onbounce event should not be fired.");
|
||||
});
|
||||
t_bounce2.done();
|
||||
});
|
||||
</script>
|
|
@ -104,10 +104,3 @@ taskTest("Promise rejection", (t, frame, open) => {
|
|||
frame.contentWindow.onunhandledrejection = listener;
|
||||
window.onunhandledrejection = listener;
|
||||
});
|
||||
|
||||
taskTest("marquee start", (t, frame, open) => {
|
||||
const doc = frame.contentDocument;
|
||||
const marquee = doc.body.appendChild(doc.createElement("marquee"));
|
||||
open(frame.contentDocument);
|
||||
marquee.addEventListener("start", t.step_func_done());
|
||||
});
|
||||
|
|
|
@ -0,0 +1,25 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Layout Instability: opacity:0</title>
|
||||
<link rel="help" href="https://wicg.github.io/layout-instability/" />
|
||||
<div id="target" style="position: absolute; top: 0; width: 400px; height: 400px;">
|
||||
</div>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="resources/util.js"></script>
|
||||
<script>
|
||||
|
||||
promise_test(async () => {
|
||||
const watcher = new ScoreWatcher;
|
||||
|
||||
// Wait for the initial render to complete.
|
||||
await waitForAnimationFrames(2);
|
||||
|
||||
// Shift target, for which no shift should be reported because it's not visible.
|
||||
target.style.top = '200px';
|
||||
target.style.opacity = 0;
|
||||
|
||||
await waitForAnimationFrames(2);
|
||||
assert_equals(watcher.score, 0);
|
||||
}, 'opacity non-zero to zero');
|
||||
|
||||
</script>
|
|
@ -0,0 +1,24 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Layout Instability: addition of transform above perspective</title>
|
||||
<link rel="help" href="https://wicg.github.io/layout-instability/" />
|
||||
<div id=target2>
|
||||
<div id=perspective style="perspective: 1000px;">
|
||||
<div id=target>Test</div>
|
||||
</div>
|
||||
</div>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="resources/util.js"></script>
|
||||
<script>
|
||||
promise_test(async () => {
|
||||
const watcher = new ScoreWatcher;
|
||||
// Wait for the initial render to complete.
|
||||
await waitForAnimationFrames(2);
|
||||
|
||||
target2.style.transform = 'translateX(0px)';
|
||||
await waitForAnimationFrames(1);
|
||||
|
||||
assert_equals(watcher.score, 0);
|
||||
}, 'addition of transform above perspective');
|
||||
|
||||
</script>
|
|
@ -0,0 +1,25 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Layout Instability: visibility:hidden</title>
|
||||
<link rel="help" href="https://wicg.github.io/layout-instability/" />
|
||||
<div id="target" style="position: absolute; top: 0; width: 400px; height: 400px;"></div>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="resources/util.js"></script>
|
||||
<script>
|
||||
|
||||
promise_test(async () => {
|
||||
const watcher = new ScoreWatcher;
|
||||
|
||||
// Wait for the initial render to complete.
|
||||
await waitForAnimationFrames(2);
|
||||
|
||||
// Shift target and make hidden at the same time. Should not be reported!
|
||||
document.querySelector("#target").style.top = '200px';
|
||||
document.querySelector("#target").style.visibility = 'hidden';
|
||||
|
||||
await waitForAnimationFrames(2);
|
||||
// No shift should be reported.
|
||||
assert_equals(watcher.score, 0);
|
||||
}, 'visible to hidden');
|
||||
|
||||
</script>
|
|
@ -0,0 +1,55 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<title>Resource Timing TAO - "null" and opaque origin</title>
|
||||
<link rel="author" title="Google" href="http://www.google.com/" />
|
||||
<link rel="help" href="https://www.w3.org/TR/resource-timing-2/#timing-allow-origin"/>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/common/get-host-info.sub.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Description</h1>
|
||||
<p>This test validates that, for a cross origin resource, the timing allow
|
||||
check algorithm will succeed when the value of Timing-Allow-Origin is null and
|
||||
the origin is an opaque origin.</p>
|
||||
<div id="log"></div>
|
||||
<iframe id="frameContext"></iframe>
|
||||
<script>
|
||||
const origin = get_host_info()["ORIGIN"];
|
||||
const frame_content = `data:text/html;utf8,<body>
|
||||
<script src="${origin}/resources/testharness.js"></` + `script>
|
||||
<script>
|
||||
const url = "${origin}/resource-timing/resources/TAOResponse.py?tao=null";
|
||||
promise_test(() => { return new Promise((resolve, reject) => {
|
||||
const run_test = entryList => {
|
||||
const entry = entryList.getEntries()[0];
|
||||
const sum = entry.redirectStart + entry.redirectEnd +
|
||||
entry.domainLookupStart + entry.domainLookupEnd +
|
||||
entry.connectStart + entry.connectEnd +
|
||||
entry.secureConnectionStart + entry.requestStart +
|
||||
entry.responseStart + entry.transferSize +
|
||||
entry.encodedBodySize + entry.decodedBodySize;
|
||||
assert_not_equals(sum, 0, "Timings must be non-zero");
|
||||
};
|
||||
const observer = new PerformanceObserver(list => {
|
||||
try {
|
||||
run_test(list);
|
||||
resolve();
|
||||
} catch(e) {
|
||||
reject(e);
|
||||
}
|
||||
});
|
||||
observer.observe({ entryTypes: ["resource"] });
|
||||
fetch(url);
|
||||
})}, "An opaque origin should be authorized to see resource timings when" +
|
||||
" the TAO header is the string 'null'");
|
||||
</` + `script></body>`;
|
||||
|
||||
frameContext.style = "display:none"
|
||||
frameContext.src = frame_content;
|
||||
fetch_tests_from_window(frameContext.contentWindow);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
|
@ -1,42 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<title>Resource Timing TAO - "null" and opaque origin</title>
|
||||
<link rel="author" title="Google" href="http://www.google.com/" />
|
||||
<link rel="help" href="https://www.w3.org/TR/resource-timing-2/#timing-allow-origin"/>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script>
|
||||
|
||||
const t = async_test("Test null TAO value with opaque origins");
|
||||
window.addEventListener("message", t.step_func_done(e=>{
|
||||
assert_equals(e.data, "PASS");
|
||||
}));
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Description</h1>
|
||||
<p>This test validates that for a cross origin resource, the timing allow check algorithm will succeed when the value of Timing-Allow-Origin is null and the origin is an opaque origin.</p>
|
||||
<div id="log"></div>
|
||||
<iframe id="frameContext"></iframe>
|
||||
<script>
|
||||
let frame_content = "data:text/html;utf8,<body>" +
|
||||
"<script>" +
|
||||
"const url = '{{location[scheme]}}://{{host}}:{{ports[http][1]}}/resource-timing/resources/TAOResponse.py?tao=null';" +
|
||||
"const observe = (list, observer) => {" +
|
||||
" const entry = list.getEntries()[0];" +
|
||||
" const sum = entry.redirectStart + entry.redirectEnd + entry.domainLookupStart + entry.domainLookupEnd + entry.connectStart +" +
|
||||
" entry.connectEnd + entry.secureConnectionStart + entry.requestStart + entry.responseStart + entry.transferSize +" +
|
||||
" entry.encodedBodySize + entry.decodedBodySize;" +
|
||||
" const result = sum != 0 ? 'PASS' : 'FAIL';" +
|
||||
" window.parent.postMessage(result, '*');" +
|
||||
"};" +
|
||||
"let observer = new PerformanceObserver(observe);" +
|
||||
"observer.observe({ entryTypes: ['resource'] });" +
|
||||
"fetch(url).then(r => r.text());" +
|
||||
"</" + "script></body>";
|
||||
document.getElementById("frameContext").src = frame_content;
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
|
@ -14,7 +14,7 @@ def main(request, response):
|
|||
# null, fail unless it's an opaque origin
|
||||
response.headers.set(b'Timing-Allow-Origin', b'null')
|
||||
elif tao == b'Null':
|
||||
# case-insentive null, fail
|
||||
# case-insensitive null, fail
|
||||
response.headers.set(b'Timing-Allow-Origin', b'Null')
|
||||
elif tao == b'origin':
|
||||
# case-sensitive match for origin, pass
|
||||
|
|
|
@ -3483,6 +3483,22 @@ IdlNamespace.prototype.test_self = function ()
|
|||
subsetTestByKey(this.name, test, () => {
|
||||
assert_equals(typeof namespaceObject, "object");
|
||||
}, `${this.name} namespace: typeof is "object"`);
|
||||
|
||||
subsetTestByKey(this.name, test, () => {
|
||||
assert_equals(
|
||||
Object.getOwnPropertyDescriptor(namespaceObject, "length"),
|
||||
undefined,
|
||||
"length property must be undefined"
|
||||
);
|
||||
}, `${this.name} namespace: has no length property`);
|
||||
|
||||
subsetTestByKey(this.name, test, () => {
|
||||
assert_equals(
|
||||
Object.getOwnPropertyDescriptor(namespaceObject, "name"),
|
||||
undefined,
|
||||
"name property must be undefined"
|
||||
);
|
||||
}, `${this.name} namespace: has no name property`);
|
||||
};
|
||||
|
||||
IdlNamespace.prototype.test = function ()
|
||||
|
|
|
@ -71,6 +71,18 @@ idlArray.test();
|
|||
"properties": {},
|
||||
"message": null
|
||||
},
|
||||
{
|
||||
"name": "foo namespace: has no length property",
|
||||
"status_string": "PASS",
|
||||
"properties": {},
|
||||
"message": null
|
||||
},
|
||||
{
|
||||
"name": "foo namespace: has no name property",
|
||||
"status_string": "PASS",
|
||||
"properties": {},
|
||||
"message": null
|
||||
},
|
||||
{
|
||||
"name": "foo namespace: attribute truth",
|
||||
"status_string": "PASS",
|
||||
|
|
|
@ -110,6 +110,18 @@ idlArray.test();
|
|||
"properties": {},
|
||||
"message": null
|
||||
},
|
||||
{
|
||||
"name": "foo namespace: has no length property",
|
||||
"status_string": "PASS",
|
||||
"properties": {},
|
||||
"message": null
|
||||
},
|
||||
{
|
||||
"name": "foo namespace: has no name property",
|
||||
"status_string": "PASS",
|
||||
"properties": {},
|
||||
"message": null
|
||||
},
|
||||
{
|
||||
"name": "foo namespace: operation Truth()",
|
||||
"status_string": "PASS",
|
||||
|
@ -122,7 +134,6 @@ idlArray.test();
|
|||
"properties": {},
|
||||
"message": "assert_own_property: namespace object missing operation \"Lies\" expected property \"Lies\" missing"
|
||||
},
|
||||
|
||||
{
|
||||
"name": "bar namespace: extended attributes",
|
||||
"status_string": "PASS",
|
||||
|
@ -153,6 +164,18 @@ idlArray.test();
|
|||
"properties": {},
|
||||
"message": null
|
||||
},
|
||||
{
|
||||
"name": "bar namespace: has no length property",
|
||||
"status_string": "PASS",
|
||||
"properties": {},
|
||||
"message": null
|
||||
},
|
||||
{
|
||||
"name": "bar namespace: has no name property",
|
||||
"status_string": "PASS",
|
||||
"properties": {},
|
||||
"message": null
|
||||
},
|
||||
{
|
||||
"name": "bar namespace: operation Truth()",
|
||||
"status_string": "PASS",
|
||||
|
@ -190,6 +213,18 @@ idlArray.test();
|
|||
"properties": {},
|
||||
"message": null
|
||||
},
|
||||
{
|
||||
"name": "baz namespace: has no length property",
|
||||
"status_string": "PASS",
|
||||
"properties": {},
|
||||
"message": null
|
||||
},
|
||||
{
|
||||
"name": "baz namespace: has no name property",
|
||||
"status_string": "PASS",
|
||||
"properties": {},
|
||||
"message": null
|
||||
},
|
||||
{
|
||||
"name": "baz namespace: operation LongStory(any, DOMString...)",
|
||||
"status_string": "PASS",
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
// META: global=window
|
||||
'use strict';
|
||||
|
||||
promise_test(async t => {
|
||||
assert_equals(typeof self.screen.isExtended, 'boolean');
|
||||
}, 'screen.isExtended is present');
|
||||
|
||||
promise_test(async t => {
|
||||
let iframe = document.body.appendChild(document.createElement('iframe'));
|
||||
assert_equals(typeof iframe.contentWindow.screen.isExtended, 'boolean');
|
||||
}, 'screen.isExtended is present for attached iframes');
|
|
@ -16,15 +16,19 @@
|
|||
<meta name="viewport" content="width=device-width">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/resources/testdriver.js"></script>
|
||||
<script src="/resources/testdriver-actions.js"></script>
|
||||
<script src="/resources/testdriver-vendor.js"></script>
|
||||
|
||||
<script>
|
||||
setup({explicit_done: true});
|
||||
|
||||
// Check a Touch object's atttributes for existence and correct type
|
||||
// TA: 1.1.2, 1.1.3
|
||||
function check_Touch_object (t) {
|
||||
function check_Touch_object (t, element) {
|
||||
test(function() {
|
||||
assert_equals(Object.prototype.toString.call(t), "[object Touch]", name + " attribute of type TouchList");
|
||||
}, "touch point is a Touch object");
|
||||
}, element + "'s touch point is a Touch object");
|
||||
[
|
||||
["long", "identifier"],
|
||||
["EventTarget", "target"],
|
||||
|
@ -41,20 +45,20 @@
|
|||
// existence check
|
||||
test(function() {
|
||||
assert_true(name in t, name + " attribute in Touch object");
|
||||
}, "Touch." + name + " attribute exists");
|
||||
}, element + ".Touch." + name + " attribute exists check_Touch_object");
|
||||
|
||||
// type check
|
||||
switch(type) {
|
||||
case "long":
|
||||
test(function() {
|
||||
assert_equals(typeof t[name], "number", name + " attribute of type long");
|
||||
}, "Touch." + name + " attribute is of type number (long)");
|
||||
}, element + ".Touch." + name + " attribute is of type number (long)");
|
||||
break;
|
||||
case "EventTarget":
|
||||
// An event target is some type of Element
|
||||
test(function() {
|
||||
assert_true(t[name] instanceof Element, "EventTarget must be an Element.");
|
||||
}, "Touch." + name + " attribute is of type Element");
|
||||
}, element + ".Touch." + name + " attribute is of type Element");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -65,10 +69,10 @@
|
|||
// Check a TouchList object's attributes and methods for existence and proper type
|
||||
// Also make sure all of the members of the list are Touch objects
|
||||
// TA: 1.2.1, 1.2.2, 1.2.5
|
||||
function check_TouchList_object (tl) {
|
||||
function check_TouchList_object (tl, element) {
|
||||
test(function() {
|
||||
assert_equals(Object.prototype.toString.call(tl), "[object TouchList]", name + " attribute of type TouchList");
|
||||
}, "touch list is a TouchList object");
|
||||
}, element + "'s touch list is a TouchList object");
|
||||
[
|
||||
["unsigned long", "length"],
|
||||
["function", "item"],
|
||||
|
@ -79,19 +83,19 @@
|
|||
// existence check
|
||||
test(function() {
|
||||
assert_true(name in tl, name + " attribute in TouchList");
|
||||
}, "TouchList." + name + " attribute exists");
|
||||
}, element + ".TouchList." + name + " attribute exists check_TouchList_object");
|
||||
|
||||
// type check
|
||||
switch(type) {
|
||||
case "unsigned long":
|
||||
test(function() {
|
||||
assert_equals(typeof tl[name], "number", name + " attribute of type long");
|
||||
}, "TouchList." + name + " attribute is of type number (unsigned long)");
|
||||
}, element + ".TouchList." + name + " attribute is of type number (unsigned long)");
|
||||
break;
|
||||
case "function":
|
||||
test(function() {
|
||||
assert_equals(typeof tl[name], "function", name + " attribute of type function");
|
||||
}, "TouchList." + name + " attribute is of type function");
|
||||
}, element + ".TouchList." + name + " attribute is of type function");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -99,7 +103,7 @@
|
|||
});
|
||||
// Each member of tl should be a proper Touch object
|
||||
for (var i=0; i < tl.length; i++) {
|
||||
check_Touch_object(tl.item(i));
|
||||
check_Touch_object(tl.item(i), element + "[" + i + "]");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -125,7 +129,7 @@
|
|||
// existence check
|
||||
test(function() {
|
||||
assert_true(name in ev, name + " attribute in " + ev.type + " event");
|
||||
}, ev.type + "." + name + " attribute exists");
|
||||
}, ev.type + "." + name + " attribute exists check_TouchEvent");
|
||||
|
||||
// type check
|
||||
switch(type) {
|
||||
|
@ -139,7 +143,7 @@
|
|||
assert_equals(Object.prototype.toString.call(ev[name]), "[object TouchList]", name + " attribute of type TouchList");
|
||||
}, ev.type + "." + name + " attribute is of type TouchList");
|
||||
// Now check the validity of the TouchList
|
||||
check_TouchList_object(ev[name]);
|
||||
check_TouchList_object(ev[name], ev.type + "." + name);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -181,6 +185,7 @@
|
|||
var touchend_received = false;
|
||||
var invalid_touchmove_received = false;
|
||||
var touchstart_identifier;
|
||||
var actions_promise;
|
||||
|
||||
on_event(target0, "touchstart", function onTouchStart(ev) {
|
||||
ev.preventDefault();
|
||||
|
@ -349,6 +354,15 @@
|
|||
done();
|
||||
}
|
||||
});
|
||||
|
||||
actions_promise = new test_driver.Actions()
|
||||
.addPointer("touchPointer1", "touch")
|
||||
.pointerMove(0, 0, {origin: target0, sourceName: "touchPointer1"})
|
||||
.pointerDown({sourceName: "touchPointer1"})
|
||||
.pointerMove(0, 10, {origin: target0, sourceName: "touchPointer1"})
|
||||
.pointerMove(0, 0, {origin: target1, sourceName: "touchPointer1"})
|
||||
.pointerUp({sourceName: "touchPointer1"})
|
||||
.send();
|
||||
}
|
||||
</script>
|
||||
<style>
|
Loading…
Add table
Add a link
Reference in a new issue