diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json index 0bafe6f9299..ccd51186286 100644 --- a/tests/wpt/metadata/MANIFEST.json +++ b/tests/wpt/metadata/MANIFEST.json @@ -109567,6 +109567,18 @@ {} ] ], + "css/css-contain/contain-layout-018.html": [ + [ + "/css/css-contain/contain-layout-018.html", + [ + [ + "/css/reference/nothing.html", + "==" + ] + ], + {} + ] + ], "css/css-contain/contain-layout-breaks-001.html": [ [ "/css/css-contain/contain-layout-breaks-001.html", @@ -110011,6 +110023,18 @@ {} ] ], + "css/css-contain/contain-paint-025.html": [ + [ + "/css/css-contain/contain-paint-025.html", + [ + [ + "/css/reference/nothing.html", + "==" + ] + ], + {} + ] + ], "css/css-contain/contain-paint-047.html": [ [ "/css/css-contain/contain-paint-047.html", @@ -110551,6 +110575,18 @@ {} ] ], + "css/css-contain/contain-size-grid-002.html": [ + [ + "/css/css-contain/contain-size-grid-002.html", + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "css/css-contain/contain-size-monolithic-001.html": [ [ "/css/css-contain/contain-size-monolithic-001.html", @@ -110563,6 +110599,18 @@ {} ] ], + "css/css-contain/contain-size-multicol-001.html": [ + [ + "/css/css-contain/contain-size-multicol-001.html", + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "css/css-contain/contain-size-scrollbars-001.html": [ [ "/css/css-contain/contain-size-scrollbars-001.html", @@ -159899,6 +159947,30 @@ {} ] ], + "css/css-writing-modes/img-intrinsic-size-contribution-001.html": [ + [ + "/css/css-writing-modes/img-intrinsic-size-contribution-001.html", + [ + [ + "/css/css-writing-modes/img-intrinsic-size-contribution-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-writing-modes/img-intrinsic-size-contribution-002.html": [ + [ + "/css/css-writing-modes/img-intrinsic-size-contribution-002.html", + [ + [ + "/css/css-writing-modes/img-intrinsic-size-contribution-ref.html", + "==" + ] + ], + {} + ] + ], "css/css-writing-modes/inline-block-alignment-002.xht": [ [ "/css/css-writing-modes/inline-block-alignment-002.xht", @@ -185371,6 +185443,18 @@ {} ] ], + "html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-auto-margins.html": [ + [ + "/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-auto-margins.html", + [ + [ + "/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-auto-margins-ref.html", + "==" + ] + ], + {} + ] + ], "html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-display-none-rendering.html": [ [ "/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-display-none-rendering.html", @@ -185947,6 +186031,18 @@ {} ] ], + "html/rendering/the-details-element/details-display-property-is-ignored.html": [ + [ + "/html/rendering/the-details-element/details-display-property-is-ignored.html", + [ + [ + "/html/rendering/the-details-element/details-display-property-is-ignored-ref.html", + "==" + ] + ], + {} + ] + ], "html/semantics/document-metadata/the-link-element/stylesheet-change-href.html": [ [ "/html/semantics/document-metadata/the-link-element/stylesheet-change-href.html", @@ -198016,6 +198112,11 @@ {} ] ], + "common/slow.py": [ + [ + {} + ] + ], "common/stringifiers.js": [ [ {} @@ -247436,11 +247537,6 @@ {} ] ], - "css/css-contain/support/60x60-red.png": [ - [ - {} - ] - ], "css/css-contain/support/blue-100x100.png": [ [ {} @@ -268226,6 +268322,11 @@ {} ] ], + "css/css-writing-modes/img-intrinsic-size-contribution-ref.html": [ + [ + {} + ] + ], "css/css-writing-modes/inline-block-alignment-002-ref.xht": [ [ {} @@ -269681,6 +269782,11 @@ {} ] ], + "css/css-writing-modes/support/blue-200x100.png": [ + [ + {} + ] + ], "css/css-writing-modes/support/blue-horiz-line-220x1.png": [ [ {} @@ -287921,6 +288027,11 @@ {} ] ], + "html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-auto-margins-ref.html": [ + [ + {} + ] + ], "html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-display-none-rendering-ref.html": [ [ {} @@ -288081,6 +288192,11 @@ {} ] ], + "html/rendering/the-details-element/details-display-property-is-ignored-ref.html": [ + [ + {} + ] + ], "html/rendering/the-details-element/single-summary.html": [ [ {} @@ -290506,11 +290622,6 @@ {} ] ], - "html/semantics/scripting-1/the-script-element/resources/slow.py": [ - [ - {} - ] - ], "html/semantics/scripting-1/the-script-element/script-not-executed-after-shutdown-child.html": [ [ {} @@ -291246,6 +291357,16 @@ {} ] ], + "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/http-refresh.py": [ + [ + {} + ] + ], + "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/meta-refresh.py": [ + [ + {} + ] + ], "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/page-with-frame.html": [ [ {} @@ -291256,6 +291377,11 @@ {} ] ], + "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/slow-png.py": [ + [ + {} + ] + ], "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/url-frame.html": [ [ {} @@ -292371,6 +292497,11 @@ {} ] ], + "interfaces/trusted-types.tentative.idl": [ + [ + {} + ] + ], "interfaces/uievents.idl": [ [ {} @@ -303456,6 +303587,11 @@ {} ] ], + "tools/ci/tcdownload.py": [ + [ + {} + ] + ], "tools/ci/tests/test_jobs.py": [ [ {} @@ -367426,6 +367562,36 @@ {} ] ], + "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort-refresh-immediate.window.js": [ + [ + "/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort-refresh-immediate.window.html", + {} + ] + ], + "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort-refresh-multisecond-header.window.js": [ + [ + "/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort-refresh-multisecond-header.window.html", + {} + ] + ], + "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort-refresh-multisecond-meta.window.js": [ + [ + "/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort-refresh-multisecond-meta.window.html", + {} + ] + ], + "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort-while-navigating.window.js": [ + [ + "/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort-while-navigating.window.html", + {} + ] + ], + "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort.sub.window.js": [ + [ + "/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort.sub.window.html", + {} + ] + ], "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/aborted-parser.window.js": [ [ "/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/aborted-parser.window.html", @@ -367540,6 +367706,12 @@ {} ] ], + "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/mutation-observer.window.js": [ + [ + "/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/mutation-observer.window.html", + {} + ] + ], "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/no-new-global.window.js": [ [ "/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/no-new-global.window.html", @@ -396126,6 +396298,12 @@ {} ] ], + "trusted-types/idlharness.window.js": [ + [ + "/trusted-types/idlharness.window.html", + {} + ] + ], "uievents/constructors/inputevent-constructor.html": [ [ "/uievents/constructors/inputevent-constructor.html", @@ -398856,6 +399034,12 @@ {} ] ], + "webaudio/the-audio-api/the-oscillatornode-interface/detune-limiting.html": [ + [ + "/webaudio/the-audio-api/the-oscillatornode-interface/detune-limiting.html", + {} + ] + ], "webaudio/the-audio-api/the-pannernode-interface/ctor-panner.html": [ [ "/webaudio/the-audio-api/the-pannernode-interface/ctor-panner.html", @@ -427748,7 +427932,7 @@ "support" ], ".taskcluster.yml": [ - "70bde33c354105834431f3fb867bc383bd89343f", + "b6d21a17ab5016627041dcd8262573f41c964eaa", "support" ], ".travis.yml": [ @@ -438787,6 +438971,10 @@ "6805c323df5a975231648b830e33ce183c3cbbd3", "support" ], + "common/slow.py": [ + "f3b1c7e2ea61b571bd56cc1c70c5f89bb8e7e4dc", + "support" + ], "common/stringifiers.js": [ "b59ca9c246f75a72d532d58ef628824f8905ff7a", "support" @@ -461120,11 +461308,11 @@ "testharness" ], "cookies/prefix/__host.header.html": [ - "5a522cbaa018aa607628070ab79278dd855735bd", + "de46485e44c1d349143a9ec7681aea82d1561ee2", "testharness" ], "cookies/prefix/__host.header.https.html": [ - "53d0dba65989164f5fcb77becd021f264822ebf7", + "a71f75ef41bbcda09ed1dd4a6c666cb51f876fdd", "testharness" ], "cookies/prefix/__secure.document-cookie.html": [ @@ -461136,11 +461324,11 @@ "testharness" ], "cookies/prefix/__secure.header.html": [ - "431e0e1ec98923feae1f1f6948c7728e5e80b007", + "fb369b62a3bb2e5526a28351813af162a31b4323", "testharness" ], "cookies/prefix/__secure.header.https.html": [ - "d912babc239acfecef7afb6f7deac9fbfeaf50bd", + "8753a320b4e5925bc2acb88861ee24c4cebe79af", "testharness" ], "cookies/prefix/document-cookie.non-secure.html": [ @@ -461148,7 +461336,7 @@ "testharness" ], "cookies/resources/cookie-helper.sub.js": [ - "d00a11f6f4396177a9885e30adac435fe8dab479", + "2974da9af069d0fa82779c7c250eb467283f558a", "support" ], "cookies/resources/drop.py": [ @@ -461196,7 +461384,7 @@ "support" ], "cookies/resources/set.py": [ - "abfb8c8d40d2466759bb423bc8e7fdfc5d72b1fb", + "5b6d0b9a2cc4d233d101441bb10f47418da9b63d", "support" ], "cookies/resources/setSameSite.py": [ @@ -526487,6 +526675,10 @@ "c8118ad974844cd807e0dfbcc07a9a06469a308c", "reftest" ], + "css/css-contain/contain-layout-018.html": [ + "5d7ebc0195cbbb7bc303784ab05296885c323f40", + "reftest" + ], "css/css-contain/contain-layout-breaks-001.html": [ "a85cf2c6c8e00f1d21fa5a63da81eff8148f3d71", "reftest" @@ -526635,6 +526827,10 @@ "79ef8a7cc0841ab96b1650cb2e78d210a9432180", "reftest" ], + "css/css-contain/contain-paint-025.html": [ + "0a41b62b2c169d2a5e571bde059a78ad2d5c2a16", + "reftest" + ], "css/css-contain/contain-paint-047.html": [ "e4a0b28457c752232f4314175ffdf1840f7e336a", "reftest" @@ -526815,10 +527011,18 @@ "f67f0e118e00b3426986b39226310c59b14a3755", "reftest" ], + "css/css-contain/contain-size-grid-002.html": [ + "1e7771e7c12b9c5c879e52071f9f566bd6e2b7d7", + "reftest" + ], "css/css-contain/contain-size-monolithic-001.html": [ "30f19b6cbbd6f6737d5175b1946c17805e0568d6", "reftest" ], + "css/css-contain/contain-size-multicol-001.html": [ + "5c0dba9b7bb56792542decc9abd8fcebd8ab967a", + "reftest" + ], "css/css-contain/contain-size-scrollbars-001.html": [ "304e81e5c98c0ded48c9c498e451dd6c0041566b", "reftest" @@ -527075,10 +527279,6 @@ "a5b4e9f47a8e60ad0bede1ac81e02b3542c80f3b", "support" ], - "css/css-contain/support/60x60-red.png": [ - "823f125b8e4a60f780f00443c9c9a10b9fa1f447", - "support" - ], "css/css-contain/support/blue-100x100.png": [ "3b72d5ce53c07b68fe508bb57aa61a933dbda768", "support" @@ -569087,6 +569287,18 @@ "d33fb6f6d119443f41217c2ac1b808cb3eb79b7f", "reftest" ], + "css/css-writing-modes/img-intrinsic-size-contribution-001.html": [ + "08500537f87cdccc1e0736bbaea483b61b690630", + "reftest" + ], + "css/css-writing-modes/img-intrinsic-size-contribution-002.html": [ + "df0ccf2093bf878200e719cc4f66c70d9832a8a0", + "reftest" + ], + "css/css-writing-modes/img-intrinsic-size-contribution-ref.html": [ + "ffda7d62ba963ed693e14547adce6592a11f5657", + "support" + ], "css/css-writing-modes/inline-block-alignment-002-ref.xht": [ "ce478e7499247e6277482b9c16c9dd2b1b76f275", "support" @@ -571511,6 +571723,10 @@ "d325b15a4cf3f12e54adf85c3691de11bebac057", "support" ], + "css/css-writing-modes/support/blue-200x100.png": [ + "e32c47dd1ee8f250025b930a78ce076889af942d", + "support" + ], "css/css-writing-modes/support/blue-horiz-line-220x1.png": [ "3898d5a2d9eb14ad80343ecbcd9d8216d2e2f755", "support" @@ -586724,7 +586940,7 @@ "support" ], "docs/_writing-tests/testdriver.md": [ - "a934e3278f1e2ea3b105b392cdac0e6a895e1b86", + "eb9b9fb0413862ab41c2064dec88fc10e3f7611a", "support" ], "docs/_writing-tests/testharness-api.md": [ @@ -603231,6 +603447,14 @@ "f7511c9e4c91dbd2cb11db502789d8792f038a29", "testharness" ], + "html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-auto-margins-ref.html": [ + "8b1258727fce344978609a1b033389edce7b20be", + "support" + ], + "html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-auto-margins.html": [ + "dd1964ba25133850b764c29037fb1113a7c6736f", + "reftest" + ], "html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-block-formatting-context.html": [ "4e9539179739a3690aab276f2ba98c25bd4dfe9b", "testharness" @@ -603643,6 +603867,14 @@ "3dd95e311aed7fc642e9370dad7cfee5a1eeac1c", "reftest" ], + "html/rendering/the-details-element/details-display-property-is-ignored-ref.html": [ + "6ebed6075de1e8cf62db7bee756b05d3e425e0ab", + "support" + ], + "html/rendering/the-details-element/details-display-property-is-ignored.html": [ + "445b4e483d00c8aabfa76a946d8cb0871e479c7d", + "reftest" + ], "html/rendering/the-details-element/single-summary.html": [ "1f09e7e75f9126982a07902ae0693f9ea2fd5823", "support" @@ -609264,11 +609496,11 @@ "testharness" ], "html/semantics/scripting-1/the-script-element/load-error-events-2.html": [ - "cefa053e754335e4a84424422a8bfaa9bc72ba75", + "0748b459092089e12743df4ccb458c6edf770515", "testharness" ], "html/semantics/scripting-1/the-script-element/load-error-events-3.html": [ - "c2cf0dbdd988507047184bff3489caeb167f6c88", + "83a752ce2cd860ffb4354a540e5b553d720eb4e9", "testharness" ], "html/semantics/scripting-1/the-script-element/log.py": [ @@ -610135,10 +610367,6 @@ "a6095097dd7e17b1e5370b739b31d361f8fdaf7b", "support" ], - "html/semantics/scripting-1/the-script-element/resources/slow.py": [ - "f3b1c7e2ea61b571bd56cc1c70c5f89bb8e7e4dc", - "support" - ], "html/semantics/scripting-1/the-script-element/script-charset-01.html": [ "c5ac0d0a62a048a55d091935cb6ea733e52a5b82", "testharness" @@ -610216,7 +610444,7 @@ "testharness" ], "html/semantics/scripting-1/the-script-element/script-text-modifications.html": [ - "7278182e171947bbb546e655de84815ff6cacd83", + "0066d3f4260d92b0f541624062269d13fdbd763d", "testharness" ], "html/semantics/scripting-1/the-script-element/script-text-xhtml.xhtml": [ @@ -612060,13 +612288,33 @@ "testharness" ], "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/016-1.html": [ - "12990a560703a5fec869674b4a12027cb07292cc", + "ceeeb64df63ccb6d56cd46a93c6ec6c476573a6b", "support" ], "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/016.html": [ "1c70fce591a38dd7917e1fffbd1d9ebab46e8b7f", "testharness" ], + "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort-refresh-immediate.window.js": [ + "8d045b9e0ab56874c5eb32367ed56274e0e94a22", + "testharness" + ], + "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort-refresh-multisecond-header.window.js": [ + "8c6c1267c4e899a78bd3ad0e67fd8491fd139606", + "testharness" + ], + "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort-refresh-multisecond-meta.window.js": [ + "2895f959e55dc3cf2fdfc933c751699b09438b50", + "testharness" + ], + "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort-while-navigating.window.js": [ + "e3efeffb8b3af56d365336dba357e0d76f7295aa", + "testharness" + ], + "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort.sub.window.js": [ + "b2f05cf056d54a0602a55a8dda7c67cb94883055", + "testharness" + ], "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/aborted-parser.window.js": [ "1d94de8a7c9f28dfab32111deb664d9921437e46", "testharness" @@ -612147,6 +612395,10 @@ "4efbb863c6372a3ee04d11f38d7ee56a44a2ac7d", "testharness" ], + "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/mutation-observer.window.js": [ + "34e73146a9d8e4ecab1e74a0079cd721e7306e59", + "testharness" + ], "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/no-new-global.window.js": [ "d4a9296fca66d3017c267a8d8951bef2dcbee238", "testharness" @@ -612168,7 +612420,7 @@ "testharness" ], "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/reload.window.js": [ - "d6ff9dc7a45425cb688ed4b6c9ea2ab5c1c3ae5c", + "279020f64da8421e118a447bae1373da2e98d9c1", "testharness" ], "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/aborted-parser-async-frame.html": [ @@ -612219,6 +612471,14 @@ "2404105b09a7724cf8cc5e2cf6d7bf7a8fb6f39b", "support" ], + "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/http-refresh.py": [ + "d2acd4361f92fe286ab13688a9174ce7c5465755", + "support" + ], + "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/meta-refresh.py": [ + "dd3cef44b44252beb3c7729271c51490a475a660", + "support" + ], "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/page-with-frame.html": [ "a1ab01e072b038cd0ec46a8497650845aca83062", "support" @@ -612227,6 +612487,10 @@ "a92a7ae39f8351f97cd865dca5ebe8d4260aa229", "support" ], + "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/slow-png.py": [ + "5fa2fd9a9d850a8a0708985034b89aecf4a51654", + "support" + ], "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/url-frame.html": [ "be483ff0aea456c3bc7f2e62d863e7f981453203", "support" @@ -613791,6 +614055,10 @@ "0bedbf89964f12b55feae4d5e4c9512f71a841cd", "support" ], + "interfaces/trusted-types.tentative.idl": [ + "a3a635b99270381643f16e13ff47facb85cbfb07", + "support" + ], "interfaces/uievents.idl": [ "ba618d7c373bf80c108f4c02996ad0db454f1236", "support" @@ -624652,7 +624920,7 @@ "testharness" ], "payment-request/payment-response/onpayerdetailchange-attribute.manual.https.html": [ - "9f92d284063fcec7c0ffefb09a076a285cd4b766", + "c8dd92636c6392b2436c8235340355c4529e12c1", "testharness" ], "payment-request/payment-response/payerEmail-attribute-manual.https.html": [ @@ -644260,7 +644528,7 @@ "support" ], "tools/ci/check_stability.py": [ - "684f7a518940c4ce63fc3360eddb53382f040370", + "2b32eb50c0f62448fed0417d1fe0f7882bf64f14", "support" ], "tools/ci/ci_built_diff.sh": [ @@ -644276,7 +644544,7 @@ "support" ], "tools/ci/ci_resources_unittest.sh": [ - "78868b93433e801f98782f605eb9f666c6efe9cd", + "a13c60fbd8c0749395a6827babcdf72e97c4fa63", "support" ], "tools/ci/ci_stability.sh": [ @@ -644284,7 +644552,7 @@ "support" ], "tools/ci/ci_taskcluster.sh": [ - "118243881a938b9d2cae0ebce2662c8ed416eaa4", + "546055293d750a66f713d3942582299a0063492f", "support" ], "tools/ci/ci_tools_unittest.sh": [ @@ -644300,7 +644568,7 @@ "support" ], "tools/ci/commands.json": [ - "0f8f5823699890e4352016885d2e7fbfc1a9af08", + "361c9e4f3de88b89019481af17875979dc532e5b", "support" ], "tools/ci/install.sh": [ @@ -644327,6 +644595,10 @@ "f049671c313b18200232f27d1abc75789a2e619d", "support" ], + "tools/ci/tcdownload.py": [ + "8813dccc888881ac8e96a05b22b113d887de0463", + "support" + ], "tools/ci/tests/test_jobs.py": [ "e888ad884a18f257008fe860f31f7892b3bd39a3", "support" @@ -644344,7 +644616,7 @@ "support" ], "tools/docker/start.sh": [ - "3325bb24f587df72f77c93f01ae447713cd64781", + "c2fd91d96d4dd1a42b72c48e5b477ec5c78174fd", "support" ], "tools/flake8.ini": [ @@ -649040,7 +649312,7 @@ "support" ], "tools/wpt/browser.py": [ - "9834e5d53f3ab7522f61b12d14aa273ad89ad438", + "65752a25f12864ff70300c2016937d9dd7d7827c", "support" ], "tools/wpt/commands.json": [ @@ -649048,7 +649320,7 @@ "support" ], "tools/wpt/install.py": [ - "d779651c990e2b7ba798f086e80f6dc8beac525d", + "62c833aa3f0c707e659f691be7a166d8f7ec43d8", "support" ], "tools/wpt/markdown.py": [ @@ -649064,7 +649336,7 @@ "support" ], "tools/wpt/run.py": [ - "aeeb22be9615e9d2d56b66a8957c997e53babedf", + "036c38f25869bc22f84dfdb67178ccdbcd0bcc7b", "support" ], "tools/wpt/testfiles.py": [ @@ -649080,7 +649352,7 @@ "support" ], "tools/wpt/tests/test_wpt.py": [ - "b39173e64f23ea4484f75cab219e72e8c2d279d7", + "8f8e5186c7cf508f3ceb5f88a353f85f22f3ad27", "support" ], "tools/wpt/tox.ini": [ @@ -649628,7 +649900,7 @@ "support" ], "tools/wptrunner/wptrunner/wptcommandline.py": [ - "4af5367a0387c91079aa90dc26a58808f1a936ea", + "e6c624994d91a9c8f70a564d756e01bbcfaef406", "support" ], "tools/wptrunner/wptrunner/wptlogging.py": [ @@ -649688,11 +649960,11 @@ "support" ], "tools/wptrunner/wptrunner/wptrunner.py": [ - "02420826d8a0bfcb785213150e7e54a291297c05", + "a6a29724ad71794b8e1492d1c1ba792dfdfcacd4", "support" ], "tools/wptrunner/wptrunner/wpttest.py": [ - "c29ba974a99786f687f2aead1ba14045c12fb643", + "4086a89e4cfd4a246c19722e9a86f7c8a2896af3", "support" ], "tools/wptserve/.coveragerc": [ @@ -650167,6 +650439,10 @@ "8070b4a4896d9adc60346fccb5fa96b997ef597a", "testharness" ], + "trusted-types/idlharness.window.js": [ + "de13697764ed487060de3dd425cd39cba73ff13b", + "testharness" + ], "trusted-types/support/helper.sub.js": [ "1ad5b4ef0c68a1ffde111db62c5e2aa4957732b6", "support" @@ -652460,7 +652736,7 @@ "support" ], "web-animations/animation-model/animation-types/property-types.js": [ - "5bafb20dfcfafb34464fe387457f06c434c7c188", + "232a508e07cb3db2eb9d9094a6e9fd8a1e63e4a0", "support" ], "web-animations/animation-model/animation-types/visibility.html": [ @@ -653831,6 +654107,10 @@ "36bf604b296c63b213d99408ab38937c62a755dc", "testharness" ], + "webaudio/the-audio-api/the-oscillatornode-interface/detune-limiting.html": [ + "81a1293d0355ed448e60c0e31ad4435ea708e224", + "testharness" + ], "webaudio/the-audio-api/the-pannernode-interface/.gitkeep": [ "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", "support" diff --git a/tests/wpt/metadata/css/css-transitions/transitions-animatable-properties-01.html.ini b/tests/wpt/metadata/css/css-transitions/transitions-animatable-properties-01.html.ini index 52047aeae1c..7ccf6daaa75 100644 --- a/tests/wpt/metadata/css/css-transitions/transitions-animatable-properties-01.html.ini +++ b/tests/wpt/metadata/css/css-transitions/transitions-animatable-properties-01.html.ini @@ -71,9 +71,3 @@ [bottom intermediate] expected: FAIL - [line-height end] - expected: FAIL - - [border-left-width end] - expected: FAIL - diff --git a/tests/wpt/metadata/fetch/cross-origin-resource-policy/fetch-in-iframe.html.ini b/tests/wpt/metadata/fetch/cross-origin-resource-policy/fetch-in-iframe.html.ini index 3951cd266d5..0d630fb814a 100644 --- a/tests/wpt/metadata/fetch/cross-origin-resource-policy/fetch-in-iframe.html.ini +++ b/tests/wpt/metadata/fetch/cross-origin-resource-policy/fetch-in-iframe.html.ini @@ -1,4 +1,5 @@ [fetch-in-iframe.html] + expected: CRASH [Untitled] expected: FAIL diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_4.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_4.html.ini new file mode 100644 index 00000000000..385376c7321 --- /dev/null +++ b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_4.html.ini @@ -0,0 +1,4 @@ +[traverse_the_history_4.html] + [Multiple history traversals, last would be aborted] + expected: FAIL + diff --git a/tests/wpt/metadata/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-auto-margins.html.ini b/tests/wpt/metadata/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-auto-margins.html.ini new file mode 100644 index 00000000000..8e91cf8be9a --- /dev/null +++ b/tests/wpt/metadata/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-auto-margins.html.ini @@ -0,0 +1,2 @@ +[legend-auto-margins.html] + expected: FAIL diff --git a/tests/wpt/metadata/html/rendering/the-details-element/details-display-property-is-ignored.html.ini b/tests/wpt/metadata/html/rendering/the-details-element/details-display-property-is-ignored.html.ini new file mode 100644 index 00000000000..0eec246967d --- /dev/null +++ b/tests/wpt/metadata/html/rendering/the-details-element/details-display-property-is-ignored.html.ini @@ -0,0 +1,2 @@ +[details-display-property-is-ignored.html] + expected: FAIL diff --git a/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/016.html.ini b/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/016.html.ini deleted file mode 100644 index 595f1f9d61b..00000000000 --- a/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/016.html.ini +++ /dev/null @@ -1,7 +0,0 @@ -[016.html] - [Timeout on original window, scope] - expected: FAIL - - [Timeout on new window, scope] - expected: FAIL - diff --git a/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort-refresh-immediate.window.js.ini b/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort-refresh-immediate.window.js.ini new file mode 100644 index 00000000000..3643306a1bf --- /dev/null +++ b/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort-refresh-immediate.window.js.ini @@ -0,0 +1,14 @@ +[abort-refresh-immediate.window.html] + expected: TIMEOUT + [document.open() aborts documents that are queued for navigation through refresh with timeout 0 (XMLHttpRequest)] + expected: TIMEOUT + + [document.open() aborts documents that are queued for navigation through Refresh header with timeout 0 (fetch())] + expected: TIMEOUT + + [document.open() aborts documents that are queued for navigation through refresh with timeout 0 (fetch())] + expected: TIMEOUT + + [document.open() aborts documents that are queued for navigation through Refresh header with timeout 0 (XMLHttpRequest)] + expected: TIMEOUT + diff --git a/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort-refresh-multisecond-header.window.js.ini b/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort-refresh-multisecond-header.window.js.ini new file mode 100644 index 00000000000..fc05e60f852 --- /dev/null +++ b/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort-refresh-multisecond-header.window.js.ini @@ -0,0 +1,11 @@ +[abort-refresh-multisecond-header.window.html] + expected: TIMEOUT + [document.open() does NOT abort documents that are queued for navigation through Refresh header with 1-sec timeout (fetch())] + expected: TIMEOUT + + [document.open() does NOT abort documents that are queued for navigation through Refresh header with 4-sec timeout (image loading)] + expected: TIMEOUT + + [document.open() does NOT abort documents that are queued for navigation through Refresh header with 1-sec timeout (XMLHttpRequest)] + expected: TIMEOUT + diff --git a/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort-refresh-multisecond-meta.window.js.ini b/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort-refresh-multisecond-meta.window.js.ini new file mode 100644 index 00000000000..e3af2aa2a12 --- /dev/null +++ b/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort-refresh-multisecond-meta.window.js.ini @@ -0,0 +1,11 @@ +[abort-refresh-multisecond-meta.window.html] + expected: TIMEOUT + [document.open() does NOT abort documents that are queued for navigation through refresh with 4-sec timeout (image loading)] + expected: TIMEOUT + + [document.open() does NOT abort documents that are queued for navigation through refresh with 1-sec timeout (XMLHttpRequest)] + expected: TIMEOUT + + [document.open() does NOT abort documents that are queued for navigation through refresh with 1-sec timeout (fetch())] + expected: TIMEOUT + diff --git a/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort-while-navigating.window.js.ini b/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort-while-navigating.window.js.ini new file mode 100644 index 00000000000..eff2445da68 --- /dev/null +++ b/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort-while-navigating.window.js.ini @@ -0,0 +1,17 @@ +[abort-while-navigating.window.html] + expected: TIMEOUT + [document.open() aborts documents that are navigating through iframe loading (XMLHttpRequest)] + expected: FAIL + + [document.open() aborts documents that are navigating through Location (fetch())] + expected: TIMEOUT + + [document.open() aborts documents that are queued for navigation through .click() (fetch())] + expected: TIMEOUT + + [document.open() aborts documents that are queued for navigation through .click() (XMLHttpRequest)] + expected: TIMEOUT + + [document.open() aborts documents that are navigating through Location (XMLHttpRequest)] + expected: TIMEOUT + diff --git a/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort.sub.window.js.ini b/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort.sub.window.js.ini new file mode 100644 index 00000000000..b92467a93ba --- /dev/null +++ b/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort.sub.window.js.ini @@ -0,0 +1,14 @@ +[abort.sub.window.html] + expected: TIMEOUT + [document.open() does not abort documents that are not navigating (image loading)] + expected: TIMEOUT + + [document.open() does not abort documents that are not navigating (XMLHttpRequest)] + expected: TIMEOUT + + [document.open() does not abort documents that are not navigating (establish a WebSocket connection)] + expected: TIMEOUT + + [document.open() does not abort documents that are not navigating (fetch())] + expected: TIMEOUT + diff --git a/tests/wpt/metadata/url/urlencoded-parser.any.js.ini b/tests/wpt/metadata/url/urlencoded-parser.any.js.ini index 1e7bf692a97..e6444e2e79d 100644 --- a/tests/wpt/metadata/url/urlencoded-parser.any.js.ini +++ b/tests/wpt/metadata/url/urlencoded-parser.any.js.ini @@ -2,21 +2,15 @@ [request.formData() with input: a&b&c] expected: FAIL - [response.formData() with input: &&&a=b&&&&c=d&] - expected: FAIL - - [response.formData() with input: a&b&c] - expected: FAIL - - [request.formData() with input: &&&a=b&&&&c=d&] - expected: FAIL - [response.formData() with input: _charset_=windows-1252&test=%C2x] expected: FAIL [request.formData() with input: a=b&c=d&] expected: FAIL + [request.formData() with input: a=b&c=d] + expected: FAIL + [urlencoded-parser.any.worker.html] [response.formData() with input: a&b&c] @@ -28,15 +22,15 @@ [request.formData() with input: &&&a=b&&&&c=d&] expected: FAIL - [response.formData() with input: a=b&c=d] - expected: FAIL - [response.formData() with input: a=b&c=d&] expected: FAIL [request.formData() with input: a=b&c=d] expected: FAIL - [response.formData() with input: &&&a=b&&&&c=d&] + [request.formData() with input: _charset_=windows-1252&test=%C2x] + expected: FAIL + + [response.formData() with input: _charset_=windows-1252&test=%C2x] expected: FAIL diff --git a/tests/wpt/metadata/webaudio/the-audio-api/the-oscillatornode-interface/detune-limiting.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-oscillatornode-interface/detune-limiting.html.ini new file mode 100644 index 00000000000..f4a1da814f3 --- /dev/null +++ b/tests/wpt/metadata/webaudio/the-audio-api/the-oscillatornode-interface/detune-limiting.html.ini @@ -0,0 +1,19 @@ +[detune-limiting.html] + [X Osc(freq: 1, detune: 18514.189453125) output does not equal [0,5.565462970480439e-7,0.0000011130925940960879,0.0000016696390048309695,0.0000022261851881921757,0.0000027827315989270573,0.000003339278009661939,0.000003895824193023145,0.000004452370376384351,0.0000050089170144929085,0.000005565463197854115,0.000006122009381215321,0.000006678556019323878,0.000007235102202685084,0.00000779164838604629,0.000008348194569407497...\] with an element-wise tolerance of {"absoluteThreshold":0,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[1\]\t1.4247585204429924e-4\t5.5654629704804393e-7\t1.4191930574725120e-4\t2.5500000000000000e+2\t0.0000000000000000e+0\n\t[2\]\t2.8495170408859849e-4\t1.1130925940960879e-6\t2.8383861149450240e-4\t2.5500000000000000e+2\t0.0000000000000000e+0\n\t[3\]\t4.2742758523672819e-4\t1.6696390048309695e-6\t4.2575794623189722e-4\t2.5500000000000000e+2\t0.0000000000000000e+0\n\t[4\]\t5.6990334996953607e-4\t2.2261851881921757e-6\t5.6767716478134389e-4\t2.5499997385318113e+2\t0.0000000000000000e+0\n\t[5\]\t7.1237923111766577e-4\t2.7827315989270573e-6\t7.0959649951873871e-4\t2.5499997908254574e+2\t0.0000000000000000e+0\n\t...and 5505 more errors.\n\tMax AbsError of 7.0378831448033452e-1 at index of 5510.\n\t[5510\]\t7.0685487985610962e-1\t3.0665653757750988e-3\t7.0378831448033452e-1\t2.2950376993102469e+2\t0.0000000000000000e+0\n\tMax RelError of 2.5500000000000000e+2 at index of 1.\n] + expected: FAIL + + [# AUDIT TASK RUNNER FINISHED: 2 out of 2 tasks were failed.] + expected: FAIL + + [X osc[5:\]: Expected 0 for all values but found 5506 unexpected values: \n\tIndex\tActual\n\t[0\]\t0.0007123792311176658\n\t[1\]\t0.0008548550540581346\n\t[2\]\t0.0009973308769986033\n\t[3\]\t0.0011398065835237503\n\t...and 5502 more errors.] + expected: FAIL + + [< [detune automation\] 1 out of 3 assertions were failed.] + expected: FAIL + + [< [detune limits\] 2 out of 4 assertions were failed.] + expected: FAIL + + [X Osc(freq: 44100.00390625) output: Expected 0 for all values but found 5510 unexpected values: \n\tIndex\tActual\n\t[1\]\t5.565462970480439e-7\n\t[2\]\t0.0000011130925940960879\n\t[3\]\t0.0000016696390048309695\n\t[4\]\t0.0000022261851881921757\n\t...and 5506 more errors.] + expected: FAIL + diff --git a/tests/wpt/web-platform-tests/.taskcluster.yml b/tests/wpt/web-platform-tests/.taskcluster.yml index 70bde33c354..b6d21a17ab5 100644 --- a/tests/wpt/web-platform-tests/.taskcluster.yml +++ b/tests/wpt/web-platform-tests/.taskcluster.yml @@ -4,71 +4,76 @@ policy: tasks: $if: tasks_for == "github-push" then: - $if: event.ref == "refs/heads/master" - then: - $flattenDeep: - $map: [{name: firefox, channel: nightly}, {name: chrome, channel: dev}] - each(browser): - $map: - - [testharness, 1, 15] - - [testharness, 2, 15] - - [testharness, 3, 15] - - [testharness, 4, 15] - - [testharness, 5, 15] - - [testharness, 6, 15] - - [testharness, 7, 15] - - [testharness, 8, 15] - - [testharness, 9, 15] - - [testharness, 10, 15] - - [testharness, 11, 15] - - [testharness, 12, 15] - - [testharness, 13, 15] - - [testharness, 14, 15] - - [testharness, 15, 15] - - [reftest, 1, 10] - - [reftest, 2, 10] - - [reftest, 3, 10] - - [reftest, 4, 10] - - [reftest, 5, 10] - - [reftest, 6, 10] - - [reftest, 7, 10] - - [reftest, 8, 10] - - [reftest, 9, 10] - - [reftest, 10, 10] - - [wdspec, 1, 1] - each(chunk): - taskId: {$eval: 'as_slugid(browser.name + browser.channel + chunk[0] + str(chunk[1]))'} - taskGroupId: {$eval: 'as_slugid("task group")'} - created: {$fromNow: ''} - deadline: {$fromNow: '24 hours'} - provisionerId: aws-provisioner-v1 - # Contributors interested in configurating TaskCluster to run - # against their fork of WPT should change the `workerType` to - # "github-worker". - workerType: wpt-docker-worker - metadata: - name: wpt-${browser.name}-${browser.channel}-${chunk[0]}-${chunk[1]} - description: >- - A subset of WPT's "${chunk[0]}" tests (chunk number ${chunk[1]} - of ${chunk[2]}), run in the ${browser.channel} release of - ${browser.name}. - owner: ${event.pusher.email} - source: ${event.repository.url} - payload: - image: gsnedders/web-platform-tests:0.13 - maxRunTime: 7200 - artifacts: - public/results: - path: /home/test/artifacts - type: directory - command: - - /bin/bash - - --login - - -c - - "~/start.sh ${event.repository.url} ${event.ref[len('refs/heads/'):]} ${event.after} ${browser.name}-${browser.channel} && - cd ~/web-platform-tests && - ./tools/ci/ci_taskcluster.sh ${browser.name} ${chunk[0]} ${chunk[1]} ${chunk[2]}" - else: [] + $flattenDeep: + $map: + $flatten: + $match: { + event.ref == "refs/heads/master": [{name: firefox, channel: nightly}, {name: chrome, channel: dev}], + event.ref == "refs/heads/epochs/daily": [{name: firefox, channel: beta}, {name: chrome, channel: beta}], + event.ref == "refs/heads/epochs/weekly": [{name: firefox, channel: stable}, {name: chrome, channel: stable}] + } + each(browser): + $map: + - [testharness, 1, 15] + - [testharness, 2, 15] + - [testharness, 3, 15] + - [testharness, 4, 15] + - [testharness, 5, 15] + - [testharness, 6, 15] + - [testharness, 7, 15] + - [testharness, 8, 15] + - [testharness, 9, 15] + - [testharness, 10, 15] + - [testharness, 11, 15] + - [testharness, 12, 15] + - [testharness, 13, 15] + - [testharness, 14, 15] + - [testharness, 15, 15] + - [reftest, 1, 10] + - [reftest, 2, 10] + - [reftest, 3, 10] + - [reftest, 4, 10] + - [reftest, 5, 10] + - [reftest, 6, 10] + - [reftest, 7, 10] + - [reftest, 8, 10] + - [reftest, 9, 10] + - [reftest, 10, 10] + - [wdspec, 1, 1] + each(chunk): + taskId: {$eval: 'as_slugid(browser.name + browser.channel + chunk[0] + str(chunk[1]))'} + taskGroupId: {$eval: 'as_slugid("task group")'} + created: {$fromNow: ''} + deadline: {$fromNow: '24 hours'} + provisionerId: aws-provisioner-v1 + workerType: + $if: event.repository.full_name == 'web-platform-tests/wpt' + then: + wpt-docker-worker + else: + github-worker + metadata: + name: wpt-${browser.name}-${browser.channel}-${chunk[0]}-${chunk[1]} + description: >- + A subset of WPT's "${chunk[0]}" tests (chunk number ${chunk[1]} + of ${chunk[2]}), run in the ${browser.channel} release of + ${browser.name}. + owner: ${event.pusher.email} + source: ${event.repository.url} + payload: + image: harjgam/web-platform-tests:0.14 + maxRunTime: 7200 + artifacts: + public/results: + path: /home/test/artifacts + type: directory + command: + - /bin/bash + - --login + - -c + - "~/start.sh ${event.repository.url} ${event.ref[len('refs/heads/'):]} ${event.after} ${browser.name} ${browser.channel} && + cd ~/web-platform-tests && + ./tools/ci/ci_taskcluster.sh ${browser.name} ${browser.channel} ${chunk[0]} ${chunk[1]} ${chunk[2]}" # > NOTE: A well-designed template should produce `tasks: []` for any # > unrecognized `task_for` values; this allows later expansion of this # > service to handle more events. diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/resources/slow.py b/tests/wpt/web-platform-tests/common/slow.py similarity index 100% rename from tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/resources/slow.py rename to tests/wpt/web-platform-tests/common/slow.py diff --git a/tests/wpt/web-platform-tests/cookies/prefix/__host.header.html b/tests/wpt/web-platform-tests/cookies/prefix/__host.header.html index 5a522cbaa01..de46485e44c 100644 --- a/tests/wpt/web-platform-tests/cookies/prefix/__host.header.html +++ b/tests/wpt/web-platform-tests/cookies/prefix/__host.header.html @@ -8,6 +8,7 @@ set_prefixed_cookie_via_http_test({ prefix: "__Host-", params: "Path=/;" + extraParams, + origin: self.origin, shouldExistInDOM: false, shouldExistViaHTTP: false, title: "__Host: Non-secure origin: Does not set 'Path=/;" + extraParams + "'" @@ -17,6 +18,7 @@ set_prefixed_cookie_via_http_test({ prefix: "__Host-", params: "Secure; Path=/;" + extraParams, + origin: self.origin, shouldExistInDOM: false, shouldExistViaHTTP: false, title: "__Host: Non-secure origin: Does not set 'Secure; Path=/;" + extraParams + "'" @@ -26,6 +28,7 @@ set_prefixed_cookie_via_http_test({ prefix: "__Host-", params: "Secure; Path=/; Domain=" + document.location.hostname + "; " + extraParams, + origin: self.origin, shouldExistInDOM: false, shouldExistViaHTTP: false, title: "__Host: Secure origin: Does not set 'Secure; Path=/; Domain=" + document.location.hostname + "; " + extraParams + "'" @@ -35,6 +38,7 @@ set_prefixed_cookie_via_http_test({ prefix: "__Host-", params: "Secure; Path=/cookies/resources/list.py", + origin: self.origin, shouldExistInDOM: false, shouldExistViaHTTP: false, title: "__Host: Non-secure origin: Does not set 'Secure; Path=/cookies/resources/list.py'" diff --git a/tests/wpt/web-platform-tests/cookies/prefix/__host.header.https.html b/tests/wpt/web-platform-tests/cookies/prefix/__host.header.https.html index 53d0dba6598..a71f75ef41b 100644 --- a/tests/wpt/web-platform-tests/cookies/prefix/__host.header.https.html +++ b/tests/wpt/web-platform-tests/cookies/prefix/__host.header.https.html @@ -8,6 +8,7 @@ set_prefixed_cookie_via_http_test({ prefix: "__Host-", params: "Path=/;" + extraParams, + origin: self.origin, shouldExistInDOM: false, shouldExistViaHTTP: false, title: "__Host: Secure origin: Does not set 'Path=/;" + extraParams + "'" @@ -17,6 +18,7 @@ set_prefixed_cookie_via_http_test({ prefix: "__Host-", params: "Secure; Path=/;" + extraParams, + origin: self.origin, shouldExistInDOM: true, shouldExistViaHTTP: true, title: "__Host: Secure origin: Does set 'Secure; Path=/;" + extraParams + "'" @@ -26,6 +28,7 @@ set_prefixed_cookie_via_http_test({ prefix: "__Host-", params: "Secure; Path=/; Domain=" + document.location.hostname + "; " + extraParams, + origin: self.origin, shouldExistInDOM: false, shouldExistViaHTTP: false, title: "__Host: Secure origin: Does not set 'Secure; Path=/; Domain=" + document.location.hostname + "; " + extraParams + "'" @@ -35,6 +38,7 @@ set_prefixed_cookie_via_http_test({ prefix: "__Host-", params: "Secure; Path=/cookies/resources/list.py", + origin: self.origin, shouldExistInDOM: false, shouldExistViaHTTP: false, title: "__Host: Secure origin: Does not set 'Secure; Path=/cookies/resources/list.py'" diff --git a/tests/wpt/web-platform-tests/cookies/prefix/__secure.header.html b/tests/wpt/web-platform-tests/cookies/prefix/__secure.header.html index 431e0e1ec98..fb369b62a3b 100644 --- a/tests/wpt/web-platform-tests/cookies/prefix/__secure.header.html +++ b/tests/wpt/web-platform-tests/cookies/prefix/__secure.header.html @@ -8,6 +8,7 @@ set_prefixed_cookie_via_http_test({ prefix: "__Secure-", params: "Path=/;" + extraParams, + origin: self.origin, shouldExistViaHTTP: false, title: "__Secure: Non-secure origin: Should not set 'Path=/;" + extraParams + "'" }); @@ -16,8 +17,9 @@ set_prefixed_cookie_via_http_test({ prefix: "__Secure-", params: "Secure; Path=/;" + extraParams, - shouldExistViaHTTP: true, - title: "__Secure: Non-secure origin: Should set 'Secure; Path=/;" + extraParams + "'" + origin: self.origin, + shouldExistViaHTTP: false, + title: "__Secure: Non-secure origin: Should not set 'Secure; Path=/;" + extraParams + "'" }); }); diff --git a/tests/wpt/web-platform-tests/cookies/prefix/__secure.header.https.html b/tests/wpt/web-platform-tests/cookies/prefix/__secure.header.https.html index d912babc239..8753a320b4e 100644 --- a/tests/wpt/web-platform-tests/cookies/prefix/__secure.header.https.html +++ b/tests/wpt/web-platform-tests/cookies/prefix/__secure.header.https.html @@ -3,11 +3,12 @@ diff --git a/tests/wpt/web-platform-tests/cookies/resources/cookie-helper.sub.js b/tests/wpt/web-platform-tests/cookies/resources/cookie-helper.sub.js index d00a11f6f43..2974da9af06 100644 --- a/tests/wpt/web-platform-tests/cookies/resources/cookie-helper.sub.js +++ b/tests/wpt/web-platform-tests/cookies/resources/cookie-helper.sub.js @@ -28,7 +28,13 @@ // A tiny helper which returns the result of fetching |url| with credentials. function credFetch(url) { - return fetch(url, {"credentials": "include"}); + return fetch(url, {"credentials": "include"}) + .then(response => { + if (response.status !== 200) { + throw new Error(response.statusText); + } + return response; + }); } // Returns a URL on |origin| which redirects to a given absolute URL. @@ -87,23 +93,20 @@ function set_prefixed_cookie_via_dom_test(options) { function set_prefixed_cookie_via_http_test(options) { promise_test(t => { - var postDelete = _ => { - var value = "" + Math.random(); - return credFetch(options.origin + "/cookies/resources/set.py?" + name + "=" + value + ";" + options.params) - .then(_ => credFetch(options.origin + "/cookies/resources/list.py")) - .then(r => r.json()) - .then(cookies => assert_equals(cookies[name], options.shouldExistViaHTTP ? value : undefined)); - }; - var name = options.prefix + "prefixtestcookie"; - if (!options.origin) { - options.origin = self.origin; - erase_cookie_from_js(name, options.params); - return postDelete; - } else { - return credFetch(options.origin + "/cookies/resources/drop.py?name=" + name) - .then(_ => postDelete()); - } + var value = "" + Math.random(); + + t.add_cleanup(() => { + var cookie = name + "=0;expires=" + new Date(0).toUTCString() + ";" + + options.params; + + return credFetch(options.origin + "/cookies/resources/set.py?" + cookie); + }); + + return credFetch(options.origin + "/cookies/resources/set.py?" + name + "=" + value + ";" + options.params) + .then(_ => credFetch(options.origin + "/cookies/resources/list.py")) + .then(r => r.json()) + .then(cookies => assert_equals(cookies[name], options.shouldExistViaHTTP ? value : undefined)); }, options.title); } diff --git a/tests/wpt/web-platform-tests/cookies/resources/set.py b/tests/wpt/web-platform-tests/cookies/resources/set.py index abfb8c8d40d..5b6d0b9a2cc 100644 --- a/tests/wpt/web-platform-tests/cookies/resources/set.py +++ b/tests/wpt/web-platform-tests/cookies/resources/set.py @@ -1,7 +1,13 @@ import helpers +import urllib def main(request, response): """Respond to `/cookie/set?{cookie}` by echoing `{cookie}` as a `Set-Cookie` header.""" headers = helpers.setNoCacheAndCORSHeaders(request, response) - headers.append(("Set-Cookie", request.url_parts.query)) + + # Cookies may require whitespace (e.g. in the `Expires` attribute), so the + # query string should be decoded. + cookie = urllib.unquote(request.url_parts.query) + headers.append(("Set-Cookie", cookie)) + return headers, '{"success": true}' diff --git a/tests/wpt/web-platform-tests/css/css-contain/contain-layout-018.html b/tests/wpt/web-platform-tests/css/css-contain/contain-layout-018.html new file mode 100644 index 00000000000..5d7ebc0195c --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-contain/contain-layout-018.html @@ -0,0 +1,21 @@ + + +CSS Containment Test: Layout containment stacking context + + + + + + +

There should be nothing below.

+
FAIL
diff --git a/tests/wpt/web-platform-tests/css/css-contain/contain-paint-025.html b/tests/wpt/web-platform-tests/css/css-contain/contain-paint-025.html new file mode 100644 index 00000000000..0a41b62b2c1 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-contain/contain-paint-025.html @@ -0,0 +1,21 @@ + + +CSS Containment Test: Paint containment stacking context + + + + + + +

There should be nothing below.

+
FAIL
diff --git a/tests/wpt/web-platform-tests/css/css-contain/contain-size-grid-002.html b/tests/wpt/web-platform-tests/css/css-contain/contain-size-grid-002.html new file mode 100644 index 00000000000..1e7771e7c12 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-contain/contain-size-grid-002.html @@ -0,0 +1,41 @@ + + +CSS Containment Test: Size containment on grid container with explicit non-intrinsically sized tracks (and gaps) + + + + + + + +

Test passes if there is a filled green square and no red.

+
+
 
+ + + + diff --git a/tests/wpt/web-platform-tests/css/css-contain/contain-size-multicol-001.html b/tests/wpt/web-platform-tests/css/css-contain/contain-size-multicol-001.html new file mode 100644 index 00000000000..5c0dba9b7bb --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-contain/contain-size-multicol-001.html @@ -0,0 +1,45 @@ + + +CSS Containment Test: Size containment on a multicol with set column size (and gap) + + + + + + + +

Test passes if there is a filled green square and no red.

+
+
+filler filler filler filler filler filler filler filler +filler filler filler filler filler filler filler filler +filler filler filler filler filler filler filler filler +filler filler filler filler filler filler filler filler +
+ + + + diff --git a/tests/wpt/web-platform-tests/css/css-contain/support/60x60-red.png b/tests/wpt/web-platform-tests/css/css-contain/support/60x60-red.png deleted file mode 100644 index 823f125b8e4..00000000000 Binary files a/tests/wpt/web-platform-tests/css/css-contain/support/60x60-red.png and /dev/null differ diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes/img-intrinsic-size-contribution-001.html b/tests/wpt/web-platform-tests/css/css-writing-modes/img-intrinsic-size-contribution-001.html new file mode 100644 index 00000000000..08500537f87 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-writing-modes/img-intrinsic-size-contribution-001.html @@ -0,0 +1,19 @@ + + +CSS Test: intrinsic size contributions of images in vertical writing mode + + + + + + + +
+
+ +
+
+ + diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes/img-intrinsic-size-contribution-002.html b/tests/wpt/web-platform-tests/css/css-writing-modes/img-intrinsic-size-contribution-002.html new file mode 100644 index 00000000000..df0ccf2093b --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-writing-modes/img-intrinsic-size-contribution-002.html @@ -0,0 +1,19 @@ + + +CSS Test: intrinsic size contributions of images in vertical writing mode (with the image itself in horizontal writing mode) + + + + + + + +
+
+ +
+
+ + diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes/img-intrinsic-size-contribution-ref.html b/tests/wpt/web-platform-tests/css/css-writing-modes/img-intrinsic-size-contribution-ref.html new file mode 100644 index 00000000000..ffda7d62ba9 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-writing-modes/img-intrinsic-size-contribution-ref.html @@ -0,0 +1,16 @@ + + +CSS Test Reference: intrinsic size contributions of images in vertical writing mode + + + + +
+
+ +
+
+ + diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes/support/blue-200x100.png b/tests/wpt/web-platform-tests/css/css-writing-modes/support/blue-200x100.png new file mode 100644 index 00000000000..e32c47dd1ee Binary files /dev/null and b/tests/wpt/web-platform-tests/css/css-writing-modes/support/blue-200x100.png differ diff --git a/tests/wpt/web-platform-tests/docs/_writing-tests/testdriver.md b/tests/wpt/web-platform-tests/docs/_writing-tests/testdriver.md index a934e3278f1..eb9b9fb0413 100644 --- a/tests/wpt/web-platform-tests/docs/_writing-tests/testdriver.md +++ b/tests/wpt/web-platform-tests/docs/_writing-tests/testdriver.md @@ -18,9 +18,11 @@ the global scope. NB: presently, testdriver.js only works in the top-level test browsing context (and not therefore in any frame or window opened from it). -### `test_driver.bless(intent, action)` -#### `intent: a string describing the motivation for this invocation` -#### `action: an optional function` +### bless + +Usage: `test_driver.bless(intent, action)` + * `intent`: a string describing the motivation for this invocation + * `action`: an optional function This function simulates [activation][activation], allowing tests to perform privileged operations that require user interaction. For @@ -44,8 +46,10 @@ test_driver.bless('initiate media playback', function () { }); ``` -### `test_driver.click(element)` -#### `element: a DOM Element object` +### click + +Usage: `test_driver.click(element)` + * `element`: a DOM Element object This function causes a click to occur on the target element (an `Element` object), potentially scrolling the document to make it @@ -57,9 +61,11 @@ Note that if the element to be clicked does not have a unique ID, the document must not have any DOM mutations made between the function being called and the promise settling. -### `test_driver.send_keys(element, keys)` -#### `element: a DOM Element object` -#### `keys: string to send to the element` +### send_keys + +Usage: `test_driver.send_keys(element, keys)` + * `element`: a DOM Element object + * `keys`: string to send to the element This function causes the string `keys` to be send to the target element (an `Element` object), potentially scrolling the document to diff --git a/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-auto-margins-ref.html b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-auto-margins-ref.html new file mode 100644 index 00000000000..8b1258727fc --- /dev/null +++ b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-auto-margins-ref.html @@ -0,0 +1,37 @@ + + + +legend inline auto margins + + + + +
+
+
+
+
+ + diff --git a/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-auto-margins.html b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-auto-margins.html new file mode 100644 index 00000000000..dd1964ba251 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-auto-margins.html @@ -0,0 +1,32 @@ + + + +legend inline auto margins + + + + + +
+
+
+
+
+ + diff --git a/tests/wpt/web-platform-tests/html/rendering/the-details-element/details-display-property-is-ignored-ref.html b/tests/wpt/web-platform-tests/html/rendering/the-details-element/details-display-property-is-ignored-ref.html new file mode 100644 index 00000000000..6ebed6075de --- /dev/null +++ b/tests/wpt/web-platform-tests/html/rendering/the-details-element/details-display-property-is-ignored-ref.html @@ -0,0 +1,21 @@ + + + +From html.spec.whatwg.org: + +
+The details element is expected to render as a block box. The element's shadow +tree is expected to take the element's first summary element child, if any, and +place it in a first block box container, and then take the element's remaining +descendants, if any, and place them in a second block box container. +
+ +<details display:flex> should be ignored. Otherwise details would render as +something other than a block box. +
+ +
+ This is the summary. +
thing 1
+ thing 2 +
diff --git a/tests/wpt/web-platform-tests/html/rendering/the-details-element/details-display-property-is-ignored.html b/tests/wpt/web-platform-tests/html/rendering/the-details-element/details-display-property-is-ignored.html new file mode 100644 index 00000000000..445b4e483d0 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/rendering/the-details-element/details-display-property-is-ignored.html @@ -0,0 +1,26 @@ + + + + + + + + +From html.spec.whatwg.org: + +
+The details element is expected to render as a block box. The element's shadow +tree is expected to take the element's first summary element child, if any, and +place it in a first block box container, and then take the element's remaining +descendants, if any, and place them in a second block box container. +
+ +<details display:flex> should be ignored. Otherwise details would render as +something other than a block box. +
+ +
+ This is the summary. +
thing 1
+ thing 2 +
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/load-error-events-2.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/load-error-events-2.html index cefa053e754..0748b459092 100644 --- a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/load-error-events-2.html +++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/load-error-events-2.html @@ -11,7 +11,7 @@ var test5_load = event_test('no src, parser-inserted, has style sheets blocking scripts, script nesting level == 1', false, false); - + diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/load-error-events-3.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/load-error-events-3.html index c2cf0dbdd98..83a752ce2cd 100644 --- a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/load-error-events-3.html +++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/load-error-events-3.html @@ -13,7 +13,7 @@ var test6_load = event_test('no src, parser-inserted, has style sheets blocking false, false); document.write( - ` + ` - + diff --git a/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/016-1.html b/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/016-1.html index 12990a56070..ceeeb64df63 100644 --- a/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/016-1.html +++ b/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/016-1.html @@ -11,7 +11,7 @@ onload = function() { setTimeout(function() { parent.tests[0].step(function() { - parent.assert_equals(test_prop, 1, "Global scope from original window timeout"); + parent.assert_equals(test_prop, 2, "Global scope from original window timeout"); parent.assert_equals(window.test_prop, 2, "Window property from original window timeout") }); parent.tests[1].step(function() { @@ -23,7 +23,7 @@ onload = function() { window.setTimeout(function() { parent.tests[2].step(function() { - parent.assert_equals(test_prop, 1, "Global scope from original window timeout"); + parent.assert_equals(test_prop, 2, "Global scope from original window timeout"); parent.assert_equals(window.test_prop, 2, "Window property from original window timeout") }); parent.tests[3].step(function() { diff --git a/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort-refresh-immediate.window.js b/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort-refresh-immediate.window.js new file mode 100644 index 00000000000..8d045b9e0ab --- /dev/null +++ b/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort-refresh-immediate.window.js @@ -0,0 +1,119 @@ +// The following tests deal with the pragma and the +// `Refresh` header. The spec is still hazy on the precise behavior in those +// cases but we use https://github.com/whatwg/html/issues/4003 as a guideline. + +async_test(t => { + const frame = document.body.appendChild(document.createElement("iframe")); + t.add_cleanup(() => frame.remove()); + frame.onload = t.step_func(() => { + frame.onload = null; + + const client = new frame.contentWindow.XMLHttpRequest(); + client.open("GET", "/common/blank.html"); + client.onabort = t.step_func_done(); + client.send(); + + frame.contentDocument.open(); + }); + frame.src = "resources/meta-refresh.py?0"; +}, "document.open() aborts documents that are queued for navigation through refresh with timeout 0 (XMLHttpRequest)"); + +async_test(t => { + const frame = document.body.appendChild(document.createElement("iframe")); + t.add_cleanup(() => frame.remove()); + frame.onload = t.step_func(() => { + frame.onload = null; + + frame.contentWindow.fetch("/common/blank.html").then( + t.unreached_func("Fetch should have been aborted"), + t.step_func_done()); + + frame.contentDocument.open(); + }); + frame.src = "resources/meta-refresh.py?0"; +}, "document.open() aborts documents that are queued for navigation through refresh with timeout 0 (fetch())"); + +// We cannot test for img element's error event for this test, as Firefox does +// not fire the event if the fetch is aborted while Chrome does. +async_test(t => { + const frame = document.body.appendChild(document.createElement("iframe")); + t.add_cleanup(() => frame.remove()); + frame.onload = t.step_func(() => { + frame.onload = null; + + let happened = false; + const img = frame.contentDocument.createElement("img"); + img.src = new URL("resources/slow-png.py", document.URL); + img.onload = t.unreached_func("Image loading should not have succeeded"); + // The image fetch starts in a microtask, so let's be sure to test after + // the fetch has started. + t.step_timeout(() => { + frame.contentDocument.open(); + happened = true; + }); + // If 3 seconds have passed and the image has still not loaded, we consider + // it aborted. slow-png.py only sleeps for 2 wallclock seconds. + t.step_timeout(t.step_func_done(() => { + assert_true(happened); + }), 3000); + }); + frame.src = "resources/meta-refresh.py?0"; +}, "document.open() aborts documents that are queued for navigation through refresh with timeout 0 (image loading)"); + +async_test(t => { + const frame = document.body.appendChild(document.createElement("iframe")); + t.add_cleanup(() => frame.remove()); + frame.onload = t.step_func(() => { + frame.onload = null; + + const client = new frame.contentWindow.XMLHttpRequest(); + client.open("GET", "/common/blank.html"); + client.onabort = t.step_func_done(); + client.send(); + + frame.contentDocument.open(); + }); + frame.src = "resources/http-refresh.py?0"; +}, "document.open() aborts documents that are queued for navigation through Refresh header with timeout 0 (XMLHttpRequest)"); + +async_test(t => { + const frame = document.body.appendChild(document.createElement("iframe")); + t.add_cleanup(() => frame.remove()); + frame.onload = t.step_func(() => { + frame.onload = null; + + frame.contentWindow.fetch("/common/blank.html").then( + t.unreached_func("Fetch should have been aborted"), + t.step_func_done()); + + frame.contentDocument.open(); + }); + frame.src = "resources/http-refresh.py?0"; +}, "document.open() aborts documents that are queued for navigation through Refresh header with timeout 0 (fetch())"); + +// We cannot test for img element's error event for this test, as Firefox does +// not fire the event if the fetch is aborted while Chrome does. +async_test(t => { + const frame = document.body.appendChild(document.createElement("iframe")); + t.add_cleanup(() => frame.remove()); + frame.onload = t.step_func(() => { + frame.onload = null; + + let happened = false; + const img = frame.contentDocument.createElement("img"); + img.src = new URL("resources/slow-png.py", document.URL); + img.onload = t.unreached_func("Image loading should not have succeeded"); + // The image fetch starts in a microtask, so let's be sure to test after + // the fetch has started. + t.step_timeout(() => { + frame.contentDocument.open(); + happened = true; + }); + // If 3 seconds have passed and the image has still not loaded, we consider + // it aborted. slow-png.py only sleeps for 2 wallclock seconds. + t.step_timeout(t.step_func_done(() => { + assert_true(happened); + }), 3000); + }); + frame.src = "resources/http-refresh.py?0"; +}, "document.open() aborts documents that are queued for navigation through Refresh header with timeout 0 (image loading)"); diff --git a/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort-refresh-multisecond-header.window.js b/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort-refresh-multisecond-header.window.js new file mode 100644 index 00000000000..8c6c1267c4e --- /dev/null +++ b/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort-refresh-multisecond-header.window.js @@ -0,0 +1,69 @@ +// The following tests deal with the pragma and the +// `Refresh` header. The spec is still hazy on the precise behavior in those +// cases but we use https://github.com/whatwg/html/issues/4003 as a guideline. +// +// This is separate from abort-refresh-multisecond-meta.window.js to avoid +// browser interventions that limit the number of connections in a tab. + +async_test(t => { + const frame = document.body.appendChild(document.createElement("iframe")); + t.add_cleanup(() => frame.remove()); + frame.onload = t.step_func(() => { + frame.onload = null; + let happened = false; + + const client = new frame.contentWindow.XMLHttpRequest(); + client.open("GET", "/common/blank.html"); + client.onload = t.step_func_done(() => { + assert_true(happened); + }); + client.onerror = t.unreached_func("XMLHttpRequest should have succeeded"); + client.onabort = t.unreached_func("XMLHttpRequest should have succeeded"); + client.ontimeout = t.unreached_func("XMLHttpRequest should have succeeded"); + client.send(); + + frame.contentDocument.open(); + happened = true; + }); + frame.src = "resources/http-refresh.py?1"; +}, "document.open() does NOT abort documents that are queued for navigation through Refresh header with 1-sec timeout (XMLHttpRequest)"); + +async_test(t => { + const frame = document.body.appendChild(document.createElement("iframe")); + t.add_cleanup(() => frame.remove()); + frame.onload = t.step_func(() => { + frame.onload = null; + let happened = false; + frame.contentWindow.fetch("/common/blank.html").then( + t.step_func_done(() => { + assert_true(happened); + }), + t.unreached_func("Fetch should have succeeded") + ); + frame.contentDocument.open(); + happened = true; + }); + frame.src = "resources/http-refresh.py?1"; +}, "document.open() does NOT abort documents that are queued for navigation through Refresh header with 1-sec timeout (fetch())"); + +async_test(t => { + const frame = document.body.appendChild(document.createElement("iframe")); + t.add_cleanup(() => frame.remove()); + frame.onload = t.step_func(() => { + frame.onload = null; + let happened = false; + const img = frame.contentDocument.createElement("img"); + img.src = new URL("resources/slow-png.py", document.URL); + img.onload = t.step_func_done(() => { + assert_true(happened); + }); + img.onerror = t.unreached_func("Image loading should not have errored"); + // The image fetch starts in a microtask, so let's be sure to test after + // the fetch has started. + t.step_timeout(() => { + frame.contentDocument.open(); + happened = true; + }); + }); + frame.src = "resources/http-refresh.py?4"; +}, "document.open() does NOT abort documents that are queued for navigation through Refresh header with 4-sec timeout (image loading)"); diff --git a/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort-refresh-multisecond-meta.window.js b/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort-refresh-multisecond-meta.window.js new file mode 100644 index 00000000000..2895f959e55 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort-refresh-multisecond-meta.window.js @@ -0,0 +1,69 @@ +// The following tests deal with the pragma and the +// `Refresh` header. The spec is still hazy on the precise behavior in those +// cases but we use https://github.com/whatwg/html/issues/4003 as a guideline. +// +// This is separate from abort-refresh-multisecond-header.window.js to avoid +// browser interventions that limit the number of connections in a tab. + +async_test(t => { + const frame = document.body.appendChild(document.createElement("iframe")); + t.add_cleanup(() => frame.remove()); + frame.onload = t.step_func(() => { + frame.onload = null; + let happened = false; + + const client = new frame.contentWindow.XMLHttpRequest(); + client.open("GET", "/common/blank.html"); + client.onload = t.step_func_done(() => { + assert_true(happened); + }); + client.onerror = t.unreached_func("XMLHttpRequest should have succeeded"); + client.onabort = t.unreached_func("XMLHttpRequest should have succeeded"); + client.ontimeout = t.unreached_func("XMLHttpRequest should have succeeded"); + client.send(); + + frame.contentDocument.open(); + happened = true; + }); + frame.src = "resources/meta-refresh.py?1"; +}, "document.open() does NOT abort documents that are queued for navigation through refresh with 1-sec timeout (XMLHttpRequest)"); + +async_test(t => { + const frame = document.body.appendChild(document.createElement("iframe")); + t.add_cleanup(() => frame.remove()); + frame.onload = t.step_func(() => { + frame.onload = null; + let happened = false; + frame.contentWindow.fetch("/common/blank.html").then( + t.step_func_done(() => { + assert_true(happened); + }), + t.unreached_func("Fetch should have succeeded") + ); + frame.contentDocument.open(); + happened = true; + }); + frame.src = "resources/meta-refresh.py?1"; +}, "document.open() does NOT abort documents that are queued for navigation through refresh with 1-sec timeout (fetch())"); + +async_test(t => { + const frame = document.body.appendChild(document.createElement("iframe")); + t.add_cleanup(() => frame.remove()); + frame.onload = t.step_func(() => { + frame.onload = null; + let happened = false; + const img = frame.contentDocument.createElement("img"); + img.src = new URL("resources/slow-png.py", document.URL); + img.onload = t.step_func_done(() => { + assert_true(happened); + }); + img.onerror = t.unreached_func("Image loading should not have errored"); + // The image fetch starts in a microtask, so let's be sure to test after + // the fetch has started. + t.step_timeout(() => { + frame.contentDocument.open(); + happened = true; + }); + }); + frame.src = "resources/meta-refresh.py?4"; +}, "document.open() does NOT abort documents that are queued for navigation through refresh with 4-sec timeout (image loading)"); diff --git a/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort-while-navigating.window.js b/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort-while-navigating.window.js new file mode 100644 index 00000000000..e3efeffb8b3 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort-while-navigating.window.js @@ -0,0 +1,179 @@ +async_test(t => { + const frame = document.body.appendChild(document.createElement("iframe")); + t.add_cleanup(() => frame.remove()); + frame.onload = t.step_func(() => { + frame.onload = null; + const client = new frame.contentWindow.XMLHttpRequest(); + client.open("GET", "/common/blank.html"); + // The abort event handler is called synchronously in Chrome but + // asynchronously in Firefox. See https://crbug.com/879620. + client.onabort = t.step_func_done(); + client.send(); + frame.contentWindow.location.href = new URL("resources/dummy.html", document.URL); + frame.contentDocument.open(); + }); + frame.src = "/common/blank.html"; +}, "document.open() aborts documents that are navigating through Location (XMLHttpRequest)"); + +async_test(t => { + const frame = document.body.appendChild(document.createElement("iframe")); + t.add_cleanup(() => frame.remove()); + frame.onload = t.step_func(() => { + frame.onload = null; + let happened = false; + frame.contentWindow.fetch("/common/blank.html").then( + t.unreached_func("Fetch should have been aborted"), + t.step_func_done(() => { + assert_true(happened); + })); + frame.contentWindow.location.href = new URL("resources/dummy.html", document.URL); + frame.contentDocument.open(); + happened = true; + }); + frame.src = "/common/blank.html"; +}, "document.open() aborts documents that are navigating through Location (fetch())"); + +// We cannot test for img element's error event for this test, as Firefox does +// not fire the event if the fetch is aborted while Chrome does. +async_test(t => { + const frame = document.body.appendChild(document.createElement("iframe")); + t.add_cleanup(() => frame.remove()); + frame.onload = t.step_func(() => { + frame.onload = null; + let happened = false; + const img = frame.contentDocument.createElement("img"); + img.src = new URL("resources/slow-png.py", document.URL); + img.onload = t.unreached_func("Image loading should not have succeeded"); + // The image fetch starts in a microtask, so let's be sure to test after + // the fetch has started. + t.step_timeout(() => { + frame.contentWindow.location.href = new URL("resources/dummy.html", document.URL); + frame.contentDocument.open(); + happened = true; + }); + // If 3 seconds have passed and the image has still not loaded, we consider + // it aborted. slow-png.py only sleeps for 2 wallclock seconds. + t.step_timeout(t.step_func_done(() => { + assert_true(happened); + }), 3000); + }); + frame.src = "/common/blank.html"; +}, "document.open() aborts documents that are navigating through Location (image loading)"); + +async_test(t => { + const div = document.body.appendChild(document.createElement("div")); + t.add_cleanup(() => div.remove()); + div.innerHTML = ""; + const frame = div.childNodes[0]; + const client = new frame.contentWindow.XMLHttpRequest(); + client.open("GET", "/common/blank.html"); + client.onabort = t.step_func_done(); + client.send(); + frame.contentDocument.open(); +}, "document.open() aborts documents that are navigating through iframe loading (XMLHttpRequest)"); + +async_test(t => { + const div = document.body.appendChild(document.createElement("div")); + t.add_cleanup(() => div.remove()); + div.innerHTML = ""; + const frame = div.childNodes[0]; + frame.contentWindow.fetch("/common/blank.html").then( + t.unreached_func("Fetch should have been aborted"), + t.step_func_done()); + frame.contentDocument.open(); +}, "document.open() aborts documents that are navigating through iframe loading (fetch())"); + +// We cannot test for img element's error event for this test, as Firefox does +// not fire the event if the fetch is aborted while Chrome does. +// +// We use /common/slow.py here as the source of the iframe, to prevent the +// situation where when document.open() is called the initial about:blank +// document has already become inactive. +async_test(t => { + const div = document.body.appendChild(document.createElement("div")); + t.add_cleanup(() => div.remove()); + div.innerHTML = ""; + const frame = div.childNodes[0]; + let happened = false; + const img = frame.contentDocument.createElement("img"); + img.src = new URL("resources/slow-png.py", document.URL); + img.onload = t.unreached_func("Image loading should not have succeeded"); + // The image fetch starts in a microtask, so let's be sure to test after + // the fetch has started. + t.step_timeout(() => { + frame.contentDocument.open(); + happened = true; + }); + // If 3 seconds have passed and the image has still not loaded, we consider + // it aborted. slow-png.py only sleeps for 2 wallclock seconds. + t.step_timeout(t.step_func_done(() => { + assert_true(happened); + }), 3000); +}, "document.open() aborts documents that are navigating through iframe loading (image loading)"); + +async_test(t => { + const frame = document.body.appendChild(document.createElement("iframe")); + t.add_cleanup(() => frame.remove()); + frame.onload = t.step_func(() => { + frame.onload = null; + const link = frame.contentDocument.body.appendChild(frame.contentDocument.createElement("a")); + link.href = new URL("resources/dummy.html", document.URL); + + const client = new frame.contentWindow.XMLHttpRequest(); + client.open("GET", "/common/blank.html"); + client.onabort = t.step_func_done(); + client.send(); + + link.click(); + frame.contentDocument.open(); + }); + frame.src = "/common/blank.html"; +}, "document.open() aborts documents that are queued for navigation through .click() (XMLHttpRequest)"); + +async_test(t => { + const frame = document.body.appendChild(document.createElement("iframe")); + t.add_cleanup(() => frame.remove()); + frame.onload = t.step_func(() => { + frame.onload = null; + const link = frame.contentDocument.body.appendChild(frame.contentDocument.createElement("a")); + link.href = new URL("resources/dummy.html", document.URL); + + frame.contentWindow.fetch("/common/blank.html").then( + t.unreached_func("Fetch should have been aborted"), + t.step_func_done()); + + link.click(); + frame.contentDocument.open(); + }); + frame.src = "/common/blank.html"; +}, "document.open() aborts documents that are queued for navigation through .click() (fetch())"); + +// We cannot test for img element's error event for this test, as Firefox does +// not fire the event if the fetch is aborted while Chrome does. +async_test(t => { + const frame = document.body.appendChild(document.createElement("iframe")); + t.add_cleanup(() => frame.remove()); + frame.onload = t.step_func(() => { + frame.onload = null; + const link = frame.contentDocument.body.appendChild(frame.contentDocument.createElement("a")); + link.href = new URL("resources/dummy.html", document.URL); + + let happened = false; + const img = frame.contentDocument.createElement("img"); + img.src = new URL("resources/slow-png.py", document.URL); + img.onload = t.unreached_func("Image loading should not have succeeded"); + // The image fetch starts in a microtask, so let's be sure to test after + // the fetch has started. + t.step_timeout(() => { + link.click(); + frame.contentDocument.open(); + happened = true; + }); + // If 3 seconds have passed and the image has still not loaded, we consider + // it aborted. slow-png.py only sleeps for 2 wallclock seconds. + t.step_timeout(t.step_func_done(() => { + assert_true(happened); + }), 3000); + }); + frame.src = "/common/blank.html"; +}, "document.open() aborts documents that are queued for navigation through .click() (image loading)"); diff --git a/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort.sub.window.js b/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort.sub.window.js new file mode 100644 index 00000000000..b2f05cf056d --- /dev/null +++ b/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort.sub.window.js @@ -0,0 +1,104 @@ +async_test(t => { + const frame = document.body.appendChild(document.createElement("iframe")); + t.add_cleanup(() => frame.remove()); + frame.onload = t.step_func(() => { + frame.onload = null; + let happened = false; + const client = new frame.contentWindow.XMLHttpRequest(); + client.open("GET", "/common/blank.html"); + client.onload = t.step_func_done(e => { + assert_true(happened); + }); + client.onerror = t.unreached_func("XMLHttpRequest should have succeeded"); + client.onabort = t.unreached_func("XMLHttpRequest should have succeeded"); + client.ontimeout = t.unreached_func("XMLHttpRequest should have succeeded"); + client.send(); + frame.contentDocument.open(); + happened = true; + }); + frame.src = "/common/blank.html"; +}, "document.open() does not abort documents that are not navigating (XMLHttpRequest)"); + +async_test(t => { + const frame = document.body.appendChild(document.createElement("iframe")); + t.add_cleanup(() => frame.remove()); + frame.onload = t.step_func(() => { + frame.onload = null; + let happened = false; + frame.contentWindow.fetch("/common/blank.html").then( + t.step_func_done(() => { + assert_true(happened); + }), + t.unreached_func("Fetch should have succeeded") + ); + frame.contentDocument.open(); + happened = true; + }); + frame.src = "/common/blank.html"; +}, "document.open() does not abort documents that are not navigating (fetch())"); + +async_test(t => { + const frame = document.body.appendChild(document.createElement("iframe")); + t.add_cleanup(() => frame.remove()); + frame.onload = t.step_func(() => { + frame.onload = null; + let happened = false; + const img = frame.contentDocument.createElement("img"); + img.src = new URL("resources/slow-png.py", document.URL); + img.onload = t.step_func_done(() => { + assert_true(happened); + }); + img.onerror = t.unreached_func("Image loading should not have errored"); + // The image fetch starts in a microtask, so let's be sure to test after + // the fetch has started. + t.step_timeout(() => { + frame.contentDocument.open(); + happened = true; + }); + }); + frame.src = "/common/blank.html"; +}, "document.open() does not abort documents that are not navigating (image loading)"); + +async_test(t => { + const __SERVER__NAME = "{{host}}"; + const __PORT = {{ports[ws][0]}}; + const frame = document.body.appendChild(document.createElement("iframe")); + t.add_cleanup(() => frame.remove()); + frame.onload = t.step_func(() => { + frame.onload = null; + let happened = false; + const ws = new frame.contentWindow.WebSocket(`ws://${__SERVER__NAME}:${__PORT}/echo`); + ws.onopen = t.step_func_done(() => { + assert_true(happened); + }); + ws.onclose = t.unreached_func("WebSocket fetch should have succeeded"); + ws.onerror = t.unreached_func("WebSocket should have no error"); + frame.contentDocument.open(); + happened = true; + }); + frame.src = "/common/blank.html"; +}, "document.open() does not abort documents that are not navigating (establish a WebSocket connection)"); + +// An already established WebSocket connection shouldn't be terminated during +// an "abort a document" anyway. Test just for completeness. +async_test(t => { + const __SERVER__NAME = "{{host}}"; + const __PORT = {{ports[ws][0]}}; + const frame = document.body.appendChild(document.createElement("iframe")); + t.add_cleanup(() => frame.remove()); + frame.onload = t.step_func(() => { + frame.onload = null; + let happened = false; + const ws = new frame.contentWindow.WebSocket(`ws://${__SERVER__NAME}:${__PORT}/echo`); + ws.onopen = t.step_func(() => { + t.step_timeout(t.step_func_done(() => { + assert_true(happened); + }), 100); + frame.contentDocument.open(); + happened = true; + }); + ws.onclose = t.unreached_func("WebSocket should not be closed"); + ws.onerror = t.unreached_func("WebSocket should have no error"); + }); + frame.src = "/common/blank.html"; +}, "document.open() does not abort documents that are not navigating (already established WebSocket connection)"); diff --git a/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/mutation-observer.window.js b/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/mutation-observer.window.js new file mode 100644 index 00000000000..34e73146a9d --- /dev/null +++ b/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/mutation-observer.window.js @@ -0,0 +1,19 @@ +async_test(t => { + const frame = document.body.appendChild(document.createElement("iframe")); + t.add_cleanup(() => { frame.remove(); }); + const originalHTMLElement = frame.contentDocument.documentElement; + assert_equals(originalHTMLElement.localName, "html"); + const observer = new frame.contentWindow.MutationObserver(t.step_func_done(records => { + // Even though we passed `subtree: true` to observer.observe, due to the + // fact that "replace all" algorithm removes children with the "suppress + // observers flag" set, we still only get the html element as the sole + // removed node. + assert_equals(records.length, 1); + assert_equals(records[0].type, "childList"); + assert_equals(records[0].target, frame.contentDocument); + assert_array_equals(records[0].addedNodes, []); + assert_array_equals(records[0].removedNodes, [originalHTMLElement]); + })); + observer.observe(frame.contentDocument, { childList: true, subtree: true }); + assert_equals(frame.contentDocument.open(), frame.contentDocument); +}, "document.open() should inform mutation observer of node removal"); diff --git a/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/reload.window.js b/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/reload.window.js index d6ff9dc7a45..279020f64da 100644 --- a/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/reload.window.js +++ b/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/reload.window.js @@ -12,16 +12,16 @@ // that restriction. // // In any case, this test as the caller of `document.open()` would be used both -// as the test file and as part of the test file. The `if (!opener)` condition -// controls what role this file plays. +// as the test file and as part of the test file. The `if (window.name !== +// "opened-dummy-window")` condition controls what role this file plays. -if (!opener) { +if (window.name !== "opened-dummy-window") { async_test(t => { const testURL = document.URL; const dummyURL = new URL("resources/dummy.html", document.URL).href; // 1. Open an auxiliary window. - const win = window.open("resources/dummy.html"); + const win = window.open("resources/dummy.html", "opened-dummy-window"); t.add_cleanup(() => { win.close(); }); win.addEventListener("load", t.step_func(() => { diff --git a/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/http-refresh.py b/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/http-refresh.py new file mode 100644 index 00000000000..d2acd4361f9 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/http-refresh.py @@ -0,0 +1,3 @@ +def main(request, response): + time = request.url_parts.query if request.url_parts.query else '0' + return 200, [['Refresh', time]], '' diff --git a/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/meta-refresh.py b/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/meta-refresh.py new file mode 100644 index 00000000000..dd3cef44b44 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/meta-refresh.py @@ -0,0 +1,5 @@ +import time + +def main(request, response): + time = request.url_parts.query if request.url_parts.query else '0' + return 200, [['Content-Type', 'text/html']], '' % time diff --git a/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/slow-png.py b/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/slow-png.py new file mode 100644 index 00000000000..5fa2fd9a9d8 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/slow-png.py @@ -0,0 +1,8 @@ +from base64 import decodestring +import time + +png_response = decodestring('iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAAAAAA6fptVAAAACklEQVR4nGNiAAAABgADNjd8qAAAAABJRU5ErkJggg==') + +def main(request, response): + time.sleep(2) + return 200, [], png_response diff --git a/tests/wpt/web-platform-tests/interfaces/trusted-types.tentative.idl b/tests/wpt/web-platform-tests/interfaces/trusted-types.tentative.idl new file mode 100644 index 00000000000..a3a635b9927 --- /dev/null +++ b/tests/wpt/web-platform-tests/interfaces/trusted-types.tentative.idl @@ -0,0 +1,53 @@ +// https://github.com/wicg/trusted-types + +typedef (DOMString or TrustedHTML) HTMLString; +typedef (DOMString or TrustedScript) ScriptString; +typedef (DOMString or TrustedScriptURL) ScriptURLString; +typedef (USVString or TrustedURL) URLString; + +[Exposed=Window] +interface TrustedHTML { + stringifier; +}; + +[Exposed=Window] +interface TrustedScript { + stringifier; +}; + +[Exposed=Window] +interface TrustedScriptURL { + stringifier; +}; + +[Exposed=Window] +interface TrustedURL { + stringifier; +}; + +[Exposed=Window] +interface TrustedTypePolicyFactory { + TrustedTypePolicy createPolicy(DOMString policyName, TrustedTypePolicyOptions policyOptions); + // All the policy object names that have been created + sequence getPolicyNames(); +}; + +[Exposed=Window] +interface TrustedTypePolicy { + readonly attribute DOMString name; + TrustedHTML createHTML(DOMString input); + TrustedScript createScript(DOMString input); + TrustedScriptURL createScriptURL(DOMString input); + TrustedURL createURL(DOMString input); +}; + +dictionary TrustedTypePolicyOptions { + CreateHTMLCallback createHTML; + CreateScriptCallback createScript; + CreateURLCallback createScriptURL; + CreateURLCallback createURL; +}; + +callback CreateHTMLCallback = DOMString (DOMString input); +callback CreateScriptCallback = DOMString (DOMString input); +callback CreateURLCallback = USVString (DOMString input); diff --git a/tests/wpt/web-platform-tests/payment-request/payment-response/onpayerdetailchange-attribute.manual.https.html b/tests/wpt/web-platform-tests/payment-request/payment-response/onpayerdetailchange-attribute.manual.https.html index 9f92d284063..c8dd92636c6 100644 --- a/tests/wpt/web-platform-tests/payment-request/payment-response/onpayerdetailchange-attribute.manual.https.html +++ b/tests/wpt/web-platform-tests/payment-request/payment-response/onpayerdetailchange-attribute.manual.https.html @@ -13,7 +13,7 @@ function runTest(button, options, expected){ response.addEventListener("payerdetailchange", resolve); }); const error = button.previousElementSibling.textContent.trim(); - const retryPromise = response.retry({ error }); + await response.retry({ error }); const event = await eventPromise; assert_true(event instanceof PaymentRequestUpdateEvent); for(const [prop, value] of Object.entries(expected)){ diff --git a/tests/wpt/web-platform-tests/tools/ci/check_stability.py b/tests/wpt/web-platform-tests/tools/ci/check_stability.py index 684f7a51894..2b32eb50c0f 100644 --- a/tests/wpt/web-platform-tests/tools/ci/check_stability.py +++ b/tests/wpt/web-platform-tests/tools/ci/check_stability.py @@ -266,8 +266,7 @@ def run(venv, wpt_args, **kwargs): do_delayed_imports() wpt_kwargs["prompt"] = False - wpt_kwargs["install_browser"] = True - wpt_kwargs["install"] = wpt_kwargs["product"].split(":")[0] == "firefox" + wpt_kwargs["install_browser"] = wpt_kwargs["product"].split(":")[0] == "firefox" wpt_kwargs["pause_after_test"] = False wpt_kwargs["verify_log_full"] = False diff --git a/tests/wpt/web-platform-tests/tools/ci/ci_resources_unittest.sh b/tests/wpt/web-platform-tests/tools/ci/ci_resources_unittest.sh index 78868b93433..a13c60fbd8c 100755 --- a/tests/wpt/web-platform-tests/tools/ci/ci_resources_unittest.sh +++ b/tests/wpt/web-platform-tests/tools/ci/ci_resources_unittest.sh @@ -17,7 +17,7 @@ main() { export PATH=$HOME/firefox:$PATH cd $WPT_ROOT/resources/test - tox -- --binary=$HOME/browsers/firefox/firefox + tox -- --binary=$HOME/browsers/nightly/firefox/firefox } main diff --git a/tests/wpt/web-platform-tests/tools/ci/ci_taskcluster.sh b/tests/wpt/web-platform-tests/tools/ci/ci_taskcluster.sh index 118243881a9..546055293d7 100755 --- a/tests/wpt/web-platform-tests/tools/ci/ci_taskcluster.sh +++ b/tests/wpt/web-platform-tests/tools/ci/ci_taskcluster.sh @@ -3,8 +3,8 @@ ./wpt manifest-download if [ $1 == "firefox" ]; then - ./wpt run firefox --log-tbpl=../artifacts/log_tbpl.log --log-tbpl-level=info --log-wptreport=../artifacts/wpt_report.json --log-mach=- --this-chunk=$3 --total-chunks=$4 --test-type=$2 -y --install-browser --no-pause --no-restart-on-unexpected --reftest-internal --install-fonts --no-fail-on-unexpected + ./wpt run firefox --log-tbpl=../artifacts/log_tbpl.log --log-tbpl-level=info --log-wptreport=../artifacts/wpt_report.json --log-mach=- --this-chunk=$4 --total-chunks=$5 --test-type=$3 -y --install-browser --channel=$2 --no-pause --no-restart-on-unexpected --reftest-internal --install-fonts --no-fail-on-unexpected elif [ $1 == "chrome" ]; then - ./wpt run chrome --log-tbpl=../artifacts/log_tbpl.log --log-tbpl-level=info --log-wptreport=../artifacts/wpt_report.json --log-mach=- --this-chunk=$3 --total-chunks=$4 --test-type=$2 -y --no-pause --no-restart-on-unexpected --install-fonts --no-fail-on-unexpected + ./wpt run chrome --log-tbpl=../artifacts/log_tbpl.log --log-tbpl-level=info --log-wptreport=../artifacts/wpt_report.json --log-mach=- --channel=$2 --this-chunk=$4 --total-chunks=$5 --test-type=$3 -y --no-pause --no-restart-on-unexpected --install-fonts --no-fail-on-unexpected fi gzip ../artifacts/wpt_report.json diff --git a/tests/wpt/web-platform-tests/tools/ci/commands.json b/tests/wpt/web-platform-tests/tools/ci/commands.json index 0f8f5823699..361c9e4f3de 100644 --- a/tests/wpt/web-platform-tests/tools/ci/commands.json +++ b/tests/wpt/web-platform-tests/tools/ci/commands.json @@ -1,7 +1,42 @@ { - "test-jobs": {"path": "jobs.py", "script": "run", "parser": "create_parser", "help": "List test jobs that should run for a set of commits", - "virtualenv": false}, - "check-stability": {"path": "check_stability.py", "script": "run", "parser": "get_parser", "parse_known": true, "help": "Check test stability", - "virtualenv": true, "install": ["requests"], "requirements": ["../wptrunner/requirements.txt"]}, - "make-hosts-file": {"path": "make_hosts_file.py", "script": "run", "parser": "create_parser", "help": "Output a hosts file to stdout", "virtualenv": false} + "test-jobs": { + "path": "jobs.py", + "script": "run", + "parser": "create_parser", + "help": "List test jobs that should run for a set of commits", + "virtualenv": false + }, + "check-stability": { + "path": "check_stability.py", + "script": "run", + "parser": "get_parser", + "parse_known": true, + "help": "Check test stability", + "virtualenv": true, + "install": [ + "requests" + ], + "requirements": [ + "../wptrunner/requirements.txt" + ] + }, + "make-hosts-file": { + "path": "make_hosts_file.py", + "script": "run", + "parser": "create_parser", + "help": "Output a hosts file to stdout", + "virtualenv": false + }, + "tc-download": { + "path": "tcdownload.py", + "script": "run", + "parser": "get_parser", + "parse_known": true, + "help": "Download logs from taskcluster", + "virtualenv": true, + "install": [ + "requests", + "pygithub" + ] + } } diff --git a/tests/wpt/web-platform-tests/tools/ci/tcdownload.py b/tests/wpt/web-platform-tests/tools/ci/tcdownload.py new file mode 100644 index 00000000000..8813dccc888 --- /dev/null +++ b/tests/wpt/web-platform-tests/tools/ci/tcdownload.py @@ -0,0 +1,95 @@ +import argparse +import os +import logging + +import requests + +import github + + +logging.basicConfig() +logger = logging.getLogger("tc-download") + + +def get_parser(): + parser = argparse.ArgumentParser() + parser.add_argument("--ref", action="store", default="master", + help="Branch (in the GitHub repository) or commit to fetch logs for") + parser.add_argument("--artifact-name", action="store", default="wpt_report.json.gz", + help="Log type to fetch") + parser.add_argument("--repo-name", action="store", default="web-platform-tests/wpt", + help="GitHub repo name in the format owner/repo. " + "This must be the repo from which the TaskCluster run was scheduled " + "(for PRs this is the repo into which the PR would merge)") + parser.add_argument("--token-file", action="store", + help="File containing GitHub token") + parser.add_argument("--out-dir", action="store", default=".", + help="Path to save the logfiles") + return parser + + +def get_json(url, key=None): + resp = requests.get(url) + resp.raise_for_status() + data = resp.json() + if key: + data = data[key] + return data + + +def get(url, dest, name): + resp = requests.get(url) + resp.raise_for_status() + path = os.path.join(dest, name) + with open(path, "w") as f: + f.write(resp.content) + return path + + +def run(*args, **kwargs): + if not os.path.exists(kwargs["out_dir"]): + os.mkdir(kwargs["out_dir"]) + + if kwargs["token_file"]: + with open(kwargs["token_file"]) as f: + gh = github.Github(f.read().strip()) + else: + gh = github.Github() + + repo = gh.get_repo(kwargs["repo_name"]) + commit = repo.get_commit(kwargs["ref"]) + statuses = commit.get_statuses() + taskgroups = set() + + for status in statuses: + if not status.context.startswith("Taskcluster "): + continue + if status.state == "pending": + continue + taskgroup_id = status.target_url.rsplit("/", 1)[1] + taskgroups.add(taskgroup_id) + + if not taskgroups: + logger.error("No complete TaskCluster runs found for ref %s" % kwargs["ref"]) + return + + for taskgroup in taskgroups: + taskgroup_url = "https://queue.taskcluster.net/v1/task-group/%s/list" + artifacts_list_url = "https://queue.taskcluster.net/v1/task/%s/artifacts" + tasks = get_json(taskgroup_url % taskgroup, "tasks") + for task in tasks: + task_id = task["status"]["taskId"] + url = artifacts_list_url % (task_id,) + for artifact in get_json(url, "artifacts"): + if artifact["name"].endswith(kwargs["artifact_name"]): + filename = "%s-%s-%s" % (task["task"]["metadata"]["name"], + task_id, + kwargs["artifact_name"]) + path = get("%s/%s" % (url, artifact["name"]), kwargs["out_dir"], filename) + logger.info(path) + + +def __main__(): + kwargs = get_parser().parse_args() + + run(None, vars(kwargs)) diff --git a/tests/wpt/web-platform-tests/tools/docker/start.sh b/tests/wpt/web-platform-tests/tools/docker/start.sh index 3325bb24f58..c2fd91d96d4 100755 --- a/tests/wpt/web-platform-tests/tools/docker/start.sh +++ b/tests/wpt/web-platform-tests/tools/docker/start.sh @@ -15,6 +15,7 @@ REMOTE=${1:-https://github.com/web-platform-tests/wpt} BRANCH=${2:-master} REV=${3:-FETCH_HEAD} BROWSER=${4:-all} +CHANNEL=${5:-nightly} cd ~ @@ -32,10 +33,22 @@ git checkout -b build ${REV} sudo sh -c './wpt make-hosts-file >> /etc/hosts' -if [[ $BROWSER == "chrome"* ]] || [[ "$BROWSER" == all ]] +if [[ $BROWSER == "chrome" ]] || [[ "$BROWSER" == all ]] then # Install Chrome dev - deb_archive=google-chrome-unstable_current_amd64.deb + if [[ "$CHANNEL" == "dev" ]] || [[ "$CHANNEL" == "nightly" ]] + then + deb_archive=google-chrome-unstable_current_amd64.deb + elif [[ "$CHANNEL" == "beta" ]] + then + deb_archive=google-chrome-beta_current_amd64.deb + elif [[ "$CHANNEL" == "stable" ]] + then + deb_archive=google-chrome-stable_current_amd64.deb + else + echo Unrecognized release channel: $CHANNEL >&2 + exit 1 + fi wget https://dl.google.com/linux/direct/$deb_archive sudo apt-get -qqy update && sudo gdebi -n $deb_archive diff --git a/tests/wpt/web-platform-tests/tools/wpt/browser.py b/tests/wpt/web-platform-tests/tools/wpt/browser.py index 9834e5d53f3..65752a25f12 100644 --- a/tests/wpt/web-platform-tests/tools/wpt/browser.py +++ b/tests/wpt/web-platform-tests/tools/wpt/browser.py @@ -26,12 +26,12 @@ class Browser(object): return NotImplemented @abstractmethod - def install_webdriver(self, dest=None): + def install_webdriver(self, dest=None, channel=None): """Install the WebDriver implementation for this browser.""" return NotImplemented @abstractmethod - def find_binary(self): + def find_binary(self, venv_path=None, channel=None): """Find the binary of the browser. If the WebDriver for the browser is able to find the binary itself, this @@ -84,9 +84,27 @@ class Firefox(Browser): return "%s%s" % (platform, bits) - def install(self, dest=None): + def install(self, dest=None, channel="nightly"): """Install Firefox.""" + branch = { + "nightly": "mozilla-central", + "beta": "mozilla-beta", + "stable": "mozilla-stable" + } + scraper = { + "nightly": "daily", + "beta": "release", + "stable": "release" + } + version = { + "stable": "latest", + "beta": "latest-beta", + "nightly": "latest" + } + if channel not in branch: + raise ValueError("Unrecognised release channel: %s" % channel) + from mozdownload import FactoryScraper import mozinstall @@ -103,9 +121,12 @@ class Firefox(Browser): # os.getcwd() doesn't include the venv path dest = os.path.join(os.getcwd(), "_venv") - dest = os.path.join(dest, "browsers") + dest = os.path.join(dest, "browsers", channel) - filename = FactoryScraper("daily", branch="mozilla-central", destination=dest).download() + filename = FactoryScraper(scraper[channel], + branch=branch[channel], + version=version[channel], + destination=dest).download() try: mozinstall.install(filename, dest) @@ -146,11 +167,14 @@ class Firefox(Browser): return binary - def find_binary(self, venv_path=None): + def find_binary(self, venv_path=None, channel=None): if venv_path is None: venv_path = os.path.join(os.getcwd(), "_venv") - binary = self.find_binary_path(os.path.join(venv_path, "browsers")) + path = os.path.join(venv_path, "browsers") + if channel is not None: + path = os.path.join(path, channel) + binary = self.find_binary_path(path) if not binary and uname[0] == "Darwin": macpaths = ["/Applications/FirefoxNightly.app/Contents/MacOS", @@ -190,6 +214,18 @@ class Firefox(Browser): if channel == "stable": repo = "https://hg.mozilla.org/releases/mozilla-release" tag = "FIREFOX_%s_RELEASE" % version.replace(".", "_") + elif channel == "beta": + repo = "https://hg.mozilla.org/releases/mozilla-beta" + major_version = version.split(".", 1)[0] + # For beta we have a different format for betas that are now in stable releases + # vs those that are not + tags = get("https://hg.mozilla.org/releases/mozilla-beta/json-tags").json()["tags"] + tags = {item["tag"] for item in tags} + end_tag = "FIREFOX_BETA_%s_END" % major_version + if end_tag in tags: + tag = end_tag + else: + tag = "tip" else: repo = "https://hg.mozilla.org/mozilla-central" if channel == "beta": @@ -202,8 +238,14 @@ class Firefox(Browser): return "%s/archive/%s.zip/testing/profiles/" % (repo, tag) - def install_prefs(self, binary, dest=None): - version, channel = self.get_version_and_channel(binary) + def install_prefs(self, binary, dest=None, channel=None): + version, channel_ = self.get_version_and_channel(binary) + if channel is not None and channel != channel_: + # Beta doesn't always seem to have the b in the version string, so allow the + # manually supplied value to override the one from the binary + logger.warning("Supplied channel doesn't match binary, using supplied channel") + elif channel is None: + channel = channel_ if dest is None: dest = os.pwd @@ -257,11 +299,18 @@ class Firefox(Browser): assert latest_release != 0 return "v%s.%s.%s" % tuple(str(item) for item in latest_release) - def install_webdriver(self, dest=None): + def install_webdriver(self, dest=None, channel=None): """Install latest Geckodriver.""" if dest is None: dest = os.getcwd() + if channel == "nightly": + path = self.install_geckodriver_nightly(dest) + if path is not None: + return path + else: + logger.warning("Nightly webdriver not found; falling back to release") + version = self._latest_geckodriver_version() format = "zip" if uname[0] == "Windows" else "tar.gz" logger.debug("Latest geckodriver release %s" % version) @@ -273,9 +322,39 @@ class Firefox(Browser): untar(get(url).raw, dest=dest) return find_executable(os.path.join(dest, "geckodriver")) - def version(self, binary=None): + def install_geckodriver_nightly(self, dest): + import tarfile + import mozdownload + logger.info("Attempting to install webdriver from nightly") + try: + s = mozdownload.DailyScraper(branch="mozilla-central", + extension="common.tests.tar.gz", + destination=dest) + package_path = s.download() + except mozdownload.errors.NotFoundError: + return + + try: + exe_suffix = ".exe" if uname[0] == "Windows" else "" + with tarfile.open(package_path, "r") as f: + try: + member = f.getmember("bin%sgeckodriver%s" % (os.path.sep, + exe_suffix)) + except KeyError: + return + # Remove bin/ from the path. + member.name = os.path.basename(member.name) + f.extractall(members=[member], path=dest) + path = os.path.join(dest, member.name) + logger.info("Extracted geckodriver to %s" % path) + finally: + os.unlink(package_path) + + return path + + def version(self, binary=None, channel=None): """Retrieve the release version of the installed browser.""" - binary = binary or self.find_binary() + binary = binary or self.find_binary(channel) version_string = call(binary, "--version").strip() m = re.match(r"Mozilla Firefox (.*)", version_string) if not m: @@ -289,16 +368,16 @@ class Fennec(Browser): product = "fennec" requirements = "requirements_firefox.txt" - def install(self, dest=None): + def install(self, dest=None, channel=None): raise NotImplementedError - def find_binary(self, venv_path=None): + def find_binary(self, venv_path=None, channel=None): raise NotImplementedError def find_webdriver(self): raise NotImplementedError - def install_webdriver(self, dest=None): + def install_webdriver(self, dest=None, channel=None): raise NotImplementedError def version(self, binary=None): @@ -324,7 +403,7 @@ class Chrome(Browser): logger.warn("Unable to find the browser binary.") return None - def install(self, dest=None): + def install(self, dest=None, channel=None): raise NotImplementedError def platform_string(self): @@ -346,13 +425,13 @@ class Chrome(Browser): return "%s%s" % (platform, bits) - def find_binary(self): + def find_binary(self, venv_path=None, channel=None): raise NotImplementedError def find_webdriver(self): return find_executable("chromedriver") - def install_webdriver(self, dest=None): + def install_webdriver(self, dest=None, channel=None): if dest is None: dest = os.pwd latest = get("http://chromedriver.storage.googleapis.com/LATEST_RELEASE").text.strip() @@ -391,18 +470,18 @@ class ChromeAndroid(Browser): product = "chrome_android" requirements = "requirements_chrome_android.txt" - def install(self, dest=None): + def install(self, dest=None, channel=None): raise NotImplementedError - def find_binary(self): + def find_binary(self, venv_path=None, channel=None): raise NotImplementedError def find_webdriver(self): return find_executable("chromedriver") - def install_webdriver(self, dest=None): + def install_webdriver(self, dest=None, channel=None): chrome = Chrome() - return chrome.install_webdriver(dest) + return chrome.install_webdriver(dest, channel) def version(self, binary): return None @@ -425,7 +504,7 @@ class Opera(Browser): logger.warn("Unable to find the browser binary.") return None - def install(self, dest=None): + def install(self, dest=None, channel=None): raise NotImplementedError def platform_string(self): @@ -447,13 +526,13 @@ class Opera(Browser): return "%s%s" % (platform, bits) - def find_binary(self): + def find_binary(self, venv_path=None, channel=None): raise NotImplementedError def find_webdriver(self): return find_executable("operadriver") - def install_webdriver(self, dest=None): + def install_webdriver(self, dest=None, channel=None): if dest is None: dest = os.pwd latest = get("https://api.github.com/repos/operasoftware/operachromiumdriver/releases/latest").json()["tag_name"] @@ -487,16 +566,16 @@ class Edge(Browser): product = "edge" requirements = "requirements_edge.txt" - def install(self, dest=None): + def install(self, dest=None, channel=None): raise NotImplementedError - def find_binary(self): + def find_binary(self, venv_path=None, channel=None): raise NotImplementedError def find_webdriver(self): return find_executable("MicrosoftWebDriver") - def install_webdriver(self, dest=None): + def install_webdriver(self, dest=None, channel=None): raise NotImplementedError def version(self, binary): @@ -509,16 +588,16 @@ class InternetExplorer(Browser): product = "ie" requirements = "requirements_ie.txt" - def install(self, dest=None): + def install(self, dest=None, channel=None): raise NotImplementedError - def find_binary(self): + def find_binary(self, venv_path=None, channel=None): raise NotImplementedError def find_webdriver(self): return find_executable("IEDriverServer.exe") - def install_webdriver(self, dest=None): + def install_webdriver(self, dest=None, channel=None): raise NotImplementedError def version(self, binary): @@ -534,16 +613,16 @@ class Safari(Browser): product = "safari" requirements = "requirements_safari.txt" - def install(self, dest=None): + def install(self, dest=None, channel=None): raise NotImplementedError - def find_binary(self): + def find_binary(self, venv_path=None, channel=None): raise NotImplementedError def find_webdriver(self): return find_executable("safaridriver") - def install_webdriver(self): + def install_webdriver(self, dest=None, channel=None): raise NotImplementedError def version(self, binary): @@ -574,8 +653,10 @@ class Servo(Browser): return (platform, extension, decompress) - def install(self, dest=None): + def install(self, dest=None, channel="nightly"): """Install latest Browser Engine.""" + if channel != "nightly": + raise ValueError("Only nightly versions of Servo are available") if dest is None: dest = os.pwd @@ -588,13 +669,16 @@ class Servo(Browser): os.chmod(path, st.st_mode | stat.S_IEXEC) return path - def find_binary(self): - return find_executable("servo") + def find_binary(self, venv_path=None, channel=None): + path = find_executable("servo", os.path.join(venv_path, "servo")) + if path is None: + path = find_executable("servo") + return path def find_webdriver(self): return None - def install_webdriver(self, dest=None): + def install_webdriver(self, dest=None, channel=None): raise NotImplementedError def version(self, binary): @@ -609,16 +693,16 @@ class Sauce(Browser): product = "sauce" requirements = "requirements_sauce.txt" - def install(self, dest=None): + def install(self, dest=None, channel=None): raise NotImplementedError - def find_binary(self): + def find_binary(self, venev_path=None, channel=None): raise NotImplementedError def find_webdriver(self): raise NotImplementedError - def install_webdriver(self, dest=None): + def install_webdriver(self, dest=None, channel=None): raise NotImplementedError def version(self, binary): @@ -631,16 +715,16 @@ class WebKit(Browser): product = "webkit" requirements = "requirements_webkit.txt" - def install(self, dest=None): + def install(self, dest=None, channel=None): raise NotImplementedError - def find_binary(self, path=None): + def find_binary(self, venv_path=None, channel=None): return None def find_webdriver(self): return None - def install_webdriver(self): + def install_webdriver(self, dest=None, channel=None): raise NotImplementedError def version(self, binary): diff --git a/tests/wpt/web-platform-tests/tools/wpt/install.py b/tests/wpt/web-platform-tests/tools/wpt/install.py index d779651c990..62c833aa3f0 100644 --- a/tests/wpt/web-platform-tests/tools/wpt/install.py +++ b/tests/wpt/web-platform-tests/tools/wpt/install.py @@ -2,20 +2,62 @@ import argparse import browser import sys + +latest_channels = { + 'firefox': 'nightly', + 'chrome': 'dev', + 'servo': 'nightly' +} + +channel_by_name = { + 'stable': 'stable', + 'release': 'stable', + 'beta': 'beta', + 'nightly': latest_channels, + 'dev': latest_channels, + 'preview': latest_channels, + 'experimental': latest_channels, +} + + def get_parser(): - parser = argparse.ArgumentParser() - parser.add_argument('browser', choices=['firefox', 'chrome'], + parser = argparse.ArgumentParser(description="""Install a given browser or webdriver frontend. + + For convenience the release channel of the browser accepts various spellings, + but we actually support at most three variants; whatever the latest development + release is (e.g. Firefox nightly or Chrome dev), the latest beta release, and + the most recent stable release.""") + parser.add_argument('browser', choices=['firefox', 'chrome', 'servo'], help='name of web browser product') parser.add_argument('component', choices=['browser', 'webdriver'], help='name of component') + parser.add_argument('--channel', choices=channel_by_name.keys(), + default="nightly", help='Name of browser release channel. ' + '"stable" and "release" are synonyms for the latest browser stable release,' + '"nightly", "dev", "experimental", and "preview" are all synonyms for ' + 'the latest available development release. For WebDriver installs, ' + 'we attempt to select an appropriate, compatible, version for the ' + 'latest browser release on the selected channel.') parser.add_argument('-d', '--destination', help='filesystem directory to place the component') return parser +def get_channel(browser, channel): + channel = channel_by_name[channel] + if isinstance(channel, dict): + channel = channel[browser] + return channel + + def run(venv, **kwargs): browser = kwargs["browser"] destination = kwargs["destination"] + channel = get_channel(browser, kwargs["channel"]) + + if channel != kwargs["channel"]: + print "Interpreting channel '%s' as '%s'" % (kwargs["channel"], + channel) if destination is None: if venv: @@ -27,10 +69,10 @@ def run(venv, **kwargs): raise argparse.ArgumentError(None, "No --destination argument, and no default for the environment") - install(browser, kwargs["component"], destination) + install(browser, kwargs["component"], destination, channel) -def install(name, component, destination): +def install(name, component, destination, channel="nightly"): if component == 'webdriver': method = 'install_webdriver' else: @@ -38,4 +80,6 @@ def install(name, component, destination): subclass = getattr(browser, name.title()) sys.stdout.write('Now installing %s %s...\n' % (name, component)) - getattr(subclass(), method)(dest=destination) + path = getattr(subclass(), method)(dest=destination, channel=channel) + if path: + sys.stdout.write('Binary installed as %s\n' % (path,)) diff --git a/tests/wpt/web-platform-tests/tools/wpt/run.py b/tests/wpt/web-platform-tests/tools/wpt/run.py index aeeb22be961..036c38f2586 100644 --- a/tests/wpt/web-platform-tests/tools/wpt/run.py +++ b/tests/wpt/web-platform-tests/tools/wpt/run.py @@ -7,7 +7,7 @@ from distutils.spawn import find_executable wpt_root = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir, os.pardir)) sys.path.insert(0, os.path.abspath(os.path.join(wpt_root, "tools"))) -from . import browser, utils, virtualenv +from . import browser, install, utils, virtualenv from ..serve import serve logger = None @@ -47,7 +47,15 @@ def create_parser(): parser.add_argument("--yes", "-y", dest="prompt", action="store_false", default=True, help="Don't prompt before installing components") parser.add_argument("--install-browser", action="store_true", - help="Install the latest development version of the browser") + help="Install the browser") + parser.add_argument("--channel", action="store", + choices=install.channel_by_name.keys(), + default=None, help='Name of browser release channel.' + '"stable" and "release" are synonyms for the latest browser stable release,' + '"nightly", "dev", "experimental", and "preview" are all synonyms for ' + 'the latest available development release. For WebDriver installs, ' + 'we attempt to select an appropriate, compatible, version for the ' + 'latest browser release on the selected channel.') parser._add_container_actions(wptcommandline.create_parser()) return parser @@ -150,9 +158,9 @@ class BrowserSetup(object): elif resp == "n": return False - def install(self, venv): + def install(self, venv, channel=None): if self.prompt_install(self.name): - return self.browser.install(venv.path) + return self.browser.install(venv.path, channel) def install_requirements(self): self.venv.install_requirements(os.path.join(wpt_root, "tools", "wptrunner", self.browser.requirements)) @@ -167,7 +175,8 @@ class Firefox(BrowserSetup): def setup_kwargs(self, kwargs): if kwargs["binary"] is None: - binary = self.browser.find_binary(self.venv.path) + binary = self.browser.find_binary(self.venv.path, + kwargs["browser_channel"]) if binary is None: raise WptrunError("""Firefox binary not found on $PATH. @@ -205,7 +214,9 @@ Consider installing certutil via your OS package manager or directly.""") kwargs["test_types"].remove("wdspec") if kwargs["prefs_root"] is None: - prefs_root = self.browser.install_prefs(kwargs["binary"], self.venv.path) + prefs_root = self.browser.install_prefs(kwargs["binary"], + self.venv.path, + channel=kwargs["browser_channel"]) kwargs["prefs_root"] = prefs_root @@ -290,7 +301,7 @@ class Edge(BrowserSetup): name = "edge" browser_cls = browser.Edge - def install(self, venv): + def install(self, venv, channel=None): raise NotImplementedError def setup_kwargs(self, kwargs): @@ -311,7 +322,7 @@ class InternetExplorer(BrowserSetup): name = "ie" browser_cls = browser.InternetExplorer - def install(self, venv): + def install(self, venv, channel=None): raise NotImplementedError def setup_kwargs(self, kwargs): @@ -332,7 +343,7 @@ class Safari(BrowserSetup): name = "safari" browser_cls = browser.Safari - def install(self, venv): + def install(self, venv, channel=None): raise NotImplementedError def setup_kwargs(self, kwargs): @@ -349,7 +360,7 @@ class Sauce(BrowserSetup): name = "sauce" browser_cls = browser.Sauce - def install(self, venv): + def install(self, venv, channel=None): raise NotImplementedError def setup_kwargs(self, kwargs): @@ -362,13 +373,13 @@ class Servo(BrowserSetup): name = "servo" browser_cls = browser.Servo - def install(self, venv): + def install(self, venv, channel=None): if self.prompt_install(self.name): return self.browser.install(venv.path) def setup_kwargs(self, kwargs): if kwargs["binary"] is None: - binary = self.browser.find_binary() + binary = self.browser.find_binary(self.venv.path, None) if binary is None: raise WptrunError("Unable to find servo binary on the PATH") @@ -379,7 +390,7 @@ class WebKit(BrowserSetup): name = "webkit" browser_cls = browser.WebKit - def install(self, venv): + def install(self, venv, channel=None): raise NotImplementedError def setup_kwargs(self, kwargs): @@ -401,7 +412,7 @@ product_setup = { } -def setup_wptrunner(venv, prompt=True, install=False, **kwargs): +def setup_wptrunner(venv, prompt=True, install_browser=False, **kwargs): from wptrunner import wptrunner, wptcommandline global logger @@ -424,9 +435,20 @@ def setup_wptrunner(venv, prompt=True, install=False, **kwargs): setup_cls = product_setup[kwargs["product"]](venv, prompt, sub_product) setup_cls.install_requirements() - if install: + if install_browser and not kwargs["channel"]: + kwargs["channel"] = "nightly" + + if kwargs["channel"]: + channel = install.get_channel(kwargs["product"], kwargs["channel"]) + if channel != kwargs["channel"]: + logger.info("Interpreting channel '%s' as '%s'" % (kwargs["channel"], + channel)) + kwargs["browser_channel"] = channel + del kwargs["channel"] + + if install_browser: logger.info("Installing browser") - kwargs["binary"] = setup_cls.install(venv) + kwargs["binary"] = setup_cls.install(venv, channel=channel) setup_cls.setup(kwargs) @@ -447,7 +469,7 @@ def run(venv, **kwargs): kwargs = setup_wptrunner(venv, prompt=prompt, - install=install_browser, + install_browser=install_browser, **kwargs) rv = run_single(venv, **kwargs) > 0 diff --git a/tests/wpt/web-platform-tests/tools/wpt/tests/test_wpt.py b/tests/wpt/web-platform-tests/tools/wpt/tests/test_wpt.py index b39173e64f2..8f8e5186c7c 100644 --- a/tests/wpt/web-platform-tests/tools/wpt/tests/test_wpt.py +++ b/tests/wpt/web-platform-tests/tools/wpt/tests/test_wpt.py @@ -166,9 +166,9 @@ def test_run_firefox(manifest_dir): os.environ["MOZ_HEADLESS"] = "1" try: if sys.platform == "darwin": - fx_path = os.path.join(wpt.localpaths.repo_root, "_venv", "browsers", "Firefox Nightly.app") + fx_path = os.path.join(wpt.localpaths.repo_root, "_venv", "browsers", "nightly", "Firefox Nightly.app") else: - fx_path = os.path.join(wpt.localpaths.repo_root, "_venv", "browsers", "firefox") + fx_path = os.path.join(wpt.localpaths.repo_root, "_venv", "browsers", "nightly", "firefox") if os.path.exists(fx_path): shutil.rmtree(fx_path) with pytest.raises(SystemExit) as excinfo: @@ -294,15 +294,14 @@ def test_install_chromedriver(): @pytest.mark.xfail(sys.platform == "win32", reason="Tests currently don't work on Windows for path reasons") def test_install_firefox(): - if sys.platform == "darwin": - fx_path = os.path.join(wpt.localpaths.repo_root, "_venv", "browsers", "Firefox Nightly.app") + fx_path = os.path.join(wpt.localpaths.repo_root, "_venv", "browsers", "nightly", "Firefox Nightly.app") else: - fx_path = os.path.join(wpt.localpaths.repo_root, "_venv", "browsers", "firefox") + fx_path = os.path.join(wpt.localpaths.repo_root, "_venv", "browsers", "nightly", "firefox") if os.path.exists(fx_path): shutil.rmtree(fx_path) with pytest.raises(SystemExit) as excinfo: - wpt.main(argv=["install", "firefox", "browser"]) + wpt.main(argv=["install", "firefox", "browser", "--channel=nightly"]) assert excinfo.value.code == 0 assert os.path.exists(fx_path) shutil.rmtree(fx_path) diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptcommandline.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptcommandline.py index 4af5367a038..e6c624994d9 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptcommandline.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptcommandline.py @@ -192,6 +192,12 @@ scheme host and port.""") help="Path to directory containing extra json files to add to run info") config_group.add_argument("--product", action="store", choices=product_choices, default=None, help="Browser against which to run tests") + config_group.add_argument("--browser-version", action="store", + default=None, help="Informative string detailing the browser " + "release version. This is included in the run_info data.") + config_group.add_argument("--browser-channel", action="store", + default=None, help="Informative string detailing the browser " + "release channel. This is included in the run_info data.") config_group.add_argument("--config", action="store", type=abs_path, dest="config", help="Path to config file") config_group.add_argument("--install-fonts", action="store_true", diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptrunner.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptrunner.py index 02420826d8a..a6a29724ad7 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptrunner.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptrunner.py @@ -47,6 +47,7 @@ def get_loader(test_paths, product, debug=None, run_info_extras=None, **kwargs): run_info = wpttest.get_run_info(kwargs["run_info"], product, browser_version=kwargs.get("browser_version"), + browser_channel=kwargs.get("browser_channel"), debug=debug, extras=run_info_extras) diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wpttest.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wpttest.py index c29ba974a99..4086a89e4cf 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wpttest.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wpttest.py @@ -67,7 +67,10 @@ def get_run_info(metadata_root, product, **kwargs): class RunInfo(dict): - def __init__(self, metadata_root, product, debug, browser_version=None, extras=None): + def __init__(self, metadata_root, product, debug, + browser_version=None, + browser_channel=None, + extras=None): import mozinfo self._update_mozinfo(metadata_root) self.update(mozinfo.info) @@ -89,6 +92,8 @@ class RunInfo(dict): self["debug"] = False if browser_version: self["browser_version"] = browser_version + if browser_channel: + self["browser_channel"] = browser_channel if extras is not None: self.update(extras) diff --git a/tests/wpt/web-platform-tests/trusted-types/idlharness.window.js b/tests/wpt/web-platform-tests/trusted-types/idlharness.window.js new file mode 100644 index 00000000000..de13697764e --- /dev/null +++ b/tests/wpt/web-platform-tests/trusted-types/idlharness.window.js @@ -0,0 +1,18 @@ +// META: script=/resources/WebIDLParser.js +// META: script=/resources/idlharness.js + +idl_test( + ['trusted-types.tentative'], + ['dom', 'html'], + idl_array => { + idl_array.add_objects({ + TrustedTypePolicyFactory: ['window.TrustedTypes'], + TrustedTypePolicy: ['window.TrustedTypes.createPolicy("SomeName", { createHTML: s => s })'], + TrustedHTML: ['window.TrustedTypes.createPolicy("SomeName1", { createHTML: s => s }).createHTML("A string")'], + TrustedScript: ['window.TrustedTypes.createPolicy("SomeName2", { createScript: s => s }).createScript("A string")'], + TrustedScriptURL: ['window.TrustedTypes.createPolicy("SomeName3", { createScriptURL: s => s }).createScriptURL("A string")'], + TrustedURL: ['window.TrustedTypes.createPolicy("SomeName4", { createURL: s => s }).createURL("A string")'] + }); + }, + 'Trusted Types' +); diff --git a/tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/property-types.js b/tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/property-types.js index 5bafb20dfcf..232a508e07c 100644 --- a/tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/property-types.js +++ b/tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/property-types.js @@ -1068,6 +1068,23 @@ const transformListType = { { time: 500, expected: [ 1, 1, 1, 1, 100, 100 ] }, { time: 1000, expected: [ 1, 1, 1, 1, 100, 100 ] }]); }, `${property}: non-invertible matrices in mismatched transform lists`); + + test(t => { + const idlName = propertyToIDL(property); + const target = createTestElement(t, setup); + const animation = target.animate( + { + [idlName]: ['perspective(0)', 'perspective(10px)'], + }, + 1000 + ); + testAnimationSampleMatrices(animation, idlName, + [{ time: 500, expected: [ 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, -0.05, + 0, 0, 0, 1 ] }]); + }, `${property}: perspective`); + }, testAddition: function(property, setup) { diff --git a/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-oscillatornode-interface/detune-limiting.html b/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-oscillatornode-interface/detune-limiting.html new file mode 100644 index 00000000000..81a1293d035 --- /dev/null +++ b/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-oscillatornode-interface/detune-limiting.html @@ -0,0 +1,154 @@ + + + + + Oscillator Detune Limits + + + + + + + + + +