mirror of
https://github.com/servo/servo.git
synced 2025-08-06 22:15:33 +01:00
Auto merge of #28138 - servo-wpt-sync:wpt_update_02-02-2021, r=jdm
Sync WPT with upstream (02-02-2021) Automated downstream sync of changes from upstream as of 02-02-2021. [no-wpt-sync] r? @servo-wpt-sync
This commit is contained in:
commit
6f93950bf2
85 changed files with 977 additions and 662 deletions
|
@ -1,8 +0,0 @@
|
||||||
[url-charset.window.html]
|
|
||||||
expected: TIMEOUT
|
|
||||||
[Blob charset should override any auto-detected charset.]
|
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
||||||
[Blob charset should override <meta charset>.]
|
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
[hit-test-floats-005.html]
|
|
||||||
[Miss clipped float]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -312,18 +312,27 @@
|
||||||
[<iframe>: separate response Content-Type: text/plain */*]
|
[<iframe>: separate response Content-Type: text/plain */*]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[<iframe>: separate response Content-Type: text/plain */*;charset=gbk]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[<iframe>: combined 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/html */*]
|
[<iframe>: separate response Content-Type: text/html */*]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[<iframe>: combined response Content-Type: text/html */*;charset=gbk]
|
[<iframe>: combined response Content-Type: text/html */*;charset=gbk]
|
||||||
expected: FAIL
|
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 */*]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[<iframe>: separate response Content-Type: text/html */*;charset=gbk]
|
||||||
|
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
|
||||||
|
|
||||||
|
|
|
@ -56,6 +56,6 @@
|
||||||
[separate text/javascript x/x]
|
[separate text/javascript x/x]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[separate text/javascript; charset=windows-1252 text/javascript]
|
[separate text/javascript error]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
[status-code.window.html]
|
||||||
|
[HTTP/1.1 999 DOES IT MATTER ]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[HTTP/1.1 077 77 ]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[HTTP/1.1 200 ]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[HTTP/1.1 1 OK ]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[HTTP/1.1 099 HELLO ]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[HTTP/1.1 99 NOT OK ]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[HTTP/1.1 0 OK ]
|
||||||
|
expected: FAIL
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
[traverse_the_history_1.html]
|
|
||||||
[Multiple history traversals from the same task]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
[traverse_the_history_3.html]
|
[traverse_the_history_5.html]
|
||||||
[Multiple history traversals, last would be aborted]
|
[Multiple history traversals, last would be aborted]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
|
@ -1,2 +0,0 @@
|
||||||
[cross-origin-objects-on-new-window.html]
|
|
||||||
expected: TIMEOUT
|
|
|
@ -1,5 +1,5 @@
|
||||||
[iframe_sandbox_popups_escaping-2.html]
|
[iframe_sandbox_popups_escaping-2.html]
|
||||||
expected: CRASH
|
expected: TIMEOUT
|
||||||
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
|
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
|
||||||
expected: TIMEOUT
|
expected: TIMEOUT
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
[iframe_sandbox_popups_nonescaping-1.html]
|
[iframe_sandbox_popups_nonescaping-1.html]
|
||||||
expected: CRASH
|
expected: TIMEOUT
|
||||||
[Check that popups from a sandboxed iframe do not escape the sandbox]
|
[Check that popups from a sandboxed iframe do not escape the sandbox]
|
||||||
expected: NOTRUN
|
expected: NOTRUN
|
||||||
|
|
||||||
|
|
|
@ -1,19 +1,10 @@
|
||||||
[select-event.html]
|
[select-event.html]
|
||||||
[input type search: setRangeText() a second time (must not fire select)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[input type text: selectionEnd a second time (must not fire select)]
|
[input type text: selectionEnd a second time (must not fire select)]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[input type url: setRangeText() a second time (must not fire select)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[input type password: select() a second time (must not fire select)]
|
[input type password: select() a second time (must not fire select)]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[input type url: selectionStart out of range a second time (must not fire select)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[input type search: selectionEnd a second time (must not fire select)]
|
[input type search: selectionEnd a second time (must not fire select)]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
@ -26,36 +17,57 @@
|
||||||
[input type password: selectionDirection a second time (must not fire select)]
|
[input type password: selectionDirection a second time (must not fire select)]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[input type url: setSelectionRange out of range 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
|
|
||||||
|
|
||||||
[textarea: selectionDirection a second time (must not fire select)]
|
[textarea: selectionDirection a second time (must not fire select)]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[input type url: selectionEnd 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
|
|
||||||
|
|
||||||
[textarea: setSelectionRange() a second time (must not fire select)]
|
[textarea: setSelectionRange() a second time (must not fire select)]
|
||||||
expected: FAIL
|
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)]
|
[input type url: selectionDirection a second time (must not fire select)]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[input type text: selectionDirection a second time (must not fire select)]
|
[input type text: selectionDirection a second time (must not fire select)]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[input type text: selectionStart out of range a second time (must not fire select)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[input type search: selectionStart a second time (must not fire select)]
|
[input type search: selectionStart a second time (must not fire select)]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
[textarea: 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: setSelectionRange() 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() 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 search: setSelectionRange() a second time (must not fire select)]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[input type search: 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 password: setRangeText() a second time (must not fire select)]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[input type search: selectionDirection 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 tel: selectionStart a second time (must not fire select)]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
[module-delayed.html]
|
||||||
|
[async document.write in a module]
|
||||||
|
expected: FAIL
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
[module-static-import-delayed.html]
|
|
||||||
[document.write in an imported module]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
[xhr.http.html]
|
||||||
|
expected: CRASH
|
|
@ -1,4 +1,4 @@
|
||||||
[idlharness.html]
|
[idlharness.window.html]
|
||||||
[Navigator interface: navigator must inherit property "webdriver" with the proper type]
|
[Navigator interface: navigator must inherit property "webdriver" with the proper type]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
[017.html]
|
|
||||||
expected: TIMEOUT
|
|
||||||
[origin of the script that invoked the method, about:blank]
|
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
[url-charset.window.html]
|
|
||||||
expected: TIMEOUT
|
|
||||||
[Blob charset should override any auto-detected charset.]
|
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
||||||
[Blob charset should override <meta charset>.]
|
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
|
@ -149190,6 +149190,19 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"table-as-item-percent-width-cell-001.html": [
|
||||||
|
"b578b233405fdc164be5c26456f8bc1d558cf85c",
|
||||||
|
[
|
||||||
|
null,
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"/css/css-flexbox/table-as-item-percent-width-cell-001-ref.html",
|
||||||
|
"=="
|
||||||
|
]
|
||||||
|
],
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"table-as-item-specified-width.html": [
|
"table-as-item-specified-width.html": [
|
||||||
"a4b370eb254dd84eaa90fcc4a658d101b681655c",
|
"a4b370eb254dd84eaa90fcc4a658d101b681655c",
|
||||||
[
|
[
|
||||||
|
@ -166249,6 +166262,19 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"multicol-breaking-006.html": [
|
||||||
|
"7efeee80251f6d912ff8d6ef1111e2fd6cf5b8a6",
|
||||||
|
[
|
||||||
|
null,
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"/css/css-multicol/multicol-breaking-006-ref.html",
|
||||||
|
"=="
|
||||||
|
]
|
||||||
|
],
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"multicol-breaking-nobackground-000.html": [
|
"multicol-breaking-nobackground-000.html": [
|
||||||
"768ec63298f03eb28a80a4e33f140314168b010d",
|
"768ec63298f03eb28a80a4e33f140314168b010d",
|
||||||
[
|
[
|
||||||
|
@ -177144,6 +177170,19 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"transparent-on-root.html": [
|
||||||
|
"fcab71127d3cd8b38c0843cedff1f10aa59bb7bf",
|
||||||
|
[
|
||||||
|
null,
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"/css/css-scrollbars/transparent-on-root-ref.html",
|
||||||
|
"=="
|
||||||
|
]
|
||||||
|
],
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"viewport-scrollbar-body.html": [
|
"viewport-scrollbar-body.html": [
|
||||||
"a1b3aee871a918dc4e3f92e669d6631c0944cd18",
|
"a1b3aee871a918dc4e3f92e669d6631c0944cd18",
|
||||||
[
|
[
|
||||||
|
@ -259842,7 +259881,7 @@
|
||||||
},
|
},
|
||||||
"support": {
|
"support": {
|
||||||
".azure-pipelines.yml": [
|
".azure-pipelines.yml": [
|
||||||
"1c9883ccdec0532499b8df805527ea8e8c37c32f",
|
"337d7e326ac920d67117924f5772e40b735c0248",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
".codecov.yml": [
|
".codecov.yml": [
|
||||||
|
@ -307371,6 +307410,10 @@
|
||||||
[]
|
[]
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"table-as-item-percent-width-cell-001-ref.html": [
|
||||||
|
"2f40b6c49fdcee593a160c82c381d4c14f377a38",
|
||||||
|
[]
|
||||||
|
],
|
||||||
"table-item-flex-percentage-width-ref.html": [
|
"table-item-flex-percentage-width-ref.html": [
|
||||||
"e598475fddf54274f93609de94b0f950618bc8e2",
|
"e598475fddf54274f93609de94b0f950618bc8e2",
|
||||||
[]
|
[]
|
||||||
|
@ -317095,6 +317138,10 @@
|
||||||
"a22fda57c0b2759cce0e1e6ce72de7c07c22ed23",
|
"a22fda57c0b2759cce0e1e6ce72de7c07c22ed23",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
|
"multicol-breaking-006-ref.html": [
|
||||||
|
"06e92eb8395b77ef33b5754a6743ec05c0159682",
|
||||||
|
[]
|
||||||
|
],
|
||||||
"multicol-breaking-nobackground-000-ref.html": [
|
"multicol-breaking-nobackground-000-ref.html": [
|
||||||
"7a99354061cfeb982fffb921c850484dd02eac15",
|
"7a99354061cfeb982fffb921c850484dd02eac15",
|
||||||
[]
|
[]
|
||||||
|
@ -319629,6 +319676,10 @@
|
||||||
"9f505dd7f1d121c0bd0af0131b51f536225326b1",
|
"9f505dd7f1d121c0bd0af0131b51f536225326b1",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
|
"transparent-on-root-ref.html": [
|
||||||
|
"a5b2de4f00f3abd19c74b08b80a027d09a7abcca",
|
||||||
|
[]
|
||||||
|
],
|
||||||
"viewport-scrollbar-body-ref.html": [
|
"viewport-scrollbar-body-ref.html": [
|
||||||
"4e07903e2ca1e5d0378845c8cc4754dc82b1ebf8",
|
"4e07903e2ca1e5d0378845c8cc4754dc82b1ebf8",
|
||||||
[]
|
[]
|
||||||
|
@ -334662,7 +334713,7 @@
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"from-local-system.md": [
|
"from-local-system.md": [
|
||||||
"f5cfa36915d7892d827d8f5aa74649e0e2c0c062",
|
"53f6a1fb98d58f900e34895a9461332512e8c06c",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"from-web.md": [
|
"from-web.md": [
|
||||||
|
@ -334724,7 +334775,7 @@
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"h2tests.md": [
|
"h2tests.md": [
|
||||||
"c13295e1fe668af1ed9561463b2ec18719f8deb6",
|
"9a429373f567253b174ed6f7be85290d41b20dc3",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"idlharness.md": [
|
"idlharness.md": [
|
||||||
|
@ -334736,7 +334787,7 @@
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"lint-tool.md": [
|
"lint-tool.md": [
|
||||||
"ba11169e020c8c74a2a4dab04c316d3e391321a1",
|
"95f8b574158e77f195b11060b19e67328f0029d2",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"making-a-testing-plan.md": [
|
"making-a-testing-plan.md": [
|
||||||
|
@ -334753,7 +334804,7 @@
|
||||||
],
|
],
|
||||||
"python-handlers": {
|
"python-handlers": {
|
||||||
"index.md": [
|
"index.md": [
|
||||||
"e4d396f90a796492323d8c1c878905267a62c617",
|
"96f7edb61601b1af1795d62cefd3bd5bc09c817b",
|
||||||
[]
|
[]
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -334770,7 +334821,7 @@
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"server-features.md": [
|
"server-features.md": [
|
||||||
"a1ba09132c5a40591321b0532dab1c3008987c2b",
|
"fe3e84836c21e31583ed1c5d244f8dc85a3cf7eb",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"server-pipes.md": [
|
"server-pipes.md": [
|
||||||
|
@ -338191,6 +338242,10 @@
|
||||||
"script-with-0x00-in-header.py": [
|
"script-with-0x00-in-header.py": [
|
||||||
"39f58d8270e7671bf74e40ac84e05a7558df4f68",
|
"39f58d8270e7671bf74e40ac84e05a7558df4f68",
|
||||||
[]
|
[]
|
||||||
|
],
|
||||||
|
"status-code.py": [
|
||||||
|
"5421893b26732e3c479731c322e4022980235d03",
|
||||||
|
[]
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -356987,7 +357042,7 @@
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"link-header-preload.html.headers": [
|
"link-header-preload.html.headers": [
|
||||||
"293598ee66982baa00b92c9e64df6347190ab057",
|
"83758fb9cdc128d291b96c2a9a7e8abb3958dc64",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"preload-in-data-doc-ref.html": [
|
"preload-in-data-doc-ref.html": [
|
||||||
|
@ -359118,7 +359173,7 @@
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"generic_sensor_mocks.js": [
|
"generic_sensor_mocks.js": [
|
||||||
"85891c6ef129d31794404476d25878c7eb8c5bd7",
|
"56438824518225a9b1e5c89f1f6b73aa7f4e57c0",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"generic_sensor_mocks.js.headers": [
|
"generic_sensor_mocks.js.headers": [
|
||||||
|
@ -359211,7 +359266,7 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"idlharness.js": [
|
"idlharness.js": [
|
||||||
"5a97b273f2bed196d6ddd85c5596decff1bf87ae",
|
"76131e7c9602b94f9543d1f49658b304535691d3",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"idlharness.js.headers": [
|
"idlharness.js.headers": [
|
||||||
|
@ -364071,11 +364126,11 @@
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"update_hosts.yml": [
|
"update_hosts.yml": [
|
||||||
"64aff7cf46a83e0ad0045065b5ec2e78deb6506d",
|
"63c7e45811297a2dd5342b3b3ab9093acab6f5cd",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"update_manifest.yml": [
|
"update_manifest.yml": [
|
||||||
"e8f28217f1eaa9af3ec67e2b1a64365c8aa87a81",
|
"453ac2ac3c05cf873bcf66d1be990324bd20036e",
|
||||||
[]
|
[]
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -364166,7 +364221,7 @@
|
||||||
],
|
],
|
||||||
"tasks": {
|
"tasks": {
|
||||||
"test.yml": [
|
"test.yml": [
|
||||||
"b3a396068933661849e628ceeebb10f6a90be538",
|
"95212e97bf7961804ce01281c3023badcc7cd330",
|
||||||
[]
|
[]
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -364198,7 +364253,7 @@
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"test_valid.py": [
|
"test_valid.py": [
|
||||||
"30fdfdc13d88ee05aa015fb7529f4a3e67aaedaf",
|
"9891e1cfc5d98d9e36c807f9b06df581bfbc7072",
|
||||||
[]
|
[]
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -364617,7 +364672,7 @@
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"py3-flake8.ini": [
|
"py3-flake8.ini": [
|
||||||
"14cc1dc6f6a7afb41f12c41fa8293337d19a023b",
|
"f8d4776ef66b01fac0bfa2d27320b1ea3f8a497f",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"pytest.ini": [
|
"pytest.ini": [
|
||||||
|
@ -371804,7 +371859,7 @@
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"install.py": [
|
"install.py": [
|
||||||
"638065a53014f3d463269793aa08f3acf30654ea",
|
"8ba5c7a85916fcce1a1452b9ef002dca47a34bef",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"mach-emulator.manifest": [
|
"mach-emulator.manifest": [
|
||||||
|
@ -371828,7 +371883,7 @@
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"run.py": [
|
"run.py": [
|
||||||
"3d380eab5cbdb00ffc612dedc595310f7d0e60a1",
|
"68f8e32ca1812974cd9eb42f48e6c34a9ad5b2b5",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"testfiles.py": [
|
"testfiles.py": [
|
||||||
|
@ -372138,11 +372193,11 @@
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"android_weblayer.py": [
|
"android_weblayer.py": [
|
||||||
"f68312f231bba4f08aba7defbc272a86e98af244",
|
"972e5517b1cff6d1635b35bef512f3589e22933e",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"android_webview.py": [
|
"android_webview.py": [
|
||||||
"3cde248b4465cd10a86a813de8551808c42dbf18",
|
"918a881b908ddcdaec1954110cdb99e71845f362",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"base.py": [
|
"base.py": [
|
||||||
|
@ -372150,15 +372205,15 @@
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"chrome.py": [
|
"chrome.py": [
|
||||||
"d3e27a9c5f65f7aa754263cb57846285d2857540",
|
"04ac3726fba16d3ea315cbf24310cb69c5db8a61",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"chrome_android.py": [
|
"chrome_android.py": [
|
||||||
"d7e3e21012169fdf12e47d3bc87552f46c779cf9",
|
"178183b4028393703c0e691f875531423cf86c60",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"chrome_ios.py": [
|
"chrome_ios.py": [
|
||||||
"ecdbc3a17623907dc9bd99505d1e5ee0bc747c7b",
|
"f349b19419cd67a3551ba1796e1ae02d2776e46d",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"chrome_spki_certs.py": [
|
"chrome_spki_certs.py": [
|
||||||
|
@ -372166,7 +372221,7 @@
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"edge.py": [
|
"edge.py": [
|
||||||
"b908684bbb3e7eae9982173ed26a9a9e39b6b437",
|
"db4795ce5d4a773546b03782885d24a82337b031",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"edge_webdriver.py": [
|
"edge_webdriver.py": [
|
||||||
|
@ -372174,11 +372229,11 @@
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"edgechromium.py": [
|
"edgechromium.py": [
|
||||||
"1d45983a11ef0d3fdcfabd6e81fe2974ab2d68eb",
|
"c2275bd168797cc2486c138a8450a598c29891c9",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"epiphany.py": [
|
"epiphany.py": [
|
||||||
"a3384436a1d643c6576ebb731db5c458f8ad2687",
|
"f378170f33d33cc0839bf599fc1ac33dff7f0fe2",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"firefox.py": [
|
"firefox.py": [
|
||||||
|
@ -372190,19 +372245,19 @@
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"ie.py": [
|
"ie.py": [
|
||||||
"3a86c1b6ccb5aabfe210158f6be613f690543375",
|
"5fce29a477070479a82126d318a93763d12b1c9b",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"opera.py": [
|
"opera.py": [
|
||||||
"a34f41955383c08e98c4d38d7804231c17e9297a",
|
"80e5a314c83b9866b350ff75375a48d153061624",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"safari.py": [
|
"safari.py": [
|
||||||
"312d4db9c6382f7aff5cd75772f0edf73e538565",
|
"0f62639c6350527fbfe69b65fb948c1d1e398844",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"sauce.py": [
|
"sauce.py": [
|
||||||
"3497c5c277288e51f6677000e57057ebcd99a210",
|
"483bf206172a6c146a6b299742fb1ab85316b4d0",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"sauce_setup": {
|
"sauce_setup": {
|
||||||
|
@ -372216,19 +372271,19 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"servo.py": [
|
"servo.py": [
|
||||||
"a65ed5ead4e55c45cfd7aa7921f0717216ce6a45",
|
"4f934aedfcd64153e77bb33efd9c6387832cfcec",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"servodriver.py": [
|
"servodriver.py": [
|
||||||
"ed85cbf3b9bd04ea192641b480ace44dc6d433bf",
|
"83b9423ba71a2d434b33156d624f64ffc6cc8515",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"webkit.py": [
|
"webkit.py": [
|
||||||
"590e472aca961b865bf0dbc836c942f62b506ae8",
|
"f83de2996a98d75efcbaa66480b7cd210869a886",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"webkitgtk_minibrowser.py": [
|
"webkitgtk_minibrowser.py": [
|
||||||
"5b7a360fb608352e26971570af06c5bb8466255b",
|
"6c1001e2d70dcf55088b341978c8b30658f52c41",
|
||||||
[]
|
[]
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -372362,7 +372417,7 @@
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"chromium.py": [
|
"chromium.py": [
|
||||||
"2ff2bd1e083a3439d1289c9f540a8bb2b1e20dbc",
|
"b6cbb203a31ade463a809542c158b6ce859bcf5c",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"tests": {
|
"tests": {
|
||||||
|
@ -372449,7 +372504,7 @@
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"testrunner.py": [
|
"testrunner.py": [
|
||||||
"8dd93418dd8f37fc220306f7a4e6d85e7fb9b55a",
|
"0c658a158a3e4f170fe33a68702c2288801b2586",
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
"tests": {
|
"tests": {
|
||||||
|
@ -396874,15 +396929,6 @@
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"async-idlharness.https.html": [
|
|
||||||
"a1a51c98690f1c83679c3ae71f3bafe99824f025",
|
|
||||||
[
|
|
||||||
null,
|
|
||||||
{
|
|
||||||
"timeout": "long"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"async-navigator-clipboard-basics.https.html": [
|
"async-navigator-clipboard-basics.https.html": [
|
||||||
"61808a52ceb9b6272a6ce495d328a8feaaf9411a",
|
"61808a52ceb9b6272a6ce495d328a8feaaf9411a",
|
||||||
[
|
[
|
||||||
|
@ -397137,6 +397183,29 @@
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"idlharness.https.window.js": [
|
||||||
|
"c22ee245442570af52087f22335b83d986ecb358",
|
||||||
|
[
|
||||||
|
"clipboard-apis/idlharness.https.window.html",
|
||||||
|
{
|
||||||
|
"script_metadata": [
|
||||||
|
[
|
||||||
|
"timeout",
|
||||||
|
"long"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"script",
|
||||||
|
"/resources/WebIDLParser.js"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"script",
|
||||||
|
"/resources/idlharness.js"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"timeout": "long"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
],
|
||||||
"permissions": {
|
"permissions": {
|
||||||
"readText-denied.https.html": [
|
"readText-denied.https.html": [
|
||||||
"935f520e7de2dd15e0019c798dd0966c454235cd",
|
"935f520e7de2dd15e0019c798dd0966c454235cd",
|
||||||
|
@ -402899,7 +402968,7 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"cookie-enabled-noncookie-frame.html": [
|
"cookie-enabled-noncookie-frame.html": [
|
||||||
"539d715ebd5344de4cf02b6485462b31bc167525",
|
"2dbbc0bbdc5fbd4db19405a686c0b736aba08793",
|
||||||
[
|
[
|
||||||
null,
|
null,
|
||||||
{}
|
{}
|
||||||
|
@ -457097,6 +457166,13 @@
|
||||||
"fetch/h1-parsing/resources-with-0x00-in-header.window.html",
|
"fetch/h1-parsing/resources-with-0x00-in-header.window.html",
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
|
],
|
||||||
|
"status-code.window.js": [
|
||||||
|
"5776cf4050f01e838c42f7e845a2e033e2604f41",
|
||||||
|
[
|
||||||
|
"fetch/h1-parsing/status-code.window.html",
|
||||||
|
{}
|
||||||
|
]
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"http-cache": {
|
"http-cache": {
|
||||||
|
@ -502972,6 +503048,13 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"transform-above-filter-dynamic.html": [
|
||||||
|
"1d7ed51a91652790d6f980af362a15fa546cc1de",
|
||||||
|
[
|
||||||
|
null,
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"transform-above-perspective-dynamic.html": [
|
"transform-above-perspective-dynamic.html": [
|
||||||
"fea65ca56ad6bbca11c5eece6fa7a059668ecb31",
|
"fea65ca56ad6bbca11c5eece6fa7a059668ecb31",
|
||||||
[
|
[
|
||||||
|
@ -503088,6 +503171,13 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"preloader-link-media.tentative.html": [
|
||||||
|
"0e58d8b6c890edfc494eca3775501f425a153c14",
|
||||||
|
[
|
||||||
|
null,
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"preloader-template.tentative.html": [
|
"preloader-template.tentative.html": [
|
||||||
"e816309184844a6d46a20e1152c9efca80fe6f0b",
|
"e816309184844a6d46a20e1152c9efca80fe6f0b",
|
||||||
[
|
[
|
||||||
|
@ -513992,7 +514082,7 @@
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"pointerevent_capture_suppressing_mouse.html": [
|
"pointerevent_capture_suppressing_mouse.html": [
|
||||||
"080ca1520d91ecd88264f0c501998cefc410edaf",
|
"b621dcb49a9e60b27c5ab599790136c06a4ef922",
|
||||||
[
|
[
|
||||||
null,
|
null,
|
||||||
{
|
{
|
||||||
|
@ -515294,7 +515384,7 @@
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"link-header-preload.html": [
|
"link-header-preload.html": [
|
||||||
"b5932a1b0aa174f1fe8e28402595e681f39732be",
|
"8ad528d0e7c46cc7613461665f0eafed472f54c9",
|
||||||
[
|
[
|
||||||
null,
|
null,
|
||||||
{}
|
{}
|
||||||
|
@ -554199,11 +554289,22 @@
|
||||||
},
|
},
|
||||||
"webdriver": {
|
"webdriver": {
|
||||||
"tests": {
|
"tests": {
|
||||||
"idlharness.html": [
|
"idlharness.window.js": [
|
||||||
"d049d835f2fc60df7296da08a013793ae7e398ca",
|
"e92e151d89836e06966339daabc6b1be50ded744",
|
||||||
[
|
[
|
||||||
null,
|
"webdriver/tests/idlharness.window.html",
|
||||||
{}
|
{
|
||||||
|
"script_metadata": [
|
||||||
|
[
|
||||||
|
"script",
|
||||||
|
"/resources/WebIDLParser.js"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"script",
|
||||||
|
"/resources/idlharness.js"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -565838,11 +565939,37 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"idlharness.worker.js": [
|
"idlharness.https.any.js": [
|
||||||
"827dd02c4c53292b534677454c11264f415678a5",
|
"2900b3812496ca430b15b327165ad4884e1f90e4",
|
||||||
[
|
[
|
||||||
"worklets/idlharness.worker.html",
|
"worklets/idlharness.https.any.html",
|
||||||
{}
|
{
|
||||||
|
"script_metadata": [
|
||||||
|
[
|
||||||
|
"script",
|
||||||
|
"/resources/WebIDLParser.js"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"script",
|
||||||
|
"/resources/idlharness.js"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"worklets/idlharness.https.any.worker.html",
|
||||||
|
{
|
||||||
|
"script_metadata": [
|
||||||
|
[
|
||||||
|
"script",
|
||||||
|
"/resources/WebIDLParser.js"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"script",
|
||||||
|
"/resources/idlharness.js"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"layout-worklet-credentials.https.html": [
|
"layout-worklet-credentials.https.html": [
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
[hit-test-floats-005.html]
|
|
||||||
[Miss clipped float]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -312,18 +312,27 @@
|
||||||
[<iframe>: separate response Content-Type: text/plain */*]
|
[<iframe>: separate response Content-Type: text/plain */*]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[<iframe>: separate response Content-Type: text/plain */*;charset=gbk]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[<iframe>: combined 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/html */*]
|
[<iframe>: separate response Content-Type: text/html */*]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[<iframe>: combined response Content-Type: text/html */*;charset=gbk]
|
[<iframe>: combined response Content-Type: text/html */*;charset=gbk]
|
||||||
expected: FAIL
|
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 */*]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[<iframe>: separate response Content-Type: text/html */*;charset=gbk]
|
||||||
|
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
|
||||||
|
|
||||||
|
|
|
@ -56,6 +56,6 @@
|
||||||
[separate text/javascript x/x]
|
[separate text/javascript x/x]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[separate text/javascript; charset=windows-1252 text/javascript]
|
[separate text/javascript error]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
[status-code.window.html]
|
||||||
|
[HTTP/1.1 999 DOES IT MATTER ]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[HTTP/1.1 077 77 ]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[HTTP/1.1 200 ]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[HTTP/1.1 1 OK ]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[HTTP/1.1 099 HELLO ]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[HTTP/1.1 99 NOT OK ]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[HTTP/1.1 0 OK ]
|
||||||
|
expected: FAIL
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
[traverse_the_history_1.html]
|
|
||||||
[Multiple history traversals from the same task]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
[traverse_the_history_3.html]
|
[traverse_the_history_5.html]
|
||||||
[Multiple history traversals, last would be aborted]
|
[Multiple history traversals, last would be aborted]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
|
@ -1,2 +0,0 @@
|
||||||
[cross-origin-objects-on-new-window.html]
|
|
||||||
expected: TIMEOUT
|
|
|
@ -1,5 +1,5 @@
|
||||||
[iframe_sandbox_popups_escaping-2.html]
|
[iframe_sandbox_popups_escaping-2.html]
|
||||||
expected: CRASH
|
expected: TIMEOUT
|
||||||
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
|
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
|
||||||
expected: TIMEOUT
|
expected: TIMEOUT
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[iframe_sandbox_popups_nonescaping-1.html]
|
[iframe_sandbox_popups_nonescaping-1.html]
|
||||||
type: testharness
|
type: testharness
|
||||||
expected: CRASH
|
expected: TIMEOUT
|
||||||
[Check that popups from a sandboxed iframe do not escape the sandbox]
|
[Check that popups from a sandboxed iframe do not escape the sandbox]
|
||||||
expected: NOTRUN
|
expected: NOTRUN
|
||||||
|
|
||||||
|
|
|
@ -1,19 +1,10 @@
|
||||||
[select-event.html]
|
[select-event.html]
|
||||||
[input type search: setRangeText() a second time (must not fire select)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[input type text: selectionEnd a second time (must not fire select)]
|
[input type text: selectionEnd a second time (must not fire select)]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[input type url: setRangeText() a second time (must not fire select)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[input type password: select() a second time (must not fire select)]
|
[input type password: select() a second time (must not fire select)]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[input type url: selectionStart out of range a second time (must not fire select)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[input type search: selectionEnd a second time (must not fire select)]
|
[input type search: selectionEnd a second time (must not fire select)]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
@ -26,36 +17,57 @@
|
||||||
[input type password: selectionDirection a second time (must not fire select)]
|
[input type password: selectionDirection a second time (must not fire select)]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[input type url: setSelectionRange out of range 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
|
|
||||||
|
|
||||||
[textarea: selectionDirection a second time (must not fire select)]
|
[textarea: selectionDirection a second time (must not fire select)]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[input type url: selectionEnd 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
|
|
||||||
|
|
||||||
[textarea: setSelectionRange() a second time (must not fire select)]
|
[textarea: setSelectionRange() a second time (must not fire select)]
|
||||||
expected: FAIL
|
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)]
|
[input type url: selectionDirection a second time (must not fire select)]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[input type text: selectionDirection a second time (must not fire select)]
|
[input type text: selectionDirection a second time (must not fire select)]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[input type text: selectionStart out of range a second time (must not fire select)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[input type search: selectionStart a second time (must not fire select)]
|
[input type search: selectionStart a second time (must not fire select)]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
[textarea: 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: setSelectionRange() 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() 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 search: setSelectionRange() a second time (must not fire select)]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[input type search: 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 password: setRangeText() a second time (must not fire select)]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[input type search: selectionDirection 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 tel: selectionStart a second time (must not fire select)]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
[module-delayed.html]
|
||||||
|
[async document.write in a module]
|
||||||
|
expected: FAIL
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
[module-static-import-delayed.html]
|
|
||||||
[document.write in an imported module]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
[idlharness.window.html]
|
||||||
|
[Navigator interface: navigator must inherit property "webdriver" with the proper type]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[Navigator interface: attribute webdriver]
|
||||||
|
expected: FAIL
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
[017.html]
|
|
||||||
expected: TIMEOUT
|
|
||||||
[origin of the script that invoked the method, about:blank]
|
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
|
@ -117,24 +117,6 @@ jobs:
|
||||||
displayName: 'Run tests (Safari Technology Preview)'
|
displayName: 'Run tests (Safari Technology Preview)'
|
||||||
- template: tools/ci/azure/publish_logs.yml
|
- template: tools/ci/azure/publish_logs.yml
|
||||||
|
|
||||||
- job: tools_unittest_mac
|
|
||||||
displayName: 'tools/ unittests: macOS'
|
|
||||||
dependsOn: decision
|
|
||||||
condition: dependencies.decision.outputs['test_jobs.tools_unittest']
|
|
||||||
pool:
|
|
||||||
vmImage: 'macOS-10.15'
|
|
||||||
variables:
|
|
||||||
HYPOTHESIS_PROFILE: ci
|
|
||||||
steps:
|
|
||||||
- task: UsePythonVersion@0
|
|
||||||
inputs:
|
|
||||||
versionSpec: '2.7.x'
|
|
||||||
- template: tools/ci/azure/checkout.yml
|
|
||||||
- template: tools/ci/azure/tox_pytest.yml
|
|
||||||
parameters:
|
|
||||||
directory: tools/
|
|
||||||
toxenv: py27
|
|
||||||
|
|
||||||
- job: tools_unittest_mac_py36
|
- job: tools_unittest_mac_py36
|
||||||
displayName: 'tools/ unittests: macOS + Python 3.6'
|
displayName: 'tools/ unittests: macOS + Python 3.6'
|
||||||
dependsOn: decision
|
dependsOn: decision
|
||||||
|
@ -167,24 +149,6 @@ jobs:
|
||||||
directory: tools/
|
directory: tools/
|
||||||
toxenv: py38
|
toxenv: py38
|
||||||
|
|
||||||
- job: wptrunner_unittest_mac
|
|
||||||
displayName: 'tools/wptrunner/ unittests: macOS'
|
|
||||||
dependsOn: decision
|
|
||||||
condition: dependencies.decision.outputs['test_jobs.wptrunner_unittest']
|
|
||||||
pool:
|
|
||||||
vmImage: 'macOS-10.15'
|
|
||||||
variables:
|
|
||||||
HYPOTHESIS_PROFILE: ci
|
|
||||||
steps:
|
|
||||||
- task: UsePythonVersion@0
|
|
||||||
inputs:
|
|
||||||
versionSpec: '2.7.x'
|
|
||||||
- template: tools/ci/azure/checkout.yml
|
|
||||||
- template: tools/ci/azure/tox_pytest.yml
|
|
||||||
parameters:
|
|
||||||
directory: tools/wptrunner/
|
|
||||||
toxenv: py27
|
|
||||||
|
|
||||||
- job: wptrunner_unittest_mac_py36
|
- job: wptrunner_unittest_mac_py36
|
||||||
displayName: 'tools/wptrunner/ unittests: macOS + Python 3.6'
|
displayName: 'tools/wptrunner/ unittests: macOS + Python 3.6'
|
||||||
dependsOn: decision
|
dependsOn: decision
|
||||||
|
@ -217,32 +181,6 @@ jobs:
|
||||||
directory: tools/wptrunner/
|
directory: tools/wptrunner/
|
||||||
toxenv: py38
|
toxenv: py38
|
||||||
|
|
||||||
- job: wpt_integration_mac
|
|
||||||
displayName: 'tools/wpt/ tests: macOS'
|
|
||||||
dependsOn: decision
|
|
||||||
condition: dependencies.decision.outputs['test_jobs.wpt_integration']
|
|
||||||
pool:
|
|
||||||
vmImage: 'macOS-10.15'
|
|
||||||
variables:
|
|
||||||
HYPOTHESIS_PROFILE: ci
|
|
||||||
steps:
|
|
||||||
# full checkout required
|
|
||||||
- task: UsePythonVersion@0
|
|
||||||
inputs:
|
|
||||||
versionSpec: '2.7.x'
|
|
||||||
- template: tools/ci/azure/install_chrome.yml
|
|
||||||
- template: tools/ci/azure/install_firefox.yml
|
|
||||||
- template: tools/ci/azure/update_hosts.yml
|
|
||||||
parameters:
|
|
||||||
pyflag: --py2
|
|
||||||
- template: tools/ci/azure/update_manifest.yml
|
|
||||||
parameters:
|
|
||||||
pyflag: --py2
|
|
||||||
- template: tools/ci/azure/tox_pytest.yml
|
|
||||||
parameters:
|
|
||||||
directory: tools/wpt/
|
|
||||||
toxenv: py27
|
|
||||||
|
|
||||||
- job: wpt_integration_mac_py36
|
- job: wpt_integration_mac_py36
|
||||||
displayName: 'tools/wpt/ tests: macOS + Python 3.6'
|
displayName: 'tools/wpt/ tests: macOS + Python 3.6'
|
||||||
dependsOn: decision
|
dependsOn: decision
|
||||||
|
@ -283,24 +221,6 @@ jobs:
|
||||||
directory: tools/wpt/
|
directory: tools/wpt/
|
||||||
toxenv: py38
|
toxenv: py38
|
||||||
|
|
||||||
- job: tools_unittest_win
|
|
||||||
displayName: 'tools/ unittests: Windows'
|
|
||||||
dependsOn: decision
|
|
||||||
condition: dependencies.decision.outputs['test_jobs.tools_unittest']
|
|
||||||
pool:
|
|
||||||
vmImage: 'windows-2019'
|
|
||||||
variables:
|
|
||||||
HYPOTHESIS_PROFILE: ci
|
|
||||||
steps:
|
|
||||||
- task: UsePythonVersion@0
|
|
||||||
inputs:
|
|
||||||
versionSpec: '2.7.x'
|
|
||||||
- template: tools/ci/azure/checkout.yml
|
|
||||||
- template: tools/ci/azure/tox_pytest.yml
|
|
||||||
parameters:
|
|
||||||
directory: tools/
|
|
||||||
toxenv: py27
|
|
||||||
|
|
||||||
- job: tools_unittest_win_py36
|
- job: tools_unittest_win_py36
|
||||||
displayName: 'tools/ unittests: Windows + Python 3.6'
|
displayName: 'tools/ unittests: Windows + Python 3.6'
|
||||||
dependsOn: decision
|
dependsOn: decision
|
||||||
|
@ -337,24 +257,6 @@ jobs:
|
||||||
directory: tools/
|
directory: tools/
|
||||||
toxenv: py38
|
toxenv: py38
|
||||||
|
|
||||||
- job: wptrunner_unittest_win
|
|
||||||
displayName: 'tools/wptrunner/ unittests: Windows'
|
|
||||||
dependsOn: decision
|
|
||||||
condition: dependencies.decision.outputs['test_jobs.wptrunner_unittest']
|
|
||||||
pool:
|
|
||||||
vmImage: 'windows-2019'
|
|
||||||
variables:
|
|
||||||
HYPOTHESIS_PROFILE: ci
|
|
||||||
steps:
|
|
||||||
- task: UsePythonVersion@0
|
|
||||||
inputs:
|
|
||||||
versionSpec: '2.7.x'
|
|
||||||
- template: tools/ci/azure/checkout.yml
|
|
||||||
- template: tools/ci/azure/tox_pytest.yml
|
|
||||||
parameters:
|
|
||||||
directory: tools/wptrunner/
|
|
||||||
toxenv: py27
|
|
||||||
|
|
||||||
- job: wptrunner_unittest_win_py36
|
- job: wptrunner_unittest_win_py36
|
||||||
displayName: 'tools/wptrunner/ unittests: Windows + Python 3.6'
|
displayName: 'tools/wptrunner/ unittests: Windows + Python 3.6'
|
||||||
dependsOn: decision
|
dependsOn: decision
|
||||||
|
@ -389,34 +291,6 @@ jobs:
|
||||||
directory: tools/wptrunner/
|
directory: tools/wptrunner/
|
||||||
toxenv: py38
|
toxenv: py38
|
||||||
|
|
||||||
- job: wpt_integration_win
|
|
||||||
displayName: 'tools/wpt/ tests: Windows'
|
|
||||||
dependsOn: decision
|
|
||||||
condition: dependencies.decision.outputs['test_jobs.wpt_integration']
|
|
||||||
pool:
|
|
||||||
vmImage: 'windows-2019'
|
|
||||||
variables:
|
|
||||||
HYPOTHESIS_PROFILE: ci
|
|
||||||
steps:
|
|
||||||
# full checkout required
|
|
||||||
- task: UsePythonVersion@0
|
|
||||||
inputs:
|
|
||||||
versionSpec: '2.7.x'
|
|
||||||
# currently just using the outdated Chrome/Firefox on the VM rather than
|
|
||||||
# figuring out how to install Chrome Dev channel on Windows
|
|
||||||
# - template: tools/ci/azure/install_chrome.yml
|
|
||||||
# - template: tools/ci/azure/install_firefox.yml
|
|
||||||
- template: tools/ci/azure/update_hosts.yml
|
|
||||||
parameters:
|
|
||||||
pyflag: --py2
|
|
||||||
- template: tools/ci/azure/update_manifest.yml
|
|
||||||
parameters:
|
|
||||||
pyflag: --py2
|
|
||||||
- template: tools/ci/azure/tox_pytest.yml
|
|
||||||
parameters:
|
|
||||||
directory: tools/wpt/
|
|
||||||
toxenv: py27
|
|
||||||
|
|
||||||
- job: wpt_integration_win_py36
|
- job: wpt_integration_win_py36
|
||||||
displayName: 'tools/wpt/ tests: Windows + Python 3.6'
|
displayName: 'tools/wpt/ tests: Windows + Python 3.6'
|
||||||
dependsOn: decision
|
dependsOn: decision
|
||||||
|
|
|
@ -1,42 +0,0 @@
|
||||||
<!doctype html>
|
|
||||||
<meta charset=utf-8>
|
|
||||||
<title>Clipboard IDL test</title>
|
|
||||||
<meta name="timeout" content="long">
|
|
||||||
<link rel='help' href='https://w3c.github.io/clipboard-apis/#async-clipboard-api'>
|
|
||||||
<script src="/resources/testharness.js"></script>
|
|
||||||
<script src="/resources/testharnessreport.js"></script>
|
|
||||||
<script src="/resources/WebIDLParser.js"></script>
|
|
||||||
<script src="/resources/idlharness.js"></script>
|
|
||||||
<script>
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
function doTest(idl, dom, html) {
|
|
||||||
const idl_array = new IdlArray();
|
|
||||||
idl_array.add_untested_idls('interface Navigator {};');
|
|
||||||
idl_array.add_untested_idls('interface EventTarget {};');
|
|
||||||
idl_array.add_untested_idls('dictionary PermissionDescriptor {};');
|
|
||||||
idl_array.add_untested_idls(dom, { only: ['Event', 'EventInit'] });
|
|
||||||
idl_array.add_untested_idls(html, { only: ['DataTransfer', 'DataTransferItemList'] });
|
|
||||||
idl_array.add_idls(idl);
|
|
||||||
idl_array.add_objects({
|
|
||||||
Navigator: ['navigator'],
|
|
||||||
Clipboard: ['navigator.clipboard'],
|
|
||||||
ClipboardEvent: ['new ClipboardEvent("x")'],
|
|
||||||
});
|
|
||||||
idl_array.test();
|
|
||||||
};
|
|
||||||
|
|
||||||
function fetchText(url) {
|
|
||||||
return fetch(url).then(response => response.text());
|
|
||||||
}
|
|
||||||
|
|
||||||
promise_test(() => {
|
|
||||||
return Promise.all(
|
|
||||||
[
|
|
||||||
'/interfaces/clipboard-apis.idl',
|
|
||||||
'/interfaces/dom.idl',
|
|
||||||
'/interfaces/html.idl',
|
|
||||||
].map(fetchText))
|
|
||||||
.then(([idl, dom, html]) => doTest(idl, dom, html));
|
|
||||||
}, 'Test driver');
|
|
||||||
</script>
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
// META: timeout=long
|
||||||
|
// META: script=/resources/WebIDLParser.js
|
||||||
|
// META: script=/resources/idlharness.js
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
idl_test(
|
||||||
|
['clipboard-apis'],
|
||||||
|
['dom', 'html', 'permissions'],
|
||||||
|
idl_array => {
|
||||||
|
idl_array.add_objects({
|
||||||
|
Navigator: ['navigator'],
|
||||||
|
Clipboard: ['navigator.clipboard'],
|
||||||
|
ClipboardEvent: ['new ClipboardEvent("x")'],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
);
|
|
@ -6,16 +6,15 @@
|
||||||
<body>
|
<body>
|
||||||
<script>
|
<script>
|
||||||
var t = async_test("navigator.cookieEnabled behavior on frames without cookie access");
|
var t = async_test("navigator.cookieEnabled behavior on frames without cookie access");
|
||||||
window.onmessage = function(ev) {
|
window.onmessage = t.step_func_done(ev => {
|
||||||
// Surprisingly, the legacy behavior here is to return true; this actually
|
// Surprisingly, the legacy behavior here is to return true; this actually
|
||||||
// does match the spec definition since false is supposed to be returned
|
// does match the spec definition since false is supposed to be returned
|
||||||
// when a document.cookie write is ignored --- and here it would throw
|
// when a document.cookie write is ignored --- and here it would throw
|
||||||
// a security exception, not be ignored.
|
// a security exception, not be ignored.
|
||||||
assert_equals(ev.data, true);
|
assert_true(ev.data);
|
||||||
t.done();
|
});
|
||||||
}
|
|
||||||
|
|
||||||
t.step(function() {
|
t.step(() => {
|
||||||
var iframe = document.createElement("iframe");
|
var iframe = document.createElement("iframe");
|
||||||
iframe.sandbox = "allow-scripts";
|
iframe.sandbox = "allow-scripts";
|
||||||
iframe.srcdoc = "<scr" + "ipt>" +
|
iframe.srcdoc = "<scr" + "ipt>" +
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>Flexbox Reference: display:table flex items with percent-width cells and content keywords for used flex-basis</title>
|
||||||
|
<link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
|
||||||
|
<style>
|
||||||
|
.container {
|
||||||
|
display: block;
|
||||||
|
width: 200px;
|
||||||
|
border: 1px solid black;
|
||||||
|
}
|
||||||
|
table { width: max-content; }
|
||||||
|
td {
|
||||||
|
background-color: cyan;
|
||||||
|
width: 100%;
|
||||||
|
border: 1px solid gray;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<table><tr><td>1</td><td>2</td></tr></table>
|
||||||
|
</div>
|
||||||
|
<div class="container">
|
||||||
|
<table><tr><td>1</td><td>2</td></tr></table>
|
||||||
|
</div>
|
||||||
|
<div class="container">
|
||||||
|
<table><tr><td>1</td><td>2</td></tr></table>
|
||||||
|
</div>
|
||||||
|
<div class="container">
|
||||||
|
<table><tr><td>1</td><td>2</td></tr></table>
|
||||||
|
</div>
|
||||||
|
</body>
|
|
@ -0,0 +1,36 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>Flexbox Test: display:table flex items with percent-width cells and content keywords for used flex-basis</title>
|
||||||
|
<link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
|
||||||
|
<link rel="help" href="https://drafts.csswg.org/css-flexbox-1/#valdef-flex-basis-content">
|
||||||
|
<link rel="match" href="table-as-item-percent-width-cell-001-ref.html">
|
||||||
|
<meta name="assert" content="If a table as a flex item has used 'flex-basis:content' (or another content-based keyword), and default flex factors, and plenty of space, then it should be sized similarly to a table with 'width:max-content' in a block formatting context.">
|
||||||
|
<style>
|
||||||
|
.container {
|
||||||
|
display: flex;
|
||||||
|
width: 200px;
|
||||||
|
border: 1px solid black;
|
||||||
|
}
|
||||||
|
td {
|
||||||
|
background-color: cyan;
|
||||||
|
width: 100%;
|
||||||
|
border: 1px solid gray;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<!-- The used value of flex-basis is 'content' here, due to the flex-basis
|
||||||
|
and the main-size property both having the value 'auto'. -->
|
||||||
|
<table><tr><td>1</td><td>2</td></tr></table>
|
||||||
|
</div>
|
||||||
|
<div class="container">
|
||||||
|
<table style="flex-basis: content"><tr><td>1</td><td>2</td></tr></table>
|
||||||
|
</div>
|
||||||
|
<div class="container">
|
||||||
|
<table style="flex-basis: min-content"><tr><td>1</td><td>2</td></tr></table>
|
||||||
|
</div>
|
||||||
|
<div class="container">
|
||||||
|
<table style="flex-basis: max-content"><tr><td>1</td><td>2</td></tr></table>
|
||||||
|
</div>
|
||||||
|
</body>
|
|
@ -0,0 +1,90 @@
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<title>CSS Test Reference: breaking of a multicolumn</title>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<link rel="author" title="L. David Baron" href="https://dbaron.org/">
|
||||||
|
<link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com">
|
||||||
|
<link rel="author" title="Mozilla" href="https://mozilla.org/">
|
||||||
|
<style>
|
||||||
|
|
||||||
|
.outer {
|
||||||
|
height: 100px;
|
||||||
|
width: 800px;
|
||||||
|
background: rgba(0, 0, 255, 0.3);
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.blueborders {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 194px; /* 188px first column + (16px gap - 4px rule) / 2 */
|
||||||
|
width: 200px; /* 188px second column + (16px gap - 4px rule) */
|
||||||
|
height: 100px;
|
||||||
|
border-left: blue solid 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.innerbg {
|
||||||
|
height: 100px;
|
||||||
|
width: 188px;
|
||||||
|
background: rgba(255, 0, 255, 0.3);
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.inner {
|
||||||
|
height: 100px;
|
||||||
|
width: 86px;
|
||||||
|
font: 16px/1.25 sans-serif;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lefthalf {
|
||||||
|
border-right: 2px solid fuchsia;
|
||||||
|
padding-right: 7px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.righthalf {
|
||||||
|
padding-left: 7px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.border-bottom {
|
||||||
|
height: 20px;
|
||||||
|
width: 188px;
|
||||||
|
background: green;
|
||||||
|
position: absolute;
|
||||||
|
top: 80px;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<div class="outer">
|
||||||
|
<div class="blueborders"></div>
|
||||||
|
<div class="innerbg" style="left: 0"></div>
|
||||||
|
<div class="inner lefthalf" style="left: 0">
|
||||||
|
AAAAA<br>
|
||||||
|
BBBBB<br>
|
||||||
|
CCCCC<br>
|
||||||
|
DDDDD<br>
|
||||||
|
EEEEE
|
||||||
|
</div>
|
||||||
|
<div class="inner righthalf" style="left: 95px">
|
||||||
|
FFFFF<br>
|
||||||
|
GGGGG<br>
|
||||||
|
HHHHH<br>
|
||||||
|
IIIII<br>
|
||||||
|
JJJJJ
|
||||||
|
</div>
|
||||||
|
<div class="innerbg" style="left: 204px"></div>
|
||||||
|
<div class="inner lefthalf" style="left: 204px">
|
||||||
|
KKKKK<br>
|
||||||
|
LLLLL<br>
|
||||||
|
MMMMM<br>
|
||||||
|
NNNNN
|
||||||
|
</div>
|
||||||
|
<div class="inner righthalf" style="left: 299px">
|
||||||
|
OOOOO<br>
|
||||||
|
PPPPP<br>
|
||||||
|
QQQQQ<br>
|
||||||
|
</div>
|
||||||
|
<div class="border-bottom" style="left: 204px"></div>
|
||||||
|
</div>
|
|
@ -0,0 +1,56 @@
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<title>CSS Test: breaking of a multicolumn</title>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<link rel="author" title="L. David Baron" href="https://dbaron.org/">
|
||||||
|
<link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com">
|
||||||
|
<link rel="author" title="Mozilla" href="https://mozilla.org/">
|
||||||
|
<link rel="help" href="https://drafts.csswg.org/css-multicol/#column-gaps-and-rules">
|
||||||
|
<link rel="help" href="https://drafts.csswg.org/css-multicol/#cf">
|
||||||
|
<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/2309">
|
||||||
|
<link rel="match" href="multicol-breaking-006-ref.html">
|
||||||
|
<style>
|
||||||
|
|
||||||
|
.outer {
|
||||||
|
height: 100px;
|
||||||
|
column-fill: auto;
|
||||||
|
width: 800px;
|
||||||
|
column-count: 4;
|
||||||
|
column-rule: 4px solid blue;
|
||||||
|
column-gap: 16px;
|
||||||
|
background: rgba(0, 0, 255, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.inner {
|
||||||
|
column-count: 2;
|
||||||
|
column-rule: 2px solid fuchsia;
|
||||||
|
column-gap: 16px;
|
||||||
|
background: rgba(255, 0, 255, 0.3);
|
||||||
|
font: 16px/1.25 sans-serif;
|
||||||
|
border-bottom: 20px solid green;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<!-- This test is adapted from multicol-breaking-001.html.
|
||||||
|
The inner column is changed to have "height:auto" and border-bottom. -->
|
||||||
|
<div class="outer">
|
||||||
|
<div class="inner" style="height: auto">
|
||||||
|
AAAAA<br>
|
||||||
|
BBBBB<br>
|
||||||
|
CCCCC<br>
|
||||||
|
DDDDD<br>
|
||||||
|
EEEEE<br>
|
||||||
|
FFFFF<br>
|
||||||
|
GGGGG<br>
|
||||||
|
HHHHH<br>
|
||||||
|
IIIII<br>
|
||||||
|
JJJJJ<br>
|
||||||
|
KKKKK<br>
|
||||||
|
LLLLL<br>
|
||||||
|
MMMMM<br>
|
||||||
|
NNNNN<br>
|
||||||
|
OOOOO<br>
|
||||||
|
PPPPP<br>
|
||||||
|
QQQQQ
|
||||||
|
</div>
|
||||||
|
</div>
|
|
@ -0,0 +1,8 @@
|
||||||
|
<!doctype html>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>CSS Test: non-opaque scrollbar-color should work on the root</title>
|
||||||
|
<style>
|
||||||
|
:root {
|
||||||
|
background-color: black;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -0,0 +1,14 @@
|
||||||
|
<!doctype html>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>CSS Test: non-opaque scrollbar-color should work on the root</title>
|
||||||
|
<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
|
||||||
|
<link rel="author" title="Mozilla" href="https://www.mozilla.org">
|
||||||
|
<link rel="help" href="https://drafts.csswg.org/css-scrollbars-1/#scrollbar-color-properties">
|
||||||
|
<link rel="match" href="transparent-on-root-ref.html">
|
||||||
|
<style>
|
||||||
|
:root {
|
||||||
|
overflow: scroll;
|
||||||
|
scrollbar-color: transparent transparent;
|
||||||
|
background-color: black;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -7,8 +7,7 @@ The tests are designed to be run from your local computer.
|
||||||
Running the tests requires `python`, `pip` and `virtualenv`, as well as updating
|
Running the tests requires `python`, `pip` and `virtualenv`, as well as updating
|
||||||
the system `hosts` file.
|
the system `hosts` file.
|
||||||
|
|
||||||
Python 3 is supported and preferred, but for now it is still possible to use
|
WPT requires Python 3.6 or higher.
|
||||||
Python 2.7 if necessary.
|
|
||||||
|
|
||||||
The required setup is different depending on your operating system.
|
The required setup is different depending on your operating system.
|
||||||
|
|
||||||
|
@ -45,10 +44,10 @@ See also [additional setup required to run Safari](safari.md).
|
||||||
|
|
||||||
### Windows Setup
|
### Windows Setup
|
||||||
|
|
||||||
Download and install [Python 2.7](https://www.python.org/downloads). The
|
Download and install [Python 3](https://www.python.org/downloads). The
|
||||||
installer includes `pip` by default.
|
installer includes `pip` by default.
|
||||||
|
|
||||||
Add `C:\Python27` and `C:\Python27\Scripts` to your `%Path%`
|
Add `C:\Python39` and `C:\Python39\Scripts` to your `%Path%`
|
||||||
[environment variable](http://www.computerhope.com/issues/ch000549.htm).
|
[environment variable](http://www.computerhope.com/issues/ch000549.htm).
|
||||||
|
|
||||||
Finally, install `virtualenv`:
|
Finally, install `virtualenv`:
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# Writing H2 Tests
|
# Writing H2 Tests
|
||||||
|
|
||||||
> <b>Important:</b> The HTTP/2.0 server requires you to have Python 2.7.10+
|
> <b>Important:</b> The HTTP/2.0 server requires you to have
|
||||||
and OpenSSL 1.0.2+. This is because HTTP/2.0 is negotiated using the
|
OpenSSL 1.0.2+. This is because HTTP/2.0 is negotiated using the
|
||||||
[TLS ALPN](https://tools.ietf.org/html/rfc7301) extension, which is only supported in [OpenSSL 1.0.2](https://www.openssl.org/news/openssl-1.0.2-notes.html) and up.
|
[TLS ALPN](https://tools.ietf.org/html/rfc7301) extension, which is only supported in [OpenSSL 1.0.2](https://www.openssl.org/news/openssl-1.0.2-notes.html) and up.
|
||||||
|
|
||||||
These instructions assume you are already familiar with the testing
|
These instructions assume you are already familiar with the testing
|
||||||
|
@ -153,4 +153,4 @@ the HEADER and CONTINUATION frames are constructed in the same way.
|
||||||
Ends the stream with the given ID, or the one that request was made on if no ID given.
|
Ends the stream with the given ID, or the one that request was made on if no ID given.
|
||||||
|
|
||||||
- <b>Parameters</b>
|
- <b>Parameters</b>
|
||||||
- <b>stream_id</b>: Id of stream to send frame on. Will use the request stream ID if None
|
- <b>stream_id</b>: Id of stream to send frame on. Will use the request stream ID if None
|
||||||
|
|
|
@ -61,7 +61,7 @@ TRAILING WHITESPACE:example/*
|
||||||
|
|
||||||
Similarly, you can also
|
Similarly, you can also
|
||||||
use
|
use
|
||||||
[shell-style wildcards](https://docs.python.org/2/library/fnmatch.html) to
|
[shell-style wildcards](https://docs.python.org/library/fnmatch.html) to
|
||||||
express other filename patterns or directory-name patterns.
|
express other filename patterns or directory-name patterns.
|
||||||
|
|
||||||
Finally, to ignore just one line in a file, use the following format:
|
Finally, to ignore just one line in a file, use the following format:
|
||||||
|
|
|
@ -81,21 +81,6 @@ css/css-align/resources/__init__.py
|
||||||
This requirement will be removed once we move to Python 3, due to
|
This requirement will be removed once we move to Python 3, due to
|
||||||
[PEP 420](https://www.python.org/dev/peps/pep-0420/).
|
[PEP 420](https://www.python.org/dev/peps/pep-0420/).
|
||||||
|
|
||||||
### Python3 compatibility
|
|
||||||
|
|
||||||
Even though Python3 is not fully supported at this point, some work is being
|
|
||||||
done to add compatibility for it. This is why you can see in multiple places
|
|
||||||
the use of the `six` python module which is meant to provide a set of simple
|
|
||||||
utilities that work for both generation of python (see
|
|
||||||
[docs](https://six.readthedocs.io/)). The module is vendored in
|
|
||||||
tools/third_party/six/six.py.
|
|
||||||
|
|
||||||
When an handler is added, it should be at least syntax-compatible with Python3.
|
|
||||||
You can check that by running:
|
|
||||||
```
|
|
||||||
python3 -m py_compile <path/to/handler.py>
|
|
||||||
```
|
|
||||||
|
|
||||||
## Example: Dynamic HTTP headers
|
## Example: Dynamic HTTP headers
|
||||||
|
|
||||||
The following code defines a Python handler that allows the requester to
|
The following code defines a Python handler that allows the requester to
|
||||||
|
|
|
@ -127,8 +127,8 @@ by default and needs to be run using `./wpt serve --h2` in order to enable it.
|
||||||
The HTTP/2.0 server supports handlers that work per-frame; these, along with the
|
The HTTP/2.0 server supports handlers that work per-frame; these, along with the
|
||||||
API are documented in [Writing H2 Tests](h2tests).
|
API are documented in [Writing H2 Tests](h2tests).
|
||||||
|
|
||||||
> <b>Important:</b> The HTTP/2.0 server requires you to have Python 2.7.10+
|
> <b>Important:</b> The HTTP/2.0 server requires you to have
|
||||||
and OpenSSL 1.0.2+. This is because HTTP/2.0 is negotiated using the
|
OpenSSL 1.0.2+. This is because HTTP/2.0 is negotiated using the
|
||||||
[TLS ALPN](https://tools.ietf.org/html/rfc7301) extension, which is only
|
[TLS ALPN](https://tools.ietf.org/html/rfc7301) extension, which is only
|
||||||
supported in
|
supported in
|
||||||
[OpenSSL 1.0.2](https://www.openssl.org/news/openssl-1.0.2-notes.html) and up.
|
[OpenSSL 1.0.2](https://www.openssl.org/news/openssl-1.0.2-notes.html) and up.
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
def main(request, response):
|
||||||
|
output = b"HTTP/1.1 "
|
||||||
|
output += request.GET.first(b"input")
|
||||||
|
output += b"\nheader-parsing: is sad\n"
|
||||||
|
response.writer.write(output)
|
||||||
|
response.close_connection = True
|
|
@ -0,0 +1,98 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
input: "",
|
||||||
|
expected: null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: "BLAH",
|
||||||
|
expected: null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: "0 OK",
|
||||||
|
expected: {
|
||||||
|
status: 0,
|
||||||
|
statusText: "OK"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: "1 OK",
|
||||||
|
expected: {
|
||||||
|
status: 1,
|
||||||
|
statusText: "OK"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: "99 NOT OK",
|
||||||
|
expected: {
|
||||||
|
status: 99,
|
||||||
|
statusText: "NOT OK"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: "077 77",
|
||||||
|
expected: {
|
||||||
|
status: 77,
|
||||||
|
statusText: "77"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: "099 HELLO",
|
||||||
|
expected: {
|
||||||
|
status: 99,
|
||||||
|
statusText: "HELLO"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: "200",
|
||||||
|
expected: {
|
||||||
|
status: 200,
|
||||||
|
statusText: ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: "999 DOES IT MATTER",
|
||||||
|
expected: {
|
||||||
|
status: 999,
|
||||||
|
statusText: "DOES IT MATTER"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: "1000 BOO",
|
||||||
|
expected: null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: "0200 BOO",
|
||||||
|
expected: null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: "65736 NOT 200 OR SOME SUCH",
|
||||||
|
expected: null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: "131072 HI",
|
||||||
|
expected: null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: "-200 TEST",
|
||||||
|
expected: null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: "0xA",
|
||||||
|
expected: null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: "C8",
|
||||||
|
expected: null
|
||||||
|
}
|
||||||
|
].forEach(({ description, input, expected }) => {
|
||||||
|
promise_test(async t => {
|
||||||
|
if (expected !== null) {
|
||||||
|
const response = await fetch("resources/status-code.py?input=" + input);
|
||||||
|
assert_equals(response.status, expected.status);
|
||||||
|
assert_equals(response.statusText, expected.statusText);
|
||||||
|
assert_equals(response.headers.get("header-parsing"), "is sad");
|
||||||
|
} else {
|
||||||
|
await promise_rejects_js(t, TypeError, fetch("resources/status-code.py?input=" + input));
|
||||||
|
}
|
||||||
|
}, `HTTP/1.1 ${input} ${expected === null ? "(network error)" : ""}`);
|
||||||
|
});
|
|
@ -0,0 +1,22 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<title>Layout Instability: addition of scale transform above filter</title>
|
||||||
|
<link rel="help" href="https://wicg.github.io/layout-instability/" />
|
||||||
|
<div id=target style="width: 581px">
|
||||||
|
<div id=moved style="filter: saturate(1.1); width: 300px; height:300px; background: lightblue">
|
||||||
|
</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);
|
||||||
|
|
||||||
|
target.style.transform = "scale(1.1)";
|
||||||
|
await waitForAnimationFrames(1);
|
||||||
|
|
||||||
|
assert_equals(watcher.score, 0);
|
||||||
|
}, 'addition of scale transform above filter');
|
||||||
|
|
||||||
|
</script>
|
|
@ -0,0 +1,32 @@
|
||||||
|
<!doctype html>
|
||||||
|
<script src="/resources/testharness.js"></script>
|
||||||
|
<script src="/resources/testharnessreport.js"></script>
|
||||||
|
<script src="resources/dummy.js?pipe=trickle(d1)"></script>
|
||||||
|
<link rel="stylesheet" media="print" href="resources/dummy.css?print">
|
||||||
|
<link rel="stylesheet" href="resources/dummy.css?non-print">
|
||||||
|
<script>
|
||||||
|
let t = async_test("Non-matching link media is not preloaded");
|
||||||
|
window.addEventListener("load", t.step_func_done(function() {
|
||||||
|
let entries = performance.getEntriesByType('resource');
|
||||||
|
let found_print = null;
|
||||||
|
let found_non_print = null;
|
||||||
|
for (let entry of entries) {
|
||||||
|
if (entry.name.includes("?print")) {
|
||||||
|
assert_equals(found_print, null);
|
||||||
|
found_print = entry.startTime;
|
||||||
|
}
|
||||||
|
if (entry.name.includes("?non-print")) {
|
||||||
|
assert_equals(found_non_print, null);
|
||||||
|
found_non_print = entry.startTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assert_not_equals(found_print, null, "Should've loaded print sheet");
|
||||||
|
assert_not_equals(found_non_print, null, "Should've loaded non-print sheet");
|
||||||
|
// We can assert_greater_than (rather than greater_than_equal) because if
|
||||||
|
// the non-print sheet has been preloaded but the print one hasn't, we have
|
||||||
|
// the trickle mechanism to try to guarantee that enough time has passed
|
||||||
|
// between one load and the next.
|
||||||
|
assert_greater_than(found_print, found_non_print, "Non-print sheet should've started loading before print sheet")
|
||||||
|
}));
|
||||||
|
</script>
|
||||||
|
|
|
@ -205,13 +205,13 @@
|
||||||
.pointerMove(0, 0, {origin: target1})
|
.pointerMove(0, 0, {origin: target1})
|
||||||
.pointerMove(0, 0, {origin: btnCapture})
|
.pointerMove(0, 0, {origin: btnCapture})
|
||||||
.pointerDown()
|
.pointerDown()
|
||||||
.pointerMove(0, 0, {origin: btnCapture})
|
.pointerMove(1, 1, {origin: btnCapture})
|
||||||
.pointerMove(10, 0, {origin: btnCapture})
|
.pointerMove(10, 0, {origin: btnCapture})
|
||||||
.pointerMove(0, 0, {origin: target1})
|
.pointerMove(0, 0, {origin: target1})
|
||||||
.pointerMove(0, 0, {origin: target0})
|
.pointerMove(0, 0, {origin: target0})
|
||||||
.pointerMove(0, 0, {origin: target1})
|
.pointerMove(0, 0, {origin: target1})
|
||||||
.pointerUp()
|
.pointerUp()
|
||||||
.pointerMove(0, 0, {origin: target1})
|
.pointerMove(1, 1, {origin: target1})
|
||||||
.send();
|
.send();
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -1,5 +1,12 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<title>Makes sure that Link headers preload resources</title>
|
<title>Makes sure that Link headers preload resources</title>
|
||||||
|
<!--
|
||||||
|
This and the line below ensure that the trailing crossorigin in the link
|
||||||
|
header is honored, otherwise we'd load this resource twice and the test would
|
||||||
|
fail.
|
||||||
|
-->
|
||||||
|
<link rel="preload" as="style" crossorigin href="resources/dummy.css?link-header-crossorigin-preload2">
|
||||||
|
<link rel="stylesheet" crossorigin href="resources/dummy.css?link-header-crossorigin-preload2">
|
||||||
<script src="/resources/testharness.js"></script>
|
<script src="/resources/testharness.js"></script>
|
||||||
<script src="/resources/testharnessreport.js"></script>
|
<script src="/resources/testharnessreport.js"></script>
|
||||||
<script src="/preload/resources/preload_helper.js"></script>
|
<script src="/preload/resources/preload_helper.js"></script>
|
||||||
|
@ -12,7 +19,9 @@
|
||||||
function check_finished() {
|
function check_finished() {
|
||||||
if (numberOfResourceTimingEntries("resources/square.png?link-header-preload") == 1 &&
|
if (numberOfResourceTimingEntries("resources/square.png?link-header-preload") == 1 &&
|
||||||
numberOfResourceTimingEntries("resources/dummy.js?link-header-preload") == 1 &&
|
numberOfResourceTimingEntries("resources/dummy.js?link-header-preload") == 1 &&
|
||||||
numberOfResourceTimingEntries("resources/dummy.css?link-header-preload") == 1) {
|
numberOfResourceTimingEntries("resources/dummy.css?link-header-preload") == 1 &&
|
||||||
|
numberOfResourceTimingEntries("resources/dummy.css?link-header-crossorigin-preload1") == 1 &&
|
||||||
|
numberOfResourceTimingEntries("resources/dummy.css?link-header-crossorigin-preload2") == 1) {
|
||||||
done();
|
done();
|
||||||
}
|
}
|
||||||
iterations++;
|
iterations++;
|
||||||
|
@ -21,6 +30,8 @@
|
||||||
verifyNumberOfResourceTimingEntries("resources/square.png?link-header-preload", 1);
|
verifyNumberOfResourceTimingEntries("resources/square.png?link-header-preload", 1);
|
||||||
verifyNumberOfResourceTimingEntries("resources/dummy.js?link-header-preload", 1);
|
verifyNumberOfResourceTimingEntries("resources/dummy.js?link-header-preload", 1);
|
||||||
verifyNumberOfResourceTimingEntries("resources/dummy.css?link-header-preload", 1);
|
verifyNumberOfResourceTimingEntries("resources/dummy.css?link-header-preload", 1);
|
||||||
|
verifyNumberOfResourceTimingEntries("resources/dummy.css?link-header-crossorigin-preload1", 1);
|
||||||
|
verifyNumberOfResourceTimingEntries("resources/dummy.css?link-header-crossorigin-preload2", 1);
|
||||||
done();
|
done();
|
||||||
} else {
|
} else {
|
||||||
step_timeout(check_finished, 500);
|
step_timeout(check_finished, 500);
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
Link: </preload/resources/dummy.js?link-header-preload>;rel=preload;as=script
|
Link: </preload/resources/dummy.js?link-header-preload>;rel=preload;as=script
|
||||||
Link: </preload/resources/dummy.css?link-header-preload>;rel=preload;as=style
|
Link: </preload/resources/dummy.css?link-header-preload>;rel=preload;as=style
|
||||||
Link: </preload/resources/square.png?link-header-preload>;rel=preload;as=image
|
Link: </preload/resources/square.png?link-header-preload>;rel=preload;as=image
|
||||||
|
Link: </preload/resources/dummy.css?link-header-crossorigin-preload1>;rel=preload;as=style;crossorigin
|
||||||
|
Link: </preload/resources/dummy.css?link-header-crossorigin-preload2>;rel=preload;as=style;crossorigin
|
||||||
|
|
||||||
|
|
|
@ -215,6 +215,8 @@ var GenericSensorTest = (() => {
|
||||||
['Accelerometer', device.mojom.SensorType.ACCELEROMETER],
|
['Accelerometer', device.mojom.SensorType.ACCELEROMETER],
|
||||||
['LinearAccelerationSensor',
|
['LinearAccelerationSensor',
|
||||||
device.mojom.SensorType.LINEAR_ACCELERATION],
|
device.mojom.SensorType.LINEAR_ACCELERATION],
|
||||||
|
['GravitySensor',
|
||||||
|
device.mojom.SensorType.GRAVITY],
|
||||||
['AmbientLightSensor', device.mojom.SensorType.AMBIENT_LIGHT],
|
['AmbientLightSensor', device.mojom.SensorType.AMBIENT_LIGHT],
|
||||||
['Gyroscope', device.mojom.SensorType.GYROSCOPE],
|
['Gyroscope', device.mojom.SensorType.GYROSCOPE],
|
||||||
['Magnetometer', device.mojom.SensorType.MAGNETOMETER],
|
['Magnetometer', device.mojom.SensorType.MAGNETOMETER],
|
||||||
|
|
|
@ -3543,8 +3543,6 @@ IdlNamespace.prototype.test = function ()
|
||||||
function idl_test(srcs, deps, idl_setup_func) {
|
function idl_test(srcs, deps, idl_setup_func) {
|
||||||
return promise_test(function (t) {
|
return promise_test(function (t) {
|
||||||
var idl_array = new IdlArray();
|
var idl_array = new IdlArray();
|
||||||
srcs = (srcs instanceof Array) ? srcs : [srcs] || [];
|
|
||||||
deps = (deps instanceof Array) ? deps : [deps] || [];
|
|
||||||
var setup_error = null;
|
var setup_error = null;
|
||||||
const validationIgnored = [
|
const validationIgnored = [
|
||||||
"constructor-member",
|
"constructor-member",
|
||||||
|
|
|
@ -1,6 +1,3 @@
|
||||||
parameters:
|
|
||||||
pyflag: --py3
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- script: ./wpt make-hosts-file | sudo tee -a /etc/hosts
|
- script: ./wpt make-hosts-file | sudo tee -a /etc/hosts
|
||||||
displayName: 'Update hosts (macOS)'
|
displayName: 'Update hosts (macOS)'
|
||||||
|
@ -8,6 +5,6 @@ steps:
|
||||||
- powershell: |
|
- powershell: |
|
||||||
$hostFile = "$env:systemroot\System32\drivers\etc\hosts"
|
$hostFile = "$env:systemroot\System32\drivers\etc\hosts"
|
||||||
Copy-Item -Path $hostFile -Destination "$hostFile.back" -Force
|
Copy-Item -Path $hostFile -Destination "$hostFile.back" -Force
|
||||||
python wpt ${{ parameters.pyflag }} make-hosts-file | Out-File $env:systemroot\System32\drivers\etc\hosts -Encoding ascii -Append
|
python wpt make-hosts-file | Out-File $env:systemroot\System32\drivers\etc\hosts -Encoding ascii -Append
|
||||||
displayName: 'Update hosts (Windows)'
|
displayName: 'Update hosts (Windows)'
|
||||||
condition: and(succeeded(), eq(variables['Agent.OS'], 'Windows_NT'))
|
condition: and(succeeded(), eq(variables['Agent.OS'], 'Windows_NT'))
|
||||||
|
|
|
@ -1,7 +1,4 @@
|
||||||
parameters:
|
|
||||||
pyflag: --py3
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
# `python wpt` instead of `./wpt` is to make this work on Windows:
|
# `python wpt` instead of `./wpt` is to make this work on Windows:
|
||||||
- script: python wpt ${{ parameters.pyflag }} manifest
|
- script: python wpt manifest
|
||||||
displayName: 'Update manifest'
|
displayName: 'Update manifest'
|
||||||
|
|
|
@ -105,11 +105,6 @@ components:
|
||||||
|
|
||||||
browser-servo: {}
|
browser-servo: {}
|
||||||
|
|
||||||
tox-python2:
|
|
||||||
env:
|
|
||||||
TOXENV: py27
|
|
||||||
PY_COLORS: 0
|
|
||||||
|
|
||||||
tox-python3:
|
tox-python3:
|
||||||
env:
|
env:
|
||||||
TOXENV: py36
|
TOXENV: py36
|
||||||
|
@ -402,20 +397,6 @@ tasks:
|
||||||
- update_built
|
- update_built
|
||||||
command: "./tools/ci/ci_built_diff.sh"
|
command: "./tools/ci/ci_built_diff.sh"
|
||||||
|
|
||||||
- tools/ unittests (Python 2):
|
|
||||||
use:
|
|
||||||
- wpt-base
|
|
||||||
- trigger-pr
|
|
||||||
- tox-python2
|
|
||||||
description: >-
|
|
||||||
Unit tests for tools running under Python 2.7, excluding wptrunner
|
|
||||||
command: ./tools/ci/ci_tools_unittest.sh
|
|
||||||
env:
|
|
||||||
HYPOTHESIS_PROFILE: ci
|
|
||||||
schedule-if:
|
|
||||||
run-job:
|
|
||||||
- tools_unittest
|
|
||||||
|
|
||||||
- tools/ unittests (Python 3.6):
|
- tools/ unittests (Python 3.6):
|
||||||
description: >-
|
description: >-
|
||||||
Unit tests for tools running under Python 3.6, excluding wptrunner
|
Unit tests for tools running under Python 3.6, excluding wptrunner
|
||||||
|
@ -447,28 +428,6 @@ tasks:
|
||||||
run-job:
|
run-job:
|
||||||
- tools_unittest
|
- tools_unittest
|
||||||
|
|
||||||
- tools/ integration tests (Python 2):
|
|
||||||
description: >-
|
|
||||||
Integration tests for tools running under Python 2.7
|
|
||||||
use:
|
|
||||||
- wpt-base
|
|
||||||
- trigger-pr
|
|
||||||
- tox-python2
|
|
||||||
command: ./tools/ci/ci_tools_integration_test.sh
|
|
||||||
install:
|
|
||||||
- libnss3-tools
|
|
||||||
options:
|
|
||||||
oom-killer: true
|
|
||||||
browser:
|
|
||||||
- firefox
|
|
||||||
- chrome
|
|
||||||
channel: experimental
|
|
||||||
xvfb: true
|
|
||||||
hosts: true
|
|
||||||
schedule-if:
|
|
||||||
run-job:
|
|
||||||
- wpt_integration
|
|
||||||
|
|
||||||
- tools/ integration tests (Python 3.6):
|
- tools/ integration tests (Python 3.6):
|
||||||
description: >-
|
description: >-
|
||||||
Integration tests for tools running under Python 3.6
|
Integration tests for tools running under Python 3.6
|
||||||
|
@ -515,23 +474,6 @@ tasks:
|
||||||
run-job:
|
run-job:
|
||||||
- wpt_integration
|
- wpt_integration
|
||||||
|
|
||||||
- resources/ tests (Python 2):
|
|
||||||
description: >-
|
|
||||||
Tests for testharness.js and other files in resources/ under Python 2.7
|
|
||||||
use:
|
|
||||||
- wpt-base
|
|
||||||
- trigger-pr
|
|
||||||
- tox-python2
|
|
||||||
command: ./tools/ci/ci_resources_unittest.sh
|
|
||||||
options:
|
|
||||||
browser:
|
|
||||||
- firefox
|
|
||||||
xvfb: true
|
|
||||||
hosts: true
|
|
||||||
schedule-if:
|
|
||||||
run-job:
|
|
||||||
- resources_unittest
|
|
||||||
|
|
||||||
- resources/ tests (Python 3.6):
|
- resources/ tests (Python 3.6):
|
||||||
description: >-
|
description: >-
|
||||||
Tests for testharness.js and other files in resources/ under Python 3.6
|
Tests for testharness.js and other files in resources/ under Python 3.6
|
||||||
|
@ -572,32 +514,6 @@ tasks:
|
||||||
run-job:
|
run-job:
|
||||||
- resources_unittest
|
- resources_unittest
|
||||||
|
|
||||||
- infrastructure/ tests:
|
|
||||||
description: >-
|
|
||||||
Smoketests for wptrunner
|
|
||||||
vars:
|
|
||||||
channel: nightly
|
|
||||||
use:
|
|
||||||
- wpt-base
|
|
||||||
- trigger-pr
|
|
||||||
- browser-firefox
|
|
||||||
command: ./tools/ci/ci_wptrunner_infrastructure.sh --py2
|
|
||||||
install:
|
|
||||||
- libnss3-tools
|
|
||||||
- libappindicator1
|
|
||||||
- fonts-liberation
|
|
||||||
options:
|
|
||||||
oom-killer: true
|
|
||||||
browser:
|
|
||||||
- firefox
|
|
||||||
- chrome
|
|
||||||
channel: experimental
|
|
||||||
xvfb: true
|
|
||||||
hosts: false
|
|
||||||
schedule-if:
|
|
||||||
run-job:
|
|
||||||
- wptrunner_infrastructure
|
|
||||||
|
|
||||||
- infrastructure/ tests (Python 3):
|
- infrastructure/ tests (Python 3):
|
||||||
description: >-
|
description: >-
|
||||||
Smoketests for wptrunner
|
Smoketests for wptrunner
|
||||||
|
|
|
@ -132,17 +132,13 @@ def test_verify_payload():
|
||||||
'lint']),
|
'lint']),
|
||||||
("pr_event.json", True, {".taskcluster.yml", ".travis.yml", "tools/ci/start.sh"},
|
("pr_event.json", True, {".taskcluster.yml", ".travis.yml", "tools/ci/start.sh"},
|
||||||
['lint',
|
['lint',
|
||||||
'tools/ unittests (Python 2)',
|
|
||||||
'tools/ unittests (Python 3.6)',
|
'tools/ unittests (Python 3.6)',
|
||||||
'tools/ unittests (Python 3.8)',
|
'tools/ unittests (Python 3.8)',
|
||||||
'tools/ integration tests (Python 2)',
|
|
||||||
'tools/ integration tests (Python 3.6)',
|
'tools/ integration tests (Python 3.6)',
|
||||||
'tools/ integration tests (Python 3.8)',
|
'tools/ integration tests (Python 3.8)',
|
||||||
'resources/ tests (Python 2)',
|
|
||||||
'resources/ tests (Python 3.6)',
|
'resources/ tests (Python 3.6)',
|
||||||
'resources/ tests (Python 3.8)',
|
'resources/ tests (Python 3.8)',
|
||||||
'download-firefox-nightly',
|
'download-firefox-nightly',
|
||||||
'infrastructure/ tests',
|
|
||||||
'infrastructure/ tests (Python 3)',
|
'infrastructure/ tests (Python 3)',
|
||||||
'sink-task']),
|
'sink-task']),
|
||||||
# More tests are affected in the actual PR but it shouldn't affect the scheduled tasks
|
# More tests are affected in the actual PR but it shouldn't affect the scheduled tasks
|
||||||
|
|
|
@ -12,16 +12,16 @@ select = E,W,F,N
|
||||||
# E402: module level import not at top of file
|
# E402: module level import not at top of file
|
||||||
# E731: do not assign a lambda expression, use a def
|
# E731: do not assign a lambda expression, use a def
|
||||||
# W504: line break after binary operator
|
# W504: line break after binary operator
|
||||||
|
# W601: .has_key() is deprecated, use ‘in’
|
||||||
# W605: invalid escape sequence
|
# W605: invalid escape sequence
|
||||||
# N801: class names should use CapWords convention
|
# N801: class names should use CapWords convention
|
||||||
# N802: function name should be lowercase
|
# N802: function name should be lowercase
|
||||||
# N806: variable in function should be lowercase
|
# N806: variable in function should be lowercase
|
||||||
ignore = E128,E129,E226,E231,E251,E265,E302,E303,E305,E402,E731,W504,W605,N801,N802,N806
|
ignore = E128,E129,E226,E231,E251,E265,E302,E303,E305,E402,E731,W504,W601,W605,N801,N802,N806
|
||||||
exclude =
|
exclude =
|
||||||
.tox,
|
.tox,
|
||||||
pywebsocket,
|
pywebsocket,
|
||||||
third_party,
|
third_party,
|
||||||
wptrunner,
|
|
||||||
wptserve/docs/conf.py,
|
wptserve/docs/conf.py,
|
||||||
wptserve/tests/functional/docroot/invalid.py
|
wptserve/tests/functional/docroot/invalid.py
|
||||||
max-line-length = 141
|
max-line-length = 141
|
||||||
|
|
|
@ -2,6 +2,8 @@ import argparse
|
||||||
from . import browser
|
from . import browser
|
||||||
|
|
||||||
latest_channels = {
|
latest_channels = {
|
||||||
|
'android_weblayer': 'dev',
|
||||||
|
'android_webview': 'dev',
|
||||||
'firefox': 'nightly',
|
'firefox': 'nightly',
|
||||||
'chrome': 'nightly',
|
'chrome': 'nightly',
|
||||||
'chrome_android': 'dev',
|
'chrome_android': 'dev',
|
||||||
|
|
|
@ -427,10 +427,12 @@ class ChromeiOS(BrowserSetup):
|
||||||
class AndroidWeblayer(BrowserSetup):
|
class AndroidWeblayer(BrowserSetup):
|
||||||
name = "android_weblayer"
|
name = "android_weblayer"
|
||||||
browser_cls = browser.AndroidWeblayer
|
browser_cls = browser.AndroidWeblayer
|
||||||
|
experimental_channels = ("dev", "canary")
|
||||||
|
|
||||||
def setup_kwargs(self, kwargs):
|
def setup_kwargs(self, kwargs):
|
||||||
if kwargs.get("device_serial"):
|
if kwargs.get("device_serial"):
|
||||||
self.browser.device_serial = kwargs["device_serial"]
|
self.browser.device_serial = kwargs["device_serial"]
|
||||||
|
browser_channel = kwargs["browser_channel"]
|
||||||
if kwargs["webdriver_binary"] is None:
|
if kwargs["webdriver_binary"] is None:
|
||||||
webdriver_binary = None
|
webdriver_binary = None
|
||||||
if not kwargs["install_webdriver"]:
|
if not kwargs["install_webdriver"]:
|
||||||
|
@ -443,7 +445,7 @@ class AndroidWeblayer(BrowserSetup):
|
||||||
logger.info("Downloading chromedriver")
|
logger.info("Downloading chromedriver")
|
||||||
webdriver_binary = self.browser.install_webdriver(
|
webdriver_binary = self.browser.install_webdriver(
|
||||||
dest=self.venv.bin_path,
|
dest=self.venv.bin_path,
|
||||||
channel=kwargs["browser_channel"])
|
channel=browser_channel)
|
||||||
else:
|
else:
|
||||||
logger.info("Using webdriver binary %s" % webdriver_binary)
|
logger.info("Using webdriver binary %s" % webdriver_binary)
|
||||||
|
|
||||||
|
@ -451,6 +453,9 @@ class AndroidWeblayer(BrowserSetup):
|
||||||
kwargs["webdriver_binary"] = webdriver_binary
|
kwargs["webdriver_binary"] = webdriver_binary
|
||||||
else:
|
else:
|
||||||
raise WptrunError("Unable to locate or install chromedriver binary")
|
raise WptrunError("Unable to locate or install chromedriver binary")
|
||||||
|
if browser_channel in self.experimental_channels:
|
||||||
|
logger.info("Automatically turning on experimental features for WebLayer Dev/Canary")
|
||||||
|
kwargs["binary_args"].append("--enable-experimental-web-platform-features")
|
||||||
|
|
||||||
|
|
||||||
class AndroidWebview(BrowserSetup):
|
class AndroidWebview(BrowserSetup):
|
||||||
|
|
|
@ -1,9 +1,7 @@
|
||||||
import subprocess
|
from .base import require_arg
|
||||||
|
|
||||||
from .base import Browser, ExecutorBrowser, require_arg
|
|
||||||
from .base import get_timeout_multiplier # noqa: F401
|
from .base import get_timeout_multiplier # noqa: F401
|
||||||
from .chrome import executor_kwargs as chrome_executor_kwargs
|
from .chrome import executor_kwargs as chrome_executor_kwargs
|
||||||
from ..webdriver_server import ChromeDriverServer
|
from .chrome_android import ChromeAndroidBrowserBase
|
||||||
from ..executors.executorwebdriver import (WebDriverTestharnessExecutor, # noqa: F401
|
from ..executors.executorwebdriver import (WebDriverTestharnessExecutor, # noqa: F401
|
||||||
WebDriverRefTestExecutor) # noqa: F401
|
WebDriverRefTestExecutor) # noqa: F401
|
||||||
from ..executors.executorchrome import ChromeDriverWdspecExecutor # noqa: F401
|
from ..executors.executorchrome import ChromeDriverWdspecExecutor # noqa: F401
|
||||||
|
@ -74,61 +72,19 @@ def env_options():
|
||||||
return {"server_host": "127.0.0.1"}
|
return {"server_host": "127.0.0.1"}
|
||||||
|
|
||||||
|
|
||||||
#TODO: refactor common elements of WeblayerShell and ChromeAndroidBrowser
|
class WeblayerShell(ChromeAndroidBrowserBase):
|
||||||
class WeblayerShell(Browser):
|
|
||||||
"""Chrome is backed by chromedriver, which is supplied through
|
"""Chrome is backed by chromedriver, which is supplied through
|
||||||
``wptrunner.webdriver.ChromeDriverServer``.
|
``wptrunner.webdriver.ChromeDriverServer``.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, logger, binary, webdriver_binary="chromedriver",
|
def __init__(self, logger, binary,
|
||||||
|
webdriver_binary="chromedriver",
|
||||||
|
remote_queue=None,
|
||||||
device_serial=None,
|
device_serial=None,
|
||||||
webdriver_args=None):
|
webdriver_args=None):
|
||||||
"""Creates a new representation of Chrome. The `binary` argument gives
|
"""Creates a new representation of Chrome. The `binary` argument gives
|
||||||
the browser binary to use for testing."""
|
the browser binary to use for testing."""
|
||||||
Browser.__init__(self, logger)
|
super(WeblayerShell, self).__init__(logger,
|
||||||
|
webdriver_binary, remote_queue, device_serial, webdriver_args)
|
||||||
self.binary = binary
|
self.binary = binary
|
||||||
self.device_serial = device_serial
|
self.wptserver_ports = _wptserve_ports
|
||||||
self.server = ChromeDriverServer(self.logger,
|
|
||||||
binary=webdriver_binary,
|
|
||||||
args=webdriver_args)
|
|
||||||
self.setup_adb_reverse()
|
|
||||||
|
|
||||||
def _adb_run(self, args):
|
|
||||||
cmd = ['adb']
|
|
||||||
if self.device_serial:
|
|
||||||
cmd.extend(['-s', self.device_serial])
|
|
||||||
cmd.extend(args)
|
|
||||||
self.logger.info(' '.join(cmd))
|
|
||||||
subprocess.check_call(cmd)
|
|
||||||
|
|
||||||
def setup_adb_reverse(self):
|
|
||||||
self._adb_run(['wait-for-device'])
|
|
||||||
self._adb_run(['forward', '--remove-all'])
|
|
||||||
self._adb_run(['reverse', '--remove-all'])
|
|
||||||
# "adb reverse" basically forwards network connection from device to
|
|
||||||
# host.
|
|
||||||
for port in _wptserve_ports:
|
|
||||||
self._adb_run(['reverse', 'tcp:%d' % port, 'tcp:%d' % port])
|
|
||||||
|
|
||||||
def start(self, **kwargs):
|
|
||||||
self.server.start(block=False)
|
|
||||||
|
|
||||||
def stop(self, force=False):
|
|
||||||
self.server.stop(force=force)
|
|
||||||
|
|
||||||
def pid(self):
|
|
||||||
return self.server.pid
|
|
||||||
|
|
||||||
def is_alive(self):
|
|
||||||
# TODO(ato): This only indicates the driver is alive,
|
|
||||||
# and doesn't say anything about whether a browser session
|
|
||||||
# is active.
|
|
||||||
return self.server.is_alive()
|
|
||||||
|
|
||||||
def cleanup(self):
|
|
||||||
self.stop()
|
|
||||||
self._adb_run(['forward', '--remove-all'])
|
|
||||||
self._adb_run(['reverse', '--remove-all'])
|
|
||||||
|
|
||||||
def executor_browser(self):
|
|
||||||
return ExecutorBrowser, {"webdriver_url": self.server.url}
|
|
||||||
|
|
|
@ -1,9 +1,7 @@
|
||||||
import subprocess
|
from .base import require_arg
|
||||||
|
|
||||||
from .base import Browser, ExecutorBrowser, require_arg
|
|
||||||
from .base import get_timeout_multiplier # noqa: F401
|
from .base import get_timeout_multiplier # noqa: F401
|
||||||
from .chrome import executor_kwargs as chrome_executor_kwargs
|
from .chrome import executor_kwargs as chrome_executor_kwargs
|
||||||
from ..webdriver_server import ChromeDriverServer
|
from .chrome_android import ChromeAndroidBrowserBase
|
||||||
from ..executors.executorwebdriver import (WebDriverTestharnessExecutor, # noqa: F401
|
from ..executors.executorwebdriver import (WebDriverTestharnessExecutor, # noqa: F401
|
||||||
WebDriverRefTestExecutor) # noqa: F401
|
WebDriverRefTestExecutor) # noqa: F401
|
||||||
from ..executors.executorchrome import ChromeDriverWdspecExecutor # noqa: F401
|
from ..executors.executorchrome import ChromeDriverWdspecExecutor # noqa: F401
|
||||||
|
@ -73,61 +71,18 @@ def env_options():
|
||||||
return {"server_host": "127.0.0.1"}
|
return {"server_host": "127.0.0.1"}
|
||||||
|
|
||||||
|
|
||||||
#TODO: refactor common elements of SystemWebViewShell and ChromeAndroidBrowser
|
class SystemWebViewShell(ChromeAndroidBrowserBase):
|
||||||
class SystemWebViewShell(Browser):
|
|
||||||
"""Chrome is backed by chromedriver, which is supplied through
|
"""Chrome is backed by chromedriver, which is supplied through
|
||||||
``wptrunner.webdriver.ChromeDriverServer``.
|
``wptrunner.webdriver.ChromeDriverServer``.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, logger, binary, webdriver_binary="chromedriver",
|
def __init__(self, logger, binary, webdriver_binary="chromedriver",
|
||||||
|
remote_queue=None,
|
||||||
device_serial=None,
|
device_serial=None,
|
||||||
webdriver_args=None):
|
webdriver_args=None):
|
||||||
"""Creates a new representation of Chrome. The `binary` argument gives
|
"""Creates a new representation of Chrome. The `binary` argument gives
|
||||||
the browser binary to use for testing."""
|
the browser binary to use for testing."""
|
||||||
Browser.__init__(self, logger)
|
super(SystemWebViewShell, self).__init__(logger,
|
||||||
|
webdriver_binary, remote_queue, device_serial, webdriver_args)
|
||||||
self.binary = binary
|
self.binary = binary
|
||||||
self.device_serial = device_serial
|
self.wptserver_ports = _wptserve_ports
|
||||||
self.server = ChromeDriverServer(self.logger,
|
|
||||||
binary=webdriver_binary,
|
|
||||||
args=webdriver_args)
|
|
||||||
self.setup_adb_reverse()
|
|
||||||
|
|
||||||
def _adb_run(self, args):
|
|
||||||
cmd = ['adb']
|
|
||||||
if self.device_serial:
|
|
||||||
cmd.extend(['-s', self.device_serial])
|
|
||||||
cmd.extend(args)
|
|
||||||
self.logger.info(' '.join(cmd))
|
|
||||||
subprocess.check_call(cmd)
|
|
||||||
|
|
||||||
def setup_adb_reverse(self):
|
|
||||||
self._adb_run(['wait-for-device'])
|
|
||||||
self._adb_run(['forward', '--remove-all'])
|
|
||||||
self._adb_run(['reverse', '--remove-all'])
|
|
||||||
# "adb reverse" basically forwards network connection from device to
|
|
||||||
# host.
|
|
||||||
for port in _wptserve_ports:
|
|
||||||
self._adb_run(['reverse', 'tcp:%d' % port, 'tcp:%d' % port])
|
|
||||||
|
|
||||||
def start(self, **kwargs):
|
|
||||||
self.server.start(block=False)
|
|
||||||
|
|
||||||
def stop(self, force=False):
|
|
||||||
self.server.stop(force=force)
|
|
||||||
|
|
||||||
def pid(self):
|
|
||||||
return self.server.pid
|
|
||||||
|
|
||||||
def is_alive(self):
|
|
||||||
# TODO(ato): This only indicates the driver is alive,
|
|
||||||
# and doesn't say anything about whether a browser session
|
|
||||||
# is active.
|
|
||||||
return self.server.is_alive()
|
|
||||||
|
|
||||||
def cleanup(self):
|
|
||||||
self.stop()
|
|
||||||
self._adb_run(['forward', '--remove-all'])
|
|
||||||
self._adb_run(['reverse', '--remove-all'])
|
|
||||||
|
|
||||||
def executor_browser(self):
|
|
||||||
return ExecutorBrowser, {"webdriver_url": self.server.url}
|
|
||||||
|
|
|
@ -113,7 +113,7 @@ class ChromeBrowser(Browser):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, logger, binary, webdriver_binary="chromedriver",
|
def __init__(self, logger, binary, webdriver_binary="chromedriver",
|
||||||
webdriver_args=None):
|
webdriver_args=None, **kwargs):
|
||||||
"""Creates a new representation of Chrome. The `binary` argument gives
|
"""Creates a new representation of Chrome. The `binary` argument gives
|
||||||
the browser binary to use for testing."""
|
the browser binary to use for testing."""
|
||||||
Browser.__init__(self, logger)
|
Browser.__init__(self, logger)
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import mozprocess
|
||||||
import subprocess
|
import subprocess
|
||||||
|
|
||||||
from .base import Browser, ExecutorBrowser, require_arg
|
from .base import Browser, ExecutorBrowser, require_arg
|
||||||
|
@ -68,21 +69,75 @@ def env_options():
|
||||||
# allow the use of host-resolver-rules in lieu of modifying /etc/hosts file
|
# allow the use of host-resolver-rules in lieu of modifying /etc/hosts file
|
||||||
return {"server_host": "127.0.0.1"}
|
return {"server_host": "127.0.0.1"}
|
||||||
|
|
||||||
|
class LogcatRunner(object):
|
||||||
|
def __init__(self, logger, browser, remote_queue):
|
||||||
|
self.logger = logger
|
||||||
|
self.browser = browser
|
||||||
|
self.remote_queue = remote_queue
|
||||||
|
|
||||||
class ChromeAndroidBrowser(Browser):
|
def start(self):
|
||||||
"""Chrome is backed by chromedriver, which is supplied through
|
try:
|
||||||
``wptrunner.webdriver.ChromeDriverServer``.
|
self._run()
|
||||||
"""
|
except KeyboardInterrupt:
|
||||||
|
self.stop()
|
||||||
|
|
||||||
def __init__(self, logger, package_name, webdriver_binary="chromedriver",
|
def _run(self):
|
||||||
|
try:
|
||||||
|
# TODO: adb logcat -c fail randomly with message
|
||||||
|
# "failed to clear the 'main' log"
|
||||||
|
self.browser.clear_log()
|
||||||
|
except subprocess.CalledProcessError:
|
||||||
|
self.logger.error("Failed to clear logcat buffer")
|
||||||
|
|
||||||
|
self._cmd = self.browser.logcat_cmd()
|
||||||
|
self._proc = mozprocess.ProcessHandler(
|
||||||
|
self._cmd,
|
||||||
|
processOutputLine=self.on_output,
|
||||||
|
storeOutput=False)
|
||||||
|
self._proc.run()
|
||||||
|
|
||||||
|
def _send_message(self, command, *args):
|
||||||
|
try:
|
||||||
|
self.remote_queue.put((command, args))
|
||||||
|
except AssertionError:
|
||||||
|
self.logger.warning("Error when send to remote queue")
|
||||||
|
|
||||||
|
def stop(self, force=False):
|
||||||
|
if self.is_alive():
|
||||||
|
kill_result = self._proc.kill()
|
||||||
|
if force and kill_result != 0:
|
||||||
|
self._proc.kill(9)
|
||||||
|
|
||||||
|
def is_alive(self):
|
||||||
|
return hasattr(self._proc, "proc") and self._proc.poll() is None
|
||||||
|
|
||||||
|
def on_output(self, line):
|
||||||
|
data = {
|
||||||
|
"process": "LOGCAT",
|
||||||
|
"command": "logcat",
|
||||||
|
"data": line
|
||||||
|
}
|
||||||
|
self._send_message("log", "process_output", data)
|
||||||
|
|
||||||
|
class ChromeAndroidBrowserBase(Browser):
|
||||||
|
def __init__(self, logger,
|
||||||
|
webdriver_binary="chromedriver",
|
||||||
|
remote_queue = None,
|
||||||
device_serial=None, webdriver_args=None):
|
device_serial=None, webdriver_args=None):
|
||||||
Browser.__init__(self, logger)
|
super(ChromeAndroidBrowserBase, self).__init__(logger)
|
||||||
self.package_name = package_name
|
|
||||||
self.device_serial = device_serial
|
self.device_serial = device_serial
|
||||||
|
self.remote_queue = remote_queue
|
||||||
self.server = ChromeDriverServer(self.logger,
|
self.server = ChromeDriverServer(self.logger,
|
||||||
binary=webdriver_binary,
|
binary=webdriver_binary,
|
||||||
args=webdriver_args)
|
args=webdriver_args)
|
||||||
|
if self.remote_queue is not None:
|
||||||
|
self.logcat_runner = LogcatRunner(self.logger,
|
||||||
|
self, self.remote_queue)
|
||||||
|
|
||||||
|
def setup(self):
|
||||||
self.setup_adb_reverse()
|
self.setup_adb_reverse()
|
||||||
|
if self.remote_queue is not None:
|
||||||
|
self.logcat_runner.start()
|
||||||
|
|
||||||
def _adb_run(self, args):
|
def _adb_run(self, args):
|
||||||
cmd = ['adb']
|
cmd = ['adb']
|
||||||
|
@ -92,14 +147,6 @@ class ChromeAndroidBrowser(Browser):
|
||||||
self.logger.info(' '.join(cmd))
|
self.logger.info(' '.join(cmd))
|
||||||
subprocess.check_call(cmd)
|
subprocess.check_call(cmd)
|
||||||
|
|
||||||
def setup_adb_reverse(self):
|
|
||||||
self._adb_run(['wait-for-device'])
|
|
||||||
self._adb_run(['forward', '--remove-all'])
|
|
||||||
self._adb_run(['reverse', '--remove-all'])
|
|
||||||
# "adb reverse" forwards network connection from device to host.
|
|
||||||
for port in _wptserve_ports:
|
|
||||||
self._adb_run(['reverse', 'tcp:%d' % port, 'tcp:%d' % port])
|
|
||||||
|
|
||||||
def start(self, **kwargs):
|
def start(self, **kwargs):
|
||||||
self.server.start(block=False)
|
self.server.start(block=False)
|
||||||
|
|
||||||
|
@ -119,6 +166,40 @@ class ChromeAndroidBrowser(Browser):
|
||||||
self.stop()
|
self.stop()
|
||||||
self._adb_run(['forward', '--remove-all'])
|
self._adb_run(['forward', '--remove-all'])
|
||||||
self._adb_run(['reverse', '--remove-all'])
|
self._adb_run(['reverse', '--remove-all'])
|
||||||
|
if self.remote_queue is not None:
|
||||||
|
self.logcat_runner.stop(force=True)
|
||||||
|
|
||||||
def executor_browser(self):
|
def executor_browser(self):
|
||||||
return ExecutorBrowser, {"webdriver_url": self.server.url}
|
return ExecutorBrowser, {"webdriver_url": self.server.url}
|
||||||
|
|
||||||
|
def clear_log(self):
|
||||||
|
self._adb_run(['logcat', '-c'])
|
||||||
|
|
||||||
|
def logcat_cmd(self):
|
||||||
|
cmd = ['adb']
|
||||||
|
if self.device_serial:
|
||||||
|
cmd.extend(['-s', self.device_serial])
|
||||||
|
cmd.extend(['logcat', '*:D'])
|
||||||
|
return cmd
|
||||||
|
|
||||||
|
def setup_adb_reverse(self):
|
||||||
|
self._adb_run(['wait-for-device'])
|
||||||
|
self._adb_run(['forward', '--remove-all'])
|
||||||
|
self._adb_run(['reverse', '--remove-all'])
|
||||||
|
# "adb reverse" forwards network connection from device to host.
|
||||||
|
for port in self.wptserver_ports:
|
||||||
|
self._adb_run(['reverse', 'tcp:%d' % port, 'tcp:%d' % port])
|
||||||
|
|
||||||
|
class ChromeAndroidBrowser(ChromeAndroidBrowserBase):
|
||||||
|
"""Chrome is backed by chromedriver, which is supplied through
|
||||||
|
``wptrunner.webdriver.ChromeDriverServer``.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, logger, package_name,
|
||||||
|
webdriver_binary="chromedriver",
|
||||||
|
remote_queue = None,
|
||||||
|
device_serial=None, webdriver_args=None):
|
||||||
|
super(ChromeAndroidBrowser, self).__init__(logger,
|
||||||
|
webdriver_binary, remote_queue, device_serial, webdriver_args)
|
||||||
|
self.package_name = package_name
|
||||||
|
self.wptserver_ports = _wptserve_ports
|
||||||
|
|
|
@ -51,7 +51,7 @@ class ChromeiOSBrowser(Browser):
|
||||||
|
|
||||||
init_timeout = 120
|
init_timeout = 120
|
||||||
|
|
||||||
def __init__(self, logger, webdriver_binary, webdriver_args=None):
|
def __init__(self, logger, webdriver_binary, webdriver_args=None, **kwargs):
|
||||||
"""Creates a new representation of Chrome."""
|
"""Creates a new representation of Chrome."""
|
||||||
Browser.__init__(self, logger)
|
Browser.__init__(self, logger)
|
||||||
self.server = CWTChromeDriverServer(self.logger,
|
self.server = CWTChromeDriverServer(self.logger,
|
||||||
|
|
|
@ -68,7 +68,8 @@ class EdgeBrowser(Browser):
|
||||||
used_ports = set()
|
used_ports = set()
|
||||||
init_timeout = 60
|
init_timeout = 60
|
||||||
|
|
||||||
def __init__(self, logger, webdriver_binary, timeout_multiplier=None, webdriver_args=None):
|
def __init__(self, logger, webdriver_binary,
|
||||||
|
timeout_multiplier=None, webdriver_args=None, **kwargs):
|
||||||
Browser.__init__(self, logger)
|
Browser.__init__(self, logger)
|
||||||
self.server = EdgeDriverServer(self.logger,
|
self.server = EdgeDriverServer(self.logger,
|
||||||
binary=webdriver_binary,
|
binary=webdriver_binary,
|
||||||
|
|
|
@ -85,7 +85,7 @@ class EdgeChromiumBrowser(Browser):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, logger, binary, webdriver_binary="msedgedriver",
|
def __init__(self, logger, binary, webdriver_binary="msedgedriver",
|
||||||
webdriver_args=None):
|
webdriver_args=None, **kwargs):
|
||||||
"""Creates a new representation of MicrosoftEdge. The `binary` argument gives
|
"""Creates a new representation of MicrosoftEdge. The `binary` argument gives
|
||||||
the browser binary to use for testing."""
|
the browser binary to use for testing."""
|
||||||
Browser.__init__(self, logger)
|
Browser.__init__(self, logger)
|
||||||
|
|
|
@ -72,6 +72,6 @@ def run_info_extras(**kwargs):
|
||||||
|
|
||||||
class EpiphanyBrowser(WebKitBrowser):
|
class EpiphanyBrowser(WebKitBrowser):
|
||||||
def __init__(self, logger, binary=None, webdriver_binary=None,
|
def __init__(self, logger, binary=None, webdriver_binary=None,
|
||||||
webdriver_args=None):
|
webdriver_args=None, **kwargs):
|
||||||
WebKitBrowser.__init__(self, logger, binary, webdriver_binary,
|
WebKitBrowser.__init__(self, logger, binary, webdriver_binary,
|
||||||
webdriver_args)
|
webdriver_args)
|
||||||
|
|
|
@ -43,7 +43,7 @@ def env_options():
|
||||||
class InternetExplorerBrowser(Browser):
|
class InternetExplorerBrowser(Browser):
|
||||||
used_ports = set()
|
used_ports = set()
|
||||||
|
|
||||||
def __init__(self, logger, webdriver_binary, webdriver_args=None):
|
def __init__(self, logger, webdriver_binary, webdriver_args=None, **kwargs):
|
||||||
Browser.__init__(self, logger)
|
Browser.__init__(self, logger)
|
||||||
self.server = InternetExplorerDriverServer(self.logger,
|
self.server = InternetExplorerDriverServer(self.logger,
|
||||||
binary=webdriver_binary,
|
binary=webdriver_binary,
|
||||||
|
|
|
@ -71,7 +71,7 @@ class OperaBrowser(Browser):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, logger, binary, webdriver_binary="operadriver",
|
def __init__(self, logger, binary, webdriver_binary="operadriver",
|
||||||
webdriver_args=None):
|
webdriver_args=None, **kwargs):
|
||||||
"""Creates a new representation of Opera. The `binary` argument gives
|
"""Creates a new representation of Opera. The `binary` argument gives
|
||||||
the browser binary to use for testing."""
|
the browser binary to use for testing."""
|
||||||
Browser.__init__(self, logger)
|
Browser.__init__(self, logger)
|
||||||
|
|
|
@ -58,7 +58,7 @@ class SafariBrowser(Browser):
|
||||||
``wptrunner.webdriver.SafariDriverServer``.
|
``wptrunner.webdriver.SafariDriverServer``.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, logger, webdriver_binary, webdriver_args=None):
|
def __init__(self, logger, webdriver_binary, webdriver_args=None, **kwargs):
|
||||||
"""Creates a new representation of Safari. The `webdriver_binary`
|
"""Creates a new representation of Safari. The `webdriver_binary`
|
||||||
argument gives the WebDriver binary to use for testing. (The browser
|
argument gives the WebDriver binary to use for testing. (The browser
|
||||||
binary location cannot be specified, as Safari and SafariDriver are
|
binary location cannot be specified, as Safari and SafariDriver are
|
||||||
|
|
|
@ -228,7 +228,7 @@ class SauceException(Exception):
|
||||||
class SauceBrowser(Browser):
|
class SauceBrowser(Browser):
|
||||||
init_timeout = 300
|
init_timeout = 300
|
||||||
|
|
||||||
def __init__(self, logger, sauce_config):
|
def __init__(self, logger, sauce_config, **kwargs):
|
||||||
Browser.__init__(self, logger)
|
Browser.__init__(self, logger)
|
||||||
self.sauce_config = sauce_config
|
self.sauce_config = sauce_config
|
||||||
|
|
||||||
|
|
|
@ -71,7 +71,7 @@ def update_properties():
|
||||||
|
|
||||||
class ServoBrowser(NullBrowser):
|
class ServoBrowser(NullBrowser):
|
||||||
def __init__(self, logger, binary, debug_info=None, binary_args=None,
|
def __init__(self, logger, binary, debug_info=None, binary_args=None,
|
||||||
user_stylesheets=None, ca_certificate_path=None):
|
user_stylesheets=None, ca_certificate_path=None, **kwargs):
|
||||||
NullBrowser.__init__(self, logger)
|
NullBrowser.__init__(self, logger)
|
||||||
self.binary = binary
|
self.binary = binary
|
||||||
self.debug_info = debug_info
|
self.debug_info = debug_info
|
||||||
|
|
|
@ -77,7 +77,8 @@ class ServoWebDriverBrowser(Browser):
|
||||||
init_timeout = 300 # Large timeout for cases where we're booting an Android emulator
|
init_timeout = 300 # Large timeout for cases where we're booting an Android emulator
|
||||||
|
|
||||||
def __init__(self, logger, binary, debug_info=None, webdriver_host="127.0.0.1",
|
def __init__(self, logger, binary, debug_info=None, webdriver_host="127.0.0.1",
|
||||||
server_config=None, binary_args=None, user_stylesheets=None, headless=None):
|
server_config=None, binary_args=None,
|
||||||
|
user_stylesheets=None, headless=None, **kwargs):
|
||||||
Browser.__init__(self, logger)
|
Browser.__init__(self, logger)
|
||||||
self.binary = binary
|
self.binary = binary
|
||||||
self.binary_args = binary_args or []
|
self.binary_args = binary_args or []
|
||||||
|
|
|
@ -82,7 +82,7 @@ class WebKitBrowser(Browser):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, logger, binary, webdriver_binary=None,
|
def __init__(self, logger, binary, webdriver_binary=None,
|
||||||
webdriver_args=None):
|
webdriver_args=None, **kwargs):
|
||||||
Browser.__init__(self, logger)
|
Browser.__init__(self, logger)
|
||||||
self.binary = binary
|
self.binary = binary
|
||||||
self.server = WebKitDriverServer(self.logger, binary=webdriver_binary,
|
self.server = WebKitDriverServer(self.logger, binary=webdriver_binary,
|
||||||
|
|
|
@ -76,6 +76,6 @@ def run_info_extras(**kwargs):
|
||||||
|
|
||||||
class WebKitGTKMiniBrowser(WebKitBrowser):
|
class WebKitGTKMiniBrowser(WebKitBrowser):
|
||||||
def __init__(self, logger, binary=None, webdriver_binary=None,
|
def __init__(self, logger, binary=None, webdriver_binary=None,
|
||||||
webdriver_args=None):
|
webdriver_args=None, **kwargs):
|
||||||
WebKitBrowser.__init__(self, logger, binary, webdriver_binary,
|
WebKitBrowser.__init__(self, logger, binary, webdriver_binary,
|
||||||
webdriver_args)
|
webdriver_args)
|
||||||
|
|
|
@ -272,5 +272,6 @@ class ChromiumFormatter(base.BaseFormatter):
|
||||||
return json.dumps(final_result)
|
return json.dumps(final_result)
|
||||||
|
|
||||||
def process_output(self, data):
|
def process_output(self, data):
|
||||||
if 'command' in data and 'chromedriver' in data['command']:
|
cmd = data.get("command", "")
|
||||||
|
if any(c in cmd for c in ["chromedriver", "logcat"]):
|
||||||
self.browser_log.append(data['data'])
|
self.browser_log.append(data['data'])
|
||||||
|
|
|
@ -361,7 +361,8 @@ class TestRunnerManager(threading.Thread):
|
||||||
spins."""
|
spins."""
|
||||||
self.recording.set(["testrunner", "startup"])
|
self.recording.set(["testrunner", "startup"])
|
||||||
self.logger = structuredlog.StructuredLogger(self.suite_name)
|
self.logger = structuredlog.StructuredLogger(self.suite_name)
|
||||||
with self.browser_cls(self.logger, **self.browser_kwargs) as browser:
|
with self.browser_cls(self.logger, remote_queue=self.command_queue,
|
||||||
|
**self.browser_kwargs) as browser:
|
||||||
self.browser = BrowserManager(self.logger,
|
self.browser = BrowserManager(self.logger,
|
||||||
browser,
|
browser,
|
||||||
self.command_queue,
|
self.command_queue,
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
<!doctype html>
|
|
||||||
<meta charset=utf-8>
|
|
||||||
<link rel="help" href="https://w3c.github.io/webdriver/">
|
|
||||||
<script src=/resources/testharness.js></script>
|
|
||||||
<script src=/resources/testharnessreport.js></script>
|
|
||||||
<script src=/resources/WebIDLParser.js></script>
|
|
||||||
<script src=/resources/idlharness.js></script>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
promise_test(async () => {
|
|
||||||
const idl_array = new IdlArray();
|
|
||||||
const idl = await fetch("/interfaces/webdriver.idl").then(r => r.text());
|
|
||||||
const html = await fetch("/interfaces/html.idl").then(r => r.text());
|
|
||||||
idl_array.add_idls(idl);
|
|
||||||
idl_array.add_dependency_idls(html);
|
|
||||||
idl_array.add_objects({
|
|
||||||
Navigator: ["navigator"]
|
|
||||||
});
|
|
||||||
idl_array.test();
|
|
||||||
}, "Test IDL implementation of webdriver API");
|
|
||||||
</script>
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
// META: script=/resources/WebIDLParser.js
|
||||||
|
// META: script=/resources/idlharness.js
|
||||||
|
|
||||||
|
// https://w3c.github.io/webdriver/
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
idl_test(
|
||||||
|
["webdriver"],
|
||||||
|
["html"],
|
||||||
|
idl_array => {
|
||||||
|
idl_array.add_objects({
|
||||||
|
Navigator: ["navigator"]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
);
|
|
@ -0,0 +1,11 @@
|
||||||
|
// META: script=/resources/WebIDLParser.js
|
||||||
|
// META: script=/resources/idlharness.js
|
||||||
|
|
||||||
|
// https://drafts.css-houdini.org/worklets/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
idl_test(
|
||||||
|
['worklets'],
|
||||||
|
[]
|
||||||
|
);
|
|
@ -1,13 +0,0 @@
|
||||||
importScripts("/resources/testharness.js");
|
|
||||||
importScripts("/resources/WebIDLParser.js", "/resources/idlharness.js");
|
|
||||||
|
|
||||||
// https://drafts.css-houdini.org/worklets/
|
|
||||||
|
|
||||||
promise_test(async () => {
|
|
||||||
const idl = await fetch('/interfaces/worklets.idl').then(r => r.text());
|
|
||||||
|
|
||||||
const idl_array = new IdlArray();
|
|
||||||
idl_array.add_idls(idl);
|
|
||||||
idl_array.test();
|
|
||||||
}, 'worklets interfaces');
|
|
||||||
done();
|
|
Loading…
Add table
Add a link
Reference in a new issue