diff options
43 files changed, 557 insertions, 204 deletions
diff --git a/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini b/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini index d4f62ed7113..faa00f45ecf 100644 --- a/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini +++ b/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini @@ -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 diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json index 38ead3071d5..548eb63cd89 100644 --- a/tests/wpt/metadata/MANIFEST.json +++ b/tests/wpt/metadata/MANIFEST.json @@ -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", [ diff --git a/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-002.html.ini b/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-002.html.ini new file mode 100644 index 00000000000..f64b45fea6b --- /dev/null +++ b/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-002.html.ini @@ -0,0 +1,4 @@ +[hit-test-floats-002.html] + [Hit test float] + expected: FAIL + diff --git a/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-004.html.ini b/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-004.html.ini new file mode 100644 index 00000000000..4bfb0c2053a --- /dev/null +++ b/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-004.html.ini @@ -0,0 +1,4 @@ +[hit-test-floats-004.html] + [Miss float below something else] + expected: FAIL + diff --git a/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-005.html.ini b/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-005.html.ini new file mode 100644 index 00000000000..baa9f1a7541 --- /dev/null +++ b/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-005.html.ini @@ -0,0 +1,4 @@ +[hit-test-floats-005.html] + [Miss clipped float] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-transforms/transform-scale-hittest.html.ini b/tests/wpt/metadata/css/css-transforms/transform-scale-hittest.html.ini index f8e7e539aae..4a1e8110f6f 100644 --- a/tests/wpt/metadata/css/css-transforms/transform-scale-hittest.html.ini +++ b/tests/wpt/metadata/css/css-transforms/transform-scale-hittest.html.ini @@ -2,6 +2,3 @@ [Hit test intersecting scaled box] expected: FAIL - [Hit test within unscaled box] - expected: FAIL - diff --git a/tests/wpt/metadata/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini b/tests/wpt/metadata/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini index c884dc82eab..628b1fab770 100644 --- a/tests/wpt/metadata/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini +++ b/tests/wpt/metadata/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini @@ -2,6 +2,3 @@ [listeners are called when <iframe> is resized] expected: FAIL - [listeners are called correct number of times] - expected: FAIL - diff --git a/tests/wpt/metadata/css/cssom-view/elementsFromPoint-iframes.html.ini b/tests/wpt/metadata/css/cssom-view/elementsFromPoint-iframes.html.ini index 6ef8bb1049f..171592fc08f 100644 --- a/tests/wpt/metadata/css/cssom-view/elementsFromPoint-iframes.html.ini +++ b/tests/wpt/metadata/css/cssom-view/elementsFromPoint-iframes.html.ini @@ -2,6 +2,3 @@ [elementsFromPoint on the root document for points in iframe elements] expected: FAIL - [elementsFromPoint on inner documents] - expected: FAIL - diff --git a/tests/wpt/metadata/css/cssom-view/elementsFromPoint-invalid-cases.html.ini b/tests/wpt/metadata/css/cssom-view/elementsFromPoint-invalid-cases.html.ini deleted file mode 100644 index e181af5397f..00000000000 --- a/tests/wpt/metadata/css/cssom-view/elementsFromPoint-invalid-cases.html.ini +++ /dev/null @@ -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 - diff --git a/tests/wpt/metadata/fetch/content-type/response.window.js.ini b/tests/wpt/metadata/fetch/content-type/response.window.js.ini index 0af08ed6710..98f49140596 100644 --- a/tests/wpt/metadata/fetch/content-type/response.window.js.ini +++ b/tests/wpt/metadata/fetch/content-type/response.window.js.ini @@ -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 + diff --git a/tests/wpt/metadata/fetch/content-type/script.window.js.ini b/tests/wpt/metadata/fetch/content-type/script.window.js.ini index a1ec6ff3aa3..d2df9b78483 100644 --- a/tests/wpt/metadata/fetch/content-type/script.window.js.ini +++ b/tests/wpt/metadata/fetch/content-type/script.window.js.ini @@ -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 diff --git a/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini b/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini index 369bf4d4fa4..30e1b851fd4 100644 --- a/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini +++ b/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini @@ -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 - diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini deleted file mode 100644 index 87b07c3e670..00000000000 --- a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[traverse_the_history_1.html] - [Multiple history traversals from the same task] - expected: FAIL - diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini index dc2e45516de..51f8272a6de 100644 --- a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini +++ b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini @@ -1,4 +1,4 @@ -[traverse_the_history_5.html] +[traverse_the_history_3.html] [Multiple history traversals, last would be aborted] expected: FAIL diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini index 71edac2c5ed..e440b1e38c6 100644 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini +++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini @@ -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 diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/image-loading-lazy-crossorigin-change.sub.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/image-loading-lazy-crossorigin-change.sub.html.ini new file mode 100644 index 00000000000..58679792732 --- /dev/null +++ b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/image-loading-lazy-crossorigin-change.sub.html.ini @@ -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 + diff --git a/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini index a56bad443a2..66bd350083b 100644 --- a/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini +++ b/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini @@ -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 diff --git a/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-multi-channels.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-multi-channels.html.ini index 601831e0fda..f3e6ba959a0 100644 --- a/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-multi-channels.html.ini +++ b/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-multi-channels.html.ini @@ -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 + diff --git a/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini index 05e13f78c22..729e7e05482 100644 --- a/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini +++ b/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini @@ -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 + diff --git a/tests/wpt/metadata/webmessaging/without-ports/017.html.ini b/tests/wpt/metadata/webmessaging/without-ports/017.html.ini deleted file mode 100644 index 064cf47545b..00000000000 --- a/tests/wpt/metadata/webmessaging/without-ports/017.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[017.html] - expected: TIMEOUT - [origin of the script that invoked the method, about:blank] - expected: TIMEOUT - diff --git a/tests/wpt/metadata/workers/semantics/multiple-workers/005.html.ini b/tests/wpt/metadata/workers/semantics/multiple-workers/005.html.ini index 268949ced5c..f584fce5df1 100644 --- a/tests/wpt/metadata/workers/semantics/multiple-workers/005.html.ini +++ b/tests/wpt/metadata/workers/semantics/multiple-workers/005.html.ini @@ -1,4 +1,5 @@ [005.html] + expected: ERROR [dedicated worker in shared worker in dedicated worker] expected: FAIL diff --git a/tests/wpt/web-platform-tests/css/css-grid/placement/grid-placement-using-named-grid-lines-003.html b/tests/wpt/web-platform-tests/css/css-grid/placement/grid-placement-using-named-grid-lines-003.html new file mode 100644 index 00000000000..31173e0a455 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-grid/placement/grid-placement-using-named-grid-lines-003.html @@ -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> diff --git a/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/the-page/iframe-scrolling-attribute-ref.html b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/the-page/iframe-scrolling-attribute-ref.html new file mode 100644 index 00000000000..fe72b9f9380 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/the-page/iframe-scrolling-attribute-ref.html @@ -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> diff --git a/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/the-page/iframe-scrolling-attribute.html b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/the-page/iframe-scrolling-attribute.html new file mode 100644 index 00000000000..cc7df7b43a0 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/the-page/iframe-scrolling-attribute.html @@ -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> diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/image-loading-lazy-crossorigin-change.sub.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/image-loading-lazy-crossorigin-change.sub.html new file mode 100644 index 00000000000..13560324854 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/image-loading-lazy-crossorigin-change.sub.html @@ -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> diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/original-crossorigin-applied.sub.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/original-crossorigin-applied.sub.html deleted file mode 100644 index 2cf076e75f7..00000000000 --- a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/original-crossorigin-applied.sub.html +++ /dev/null @@ -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> diff --git a/tests/wpt/web-platform-tests/payment-handler/app-respond-with-minimal-ui.js b/tests/wpt/web-platform-tests/payment-handler/app-respond-with-minimal-ui.js index 0e6b1b78b91..45ac57c2279 100644 --- a/tests/wpt/web-platform-tests/payment-handler/app-respond-with-minimal-ui.js +++ b/tests/wpt/web-platform-tests/payment-handler/app-respond-with-minimal-ui.js @@ -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); }); diff --git a/tests/wpt/web-platform-tests/payment-request/rejects_if_not_active-manual.https.html b/tests/wpt/web-platform-tests/payment-request/rejects_if_not_active-manual.https.html index d03032d0498..8e214cb6094 100644 --- a/tests/wpt/web-platform-tests/payment-request/rejects_if_not_active-manual.https.html +++ b/tests/wpt/web-platform-tests/payment-request/rejects_if_not_active-manual.https.html @@ -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" ); diff --git a/tests/wpt/web-platform-tests/portals/about-blank-cannot-host.html b/tests/wpt/web-platform-tests/portals/about-blank-cannot-host.html index 6a721c32e68..7aba015e69b 100644 --- a/tests/wpt/web-platform-tests/portals/about-blank-cannot-host.html +++ b/tests/wpt/web-platform-tests/portals/about-blank-cannot-host.html @@ -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> diff --git a/tests/wpt/web-platform-tests/portals/portal-activate-data.html b/tests/wpt/web-platform-tests/portals/portal-activate-data.html index cefb0eae3dc..004fa97e55c 100644 --- a/tests/wpt/web-platform-tests/portals/portal-activate-data.html +++ b/tests/wpt/web-platform-tests/portals/portal-activate-data.html @@ -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> diff --git a/tests/wpt/web-platform-tests/portals/portals-activate-inside-iframe.html b/tests/wpt/web-platform-tests/portals/portals-activate-inside-iframe.html index 5234babfdf9..587e483479c 100644 --- a/tests/wpt/web-platform-tests/portals/portals-activate-inside-iframe.html +++ b/tests/wpt/web-platform-tests/portals/portals-activate-inside-iframe.html @@ -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> diff --git a/tests/wpt/web-platform-tests/resources/testharness.js b/tests/wpt/web-platform-tests/resources/testharness.js index 0ec232c1d27..ce043a287f7 100644 --- a/tests/wpt/web-platform-tests/resources/testharness.js +++ b/tests/wpt/web-platform-tests/resources/testharness.js @@ -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(); diff --git a/tests/wpt/web-platform-tests/scroll-animations/scroll-timeline-phases.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/scroll-timeline-phases.tentative.html new file mode 100644 index 00000000000..0cc4e12864e --- /dev/null +++ b/tests/wpt/web-platform-tests/scroll-animations/scroll-timeline-phases.tentative.html @@ -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>
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/svg/styling/presentation-attributes-special-cases.html b/tests/wpt/web-platform-tests/svg/styling/presentation-attributes-special-cases.html index 8fa045984d9..c99ed704cf1 100644 --- a/tests/wpt/web-platform-tests/svg/styling/presentation-attributes-special-cases.html +++ b/tests/wpt/web-platform-tests/svg/styling/presentation-attributes-special-cases.html @@ -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}`); + } } diff --git a/tests/wpt/web-platform-tests/svg/styling/presentation-attributes.js b/tests/wpt/web-platform-tests/svg/styling/presentation-attributes.js index 552041496f1..7bf77cb77bc 100644 --- a/tests/wpt/web-platform-tests/svg/styling/presentation-attributes.js +++ b/tests/wpt/web-platform-tests/svg/styling/presentation-attributes.js @@ -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` ); } diff --git a/tests/wpt/web-platform-tests/tools/ci/pr_preview.py b/tests/wpt/web-platform-tests/tools/ci/pr_preview.py index 4b76b37f87e..ba5997f68a6 100755 --- a/tests/wpt/web-platform-tests/tools/ci/pr_preview.py +++ b/tests/wpt/web-platform-tests/tools/ci/pr_preview.py @@ -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) diff --git a/tests/wpt/web-platform-tests/tools/ci/tests/test_pr_preview.py b/tests/wpt/web-platform-tests/tools/ci/tests/test_pr_preview.py index cdf3c9528ea..2d9966fc8cf 100644 --- a/tests/wpt/web-platform-tests/tools/ci/tests/test_pr_preview.py +++ b/tests/wpt/web-platform-tests/tools/ci/tests/test_pr_preview.py @@ -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), diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/chromium.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/chromium.py index 03e674eb2e8..62ed53865d7 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/chromium.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/chromium.py @@ -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) diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/tests/test_chromium.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/tests/test_chromium.py index f9ae80b0be5..cb6f1ad370f 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/tests/test_chromium.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/tests/test_chromium.py @@ -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 diff --git a/tests/wpt/web-platform-tests/url/resources/urltestdata.json b/tests/wpt/web-platform-tests/url/resources/urltestdata.json index 32ed1959430..b2f8964c440 100644 --- a/tests/wpt/web-platform-tests/url/resources/urltestdata.json +++ b/tests/wpt/web-platform-tests/url/resources/urltestdata.json @@ -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": "" } ] diff --git a/tests/wpt/web-platform-tests/wake-lock/wakelock-active-document.https.window.js b/tests/wpt/web-platform-tests/wake-lock/wakelock-active-document.https.window.js index 53f9fb56fa8..53745ea3c60 100644 --- a/tests/wpt/web-platform-tests/wake-lock/wakelock-active-document.https.window.js +++ b/tests/wpt/web-platform-tests/wake-lock/wakelock-active-document.https.window.js @@ -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" ); diff --git a/tests/wpt/web-platform-tests/web-animations/interfaces/DocumentTimeline/document-timeline-phases.tentative.html b/tests/wpt/web-platform-tests/web-animations/interfaces/DocumentTimeline/document-timeline-phases.tentative.html new file mode 100644 index 00000000000..9b86a7105d5 --- /dev/null +++ b/tests/wpt/web-platform-tests/web-animations/interfaces/DocumentTimeline/document-timeline-phases.tentative.html @@ -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>
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/webauthn/helpers.js b/tests/wpt/web-platform-tests/webauthn/helpers.js index 0fc64c8b522..27abaaf4766 100644 --- a/tests/wpt/web-platform-tests/webauthn/helpers.js +++ b/tests/wpt/web-platform-tests/webauthn/helpers.js @@ -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. - } - }, "Set up the test environment"); - - cb(); - - promise_test(t => { - if (authenticator) { - return window.test_driver.remove_virtual_authenticator(authenticator); + 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; } - }, "Clean up the test environment"); + // The protocol is not available. Continue manually. + cb(); + }); } /* JSHINT */ |