mirror of
https://github.com/servo/servo.git
synced 2025-06-27 10:33:39 +01:00
Update web-platform-tests to revision 313f99aafa6620894b8d7a7acc6e015b9548e179
This commit is contained in:
parent
7840614814
commit
54c2e735e6
77 changed files with 1067 additions and 217 deletions
|
@ -1,4 +0,0 @@
|
|||
[hit-test-floats-002.html]
|
||||
[Hit test float]
|
||||
expected: FAIL
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
[hit-test-floats-004.html]
|
||||
[Miss float below something else]
|
||||
expected: FAIL
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
[hit-test-anonymous-block.html]
|
||||
[Hit test beside line of text inside anonymous block]
|
||||
expected: FAIL
|
||||
|
|
@ -2,6 +2,3 @@
|
|||
[Hit test intersecting scaled box]
|
||||
expected: FAIL
|
||||
|
||||
[Hit test within unscaled box]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -318,15 +318,12 @@
|
|||
[<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>: combined response Content-Type: text/html */*]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: combined response Content-Type: text/html;x=" text/plain]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: separate response Content-Type: text/plain */*;charset=gbk]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: separate response Content-Type: text/html */*;charset=gbk]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: combined response Content-Type: text/plain;charset=gbk text/html]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -11,9 +11,3 @@
|
|||
[X-Content-Type-Options%3A%20nosniff%2C%2C%40%23%24%23%25%25%26%5E%26%5E*()()11!]
|
||||
expected: FAIL
|
||||
|
||||
[X-Content-Type-Options%3A%20%2Cnosniff]
|
||||
expected: FAIL
|
||||
|
||||
[Content-Type-Options%3A%20nosniff]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
[traverse_the_history_4.html]
|
||||
[Multiple history traversals, last would be aborted]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
[traverse_the_history_5.html]
|
||||
[Multiple history traversals, last would be aborted]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
[sandbox-inherited-from-required-csp.html]
|
||||
[initial empty document]
|
||||
expected: FAIL
|
||||
|
||||
[same-origin]
|
||||
expected: FAIL
|
||||
|
||||
[blob URL]
|
||||
expected: FAIL
|
||||
|
||||
[cross-origin]
|
||||
expected: FAIL
|
||||
|
||||
[about:blank]
|
||||
expected: FAIL
|
||||
|
||||
[srcdoc]
|
||||
expected: FAIL
|
||||
|
|
@ -1,4 +1,5 @@
|
|||
[embedded-opener-remove-frame.html]
|
||||
expected: CRASH
|
||||
[opener of discarded nested browsing context]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
[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]
|
||||
expected: TIMEOUT
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
[iframe_sandbox_popups_nonescaping-3.html]
|
||||
expected: TIMEOUT
|
||||
[Check that popups from a sandboxed iframe do not escape the sandbox]
|
||||
expected: NOTRUN
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -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.html]
|
||||
[default submit action should supersede onclick submit()]
|
||||
expected: FAIL
|
||||
|
|
@ -1,28 +1,7 @@
|
|||
[select-event.html]
|
||||
[input type url: setSelectionRange() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type tel: select() 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: select() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type text: setRangeText() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type password: select() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[textarea: selectionDirection a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type password: selectionEnd out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type tel: setSelectionRange out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
|
@ -38,33 +17,66 @@
|
|||
[input type url: selectionStart out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[textarea: setRangeText() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type tel: setSelectionRange() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type url: selectionDirection a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type tel: selectionEnd a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[textarea: selectionStart out of range 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 text: selectionStart a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type url: selectionStart a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type search: selectionStart a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type url: setSelectionRange out of range a second time (must not fire select)]
|
||||
[textarea: selectionEnd a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type tel: selectionEnd out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type text: selectionEnd a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type tel: setRangeText() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type url: selectionEnd a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type password: setSelectionRange() 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: setSelectionRange 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 tel: selectionDirection a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type search: selectionEnd a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type password: selectionEnd 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
|
||||
|
||||
[input type url: setRangeText() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type password: selectionStart out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[textarea: selectionEnd out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type tel: selectionStart a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
[activation-behavior.window.html]
|
||||
[<a> that is not connected should be followed]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
[empty-assertion-clause.html]
|
||||
expected: ERROR
|
||||
[Test that no error occurs when an empty import assertion clause is provided.]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
[invalid-type-assertion-error.html]
|
||||
[Test that invalid module type assertion leads to TypeError on window.]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
[unsupported-assertion.html]
|
||||
expected: ERROR
|
||||
[Test that no error occurs when an unsupported import assertion is provided.]
|
||||
expected: FAIL
|
||||
|
|
@ -1,4 +1,5 @@
|
|||
[realtimeanalyser-fft-scaling.html]
|
||||
expected: TIMEOUT
|
||||
[X 2048-point FFT peak position is not equal to 64. Got 0.]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -494,3 +494,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\]\t-6.5086735184939384e+23\t9.3139332532882690e-1\t6.5086735184939384e+23\t6.9881041032756614e+23\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 6.5086735184939384e+23 at index of 28696.\n\tMax RelError of 6.9881041032756614e+23 at index of 28696.\n]
|
||||
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\]\t1.1426107475823564e-22\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,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
|
|
@ -128635,6 +128635,19 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"out-of-flow-in-multicolumn-012.html": [
|
||||
"349d059b7a77f9b70046d99bc4a5e26c7c298bad",
|
||||
[
|
||||
null,
|
||||
[
|
||||
[
|
||||
"/css/reference/ref-filled-green-100px-square.xht",
|
||||
"=="
|
||||
]
|
||||
],
|
||||
{}
|
||||
]
|
||||
],
|
||||
"out-of-flow-in-multicolumn-013.html": [
|
||||
"3bf06dfc1a779e3034122987a456fb33b2feb36e",
|
||||
[
|
||||
|
@ -179457,6 +179470,32 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"flex-aspect-ratio-025.html": [
|
||||
"fa9ce8ebce69f02e6b13d9d2233d1e3b46c7f1ab",
|
||||
[
|
||||
null,
|
||||
[
|
||||
[
|
||||
"/css/reference/ref-filled-green-200px-square.html",
|
||||
"=="
|
||||
]
|
||||
],
|
||||
{}
|
||||
]
|
||||
],
|
||||
"flex-aspect-ratio-026.html": [
|
||||
"1df14468632baa8ffd03d690f7ddaa618acd7bf6",
|
||||
[
|
||||
null,
|
||||
[
|
||||
[
|
||||
"/css/reference/ref-filled-green-200px-square.html",
|
||||
"=="
|
||||
]
|
||||
],
|
||||
{}
|
||||
]
|
||||
],
|
||||
"grid-aspect-ratio-001.html": [
|
||||
"ce91fe4e4e8b2bb7f610fb230a292f59188ff95b",
|
||||
[
|
||||
|
@ -314759,7 +314798,7 @@
|
|||
},
|
||||
"support": {
|
||||
"grid-child-utils.js": [
|
||||
"d75ad6eb7061349e5453c204235a172778528f6a",
|
||||
"5e0c5caad12a879e68637b7ba058e44a89eafa01",
|
||||
[]
|
||||
]
|
||||
},
|
||||
|
@ -349117,6 +349156,28 @@
|
|||
[]
|
||||
]
|
||||
},
|
||||
"import-assertions": {
|
||||
"empty-assertion-clause.js": [
|
||||
"6913dd61dffe682063eb887a08c90242ca1b5f42",
|
||||
[]
|
||||
],
|
||||
"empty-type-assertion.js": [
|
||||
"5bb9b1ddb8e648c7165a3b29ab425fc97cb81037",
|
||||
[]
|
||||
],
|
||||
"hello.js": [
|
||||
"2f348444606435700656725dbcd9a08e8e10775f",
|
||||
[]
|
||||
],
|
||||
"invalid-type-assertion.js": [
|
||||
"e28c0176d5c3e444051f7b21070ac62a86f0ff0f",
|
||||
[]
|
||||
],
|
||||
"unsupported-assertion.js": [
|
||||
"45f6d60c9dae25f26640d6b79b08fc9a009fc06b",
|
||||
[]
|
||||
]
|
||||
},
|
||||
"is-module-goal.mjs": [
|
||||
"b533fc2e906b4b9a0a912044b19ee523ae5eef7a",
|
||||
[]
|
||||
|
@ -360540,6 +360601,10 @@
|
|||
"ff333bd97da4c6949a3142ac8789cb2e45d41b86",
|
||||
[]
|
||||
],
|
||||
"create-blob-url-worker.js": [
|
||||
"57e4882c24f7273e3469b9b60649ffa4b4f39617",
|
||||
[]
|
||||
],
|
||||
"echo-content.py": [
|
||||
"70ae4b60254cf7971cdd92dc2b1e382ef1a6196b",
|
||||
[]
|
||||
|
@ -361124,10 +361189,22 @@
|
|||
"8539b40066dd91bbfaf7ef240b8104dcb2ab3b27",
|
||||
[]
|
||||
],
|
||||
"nested-blob-url-worker-created-from-worker.html": [
|
||||
"fc048e288e903e6c558c5518d133f2c2ec96223e",
|
||||
[]
|
||||
],
|
||||
"nested-blob-url-workers.html": [
|
||||
"f0eafcd3e01c3f1857eee7fced78a3a494a8afb4",
|
||||
[]
|
||||
],
|
||||
"nested-iframe-parent.html": [
|
||||
"115ab26e1221024b30313569f484942b10f6dba0",
|
||||
[]
|
||||
],
|
||||
"nested-worker-created-from-blob-url-worker.html": [
|
||||
"3fad2c9228ceb1573a09a18cba480fdd6747cdc4",
|
||||
[]
|
||||
],
|
||||
"nested_load_worker.js": [
|
||||
"ef0ed8fc704ceaa81f1eef8d4ed75fd041baae6d",
|
||||
[]
|
||||
|
@ -361268,6 +361345,10 @@
|
|||
"f088ad127804297cf981e61acb1c33ea7b0620c4",
|
||||
[]
|
||||
],
|
||||
"postmessage-fetched-text.js": [
|
||||
"9fc67171d05dd28d6317e9e2ab986b0b68a7fc15",
|
||||
[]
|
||||
],
|
||||
"postmessage-msgport-to-client-worker.js": [
|
||||
"7af935f4f8fc01756980e46dcce5018ddc620e67",
|
||||
[]
|
||||
|
@ -363349,7 +363430,7 @@
|
|||
[]
|
||||
],
|
||||
"safari-technology-preview.rb": [
|
||||
"c78bcef5c454c0e023c411f09753aedb1b90df0b",
|
||||
"628c5f60914cffa26da7d26d2d9a0502e1be735f",
|
||||
[]
|
||||
],
|
||||
"system_info.yml": [
|
||||
|
@ -363840,11 +363921,11 @@
|
|||
[]
|
||||
],
|
||||
"log.py": [
|
||||
"9e2ad74081e4a1b38b9c3c3ba61d49be2e8151fd",
|
||||
"6551c2b5f7cc0f61a85ef5ffb4bbc466a585b1ab",
|
||||
[]
|
||||
],
|
||||
"manifest.py": [
|
||||
"14d3844d461cd7e0d7a071dd957ad2829885a3c6",
|
||||
"1b4f407b9626be61fca132cd7d0124b4b3d69d7e",
|
||||
[]
|
||||
],
|
||||
"sourcefile.py": [
|
||||
|
@ -363886,7 +363967,7 @@
|
|||
[]
|
||||
],
|
||||
"update.py": [
|
||||
"296533a6babf176e4514bcf3f29e163fdf9a9fdf",
|
||||
"a86ef7c8aa28f1f209f10b7254d1ca07cb17df51",
|
||||
[]
|
||||
],
|
||||
"utils.py": [
|
||||
|
@ -406491,6 +406572,13 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"content-visibility-080.html": [
|
||||
"d3cea5fb83767ddfc236850097387644e0f74c8e",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"inheritance.html": [
|
||||
"e1ae8164de00467a450511da9ca4bf7f138e9c71",
|
||||
[
|
||||
|
@ -430078,7 +430166,7 @@
|
|||
],
|
||||
"parser": {
|
||||
"parser-constructs-custom-element-in-document-write.html": [
|
||||
"3b5256677d0d08f2dac9240df06abc334f577f7c",
|
||||
"14c830b9ba961e701ea39656f42a73cd638e65df",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -460931,6 +461019,13 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"sandbox-inherited-from-required-csp.html": [
|
||||
"d1bc4d1e04d01177943b91893156d715ec2ed15a",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"sandbox-initial-empty-document-toward-same-origin.html": [
|
||||
"d1306c970322682f3979c497a5decd78218ba845",
|
||||
[
|
||||
|
@ -491903,6 +491998,29 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"import-assertions": {
|
||||
"empty-assertion-clause.html": [
|
||||
"3a7c371189c9e847327ac14f49d4ee5153f35295",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"invalid-type-assertion-error.html": [
|
||||
"d3399f085cede5afa124523b43ac6a301b6cb080",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"unsupported-assertion.html": [
|
||||
"edda2d737a3cfa4c39f717f527ed6ad6da6b338d",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
]
|
||||
},
|
||||
"json-module": {
|
||||
"invalid-content-type.tentative.html": [
|
||||
"e6da2db7ebc03ac7753b19dce4e9c3fc38a30014",
|
||||
|
@ -499600,6 +499718,13 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"same-document-with-document-root.html": [
|
||||
"15cb7c4cbc278079b15da8af6bfa11a2d6ad3ddc",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"same-document-zero-size-target.html": [
|
||||
"20bd11d4beb1e8bdd623eaad96f11788747f0d15",
|
||||
[
|
||||
|
@ -512440,7 +512565,7 @@
|
|||
]
|
||||
],
|
||||
"pointerevent_auxclick_is_a_pointerevent.html": [
|
||||
"000d0df764e53f8d1cfa629ebfcccfb768a7a4bf",
|
||||
"aac73db9eb7c5f5a7c71207e52eab30bf53f3526",
|
||||
[
|
||||
null,
|
||||
{
|
||||
|
@ -512503,7 +512628,7 @@
|
|||
]
|
||||
],
|
||||
"pointerevent_click_is_a_pointerevent.html": [
|
||||
"dfea148898e4eed29f25e9bf04067a6e7e251b25",
|
||||
"2f5dfd4dbfdd81e45868517632a41998aed8f21d",
|
||||
[
|
||||
null,
|
||||
{
|
||||
|
@ -530641,6 +530766,13 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"nested-blob-url-workers.https.html": [
|
||||
"7269cbb701fabc2faa746f6ed47fba8fa9d423c8",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"next-hop-protocol.https.html": [
|
||||
"7a907438d5d9f0b3ba1e198e048ea0b2e86a2415",
|
||||
[
|
||||
|
@ -540914,7 +541046,7 @@
|
|||
]
|
||||
],
|
||||
"SVGAnimatedEnumeration-SVGFECompositeElement.html": [
|
||||
"e6315b434504e754872dd460988187957efbfb07",
|
||||
"0e99f5fe9cb3335f54591d75e75bffdc0262d0d2",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -565379,7 +565511,7 @@
|
|||
]
|
||||
],
|
||||
"event-timeout.any.js": [
|
||||
"da8ca11bb8ea1a8ef673be20ae2de8715a4d1130",
|
||||
"c73cd1a48540511a5f527b49668aac18e5330169",
|
||||
[
|
||||
"xhr/event-timeout.any.html",
|
||||
{
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
[hit-test-floats-002.html]
|
||||
[Hit test float]
|
||||
expected: FAIL
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
[hit-test-floats-004.html]
|
||||
[Miss float below something else]
|
||||
expected: FAIL
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
[hit-test-anonymous-block.html]
|
||||
[Hit test beside line of text inside anonymous block]
|
||||
expected: FAIL
|
||||
|
|
@ -2,6 +2,3 @@
|
|||
[Hit test intersecting scaled box]
|
||||
expected: FAIL
|
||||
|
||||
[Hit test within unscaled box]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -318,15 +318,12 @@
|
|||
[<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>: combined response Content-Type: text/html */*]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: combined response Content-Type: text/html;x=" text/plain]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: separate response Content-Type: text/plain */*;charset=gbk]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: separate response Content-Type: text/html */*;charset=gbk]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: combined response Content-Type: text/plain;charset=gbk text/html]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -11,9 +11,3 @@
|
|||
[X-Content-Type-Options%3A%20nosniff%2C%2C%40%23%24%23%25%25%26%5E%26%5E*()()11!]
|
||||
expected: FAIL
|
||||
|
||||
[X-Content-Type-Options%3A%20%2Cnosniff]
|
||||
expected: FAIL
|
||||
|
||||
[Content-Type-Options%3A%20nosniff]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
[traverse_the_history_4.html]
|
||||
[Multiple history traversals, last would be aborted]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
[traverse_the_history_5.html]
|
||||
[Multiple history traversals, last would be aborted]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
[sandbox-inherited-from-required-csp.html]
|
||||
[initial empty document]
|
||||
expected: FAIL
|
||||
|
||||
[same-origin]
|
||||
expected: FAIL
|
||||
|
||||
[blob URL]
|
||||
expected: FAIL
|
||||
|
||||
[cross-origin]
|
||||
expected: FAIL
|
||||
|
||||
[about:blank]
|
||||
expected: FAIL
|
||||
|
||||
[srcdoc]
|
||||
expected: FAIL
|
||||
|
|
@ -1,4 +1,5 @@
|
|||
[embedded-opener-remove-frame.html]
|
||||
expected: CRASH
|
||||
[opener and "removed" embedded documents]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
[iframe_sandbox_popups_escaping-3.html]
|
||||
type: testharness
|
||||
expected: TIMEOUT
|
||||
[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,4 @@
|
|||
[iframe_sandbox_popups_nonescaping-3.html]
|
||||
expected: TIMEOUT
|
||||
[Check that popups from a sandboxed iframe do not escape the sandbox]
|
||||
expected: NOTRUN
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -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.html]
|
||||
[default submit action should supersede onclick submit()]
|
||||
expected: FAIL
|
||||
|
|
@ -1,28 +1,7 @@
|
|||
[select-event.html]
|
||||
[input type url: setSelectionRange() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type tel: select() 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: select() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type text: setRangeText() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type password: select() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[textarea: selectionDirection a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type password: selectionEnd out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type tel: setSelectionRange out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
|
@ -38,33 +17,66 @@
|
|||
[input type url: selectionStart out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[textarea: setRangeText() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type tel: setSelectionRange() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type url: selectionDirection a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type tel: selectionEnd a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[textarea: selectionStart out of range 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 text: selectionStart a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type url: selectionStart a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type search: selectionStart a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type url: setSelectionRange out of range a second time (must not fire select)]
|
||||
[textarea: selectionEnd a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type tel: selectionEnd out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type text: selectionEnd a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type tel: setRangeText() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type url: selectionEnd a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type password: setSelectionRange() 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: setSelectionRange 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 tel: selectionDirection a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type search: selectionEnd a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type password: selectionEnd 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
|
||||
|
||||
[input type url: setRangeText() a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type password: selectionStart out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[textarea: selectionEnd out of range a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
[input type tel: selectionStart a second time (must not fire select)]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
[activation-behavior.window.html]
|
||||
[<a> that is not connected should be followed]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
[empty-assertion-clause.html]
|
||||
expected: ERROR
|
||||
[Test that no error occurs when an empty import assertion clause is provided.]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
[invalid-type-assertion-error.html]
|
||||
[Test that invalid module type assertion leads to TypeError on window.]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
[unsupported-assertion.html]
|
||||
expected: ERROR
|
||||
[Test that no error occurs when an unsupported import assertion is provided.]
|
||||
expected: FAIL
|
||||
|
|
@ -1,4 +1,5 @@
|
|||
[realtimeanalyser-fft-scaling.html]
|
||||
expected: TIMEOUT
|
||||
[X 2048-point FFT peak position is not equal to 64. Got 0.]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -722,3 +722,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\]\t-6.5086735184939384e+23\t9.3139332532882690e-1\t6.5086735184939384e+23\t6.9881041032756614e+23\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 6.5086735184939384e+23 at index of 28696.\n\tMax RelError of 6.9881041032756614e+23 at index of 28696.\n]
|
||||
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\]\t1.1426107475823564e-22\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,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,39 @@
|
|||
<!DOCTYPE html>
|
||||
<link rel="help" href="href=https://www.w3.org/TR/css-position-3/#abspos-breaking">
|
||||
<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
|
||||
<!-- Fragmented OOF with `height: auto`, positioned with the bottom property and
|
||||
the second child fragment has a 'break-inside: avoid'. The abspos fragment
|
||||
should still encompass its children completely despite the break. -->
|
||||
<style>
|
||||
#multicol {
|
||||
column-count: 2;
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
column-fill: auto;
|
||||
column-gap: 0px;
|
||||
background-color: red;
|
||||
}
|
||||
.rel {
|
||||
position: relative;
|
||||
height: 190px;
|
||||
width: 50px;
|
||||
}
|
||||
.abs {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
width: 50px;
|
||||
background-color: green;
|
||||
}
|
||||
</style>
|
||||
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
|
||||
<div id="multicol">
|
||||
<div class="rel">
|
||||
<!-- The abspos computed height is 190px, but because it has to encompass
|
||||
all its children, it will be 200px. -->
|
||||
<div class="abs">
|
||||
<div style="height: 90px;"></div>
|
||||
<div style="height: 50px; break-inside: avoid;"></div>
|
||||
<div style="height: 50px;"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
|
@ -0,0 +1,31 @@
|
|||
<!doctype HTML>
|
||||
<html id=html>
|
||||
<meta charset="utf8">
|
||||
<title>Content Visibility: caret position with html hidden</title>
|
||||
<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
|
||||
<link rel="help" href="https://drafts.csswg.org/css-contain/#content-visibility">
|
||||
<meta name="assert" content="caretRangeFromPoint works even if html has content-visibility hidden">
|
||||
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
|
||||
<meter></meter>
|
||||
<iframe></iframe>
|
||||
<style>
|
||||
* {
|
||||
all: initial;
|
||||
content-visibility: hidden;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
test(() => {
|
||||
const range = document.caretRangeFromPoint();
|
||||
assert_not_equals(range, null, "range exists");
|
||||
assert_equals(range.startContainer, html, "startContainer is html");
|
||||
assert_equals(range.startOffset, 0, "startOffset is zero");
|
||||
assert_equals(range.endContainer, html, "endContainer is html");
|
||||
assert_equals(range.endOffset, 0, "endOffset is zero");
|
||||
}, "Caret range from point");
|
||||
</script>
|
||||
</html>
|
|
@ -5,7 +5,7 @@ const gridChildHelperRow = "row";
|
|||
const gridChildHelperCol = "col";
|
||||
|
||||
// Helper for building testcases for grid-template-* with a child div in
|
||||
// multiple positions. Prop is expected ot be one of gridChildHelperRow or
|
||||
// multiple positions. Prop is expected to be one of gridChildHelperRow or
|
||||
// gridChildHelperCol, to select testing grid rows or grid columns,
|
||||
// respectively.
|
||||
// The child div is found by the id of 'child'.
|
||||
|
|
|
@ -0,0 +1,73 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<title>CSS aspect-ratio: Test flex item's resolved width/min-width with border-box box-sizing in a row flex container</title>
|
||||
<link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com">
|
||||
<link rel="author" title="Mozilla" href="https://www.mozilla.org/">
|
||||
<link rel="help" href="https://drafts.csswg.org/css-sizing-4/#aspect-ratio">
|
||||
<link rel="match" href="../../reference/ref-filled-green-200px-square.html" />
|
||||
<style>
|
||||
.flexContainer {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
width: 1px;
|
||||
}
|
||||
.item {
|
||||
background: green;
|
||||
padding-top: 15px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
</style>
|
||||
|
||||
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
|
||||
|
||||
<!-- In the following four flex containers, the aspect-ratio works with border-box. -->
|
||||
<div class="flexContainer" style="width: auto;">
|
||||
<!-- The border-box height 25px is transferred to the main axis,
|
||||
yielding a resolved flex base size of 200px. -->
|
||||
<div class="item" style="min-width:0; height: 25px; aspect-ratio: 8/1;"></div>
|
||||
</div>
|
||||
|
||||
<div class="flexContainer">
|
||||
<!-- The border-box height 25px is transferred to the main axis,
|
||||
yielding a resolved min-width:auto of 200px. -->
|
||||
<div class="item" style="height: 25px; aspect-ratio: 8/1;"></div>
|
||||
</div>
|
||||
|
||||
<div class="flexContainer">
|
||||
<!-- The border-box min-height 25px is transferred to the main axis,
|
||||
yielding a resolved min-width:auto of 200px. -->
|
||||
<div class="item" style="min-height: 25px; aspect-ratio: 8/1;"></div>
|
||||
</div>
|
||||
|
||||
<div class="flexContainer">
|
||||
<!-- The border-box height 25px (clamped by max-height) is transferred to the main axis,
|
||||
yielding a resolved min-width:auto of 200px. -->
|
||||
<div class="item" style="max-height: 25px; height: 100px; aspect-ratio: 8/1;"></div>
|
||||
</div>
|
||||
|
||||
<!-- In the following four flex containers, the aspect-ratio works with content-box
|
||||
because its value contains 'auto'. -->
|
||||
<div class="flexContainer" style="width: auto;">
|
||||
<!-- The content-box height 10px is transferred to the main axis,
|
||||
yielding a resolved flex base size of 200px. -->
|
||||
<div class="item" style="min-width:0; height: 25px; aspect-ratio: auto 20/1;"></div>
|
||||
</div>
|
||||
|
||||
<div class="flexContainer">
|
||||
<!-- The content-box height 10px is transferred to the main axis,
|
||||
yielding a resolved min-width:auto of 200px. -->
|
||||
<div class="item" style="height: 25px; aspect-ratio: auto 20/1;"></div>
|
||||
</div>
|
||||
|
||||
<div class="flexContainer">
|
||||
<!-- The content-box min-height 10px is transferred to the main axis,
|
||||
yielding a resolved min-width:auto of 200px. -->
|
||||
<div class="item" style="min-height: 25px; aspect-ratio: auto 20/1;"></div>
|
||||
</div>
|
||||
|
||||
<div class="flexContainer">
|
||||
<!-- The content-box height 10px (clamped by max-height) is transferred
|
||||
to the main axis, yielding a resolved min-width:auto of 200px. -->
|
||||
<div class="item" style="max-height: 25px; height: 100px; aspect-ratio: auto 20/1;"></div>
|
||||
</div>
|
||||
</html>
|
|
@ -0,0 +1,77 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<title>CSS aspect-ratio: Test flex item's resolved height/min-height with border-box box-sizing in a column flex container</title>
|
||||
<link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com">
|
||||
<link rel="author" title="Mozilla" href="https://www.mozilla.org/">
|
||||
<link rel="help" href="https://drafts.csswg.org/css-sizing-4/#aspect-ratio">
|
||||
<link rel="match" href="../../reference/ref-filled-green-200px-square.html" />
|
||||
<style>
|
||||
.flexContainer {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
float: left;
|
||||
height: 1px;
|
||||
}
|
||||
.item {
|
||||
background: green;
|
||||
padding-left: 15px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.item > div {
|
||||
height: 500px; /* Set a large content size suggestion for flex item. */
|
||||
}
|
||||
</style>
|
||||
|
||||
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
|
||||
|
||||
<!-- In the following four flex containers, the aspect-ratio works with border-box. -->
|
||||
<div class="flexContainer" style="height: auto;">
|
||||
<!-- The border-box width 25px is transferred to the main axis,
|
||||
yielding a resolved flex base size of 200px. -->
|
||||
<div class="item" style="min-height:0; width: 25px; aspect-ratio: 1/8;"><div></div></div>
|
||||
</div>
|
||||
|
||||
<div class="flexContainer">
|
||||
<!-- The border-box width 25px is transferred to the main axis,
|
||||
yielding a resolved min-height:auto of 200px. -->
|
||||
<div class="item" style="width: 25px; aspect-ratio: 1/8;"><div></div></div>
|
||||
</div>
|
||||
|
||||
<div class="flexContainer">
|
||||
<!-- The border-box min-width 25px is transferred to the main axis,
|
||||
yielding a resolved min-height:auto of 200px. -->
|
||||
<div class="item" style="min-width: 25px; aspect-ratio: 1/8;"><div></div></div>
|
||||
</div>
|
||||
|
||||
<div class="flexContainer">
|
||||
<!-- The border-box width 25px (clamped by max-width) is transferred to the main axis,
|
||||
yielding a resolved min-height:auto of 200px. -->
|
||||
<div class="item" style="max-width: 25px; width: 100px; aspect-ratio: 1/8;"><div></div></div>
|
||||
</div>
|
||||
|
||||
<!-- In the following four flex containers, the aspect-ratio works with content-box
|
||||
because its value contains 'auto'. -->
|
||||
<div class="flexContainer" style="height: auto;">
|
||||
<!-- The content-box width 10px is transferred to the main axis,
|
||||
yielding a resolved flex base size of 200px. -->
|
||||
<div class="item" style="min-height:0; width: 25px; aspect-ratio: auto 1/20;"><div></div></div>
|
||||
</div>
|
||||
|
||||
<div class="flexContainer">
|
||||
<!-- The content-box width 10px is transferred to the main axis,
|
||||
yielding a resolved min-height:auto of 200px. -->
|
||||
<div class="item" style="width: 25px; aspect-ratio: auto 1/20;"><div></div></div>
|
||||
</div>
|
||||
|
||||
<div class="flexContainer">
|
||||
<!-- The content-box min-width 10px is transferred to the main axis,
|
||||
yielding a resolved min-height:auto of 200px. -->
|
||||
<div class="item" style="min-width: 25px; aspect-ratio: auto 1/20;"><div></div></div>
|
||||
</div>
|
||||
|
||||
<div class="flexContainer">
|
||||
<!-- The content-box width 10px (clamped by max-width) is transferred to the main axis,
|
||||
yielding a resolved min-height:auto of 200px. -->
|
||||
<div class="item" style="max-width: 25px; width: 100px; aspect-ratio: auto 1/20;"><div></div></div>
|
||||
</div>
|
||||
</html>
|
|
@ -14,10 +14,16 @@
|
|||
<div id="log"></div>
|
||||
<script>
|
||||
|
||||
class MyCustomElement extends HTMLElement { }
|
||||
var numberOfChildNodesInConnectedCallback = 0;
|
||||
|
||||
class MyCustomElement extends HTMLElement {
|
||||
connectedCallback() {
|
||||
numberOfChildNodesInConnectedCallback = this.childNodes.length;
|
||||
}
|
||||
}
|
||||
customElements.define('my-custom-element', MyCustomElement);
|
||||
|
||||
document.write('<my-custom-element></my-custom-element>');
|
||||
document.write('<my-custom-element>hello <b>world</b></my-custom-element>');
|
||||
|
||||
test(function () {
|
||||
var instance = document.querySelector('my-custom-element');
|
||||
|
@ -27,6 +33,11 @@ test(function () {
|
|||
|
||||
}, 'HTML parser must instantiate custom elements inside document.write');
|
||||
|
||||
test(function () {
|
||||
assert_equals(numberOfChildNodesInConnectedCallback, 0);
|
||||
|
||||
}, 'HTML parser should call connectedCallback before appending child nodes inside document.write');
|
||||
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -0,0 +1,141 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset=utf-8>
|
||||
<title>Inherit sandbox from CSP embedded enforcement</title>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/common/get-host-info.sub.js"></script>
|
||||
<body>
|
||||
<script>
|
||||
// Check sandbox flags are properly defined when its parent requires them and
|
||||
// the child allows it.
|
||||
|
||||
const same_origin = get_host_info().HTTPS_ORIGIN;
|
||||
const cross_origin = get_host_info().HTTPS_REMOTE_ORIGIN;
|
||||
const check_sandbox_url =
|
||||
"/html/browsers/sandboxing/resources/check-sandbox-flags.html?pipe=";
|
||||
const allow_csp_from_star = "|header(Allow-CSP-From,*)";
|
||||
|
||||
// Return a promise, resolving when |element| triggers |event_name| event.
|
||||
const future = (element, event_name) => {
|
||||
return new Promise(resolve => {
|
||||
element.addEventListener(event_name, event => resolve(event))
|
||||
});
|
||||
};
|
||||
|
||||
const check_sandbox_script = `
|
||||
try {
|
||||
document.domain = document.domain;
|
||||
parent.postMessage("document-domain-is-allowed", "*");
|
||||
} catch (exception) {
|
||||
parent.postMessage("document-domain-is-disallowed", "*");
|
||||
}
|
||||
`;
|
||||
|
||||
const sandbox_policy = "sandbox allow-scripts allow-same-origin";
|
||||
|
||||
promise_test(async test => {
|
||||
const iframe = document.createElement("iframe");
|
||||
iframe.csp = sandbox_policy;
|
||||
|
||||
// The <iframe> immediately hosts the initial empty document after being
|
||||
// appended into the DOM. It will, as long as its 'src' isn't loaded. That's
|
||||
// why a page do not load is being used.
|
||||
iframe.src = "/fetch/api/resources/infinite-slow-response.py";
|
||||
document.body.appendChild(iframe);
|
||||
|
||||
const iframe_reply = future(window, "message");
|
||||
iframe.contentWindow.location =
|
||||
`javascript:${encodeURI(check_sandbox_script)}`;
|
||||
const result = await iframe_reply;
|
||||
iframe.remove();
|
||||
|
||||
assert_equals(result.data, "document-domain-is-not-allowed");
|
||||
}, "initial empty document");
|
||||
|
||||
promise_test(async test => {
|
||||
const iframe = document.createElement("iframe");
|
||||
iframe.src = "data:text/html,dummy";
|
||||
|
||||
const iframe_load_1 = future(iframe, "load");
|
||||
document.body.appendChild(iframe);
|
||||
await iframe_load_1;
|
||||
|
||||
const iframe_load_2 = future(iframe, "load");
|
||||
iframe.csp = sandbox_policy;
|
||||
iframe.src = "about:blank";
|
||||
await iframe_load_2;
|
||||
|
||||
const iframe_reply = future(window, "message");
|
||||
iframe.contentWindow.location =
|
||||
`javascript:${encodeURI(check_sandbox_script)}`;
|
||||
const result = await iframe_reply;
|
||||
|
||||
assert_equals(result.data, "document-domain-is-not-allowed");
|
||||
}, "about:blank");
|
||||
|
||||
promise_test(async test => {
|
||||
const iframe = document.createElement("iframe");
|
||||
iframe.csp = sandbox_policy;
|
||||
iframe.src =
|
||||
`data:text/html,<script>${encodeURI(check_sandbox_script)}</scr`+`ipt>`;
|
||||
|
||||
const iframe_reply = future(window, "message");
|
||||
document.body.appendChild(iframe);
|
||||
const result = await iframe_reply;
|
||||
|
||||
assert_equals(result.data, "document-domain-is-disallowed");
|
||||
}, "data-url");
|
||||
|
||||
promise_test(async test => {
|
||||
const iframe = document.createElement("iframe");
|
||||
iframe.csp = sandbox_policy;
|
||||
iframe.srcdoc = `<script>${check_sandbox_script}</scr`+`ipt>`;
|
||||
|
||||
const iframe_reply = future(window, "message");
|
||||
document.body.appendChild(iframe);
|
||||
const result = await iframe_reply;
|
||||
|
||||
assert_equals(result.data, "document-domain-is-not-allowed");
|
||||
}, "srcdoc");
|
||||
|
||||
promise_test(async test => {
|
||||
const iframe = document.createElement("iframe");
|
||||
iframe.csp = sandbox_policy;
|
||||
|
||||
const blob = new Blob(
|
||||
[ `<script>${check_sandbox_script}</scr`+`ipt>` ], { type: "text/html" });
|
||||
|
||||
iframe.src = URL.createObjectURL(blob);
|
||||
|
||||
const iframe_reply = future(window, "message");
|
||||
document.body.appendChild(iframe);
|
||||
const result = await iframe_reply;
|
||||
|
||||
assert_equals(result.data, "document-domain-is-disallowed");
|
||||
}, "blob URL");
|
||||
|
||||
promise_test(async test => {
|
||||
const iframe = document.createElement("iframe");
|
||||
iframe.csp = sandbox_policy;
|
||||
iframe.src = same_origin + check_sandbox_url + allow_csp_from_star;
|
||||
|
||||
const iframe_reply = future(window, "message");
|
||||
document.body.appendChild(iframe);
|
||||
const result = await iframe_reply;
|
||||
|
||||
assert_equals(result.data, "document-domain-is-disallowed");
|
||||
}, "same-origin");
|
||||
|
||||
promise_test(async test => {
|
||||
const iframe = document.createElement("iframe");
|
||||
iframe.csp = sandbox_policy;
|
||||
iframe.src = cross_origin + check_sandbox_url + allow_csp_from_star;
|
||||
|
||||
const iframe_reply = future(window, "message");
|
||||
document.body.appendChild(iframe);
|
||||
const result = await iframe_reply;
|
||||
|
||||
assert_equals(result.data, "document-domain-is-disallowed");
|
||||
}, "cross-origin");
|
||||
|
||||
</script>
|
|
@ -0,0 +1,19 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Handling of empty import assertion clause</title>
|
||||
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script>
|
||||
window.log = [];
|
||||
|
||||
window.addEventListener("error", ev => log.push(ev.error));
|
||||
|
||||
const test_load = async_test(
|
||||
"Test that no error occurs when an empty import assertion clause is provided.");
|
||||
window.addEventListener("load", test_load.step_func_done(ev => {
|
||||
assert_array_equals(window.log, ["hello", "empty-assertion-clause"]);
|
||||
}));
|
||||
|
||||
function unreachable() { log.push("unexpected"); }
|
||||
</script>
|
||||
<script type="module" src="./empty-assertion-clause.js" onerror="unreachable()"></script>
|
|
@ -0,0 +1,2 @@
|
|||
import "./hello.js" assert { };
|
||||
log.push("empty-assertion-clause");
|
|
@ -0,0 +1,2 @@
|
|||
import "./hello.js#2" assert { type: "" };
|
||||
log.push("empty-type-assertion");
|
|
@ -0,0 +1 @@
|
|||
log.push("hello");
|
|
@ -0,0 +1,24 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Handling of invalid module type import assertions</title>
|
||||
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script>
|
||||
setup({allow_uncaught_exception: true});
|
||||
|
||||
window.log = [];
|
||||
|
||||
window.addEventListener("error", ev => log.push(ev.error));
|
||||
|
||||
const test_load = async_test(
|
||||
"Test that invalid module type assertion leads to TypeError on window.");
|
||||
window.addEventListener("load", test_load.step_func_done(ev => {
|
||||
assert_equals(log.length, 2);
|
||||
assert_equals(log[0].constructor, TypeError);
|
||||
assert_equals(log[1].constructor, TypeError);
|
||||
}));
|
||||
|
||||
function unreachable() { log.push("unexpected"); }
|
||||
</script>
|
||||
<script type="module" src="./invalid-type-assertion.js" onerror="unreachable()"></script>
|
||||
<script type="module" src="./empty-type-assertion.js" onerror="unreachable()"></script>
|
|
@ -0,0 +1,2 @@
|
|||
import "./hello.js#1" assert { type: "notARealType" };
|
||||
log.push("invalid-type-assertion");
|
|
@ -0,0 +1,19 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Handling of unsupported assertion</title>
|
||||
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script>
|
||||
window.log = [];
|
||||
|
||||
window.addEventListener("error", ev => log.push(ev.error));
|
||||
|
||||
const test_load = async_test(
|
||||
"Test that no error occurs when an unsupported import assertion is provided.");
|
||||
window.addEventListener("load", test_load.step_func_done(ev => {
|
||||
assert_array_equals(window.log, ["hello", "unsupported-assertion"]);
|
||||
}));
|
||||
|
||||
function unreachable() { log.push("unexpected"); }
|
||||
</script>
|
||||
<script type="module" src="./unsupported-assertion.js" onerror="unreachable()"></script>
|
|
@ -0,0 +1,2 @@
|
|||
import "./hello.js" assert { unsupportedAssertionKey: "unsupportedAssertionValue" };
|
||||
log.push("unsupported-assertion");
|
|
@ -0,0 +1,60 @@
|
|||
<!DOCTYPE html>
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="./resources/intersection-observer-test-utils.js"></script>
|
||||
|
||||
<style>
|
||||
pre,
|
||||
#log {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 200px;
|
||||
}
|
||||
|
||||
.spacer {
|
||||
height: calc(100vh + 100px);
|
||||
}
|
||||
|
||||
#target {
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
background-color: green;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div class="spacer"></div>
|
||||
<div id="target"></div>
|
||||
<div class="spacer"></div>
|
||||
|
||||
<script>
|
||||
var vw = document.documentElement.clientWidth;
|
||||
var vh = document.documentElement.clientHeight;
|
||||
|
||||
var entries = [];
|
||||
var target;
|
||||
|
||||
runTestCycle(function () {
|
||||
target = document.getElementById("target");
|
||||
assert_true(!!target, "target exists");
|
||||
var observer = new IntersectionObserver(function (changes) {
|
||||
entries = entries.concat(changes)
|
||||
}, {root: document});
|
||||
observer.observe(target);
|
||||
entries = entries.concat(observer.takeRecords());
|
||||
assert_equals(entries.length, 0, "No initial notifications.");
|
||||
runTestCycle(step0, "First rAF.");
|
||||
}, "IntersectionObserver in a single document using document as root.");
|
||||
|
||||
function step0() {
|
||||
document.scrollingElement.scrollTop = 300;
|
||||
runTestCycle(step1, "document.scrollingElement.scrollTop = 300");
|
||||
checkLastEntry(entries, 0, [8, 108, vh + 108, vh + 208, 0, 0, 0, 0, 0, vw, 0, vh, false]);
|
||||
}
|
||||
|
||||
function step1() {
|
||||
document.scrollingElement.scrollTop = 0;
|
||||
checkLastEntry(entries, 1, [8, 108, vh - 192, vh - 92, 8, 108, vh - 192, vh - 92, 0, vw, 0, vh, true]);
|
||||
}
|
||||
</script>
|
||||
|
|
@ -31,7 +31,7 @@ function testFunction(test){
|
|||
|
||||
function run_test(pointerType){
|
||||
promise_test((test) => new Promise((resolve, reject) => {
|
||||
const testPointer = "TestPointer";
|
||||
const testPointer = pointerType + "TestPointer";
|
||||
let auxclickFunc = testFunction(test);
|
||||
test.add_cleanup(() => {
|
||||
target.removeEventListener("auxclick", auxclickFunc);
|
||||
|
|
|
@ -31,7 +31,7 @@ function testFunction(test){
|
|||
|
||||
function run_test(pointerType){
|
||||
promise_test((test) => new Promise((resolve, reject) => {
|
||||
const testPointer = "TestPointer";
|
||||
const testPointer = pointerType + "TestPointer";
|
||||
let clickFunc = testFunction(test);
|
||||
test.add_cleanup(() => {
|
||||
target.removeEventListener("click", clickFunc);
|
||||
|
|
|
@ -0,0 +1,42 @@
|
|||
<!doctype html>
|
||||
<meta charset=utf-8>
|
||||
<title>Service Worker: nested blob URL worker clients</title>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="resources/test-helpers.sub.js"></script>
|
||||
<body>
|
||||
<script>
|
||||
|
||||
const SCRIPT = 'resources/simple-intercept-worker.js';
|
||||
const SCOPE = 'resources/';
|
||||
const RESOURCE = 'resources/simple.txt';
|
||||
|
||||
promise_test((t) => {
|
||||
return runTest(t, 'resources/nested-blob-url-workers.html');
|
||||
}, 'Nested blob URL workers should be intercepted by a service worker.');
|
||||
|
||||
promise_test((t) => {
|
||||
return runTest(t, 'resources/nested-worker-created-from-blob-url-worker.html');
|
||||
}, 'Nested worker created from a blob URL worker should be intercepted by a service worker.');
|
||||
|
||||
promise_test((t) => {
|
||||
return runTest(t, 'resources/nested-blob-url-worker-created-from-worker.html');
|
||||
}, 'Nested blob URL worker created from a worker should be intercepted by a service worker.');
|
||||
|
||||
async function runTest(t, iframe_url) {
|
||||
const reg = await service_worker_unregister_and_register(t, SCRIPT, SCOPE);
|
||||
t.add_cleanup(_ => reg.unregister());
|
||||
await wait_for_state(t, reg.installing, 'activated');
|
||||
|
||||
const frame = await with_iframe(iframe_url);
|
||||
t.add_cleanup(_ => frame.remove());
|
||||
assert_not_equals(frame.contentWindow.navigator.serviceWorker.controller,
|
||||
null, 'frame should be controlled');
|
||||
|
||||
const response_text = await frame.contentWindow.fetch_in_worker(RESOURCE);
|
||||
assert_equals(response_text, 'intercepted by service worker',
|
||||
'fetch() should be intercepted.');
|
||||
}
|
||||
|
||||
</script>
|
||||
</body>
|
|
@ -0,0 +1,22 @@
|
|||
const childWorkerScript = `
|
||||
self.onmessage = async (e) => {
|
||||
const response = await fetch(e.data);
|
||||
const text = await response.text();
|
||||
self.postMessage(text);
|
||||
};
|
||||
`;
|
||||
const blob = new Blob([childWorkerScript], { type: 'text/javascript' });
|
||||
const blobUrl = URL.createObjectURL(blob);
|
||||
const childWorker = new Worker(blobUrl);
|
||||
|
||||
// When a message comes from the parent frame, sends a resource url to the child
|
||||
// worker.
|
||||
self.onmessage = (e) => {
|
||||
childWorker.postMessage(e.data);
|
||||
};
|
||||
|
||||
// When a message comes from the child worker, sends a content of fetch() to the
|
||||
// parent frame.
|
||||
childWorker.onmessage = (e) => {
|
||||
self.postMessage(e.data);
|
||||
};
|
|
@ -0,0 +1,16 @@
|
|||
<!doctype html>
|
||||
<script>
|
||||
const baseLocation = window.location;
|
||||
const workerUrl = new URL('create-blob-url-worker.js', baseLocation).href;
|
||||
const worker = new Worker(workerUrl);
|
||||
|
||||
function fetch_in_worker(url) {
|
||||
const resourceUrl = new URL(url, baseLocation).href;
|
||||
return new Promise((resolve) => {
|
||||
worker.onmessage = (event) => {
|
||||
resolve(event.data);
|
||||
};
|
||||
worker.postMessage(resourceUrl);
|
||||
});
|
||||
}
|
||||
</script>
|
|
@ -0,0 +1,38 @@
|
|||
<!doctype html>
|
||||
<script>
|
||||
const baseLocation = window.location;
|
||||
const parentWorkerScript = `
|
||||
const childWorkerScript = 'self.onmessage = async (e) => {' +
|
||||
' const response = await fetch(e.data);' +
|
||||
' const text = await response.text();' +
|
||||
' self.postMessage(text);' +
|
||||
'};';
|
||||
const blob = new Blob([childWorkerScript], { type: 'text/javascript' });
|
||||
const blobUrl = URL.createObjectURL(blob);
|
||||
const childWorker = new Worker(blobUrl);
|
||||
|
||||
// When a message comes from the parent frame, sends a resource url to the
|
||||
// child worker.
|
||||
self.onmessage = (e) => {
|
||||
childWorker.postMessage(e.data);
|
||||
};
|
||||
// When a message comes from the child worker, sends a content of fetch() to
|
||||
// the parent frame.
|
||||
childWorker.onmessage = (e) => {
|
||||
self.postMessage(e.data);
|
||||
};
|
||||
`;
|
||||
const blob = new Blob([parentWorkerScript], { type: 'text/javascript' });
|
||||
const blobUrl = URL.createObjectURL(blob);
|
||||
const worker = new Worker(blobUrl);
|
||||
|
||||
function fetch_in_worker(url) {
|
||||
const resourceUrl = new URL(url, baseLocation).href;
|
||||
return new Promise((resolve) => {
|
||||
worker.onmessage = (event) => {
|
||||
resolve(event.data);
|
||||
};
|
||||
worker.postMessage(resourceUrl);
|
||||
});
|
||||
}
|
||||
</script>
|
|
@ -0,0 +1,33 @@
|
|||
<!doctype html>
|
||||
<script>
|
||||
const baseLocation = window.location;
|
||||
const parentWorkerScript = `
|
||||
const workerUrl =
|
||||
new URL('postmessage-fetched-text.js', '${baseLocation}').href;
|
||||
const childWorker = new Worker(workerUrl);
|
||||
|
||||
// When a message comes from the parent frame, sends a resource url to the
|
||||
// child worker.
|
||||
self.onmessage = (e) => {
|
||||
childWorker.postMessage(e.data);
|
||||
};
|
||||
// When a message comes from the child worker, sends a content of fetch() to
|
||||
// the parent frame.
|
||||
childWorker.onmessage = (e) => {
|
||||
self.postMessage(e.data);
|
||||
};
|
||||
`;
|
||||
const blob = new Blob([parentWorkerScript], { type: 'text/javascript' });
|
||||
const blobUrl = URL.createObjectURL(blob);
|
||||
const worker = new Worker(blobUrl);
|
||||
|
||||
function fetch_in_worker(url) {
|
||||
const resourceUrl = new URL(url, baseLocation).href;
|
||||
return new Promise((resolve) => {
|
||||
worker.onmessage = (event) => {
|
||||
resolve(event.data);
|
||||
};
|
||||
worker.postMessage(resourceUrl);
|
||||
});
|
||||
}
|
||||
</script>
|
|
@ -0,0 +1,5 @@
|
|||
self.onmessage = async (e) => {
|
||||
const response = await fetch(e.data);
|
||||
const text = await response.text();
|
||||
self.postMessage(text);
|
||||
};
|
|
@ -34,13 +34,18 @@ test(function() {
|
|||
assert_equals(feCompositeElement.operator.baseVal, SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_XOR);
|
||||
assert_equals(feCompositeElement.getAttribute('operator'), "xor");
|
||||
|
||||
// Switch to 'lighter'.
|
||||
feCompositeElement.operator.baseVal = SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_LIGHTER;
|
||||
assert_equals(feCompositeElement.operator.baseVal, SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_LIGHTER);
|
||||
assert_equals(feCompositeElement.getAttribute('operator'), "lighter");
|
||||
|
||||
// Switch to 'arithmetic'.
|
||||
feCompositeElement.operator.baseVal = SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_ARITHMETIC;
|
||||
assert_equals(feCompositeElement.operator.baseVal, SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_ARITHMETIC);
|
||||
assert_equals(feCompositeElement.getAttribute('operator'), "arithmetic");
|
||||
|
||||
// Try setting invalid values.
|
||||
assert_throws_js(TypeError, function() { feCompositeElement.operator.baseVal = 7; });
|
||||
assert_throws_js(TypeError, function() { feCompositeElement.operator.baseVal = 8; });
|
||||
assert_equals(feCompositeElement.operator.baseVal, SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_ARITHMETIC);
|
||||
assert_equals(feCompositeElement.getAttribute('operator'), "arithmetic");
|
||||
|
||||
|
@ -56,10 +61,5 @@ test(function() {
|
|||
feCompositeElement.operator.baseVal = SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_OVER;
|
||||
assert_equals(feCompositeElement.operator.baseVal, SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_OVER);
|
||||
assert_equals(feCompositeElement.getAttribute('operator'), "over");
|
||||
|
||||
// Switch to 'lighter'.
|
||||
assert_equals(SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_LIGHTER, undefined);
|
||||
feCompositeElement.setAttribute("operator", "lighter");
|
||||
assert_equals(feCompositeElement.operator.baseVal, SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_UNKNOWN);
|
||||
});
|
||||
</script>
|
|
@ -1,10 +1,10 @@
|
|||
cask "safari-technology-preview" do
|
||||
if MacOS.version <= :catalina
|
||||
version "117,001-86197-20201209-2fd0fe89-0c37-412d-99e2-4e288519e886"
|
||||
sha256 "739630b43a8f021cc246b2c8f610b759e82a6336830d34dac1f388763e7cceea"
|
||||
version "118,001-92142-20210105-a1c7713a-1f38-411e-85e3-c650a62d5c06"
|
||||
sha256 "8ffd7f83166106992cfc65a9760efe61578b55e1d8a1c960d56867f2048bd953"
|
||||
else
|
||||
version "117,001-86222-20201209-8021be92-32b3-403f-b9a7-630ab8e91afb"
|
||||
sha256 "2dc42342e1e3fdd95086dfbd3a8588f1e2d181fbd4f8bb279994be0c2e57ff6f"
|
||||
version "118,001-92171-20210105-8d3c22a7-e518-4758-8df4-fe87c4fa078a"
|
||||
sha256 "98c60037f4dace62ca78d5bc3ab6974c9ca078f60fe2a82062bbc8e3cbcfc55a"
|
||||
end
|
||||
|
||||
url "https://secure-appldnld.apple.com/STP/#{version.after_comma}/SafariTechnologyPreview.dmg"
|
||||
|
|
|
@ -1,15 +1,10 @@
|
|||
import logging
|
||||
import sys
|
||||
|
||||
logger = logging.getLogger("manifest")
|
||||
|
||||
def setup():
|
||||
def enable_debug_logging():
|
||||
# type: () -> None
|
||||
logger.setLevel(logging.DEBUG)
|
||||
handler = logging.StreamHandler(sys.stdout)
|
||||
formatter = logging.Formatter(logging.BASIC_FORMAT, None)
|
||||
handler.setFormatter(formatter)
|
||||
logger.addHandler(handler)
|
||||
|
||||
def get_logger():
|
||||
# type: () -> logging.Logger
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import io
|
||||
import itertools
|
||||
import os
|
||||
import sys
|
||||
from atomicwrites import atomic_write
|
||||
from copy import deepcopy
|
||||
from multiprocessing import Pool, cpu_count
|
||||
|
@ -173,6 +174,8 @@ class Manifest(object):
|
|||
constructed in the case we are not updating a path, but the absence of an item from
|
||||
the iterator may be used to remove defunct entries from the manifest."""
|
||||
|
||||
logger = get_logger()
|
||||
|
||||
changed = False
|
||||
|
||||
# Create local variable references to these dicts so we avoid the
|
||||
|
@ -221,20 +224,33 @@ class Manifest(object):
|
|||
to_update.append(source_file)
|
||||
|
||||
if to_update:
|
||||
logger.debug("Computing manifest update for %s items" % len(to_update))
|
||||
changed = True
|
||||
|
||||
|
||||
# 25 items was derived experimentally (2020-01) to be approximately the
|
||||
# point at which it is quicker to create a Pool and parallelize update.
|
||||
if parallel and len(to_update) > 25 and cpu_count() > 1:
|
||||
# 25 derived experimentally (2020-01) to be approximately
|
||||
# the point at which it is quicker to create Pool and
|
||||
# parallelize this
|
||||
pool = Pool()
|
||||
# On Python 3 on Windows, using >= MAXIMUM_WAIT_OBJECTS processes
|
||||
# causes a crash in the multiprocessing module. Whilst this enum
|
||||
# can technically have any value, it is usually 64. For safety,
|
||||
# restrict manifest regeneration to 48 processes on Windows.
|
||||
#
|
||||
# See https://bugs.python.org/issue26903 and https://bugs.python.org/issue40263
|
||||
processes = cpu_count()
|
||||
if sys.platform == "win32" and processes > 48:
|
||||
processes = 48
|
||||
pool = Pool(processes)
|
||||
|
||||
# chunksize set > 1 when more than 10000 tests, because
|
||||
# chunking is a net-gain once we get to very large numbers
|
||||
# of items (again, experimentally, 2020-01)
|
||||
chunksize = max(1, len(to_update) // 10000)
|
||||
logger.debug("Doing a multiprocessed update. CPU count: %s, "
|
||||
"processes: %s, chunksize: %s" % (cpu_count(), processes, chunksize))
|
||||
results = pool.imap_unordered(compute_manifest_items,
|
||||
to_update,
|
||||
chunksize=max(1, len(to_update) // 10000)
|
||||
chunksize=chunksize
|
||||
) # type: Iterator[Tuple[Tuple[Text, ...], Text, Set[ManifestItem], Text]]
|
||||
elif PY3:
|
||||
results = map(compute_manifest_items, to_update)
|
||||
|
@ -444,6 +460,7 @@ def _load_and_update(tests_root, # type: Text
|
|||
update = True
|
||||
|
||||
if rebuild or update:
|
||||
logger.info("Updating manifest")
|
||||
for retry in range(2):
|
||||
try:
|
||||
tree = vcs.get_tree(tests_root, manifest, manifest_path, cache_root,
|
||||
|
|
|
@ -4,7 +4,7 @@ import os
|
|||
|
||||
from . import manifest
|
||||
from . import vcs
|
||||
from .log import get_logger
|
||||
from .log import get_logger, enable_debug_logging
|
||||
from .download import download_from_github
|
||||
|
||||
here = os.path.dirname(__file__)
|
||||
|
@ -64,6 +64,9 @@ def abs_path(path):
|
|||
def create_parser():
|
||||
# type: () -> argparse.ArgumentParser
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument(
|
||||
"-v", "--verbose", dest="verbose", action="store_true", default=False,
|
||||
help="Turn on verbose logging")
|
||||
parser.add_argument(
|
||||
"-p", "--path", type=abs_path, help="Path to manifest file.")
|
||||
parser.add_argument(
|
||||
|
@ -90,6 +93,8 @@ def run(*args, **kwargs):
|
|||
# type: (*Any, **Any) -> None
|
||||
if kwargs["path"] is None:
|
||||
kwargs["path"] = os.path.join(kwargs["tests_root"], "MANIFEST.json")
|
||||
if kwargs["verbose"]:
|
||||
enable_debug_logging()
|
||||
update_from_cli(**kwargs)
|
||||
|
||||
|
||||
|
|
|
@ -14,5 +14,5 @@ test.step(function () {
|
|||
client.send(null);
|
||||
test.step_timeout(() => {
|
||||
assert_unreached("ontimeout not called.");
|
||||
}, 10);
|
||||
}, 1000);
|
||||
});
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue