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:
bors-servo 2021-02-02 21:23:58 -05:00 committed by GitHub
commit 6f93950bf2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
85 changed files with 977 additions and 662 deletions

View file

@ -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

View file

@ -1,4 +0,0 @@
[hit-test-floats-005.html]
[Miss clipped float]
expected: FAIL

View file

@ -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

View file

@ -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

View file

@ -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

View file

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

View file

@ -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

View file

@ -1,2 +0,0 @@
[cross-origin-objects-on-new-window.html]
expected: TIMEOUT

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -0,0 +1,4 @@
[module-delayed.html]
[async document.write in a module]
expected: FAIL

View file

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

View file

@ -0,0 +1,2 @@
[xhr.http.html]
expected: CRASH

View file

@ -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

View file

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

View file

@ -1,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

View file

@ -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": [

View file

@ -1,4 +0,0 @@
[hit-test-floats-005.html]
[Miss clipped float]
expected: FAIL

View file

@ -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

View file

@ -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

View file

@ -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

View file

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

View file

@ -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

View file

@ -1,2 +0,0 @@
[cross-origin-objects-on-new-window.html]
expected: TIMEOUT

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -0,0 +1,4 @@
[module-delayed.html]
[async document.write in a module]
expected: FAIL

View file

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

View file

@ -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

View file

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

View file

@ -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

View file

@ -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>

View file

@ -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")'],
});
}
);

View file

@ -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>" +

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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`:

View file

@ -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

View file

@ -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:

View file

@ -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

View file

@ -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.

View file

@ -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

View file

@ -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)" : ""}`);
});

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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);

View file

@ -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

View file

@ -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],

View file

@ -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",

View file

@ -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'))

View file

@ -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'

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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',

View file

@ -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):

View file

@ -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}

View file

@ -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}

View file

@ -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)

View file

@ -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

View file

@ -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,

View file

@ -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,

View file

@ -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)

View file

@ -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)

View file

@ -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,

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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 []

View file

@ -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,

View file

@ -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)

View file

@ -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'])

View file

@ -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,

View file

@ -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>

View file

@ -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"]
});
}
);

View file

@ -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'],
[]
);

View file

@ -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();