mirror of
https://github.com/servo/servo.git
synced 2025-08-03 12:40:06 +01:00
Update web-platform-tests to revision 556afc9ad1a27504be759fb9e62a266a1f653b09
This commit is contained in:
parent
c0d9ee0ce2
commit
bdf20e37ce
44 changed files with 559 additions and 204 deletions
|
@ -7,7 +7,7 @@
|
|||
expected: FAIL
|
||||
|
||||
[Opening a blob URL in a new window immediately before revoking it works.]
|
||||
expected: FAIL
|
||||
expected: TIMEOUT
|
||||
|
||||
[Opening a blob URL in a noopener about:blank window immediately before revoking it works.]
|
||||
expected: TIMEOUT
|
||||
|
|
|
@ -17305,7 +17305,7 @@
|
|||
]
|
||||
},
|
||||
"rejects_if_not_active-manual.https.html": [
|
||||
"d03032d0498fc482a7ab45d42f291daf2dcdf59d",
|
||||
"8e214cb6094a25436374da984deaade660ccc191",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -143222,6 +143222,19 @@
|
|||
],
|
||||
{}
|
||||
]
|
||||
],
|
||||
"grid-placement-using-named-grid-lines-003.html": [
|
||||
"31173e0a455a04156ca8755779d7a2ae4b24b103",
|
||||
[
|
||||
null,
|
||||
[
|
||||
[
|
||||
"/css/reference/ref-filled-green-100px-square.xht",
|
||||
"=="
|
||||
]
|
||||
],
|
||||
{}
|
||||
]
|
||||
]
|
||||
},
|
||||
"subgrid": {
|
||||
|
@ -225921,6 +225934,19 @@
|
|||
],
|
||||
{}
|
||||
]
|
||||
],
|
||||
"iframe-scrolling-attribute.html": [
|
||||
"cc7df7b43a06219350f14ad007cbc649e5cc0046",
|
||||
[
|
||||
null,
|
||||
[
|
||||
[
|
||||
"/html/rendering/non-replaced-elements/the-page/iframe-scrolling-attribute-ref.html",
|
||||
"=="
|
||||
]
|
||||
],
|
||||
{}
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
|
@ -320319,6 +320345,10 @@
|
|||
"c907a119f8b786aa070c2d1951670c56060a2d64",
|
||||
[]
|
||||
],
|
||||
"iframe-scrolling-attribute-ref.html": [
|
||||
"fe72b9f9380fecfa75f1477541d0e1513c0cbd12",
|
||||
[]
|
||||
],
|
||||
"support": {
|
||||
"body-marginwidth-marginheight.html": [
|
||||
"5d825e3455664970097b913146b4b51669bf8e58",
|
||||
|
@ -328823,7 +328853,7 @@
|
|||
[]
|
||||
],
|
||||
"app-respond-with-minimal-ui.js": [
|
||||
"0e6b1b78b9197d8d1582c8eb70bbcc15ba3861c4",
|
||||
"45ac57c2279b1136322001bfd42e827378a2e776",
|
||||
[]
|
||||
],
|
||||
"app-supports-shipping-contact-delegation.js": [
|
||||
|
@ -338125,7 +338155,7 @@
|
|||
[]
|
||||
],
|
||||
"testharness.js": [
|
||||
"0ec232c1d27d792b1dc000a9cf7899e011217698",
|
||||
"ce043a287f758338e1564e86bc6908ce8388638e",
|
||||
[]
|
||||
],
|
||||
"testharness.js.headers": [
|
||||
|
@ -341996,7 +342026,7 @@
|
|||
},
|
||||
"styling": {
|
||||
"presentation-attributes.js": [
|
||||
"552041496f187e97b4e17bfa445826d8cd278b99",
|
||||
"7bf77cb77bcf08af3d72efe63317b189abac5d2a",
|
||||
[]
|
||||
],
|
||||
"render": {
|
||||
|
@ -342330,7 +342360,7 @@
|
|||
[]
|
||||
],
|
||||
"pr_preview.py": [
|
||||
"4b76b37f87e1d6b7eede89376e72e8bdd9c7aa3e",
|
||||
"ba5997f68a615f49322ac009a15aebf0a5a071f3",
|
||||
[]
|
||||
],
|
||||
"run_tc.py": [
|
||||
|
@ -342407,7 +342437,7 @@
|
|||
[]
|
||||
],
|
||||
"test_pr_preview.py": [
|
||||
"cdf3c9528eaaa8dd3ac2d82d2f457dc12a647a82",
|
||||
"2d9966fc8cf4187913adce8609ee750ade1b9797",
|
||||
[]
|
||||
]
|
||||
},
|
||||
|
@ -348032,12 +348062,12 @@
|
|||
[]
|
||||
],
|
||||
"chromium.py": [
|
||||
"03e674eb2e8008179712758464e1360df90eb54a",
|
||||
"62ed53865d7825da8fd81608cf7e1302cf0650bc",
|
||||
[]
|
||||
],
|
||||
"tests": {
|
||||
"test_chromium.py": [
|
||||
"f9ae80b0be54a27b4f846aabf206551589c1d978",
|
||||
"cb6f1ad370f2faafaa8311b82e9126ce9afd327d",
|
||||
[]
|
||||
]
|
||||
},
|
||||
|
@ -349410,7 +349440,7 @@
|
|||
[]
|
||||
],
|
||||
"urltestdata.json": [
|
||||
"32ed1959430c135bf5910b643e553296b8cd3a00",
|
||||
"b2f8964c440dad8d1399127848185aec3edd025f",
|
||||
[]
|
||||
]
|
||||
}
|
||||
|
@ -350229,7 +350259,7 @@
|
|||
[]
|
||||
],
|
||||
"helpers.js": [
|
||||
"0fc64c8b522cfd7fce2ec585e2ec1d6bd839b855",
|
||||
"27abaaf4766c4a2fe85f1034be8df9145b712f75",
|
||||
[]
|
||||
],
|
||||
"resources": {
|
||||
|
@ -438664,6 +438694,13 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"image-loading-lazy-crossorigin-change.sub.html": [
|
||||
"13560324854dceeca26bda3433301cafe07fb62a",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"image-loading-lazy-in-cross-origin-ifame-001.sub.html": [
|
||||
"a4627cb8c25dc3f57581dcaea14b2ea4cfccea40",
|
||||
[
|
||||
|
@ -438818,13 +438855,6 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"original-crossorigin-applied.sub.html": [
|
||||
"2cf076e75f79b465e58166248c323331418ed0bd",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"original-referrer-policy-applied.sub.html": [
|
||||
"c300119f72fbd3742d6dbf7e2439d967911303a5",
|
||||
[
|
||||
|
@ -472874,7 +472904,7 @@
|
|||
},
|
||||
"portals": {
|
||||
"about-blank-cannot-host.html": [
|
||||
"6a721c32e6807cbd615b3adbffd7422467375525",
|
||||
"7aba015e69b85a173c7a63dc277aedafeefc63a2",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -472922,7 +472952,7 @@
|
|||
]
|
||||
],
|
||||
"portal-activate-data.html": [
|
||||
"cefb0eae3dc9a8b10880687fc084d44991f8f26f",
|
||||
"004fa97e55c05049a32657450a22af090466f4a4",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -472964,7 +472994,7 @@
|
|||
]
|
||||
],
|
||||
"portals-activate-inside-iframe.html": [
|
||||
"5234babfdf9528c5b9d7861ba90ffe6ceebaccce",
|
||||
"587e483479cf8e616694de345ecb681a69214e61",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -524883,6 +524913,13 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"scroll-timeline-phases.tentative.html": [
|
||||
"0cc4e12864e209602b8c3ad57106deb3927e5be8",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"setting-current-time.html": [
|
||||
"069a7cc149eaa69234580345854e1560804d5c1a",
|
||||
[
|
||||
|
@ -537169,7 +537206,7 @@
|
|||
]
|
||||
],
|
||||
"presentation-attributes-special-cases.html": [
|
||||
"8fa045984d9ad55097768e6608146bbe2b37e8bf",
|
||||
"c99ed704cf1dde83a26ed4dd52f537bc8805165e",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -544644,7 +544681,7 @@
|
|||
]
|
||||
],
|
||||
"wakelock-active-document.https.window.js": [
|
||||
"53f9fb56fa8d7754fa61e11f018e17188228d678",
|
||||
"53745ea3c60e7322720d9082919950c798259f0f",
|
||||
[
|
||||
"wake-lock/wakelock-active-document.https.window.html",
|
||||
{}
|
||||
|
@ -547512,6 +547549,13 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"document-timeline-phases.tentative.html": [
|
||||
"9b86a7105d5dcfafc7e5d7f1f63593f7b1063f33",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"style-change-events.html": [
|
||||
"c1607e6fb92943c580802025e4a4cc617a747144",
|
||||
[
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
[hit-test-floats-002.html]
|
||||
[Hit test float]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
[hit-test-floats-004.html]
|
||||
[Miss float below something else]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
[hit-test-floats-005.html]
|
||||
[Miss clipped float]
|
||||
expected: FAIL
|
||||
|
2
tests/wpt/metadata/css/CSS2/text/bidi-span-001.html.ini
Normal file
2
tests/wpt/metadata/css/CSS2/text/bidi-span-001.html.ini
Normal file
|
@ -0,0 +1,2 @@
|
|||
[bidi-span-001.html]
|
||||
expected: CRASH
|
|
@ -2,6 +2,3 @@
|
|||
[Hit test intersecting scaled box]
|
||||
expected: FAIL
|
||||
|
||||
[Hit test within unscaled box]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -2,6 +2,3 @@
|
|||
[listeners are called when <iframe> is resized]
|
||||
expected: FAIL
|
||||
|
||||
[listeners are called correct number of times]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -2,6 +2,3 @@
|
|||
[elementsFromPoint on the root document for points in iframe elements]
|
||||
expected: FAIL
|
||||
|
||||
[elementsFromPoint on inner documents]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
[elementsFromPoint-invalid-cases.html]
|
||||
[The root element is the last element returned for otherwise empty queries within the viewport]
|
||||
expected: FAIL
|
||||
|
|
@ -318,3 +318,18 @@
|
|||
[<iframe>: separate response Content-Type: text/html;" text/plain]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: combined response Content-Type: text/html;" text/plain]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: combined response Content-Type: */* text/html]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: separate response Content-Type: text/plain */*]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: combined response Content-Type: text/html */*;charset=gbk]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: separate response Content-Type: text/plain */*;charset=gbk]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -53,9 +53,6 @@
|
|||
[combined text/javascript ]
|
||||
expected: FAIL
|
||||
|
||||
[separate text/javascript;charset=windows-1252 text/javascript]
|
||||
expected: FAIL
|
||||
|
||||
[separate text/javascript error]
|
||||
[separate text/javascript x/x]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -11,6 +11,3 @@
|
|||
[X-Content-Type-Options%3A%20nosniff%2C%2C%40%23%24%23%25%25%26%5E%26%5E*()()11!]
|
||||
expected: FAIL
|
||||
|
||||
[Content-Type-Options%3A%20nosniff]
|
||||
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_5.html]
|
||||
[traverse_the_history_3.html]
|
||||
[Multiple history traversals, last would be aborted]
|
||||
expected: FAIL
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
[iframe_sandbox_popups_nonescaping-3.html]
|
||||
type: testharness
|
||||
expected: CRASH
|
||||
expected: TIMEOUT
|
||||
[Check that popups from a sandboxed iframe do not escape the sandbox]
|
||||
expected: NOTRUN
|
||||
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
[image-loading-lazy-crossorigin-change.sub.html]
|
||||
[Test that when deferred image is loaded, it uses the latest crossorigin attribute.]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +1,4 @@
|
|||
[realtimeanalyser-fft-scaling.html]
|
||||
expected: TIMEOUT
|
||||
[X 2048-point FFT peak position is not equal to 64. Got 0.]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -26,3 +26,6 @@
|
|||
[X Rendered audio for channel 5 does not equal [0,0.0626220703125,0.125030517578125,0.18695068359375,0.24810791015625,0.308319091796875,0.3673095703125,0.42486572265625,0.480743408203125,0.53472900390625,0.58660888671875,0.636199951171875,0.68328857421875,0.727691650390625,0.76922607421875,0.8077392578125...\] with an element-wise tolerance of {"absoluteThreshold":0.000030517578125,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[1\]\t3.6732959747314453e-1\t6.2622070312500000e-2\t3.0470752716064453e-1\t4.8658168859649127e+0\t3.0517578125000000e-5\n\t[2\]\t6.8329977989196777e-1\t1.2503051757812500e-1\t5.5826926231384277e-1\t4.4650639949963384e+0\t3.0517578125000000e-5\n\t[3\]\t9.0373212099075317e-1\t1.8695068359375000e-1\t7.1678143739700317e-1\t3.8340669508039502e+0\t3.0517578125000000e-5\n\t[4\]\t9.9780619144439697e-1\t2.4810791015625000e-1\t7.4969828128814697e-1\t3.0216621502152523e+0\t3.0517578125000000e-5\n\t[5\]\t9.5236867666244507e-1\t3.0831909179687500e-1\t6.4404958486557007e-1\t2.0889059484187866e+0\t3.0517578125000000e-5\n\t...and 44056 more errors.\n\tMax AbsError of 1.9999977350234985e+0 at index of 10361.\n\t[10361\]\t9.9999773502349854e-1\t-1.0000000000000000e+0\t1.9999977350234985e+0\t1.9999977350234985e+0\t3.0517578125000000e-5\n\tMax RelError of Infinity at index of 7056.\n\t[7056\]\t5.8778524398803711e-1\t0.0000000000000000e+0\t5.8778524398803711e-1\tInfinity\t3.0517578125000000e-5\n]
|
||||
expected: FAIL
|
||||
|
||||
[X Rendered audio for channel 5 does not equal [0,0.0626220703125,0.125030517578125,0.18695068359375,0.24810791015625,0.308319091796875,0.3673095703125,0.42486572265625,0.480743408203125,0.53472900390625,0.58660888671875,0.636199951171875,0.68328857421875,0.727691650390625,0.76922607421875,0.8077392578125...\] with an element-wise tolerance of {"absoluteThreshold":0.000030517578125,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[1\]\t3.6732959747314453e-1\t6.2622070312500000e-2\t3.0470752716064453e-1\t4.8658168859649127e+0\t3.0517578125000000e-5\n\t[2\]\t6.8329977989196777e-1\t1.2503051757812500e-1\t5.5826926231384277e-1\t4.4650639949963384e+0\t3.0517578125000000e-5\n\t[3\]\t9.0373212099075317e-1\t1.8695068359375000e-1\t7.1678143739700317e-1\t3.8340669508039502e+0\t3.0517578125000000e-5\n\t[4\]\t9.9780619144439697e-1\t2.4810791015625000e-1\t7.4969828128814697e-1\t3.0216621502152523e+0\t3.0517578125000000e-5\n\t[5\]\t9.5236867666244507e-1\t3.0831909179687500e-1\t6.4404958486557007e-1\t2.0889059484187866e+0\t3.0517578125000000e-5\n\t...and 37004 more errors.\n\tMax AbsError of 1.9986611604690552e+0 at index of 26105.\n\t[26105\]\t-9.9994289875030518e-1\t9.9871826171875000e-1\t1.9986611604690552e+0\t2.0012262087101997e+0\t3.0517578125000000e-5\n\tMax RelError of Infinity at index of 10584.\n\t[10584\]\t-5.8778524398803711e-1\t0.0000000000000000e+0\t5.8778524398803711e-1\tInfinity\t3.0517578125000000e-5\n]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -158,3 +158,9 @@
|
|||
[X Stitched sine-wave buffers at sample rate 43800 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.0038986,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[19030\]\t-4.2493608780205250e-3\t-7.3546999692916870e-1\t7.3122063605114818e-1\t9.9422225121927066e-1\t3.8985999999999999e-3\n\t[19031\]\t-3.6017334461212158e-1\t-6.9157749414443970e-1\t3.3140414953231812e-1\t4.7920030992665957e-1\t3.8985999999999999e-3\n\t[38059\]\t-9.8401503637433052e-3\t-9.8956179618835449e-1\t9.7972164582461119e-1\t9.9005605268751673e-1\t3.8985999999999999e-3\n\t[38060\]\t-8.8409073650836945e-2\t-9.9664616584777832e-1\t9.0823709219694138e-1\t9.1129341918891205e-1\t3.8985999999999999e-3\n\tMax AbsError of 9.7972164582461119e-1 at index of 38059.\n\tMax RelError of 9.9422225121927066e-1 at index of 19030.\n]
|
||||
expected: FAIL
|
||||
|
||||
[X Stitched sine-wave buffers at sample rate 43800 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.0038986,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[19030\]\t5.4585758720000000e+9\t-7.3546999692916870e-1\t5.4585758727354698e+9\t7.4218879023302593e+9\t3.8985999999999999e-3\n\t[19031\]\t-3.6017334461212158e-1\t-6.9157749414443970e-1\t3.3140414953231812e-1\t4.7920030992665957e-1\t3.8985999999999999e-3\n\t[38059\]\t1.0836776960000000e+10\t-9.8956179618835449e-1\t1.0836776960989561e+10\t1.0951086635247259e+10\t3.8985999999999999e-3\n\t[38060\]\t-8.8409073650836945e-2\t-9.9664616584777832e-1\t9.0823709219694138e-1\t9.1129341918891205e-1\t3.8985999999999999e-3\n\tMax AbsError of 1.0836776960989561e+10 at index of 38059.\n\tMax RelError of 1.0951086635247259e+10 at index of 38059.\n]
|
||||
expected: FAIL
|
||||
|
||||
[X SNR (-158.2459298453396 dB) is not greater than or equal to 65.737. Got -158.2459298453396.]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,5 +0,0 @@
|
|||
[017.html]
|
||||
expected: TIMEOUT
|
||||
[origin of the script that invoked the method, about:blank]
|
||||
expected: TIMEOUT
|
||||
|
|
@ -1,4 +1,5 @@
|
|||
[005.html]
|
||||
expected: ERROR
|
||||
[dedicated worker in shared worker in dedicated worker]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -0,0 +1,27 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>CSS Grid Layout Test: Grid item placement with named line and auto repeat()</title>
|
||||
<link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com">
|
||||
<link rel="help" href="http://www.w3.org/TR/css-grid-1/#line-placement">
|
||||
<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
|
||||
<meta name="assert" content="Grid placement algorithm is able to select the right line when there is an auto repeat().">
|
||||
<style>
|
||||
.grid {
|
||||
display: grid;
|
||||
width: 300px;
|
||||
height: 300px;
|
||||
position: relative;
|
||||
top: -200px;
|
||||
left: -200px;
|
||||
grid-template-columns: repeat(auto-fill, 100px 100px) [area-start] 100px [area-end];
|
||||
grid-template-rows: repeat(auto-fill, 100px 100px [area-start]) [area-start] 100px [area-end];
|
||||
}
|
||||
.grid > div {
|
||||
grid-area: area;
|
||||
background: green;
|
||||
}
|
||||
</style>
|
||||
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
|
||||
<div class="grid">
|
||||
<div></div>
|
||||
</div>
|
|
@ -0,0 +1,11 @@
|
|||
<!DOCTYPE html>
|
||||
<title>iframe and the scrolling attributes</title>
|
||||
<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org">
|
||||
|
||||
|
||||
|
||||
<p>These two iframes should *both* render with scrollbars:</p>
|
||||
<iframe style="height: 100px; width: 100px;" scrolling="unknown"
|
||||
srcdoc="<div style='height: 200px; width: 200px; background: linear-gradient(135deg, red, blue);'></div>"></iframe>
|
||||
<iframe style="height: 100px; width: 100px;" scrolling="unknown"
|
||||
srcdoc="<div style='height: 200px; width: 200px; background: linear-gradient(135deg, red, blue);'></div>"></iframe>
|
|
@ -0,0 +1,19 @@
|
|||
<!DOCTYPE html>
|
||||
<title>iframe and the scrolling attributes</title>
|
||||
<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org">
|
||||
<link rel="help" href="https://html.spec.whatwg.org/multipage/rendering.html#the-page">
|
||||
<link rel="match" href="iframe-scrolling-attribute-ref.html">
|
||||
|
||||
<p>These two iframes should *both* render with scrollbars:</p>
|
||||
<iframe style="height: 100px; width: 100px;" scrolling="unknown"
|
||||
srcdoc="<div style='height: 200px; width: 200px; background: linear-gradient(135deg, red, blue);'></div>"></iframe>
|
||||
<iframe style="height: 100px; width: 100px;" scrolling="unknown"
|
||||
srcdoc="<div style='height: 200px; width: 200px; background: linear-gradient(135deg, red, blue);'></div>"></iframe>
|
||||
|
||||
<script>
|
||||
var iframe = document.getElementsByTagName("iframe")[1];
|
||||
// Setting scrolling=no and then back to scrolling=unknown
|
||||
// should result in a final value of auto.
|
||||
iframe.setAttribute("scrolling", "no");
|
||||
iframe.setAttribute("scrolling", "unknown");
|
||||
</script>
|
|
@ -0,0 +1,30 @@
|
|||
<!DOCTYPE html>
|
||||
<head>
|
||||
<title>Deferred images with loading='lazy' use the latest crossorigin attribute</title>
|
||||
<link rel="author" title="Raj T" href="mailto:rajendrant@chromium.org">
|
||||
<link rel="author" title="Rob Buis" href="mailto:rbuis@igalia.com">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="common.js"></script>
|
||||
</head>
|
||||
|
||||
<script>
|
||||
const crossorigin_img = new ElementLoadPromise("crossorigin_img");
|
||||
|
||||
// Set the crossorigin attribute and scroll down to load the deferred image.
|
||||
window.addEventListener("load", () => {
|
||||
crossorigin_img.element().crossOrigin = 'anonymous';
|
||||
crossorigin_img.element().scrollIntoView();
|
||||
});
|
||||
|
||||
async_test(function(t) {
|
||||
crossorigin_img.promise.then(t.unreached_func("The image should not load.")).catch(t.step_func_done());
|
||||
}, "Test that when deferred image is loaded, it uses the latest crossorigin attribute.");
|
||||
</script>
|
||||
|
||||
<body>
|
||||
<div style="height:1000vh;"></div>
|
||||
<img id="crossorigin_img" loading="lazy"
|
||||
src='http://{{hosts[alt][]}}:{{ports[http][0]}}/html/semantics/embedded-content/the-img-element/resources/image.png'
|
||||
onload="crossorigin_img.resolve();" onerror="crossorigin_img.reject();">
|
||||
</body>
|
|
@ -1,42 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<head>
|
||||
<title>Deferred images with loading='lazy' use the original crossorigin attribute specified at the parse time</title>
|
||||
<link rel="author" title="Raj T" href="mailto:rajendrant@chromium.org">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="common.js"></script>
|
||||
</head>
|
||||
|
||||
<script>
|
||||
const crossorigin_img = new ElementLoadPromise("crossorigin_img");
|
||||
|
||||
// Set the crossorigin and scroll down to load the deferred image.
|
||||
window.addEventListener("load", () => {
|
||||
crossorigin_img.element().crossOrigin = 'anonymous';
|
||||
crossorigin_img.element().scrollIntoView();
|
||||
});
|
||||
|
||||
async_test(function(t) {
|
||||
crossorigin_img.promise.then(t.step_func_done(() => {
|
||||
// The image originally did not had crossOrigin property set, so CORS will
|
||||
// not be involved in fetching that. So drawing the image in a canvas will
|
||||
// make it tainted. Verify that the image did not load with CORS headers
|
||||
// due to the updated crossOrigin property.
|
||||
const img_element = crossorigin_img.element();
|
||||
const canvas = document.createElement('canvas');
|
||||
const context = canvas.getContext('2d');
|
||||
canvas.width = img_element.width;
|
||||
canvas.height = img_element.height;
|
||||
context.drawImage(img_element, 0, 0);
|
||||
assert_throws_dom('SecurityError', () => canvas.toDataURL());
|
||||
})
|
||||
).catch(t.unreached_func("The image load should not fail, trying to load with CORS headers set."));
|
||||
}, "Test that when deferred image is loaded, it uses the crossorigin attribute specified at parse time.");
|
||||
</script>
|
||||
|
||||
<body>
|
||||
<div style="height:10000px;"></div>
|
||||
<img id="crossorigin_img" loading="lazy"
|
||||
src='http://{{hosts[alt][www]}}:{{ports[http][0]}}/html/semantics/embedded-content/the-img-element/resources/image.png'
|
||||
onload="crossorigin_img.resolve();" onerror="crossorigin_img.reject();">
|
||||
</body>
|
|
@ -1,3 +1,18 @@
|
|||
self.addEventListener('canmakepayment', event => {
|
||||
if (!event.currency) {
|
||||
event.respondWith(false);
|
||||
return;
|
||||
}
|
||||
|
||||
if (event.currency !== 'USD') {
|
||||
event.respondWith(false);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!event.respondWithMinimalUI) {
|
||||
event.respondWith(false);
|
||||
return;
|
||||
}
|
||||
|
||||
event.respondWithMinimalUI(event.methodData[0].data.test);
|
||||
});
|
||||
|
|
|
@ -61,6 +61,8 @@ function testAbortShowIfDocumentIsNotActive() {
|
|||
iframe,
|
||||
"/payment-request/resources/page1.html"
|
||||
);
|
||||
// Save the DOMException of page1.html before navigating away.
|
||||
const frameDOMException1 = iframe.contentWindow.DOMException;
|
||||
// We navigate the iframe again, putting request1's document into an inactive state.
|
||||
const request2 = await getLoadedPaymentRequest(
|
||||
iframe,
|
||||
|
@ -71,6 +73,7 @@ function testAbortShowIfDocumentIsNotActive() {
|
|||
await promise_rejects_dom(
|
||||
t,
|
||||
"AbortError",
|
||||
frameDOMException1,
|
||||
request1.show(),
|
||||
"Inactive document, so must throw AbortError"
|
||||
);
|
||||
|
@ -80,6 +83,7 @@ function testAbortShowIfDocumentIsNotActive() {
|
|||
await promise_rejects_dom(
|
||||
t,
|
||||
"InvalidStateError",
|
||||
iframe.contentWindow.DOMException,
|
||||
request2.show(),
|
||||
"Abort already called, so InvalidStateError"
|
||||
);
|
||||
|
@ -112,6 +116,8 @@ function testAbortShowIfDocumentIsNotFullyActive() {
|
|||
innerIframe,
|
||||
"/payment-request/resources/page2.html"
|
||||
);
|
||||
// Save DOMException from innerIframe before navigating away.
|
||||
const innerIframeDOMException = innerIframe.contentWindow.DOMException;
|
||||
|
||||
// Navigate the outer iframe to a new location.
|
||||
// Wait for the load event to fire.
|
||||
|
@ -128,6 +134,7 @@ function testAbortShowIfDocumentIsNotFullyActive() {
|
|||
await promise_rejects_dom(
|
||||
t,
|
||||
"AbortError",
|
||||
innerIframeDOMException,
|
||||
showPromise,
|
||||
"Active, but not fully active, so must throw AbortError"
|
||||
);
|
||||
|
|
|
@ -12,7 +12,7 @@ promise_test(async (t) => {
|
|||
portal.src = "resources/simple-portal.html";
|
||||
hostWindow.document.body.appendChild(portal);
|
||||
|
||||
await promise_rejects_dom(t, "InvalidStateError", portal.activate());
|
||||
await promise_rejects_dom(t, "InvalidStateError", hostWindow.DOMException, portal.activate());
|
||||
}, "about:blank cannot host a portal");
|
||||
|
||||
</script>
|
||||
|
|
|
@ -12,9 +12,9 @@ function nextMessage(target) {
|
|||
});
|
||||
}
|
||||
|
||||
async function openPortalAndActivate(logic, activateOptions) {
|
||||
async function openPortalAndActivate(logic, activateOptions, testWindow) {
|
||||
assert_precondition("HTMLPortalElement" in self);
|
||||
const w = await openBlankPortalHost();
|
||||
const w = testWindow || await openBlankPortalHost();
|
||||
try {
|
||||
const portal = w.document.createElement('portal');
|
||||
portal.src = new URL('resources/portal-activate-data-portal.html?logic=' + encodeURIComponent(logic), location.href);
|
||||
|
@ -71,9 +71,10 @@ promise_test(async () => {
|
|||
}, "A message port can be passed through activate data.");
|
||||
|
||||
promise_test(async t => {
|
||||
await promise_rejects_dom(
|
||||
t, 'DataCloneError',
|
||||
openPortalAndActivate('', {data: new SharedArrayBuffer}));
|
||||
const w = await openBlankPortalHost();
|
||||
await promise_rejects_dom(
|
||||
t, 'DataCloneError', w.DOMException,
|
||||
openPortalAndActivate('', {data: new SharedArrayBuffer}, w));
|
||||
}, "A SharedArrayBuffer cannot be passed through activate data.");
|
||||
|
||||
promise_test(async t => {
|
||||
|
@ -83,9 +84,10 @@ promise_test(async t => {
|
|||
}, "Uncloneable data has its exception propagated.");
|
||||
|
||||
promise_test(async t => {
|
||||
const w = await openBlankPortalHost();
|
||||
await promise_rejects_js(
|
||||
t, TypeError,
|
||||
openPortalAndActivate('', {data: null, transfer: [null]}));
|
||||
t, w.TypeError,
|
||||
openPortalAndActivate('', {data: null, transfer: [null]}, w));
|
||||
}, "Errors during transfer list processing are propagated.");
|
||||
</script>
|
||||
</body>
|
||||
|
|
|
@ -13,7 +13,9 @@
|
|||
document.body.appendChild(iframe);
|
||||
await waitForLoad;
|
||||
const portal = iframe.contentDocument.getElementById("portal");
|
||||
return promise_rejects_dom(t, "InvalidStateError", portal.activate());
|
||||
return promise_rejects_dom(t, "InvalidStateError",
|
||||
iframe.contentWindow.DOMException,
|
||||
portal.activate());
|
||||
}, "activating portal inside iframe should fail");
|
||||
</script>
|
||||
</body>
|
||||
|
|
|
@ -638,11 +638,37 @@ policies and contribution forms [3].
|
|||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Make a copy of a Promise in the current realm.
|
||||
*
|
||||
* @param {Promise} promise the given promise that may be from a different
|
||||
* realm
|
||||
* @returns {Promise}
|
||||
*
|
||||
* An arbitrary promise provided by the caller may have originated in
|
||||
* another frame that have since navigated away, rendering the frame's
|
||||
* document inactive. Such a promise cannot be used with `await` or
|
||||
* Promise.resolve(), as microtasks associated with it may be prevented
|
||||
* from being run. See https://github.com/whatwg/html/issues/5319 for a
|
||||
* particular case.
|
||||
*
|
||||
* In functions we define here, there is an expectation from the caller
|
||||
* that the promise is from the current realm, that can always be used with
|
||||
* `await`, etc. We therefore create a new promise in this realm that
|
||||
* inherit the value and status from the given promise.
|
||||
*/
|
||||
|
||||
function bring_promise_to_current_realm(promise) {
|
||||
return new Promise(promise.then.bind(promise));
|
||||
}
|
||||
|
||||
function promise_rejects_js(test, constructor, promise, description) {
|
||||
return promise.then(test.unreached_func("Should have rejected: " + description)).catch(function(e) {
|
||||
assert_throws_js_impl(constructor, function() { throw e },
|
||||
description, "promise_rejects_js");
|
||||
});
|
||||
return bring_promise_to_current_realm(promise)
|
||||
.then(test.unreached_func("Should have rejected: " + description))
|
||||
.catch(function(e) {
|
||||
assert_throws_js_impl(constructor, function() { throw e },
|
||||
description, "promise_rejects_js");
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -678,17 +704,21 @@ policies and contribution forms [3].
|
|||
assert(maybeDescription === undefined,
|
||||
"Too many args pased to no-constructor version of promise_rejects_dom");
|
||||
}
|
||||
return promise.then(test.unreached_func("Should have rejected: " + description)).catch(function(e) {
|
||||
assert_throws_dom_impl(type, function() { throw e }, description,
|
||||
"promise_rejects_dom", constructor);
|
||||
});
|
||||
return bring_promise_to_current_realm(promise)
|
||||
.then(test.unreached_func("Should have rejected: " + description))
|
||||
.catch(function(e) {
|
||||
assert_throws_dom_impl(type, function() { throw e }, description,
|
||||
"promise_rejects_dom", constructor);
|
||||
});
|
||||
}
|
||||
|
||||
function promise_rejects_exactly(test, exception, promise, description) {
|
||||
return promise.then(test.unreached_func("Should have rejected: " + description)).catch(function(e) {
|
||||
assert_throws_exactly_impl(exception, function() { throw e },
|
||||
description, "promise_rejects_exactly");
|
||||
});
|
||||
return bring_promise_to_current_realm(promise)
|
||||
.then(test.unreached_func("Should have rejected: " + description))
|
||||
.catch(function(e) {
|
||||
assert_throws_exactly_impl(exception, function() { throw e },
|
||||
description, "promise_rejects_exactly");
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -2808,24 +2838,8 @@ policies and contribution forms [3].
|
|||
var message_port;
|
||||
|
||||
if (is_service_worker(worker)) {
|
||||
if (window.MessageChannel) {
|
||||
// The ServiceWorker's implicit MessagePort is currently not
|
||||
// reliably accessible from the ServiceWorkerGlobalScope due to
|
||||
// Blink setting MessageEvent.source to null for messages sent
|
||||
// via ServiceWorker.postMessage(). Until that's resolved,
|
||||
// create an explicit MessageChannel and pass one end to the
|
||||
// worker.
|
||||
var message_channel = new MessageChannel();
|
||||
message_port = message_channel.port1;
|
||||
message_port.start();
|
||||
worker.postMessage({type: "connect"}, [message_channel.port2]);
|
||||
} else {
|
||||
// If MessageChannel is not available, then try the
|
||||
// ServiceWorker.postMessage() approach using MessageEvent.source
|
||||
// on the other end.
|
||||
message_port = navigator.serviceWorker;
|
||||
worker.postMessage({type: "connect"});
|
||||
}
|
||||
message_port = navigator.serviceWorker;
|
||||
worker.postMessage({type: "connect"});
|
||||
} else if (is_shared_worker(worker)) {
|
||||
message_port = worker.port;
|
||||
message_port.start();
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset=utf-8>
|
||||
<title>Test basic functionality of scroll timeline phases.</title>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/web-animations/testcommon.js"></script>
|
||||
<script src="testcommon.js"></script>
|
||||
<style>
|
||||
.scroller {
|
||||
overflow: auto;
|
||||
height: 100px;
|
||||
width: 100px;
|
||||
}
|
||||
.contents {
|
||||
height: 1000px;
|
||||
width: 100%;
|
||||
}
|
||||
</style>
|
||||
<div id="log"></div>
|
||||
<script>
|
||||
'use strict';
|
||||
|
||||
promise_test(async t => {
|
||||
const timeline = createScrollTimeline(t);
|
||||
assert_equals(timeline.phase, "inactive");
|
||||
}, 'Scroll timeline starts in "inactive" phase.');
|
||||
|
||||
promise_test(async t => {
|
||||
const timeline = createScrollTimeline(t);
|
||||
assert_throws_js(TypeError, () => {
|
||||
timeline.phase = "after";
|
||||
});
|
||||
}, 'Setting scroll timeline phase (which is readonly) throws TypeError.');
|
||||
</script>
|
|
@ -98,11 +98,11 @@ if (CSS.supports("d", "initial")) {
|
|||
// animation elements.
|
||||
|
||||
if (CSS.supports("fill", "initial")) {
|
||||
test(function() {
|
||||
for (let e of ["animate", "animateMotion", "animateTransform", "discard", "set"]) {
|
||||
for (let e of ["animate", "animateMotion", "animateTransform", "discard", "set"]) {
|
||||
test(function() {
|
||||
assertPresentationAttributeIsNotSupported(e, "fill", "blue", "fill");
|
||||
}
|
||||
}, `fill presentation attribute not supported on animation elements`);
|
||||
}, `fill presentation attribute not supported on ${e}`);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -145,7 +145,7 @@ const PROPERTIES = {
|
|||
irrelevantElement: null,
|
||||
},
|
||||
"image-rendering": {
|
||||
value: "optimizeSpeed",
|
||||
value: ["optimizeSpeed", "pixelated"],
|
||||
relevantElement: "image",
|
||||
irrelevantElement: "path",
|
||||
},
|
||||
|
@ -361,17 +361,25 @@ function presentationAttributeIsSupported(element, attribute, value, property) {
|
|||
return propertyValueBefore != propertyValueAfter;
|
||||
}
|
||||
|
||||
function assertPresentationAttributeIsSupported(element, attribute, value, property) {
|
||||
function assertPresentationAttributeIsSupported(element, attribute, values, property) {
|
||||
if (typeof values === 'string')
|
||||
values = [values];
|
||||
let supported = values.some(
|
||||
value => presentationAttributeIsSupported(element, attribute, value, property));
|
||||
assert_true(
|
||||
presentationAttributeIsSupported(element, attribute, value, property),
|
||||
`Presentation attribute ${attribute}="${value}" should be supported on ${element} element`
|
||||
supported,
|
||||
`Presentation attribute ${attribute}="${values.join(" | ")}" should be supported on ${element} element`
|
||||
);
|
||||
}
|
||||
|
||||
function assertPresentationAttributeIsNotSupported(element, attribute, value, property) {
|
||||
function assertPresentationAttributeIsNotSupported(element, attribute, values, property) {
|
||||
if (typeof values === 'string')
|
||||
values = [values];
|
||||
let supported = values.some(
|
||||
value => presentationAttributeIsSupported(element, attribute, value, property));
|
||||
assert_false(
|
||||
presentationAttributeIsSupported(element, attribute, value, property),
|
||||
`Presentation attribute ${attribute}="${value}" should be supported on ${element} element`
|
||||
supported,
|
||||
`Presentation attribute ${attribute}="${values.join(" | ")}" should not be supported on ${element} element`
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -268,10 +268,11 @@ def has_mirroring_label(pull_request):
|
|||
|
||||
def should_be_mirrored(project, pull_request):
|
||||
return (
|
||||
is_open(pull_request) and
|
||||
pull_request['user']['login'] not in AUTOMATION_GITHUB_USERS and (
|
||||
pull_request['author_association'] in TRUSTED_AUTHOR_ASSOCIATIONS or
|
||||
has_mirroring_label(pull_request)
|
||||
is_open(pull_request) and (
|
||||
has_mirroring_label(pull_request) or (
|
||||
pull_request['user']['login'] not in AUTOMATION_GITHUB_USERS and
|
||||
pull_request['author_association'] in TRUSTED_AUTHOR_ASSOCIATIONS
|
||||
)
|
||||
) and
|
||||
# Query this last as it requires another API call to verify
|
||||
not project.pull_request_is_from_fork(pull_request)
|
||||
|
|
|
@ -512,6 +512,8 @@ def test_synchronize_sync_trusted_contributor():
|
|||
'items': [
|
||||
{
|
||||
'number': 23,
|
||||
# user here is a contributor (untrusted), but the issue
|
||||
# has been labelled as safe.
|
||||
'labels': [{'name': 'safe for preview'}],
|
||||
'closed_at': None,
|
||||
'user': {'login': 'Hexcles'},
|
||||
|
@ -541,6 +543,51 @@ def test_synchronize_sync_trusted_contributor():
|
|||
assert returncode == 0
|
||||
assert same_members(expected_traffic, actual_traffic)
|
||||
|
||||
def test_synchronize_sync_bot_with_label():
|
||||
expected_traffic = [
|
||||
(Requests.get_rate, Responses.no_limit),
|
||||
(Requests.get_rate, Responses.no_limit),
|
||||
(Requests.get_rate, Responses.no_limit),
|
||||
(Requests.get_rate, Responses.no_limit),
|
||||
(Requests.get_rate, Responses.no_limit),
|
||||
(Requests.get_rate, Responses.no_limit),
|
||||
(Requests.search, (
|
||||
200,
|
||||
{
|
||||
'items': [
|
||||
{
|
||||
'number': 23,
|
||||
# user here is a bot which is normally not mirrored,
|
||||
# but the issue has been labelled as safe.
|
||||
'labels': [{'name': 'safe for preview'}],
|
||||
'closed_at': None,
|
||||
'user': {'login': 'chromium-wpt-export-bot'},
|
||||
'author_association': 'COLLABORATOR'
|
||||
}
|
||||
],
|
||||
'incomplete_results': False
|
||||
}
|
||||
)),
|
||||
(Requests.pr_details, (200,
|
||||
{
|
||||
'head': {
|
||||
'repo': {
|
||||
'full_name': 'test-org/test-repo'
|
||||
}
|
||||
}
|
||||
}
|
||||
)),
|
||||
(Requests.ref_create_open, (200, {})),
|
||||
(Requests.ref_create_trusted, (200, {})),
|
||||
(Requests.deployment_get, (200, [])),
|
||||
(Requests.deployment_create, (200, {}))
|
||||
]
|
||||
|
||||
returncode, actual_traffic, remote_refs = synchronize(expected_traffic)
|
||||
|
||||
assert returncode == 0
|
||||
assert same_members(expected_traffic, actual_traffic)
|
||||
|
||||
def test_synchronize_update_collaborator():
|
||||
expected_traffic = [
|
||||
(Requests.get_rate, Responses.no_limit),
|
||||
|
|
|
@ -55,13 +55,25 @@ class ChromiumFormatter(base.BaseFormatter):
|
|||
prefix += "%s: " % subtest
|
||||
self.messages[test] += prefix + message + "\n"
|
||||
|
||||
def _store_test_result(self, name, actual, expected, message, subtest_failure=False):
|
||||
def _append_artifact(self, cur_dict, artifact_name, artifact_value):
|
||||
"""
|
||||
Appends artifacts to the specified dictionary.
|
||||
:param dict cur_dict: the test leaf dictionary to append to
|
||||
:param str artifact_name: the name of the artifact
|
||||
:param str artifact_value: the value of the artifact
|
||||
"""
|
||||
if "artifacts" not in cur_dict.keys():
|
||||
cur_dict["artifacts"] = {}
|
||||
cur_dict["artifacts"][artifact_name] = artifact_value
|
||||
|
||||
def _store_test_result(self, name, actual, expected, message, wpt_actual, subtest_failure):
|
||||
"""
|
||||
Stores the result of a single test in |self.tests|
|
||||
:param str name: name of the test.
|
||||
:param str actual: actual status of the test.
|
||||
:param str expected: expected statuses of the test.
|
||||
:param str message: test output, such as status, subtest, errors etc.
|
||||
:param str wpt_actual: actual status reported by wpt, may differ from |actual|.
|
||||
:param bool subtest_failure: whether this test failed because of subtests
|
||||
"""
|
||||
# The test name can contain a leading / which will produce an empty
|
||||
|
@ -73,12 +85,12 @@ class ChromiumFormatter(base.BaseFormatter):
|
|||
cur_dict = cur_dict.setdefault(name_part, {})
|
||||
cur_dict["actual"] = actual
|
||||
cur_dict["expected"] = expected
|
||||
if subtest_failure or message:
|
||||
cur_dict["artifacts"] = {"log": ""}
|
||||
if subtest_failure:
|
||||
cur_dict["artifacts"]["log"] += "subtest_failure\n"
|
||||
if message != "":
|
||||
cur_dict["artifacts"]["log"] += message
|
||||
if subtest_failure:
|
||||
self._append_artifact(cur_dict, "wpt_subtest_failure", "true")
|
||||
if wpt_actual != actual:
|
||||
self._append_artifact(cur_dict, "wpt_actual_status", wpt_actual)
|
||||
if message != "":
|
||||
self._append_artifact(cur_dict, "log", message)
|
||||
|
||||
# Figure out if there was a regression or unexpected status. This only
|
||||
# happens for tests that were run
|
||||
|
@ -108,7 +120,7 @@ class ChromiumFormatter(base.BaseFormatter):
|
|||
return "SKIP"
|
||||
if status == "EXTERNAL-TIMEOUT":
|
||||
return "TIMEOUT"
|
||||
if status in ("ERROR", "CRASH"):
|
||||
if status in ("ERROR", "CRASH", "PRECONDITION_FAILED"):
|
||||
# CRASH in WPT means a browser crash, which Chromium treats as a
|
||||
# test failure.
|
||||
return "FAIL"
|
||||
|
@ -161,20 +173,28 @@ class ChromiumFormatter(base.BaseFormatter):
|
|||
|
||||
def test_end(self, data):
|
||||
test_name = data["test"]
|
||||
actual_status = self._map_status_name(data["status"])
|
||||
# Save the status reported by WPT since we might change it when reporting
|
||||
# to Chromium.
|
||||
wpt_actual_status = data["status"]
|
||||
actual_status = self._map_status_name(wpt_actual_status)
|
||||
expected_statuses = self._get_expected_status_from_data(actual_status, data)
|
||||
subtest_failure = False
|
||||
if actual_status == "PASS" and test_name in self.tests_with_subtest_fails:
|
||||
# This test passed but it has failing subtests, so we flip the status
|
||||
# to FAIL.
|
||||
actual_status = "FAIL"
|
||||
if test_name in self.tests_with_subtest_fails:
|
||||
subtest_failure = True
|
||||
# Clean up the test list to avoid accumulating too many.
|
||||
self.tests_with_subtest_fails.remove(test_name)
|
||||
# This test passed but it has failing subtests. Since we can only
|
||||
# report a single status to Chromium, we choose FAIL to indicate
|
||||
# that something about this test did not run correctly.
|
||||
if actual_status == "PASS":
|
||||
actual_status = "FAIL"
|
||||
|
||||
if "message" in data:
|
||||
self._append_test_message(test_name, None, actual_status, expected_statuses, data["message"])
|
||||
self._store_test_result(test_name, actual_status, expected_statuses, self.messages[test_name], subtest_failure)
|
||||
self._append_test_message(test_name, None, actual_status,
|
||||
expected_statuses, data["message"])
|
||||
self._store_test_result(test_name, actual_status, expected_statuses,
|
||||
self.messages[test_name], wpt_actual_status,
|
||||
subtest_failure)
|
||||
|
||||
# Remove the test from messages dict to avoid accumulating too many.
|
||||
self.messages.pop(test_name)
|
||||
|
|
|
@ -156,13 +156,13 @@ def test_subtest_messages(capfd):
|
|||
output.seek(0)
|
||||
output_json = json.load(output)
|
||||
|
||||
t1_log = output_json["tests"]["t1"]["artifacts"]["log"]
|
||||
assert t1_log == "subtest_failure\n" \
|
||||
"[FAIL expected PASS] t1_a: t1_a_message\n" \
|
||||
"[PASS] t1_b: t1_b_message\n"
|
||||
|
||||
t2_log = output_json["tests"]["t2"]["artifacts"]["log"]
|
||||
assert t2_log == "[TIMEOUT expected PASS] t2_message\n"
|
||||
t1_artifacts = output_json["tests"]["t1"]["artifacts"]
|
||||
assert t1_artifacts["log"] == "[FAIL expected PASS] t1_a: t1_a_message\n" \
|
||||
"[PASS] t1_b: t1_b_message\n"
|
||||
assert t1_artifacts["wpt_subtest_failure"] == "true"
|
||||
t2_artifacts = output_json["tests"]["t2"]["artifacts"]
|
||||
assert t2_artifacts["log"] == "[TIMEOUT expected PASS] t2_message\n"
|
||||
assert "wpt_subtest_failure" not in t2_artifacts.keys()
|
||||
|
||||
|
||||
def test_subtest_failure(capfd):
|
||||
|
@ -203,13 +203,15 @@ def test_subtest_failure(capfd):
|
|||
output_json = json.load(output)
|
||||
|
||||
test_obj = output_json["tests"]["t1"]
|
||||
t1_log = test_obj["artifacts"]["log"]
|
||||
assert t1_log == "subtest_failure\n" \
|
||||
"[FAIL expected PASS] t1_a: t1_a_message\n" \
|
||||
"[PASS] t1_b: t1_b_message\n" \
|
||||
"[TIMEOUT expected PASS] t1_c: t1_c_message\n"
|
||||
t1_artifacts = test_obj["artifacts"]
|
||||
assert t1_artifacts["log"] == "[FAIL expected PASS] t1_a: t1_a_message\n" \
|
||||
"[PASS] t1_b: t1_b_message\n" \
|
||||
"[TIMEOUT expected PASS] t1_c: t1_c_message\n"
|
||||
assert t1_artifacts["wpt_subtest_failure"] == "true"
|
||||
# The status of the test in the output is a failure because subtests failed,
|
||||
# despite the harness reporting that the test passed.
|
||||
# despite the harness reporting that the test passed. But the harness status
|
||||
# is logged as an artifact.
|
||||
assert t1_artifacts["wpt_actual_status"] == "PASS"
|
||||
assert test_obj["actual"] == "FAIL"
|
||||
assert test_obj["expected"] == "PASS"
|
||||
# Also ensure that the formatter cleaned up its internal state
|
||||
|
@ -300,10 +302,12 @@ def test_unexpected_subtest_pass(capfd):
|
|||
output_json = json.load(output)
|
||||
|
||||
test_obj = output_json["tests"]["t1"]
|
||||
t1_log = test_obj["artifacts"]["log"]
|
||||
assert t1_log == "subtest_failure\n" \
|
||||
"[PASS expected FAIL] t1_a: t1_a_message\n"
|
||||
# Since the subtest status is unexpected, we fail the test.
|
||||
t1_artifacts = test_obj["artifacts"]
|
||||
assert t1_artifacts["log"] == "[PASS expected FAIL] t1_a: t1_a_message\n"
|
||||
assert t1_artifacts["wpt_subtest_failure"] == "true"
|
||||
# Since the subtest status is unexpected, we fail the test. But we report
|
||||
# wpt_actual_status as an artifact
|
||||
assert t1_artifacts["wpt_actual_status"] == "PASS"
|
||||
assert test_obj["actual"] == "FAIL"
|
||||
assert test_obj["expected"] == "PASS"
|
||||
# Also ensure that the formatter cleaned up its internal state
|
||||
|
@ -448,3 +452,37 @@ def test_flaky_test_unexpected(capfd):
|
|||
# one of the expected ones
|
||||
assert test_obj["is_regression"] is True
|
||||
assert test_obj["is_unexpected"] is True
|
||||
|
||||
|
||||
def test_precondition_failed(capfd):
|
||||
# Check that a failed precondition gets properly handled.
|
||||
|
||||
# set up the handler.
|
||||
output = StringIO()
|
||||
logger = structuredlog.StructuredLogger("test_a")
|
||||
logger.add_handler(handlers.StreamHandler(output, ChromiumFormatter()))
|
||||
|
||||
# Run a test with a precondition failure
|
||||
logger.suite_start(["t1"], run_info={}, time=123)
|
||||
logger.test_start("t1")
|
||||
logger.test_end("t1", status="PRECONDITION_FAILED", expected="OK")
|
||||
logger.suite_end()
|
||||
|
||||
# check nothing got output to stdout/stderr
|
||||
# (note that mozlog outputs exceptions during handling to stderr!)
|
||||
captured = capfd.readouterr()
|
||||
assert captured.out == ""
|
||||
assert captured.err == ""
|
||||
|
||||
# check the actual output of the formatter
|
||||
output.seek(0)
|
||||
output_json = json.load(output)
|
||||
|
||||
test_obj = output_json["tests"]["t1"]
|
||||
# The precondition failure should map to FAIL status, but we should also
|
||||
# have an artifact containing the original PRECONDITION_FAILED status.
|
||||
assert test_obj["actual"] == "FAIL"
|
||||
assert test_obj["artifacts"]["wpt_actual_status"] == "PRECONDITION_FAILED"
|
||||
# ...this is an unexpected regression because we expected a pass but failed
|
||||
assert test_obj["is_regression"] is True
|
||||
assert test_obj["is_unexpected"] is True
|
||||
|
|
|
@ -6682,5 +6682,50 @@
|
|||
"pathname": "/test",
|
||||
"search": "?a",
|
||||
"hash": "#bc"
|
||||
},
|
||||
"First scheme char - not allowed: https://github.com/whatwg/url/issues/464",
|
||||
{
|
||||
"input": "10.0.0.7:8080/foo.html",
|
||||
"base": "file:///some/dir/bar.html",
|
||||
"href": "file:///some/dir/10.0.0.7:8080/foo.html",
|
||||
"protocol": "file:",
|
||||
"username": "",
|
||||
"password": "",
|
||||
"host": "",
|
||||
"hostname": "",
|
||||
"port": "",
|
||||
"pathname": "/some/dir/10.0.0.7:8080/foo.html",
|
||||
"search": "",
|
||||
"hash": ""
|
||||
},
|
||||
"Subsequent scheme chars - not allowed",
|
||||
{
|
||||
"input": "a!@$*=/foo.html",
|
||||
"base": "file:///some/dir/bar.html",
|
||||
"href": "file:///some/dir/a!@$*=/foo.html",
|
||||
"protocol": "file:",
|
||||
"username": "",
|
||||
"password": "",
|
||||
"host": "",
|
||||
"hostname": "",
|
||||
"port": "",
|
||||
"pathname": "/some/dir/a!@$*=/foo.html",
|
||||
"search": "",
|
||||
"hash": ""
|
||||
},
|
||||
"First and subsequent scheme chars - allowed",
|
||||
{
|
||||
"input": "a1234567890-+.:foo/bar",
|
||||
"base": "http://example.com/dir/file",
|
||||
"href": "a1234567890-+.:foo/bar",
|
||||
"protocol": "a1234567890-+.:",
|
||||
"username": "",
|
||||
"password": "",
|
||||
"host": "",
|
||||
"hostname": "",
|
||||
"port": "",
|
||||
"pathname": "foo/bar",
|
||||
"search": "",
|
||||
"hash": ""
|
||||
}
|
||||
]
|
||||
|
|
|
@ -20,6 +20,8 @@ promise_test(async t => {
|
|||
iframe,
|
||||
"/wake-lock/resources/page1.html"
|
||||
);
|
||||
// Save the DOMException of page1.html before navigating away.
|
||||
const frameDOMException1 = iframe.contentWindow.DOMException;
|
||||
// We navigate the iframe again, putting wakeLock1's document into an inactive state.
|
||||
const wakeLock2 = await getWakeLockObject(
|
||||
iframe,
|
||||
|
@ -30,6 +32,7 @@ promise_test(async t => {
|
|||
await promise_rejects_dom(
|
||||
t,
|
||||
"NotAllowedError",
|
||||
frameDOMException1,
|
||||
wakeLock1.request('screen'),
|
||||
"Inactive document, so must throw NotAllowedError"
|
||||
);
|
||||
|
@ -58,6 +61,8 @@ promise_test(async t => {
|
|||
innerIframe,
|
||||
"/wake-lock/resources/page2.html"
|
||||
);
|
||||
// Save DOMException from innerIframe before navigating away.
|
||||
const innerIframeDOMException = innerIframe.contentWindow.DOMException;
|
||||
|
||||
// Navigate the outer iframe to a new location.
|
||||
// Wait for the load event to fire.
|
||||
|
@ -73,6 +78,7 @@ promise_test(async t => {
|
|||
await promise_rejects_dom(
|
||||
t,
|
||||
"NotAllowedError",
|
||||
innerIframeDOMException,
|
||||
wakeLock.request('screen'),
|
||||
"Active, but not fully active, so must throw NotAllowedError"
|
||||
);
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset=utf-8>
|
||||
<title>Test basic functionality of document timeline phases.</title>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script>
|
||||
'use strict';
|
||||
promise_test(async t => {
|
||||
const timeline = new DocumentTimeline();
|
||||
assert_equals(timeline.phase, "active");
|
||||
}, 'Document timeline starts in "active" phase.');
|
||||
|
||||
promise_test(async t => {
|
||||
const timeline = new DocumentTimeline();
|
||||
assert_throws_js(TypeError, () => {
|
||||
timeline.phase = "after";
|
||||
});
|
||||
}, 'Setting document timeline phase (which is readonly) throws TypeError.');
|
||||
</script>
|
|
@ -537,28 +537,22 @@ function validateAuthenticatorAssertionResponse(assert) {
|
|||
|
||||
function standardSetup(cb) {
|
||||
// Setup an automated testing environment if available.
|
||||
let authenticator;
|
||||
promise_test(async t => {
|
||||
try {
|
||||
authenticator = await window.test_driver.add_virtual_authenticator({
|
||||
protocol: "ctap1/u2f",
|
||||
transport: "usb"
|
||||
});
|
||||
} catch (error) {
|
||||
if (error !== "error: Action add_virtual_authenticator not implemented") {
|
||||
throw error;
|
||||
}
|
||||
// The protocol is not available. Continue manually.
|
||||
window.test_driver.add_virtual_authenticator({
|
||||
protocol: "ctap1/u2f",
|
||||
transport: "usb"
|
||||
}).then(authenticator => {
|
||||
cb();
|
||||
// XXX add a subtest to clean up the virtual authenticator since
|
||||
// testharness does not support waiting for promises on cleanup.
|
||||
promise_test(() => window.test_driver.remove_virtual_authenticator(authenticator),
|
||||
"Clean up the test environment");
|
||||
}).catch(error => {
|
||||
if (error !== "error: Action add_virtual_authenticator not implemented") {
|
||||
throw error;
|
||||
}
|
||||
}, "Set up the test environment");
|
||||
|
||||
cb();
|
||||
|
||||
promise_test(t => {
|
||||
if (authenticator) {
|
||||
return window.test_driver.remove_virtual_authenticator(authenticator);
|
||||
}
|
||||
}, "Clean up the test environment");
|
||||
// The protocol is not available. Continue manually.
|
||||
cb();
|
||||
});
|
||||
}
|
||||
|
||||
/* JSHINT */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue